claude-code-pilot 3.2.0 → 3.3.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/CHANGELOG.md +57 -0
- package/README.md +14 -9
- package/bin/install.js +113 -15
- package/manifest.json +18 -3
- package/package.json +3 -2
- package/src/agents/django-build-resolver.md +252 -0
- package/src/agents/django-reviewer.md +169 -0
- package/src/agents/fastapi-reviewer.md +79 -0
- package/src/agents/fsharp-reviewer.md +109 -0
- package/src/agents/swift-build-resolver.md +170 -0
- package/src/agents/swift-reviewer.md +116 -0
- package/src/commands/ccp/cost-report.md +107 -0
- package/src/commands/ccp/intel.md +3 -3
- package/src/commands/ccp/mvp-phase.md +45 -0
- package/src/commands/ccp/plan-prd.md +160 -0
- package/src/commands/ccp/pr-ecc.md +184 -0
- package/src/commands/ccp/security-scan.md +74 -0
- package/src/hooks/ccp-bash-hook-dispatcher.js +96 -0
- package/src/hooks/ccp-context-monitor.js +23 -0
- package/src/hooks/ccp-doc-file-warning.js +93 -0
- package/src/hooks/ccp-pre-bash-dispatcher.js +24 -0
- package/src/hooks/ccp-write-gateguard.js +868 -0
- package/src/lib/project-detect.js +0 -2
- package/src/lib/shell-substitution.js +499 -0
- package/src/pilot/references/execute-mvp-tdd.md +81 -0
- package/src/pilot/references/mvp-concepts.md +49 -0
- package/src/pilot/references/planner-graphify-auto-update.md +67 -0
- package/src/pilot/references/planner-human-verify-mode.md +57 -0
- package/src/pilot/references/planner-mvp-mode.md +53 -0
- package/src/pilot/references/skeleton-template.md +48 -0
- package/src/pilot/references/spidr-splitting.md +69 -0
- package/src/pilot/references/user-story-template.md +58 -0
- package/src/pilot/references/verify-mvp-mode.md +85 -0
- package/src/pilot/references/worktree-path-safety.md +89 -0
- package/src/pilot/workflows/help.md +5 -0
- package/src/pilot/workflows/mvp-phase.md +199 -0
- package/src/skills/agent-architecture-audit/SKILL.md +256 -0
- package/src/skills/agent-harness-design/SKILL.md +73 -0
- package/src/skills/angular-developer/SKILL.md +154 -0
- package/src/skills/angular-developer/references/angular-animations.md +160 -0
- package/src/skills/angular-developer/references/angular-aria.md +410 -0
- package/src/skills/angular-developer/references/cli.md +86 -0
- package/src/skills/angular-developer/references/component-harnesses.md +59 -0
- package/src/skills/angular-developer/references/component-styling.md +91 -0
- package/src/skills/angular-developer/references/components.md +117 -0
- package/src/skills/angular-developer/references/creating-services.md +97 -0
- package/src/skills/angular-developer/references/data-resolvers.md +69 -0
- package/src/skills/angular-developer/references/define-routes.md +67 -0
- package/src/skills/angular-developer/references/defining-providers.md +72 -0
- package/src/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/src/skills/angular-developer/references/e2e-testing.md +56 -0
- package/src/skills/angular-developer/references/effects.md +83 -0
- package/src/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/src/skills/angular-developer/references/host-elements.md +80 -0
- package/src/skills/angular-developer/references/injection-context.md +63 -0
- package/src/skills/angular-developer/references/inputs.md +101 -0
- package/src/skills/angular-developer/references/linked-signal.md +59 -0
- package/src/skills/angular-developer/references/loading-strategies.md +61 -0
- package/src/skills/angular-developer/references/mcp.md +108 -0
- package/src/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/src/skills/angular-developer/references/outputs.md +86 -0
- package/src/skills/angular-developer/references/reactive-forms.md +122 -0
- package/src/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/src/skills/angular-developer/references/resource.md +77 -0
- package/src/skills/angular-developer/references/route-animations.md +56 -0
- package/src/skills/angular-developer/references/route-guards.md +52 -0
- package/src/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/src/skills/angular-developer/references/router-testing.md +87 -0
- package/src/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/src/skills/angular-developer/references/signal-forms.md +795 -0
- package/src/skills/angular-developer/references/signals-overview.md +94 -0
- package/src/skills/angular-developer/references/tailwind-css.md +69 -0
- package/src/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/src/skills/angular-developer/references/testing-fundamentals.md +65 -0
- package/src/skills/error-handling/SKILL.md +376 -0
- package/src/skills/fastapi-patterns/SKILL.md +327 -0
- package/src/skills/flox-environments/SKILL.md +496 -0
- package/src/skills/fsharp-testing/SKILL.md +280 -0
- package/src/skills/ios-icon-gen/SKILL.md +157 -0
- package/src/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/src/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/src/skills/make-interfaces-feel-better/SKILL.md +151 -0
- package/src/skills/mysql-patterns/SKILL.md +412 -0
- package/src/skills/plan-orchestrate/SKILL.md +220 -0
- package/src/skills/prisma-patterns/SKILL.md +371 -0
- package/src/skills/production-audit/SKILL.md +206 -0
- package/src/skills/security-scan/references/agentshield-policy-exception/candidate-playbook.md +49 -0
- package/src/skills/security-scan/references/agentshield-policy-exception/report.json +35 -0
- package/src/skills/security-scan/references/agentshield-policy-exception/scenario.json +62 -0
- package/src/skills/security-scan/references/agentshield-policy-exception/trace.json +45 -0
- package/src/skills/security-scan/references/agentshield-policy-exception/verifier-result.json +35 -0
- package/src/skills/vite-patterns/SKILL.md +449 -0
- package/src/skills/windows-desktop-e2e/SKILL.md +887 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Graphify Auto-Update — Status Surfacing
|
|
2
|
+
|
|
3
|
+
> Documents how `ccp-planner` and `ccp-phase-researcher` surface the opt-in graphify auto-update state (issue #3347). The status surface lives inside `graphifyStatus()` in `pilot/bin/lib/graphify.cjs`; no planner-side prompt changes are required.
|
|
4
|
+
|
|
5
|
+
## Why this exists
|
|
6
|
+
|
|
7
|
+
The graph at `.planning/graphs/graph.json` is consumed automatically (every `ccp-planner` and `ccp-phase-researcher` step) but produced manually (`/ccp:graphify build` per session at best). Without auto-update, the producer-consumer gap silently widens with every commit. The existing `stale: true` annotation tells the consumer the mtime is old; it cannot tell the consumer whether the auto-build hook has been running, just failed, or is in flight.
|
|
8
|
+
|
|
9
|
+
When `graphify.auto_update: true`, the bundled `hooks/ccp-graphify-update.sh` PostToolUse hook fires after HEAD-advancing git operations on the default branch and dispatches `graphify update .` in a detached subprocess. The hook writes a status file synchronously before detach; the detached process rewrites it on completion.
|
|
10
|
+
|
|
11
|
+
## The status file
|
|
12
|
+
|
|
13
|
+
`.planning/graphs/.last-build-status.json`:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"ts": "2026-05-15T14:02:23Z",
|
|
18
|
+
"status": "running" | "ok" | "failed",
|
|
19
|
+
"exit_code": null | <int>,
|
|
20
|
+
"duration_ms": null | <int>,
|
|
21
|
+
"head_at_build": "<commit-sha>",
|
|
22
|
+
"graphify_version": null | "<version>"
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The hook writes `status: "running"` synchronously **before** detach, so the next planner invocation can see the in-flight signal even if `graphify update .` has not finished. The detached `hooks/lib/ccp-graphify-rebuild.sh` rewrites the file to `ok` or `failed` on completion (with `exit_code` and `duration_ms`).
|
|
27
|
+
|
|
28
|
+
## How the planner surfaces it (zero new prompt content)
|
|
29
|
+
|
|
30
|
+
`graphifyStatus()` in `pilot/bin/lib/graphify.cjs` reads `.last-build-status.json` and folds the `running` / `failed` states into the existing `stale: true` signal:
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
const autoUpdateStale =
|
|
34
|
+
lastBuildAutoUpdate &&
|
|
35
|
+
(lastBuildAutoUpdate.status === 'failed' || lastBuildAutoUpdate.status === 'running');
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
...
|
|
39
|
+
stale: age > STALE_MS || Boolean(autoUpdateStale),
|
|
40
|
+
...
|
|
41
|
+
last_build_auto_update: lastBuildAutoUpdate || null,
|
|
42
|
+
};
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The planner and researcher already run `node ... graphify status` inside their `<step name="load_graph_context">` blocks and already have the rule:
|
|
46
|
+
|
|
47
|
+
> If the status response has `stale: true`, note for later: "Graph is `{age_hours}h` old — treat semantic relationships as approximate."
|
|
48
|
+
|
|
49
|
+
That rule now fires correctly in three additional cases:
|
|
50
|
+
|
|
51
|
+
| Trigger | What user sees |
|
|
52
|
+
|---------|----------------|
|
|
53
|
+
| Auto-build status = `failed` | Existing "treat as approximate" note fires (because `stale: true`). The full `last_build_auto_update` object is in the JSON for callers that want exit-code / duration / commit-sha context. |
|
|
54
|
+
| Auto-build status = `running` | Same — the next planner invocation knows the graph is mid-rebuild and treats it as approximate until the detached process completes. |
|
|
55
|
+
| Auto-build status = `ok` AND mtime < 24h | Annotation is silent — the graph is fresh and the most recent auto-build succeeded. |
|
|
56
|
+
|
|
57
|
+
The file-missing case is silent (the operator either has not opted in or has not yet triggered a HEAD-advancing git op since enabling).
|
|
58
|
+
|
|
59
|
+
## Why this design
|
|
60
|
+
|
|
61
|
+
- **No planner-side prompt changes.** Folding into `stale: true` reuses the existing rule, which means no new content in `agents/ccp-planner.md` (which is already at the `< 48K` decomposition limit per `DEFECT.AGENT-FILE-SIZE-CAP-BREACH`).
|
|
62
|
+
- **Tests catch regressions on the seam.** `tests/feat-3347-graphify-auto-update-config.test.cjs` pins `graphifyStatus` behavior for status=`failed` / `running` / `ok` / file-missing.
|
|
63
|
+
- **Backwards compatible.** Callers that don't read `last_build_auto_update` see the same shape as before, with `stale` reflecting both mtime AND auto-build state. No consumer breakage.
|
|
64
|
+
|
|
65
|
+
## Opt-in reminder
|
|
66
|
+
|
|
67
|
+
The auto-update mechanism is opt-in (`graphify.auto_update: false` by default per issue #3347). Users who haven't opted in will never produce this file. `graphifyStatus()` returns `last_build_auto_update: null` and falls back to the mtime-only `stale` rule.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Planner — Human Verification Mode
|
|
2
|
+
|
|
3
|
+
> Loaded by `ccp-planner` when deciding whether to emit `<task type="checkpoint:human-verify">` tasks. Read `workflow.human_verify_mode` from `.planning/config.json` (default `end-of-phase` since #3309).
|
|
4
|
+
|
|
5
|
+
## The two modes
|
|
6
|
+
|
|
7
|
+
### `end-of-phase` (default — issue #3309)
|
|
8
|
+
|
|
9
|
+
Do **not** emit any `<task type="checkpoint:human-verify">` tasks. Every mid-flight halt costs a full executor cold-start (CLAUDE.md, MEMORY.md, STATE.md, plan re-read on respawn) because subagent context is discarded across the pause; a plan with N human-verify checkpoints pays the cold-start cost N+1 times — measured at "tens of thousands of tokens" per round-trip on real projects. This is the default for that reason.
|
|
10
|
+
|
|
11
|
+
Instead, fold each would-be verification step into the relevant `auto` task using a `<verify><human-check>` sub-block:
|
|
12
|
+
|
|
13
|
+
```xml
|
|
14
|
+
<task type="auto">
|
|
15
|
+
<name>Wire dashboard route</name>
|
|
16
|
+
<files>app/dashboard/page.tsx, app/api/dashboard/route.ts</files>
|
|
17
|
+
<action>...</action>
|
|
18
|
+
<verify>
|
|
19
|
+
<automated>npm test -- --filter=dashboard</automated>
|
|
20
|
+
<human-check>
|
|
21
|
+
<test>Visit http://localhost:3000/dashboard</test>
|
|
22
|
+
<expected>Sidebar left, content right on desktop >1024px; collapses to hamburger at 768px</expected>
|
|
23
|
+
<why_human>Visual layout — grep cannot verify breakpoint behavior</why_human>
|
|
24
|
+
</human-check>
|
|
25
|
+
</verify>
|
|
26
|
+
<done>Layout renders correctly across breakpoints</done>
|
|
27
|
+
</task>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The verifier (Step 8) harvests every `<verify><human-check>` block at end-of-phase and consolidates them into the existing `human_needed` → HUMAN-UAT.md path in `workflows/execute-phase.md`. The user reviews everything in one batch instead of paying a cold-start cost per item.
|
|
31
|
+
|
|
32
|
+
### `mid-flight` (opt-back-in — pre-#3309 behavior)
|
|
33
|
+
|
|
34
|
+
Set `ccp config-set workflow.human_verify_mode mid-flight` to restore the canonical mid-flight pattern: emit `<task type="checkpoint:human-verify">` tasks at the points where human confirmation is required, and the executor halts at each one to ask the user.
|
|
35
|
+
|
|
36
|
+
```xml
|
|
37
|
+
<task type="checkpoint:human-verify" gate="blocking">
|
|
38
|
+
<what-built>Dev server running at http://localhost:3000</what-built>
|
|
39
|
+
<how-to-verify>
|
|
40
|
+
1. Visit /dashboard
|
|
41
|
+
2. Sidebar collapses at 768px
|
|
42
|
+
</how-to-verify>
|
|
43
|
+
<resume-signal>"approved" or describe issues</resume-signal>
|
|
44
|
+
</task>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Choose `mid-flight` when you genuinely need the work to stop before any subsequent task runs (e.g., the next task depends on visual confirmation of the previous one), and you accept the cold-start cost as the price of that hard barrier.
|
|
48
|
+
|
|
49
|
+
## What is *not* affected
|
|
50
|
+
|
|
51
|
+
`checkpoint:decision` and `checkpoint:human-action` tasks are still emitted in `end-of-phase` mode. Those gate the work itself (a choice the executor needs from the user, or an auth step only the user can perform), not post-hoc verification of completed work. Only `checkpoint:human-verify` is suppressed.
|
|
52
|
+
|
|
53
|
+
## Compatibility with other modes
|
|
54
|
+
|
|
55
|
+
- **`workflow.tdd_mode`**: orthogonal. TDD tasks still emit `tdd="true"` and `<behavior>`; the `<verify>` block carries the human-check sub-element when `human_verify_mode = end-of-phase`.
|
|
56
|
+
- **`MVP_MODE`**: orthogonal. Vertical-slice ordering is unchanged. The first task remains a failing end-to-end test; later auto tasks may carry `<verify><human-check>` instead of standalone checkpoint tasks.
|
|
57
|
+
- **`workflow.auto_advance` / `_auto_chain_active`**: in mid-flight mode these auto-approve checkpoint:human-verify halts. In end-of-phase mode there are no halts to auto-approve, so the flags have no effect on this code path.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Planner — MVP Mode (Vertical Slice Strategy)
|
|
2
|
+
|
|
3
|
+
> Loaded by `ccp-planner` only when `MVP_MODE=true`. Standard horizontal-layer planning rules continue to apply for all other phases.
|
|
4
|
+
|
|
5
|
+
## Core Rule
|
|
6
|
+
|
|
7
|
+
**Decompose by feature slice, not by technical layer.** Every task must move the user-facing capability forward. After each task, a real user can click through more of the feature than they could before.
|
|
8
|
+
|
|
9
|
+
**Forbidden** in MVP mode:
|
|
10
|
+
- "Create the database schema" as a standalone task
|
|
11
|
+
- "Build the API layer" as a standalone task
|
|
12
|
+
- "Wire up the UI" as a final integration task
|
|
13
|
+
|
|
14
|
+
**Required** in MVP mode:
|
|
15
|
+
- The first non-test task produces a working end-to-end path. Stubs are allowed for non-critical branches; the happy path must be real.
|
|
16
|
+
- Each subsequent task either adds a new slice OR refines an existing slice (validation, error states, edge cases).
|
|
17
|
+
- The phase goal is framed as a user story: "**As a** [user], **I want to** [do X], **so that** [Y]."
|
|
18
|
+
|
|
19
|
+
## Task Order Pattern
|
|
20
|
+
|
|
21
|
+
For a feature `F`:
|
|
22
|
+
|
|
23
|
+
1. **Failing end-to-end test** for the happy path of `F`.
|
|
24
|
+
2. **Thinnest viable slice** — UI form → API endpoint → DB read/write — that makes the test pass. Hard-coded values, missing validation, no error states are fine here.
|
|
25
|
+
3. **Real data layer** — replace any stubs from Task 2 with real queries.
|
|
26
|
+
4. **Validation + error states** — invalid input, network failure, empty states.
|
|
27
|
+
5. **Production polish** — loading indicators, edge cases, accessibility checks.
|
|
28
|
+
|
|
29
|
+
Tasks 3-5 are not always all needed; gate by the phase's acceptance criteria.
|
|
30
|
+
|
|
31
|
+
## Walking Skeleton Mode (`WALKING_SKELETON=true`)
|
|
32
|
+
|
|
33
|
+
When the orchestrator sets `WALKING_SKELETON=true` (Phase 1 of a new project under `--mvp`), the plan changes shape:
|
|
34
|
+
|
|
35
|
+
- The "feature" is the application itself. Pick the smallest meaningful capability that proves the full stack works (e.g., "user can sign up and see their name on a dashboard").
|
|
36
|
+
- The plan **must include**:
|
|
37
|
+
- Project scaffold (framework init, routing, build, lint)
|
|
38
|
+
- One real DB read/write
|
|
39
|
+
- One real UI interaction wired to the API
|
|
40
|
+
- Deployment to a dev environment (or a documented local-run command that exercises the full stack)
|
|
41
|
+
- The plan **must produce** `SKELETON.md` in the phase directory alongside `PLAN.md`. Use the template at `@~/.claude/pilot/references/skeleton-template.md`. `SKELETON.md` records the architectural decisions that subsequent phases will build on (chosen framework, DB, deployment target, auth approach, directory layout).
|
|
42
|
+
|
|
43
|
+
`SKELETON.md` is the architectural backbone for every later vertical slice; treat it as a contract, not a scratchpad.
|
|
44
|
+
|
|
45
|
+
## Anti-Patterns to Reject
|
|
46
|
+
|
|
47
|
+
- **Layer cake disguised as slices.** Three "vertical" tasks where Task 1 is "all the schemas", Task 2 is "all the endpoints", Task 3 is "all the UI" — that is horizontal planning with new labels. Reject.
|
|
48
|
+
- **Skeleton bloat.** Walking Skeleton is the *thinnest* working stack, not "Phase 1 of a normal app." If Skeleton has more than ~5 tasks, you are not skeletonizing.
|
|
49
|
+
- **Premature SPIDR splitting.** SPIDR splitting is the `mvp-phase` command's job (Phase 2 of the PRD), not the planner's. If the phase scope feels too large, surface it via the verification loop, do not split silently.
|
|
50
|
+
|
|
51
|
+
## Acceptance Test for Your Plan
|
|
52
|
+
|
|
53
|
+
Before emitting the plan, ask: **after Task N completes, can a real user *do* something they could not do after Task N-1?** If the answer is "no, but the foundation is laid", you have a horizontal task disguised as a slice. Restructure.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# SKELETON.md Template
|
|
2
|
+
|
|
3
|
+
> Emitted by `ccp-planner` when `WALKING_SKELETON=true` (Phase 1 + `--mvp` + new project). Records the architectural decisions the rest of the project will build on.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Walking Skeleton — [Project Name]
|
|
7
|
+
|
|
8
|
+
**Phase:** 1
|
|
9
|
+
**Generated:** {ISO date}
|
|
10
|
+
|
|
11
|
+
## Capability Proven End-to-End
|
|
12
|
+
|
|
13
|
+
> One sentence: the smallest user-visible capability that exercises the full stack.
|
|
14
|
+
|
|
15
|
+
Example: "A signed-in user can view their email on a dashboard page served by the deployed app."
|
|
16
|
+
|
|
17
|
+
## Architectural Decisions
|
|
18
|
+
|
|
19
|
+
| Decision | Choice | Rationale |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Framework | (e.g., Next.js 15 App Router) | Why this fits the project |
|
|
22
|
+
| Data layer | (e.g., Postgres + Drizzle) | Why |
|
|
23
|
+
| Auth | (e.g., session cookies + bcrypt) | Why |
|
|
24
|
+
| Deployment target | (e.g., Vercel preview) | Why |
|
|
25
|
+
| Directory layout | (e.g., feature-folders under src/features/*) | Why |
|
|
26
|
+
|
|
27
|
+
## Stack Touched in Phase 1
|
|
28
|
+
|
|
29
|
+
- [ ] Project scaffold (framework, build, lint, test runner)
|
|
30
|
+
- [ ] Routing — at least one real route
|
|
31
|
+
- [ ] Database — at least one real read AND one real write
|
|
32
|
+
- [ ] UI — at least one interactive element wired to the API
|
|
33
|
+
- [ ] Deployment — running on dev environment OR documented local full-stack run command
|
|
34
|
+
|
|
35
|
+
## Out of Scope (Deferred to Later Slices)
|
|
36
|
+
|
|
37
|
+
> Anything that is *not* in the skeleton. Be explicit — this list prevents future phases from re-litigating Phase 1's minimalism.
|
|
38
|
+
|
|
39
|
+
- (e.g., password reset, email verification, multi-tenancy)
|
|
40
|
+
|
|
41
|
+
## Subsequent Slice Plan
|
|
42
|
+
|
|
43
|
+
Each later phase adds one vertical slice on top of this skeleton without altering its architectural decisions:
|
|
44
|
+
|
|
45
|
+
- Phase 2: [next user capability]
|
|
46
|
+
- Phase 3: [next user capability]
|
|
47
|
+
- ...
|
|
48
|
+
```
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# SPIDR Story Splitting Rules
|
|
2
|
+
|
|
3
|
+
> Used by `mvp-phase` workflow when the user-supplied story is too large for a single phase. Per PRD decision Q3, SPIDR runs as a **full interactive flow** — not a lightweight check.
|
|
4
|
+
|
|
5
|
+
## When SPIDR triggers
|
|
6
|
+
|
|
7
|
+
Trigger SPIDR splitting if **any** of these size signals fire on the user story:
|
|
8
|
+
|
|
9
|
+
1. **Compound capabilities.** The story names two or more independent user actions joined by "and" (e.g., "register **and** log in **and** reset their password"). Each "and" is a candidate split point.
|
|
10
|
+
2. **Multi-actor.** The story names more than one `[user role]` (e.g., "As a user or admin..."). Each role is a candidate split.
|
|
11
|
+
3. **Length.** The assembled story exceeds ~120 chars on a single line.
|
|
12
|
+
4. **Vague capability.** The capability is a noun phrase, not a verb-noun pair (e.g., "I want to use the dashboard" — needs to specify *which interaction* with the dashboard).
|
|
13
|
+
|
|
14
|
+
If none of these fire, skip SPIDR entirely and proceed to ROADMAP write.
|
|
15
|
+
|
|
16
|
+
## The five SPIDR axes
|
|
17
|
+
|
|
18
|
+
For each axis, ask one targeted question. The user picks the axis that best fits their story; only one axis is applied per split.
|
|
19
|
+
|
|
20
|
+
### Spike
|
|
21
|
+
|
|
22
|
+
> "Is there an unknown that needs research before this can be implemented? If so, the spike is its own phase."
|
|
23
|
+
|
|
24
|
+
If yes: split out a research phase (no acceptance criteria except "we know enough to plan the rest"). The remaining story becomes a follow-up phase.
|
|
25
|
+
|
|
26
|
+
### Paths
|
|
27
|
+
|
|
28
|
+
> "Does this feature have a happy path and one or more error/edge paths?"
|
|
29
|
+
|
|
30
|
+
If yes: split happy path into the first phase, edge paths into follow-ups. Order: happy path first (it proves the slice works), then progressively edge cases.
|
|
31
|
+
|
|
32
|
+
### Interfaces
|
|
33
|
+
|
|
34
|
+
> "Does this feature need to work on more than one interface (web, mobile, API, CLI)?"
|
|
35
|
+
|
|
36
|
+
If yes: split by interface. Web first if user-facing; API first if integration-driven; mobile last unless it's the primary platform.
|
|
37
|
+
|
|
38
|
+
### Data
|
|
39
|
+
|
|
40
|
+
> "Does this feature touch multiple data scopes (one user vs. many, single team vs. multi-tenant, small CSV vs. large dataset)?"
|
|
41
|
+
|
|
42
|
+
If yes: split by scope. Smallest scope first (one user, single team, small data), then expand.
|
|
43
|
+
|
|
44
|
+
### Rules
|
|
45
|
+
|
|
46
|
+
> "Does this feature have multiple business rules that could be added incrementally (basic validation first, then complex policy)?"
|
|
47
|
+
|
|
48
|
+
If yes: split by rule complexity. Minimum viable rules first; complex policy in follow-ups.
|
|
49
|
+
|
|
50
|
+
## Workflow
|
|
51
|
+
|
|
52
|
+
When SPIDR triggers, the workflow:
|
|
53
|
+
|
|
54
|
+
1. Restates the user-supplied story.
|
|
55
|
+
2. Asks "Which SPIDR axis fits best?" with the five options above.
|
|
56
|
+
3. Walks through the chosen axis interactively (one focused question), produces a split proposal: "Phase N (this one): X. Phase N+1: Y. Phase N+2: Z."
|
|
57
|
+
4. Confirms the split with the user.
|
|
58
|
+
5. On accept: writes the FIRST phase's story to the current ROADMAP entry; defers creating new phases for the splits to a follow-up step (the workflow surfaces a list of `/ccp:add-phase` invocations the user can run after `mvp-phase` completes — but does not run them automatically, to preserve user control over phase numbering).
|
|
59
|
+
6. On reject: proceeds with the original story unchanged.
|
|
60
|
+
|
|
61
|
+
## Anti-patterns to reject
|
|
62
|
+
|
|
63
|
+
- **Splitting by technical layer.** "Phase 1: schema. Phase 2: API. Phase 3: UI." That's horizontal planning. Reject.
|
|
64
|
+
- **Pre-splitting before the user even sees the original.** Always show the user-supplied story first; only offer split if it triggers a size signal.
|
|
65
|
+
- **Splitting more than one axis at once.** SPIDR is one axis per split. If a story needs splitting on two axes (e.g., paths AND data), do paths first, then re-evaluate the resulting smaller stories.
|
|
66
|
+
|
|
67
|
+
## Reference
|
|
68
|
+
|
|
69
|
+
See [Mike Cohn — Five Simple But Powerful Ways to Split User Stories](https://www.mountaingoatsoftware.com/blog/five-simple-but-powerful-ways-to-split-user-stories).
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# User Story Template (MVP Mode)
|
|
2
|
+
|
|
3
|
+
> Used by `mvp-phase` workflow and `ccp-planner` agent when `MVP_MODE=true`. Defines the canonical "As a / I want to / So that" format and the rules for converting it into the `**Goal:**` line in ROADMAP.md.
|
|
4
|
+
|
|
5
|
+
## Canonical format
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
As a [user role], I want to [capability], so that [outcome].
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Three required components:
|
|
12
|
+
|
|
13
|
+
| Slot | Question | Examples |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `[user role]` | Who is the actor? | "new user", "admin", "signed-in customer", "API consumer" |
|
|
16
|
+
| `[capability]` | What can they do? | "register and log in", "upload a CSV", "see my dashboard" |
|
|
17
|
+
| `[outcome]` | Why does it matter? | "I can access my account", "I can bulk-import contacts", "I can see at a glance what needs attention" |
|
|
18
|
+
|
|
19
|
+
All three must be present. Refuse to assemble a partial story.
|
|
20
|
+
|
|
21
|
+
## How it lands in ROADMAP.md
|
|
22
|
+
|
|
23
|
+
The full user story replaces the existing `**Goal:**` line in the phase section:
|
|
24
|
+
|
|
25
|
+
**Before:**
|
|
26
|
+
```
|
|
27
|
+
### Phase 1: User Auth MVP
|
|
28
|
+
**Goal:** Users can register and log in
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**After:**
|
|
32
|
+
```
|
|
33
|
+
### Phase 1: User Auth MVP
|
|
34
|
+
**Goal:** As a new user, I want to register and log in, so that I can access my dashboard.
|
|
35
|
+
**Mode:** mvp
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Two structural rules:
|
|
39
|
+
1. The `**Goal:**` line stays on a single line (no line breaks inside the story). If the story is longer than ~120 chars, it should be split into multiple phases via SPIDR (see `spidr-splitting.md`).
|
|
40
|
+
2. The `**Mode:** mvp` line is added immediately below `**Goal:**`. If `**Mode:**` already exists, it is replaced (not duplicated).
|
|
41
|
+
|
|
42
|
+
## How it lands in PLAN.md
|
|
43
|
+
|
|
44
|
+
The `ccp-planner` agent (with MVP_MODE=true) emits the user story as the first content under the phase header in `PLAN.md`:
|
|
45
|
+
|
|
46
|
+
```markdown
|
|
47
|
+
## Phase Goal
|
|
48
|
+
|
|
49
|
+
**As a** new user, **I want to** register and log in, **so that** I can access my dashboard.
|
|
50
|
+
|
|
51
|
+
## Acceptance Criteria
|
|
52
|
+
- [ ] ...
|
|
53
|
+
|
|
54
|
+
## MVP Slice Tasks
|
|
55
|
+
...
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Note the bold-keyword formatting (`**As a**`, `**I want to**`, `**so that**`) is for the PLAN.md emit only. The ROADMAP.md `**Goal:**` line uses prose form (the keywords are not bolded inside the goal line, since the goal is itself a single bolded label).
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Verify-Work — MVP Mode UAT Framing
|
|
2
|
+
|
|
3
|
+
> Loaded by `verify-work` workflow and `ccp-verifier` agent only when the phase under verification has `mode: mvp` in ROADMAP.md. Reframes UAT generation from technical checks to user-flow walk-throughs.
|
|
4
|
+
|
|
5
|
+
## Core rule
|
|
6
|
+
|
|
7
|
+
**Show expected, ask if reality matches** — same philosophy as standard verify-work (from `workflows/verify-work.md`). The MVP-mode change is WHAT gets shown:
|
|
8
|
+
|
|
9
|
+
- **Standard verify-work:** "The API endpoint at /users/register returns 201 with the new user's ID." → user confirms.
|
|
10
|
+
- **MVP verify-work:** "Open the registration page. Fill in 'name', 'email', 'password'. Click Submit. You should see your dashboard with your name in the header." → user confirms.
|
|
11
|
+
|
|
12
|
+
The user-flow form mirrors what a real user does: open, fill, click, see. No HTTP verbs, no JSON shapes, no error codes.
|
|
13
|
+
|
|
14
|
+
## When this framing applies
|
|
15
|
+
|
|
16
|
+
The framing fires when:
|
|
17
|
+
- The phase under verification has `**Mode:** mvp` in ROADMAP.md (extracted by reading the Phase block from `.planning/ROADMAP.md` and locating its `**Mode:**` line).
|
|
18
|
+
- AND the phase has a user-story-formatted goal (set by `/ccp:mvp-phase` per Phase 2): "As a [user role], I want to [capability], so that [outcome]."
|
|
19
|
+
|
|
20
|
+
If the phase has `mode: mvp` but the goal is NOT in user-story format, the verifier surfaces this as a discrepancy and asks the user to run `/ccp:mvp-phase` to reformat the goal — same pattern as the planner agent under MVP_MODE (per `references/planner-mvp-mode.md`).
|
|
21
|
+
|
|
22
|
+
## Generated UAT script structure under MVP mode
|
|
23
|
+
|
|
24
|
+
The UAT script generated by `verify-work` under MVP mode has THREE sections, in this exact order:
|
|
25
|
+
|
|
26
|
+
### 1. User-flow walk-through (always first, always required)
|
|
27
|
+
|
|
28
|
+
Derive ordered steps from the phase's user-story goal:
|
|
29
|
+
|
|
30
|
+
1. The first step opens the entry point ("Open the app", "Navigate to /register", "Run `ccp mvp-phase 1`").
|
|
31
|
+
2. Each subsequent step is one user action: fill, click, type, observe.
|
|
32
|
+
3. The final step asserts the user-visible outcome from the `[outcome]` clause of the user story.
|
|
33
|
+
|
|
34
|
+
Format each step as: "**Step N: [action]** — Expected: [what the user should see]". The user responds with one of:
|
|
35
|
+
- `yes` / `y` / `next` / empty → step passes
|
|
36
|
+
- Anything else → step is logged as an issue, and the script halts (do not proceed to step N+1 with a broken N).
|
|
37
|
+
|
|
38
|
+
If ALL user-flow steps pass, advance to section 2. If any step fails, the verdict is FAIL — do not run technical checks.
|
|
39
|
+
|
|
40
|
+
### 2. Technical checks (only if section 1 passes)
|
|
41
|
+
|
|
42
|
+
After the user flow passes, run the technical checks that would normally run in non-MVP mode:
|
|
43
|
+
- API endpoint schema verification (if the phase shipped APIs)
|
|
44
|
+
- Error state behavior (4xx, 5xx codes; invalid input handling)
|
|
45
|
+
- Edge cases (empty data, large data, concurrent requests if applicable)
|
|
46
|
+
- Cross-browser / cross-runtime checks (if applicable)
|
|
47
|
+
|
|
48
|
+
These are the same checks `verify-work` would run without MVP mode — just deferred until the user flow proves the slice actually works for a user.
|
|
49
|
+
|
|
50
|
+
### 3. Coverage check (always last, always required)
|
|
51
|
+
|
|
52
|
+
Verify that the user-story `[outcome]` clause is observably true in the codebase:
|
|
53
|
+
- If the outcome is "I can access my dashboard", verify a dashboard route exists and renders for an authenticated user.
|
|
54
|
+
- If the outcome is "I can bulk-import contacts", verify the import path produces persisted records.
|
|
55
|
+
|
|
56
|
+
Coverage is a goal-backward check: "did this phase deliver what its user story promised?" — sourced from the existing `ccp-verifier` agent's goal-backward methodology, narrowed to the user story.
|
|
57
|
+
|
|
58
|
+
## Anti-patterns to reject under MVP mode
|
|
59
|
+
|
|
60
|
+
- **Lead with technical checks.** "Step 1: GET /api/users/me returns 200." Reject. The user does not see API endpoints. Reorder so a user action comes first.
|
|
61
|
+
- **Schema-as-feature.** "User has a `name` field on the User model." Reject. The user does not see database fields. Express the same check as a user-visible outcome ("the user's name appears in the dashboard header").
|
|
62
|
+
- **Skip user flow because the test passed.** The unit test passing in CI is not evidence that the user flow works. The user-flow walk-through is mandatory under MVP mode even when all unit tests are green.
|
|
63
|
+
|
|
64
|
+
## Compatibility with existing verify-work philosophy
|
|
65
|
+
|
|
66
|
+
The "show expected, ask if reality matches" model is preserved. The user still types `yes` / `next` / empty to advance. The UAT.md state file format is unchanged. Only the WHAT changes — under MVP mode, the "expected" is a user-visible outcome rather than a technical assertion.
|
|
67
|
+
|
|
68
|
+
## Output: VERIFICATION.md changes under MVP mode
|
|
69
|
+
|
|
70
|
+
The `ccp-verifier` agent produces `VERIFICATION.md`. Under MVP mode, the report adds a top-level "User Flow Coverage" section that maps each step of the user story to evidence in the codebase:
|
|
71
|
+
|
|
72
|
+
```markdown
|
|
73
|
+
## User Flow Coverage
|
|
74
|
+
|
|
75
|
+
User story: «As a new user, I want to register and log in, so that I can access my dashboard.»
|
|
76
|
+
|
|
77
|
+
| Step | Expected | Evidence | Status |
|
|
78
|
+
|------|----------|----------|--------|
|
|
79
|
+
| Register | Form at /register accepts name/email/password | src/app/register/page.tsx:12 (form component) | ✓ |
|
|
80
|
+
| Submit | Persists user, redirects to /dashboard | src/api/register/route.ts:34 (db.insert + redirect) | ✓ |
|
|
81
|
+
| See dashboard | Dashboard page renders, shows user's name | src/app/dashboard/page.tsx:8 (greeting line) | ✓ |
|
|
82
|
+
| Outcome | "Access my dashboard" — user lands on a populated page | dashboard route + greeting both verified above | ✓ |
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Standard technical-check sections of VERIFICATION.md remain (API verification, error handling, etc.) but are appended below "User Flow Coverage", not above.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Worktree Path Safety
|
|
2
|
+
|
|
3
|
+
Guards for executor agents running inside Claude Code worktrees. Three checks
|
|
4
|
+
must run before any staging, Edit, or Write operation in worktree mode.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Worktree branch check (run once at spawn-time)
|
|
9
|
+
|
|
10
|
+
FIRST ACTION: HEAD assertion MUST run before any reset/checkout. Worktrees
|
|
11
|
+
spawned by Claude Code's `isolation="worktree"` use the `worktree-agent-<id>`
|
|
12
|
+
namespace. If HEAD is on a protected ref (main/master/develop/trunk/release/*)
|
|
13
|
+
or detached, HALT — do NOT self-recover by force-rewinding via `git update-ref`,
|
|
14
|
+
that destroys concurrent commits in multi-active scenarios (#2924). Only after
|
|
15
|
+
this passes is `git reset --hard` safe (#2015 — affects all platforms).
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
HEAD_REF=$(git symbolic-ref --quiet HEAD || echo "DETACHED")
|
|
19
|
+
ACTUAL_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
20
|
+
if [ "$HEAD_REF" = "DETACHED" ] || echo "$ACTUAL_BRANCH" | grep -Eq '^(main|master|develop|trunk|release/.*)$'; then
|
|
21
|
+
echo "FATAL: worktree HEAD on '$ACTUAL_BRANCH' (expected worktree-agent-*); refusing to self-recover via 'git update-ref' (#2924)." >&2
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
if ! echo "$ACTUAL_BRANCH" | grep -Eq '^worktree-agent-[A-Za-z0-9._/-]+$'; then
|
|
25
|
+
echo "FATAL: worktree HEAD '$ACTUAL_BRANCH' is not in the worktree-agent-* namespace; refusing to commit (#2924)." >&2
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
ACTUAL_BASE=$(git merge-base HEAD {EXPECTED_BASE})
|
|
29
|
+
if [ "$ACTUAL_BASE" != "{EXPECTED_BASE}" ]; then
|
|
30
|
+
git reset --hard {EXPECTED_BASE}
|
|
31
|
+
[ "$(git rev-parse HEAD)" != "{EXPECTED_BASE}" ] && { echo "ERROR: could not correct worktree base"; exit 1; }
|
|
32
|
+
fi
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Per-commit HEAD assertion: `agents/ccp-executor.md` `<task_commit_protocol>` step 0.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## cwd-drift sentinel — step 0a (#3097)
|
|
40
|
+
|
|
41
|
+
A prior Bash call may have `cd`'d out of the worktree into the main repo. When
|
|
42
|
+
that happens `[ -f .git ]` is false (main repo's `.git` is a directory), silently
|
|
43
|
+
skipping all worktree guards. The sentinel captures the spawn-time toplevel and
|
|
44
|
+
detects drift before every commit.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
if [ -f .git ]; then # we are in a worktree
|
|
48
|
+
WT_GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
|
49
|
+
case "$WT_GIT_DIR" in
|
|
50
|
+
*.git/worktrees/*)
|
|
51
|
+
SENTINEL="$WT_GIT_DIR/ccp-spawn-toplevel"
|
|
52
|
+
[ ! -f "$SENTINEL" ] && git rev-parse --show-toplevel > "$SENTINEL" 2>/dev/null
|
|
53
|
+
EXPECTED_TL=$(cat "$SENTINEL" 2>/dev/null)
|
|
54
|
+
ACTUAL_TL=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
55
|
+
if [ -n "$EXPECTED_TL" ] && [ "$ACTUAL_TL" != "$EXPECTED_TL" ]; then
|
|
56
|
+
echo "FATAL: cwd drifted from spawn-time worktree root (#3097)" >&2
|
|
57
|
+
echo " Spawn-time: $EXPECTED_TL" >&2
|
|
58
|
+
echo " Current: $ACTUAL_TL" >&2
|
|
59
|
+
echo "RECOVERY: cd \"$EXPECTED_TL\" before staging, then re-run this commit." >&2
|
|
60
|
+
exit 1
|
|
61
|
+
fi
|
|
62
|
+
;;
|
|
63
|
+
esac
|
|
64
|
+
fi
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Absolute-path guard — step 0b (#3099)
|
|
70
|
+
|
|
71
|
+
Edit/Write calls using absolute paths constructed from the **orchestrator's** `pwd`
|
|
72
|
+
(main repo root) will resolve to the main repo, not the worktree. Writes land in
|
|
73
|
+
the wrong directory; `git commit` from the worktree sees a clean tree and the work
|
|
74
|
+
is silently lost.
|
|
75
|
+
|
|
76
|
+
Before any Edit or Write using an absolute path:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
WT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
80
|
+
# Fail fast if ABS_PATH resolves outside the worktree
|
|
81
|
+
if [[ "$ABS_PATH" != "$WT_ROOT"* ]]; then
|
|
82
|
+
echo "WARNING: $ABS_PATH is outside the worktree ($WT_ROOT)" >&2
|
|
83
|
+
echo "Use a relative path or recompute the absolute path from WT_ROOT." >&2
|
|
84
|
+
fi
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Prefer relative paths** for all Edit/Write operations. When an absolute path is
|
|
88
|
+
unavoidable, always derive it from `git rev-parse --show-toplevel` run inside the
|
|
89
|
+
worktree — never from `pwd` captured in the orchestrator context.
|
|
@@ -47,6 +47,7 @@ These commands manage the full project lifecycle: initialization, planning, exec
|
|
|
47
47
|
| `/ccp:discuss-phase <N>` | Gather phase context through adaptive questioning before planning |
|
|
48
48
|
| `/ccp:research-phase <N>` | Research how to implement a phase (standalone ecosystem research) |
|
|
49
49
|
| `/ccp:plan-phase <N>` | Create detailed phase plan (PLAN.md) with verification loop |
|
|
50
|
+
| `/ccp:mvp-phase <N>` | Plan a phase as a vertical MVP slice -- user story, SPIDR splitting, then plan-phase |
|
|
50
51
|
| `/ccp:validate-phase <N>` | Retroactively audit and fill Nyquist validation gaps for a completed phase |
|
|
51
52
|
| `/ccp:list-phase-assumptions <N>` | Surface Claude's assumptions about a phase approach before planning |
|
|
52
53
|
|
|
@@ -107,6 +108,7 @@ These commands manage the full project lifecycle: initialization, planning, exec
|
|
|
107
108
|
| `/ccp:plant-seed [idea]` | Capture a forward-looking idea with trigger conditions |
|
|
108
109
|
| `/ccp:ship [phase]` | Create PR, run review, and prepare for merge after verification |
|
|
109
110
|
| `/ccp:pr-branch [target]` | Create a clean PR branch by filtering out .planning/ commits |
|
|
111
|
+
| `/ccp:pr-ecc [base]` | Create a GitHub PR from the current branch's unpushed commits (no .planning/ filtering, unlike pr-branch) |
|
|
110
112
|
| `/ccp:session-report` | Generate a session report with token usage, summary, and outcomes |
|
|
111
113
|
| `/ccp:milestone-summary` | Generate a comprehensive project summary from milestone artifacts |
|
|
112
114
|
|
|
@@ -129,6 +131,7 @@ These are utility commands for day-to-day development: code quality, testing, bu
|
|
|
129
131
|
| Command | Description |
|
|
130
132
|
|---------|-------------|
|
|
131
133
|
| `/ccp:code-review` | Comprehensive security and quality review of uncommitted changes |
|
|
134
|
+
| `/ccp:security-scan` | Scan your `.claude/` config for security issues via AgentShield (external, opt-in via `npx`) |
|
|
132
135
|
| `/ccp:tdd` | Enforce TDD workflow -- scaffold interfaces, generate tests first, then implement |
|
|
133
136
|
| `/ccp:test-coverage` | Analyze test coverage, identify gaps, and generate missing tests for 80%+ |
|
|
134
137
|
| `/ccp:refactor-clean` | Safely identify and remove dead code with test verification at every step |
|
|
@@ -150,6 +153,7 @@ These are utility commands for day-to-day development: code quality, testing, bu
|
|
|
150
153
|
| Command | Description |
|
|
151
154
|
|---------|-------------|
|
|
152
155
|
| `/ccp:plan` | Restate requirements, assess risks, and create step-by-step implementation plan |
|
|
156
|
+
| `/ccp:plan-prd` | Generate a lean, problem-first PRD and hand off to `/ccp:plan` for implementation planning |
|
|
153
157
|
| `/ccp:orchestrate` | Sequential and tmux/worktree guidance for multi-agent workflows |
|
|
154
158
|
| `/ccp:aside` | Answer a quick side question without losing context from the current task |
|
|
155
159
|
| `/ccp:context-budget` | Analyze context window usage and find optimization opportunities |
|
|
@@ -169,6 +173,7 @@ These are utility commands for day-to-day development: code quality, testing, bu
|
|
|
169
173
|
| Command | Description |
|
|
170
174
|
|---------|-------------|
|
|
171
175
|
| `/ccp:eval` | Manage eval-driven development workflow |
|
|
176
|
+
| `/ccp:cost-report` | Generate a local Claude Code cost report from a cost-tracker SQLite database |
|
|
172
177
|
| `/ccp:harness-audit` | Run a deterministic repository harness audit and return a scorecard |
|
|
173
178
|
| `/ccp:skill-create` | Analyze git history to extract coding patterns and generate SKILL.md files |
|
|
174
179
|
| `/ccp:skill-health` | Show skill portfolio health dashboard with charts and analytics |
|