session-orchestrator 5.0.0 → 5.2.0
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/.agents/skills/autopilot/SKILL.md +1 -0
- package/.agents/skills/bootstrap/SKILL.md +2 -0
- package/.agents/skills/brainstorm/SKILL.md +3 -0
- package/.agents/skills/close/SKILL.md +17 -0
- package/.agents/skills/debug/SKILL.md +2 -0
- package/.agents/skills/discovery/SKILL.md +2 -1
- package/.agents/skills/dispatcher/SKILL.md +2 -0
- package/.agents/skills/eli5/SKILL.md +2 -0
- package/.agents/skills/eval/SKILL.md +1 -0
- package/.agents/skills/evolve/SKILL.md +2 -1
- package/.agents/skills/go/SKILL.md +18 -0
- package/.agents/skills/grill/SKILL.md +2 -0
- package/.agents/skills/harness-audit/SKILL.md +16 -0
- package/.agents/skills/memory-cleanup/SKILL.md +1 -0
- package/.agents/skills/persona-panel/SKILL.md +1 -0
- package/.agents/skills/plan/SKILL.md +3 -1
- package/.agents/skills/portfolio/SKILL.md +17 -0
- package/.agents/skills/reconcile/SKILL.md +1 -0
- package/.agents/skills/release/SKILL.md +18 -0
- package/.agents/skills/repo-audit/SKILL.md +1 -0
- package/.agents/skills/spinout/SKILL.md +1 -0
- package/.agents/skills/sunset-review/SKILL.md +2 -0
- package/.agents/skills/test/SKILL.md +17 -0
- package/.agents/skills/ux-grill/SKILL.md +2 -0
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +2 -2
- package/.codex-plugin/skills/autopilot/SKILL.md +5 -4
- package/.codex-plugin/skills/bootstrap/SKILL.md +8 -4
- package/.codex-plugin/skills/brainstorm/SKILL.md +11 -4
- package/.codex-plugin/skills/close/SKILL.md +3 -3
- package/.codex-plugin/skills/convergence-monitoring/SKILL.md +2 -0
- package/.codex-plugin/skills/convergence-monitoring/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/debug/SKILL.md +11 -4
- package/.codex-plugin/skills/discovery/SKILL.md +8 -4
- package/.codex-plugin/skills/dispatcher/SKILL.md +4 -4
- package/.codex-plugin/skills/eli5/SKILL.md +9 -4
- package/.codex-plugin/skills/eval/SKILL.md +9 -4
- package/.codex-plugin/skills/evolve/SKILL.md +9 -4
- package/.codex-plugin/skills/go/SKILL.md +3 -3
- package/.codex-plugin/skills/grill/SKILL.md +11 -4
- package/.codex-plugin/skills/harness-audit/SKILL.md +4 -3
- package/.codex-plugin/skills/memory-cleanup/SKILL.md +9 -4
- package/.codex-plugin/skills/npm-publish/SKILL.md +2 -0
- package/.codex-plugin/skills/npm-publish/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/persona-panel/SKILL.md +5 -5
- package/.codex-plugin/skills/plan/SKILL.md +8 -4
- package/.codex-plugin/skills/portfolio/SKILL.md +3 -3
- package/.codex-plugin/skills/reconcile/SKILL.md +9 -4
- package/.codex-plugin/skills/release/SKILL.md +3 -3
- package/.codex-plugin/skills/repo-audit/SKILL.md +6 -4
- package/.codex-plugin/skills/spinout/SKILL.md +4 -4
- package/.codex-plugin/skills/sunset-review/SKILL.md +5 -4
- package/.codex-plugin/skills/test/SKILL.md +3 -3
- package/.codex-plugin/skills/ux-grill/SKILL.md +11 -4
- package/.cursor/commands/autopilot.md +4 -4
- package/.cursor/commands/bootstrap.md +5 -4
- package/.cursor/commands/brainstorm.md +5 -4
- package/.cursor/commands/close.md +4 -3
- package/.cursor/commands/convergence-monitoring.md +13 -0
- package/.cursor/commands/debug.md +4 -4
- package/.cursor/commands/discovery.md +4 -4
- package/.cursor/commands/dispatcher.md +4 -4
- package/.cursor/commands/eli5.md +4 -4
- package/.cursor/commands/eval.md +4 -4
- package/.cursor/commands/evolve.md +4 -4
- package/.cursor/commands/go.md +4 -3
- package/.cursor/commands/grill.md +4 -4
- package/.cursor/commands/harness-audit.md +3 -3
- package/.cursor/commands/memory-cleanup.md +4 -4
- package/.cursor/commands/npm-publish.md +13 -0
- package/.cursor/commands/persona-panel.md +4 -4
- package/.cursor/commands/plan.md +5 -4
- package/.cursor/commands/portfolio.md +3 -3
- package/.cursor/commands/reconcile.md +4 -4
- package/.cursor/commands/release.md +4 -3
- package/.cursor/commands/repo-audit.md +4 -4
- package/.cursor/commands/spinout.md +4 -4
- package/.cursor/commands/sunset-review.md +4 -4
- package/.cursor/commands/test.md +3 -3
- package/.cursor/commands/ux-grill.md +4 -4
- package/.cursor/rules/010-session-workflow.mdc +2 -2
- package/.cursor/skills/bootstrap/SKILL.md +1 -0
- package/.cursor/skills/close/SKILL.md +13 -0
- package/.cursor/skills/debug/SKILL.md +0 -1
- package/.cursor/skills/discovery/SKILL.md +0 -1
- package/.cursor/skills/dispatcher/SKILL.md +0 -1
- package/.cursor/skills/eli5/SKILL.md +0 -1
- package/.cursor/skills/evolve/SKILL.md +0 -1
- package/.cursor/skills/go/SKILL.md +13 -0
- package/.cursor/skills/grill/SKILL.md +0 -1
- package/.cursor/skills/harness-audit/SKILL.md +12 -0
- package/.cursor/skills/portfolio/SKILL.md +12 -0
- package/.cursor/skills/release/SKILL.md +13 -0
- package/.cursor/skills/repo-audit/SKILL.md +0 -1
- package/.cursor/skills/sunset-review/SKILL.md +0 -1
- package/.cursor/skills/test/SKILL.md +12 -0
- package/.cursor/skills/ux-grill/SKILL.md +0 -1
- package/.cursor-plugin/plugin.json +2 -2
- package/.orchestrator/policy/blocked-commands.json +10 -0
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +80 -0
- package/README.md +74 -235
- package/commands/session.md +10 -0
- package/docs/USER-GUIDE.md +24 -0
- package/docs/ci-setup.md +53 -0
- package/docs/codex-setup.md +1 -1
- package/docs/components.md +12 -5
- package/docs/events-schema.md +5 -1
- package/docs/install.md +128 -0
- package/docs/persona-panel.md +1 -1
- package/docs/pi-setup.md +1 -1
- package/docs/rule-authoring.md +83 -14
- package/docs/scope-collision-guard.md +2 -0
- package/docs/session-config-reference.md +6 -4
- package/docs/session-config-template.md +38 -0
- package/docs/telemetry.md +15 -0
- package/hooks/_lib/hook-import-set.json +46 -6
- package/hooks/_lib/subagent-paths.mjs +15 -0
- package/hooks/_lib/vcs-create-matcher.mjs +217 -62
- package/hooks/enforce-scope.mjs +42 -1
- package/hooks/hooks-codex.json +1 -1
- package/hooks/hooks.json +1 -1
- package/hooks/on-session-end.mjs +14 -2
- package/hooks/on-stop.mjs +43 -1
- package/hooks/post-bash-write-verify.mjs +3 -0
- package/hooks/pre-auq-clarity.mjs +3 -0
- package/hooks/pre-bash-issue-budget.mjs +103 -17
- package/hooks/pre-task-scope-disjoint.mjs +152 -3
- package/hooks/skill-invocation-telemetry.mjs +2 -1
- package/package.json +3 -2
- package/pi/prompts/autopilot.md +3 -3
- package/pi/prompts/bootstrap.md +3 -3
- package/pi/prompts/brainstorm.md +3 -3
- package/pi/prompts/close.md +2 -2
- package/pi/prompts/convergence-monitoring.md +11 -0
- package/pi/prompts/debug.md +3 -3
- package/pi/prompts/discovery.md +3 -3
- package/pi/prompts/dispatcher.md +3 -3
- package/pi/prompts/eli5.md +3 -3
- package/pi/prompts/eval.md +3 -3
- package/pi/prompts/evolve.md +3 -3
- package/pi/prompts/go.md +2 -2
- package/pi/prompts/grill.md +3 -3
- package/pi/prompts/harness-audit.md +2 -3
- package/pi/prompts/memory-cleanup.md +3 -3
- package/pi/prompts/npm-publish.md +11 -0
- package/pi/prompts/persona-panel.md +3 -3
- package/pi/prompts/plan.md +3 -3
- package/pi/prompts/portfolio.md +2 -2
- package/pi/prompts/reconcile.md +3 -3
- package/pi/prompts/release.md +3 -3
- package/pi/prompts/repo-audit.md +3 -4
- package/pi/prompts/session.md +1 -1
- package/pi/prompts/spinout.md +3 -3
- package/pi/prompts/sunset-review.md +3 -3
- package/pi/prompts/templates-ack.md +1 -1
- package/pi/prompts/test.md +3 -3
- package/pi/prompts/ux-grill.md +3 -3
- package/scripts/archive-closed-prds.mjs +2 -2
- package/scripts/auq-audit.mjs +2 -3
- package/scripts/backfill-abandoned-sessions.mjs +57 -3
- package/scripts/backfill-evidence-digest.mjs +2 -1
- package/scripts/backfill-learnings-from-vault.mjs +2 -2
- package/scripts/check-package-manager.mjs +2 -2
- package/scripts/ci/assert-vitest-green.mjs +2 -1
- package/scripts/emit-session.mjs +2 -3
- package/scripts/export-hw-learnings.mjs +2 -1
- package/scripts/express-path.mjs +1 -1
- package/scripts/gc-stale-worktrees.mjs +2 -1
- package/scripts/generate-codex-skills.mjs +48 -4
- package/scripts/generate-cursor-adapter.mjs +173 -9
- package/scripts/generate-hook-import-set.mjs +12 -27
- package/scripts/generate-pi-prompts.mjs +183 -13
- package/scripts/github-protection-audit.mjs +2 -3
- package/scripts/lib/agent-frontmatter.mjs +23 -1
- package/scripts/lib/claude-md-budget-lint.mjs +2 -5
- package/scripts/lib/command-blocker.mjs +209 -9
- package/scripts/lib/config/drift-check.mjs +19 -0
- package/scripts/lib/convergence-monitor.mjs +2 -2
- package/scripts/lib/cursor-hook-bridge.mjs +2 -2
- package/scripts/lib/description-surface.mjs +2 -5
- package/scripts/lib/dispatcher/cli.mjs +2 -1
- package/scripts/lib/ecosystem-wizard.mjs +2 -1
- package/scripts/lib/fetch-baseline.mjs +3 -8
- package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +2 -1
- package/scripts/lib/gitlab-portfolio/cli.mjs +2 -1
- package/scripts/lib/instruction-budget-guard.mjs +186 -46
- package/scripts/lib/is-main-module.mjs +82 -0
- package/scripts/lib/locks/index.mjs +32 -25
- package/scripts/lib/maintenance-due-banner.mjs +69 -3
- package/scripts/lib/peer-discovery.mjs +2 -5
- package/scripts/lib/playwright-driver/runner.mjs +63 -2
- package/scripts/lib/reconcile/rule-expiry-sweep.mjs +642 -0
- package/scripts/lib/rules-sync.mjs +2 -5
- package/scripts/lib/scope-echo.mjs +392 -7
- package/scripts/lib/session-close-backfill.mjs +58 -6
- package/scripts/lib/state-md.mjs +84 -3
- package/scripts/lib/sunset/walker.mjs +31 -4
- package/scripts/lib/tests-src-ratio.mjs +2 -6
- package/scripts/lib/tmux-layout/telemetry-stats.mjs +2 -1
- package/scripts/lib/user-invocable-skills.mjs +185 -0
- package/scripts/lib/validate/check-banner-parity.mjs +2 -2
- package/scripts/lib/validate/check-cursor-adapter.mjs +2 -2
- package/scripts/lib/validate/check-dead-bridge.mjs +2 -2
- package/scripts/lib/validate/check-doc-cli-commands.mjs +2 -2
- package/scripts/lib/validate/check-entry-guard.mjs +366 -0
- package/scripts/lib/validate/check-guard-requires-parity.mjs +2 -2
- package/scripts/lib/validate/check-hooks-emit-event-guard.mjs +2 -2
- package/scripts/lib/validate/check-learning-provenance.mjs +2 -2
- package/scripts/lib/validate/check-skill-links.mjs +27 -6
- package/scripts/lib/validate/check-skill-script-paths.mjs +2 -2
- package/scripts/lib/validate/check-test-git-config-target.mjs +2 -2
- package/scripts/lib/validate/check-unicode-safety.mjs +2 -2
- package/scripts/lib/validate/check-untracked-test-deps.mjs +2 -2
- package/scripts/lib/validate/check-unwired-features.mjs +266 -11
- package/scripts/lib/validate/check-validator-registration.mjs +2 -2
- package/scripts/lib/validate/check-vcs-repo-flag.mjs +2 -2
- package/scripts/lib/validate-vendored-rules.mjs +35 -9
- package/scripts/lib/wave-transcript-tail.mjs +2 -2
- package/scripts/lock-reaper.mjs +2 -1
- package/scripts/materialize-wave-scope.mjs +87 -4
- package/scripts/migrate-sessions-jsonl.mjs +2 -1
- package/scripts/migrate-vault-paths.mjs +2 -3
- package/scripts/release.mjs +124 -35
- package/scripts/relocate-vault-corpus.mjs +2 -3
- package/scripts/repair-invalid-sessions.mjs +2 -2
- package/scripts/session-shape.mjs +2 -2
- package/scripts/site-numbers.mjs +35 -11
- package/scripts/sweep-expired-rules.mjs +216 -0
- package/scripts/validate-plugin.mjs +9 -0
- package/scripts/vault-consolidate.mjs +2 -2
- package/scripts/vault-mirror.mjs +2 -3
- package/scripts/wave-scope-binding.mjs +2 -3
- package/skills/_shared/bootstrap-gate.md +1 -1
- package/skills/_shared/monitor-patterns.md +1 -1
- package/skills/_shared/research-evidence.md +53 -0
- package/skills/_shared/state-ownership.md +3 -0
- package/skills/autopilot/SKILL.md +58 -4
- package/skills/bootstrap/SKILL.md +51 -1
- package/skills/brainstorm/SKILL.md +16 -0
- package/skills/claude-md-drift-check/checker.mjs +49 -11
- package/{commands/close.md → skills/close/SKILL.md} +9 -3
- package/skills/debug/SKILL.md +10 -0
- package/skills/discovery/SKILL.md +24 -1
- package/skills/discovery/probes-session.md +2 -2
- package/skills/dispatcher/SKILL.md +38 -7
- package/skills/eli5/SKILL.md +11 -0
- package/skills/eval/SKILL.md +14 -0
- package/skills/evolve/SKILL.md +8 -1
- package/skills/evolve/references/evolve-dialectic-mode.md +6 -2
- package/{commands/go.md → skills/go/SKILL.md} +9 -1
- package/skills/grill/SKILL.md +19 -0
- package/{commands/harness-audit.md → skills/harness-audit/SKILL.md} +7 -2
- package/skills/hook-development/SKILL.md +46 -41
- package/skills/memory-cleanup/SKILL.md +7 -0
- package/skills/npm-publish/SKILL.md +1 -1
- package/skills/persona-panel/SKILL.md +56 -1
- package/skills/persona-panel/persona-format.md +1 -1
- package/skills/plan/SKILL.md +28 -1
- package/skills/playwright-driver/SKILL.md +7 -10
- package/{commands/portfolio.md → skills/portfolio/SKILL.md} +8 -2
- package/skills/reconcile/SKILL.md +10 -0
- package/{commands/release.md → skills/release/SKILL.md} +16 -2
- package/skills/repo-audit/SKILL.md +7 -0
- package/skills/session-end/plan-verification.md +2 -2
- package/skills/session-plan/SKILL.md +1 -1
- package/skills/session-start/SKILL.md +5 -4
- package/skills/session-start/phase-8-5-express-path.md +6 -6
- package/skills/session-start/references/phase-1-5-session-continuity.md +1 -1
- package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +1 -1
- package/skills/session-start/references/phase-4-ssot-environment-check.md +4 -3
- package/skills/spinout/SKILL.md +12 -1
- package/skills/sunset-review/SKILL.md +13 -0
- package/{commands/test.md → skills/test/SKILL.md} +10 -4
- package/skills/ux-grill/SKILL.md +19 -1
- package/skills/wave-executor/SKILL.md +7 -4
- package/skills/wave-executor/references/wave-executor-state-init.md +13 -1
- package/skills/wave-executor/references/wave-loop-dispatch.md +3 -1
- package/skills/wave-executor/references/wave-loop-review.md +17 -1
- package/commands/autopilot.md +0 -80
- package/commands/bootstrap.md +0 -56
- package/commands/brainstorm.md +0 -48
- package/commands/debug.md +0 -36
- package/commands/discovery.md +0 -32
- package/commands/dispatcher.md +0 -59
- package/commands/eli5.md +0 -33
- package/commands/eval.md +0 -28
- package/commands/evolve.md +0 -10
- package/commands/grill.md +0 -45
- package/commands/memory-cleanup.md +0 -26
- package/commands/persona-panel.md +0 -121
- package/commands/plan.md +0 -15
- package/commands/reconcile.md +0 -23
- package/commands/repo-audit.md +0 -24
- package/commands/spinout.md +0 -15
- package/commands/sunset-review.md +0 -27
- package/commands/ux-grill.md +0 -51
|
@@ -6,21 +6,23 @@ model: sonnet
|
|
|
6
6
|
|
|
7
7
|
# Hook Development for Claude Code Plugins
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Use the [official Claude Code hooks reference](https://code.claude.com/docs/en/hooks) as the source of truth for current events and schemas. This skill keeps only the conventions needed to author this plugin's hooks.
|
|
10
10
|
|
|
11
|
-
## Hook types
|
|
11
|
+
## Hook types used in this plugin
|
|
12
|
+
|
|
13
|
+
Claude Code also documents `http`, `mcp_tool`, and experimental `agent` handlers. Use those only after checking their current fields and event support in the official reference.
|
|
12
14
|
|
|
13
15
|
### Prompt-based (LLM-driven, for complex reasoning)
|
|
14
16
|
|
|
15
17
|
```json
|
|
16
18
|
{
|
|
17
19
|
"type": "prompt",
|
|
18
|
-
"prompt": "Evaluate
|
|
20
|
+
"prompt": "Evaluate whether this event should proceed: $ARGUMENTS",
|
|
19
21
|
"timeout": 30
|
|
20
22
|
}
|
|
21
23
|
```
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
Prompt hooks are supported only on events documented for that handler type. `$ARGUMENTS` contains the hook input JSON.
|
|
24
26
|
|
|
25
27
|
Use for: context-aware decisions, flexible evaluation, natural-language reasoning.
|
|
26
28
|
|
|
@@ -36,11 +38,11 @@ Use for: context-aware decisions, flexible evaluation, natural-language reasonin
|
|
|
36
38
|
|
|
37
39
|
Use for: fast deterministic validations, file-system ops, external tools, performance-critical paths.
|
|
38
40
|
|
|
39
|
-
**Our convention:**
|
|
41
|
+
**Our convention:** hook logic lives in `.mjs` files — see `hooks/pre-bash-destructive-guard.mjs` and `hooks/enforce-scope.mjs`. The manifest invokes them through the repository's runtime wrapper.
|
|
40
42
|
|
|
41
43
|
## Configuration formats
|
|
42
44
|
|
|
43
|
-
|
|
45
|
+
Keep the file location and its outer document shape explicit when copying an example.
|
|
44
46
|
|
|
45
47
|
### Plugin `hooks/hooks.json` — wrapper format
|
|
46
48
|
|
|
@@ -63,25 +65,27 @@ This is where people trip up. Two formats exist; they are NOT interchangeable.
|
|
|
63
65
|
- `hooks` wrapper is required
|
|
64
66
|
- `description` is optional
|
|
65
67
|
|
|
66
|
-
### User `.claude/settings.json` —
|
|
68
|
+
### User or project `.claude/settings.json` — settings format
|
|
67
69
|
|
|
68
70
|
```json
|
|
69
71
|
{
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
"hooks": {
|
|
73
|
+
"PreToolUse": [
|
|
74
|
+
{
|
|
75
|
+
"matcher": "Write|Edit",
|
|
76
|
+
"hooks": [
|
|
77
|
+
{ "type": "command", "command": "~/my-hook.sh" }
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
78
82
|
}
|
|
79
83
|
```
|
|
80
84
|
|
|
81
|
-
-
|
|
82
|
-
-
|
|
85
|
+
- The top-level `hooks` key is required in settings.
|
|
86
|
+
- Plugin `hooks/hooks.json` may additionally carry a top-level `description`.
|
|
83
87
|
|
|
84
|
-
|
|
88
|
+
The distinction is registration and scope: settings hooks belong to a user, project, or managed policy; plugin hooks run while the plugin is enabled. The nested event → matcher group → handler shape is the same.
|
|
85
89
|
|
|
86
90
|
## Hook events
|
|
87
91
|
|
|
@@ -92,7 +96,7 @@ Mixing these up is the #1 reason new hooks don't fire.
|
|
|
92
96
|
| `UserPromptSubmit` | User submits prompt | Add context, validate |
|
|
93
97
|
| `Stop` | Main agent stopping | Completeness check |
|
|
94
98
|
| `SubagentStop` | Subagent stopping | Task validation |
|
|
95
|
-
| `SessionStart` | Session begins | Context load |
|
|
99
|
+
| `SessionStart` | Session begins or resumes | Context load |
|
|
96
100
|
| `SessionEnd` | Session ends | Cleanup, logging |
|
|
97
101
|
| `PreCompact` | Before compaction | Preserve critical state |
|
|
98
102
|
| `Notification` | User notified | Logging, reactions |
|
|
@@ -102,7 +106,9 @@ Mixing these up is the #1 reason new hooks don't fire.
|
|
|
102
106
|
```json
|
|
103
107
|
{
|
|
104
108
|
"hookSpecificOutput": {
|
|
105
|
-
"
|
|
109
|
+
"hookEventName": "PreToolUse",
|
|
110
|
+
"permissionDecision": "deny",
|
|
111
|
+
"permissionDecisionReason": "Why this decision was made",
|
|
106
112
|
"updatedInput": { "field": "modified_value" }
|
|
107
113
|
},
|
|
108
114
|
"systemMessage": "Explanation shown to Claude"
|
|
@@ -113,12 +119,14 @@ Mixing these up is the #1 reason new hooks don't fire.
|
|
|
113
119
|
|
|
114
120
|
```json
|
|
115
121
|
{
|
|
116
|
-
"decision": "
|
|
117
|
-
"reason": "Why
|
|
122
|
+
"decision": "block",
|
|
123
|
+
"reason": "Why Claude should continue",
|
|
118
124
|
"systemMessage": "Additional context"
|
|
119
125
|
}
|
|
120
126
|
```
|
|
121
127
|
|
|
128
|
+
Omit `decision` to allow stopping. `approve` is not a valid Stop decision. For non-error feedback that keeps the conversation running, use `hookSpecificOutput.additionalContext` with `hookEventName` set to `Stop` or `SubagentStop`.
|
|
129
|
+
|
|
122
130
|
### SessionStart: persist env vars
|
|
123
131
|
|
|
124
132
|
```bash
|
|
@@ -136,17 +144,18 @@ All hooks receive JSON on stdin:
|
|
|
136
144
|
"session_id": "abc123",
|
|
137
145
|
"transcript_path": "/path/to/transcript.jsonl",
|
|
138
146
|
"cwd": "/current/working/dir",
|
|
139
|
-
"permission_mode": "
|
|
147
|
+
"permission_mode": "default",
|
|
140
148
|
"hook_event_name": "PreToolUse"
|
|
141
149
|
}
|
|
142
150
|
```
|
|
143
151
|
|
|
144
152
|
Event-specific extras:
|
|
145
|
-
- `PreToolUse
|
|
146
|
-
- `
|
|
147
|
-
- `
|
|
153
|
+
- `PreToolUse`: `tool_name`, `tool_input`, `tool_use_id`
|
|
154
|
+
- `PostToolUse`: `tool_name`, `tool_input`, `tool_response`, `tool_use_id`
|
|
155
|
+
- `UserPromptSubmit`: `prompt`
|
|
156
|
+
- `Stop`: `stop_hook_active`, `last_assistant_message`; `SubagentStop` also carries agent identity and transcript fields
|
|
148
157
|
|
|
149
|
-
|
|
158
|
+
Event fields vary and evolve. Parse only fields needed by the hook and consult the official event section before depending on one. The `UserPromptSubmit` field name above was last checked against the official reference on 2026-09-15 (branch `codex/ecc-systematic-review`); this plugin registers no `UserPromptSubmit` handler, so no code here exercises either spelling — verify before depending on it. Prompt and agent hooks receive the complete input through `$ARGUMENTS`.
|
|
150
159
|
|
|
151
160
|
## Environment variables
|
|
152
161
|
|
|
@@ -222,7 +231,7 @@ echo $file_path # ❌ unquoted injection risk
|
|
|
222
231
|
|
|
223
232
|
### Timeouts
|
|
224
233
|
|
|
225
|
-
|
|
234
|
+
Current defaults are 600 seconds for command/HTTP/MCP-tool hooks, 30 seconds for prompt hooks, and 60 seconds for agent hooks, with shorter defaults for some events. `SessionEnd` also has a shared time budget. Set a short explicit timeout appropriate to the hook; a timed-out `PreToolUse` command hook does not block the tool call.
|
|
226
235
|
|
|
227
236
|
```json
|
|
228
237
|
{ "type": "command", "command": "...", "timeout": 10 }
|
|
@@ -232,17 +241,13 @@ Defaults: command hooks 60s, prompt hooks 30s. Set explicitly when the work is k
|
|
|
232
241
|
|
|
233
242
|
All matching hooks run **in parallel** — they don't see each other's output, ordering is non-deterministic. Design for independence.
|
|
234
243
|
|
|
235
|
-
##
|
|
244
|
+
## Registration and reload behavior
|
|
236
245
|
|
|
237
|
-
|
|
246
|
+
Installed capability and active registration are different. A plugin can ship hook files without those hooks running when the plugin is disabled. Settings hooks merge with plugin and managed hooks; `/hooks` shows the active sources.
|
|
238
247
|
|
|
239
|
-
|
|
240
|
-
1. Edit hook
|
|
241
|
-
2. Exit Claude Code
|
|
242
|
-
3. Restart (`claude` or `cc`)
|
|
243
|
-
4. Verify with `/hooks` command or `claude --debug`
|
|
248
|
+
Direct edits to hooks in settings files are normally picked up by Claude Code's file watcher. Plugin registration changes may require disabling/re-enabling the plugin or starting a fresh session. A command hook's script is launched when the event fires, so editing the script itself can affect the next invocation without re-registering the manifest.
|
|
244
249
|
|
|
245
|
-
|
|
250
|
+
To test a registration change, inspect `/hooks`, trigger the matching event, and use `claude --debug` when the source, matcher, output, or timeout remains unclear.
|
|
246
251
|
|
|
247
252
|
## Debugging
|
|
248
253
|
|
|
@@ -269,7 +274,7 @@ output=$(./your-hook.mjs < test-input.json)
|
|
|
269
274
|
echo "$output" | jq .
|
|
270
275
|
```
|
|
271
276
|
|
|
272
|
-
Invalid
|
|
277
|
+
Invalid structured output is normally reported as a non-blocking hook error and the action proceeds, so always verify the output and the resulting decision.
|
|
273
278
|
|
|
274
279
|
## Conditional activation
|
|
275
280
|
|
|
@@ -292,8 +297,8 @@ enabled=$(jq -r '.strictMode // false' "$CONFIG_FILE" 2>/dev/null)
|
|
|
292
297
|
|
|
293
298
|
## Our in-house examples (read these, not the upstream `examples/`)
|
|
294
299
|
|
|
295
|
-
- `hooks/pre-bash-destructive-guard.mjs` — policy-driven command blocker
|
|
296
|
-
- `hooks/enforce-scope.mjs` —
|
|
300
|
+
- `hooks/pre-bash-destructive-guard.mjs` — policy-driven command blocker backed by `.orchestrator/policy/blocked-commands.json`
|
|
301
|
+
- `hooks/enforce-scope.mjs` — scope enforcement using `wave-scope.json` in the platform's state directory
|
|
297
302
|
- `hooks/on-session-start.mjs` — banner + session init
|
|
298
303
|
- `hooks/post-edit-validate.mjs` — validates edits after the fact
|
|
299
304
|
- `hooks/on-stop.mjs` — session-event capture + metrics
|
|
@@ -306,7 +311,7 @@ enabled=$(jq -r '.strictMode // false' "$CONFIG_FILE" 2>/dev/null)
|
|
|
306
311
|
- Validate every input field before trusting it
|
|
307
312
|
- Quote all shell variables
|
|
308
313
|
- Set explicit timeouts for known-slow work
|
|
309
|
-
- Return structured JSON on
|
|
314
|
+
- Return only schema-valid structured JSON when the event needs a decision or context; emit nothing on a silent allow
|
|
310
315
|
|
|
311
316
|
**Don't:**
|
|
312
317
|
- Hardcoded paths
|
|
@@ -409,5 +414,5 @@ env-precedence, PluginRootResolutionError class shape.
|
|
|
409
414
|
|
|
410
415
|
## References
|
|
411
416
|
|
|
412
|
-
- [Official hooks
|
|
417
|
+
- [Official hooks reference](https://code.claude.com/docs/en/hooks)
|
|
413
418
|
- Upstream: [patterns.md](https://github.com/anthropics/claude-plugins-official/tree/main/plugins/plugin-dev/skills/hook-development/references/patterns.md), [advanced.md](https://github.com/anthropics/claude-plugins-official/tree/main/plugins/plugin-dev/skills/hook-development/references/advanced.md) — read these for edge cases we haven't hit yet
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: memory-cleanup
|
|
3
3
|
user-invocable: true
|
|
4
|
+
argument-hint: "[--dry-run | --apply-pending]"
|
|
4
5
|
tags: [memory, maintenance, meta, dream]
|
|
5
6
|
model: sonnet
|
|
6
7
|
model-preference: sonnet
|
|
@@ -20,6 +21,12 @@ description: >
|
|
|
20
21
|
|
|
21
22
|
# Memory Cleanup — Manual Dream Process
|
|
22
23
|
|
|
24
|
+
## Invocation
|
|
25
|
+
|
|
26
|
+
The user invoked `/memory-cleanup` with arguments: **$ARGUMENTS**. Parse them before anything else — two optional, mutually-exclusive flags are recognised (`--dry-run`, `--apply-pending`, see PRD #502); passing both is an error, and the absence of both selects the legacy interactive 4-phase mode. The per-flag behaviour, the exact status lines and the exit codes are in § Argument Handling (Phase 0) below; the interactive default runs Phases 1-4 (Orient → Gather Signal → Consolidate → Prune & Index) against `~/.claude/projects/<encoded-cwd>/memory/` and reports per § Output.
|
|
27
|
+
|
|
28
|
+
Sidecar producer/consumer contract: session-end Phase 3.6.5 (`scripts/lib/auto-dream.mjs`) is nudge-only (#614) — it never dispatches a subagent to write the sidecar. The only real producer of `.orchestrator/pending-dream.md` is a manual `/memory-cleanup --dry-run` run; `--apply-pending` is the operator-confirmed consumer in a later session. The sidecar file is single-writer — concurrent sessions cannot collide because the writer holds the session-lock. <!-- path-check: example -->
|
|
29
|
+
|
|
23
30
|
Implements the 4-phase memory consolidation process modelled after Claude Code's Auto Dream feature. Run after major refactors, framework migrations, or every 5+ sessions in a repo.
|
|
24
31
|
|
|
25
32
|
The memory system lives at `~/.claude/projects/<encoded-cwd>/memory/` and consists of:
|
|
@@ -39,7 +39,7 @@ The script gates mechanics. These three are yours, and it will not make them for
|
|
|
39
39
|
|
|
40
40
|
**2. What a leak means when one is found.** A hit from the leakage gate is not a pattern to silence. Decide which of two it is: a real leak (fix `package.json` `files`, re-pack, re-check) or genuine over-matching (fix `LEAKAGE_PATTERNS` in `scripts/release.mjs` **with a test**). There is no third option, and neither is "publish anyway and clean it up in the next version" — an npm publish is not revocable, and unpublishing burns the version number permanently. Operator handling detail: `docs/distribution/npm-publish-checklist.md` § 3.
|
|
41
41
|
|
|
42
|
-
**3. When to abort instead of repair.** Abort — do not patch forward — when the failure is upstream of the target-confirmed npm receipt: a red preflight row, a lagging `github` mirror, CI not green on the exact commit **on either platform** (`--check` carries both `ci-green-on-head` for GitLab and `ci-green-on-head-github` for the mirror, whose macOS matrix leg has no GitLab equivalent), a dead token, or a publish that did not issue the target receipt. These are cheap to fix and re-run from the top. Repair-in-place is only appropriate *after* that receipt, where the version is already immutable: registry propagation, a missing GitHub release, or a lagging site deploy can be reconciled because npm already has the correct artifact. When `--publish` reports **Post-publish reconciliation required**, **do not rerun `--publish`**; repair the listed state directly. `
|
|
42
|
+
**3. When to abort instead of repair.** Abort — do not patch forward — when the failure is upstream of the target-confirmed npm receipt: a red preflight row, a lagging `github` mirror, CI not green on the exact commit **on either platform** (`--check` carries both `ci-green-on-head` for GitLab and `ci-green-on-head-github` for the mirror, whose macOS matrix leg has no GitLab equivalent), a dead token, or a publish that did not issue the target receipt. These are cheap to fix and re-run from the top. Repair-in-place is only appropriate *after* that receipt, where the version is already immutable: registry propagation, a missing GitHub release, or a lagging site deploy can be reconciled because npm already has the correct artifact. When `--publish` reports **Post-publish reconciliation required**, **do not rerun `--publish`**; repair the listed state directly. `skills/release/SKILL.md` § Abort criteria is the operative list.
|
|
43
43
|
|
|
44
44
|
## Failure-mode table
|
|
45
45
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: persona-panel
|
|
3
3
|
user-invocable: true
|
|
4
|
+
argument-hint: "<target> [--personas <names,...>] [--mode <voting|hard-gate|summary>] [--threshold <M-of-N|all|any>] [--grounding <off|re-derive>] [--dry-run]"
|
|
4
5
|
tags: [review, personas, content, quality, multi-agent]
|
|
5
6
|
model: inherit
|
|
6
7
|
description: >
|
|
@@ -13,6 +14,60 @@ description: >
|
|
|
13
14
|
|
|
14
15
|
# Persona Panel Skill
|
|
15
16
|
|
|
17
|
+
## Invocation
|
|
18
|
+
|
|
19
|
+
The user invoked `/persona-panel` with arguments: **$ARGUMENTS**. Parse them before doing anything else — including before the Phase 0 bootstrap gate's side effects.
|
|
20
|
+
|
|
21
|
+
**Positional argument (required):**
|
|
22
|
+
|
|
23
|
+
- `<target>` — file path, directory, or range to review. Must be resolvable via `validatePathInsideProject` against the current project root (Phase 2). Relative paths are resolved from the project root. Globs are accepted (e.g. `src/app/api/*.ts`).
|
|
24
|
+
|
|
25
|
+
**Recognized flags:**
|
|
26
|
+
|
|
27
|
+
- `--personas <names,...>` — comma-separated subset of catalog names to include (e.g. `physicist,ai-expert`). Default: all personas discovered in `.claude/personas/`. Names are matched case-insensitively against `<name>.md` catalog files.
|
|
28
|
+
- `--mode <voting|hard-gate|summary>` — consolidation mode; the short forms are aliases of the Phase 4 mode names `voting-quorum`, `hard-gate-threshold` and `coordinator-summary` respectively. Default: `voting-quorum`. `summary` emits an explicit WARN that this mode adds one additional LLM call.
|
|
29
|
+
- `--threshold <spec>` — quorum spec. Accepted forms: `M-of-N` where M and N are integers 1..20, `all`, or `any`. Parsed by `scripts/lib/persona-panel/threshold.mjs::parseThreshold()`. Default: `all` for `hard-gate-threshold`. In `voting-quorum` the majority default of Phase 4 applies unless `--quorum <M>` overrides it.
|
|
30
|
+
- `--quorum <M>` — integer M-of-N override for `voting-quorum` (see Phase 4).
|
|
31
|
+
- `--grounding <off|re-derive>` — Grounding-Review mode (#730 Epic H). `off` (default): personas evaluate the target as-is. `re-derive`: each persona independently re-derives supporting sources via Read/Grep/Glob instead of trusting a "Sources" section the target may already assert, and reports them as `derived_sources`. Advisory-only in v1 — never influences `final_verdict`. See `skills/persona-panel/persona-format.md` § "Grounding Mode (optional)".
|
|
32
|
+
- `--lines <start>-<end>` — restrict the review to a line range of the target (validated in Phase 2: start ≤ end, both positive integers).
|
|
33
|
+
- `--dry-run` — resolve catalog and target, print the dispatch plan (persona names, models, target), do NOT call `Agent()`, do NOT write a sidecar. Exit 0 on success.
|
|
34
|
+
|
|
35
|
+
**Validation errors (all exit 1):**
|
|
36
|
+
|
|
37
|
+
- Missing `<target>`: `missing required arg <target>` — print the usage line and exit 1 without running any phase.
|
|
38
|
+
- Unknown flag (starts with `--` but not in the list above): `unknown flag: --<name>. Valid: --personas, --mode, --threshold, --quorum, --grounding, --lines, --dry-run`.
|
|
39
|
+
- `--mode` value not in enum: `invalid --mode value: '<value>'. Valid: voting, hard-gate, summary`.
|
|
40
|
+
- `--threshold` value fails `parseThreshold()`: echo the parser error verbatim, e.g. `invalid threshold 'foo': expected M-of-N (M,N integers 1..20), 'all', or 'any'`.
|
|
41
|
+
- `--grounding` value not in enum: `invalid --grounding value: '<value>'. Valid: off, re-derive`.
|
|
42
|
+
- `<target>` outside project root: `target path outside project: <path>`.
|
|
43
|
+
|
|
44
|
+
### Examples
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
/persona-panel src/app/api/invoices.ts
|
|
48
|
+
```
|
|
49
|
+
All `.claude/personas/*.md` are dispatched, voting consolidation, sidecar written.
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
/persona-panel src/app/api/invoices.ts --personas physicist,ai-expert
|
|
53
|
+
```
|
|
54
|
+
Only the `physicist` and `ai-expert` catalog entries are dispatched.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
/persona-panel notes/draft.md --mode hard-gate --threshold all
|
|
58
|
+
```
|
|
59
|
+
All resolved personas must return PASS; a single FAIL produces a final FAIL verdict.
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
/persona-panel src/ --dry-run
|
|
63
|
+
```
|
|
64
|
+
Prints the planned dispatch list and exits 0 without calling `Agent()` or writing a sidecar.
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
/persona-panel docs/design-doc.md --grounding re-derive
|
|
68
|
+
```
|
|
69
|
+
Each persona re-derives its own supporting sources rather than trusting a "Sources" section already present in the input document (for example, `docs/design-doc.md`), reporting them as `derived_sources`. Advisory-only — `final_verdict` is unaffected. <!-- path-check: example -->
|
|
70
|
+
|
|
16
71
|
## Overview
|
|
17
72
|
|
|
18
73
|
Persona Panel runs any number of catalog-defined personas in parallel against a single target
|
|
@@ -355,7 +410,7 @@ result. If `final_verdict == "warn"`: exit 0 with a warning line on stderr. If
|
|
|
355
410
|
|
|
356
411
|
## See Also
|
|
357
412
|
|
|
358
|
-
- `
|
|
413
|
+
- `scripts/lib/persona-panel/threshold.mjs` — parseThreshold() for `--threshold` specs
|
|
359
414
|
- `agents/schemas/persona-panel-sidecar.schema.json` — sidecar JSON Schema (Draft 2020-12)
|
|
360
415
|
- `scripts/lib/persona-panel/catalog-loader.mjs` — loadCatalog() implementation
|
|
361
416
|
- `scripts/lib/persona-panel/persona-runner.mjs` — buildPersonaPrompt() implementation
|
|
@@ -170,7 +170,7 @@ diff is reported alongside the panel result and has **zero influence on `final_v
|
|
|
170
170
|
is signal for the operator to review, not a consolidation input. `consolidate()` and `tally()`
|
|
171
171
|
in `consolidator.mjs` are deliberately unaware of grounding data.
|
|
172
172
|
|
|
173
|
-
**Enabling it:** pass `--grounding re-derive` to `/persona-panel` (see `
|
|
173
|
+
**Enabling it:** pass `--grounding re-derive` to `/persona-panel` (see `skills/persona-panel/SKILL.md`).
|
|
174
174
|
Default remains `--grounding off`.
|
|
175
175
|
|
|
176
176
|
---
|
package/skills/plan/SKILL.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plan
|
|
3
|
-
user-invocable:
|
|
3
|
+
user-invocable: true
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
argument-hint: "[new|feature|retro]"
|
|
4
6
|
tags: [planning, prd, requirements, research]
|
|
5
7
|
model: inherit
|
|
6
8
|
model-preference: opus
|
|
@@ -19,6 +21,24 @@ description: >
|
|
|
19
21
|
|
|
20
22
|
> Project-instruction file resolution: CLAUDE.md and AGENTS.md (Codex CLI) are transparent aliases — see [skills/_shared/instruction-file-resolution.md](../_shared/instruction-file-resolution.md). All references below to `CLAUDE.md` resolve via that precedence rule.
|
|
21
23
|
|
|
24
|
+
## Invocation
|
|
25
|
+
|
|
26
|
+
You are beginning a structured planning session. The user invoked `/plan` with mode: **$ARGUMENTS** (if empty, Phase 2's Mode Router asks which mode they want: `new`, `feature`, or `retro`).
|
|
27
|
+
|
|
28
|
+
**Modes:** `new` = project kickoff, `feature` = feature PRD, `retro` = retrospective.
|
|
29
|
+
|
|
30
|
+
**Your job: guide the user through structured requirement gathering and produce a complete plan document for the chosen mode.** Follow the phases below precisely. Do NOT skip any phase. Do NOT make assumptions — gather requirements interactively.
|
|
31
|
+
|
|
32
|
+
### Headless (`claude -p`)
|
|
33
|
+
|
|
34
|
+
`session` and `plan` are **reserved terminal-only built-in names** in non-interactive sessions — under `claude -p` the bare form answers `"/plan isn't available in this environment."`, and no frontmatter or manifest field overrides that (reproduced with an empty `CLAUDE_CONFIG_DIR` and no plugin loaded, claude 2.1.273, measured 2026-09-16). Use the namespaced form, which does resolve:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
claude -p "/session-orchestrator:plan feature" --plugin-dir "$PWD"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Interactive sessions are unaffected — `/plan` works there as it always has.
|
|
41
|
+
|
|
22
42
|
## File Structure
|
|
23
43
|
|
|
24
44
|
- `SKILL.md` — Core framework: mode router, Q&A engine, shared phases
|
|
@@ -92,6 +112,13 @@ This is the distinctive mechanic shared by all three modes. Every question wave
|
|
|
92
112
|
|
|
93
113
|
### 3.1 Pre-Question Research
|
|
94
114
|
|
|
115
|
+
Read [Research Evidence Contract](../_shared/research-evidence.md) before the
|
|
116
|
+
first research wave. Apply it to findings that materially affect an option or
|
|
117
|
+
recommendation; keep trivial local lookups concise. Carry the source revision or
|
|
118
|
+
date, evidence basis, local equivalent, disposition, and any falsifiable next
|
|
119
|
+
check into each research brief and the synthesis so documented claims and
|
|
120
|
+
inferences remain distinct.
|
|
121
|
+
|
|
95
122
|
Before each Q&A wave, dispatch 2-3 `Agent()` tool calls in a single message (parallel execution) with `subagent_type: "Explore"`:
|
|
96
123
|
|
|
97
124
|
1. **Market/online context agent** — searches for relevant market data, best practices, competitor analysis, or technical patterns depending on the questions to be asked. Tools: WebSearch, WebFetch.
|
|
@@ -39,22 +39,19 @@ This driver wraps `playwright` (Apache-2.0, Microsoft). It does NOT use `@playwr
|
|
|
39
39
|
| `@playwright/cli` | 0.1.13 | Unrelated, unstable — DO NOT USE |
|
|
40
40
|
| `@playwright/mcp` | 0.0.75 | MCP adapter — R5 hard-gate blocks this |
|
|
41
41
|
|
|
42
|
-
Verified via `npm view playwright version` → `1.60.0` (2026-05-14 probe). The binary the orchestrator dispatches is named `playwright` (not `playwright-cli`). Use `playwright@^1.60.0` for compatible-minor updates or pin to `playwright@1.60.0` for reproducibility.
|
|
42
|
+
Verified via `npm view playwright version` → `1.60.0` (2026-05-14 probe). The binary the orchestrator dispatches is named `playwright` (not `playwright-cli`), and it is deliberately the TARGET repo's own `@playwright/test` dependency — the driver never relies on a globally installed binary, so `scripts/lib/playwright-driver/runner.mjs` aborts with exit 2 when the target cannot resolve Playwright locally rather than letting `npx` download it mid-run. Use `playwright@^1.60.0` for compatible-minor updates or pin to `playwright@1.60.0` for reproducibility.
|
|
43
43
|
|
|
44
44
|
## Install
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
npm i -g playwright@1.60.0
|
|
48
|
-
playwright install chromium # download browser binaries
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
For project-local install (preferred in CI):
|
|
46
|
+
Install into the TARGET repo — that is the only install this driver uses, in CI and locally alike:
|
|
52
47
|
|
|
53
48
|
```bash
|
|
54
|
-
npm install --save-dev playwright@1.60.0
|
|
55
|
-
npx playwright install chromium
|
|
49
|
+
npm install --save-dev @playwright/test@1.60.0
|
|
50
|
+
npx playwright install chromium # download browser binaries
|
|
56
51
|
```
|
|
57
52
|
|
|
53
|
+
Both commands run in the target repo, so `npx` resolves the local binary. A global install is neither used nor sufficient: the driver's preflight requires `@playwright/test` (or `playwright`) under the target's own `node_modules`.
|
|
54
|
+
|
|
58
55
|
## Canonical Usage
|
|
59
56
|
|
|
60
57
|
The orchestrator (`skills/test-runner/`) dispatches this driver via Bash. Session naming follows the artifact-paths contract:
|
|
@@ -183,7 +180,7 @@ bash -c "PLAYWRIGHT_HTML_OUTPUT_DIR=${RUN_DIR}/report \
|
|
|
183
180
|
|---|---|---|
|
|
184
181
|
| 0 | All tests passed | Record pass, continue |
|
|
185
182
|
| 1 | At least one test failed | Failures become findings (non-fatal) |
|
|
186
|
-
| 2 | Framework error (network, browser-install) | Surface as driver error, halt run |
|
|
183
|
+
| 2 | Framework error (network, browser-install), or no local Playwright in the target repo (preflight) | Surface as driver error, halt run |
|
|
187
184
|
|
|
188
185
|
### Outputs the Orchestrator MUST Parse
|
|
189
186
|
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
---
|
|
2
|
+
name: portfolio
|
|
2
3
|
description: Aggregate cross-repo issue/MR/CI health across vault-registered projects into a single Markdown dashboard
|
|
4
|
+
user-invocable: true
|
|
3
5
|
argument-hint: "[--dry-run] [--repo <name>]"
|
|
6
|
+
model: inherit
|
|
4
7
|
---
|
|
5
|
-
|
|
6
8
|
# Portfolio
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
## Invocation
|
|
11
|
+
|
|
12
|
+
The user invoked `/portfolio` with arguments: **$ARGUMENTS**. This skill carries the argument validation (`--dry-run`, `--repo <name>`), the config/mode/vault gates, the dispatch into `scripts/lib/gitlab-portfolio/cli.mjs`, and the exit-code table — all below; `skills/gitlab-portfolio/SKILL.md` owns the dashboard schema.
|
|
13
|
+
|
|
14
|
+
Aggregates open issues, MRs, and staleness signals across all vault-registered repositories and writes a structured dashboard to `<vault-dir>/01-projects/_PORTFOLIO.md`.
|
|
9
15
|
|
|
10
16
|
## Argument Validation
|
|
11
17
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: reconcile
|
|
3
3
|
user-invocable: true
|
|
4
|
+
argument-hint: "[--dry-run]"
|
|
4
5
|
tags: [learning, rules, intelligence, meta]
|
|
5
6
|
model: sonnet
|
|
6
7
|
model-preference: sonnet
|
|
@@ -19,6 +20,15 @@ description: >
|
|
|
19
20
|
|
|
20
21
|
# Reconcile Skill
|
|
21
22
|
|
|
23
|
+
## Invocation
|
|
24
|
+
|
|
25
|
+
The user invoked `/reconcile` with arguments: **$ARGUMENTS** — parsed in Phase 1.3 below.
|
|
26
|
+
|
|
27
|
+
- `/reconcile` — full approval flow: engine → AUQ → write approved rules.
|
|
28
|
+
- `/reconcile --dry-run` — print proposals and rejections without writing anything or rendering the AUQ prompt.
|
|
29
|
+
|
|
30
|
+
**Engine seams used:** `runReconcile` (engine.mjs) · `writeApprovedRules` (writer.mjs) · `reconcile` config block · `.claude/rules/` write target.
|
|
31
|
+
|
|
22
32
|
On-demand version of the session-end Phase 3.6.8 reconciliation flow. Turns eligible learnings
|
|
23
33
|
from `.orchestrator/metrics/learnings.jsonl` into proposed `.claude/rules/<slug>.md` entries,
|
|
24
34
|
presenting each batch of 4 to the coordinator via AUQ multiSelect for operator approval before
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
---
|
|
2
|
+
name: release
|
|
2
3
|
description: Cut a release — the order the steps must run in, and the criteria that abort a release
|
|
4
|
+
user-invocable: true
|
|
3
5
|
disable-model-invocation: true
|
|
4
6
|
argument-hint: "[X.Y.Z]"
|
|
7
|
+
model: inherit
|
|
5
8
|
---
|
|
6
|
-
|
|
7
9
|
# Release
|
|
8
10
|
|
|
9
11
|
The user wants to cut a release of this package. Optional argument — the target version: **$ARGUMENTS**.
|
|
10
12
|
|
|
11
|
-
**The mechanism is `scripts/release.mjs`.** It exists, it is executable, and its pure half is unit-tested (`tests/scripts/release.test.mjs`). This
|
|
13
|
+
**The mechanism is `scripts/release.mjs`.** It exists, it is executable, and its pure half is unit-tested (`tests/scripts/release.test.mjs`). This skill carries only the two things the script cannot carry: the **order**, and the **criteria that stop a release**. Do not restate the script's internals here — `node scripts/release.mjs --help` and the file header are the reference.
|
|
14
|
+
|
|
15
|
+
## Invocation
|
|
16
|
+
|
|
17
|
+
`$ARGUMENTS` is optional and holds the target version `X.Y.Z`. When it is empty, resolve the target from `package.json` and the CHANGELOG before step 2.
|
|
18
|
+
|
|
19
|
+
The flags this repo's release path uses — the operator-facing entry points, in the order they run:
|
|
20
|
+
|
|
21
|
+
- `node scripts/release.mjs --set-version X.Y.Z` — rewrite every version surface and sync `package-lock.json`.
|
|
22
|
+
- `node scripts/release.mjs --check --json` — the preflight gate; every row must be green.
|
|
23
|
+
- `node scripts/release.mjs --publish` — the irreversible step; give it ≥600 s of wall clock.
|
|
24
|
+
|
|
25
|
+
`--skip-ci` marks the CI row green without checking anything and is **refused by the script** when combined with `--publish`; it is an inspection aid for `--check`, never a release path.
|
|
12
26
|
|
|
13
27
|
## Why the order is written down
|
|
14
28
|
|
|
@@ -10,6 +10,7 @@ description: >
|
|
|
10
10
|
(optional), and MCP Configuration. Will produce a Markdown checklist report and JSON sidecar."
|
|
11
11
|
<commentary>The user wants a compliance check; this skill is appropriate because it runs all 9
|
|
12
12
|
categories with pass/fail/warn/skipped statuses and writes structured output.</commentary></example>
|
|
13
|
+
user-invocable: true
|
|
13
14
|
model: inherit
|
|
14
15
|
color: cyan
|
|
15
16
|
---
|
|
@@ -18,6 +19,12 @@ color: cyan
|
|
|
18
19
|
|
|
19
20
|
Perform a comprehensive audit of the host repository against the ecosystem baseline. Emits a structured Markdown checklist report and a JSON sidecar for trend tracking.
|
|
20
21
|
|
|
22
|
+
## Invocation
|
|
23
|
+
|
|
24
|
+
There are no arguments — ignore `$ARGUMENTS`; anything passed is discarded.
|
|
25
|
+
|
|
26
|
+
Do NOT skip any category (except Clank when not detected). Do NOT auto-fix findings — report only.
|
|
27
|
+
|
|
21
28
|
## Purpose
|
|
22
29
|
|
|
23
30
|
Answer the question: "Does this repo match the ecosystem baseline?" — a compliance-focused, checkable question with a fixed 9-category checklist. Distinct from `/discovery` (broad quality probes) and `/harness-audit` (plugin installation health).
|
|
@@ -14,8 +14,8 @@ Read `session-start-ref` from STATE.md frontmatter. If the field is missing (old
|
|
|
14
14
|
```bash
|
|
15
15
|
SESSION_START_REF=$(node --input-type=module -e "
|
|
16
16
|
import {readFileSync} from 'node:fs';
|
|
17
|
-
import {
|
|
18
|
-
const fm =
|
|
17
|
+
import {parseStateMd} from '${PLUGIN_ROOT}/scripts/lib/state-md.mjs';
|
|
18
|
+
const fm = parseStateMd(readFileSync('<state-dir>/STATE.md', 'utf8')).frontmatter;
|
|
19
19
|
process.stdout.write(fm['session-start-ref'] ?? '');
|
|
20
20
|
" 2>/dev/null)
|
|
21
21
|
# Fallback when field absent
|
|
@@ -224,7 +224,7 @@ It prints one JSON line carrying:
|
|
|
224
224
|
|
|
225
225
|
**Ultradeep agent counts per wave:** take each wave's cap from that wave's `agentCap` in the shape — there is no second table here to disagree with it. The caps are ceilings, not targets, and the Quality wave's cap is still EARNED per the Step 3 rule (the shape marks it `qualityEarned: true`); Research and Code-Discovery share wave 1's cap across their two separately-scoped groups; the Synthesis-Gate wave carries `agentCap: 0` with `coordinatorDirect: true` and writes only the coordinator's own artifacts (audit report, STATE.md, plan).
|
|
226
226
|
|
|
227
|
-
Wave 1 splits into two disjointly-scoped groups: **Research** agents (web-enabled, see `skills/wave-executor/SKILL.md` § Ultradeep Profile) and **Code-Discovery** agents (repo-only). Both are read-only. Wave 2 dispatches NO agents — the coordinator consolidates wave 1, writes `docs/audits/<YYYY-MM-DD>-<slug>.md`, and asks ONE blocking `AskUserQuestion` before wave 3.
|
|
227
|
+
Wave 1 splits into two disjointly-scoped groups: **Research** agents (web-enabled, see `skills/wave-executor/SKILL.md` § Ultradeep Profile) and **Code-Discovery** agents (repo-only). Both are read-only. Research briefs and synthesis follow [Research Evidence Contract](../_shared/research-evidence.md): material findings retain source revision/date, evidence basis, local equivalent, disposition, and a falsifiable next check when uncertain. This adds no mandatory external search; repository evidence is sufficient when proportionate to the task. Wave 2 dispatches NO agents — the coordinator consolidates wave 1, writes `docs/audits/<YYYY-MM-DD>-<slug>.md`, and asks ONE blocking `AskUserQuestion` before wave 3.
|
|
228
228
|
|
|
229
229
|
When roles are combined into a single wave, agents from both roles execute in that wave.
|
|
230
230
|
|
|
@@ -303,10 +303,11 @@ Propose the **ordered default scope** below in the Phase 8 Q&A. Every step is AU
|
|
|
303
303
|
|
|
304
304
|
1. **Drift-check as a work-list** — `checker.mjs --mode warn` (procedure below); its `errors[]`/`warnings[]` become candidate scope.
|
|
305
305
|
2. **Expired-learnings sweep** — the same sweep session-end 3.6.4 applies mechanically (`runTailPhases` / `runExpiredSweep`), run here when the `sweep` signal is due.
|
|
306
|
-
3.
|
|
307
|
-
4. **`/
|
|
308
|
-
5. **`/
|
|
309
|
-
6. **`/
|
|
306
|
+
3. **Expired-generated-rules sweep** — `node scripts/sweep-expired-rules.mjs` (`--dry-run` first, then `--apply`). AUQ-gated: it rewrites and can DELETE tracked `.claude/rules/*.md` files. Runs directly after step 2 because its evidence comes from step 2's corpus — an entry's date is recoverable only via its `learning-id` → `learnings.jsonl` `expires_at`. <!-- path-check: example -->
|
|
307
|
+
4. **`/evolve analyze`** — extract this period's session patterns into learnings.
|
|
308
|
+
5. **`/reconcile`** — turn high-confidence learnings into operator-approved `.claude/rules/` proposals.
|
|
309
|
+
6. **`/evolve dialectic`** — dry-run first, review `.orchestrator/dialectic-pending.md`, then apply. This step dispatches the read-only `dialectic-deriver` agent, so **"coordinator-direct" means no wave-executor, not zero subagents**. <!-- path-check: example -->
|
|
310
|
+
7. **`/memory-cleanup`** — `--dry-run` writes the MEMORY.md proposal to `.orchestrator/pending-dream.md`; `--apply-pending` applies it. <!-- path-check: example -->
|
|
310
311
|
|
|
311
312
|
Operator-selected issues (from Phase 6) are appended AFTER this loop, not interleaved with it — the loop's outputs (new learnings, new rules) are inputs the issue work should already see.
|
|
312
313
|
|
|
@@ -70,7 +70,7 @@ Express path activated — <N> tasks, coordinator-direct, no inter-wave checks.
|
|
|
70
70
|
|
|
71
71
|
> **RESOLVED (#1146, operator decision) — session-plan RUNS, in shortened form.** Five documents
|
|
72
72
|
> described the post-activation routing and two of them said session-plan was skipped entirely.
|
|
73
|
-
> That reading cannot work: `
|
|
73
|
+
> That reading cannot work: `skills/go/SKILL.md` gates on a 1-wave Express Path plan, which under a
|
|
74
74
|
> skipped session-plan would never have been produced — `/go` would look for a plan that does not
|
|
75
75
|
> exist. The routing is now one sentence everywhere:
|
|
76
76
|
>
|
|
@@ -78,13 +78,13 @@ Express path activated — <N> tasks, coordinator-direct, no inter-wave checks.
|
|
|
78
78
|
> to Phase 9 → session-plan.** session-plan detects the banner and its
|
|
79
79
|
> `## Express Path Short-Circuit (#214)` section emits a minimal 1-wave `coordinator-direct` plan
|
|
80
80
|
> (0 agents dispatched, no role decomposition, no wave splitting). `/go` detects that plan per
|
|
81
|
-
> `
|
|
81
|
+
> `skills/go/SKILL.md` § Express Path Detection and routes to coord-direct execution plus
|
|
82
82
|
> session-end auto-invocation — never to wave-executor.
|
|
83
83
|
>
|
|
84
84
|
> What activation skips is the WAVE MACHINERY (subagent dispatch, role decomposition, inter-wave
|
|
85
85
|
> checkpoints), not the planning handoff. The two sites that said otherwise —
|
|
86
86
|
> this file and `skills/session-start/SKILL.md` — were corrected in the same pass;
|
|
87
|
-
> `docs/session-config-reference.md`, `skills/session-plan/SKILL.md` and `
|
|
87
|
+
> `docs/session-config-reference.md`, `skills/session-plan/SKILL.md` and `skills/go/SKILL.md`
|
|
88
88
|
> already carried the surviving reading.
|
|
89
89
|
|
|
90
90
|
Hand off to Phase 9 as usual. The coordinator then executes the 1-wave plan session-plan emits directly, without dispatching subagents:
|
|
@@ -104,7 +104,7 @@ Step 1 is the Phase 9 handoff and ends the session-start turn — the operator t
|
|
|
104
104
|
- Step 4b (invoke session-end) flips `status` to `completed`, writes the metrics record to `.orchestrator/metrics/sessions.jsonl`, and runs the standard close flow. Session-end has no Express Path-specific logic — it treats this run identically to any other completed session.
|
|
105
105
|
- Step 5 (verification) is the coordinator's final action before returning control. The verification check uses `parseStateMd()` from `scripts/lib/state-md.mjs` to read the file and check `frontmatter.status === 'completed'` and that the body contains the literal string `Express path:`.
|
|
106
106
|
|
|
107
|
-
When `/go` is invoked and session-plan emitted a 1-wave Express Path plan (per `skills/session-plan/SKILL.md` § "Express Path Short-Circuit"), the `/go` command MUST detect this and route to coord-direct execution + session-end auto-invocation, NOT to wave-executor. See `
|
|
107
|
+
When `/go` is invoked and session-plan emitted a 1-wave Express Path plan (per `skills/session-plan/SKILL.md` § "Express Path Short-Circuit"), the `/go` command MUST detect this and route to coord-direct execution + session-end auto-invocation, NOT to wave-executor. See `skills/go/SKILL.md` for the detection branch — that plan is the artifact `/go` keys on, which is why Phase 8.5 hands off to session-plan rather than skipping it.
|
|
108
108
|
|
|
109
109
|
**When Express Path does NOT activate** (conditions not met):
|
|
110
110
|
|
|
@@ -124,6 +124,6 @@ Proceed normally to Phase 9 (session-plan handoff). The express-path evaluation
|
|
|
124
124
|
|
|
125
125
|
- `scripts/express-path.mjs` — the CLI this phase runs; `scripts/lib/express-path.mjs` holds the decision + its `orchestrator.express_path.evaluated` record
|
|
126
126
|
- `skills/session-plan/SKILL.md` § "Express Path Short-Circuit (#214)" — the 1-wave plan Phase 9 emits when the banner is present
|
|
127
|
-
- `
|
|
127
|
+
- `skills/go/SKILL.md` — Express Path detection and auto-invocation of session-end after coord-direct tasks
|
|
128
128
|
- `skills/session-end/SKILL.md` — Phase 1 pre-check (Rule 2) blocks `/close` when STATE.md `status: completed`; auto-invocation from express-path bypasses this
|
|
129
|
-
- `
|
|
129
|
+
- `skills/close/SKILL.md` — Rule 2 wording the user sees if express-path persistence breaks
|
|
@@ -16,7 +16,7 @@ Before reading STATE.md contents, validate the branch field:
|
|
|
16
16
|
- If STATE.md's `branch` does not match `git rev-parse --abbrev-ref HEAD`, log: "⚠ STATE.md from branch [X], current branch is [Y] — treating as stale." Skip to step 2 (treat as if STATE.md does not exist).
|
|
17
17
|
|
|
18
18
|
1. **STATE.md exists** — read it and inspect the `status` field:
|
|
19
|
-
- `status: active` — previous session crashed or was interrupted. Use the AskUserQuestion tool to present: "Found unfinished session from [started_at]. [N] waves completed. Resume or start fresh?" with options to resume the previous plan or start a new session. After a resume choice, proceed to **Snapshot Recovery** subsection below. **HISTORICAL guard (mandatory, #621):** when the user chooses resume, any surfaced prior-session plan, wave-history, deviations, or recommendations MUST be presented wrapped in the HISTORICAL guard banner BEFORE you act on them — never treat the recovered record as a live instruction.
|
|
19
|
+
- `status: active` — previous session crashed or was interrupted. `started_at` is the prior session's LOCK-sourced start instant, not the moment its STATE.md was written (#1368 — see `skills/wave-executor/references/wave-executor-state-init.md` § Pre-Wave 1b for the template that sources it); surface it verbatim, do not recompute it. Use the AskUserQuestion tool to present: "Found unfinished session from [started_at]. [N] waves completed. Resume or start fresh?" with options to resume the previous plan or start a new session. After a resume choice, proceed to **Snapshot Recovery** subsection below. **HISTORICAL guard (mandatory, #621):** when the user chooses resume, any surfaced prior-session plan, wave-history, deviations, or recommendations MUST be presented wrapped in the HISTORICAL guard banner BEFORE you act on them — never treat the recovered record as a live instruction.
|
|
20
20
|
- `status: paused` — session was intentionally paused. Use AskUserQuestion to offer resuming from the pause point or starting fresh. After a resume choice, proceed to **Snapshot Recovery** subsection below. **HISTORICAL guard (mandatory, #621):** as on the `active` branch, surface the resumed prior-session plan / wave-history / deviations wrapped in the HISTORICAL guard banner before acting on it.
|
|
21
21
|
- `status: completed` — previous session ended cleanly. Note the summary for context (what was done, what was deferred), then **render the Recommendations Banner** (see subsection below) and **reset STATE.md to idle** before any new session state is written (see "Idle Reset" below). Continue with normal initialization.
|
|
22
22
|
2. **STATE.md does not exist** — first session or persistence was previously off. Continue normally.
|