allium
FreeGive your AI agents something more useful than a prompt. Velocity through clarity.
The English summary is being prepared. Showing the original description.
Implement command handlers that validate state and emit events using the Grain framework
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
(ns my.service.core.commands
(:require [ai.obney.grain.event-store-v3.interface :refer [->event]]
[ai.obney.grain.command-processor-v2.interface :refer [defcommand]]
[ai.obney.grain.command-processor-v2.interface :as cp]
[ai.obney.grain.time.interface :as time]
[my.service.core.read-models :as rm]
[cognitect.anomalies :as anom]))
(defcommand :service command-name
"Docstring describing what the command does."
[{{:keys [entity-id field1 field2]} :command
:as ctx}]
;; 1. Read current state from read models (pass ctx, NOT bare event-store)
(let [entity (rm/get-entity ctx entity-id)]
(cond
;; Return anomaly for validation failures
(not entity)
{::anom/category ::anom/not-found
::anom/message "Entity not found"}
(not (:active entity))
{::anom/category ::anom/conflict
::anom/message "Cannot modify inactive entity"}
;; Success: return events
:else
{:command-result/events
[(->event
{:type :service/entity-updated
:tags #{[:entity entity-id]}
:body {:entity-id entity-id
:field1 field1
:field2 field2
:modified-at (str (time/now))}})]})))
{:command-result/events
[(->event {:type :service/thing-created
:tags #{[:thing thing-id]}
:body {:thing-id thing-id :name name}})]}
{::anom/category ::anom/conflict
::anom/message "Name already taken."}
Prevents races by checking state hasn't changed between read and write:
{:command-result/events [...]
:command-result/cas {:types thing-event-types
:predicate-fn (fn [_events]
(= :active (:status (rm/get-thing ctx id))))}}
(let [result (cp/process-command
(assoc ctx :command {:command/id (random-uuid)
:command/timestamp (time/now)
:command/name :other/command-name
:field1 value1}))]
;; result is either anomaly or {:command-result/events [...]}
result)
::anom/not-found -- resource does not exist::anom/conflict -- business rule violation (duplicate, invalid state)::anom/incorrect -- bad input data::anom/forbidden -- not authorized for this actionctx (the full context), not bare event-store#{[:entity entity-id]} for efficient filtered readsmodified-at in event bodies when relevantcomponents/orc-service/src/ai/obney/orc/orc_service/core/commands.clj -- ORC sheet commandscomponents/colbert/src/ai/obney/orc/colbert/core/commands.clj -- ColBERT commandscomponents/ontology/src/ai/obney/orc/ontology/core/commands.clj -- Ontology commandsNo reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Give your AI agents something more useful than a prompt. Velocity through clarity.
The English summary is being prepared. Showing the original description.
Extract an Allium specification from an existing codebase. Use when the user has existing code and wants to distil behaviour into a spec, reverse engineer a specification from implementation, generate a spec from code, turn implementation into a behavioural specification, or document what a codebase does in Allium terms.
The English summary is being prepared. Showing the original description.
Run a structured discovery session to build an Allium specification through conversation. Use when the user wants to create a new spec from scratch, elicit or gather requirements, capture domain behaviour, specify a feature or system, define what a system should do, or is describing functionality and needs help shaping it into a specification.
The English summary is being prepared. Showing the original description.
Create scheduled background jobs that run on cron schedules
The English summary is being prepared. Showing the original description.
Implement query handlers that read from event-sourced read models
The English summary is being prepared. Showing the original description.
Build read models by reducing events into queryable state
The English summary is being prepared. Showing the original description.