@amsterdamdatalabs/enact-extensions 0.1.5 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +15 -1
- package/dist/install.js.map +1 -1
- package/dist/internal/agents.d.ts +29 -0
- package/dist/internal/agents.d.ts.map +1 -0
- package/dist/internal/agents.js +83 -0
- package/dist/internal/agents.js.map +1 -0
- package/extensions/enact-context/hooks/hooks.json +20 -0
- package/extensions/enact-core/.agents/plugin.json +39 -0
- package/extensions/enact-core/hooks/hooks.json +14 -0
- package/extensions/enact-factory/.agents/plugin.json +9 -3
- package/extensions/enact-factory/agents/architect.toml +30 -0
- package/extensions/enact-factory/agents/code-reviewer.toml +29 -0
- package/extensions/enact-factory/agents/critic.toml +35 -0
- package/extensions/enact-factory/agents/executor.toml +23 -0
- package/extensions/enact-factory/agents/explore.toml +22 -0
- package/extensions/enact-factory/agents/planner.toml +23 -0
- package/extensions/enact-factory/agents/verifier.toml +29 -0
- package/extensions/enact-factory/skills/ai-slop-cleaner/SKILL.md +52 -0
- package/extensions/enact-factory/skills/azdo-ci-strategy/SKILL.md +262 -0
- package/extensions/enact-factory/skills/azdo-ci-strategy/references/build-failures.md +60 -0
- package/extensions/enact-factory/skills/azdo-ci-strategy/references/cli-reference.md +87 -0
- package/extensions/enact-factory/skills/azdo-ci-strategy/references/policies-and-pipelines.md +132 -0
- package/extensions/enact-factory/skills/azdo-ci-strategy/references/troubleshooting.md +53 -0
- package/extensions/enact-factory/skills/deep-interview/SKILL.md +72 -0
- package/extensions/enact-factory/skills/drive-loop/SKILL.md +259 -0
- package/extensions/enact-factory/skills/drive-loop/references/contract-schema.md +107 -0
- package/extensions/enact-factory/skills/hyperplan/SKILL.md +51 -0
- package/extensions/enact-factory/skills/looplan/SKILL.md +103 -0
- package/extensions/enact-factory/skills/plan/SKILL.md +71 -0
- package/extensions/enact-factory/skills/remove-deadcode/SKILL.md +41 -0
- package/extensions/enact-factory/skills/research/SKILL.md +73 -0
- package/extensions/enact-factory/skills/review/SKILL.md +48 -0
- package/extensions/enact-factory/skills/security-research/SKILL.md +54 -0
- package/extensions/enact-factory/skills/tdd/SKILL.md +56 -0
- package/extensions/enact-factory/skills/trace/SKILL.md +37 -0
- package/extensions/enact-factory/skills/ultraqa/SKILL.md +79 -0
- package/extensions/enact-factory/skills/work-with-workitem/SKILL.md +51 -0
- package/extensions/enact-factory/skills/workitem-triage/SKILL.md +15 -0
- package/extensions/enact-loop/.agents/plugin.json +46 -0
- package/extensions/enact-loop/.mcp.json +1 -0
- package/extensions/enact-loop/hooks/hooks.json +27 -0
- package/extensions/enact-loop/skills/enact-loop/SKILL.md +327 -0
- package/extensions/enact-operator/.agents/plugin.json +0 -1
- package/extensions/enact-operator/hooks/hooks.json +0 -35
- package/extensions/enact-wiki/skills/wiki/SKILL.md +42 -0
- package/extensions/plugin-dev/.agents/plugin.json +4 -6
- package/extensions/plugin-dev/agents/plugin-validator.md +1 -1
- package/extensions/plugin-dev/skills/agent-development/SKILL.md +7 -7
- package/extensions/plugin-dev/{commands/create-plugin.md → skills/create-plugin/SKILL.md} +44 -37
- package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +13 -14
- package/extensions/plugin-dev/skills/skill-development/SKILL.md +0 -2
- package/extensions/plugin-dev/{commands/start.md → skills/start/SKILL.md} +7 -6
- package/package.json +11 -6
- package/scripts/check-hooks.mjs +174 -0
- package/scripts/check-principles.mjs +101 -0
- package/scripts/enact-extensions.mjs +87 -3
- package/scripts/lib/run-validate.mjs +36 -2
- package/scripts/lib/ups-router.mjs +432 -0
- package/spec/enact.json +4 -0
- package/spec/enact.md +5 -2
- package/extensions/cmux/.agents/plugin.json +0 -37
- package/extensions/cmux/skills/cmux/SKILL.md +0 -82
- package/extensions/cmux/skills/cmux/agents/openai.yaml +0 -4
- package/extensions/cmux/skills/cmux/references/handles-and-identify.md +0 -35
- package/extensions/cmux/skills/cmux/references/panes-surfaces.md +0 -37
- package/extensions/cmux/skills/cmux/references/trigger-flash-and-health.md +0 -23
- package/extensions/cmux/skills/cmux/references/windows-workspaces.md +0 -31
- package/extensions/cmux/skills/cmux-vm-monitor/SKILL.md +0 -122
- package/extensions/cmux/skills/cmux-vm-monitor/agents/openai.yaml +0 -4
- package/extensions/cmux/skills/cmux-vm-monitor/references/cmux-commands.md +0 -66
- package/extensions/cmux/skills/cmux-vm-monitor/scripts/codex_vm_monitor.sh +0 -45
- package/extensions/cmux/skills/cmux-workspace/SKILL.md +0 -93
- package/extensions/devops/.agents/plugin.json +0 -36
- package/extensions/devops/skills/azure-devops-cli/SKILL.md +0 -431
- package/extensions/devops/skills/azure-devops-cli/agents/openai.yaml +0 -4
- package/extensions/devops/skills/ci-pipeline-strategy/SKILL.md +0 -217
- package/extensions/devops/skills/ci-pipeline-strategy/agents/openai.yaml +0 -4
- package/extensions/enact-factory/hooks/user-prompt-submit.mjs +0 -67
- package/extensions/enact-operator/commands/doctor.md +0 -39
- package/extensions/enact-operator/commands/setup.md +0 -51
- package/extensions/plugin-dev/.mcp.json +0 -3
- package/extensions/plugin-dev/commands/_archive/create-marketplace.md +0 -427
- package/extensions/plugin-dev/commands/_archive/plugin-dev-guide.md +0 -12
- package/extensions/plugin-dev/hooks/hooks.json +0 -3
- package/extensions/plugin-dev/skills/command-development/SKILL.md +0 -763
- package/extensions/plugin-dev/skills/command-development/examples/plugin-commands.md +0 -612
- package/extensions/plugin-dev/skills/command-development/examples/simple-commands.md +0 -527
- package/extensions/plugin-dev/skills/command-development/references/advanced-workflows.md +0 -762
- package/extensions/plugin-dev/skills/command-development/references/documentation-patterns.md +0 -769
- package/extensions/plugin-dev/skills/command-development/references/frontmatter-reference.md +0 -508
- package/extensions/plugin-dev/skills/command-development/references/interactive-commands.md +0 -966
- package/extensions/plugin-dev/skills/command-development/references/marketplace-considerations.md +0 -943
- package/extensions/plugin-dev/skills/command-development/references/plugin-features-reference.md +0 -637
- package/extensions/plugin-dev/skills/command-development/references/plugin-integration.md +0 -191
- package/extensions/plugin-dev/skills/command-development/references/skill-tool.md +0 -447
- package/extensions/plugin-dev/skills/command-development/references/testing-strategies.md +0 -723
- package/extensions/plugin-dev/skills/command-development/scripts/check-frontmatter.sh +0 -234
- package/extensions/plugin-dev/skills/command-development/scripts/validate-command.sh +0 -160
- /package/extensions/enact-operator/{skills/_variants.md → docs/skill-variants.md} +0 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: enact-loop
|
|
3
|
+
description: "Contract-runner loop engine. Drives declared stages (mechanical and judgment) to closure; the Stop boulder refuses to exit until every required stage passes and independent graders have signed off every judgment stage."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# enact-loop
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
`$enact-loop` is the persistence wrapper for bounded work. Given a contract (an ordered set of
|
|
11
|
+
stages), the loop drives each stage to closure and refuses to exit until every required stage has
|
|
12
|
+
passed. Mechanical stages self-report via command evidence. Judgment stages require an **independent
|
|
13
|
+
grader** running on a different model — the engine rejects any verdict self-reported by the
|
|
14
|
+
executor.
|
|
15
|
+
|
|
16
|
+
## Use When
|
|
17
|
+
|
|
18
|
+
- work must not stop until all required stages pass
|
|
19
|
+
- judgment gates (architect-GO, code review, scope fidelity, QA) require independent sign-off
|
|
20
|
+
- a previous attempt left work in an incomplete or unverified state
|
|
21
|
+
- partial completion is unacceptable
|
|
22
|
+
|
|
23
|
+
## Contract Schema
|
|
24
|
+
|
|
25
|
+
A **contract** is the declarative closure spec. Declare it inline or pass a YAML/JSON file.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Contract { id, name, stages[] }
|
|
29
|
+
|
|
30
|
+
Stage {
|
|
31
|
+
id: string
|
|
32
|
+
name: string
|
|
33
|
+
type: 'mechanical' | 'judgment'
|
|
34
|
+
required: boolean
|
|
35
|
+
command?: string # mechanical stages only
|
|
36
|
+
grader?: GraderSpec # judgment stages only
|
|
37
|
+
passCriteria?: string
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
GraderSpec {
|
|
41
|
+
role: architect | critic | code-reviewer | verifier # required
|
|
42
|
+
model?: string # e.g. claude-opus-4-8 — always specify; omitting causes E_GRADER_MODEL_UNSET
|
|
43
|
+
harness?: paseo | subagent # default: paseo
|
|
44
|
+
rounds?: integer # max grading rounds before escalation (default: 3)
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Stage Types
|
|
49
|
+
|
|
50
|
+
**Mechanical** stages are automated: the executor runs the declared `command` and self-reports the
|
|
51
|
+
result via `loop_grade`. No independent grader is needed.
|
|
52
|
+
|
|
53
|
+
**Judgment** stages require an independent grader. The executor dispatches via
|
|
54
|
+
`loop_grader_dispatch`; the grader records its verdict via `loop_grader_verdict`. The engine
|
|
55
|
+
rejects any verdict where grader identity overlaps with executor identity.
|
|
56
|
+
|
|
57
|
+
## The Independence Rule
|
|
58
|
+
|
|
59
|
+
Judgment stages must be graded by a **different model** than the executor (model-distinct, not
|
|
60
|
+
vendor/surface-distinct). The loop rejects a verdict whose grader model, session, or agent equals
|
|
61
|
+
the executor's. Graders are dispatched out-of-session via Paseo `--provider <model>` for
|
|
62
|
+
cross-surface grading; in-surface graders just need a supported model that differs from the
|
|
63
|
+
executor's.
|
|
64
|
+
|
|
65
|
+
The engine enforces independence at `recordStage` AND `completeLoop` (defense in depth). The Stop
|
|
66
|
+
boulder re-checks at session exit. Violations emit `grader-independence-missing` and block closure.
|
|
67
|
+
|
|
68
|
+
## Loop Phases
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
idle → running → verifying → completed (terminal)
|
|
72
|
+
↘ blocked → running | verifying
|
|
73
|
+
↘ paused → running | verifying (Stop ALLOWS exit while paused)
|
|
74
|
+
↘ aborted (terminal)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
- **idle** — loop declared, not yet started
|
|
78
|
+
- **running** — executor actively working
|
|
79
|
+
- **verifying** — executor running closure checks
|
|
80
|
+
- **completed** — all required stages passed, loop closed
|
|
81
|
+
- **blocked** — waiting on an external dependency (`loop_block` / `loop_advance` to resume)
|
|
82
|
+
- **paused** — deliberate human suspension via `loop_pause`; the Stop boulder ALLOWS exit while
|
|
83
|
+
paused; SessionStart does NOT auto-resume a paused loop; stays paused until `loop_resume` is
|
|
84
|
+
explicitly called
|
|
85
|
+
- **aborted** — cancelled with a reason (terminal)
|
|
86
|
+
|
|
87
|
+
## Routing Rules
|
|
88
|
+
|
|
89
|
+
- ambiguous goal → clarify first, then start the loop with the refined goal
|
|
90
|
+
- goal is clear → start immediately: `loop_start`
|
|
91
|
+
- blocked on external dependency → `loop_block`, resolve, then `loop_advance` back to `running`
|
|
92
|
+
- all required stages passed → write summary.md, then `loop_complete` (only from phase=verifying)
|
|
93
|
+
|
|
94
|
+
## Workflow
|
|
95
|
+
|
|
96
|
+
1. Read current state: `loop_status`
|
|
97
|
+
2. If no active loop, start one:
|
|
98
|
+
```
|
|
99
|
+
loop_start goal="<goal>" preset=<preset>|contract=<stages JSON>
|
|
100
|
+
```
|
|
101
|
+
3. Implement the work while in phase `running`.
|
|
102
|
+
4. Advance to verification:
|
|
103
|
+
```
|
|
104
|
+
loop_advance toPhase=verifying
|
|
105
|
+
```
|
|
106
|
+
5. For each **mechanical** stage: run the command, then `loop_grade`.
|
|
107
|
+
6. For each **judgment** stage: call `loop_grader_dispatch`, await the grader's
|
|
108
|
+
`loop_grader_verdict`.
|
|
109
|
+
7. When all required stages are `passed`: run `enact-loop summary write` (pipe body sections;
|
|
110
|
+
CLI stamps the fingerprint header), then `loop_complete`.
|
|
111
|
+
8. If a stage fails: fix the root cause, do not fabricate evidence, re-run and re-grade.
|
|
112
|
+
|
|
113
|
+
## Judgment Grading Protocol
|
|
114
|
+
|
|
115
|
+
**Step 1 — Dispatch a grader:**
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
loop_grader_dispatch stageId=<id>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
- mints an unforgeable `continuationId` and `graderSessionId` via the runtime
|
|
122
|
+
- resolves the grader model from `stage.grader.model ?? loop.graderModel`
|
|
123
|
+
- requires the resolved model to differ from the executor's (`E_NO_DIVERSITY` otherwise)
|
|
124
|
+
- launches the grader agent (read-only, same cwd) via Paseo `--provider <graderModel>`
|
|
125
|
+
- returns the `continuationId` you must pass to step 2
|
|
126
|
+
|
|
127
|
+
**Step 2 — Record the grader's verdict** (grader calls this, not the executor):
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
loop_grader_verdict stageId=<id> verdict=GO|NO-GO evidence="<findings>" continuationId=<id>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The engine rejects the verdict if grader identity overlaps executor identity or the
|
|
134
|
+
`continuationId` was not minted by this runtime.
|
|
135
|
+
|
|
136
|
+
**NEVER self-report a judgment verdict.** The boulder blocks Stop and re-prompts with
|
|
137
|
+
`grader-independence-missing` if you do. If a grader returns NO-GO: fix the issue, stay in
|
|
138
|
+
`verifying`, and re-dispatch. Exceeding the round limit escalates with a blocker.
|
|
139
|
+
|
|
140
|
+
## Access Control — `.enact/` is CLI-mediated
|
|
141
|
+
|
|
142
|
+
The agent **NEVER edits `.enact/` files directly**. All loop state mutation goes through the
|
|
143
|
+
`enact-loop` CLI or `loop_*` MCP tools — never raw file edits. Read state via:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
enact-loop status --json # current loop state as JSON
|
|
147
|
+
enact-loop summary show # display the current closure summary
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Closure
|
|
151
|
+
|
|
152
|
+
Closure requires a written, CURRENT `.enact/loop/state/summary.md`. When all required stages pass
|
|
153
|
+
(and every judgment stage has an independent verdict), the loop is closure-ready and enters the
|
|
154
|
+
`verifying` phase. The Stop boulder then **BLOCKS exit** and injects a generic markdown
|
|
155
|
+
**TEMPLATE** whose first line is a fingerprint header:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
<!-- enact-loop-summary loop:<id> fp:<phase|stagesPassed|historyLen> -->
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The template defines these sections (keep the whole file under 100 lines):
|
|
162
|
+
|
|
163
|
+
- **Summary** — one-line statement of what was accomplished or why blocking/aborting
|
|
164
|
+
- **Stage state** — list of stages with their final status
|
|
165
|
+
- **Blockers** — any unresolved blockers (if blocking/aborting)
|
|
166
|
+
- **Failures** — any stages that failed and the root cause
|
|
167
|
+
- **Evidence** — key commands run and observed outputs
|
|
168
|
+
- **Recommendations** — suggested next actions
|
|
169
|
+
|
|
170
|
+
To write the summary, **pipe the body sections to the CLI** — the CLI stamps the fingerprint
|
|
171
|
+
header automatically:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
enact-loop summary write <<'EOF'
|
|
175
|
+
## Summary
|
|
176
|
+
<one-line summary>
|
|
177
|
+
|
|
178
|
+
## Stage state
|
|
179
|
+
<stage list>
|
|
180
|
+
|
|
181
|
+
## Blockers
|
|
182
|
+
<none|list>
|
|
183
|
+
|
|
184
|
+
## Failures
|
|
185
|
+
<none|list>
|
|
186
|
+
|
|
187
|
+
## Evidence
|
|
188
|
+
<commands + observed output>
|
|
189
|
+
|
|
190
|
+
## Recommendations
|
|
191
|
+
<next actions>
|
|
192
|
+
EOF
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Once a current summary exists, the boulder allows exit. `completeLoop` / `blockLoop` / `abortLoop`
|
|
196
|
+
all **REQUIRE** a current summary and throw `E_CLOSURE_SUMMARY_MISSING` otherwise.
|
|
197
|
+
|
|
198
|
+
**This summary is the handoff**: enact-factory's brain reads it (together with the Paseo agent's
|
|
199
|
+
last message) to decide the next action after the loop completes.
|
|
200
|
+
|
|
201
|
+
**Closure sequence — required for ALL terminal transitions:**
|
|
202
|
+
|
|
203
|
+
1. `enact-loop summary write` — pipe body sections; CLI stamps the fingerprint header
|
|
204
|
+
2. Then call: `loop_complete summary="<one-line>"` OR `loop_block reason="<reason>"` OR
|
|
205
|
+
`loop_abort reason="<reason>"`
|
|
206
|
+
|
|
207
|
+
## MCP Tools
|
|
208
|
+
|
|
209
|
+
| Tool | Purpose |
|
|
210
|
+
|------|---------|
|
|
211
|
+
| `loop_start` | Start loop with goal + contract/preset; stamps executorIdentity |
|
|
212
|
+
| `loop_status` | Read current loop state |
|
|
213
|
+
| `loop_advance` | Phase transition |
|
|
214
|
+
| `loop_grade` | Record a mechanical stage result (self-report; status + command evidence) |
|
|
215
|
+
| `loop_grader_dispatch` | Dispatch an independent grader for a judgment stage (returns continuationId) |
|
|
216
|
+
| `loop_grader_verdict` | Record an independent grader's GO/NO-GO (grader calls this, not executor) |
|
|
217
|
+
| `loop_pause` | Pause the loop for human review; Stop allows exit while paused |
|
|
218
|
+
| `loop_resume` | Resume a paused loop; restores the pre-pause phase |
|
|
219
|
+
| `loop_retarget` | Replace the active contract with a new one (same loop id) |
|
|
220
|
+
| `loop_block` | Mark blocked with a reason; requires current summary.md |
|
|
221
|
+
| `loop_complete` | Close the loop; requires current summary.md + phase=verifying + all stages passed |
|
|
222
|
+
| `loop_abort` | Abort with a reason; requires current summary.md |
|
|
223
|
+
| `loop_contract_parity` | Run contract-parity check |
|
|
224
|
+
| `loop_stop_evaluate` | Evaluate Stop boulder policy (called by the Stop hook) |
|
|
225
|
+
|
|
226
|
+
## CLI
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Read state (never read .enact/ files directly)
|
|
230
|
+
enact-loop status --json # current loop state as JSON
|
|
231
|
+
enact-loop summary show # display the current closure summary
|
|
232
|
+
|
|
233
|
+
# Write the closure summary (CLI stamps the fingerprint header; never write summary.md directly)
|
|
234
|
+
enact-loop summary write <<'EOF'
|
|
235
|
+
## Summary
|
|
236
|
+
...
|
|
237
|
+
EOF
|
|
238
|
+
|
|
239
|
+
# Validate a contract file before using it with loop_start
|
|
240
|
+
enact-loop contract validate <path/to/contract.json|yaml>
|
|
241
|
+
|
|
242
|
+
# Health check — verify MCP server reachability and runtime state; optionally validate
|
|
243
|
+
# that a contract's grader model differs from the executor model
|
|
244
|
+
enact-loop doctor --contract <file> [--executor-model M] [--grader-model M]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
`contract validate` exits 0 + `✓ valid contract: <id> (<n> stages)` on success; exits 1 with an
|
|
248
|
+
error list on failure. Common errors: missing required fields, judgment stage without `grader`,
|
|
249
|
+
mechanical stage with `grader` (use `command` instead), malformed YAML/JSON.
|
|
250
|
+
|
|
251
|
+
## Boulder Behavior
|
|
252
|
+
|
|
253
|
+
The Stop hook calls `enact-loop hook stop` → `loop_stop_evaluate`. The boulder blocks exit if:
|
|
254
|
+
- any `required` stage is still `pending` or `failed`
|
|
255
|
+
- any judgment stage is `passed` but lacks a valid independent verdict (`grader-independence-missing`)
|
|
256
|
+
- a required grader is unavailable (`grader-unavailable`)
|
|
257
|
+
- the loop is closure-ready (all stages passed, independence satisfied) but `summary.md` is absent
|
|
258
|
+
or stale (`closure-summary-missing`) — resolve by running `enact-loop summary write`
|
|
259
|
+
- the loop phase is not terminal (exception: `paused` allows exit)
|
|
260
|
+
|
|
261
|
+
## State
|
|
262
|
+
|
|
263
|
+
`.enact/` is CLI-mediated — never read or write `.enact/` files directly.
|
|
264
|
+
|
|
265
|
+
- Read state: `enact-loop status --json` (loop state) · `enact-loop summary show` (closure summary)
|
|
266
|
+
- Mutate state: `loop_*` MCP tools or `enact-loop` CLI subcommands only
|
|
267
|
+
- Closure summary at `.enact/loop/state/summary.md` is written via `enact-loop summary write`
|
|
268
|
+
(CLI stamps the fingerprint header); it is read by enact-factory's brain after loop completion.
|
|
269
|
+
- SessionStart hook auto-resumes an active (`running` or `verifying`) loop when the prompt
|
|
270
|
+
contains `$enact-loop`. Paused loops are NOT auto-resumed.
|
|
271
|
+
|
|
272
|
+
## Example Contracts
|
|
273
|
+
|
|
274
|
+
### Delivery Contract
|
|
275
|
+
|
|
276
|
+
```yaml
|
|
277
|
+
id: delivery
|
|
278
|
+
name: Feature Delivery
|
|
279
|
+
stages:
|
|
280
|
+
- id: tests
|
|
281
|
+
name: Tests passing
|
|
282
|
+
type: mechanical
|
|
283
|
+
required: true
|
|
284
|
+
command: npm test
|
|
285
|
+
passCriteria: All tests exit 0
|
|
286
|
+
|
|
287
|
+
- id: lint
|
|
288
|
+
name: Lint clean
|
|
289
|
+
type: mechanical
|
|
290
|
+
required: true
|
|
291
|
+
command: npm run lint
|
|
292
|
+
passCriteria: No lint errors
|
|
293
|
+
|
|
294
|
+
- id: code-review
|
|
295
|
+
name: Code review
|
|
296
|
+
type: judgment
|
|
297
|
+
required: true
|
|
298
|
+
grader:
|
|
299
|
+
role: code-reviewer
|
|
300
|
+
model: claude-opus-4-8
|
|
301
|
+
harness: paseo
|
|
302
|
+
rounds: 3
|
|
303
|
+
passCriteria: Reviewer approves with no blocking issues
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Docs Workflow
|
|
307
|
+
|
|
308
|
+
```yaml
|
|
309
|
+
id: docs-workflow
|
|
310
|
+
name: Documentation Update
|
|
311
|
+
stages:
|
|
312
|
+
- id: build
|
|
313
|
+
name: Docs build clean
|
|
314
|
+
type: mechanical
|
|
315
|
+
required: true
|
|
316
|
+
command: npm run docs:build
|
|
317
|
+
|
|
318
|
+
- id: scope-fidelity
|
|
319
|
+
name: Scope fidelity
|
|
320
|
+
type: judgment
|
|
321
|
+
required: true
|
|
322
|
+
grader:
|
|
323
|
+
role: critic
|
|
324
|
+
model: claude-opus-4-8
|
|
325
|
+
rounds: 2
|
|
326
|
+
passCriteria: Critic confirms docs match the stated scope
|
|
327
|
+
```
|
|
@@ -20,22 +20,6 @@
|
|
|
20
20
|
"command": "enact-operator hook user-prompt-submit"
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"hooks": [
|
|
26
|
-
{
|
|
27
|
-
"type": "command",
|
|
28
|
-
"command": "enact-operator hook doom-loop-counter reset"
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"hooks": [
|
|
34
|
-
{
|
|
35
|
-
"type": "command",
|
|
36
|
-
"command": "enact-operator hook doom-loop-search-guard reset"
|
|
37
|
-
}
|
|
38
|
-
]
|
|
39
23
|
}
|
|
40
24
|
],
|
|
41
25
|
"PreToolUse": [
|
|
@@ -60,25 +44,6 @@
|
|
|
60
44
|
"statusMessage": "Reviewing Operator tool output"
|
|
61
45
|
}
|
|
62
46
|
]
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
"hooks": [
|
|
66
|
-
{
|
|
67
|
-
"type": "command",
|
|
68
|
-
"command": "enact-operator hook doom-loop-counter",
|
|
69
|
-
"statusMessage": "Checking Operator tool-call budget"
|
|
70
|
-
}
|
|
71
|
-
]
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
"matcher": "Bash",
|
|
75
|
-
"hooks": [
|
|
76
|
-
{
|
|
77
|
-
"type": "command",
|
|
78
|
-
"command": "enact-operator hook doom-loop-search-guard",
|
|
79
|
-
"statusMessage": "Checking Operator search deduplication"
|
|
80
|
-
}
|
|
81
|
-
]
|
|
82
47
|
}
|
|
83
48
|
],
|
|
84
49
|
"Stop": [
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wiki
|
|
3
|
+
description: "Wiki-style reference lookup and persistence via the enact-wiki provider. Use when durable project documentation or knowledge retrieval is needed."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Wiki
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
Provides access to the project's durable wiki and knowledge base via the enact-wiki MCP server. This skill does not re-implement wiki storage or retrieval — it delegates all operations to enact-wiki tools. Research artifacts and analysis outputs can be persisted to the wiki via this skill.
|
|
10
|
+
|
|
11
|
+
## Use When
|
|
12
|
+
- Looking up a documented decision, design, or reference
|
|
13
|
+
- Research findings should be persisted as a durable wiki entry
|
|
14
|
+
- Checking "does the wiki have anything on X?"
|
|
15
|
+
|
|
16
|
+
## Workflow
|
|
17
|
+
1. Identify the query or document to persist.
|
|
18
|
+
2. Delegate the operation to the enact-wiki provider using its wiki MCP tools.
|
|
19
|
+
- For a lookup: invoke the enact-wiki wiki query tool with the search term.
|
|
20
|
+
- For a write: invoke the enact-wiki wiki add tool with the content and title.
|
|
21
|
+
- For a list: invoke the enact-wiki wiki list tool.
|
|
22
|
+
- For a read of a specific entry: invoke the enact-wiki wiki read tool with the entry identifier.
|
|
23
|
+
3. If the operation returns content, present it directly without reformatting.
|
|
24
|
+
4. If persisting a research artifact (e.g., from `.enact/loop/research/` or `.enact/factory/security/`), read the file first, then pass the content to the enact-wiki wiki add tool.
|
|
25
|
+
5. Wiki state is owned by the enact-wiki provider — do not store wiki content locally as a substitute.
|
|
26
|
+
|
|
27
|
+
## State Contract
|
|
28
|
+
- Reads: enact-wiki wiki store (via MCP tool calls), local research files when persisting
|
|
29
|
+
- Writes: enact-wiki wiki store (via MCP tool calls); no local wiki shadow files
|
|
30
|
+
|
|
31
|
+
## Dependencies
|
|
32
|
+
- Requires enact-wiki MCP server to be connected. If it is not available, report that and stop.
|
|
33
|
+
|
|
34
|
+
## Activation
|
|
35
|
+
|
|
36
|
+
Invoke with `$wiki` or `$enact-wiki:wiki`. The skill delegates all operations to enact-wiki MCP tools — no durable workflow state is started automatically.
|
|
37
|
+
|
|
38
|
+
## Final Check
|
|
39
|
+
- The query returned a result or a clear "not found" from enact-wiki
|
|
40
|
+
- For writes, the enact-wiki tool confirmed the entry was saved
|
|
41
|
+
- No wiki content was stored locally as a substitute for the enact-wiki store
|
|
42
|
+
- If enact-wiki was unavailable, the caller was notified explicitly
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plugin-dev",
|
|
3
3
|
"version": "0.1.0",
|
|
4
|
-
"description": "Toolkit for authoring Enact plugins: scaffold and validate agents,
|
|
4
|
+
"description": "Toolkit for authoring Enact plugins: scaffold and validate agents, skills, hooks, and MCP integrations from an ENACT-native source manifest with Claude Code, Codex, and Cursor projections.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "amsterdamdatalabs"
|
|
7
7
|
},
|
|
@@ -20,9 +20,7 @@
|
|
|
20
20
|
"cursor"
|
|
21
21
|
],
|
|
22
22
|
"skills": "./skills/",
|
|
23
|
-
"
|
|
24
|
-
"hooks": "./hooks/hooks.json",
|
|
25
|
-
"mcpServers": "./.mcp.json",
|
|
23
|
+
"agents": "./agents/",
|
|
26
24
|
"interface": {
|
|
27
25
|
"displayName": "Plugin Dev",
|
|
28
26
|
"shortDescription": "Scaffold and validate ENACT-native plugins with Claude Code, Codex, and Cursor projections.",
|
|
@@ -31,8 +29,8 @@
|
|
|
31
29
|
"capabilities": [
|
|
32
30
|
"multi-platform manifests",
|
|
33
31
|
"plugin validation",
|
|
34
|
-
"
|
|
35
|
-
"
|
|
32
|
+
"skills authoring",
|
|
33
|
+
"agents authoring"
|
|
36
34
|
]
|
|
37
35
|
},
|
|
38
36
|
"factory": {
|
|
@@ -4,7 +4,7 @@ description: Use when the user asks to validate an Enact plugin, check plugin st
|
|
|
4
4
|
model: inherit
|
|
5
5
|
color: yellow
|
|
6
6
|
tools: Read, Grep, Glob, Bash
|
|
7
|
-
skills: plugin-structure, hook-development,
|
|
7
|
+
skills: plugin-structure, hook-development, skill-development, mcp-integration
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
You validate **Enact multi-platform plugins** (Claude, Codex, Cursor) using repo truth and `@enact/extensions` when available.
|
|
@@ -56,15 +56,15 @@ You are a code reviewer. Analyze code for issues and provide feedback.
|
|
|
56
56
|
|
|
57
57
|
For complete format with all options, see [Agent File Structure](#agent-file-structure).
|
|
58
58
|
|
|
59
|
-
## When to Use Agents vs
|
|
59
|
+
## When to Use Agents vs Skills
|
|
60
60
|
|
|
61
|
-
| Component
|
|
62
|
-
|
|
|
63
|
-
| **Agents**
|
|
64
|
-
| **
|
|
65
|
-
| **Skills
|
|
61
|
+
| Component | Best For | Triggering | Example Use Case |
|
|
62
|
+
| --------------------- | --------------------------- | -------------------------------- | ----------------------------------- |
|
|
63
|
+
| **Agents** | Autonomous multi-step tasks | Proactive or description-matched | Code review after implementation |
|
|
64
|
+
| **Skills (passive)** | Knowledge and guidance | Model-invoked based on context | Domain expertise for PDF processing |
|
|
65
|
+
| **Skills (invocable)**| User-initiated actions | Explicit `/skill` invocation | `/deploy production` |
|
|
66
66
|
|
|
67
|
-
> **See also:** For
|
|
67
|
+
> **See also:** For skill development (passive and invocable), load the `skill-development` skill. There is no separate "command" component — invocable skills replace commands.
|
|
68
68
|
|
|
69
69
|
### Choose Agents When
|
|
70
70
|
|