cclaw-cli 0.13.0 → 0.15.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/dist/cli.js +11 -0
- package/dist/config.js +0 -8
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +3 -0
- package/dist/content/archive-command.d.ts +2 -0
- package/dist/content/archive-command.js +98 -0
- package/dist/content/contracts.js +1 -1
- package/dist/content/diff-command.js +2 -2
- package/dist/content/feature-command.js +7 -7
- package/dist/content/harnesses-doc.js +15 -8
- package/dist/content/hooks.js +2 -2
- package/dist/content/learnings.d.ts +0 -3
- package/dist/content/learnings.js +0 -38
- package/dist/content/meta-skill.js +3 -2
- package/dist/content/next-command.js +12 -5
- package/dist/content/ops-command.d.ts +2 -0
- package/dist/content/ops-command.js +60 -0
- package/dist/content/protocols.js +14 -2
- package/dist/content/retro-command.js +3 -3
- package/dist/content/rewind-command.js +5 -5
- package/dist/content/stage-common-guidance.js +14 -5
- package/dist/content/stage-schema.d.ts +0 -16
- package/dist/content/stage-schema.js +7 -181
- package/dist/content/status-command.d.ts +2 -2
- package/dist/content/status-command.js +13 -13
- package/dist/content/tdd-log-command.js +6 -6
- package/dist/content/templates.d.ts +1 -1
- package/dist/content/templates.js +2 -2
- package/dist/content/tree-command.js +3 -3
- package/dist/content/utility-skills.js +1 -1
- package/dist/content/view-command.d.ts +2 -0
- package/dist/content/view-command.js +57 -0
- package/dist/doctor-registry.js +22 -4
- package/dist/doctor.js +8 -32
- package/dist/harness-adapters.d.ts +1 -0
- package/dist/harness-adapters.js +15 -54
- package/dist/install.js +13 -10
- package/dist/policy.js +1 -1
- package/dist/runs.js +1 -1
- package/dist/types.d.ts +1 -3
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { RUNTIME_ROOT } from "../constants.js";
|
|
2
|
+
const VIEW_SKILL_FOLDER = "flow-view";
|
|
3
|
+
const VIEW_SKILL_NAME = "flow-view";
|
|
4
|
+
export function viewCommandContract() {
|
|
5
|
+
return `# /cc-view
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
Unified read-only command surface for flow visibility.
|
|
10
|
+
|
|
11
|
+
Subcommands:
|
|
12
|
+
- \`/cc-view\` or \`/cc-view status\` -> status snapshot
|
|
13
|
+
- \`/cc-view tree\` -> structural flow tree
|
|
14
|
+
- \`/cc-view diff\` -> baseline delta map
|
|
15
|
+
|
|
16
|
+
## HARD-GATE
|
|
17
|
+
|
|
18
|
+
- \`/cc-view\` is strictly read-only at wrapper level.
|
|
19
|
+
- Do not mutate flow-state unless routing to \`diff\` (which updates snapshot baseline by design).
|
|
20
|
+
|
|
21
|
+
## Routing
|
|
22
|
+
|
|
23
|
+
1. Parse subcommand (default \`status\`).
|
|
24
|
+
2. Route:
|
|
25
|
+
- \`status\` -> load \`${RUNTIME_ROOT}/commands/status.md\` + \`${RUNTIME_ROOT}/skills/flow-status/SKILL.md\`
|
|
26
|
+
- \`tree\` -> load \`${RUNTIME_ROOT}/commands/tree.md\` + \`${RUNTIME_ROOT}/skills/flow-tree/SKILL.md\`
|
|
27
|
+
- \`diff\` -> load \`${RUNTIME_ROOT}/commands/diff.md\` + \`${RUNTIME_ROOT}/skills/flow-diff/SKILL.md\`
|
|
28
|
+
3. Unknown subcommand -> print supported values and stop.
|
|
29
|
+
|
|
30
|
+
## Primary skill
|
|
31
|
+
|
|
32
|
+
**${RUNTIME_ROOT}/skills/${VIEW_SKILL_FOLDER}/SKILL.md**
|
|
33
|
+
`;
|
|
34
|
+
}
|
|
35
|
+
export function viewCommandSkillMarkdown() {
|
|
36
|
+
return `---
|
|
37
|
+
name: ${VIEW_SKILL_NAME}
|
|
38
|
+
description: "Unified read-only view router for status/tree/diff flow visibility commands."
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
# /cc-view
|
|
42
|
+
|
|
43
|
+
## HARD-GATE
|
|
44
|
+
|
|
45
|
+
Wrapper is read-only and dispatch-only. It must not mutate flow state directly.
|
|
46
|
+
|
|
47
|
+
## Protocol
|
|
48
|
+
|
|
49
|
+
1. Parse optional subcommand token:
|
|
50
|
+
- missing -> \`status\`
|
|
51
|
+
- \`status\` -> dispatch to \`${RUNTIME_ROOT}/commands/status.md\`
|
|
52
|
+
- \`tree\` -> dispatch to \`${RUNTIME_ROOT}/commands/tree.md\`
|
|
53
|
+
- \`diff\` -> dispatch to \`${RUNTIME_ROOT}/commands/diff.md\`
|
|
54
|
+
2. Execute the target command contract and skill.
|
|
55
|
+
3. Return concise output and suggest \`/cc-view <subcommand>\` variants for navigation.
|
|
56
|
+
`;
|
|
57
|
+
}
|
package/dist/doctor-registry.js
CHANGED
|
@@ -58,7 +58,7 @@ const RULES = [
|
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
|
-
test: /^(hook:|lifecycle:|git_hooks:)/,
|
|
61
|
+
test: /^(hook:|hooks:|lifecycle:|git_hooks:)/,
|
|
62
62
|
metadata: {
|
|
63
63
|
severity: "error",
|
|
64
64
|
summary: "Hook wiring and lifecycle integration check.",
|
|
@@ -67,7 +67,7 @@ const RULES = [
|
|
|
67
67
|
}
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
|
-
test: /^(shim:|agents:cclaw_block|rules:cursor:
|
|
70
|
+
test: /^(shim:|agents:cclaw_block|rules:cursor:)/,
|
|
71
71
|
metadata: {
|
|
72
72
|
severity: "error",
|
|
73
73
|
summary: "Harness shim and routing file consistency check.",
|
|
@@ -84,6 +84,24 @@ const RULES = [
|
|
|
84
84
|
docRef: ref("state-and-gates.md")
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
|
+
{
|
|
88
|
+
test: /^(knowledge:|artifacts:|runs:)/,
|
|
89
|
+
metadata: {
|
|
90
|
+
severity: "error",
|
|
91
|
+
summary: "Knowledge and artifact runtime integrity check.",
|
|
92
|
+
fix: "Restore missing runtime files under `.cclaw/` or re-run `cclaw sync`.",
|
|
93
|
+
docRef: ref("runtime-layout.md")
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
test: /^(meta_skill:|protocol:|stage_skill:|context_mode:)/,
|
|
98
|
+
metadata: {
|
|
99
|
+
severity: "error",
|
|
100
|
+
summary: "Routing skill and protocol integrity check.",
|
|
101
|
+
fix: "Regenerate runtime references and skills via `cclaw sync`, then re-run doctor.",
|
|
102
|
+
docRef: ref("harness-and-routing.md")
|
|
103
|
+
}
|
|
104
|
+
},
|
|
87
105
|
{
|
|
88
106
|
test: /^delegation:/,
|
|
89
107
|
metadata: {
|
|
@@ -120,8 +138,8 @@ export function doctorCheckMetadata(checkName) {
|
|
|
120
138
|
}
|
|
121
139
|
return {
|
|
122
140
|
severity: "error",
|
|
123
|
-
summary: "
|
|
124
|
-
fix: "
|
|
141
|
+
summary: "Unclassified doctor check.",
|
|
142
|
+
fix: "Report this check name to cclaw maintainers so doctor-registry can classify it explicitly.",
|
|
125
143
|
docRef: ref("README.md")
|
|
126
144
|
};
|
|
127
145
|
}
|
package/dist/doctor.js
CHANGED
|
@@ -8,7 +8,7 @@ import { CCLAW_AGENTS } from "./content/core-agents.js";
|
|
|
8
8
|
import { readConfig } from "./config.js";
|
|
9
9
|
import { exists } from "./fs-utils.js";
|
|
10
10
|
import { gitignoreHasRequiredPatterns } from "./gitignore.js";
|
|
11
|
-
import { HARNESS_ADAPTERS, CCLAW_MARKER_START, CCLAW_MARKER_END } from "./harness-adapters.js";
|
|
11
|
+
import { HARNESS_ADAPTERS, CCLAW_MARKER_START, CCLAW_MARKER_END, harnessShimFileNames } from "./harness-adapters.js";
|
|
12
12
|
import { policyChecks } from "./policy.js";
|
|
13
13
|
import { readFlowState } from "./runs.js";
|
|
14
14
|
import { skippedStagesForTrack } from "./flow-state.js";
|
|
@@ -447,19 +447,7 @@ export async function doctorChecks(projectRoot, options = {}) {
|
|
|
447
447
|
});
|
|
448
448
|
continue;
|
|
449
449
|
}
|
|
450
|
-
for (const shim of
|
|
451
|
-
"cc.md",
|
|
452
|
-
"cc-next.md",
|
|
453
|
-
"cc-learn.md",
|
|
454
|
-
"cc-status.md",
|
|
455
|
-
"cc-tree.md",
|
|
456
|
-
"cc-diff.md",
|
|
457
|
-
"cc-feature.md",
|
|
458
|
-
"cc-tdd-log.md",
|
|
459
|
-
"cc-retro.md",
|
|
460
|
-
"cc-rewind.md",
|
|
461
|
-
"cc-rewind-ack.md"
|
|
462
|
-
]) {
|
|
450
|
+
for (const shim of harnessShimFileNames()) {
|
|
463
451
|
const shimPath = path.join(projectRoot, adapter.commandDir, shim);
|
|
464
452
|
checks.push({
|
|
465
453
|
name: `shim:${harness}:${shim.replace(".md", "")}`,
|
|
@@ -476,14 +464,8 @@ export async function doctorChecks(projectRoot, options = {}) {
|
|
|
476
464
|
const hasCcCommand = content.includes("/cc");
|
|
477
465
|
const hasCcNext = content.includes("/cc-next");
|
|
478
466
|
const hasCcLearn = content.includes("/cc-learn");
|
|
479
|
-
const
|
|
480
|
-
const
|
|
481
|
-
const hasCcDiff = content.includes("/cc-diff");
|
|
482
|
-
const hasCcFeature = content.includes("/cc-feature");
|
|
483
|
-
const hasCcTddLog = content.includes("/cc-tdd-log");
|
|
484
|
-
const hasCcRetro = content.includes("/cc-retro");
|
|
485
|
-
const hasCcRewind = content.includes("/cc-rewind");
|
|
486
|
-
const hasCcRewindAck = content.includes("/cc-rewind-ack");
|
|
467
|
+
const hasCcView = content.includes("/cc-view");
|
|
468
|
+
const hasCcOps = content.includes("/cc-ops");
|
|
487
469
|
const hasVerification = content.includes("Verification Discipline");
|
|
488
470
|
const hasMinimalMarker = content.includes("intentionally minimal for cross-project use");
|
|
489
471
|
const hasMetaSkillPointer = content.includes(".cclaw/skills/using-cclaw/SKILL.md");
|
|
@@ -491,14 +473,8 @@ export async function doctorChecks(projectRoot, options = {}) {
|
|
|
491
473
|
&& hasCcCommand
|
|
492
474
|
&& hasCcNext
|
|
493
475
|
&& hasCcLearn
|
|
494
|
-
&&
|
|
495
|
-
&&
|
|
496
|
-
&& hasCcDiff
|
|
497
|
-
&& hasCcFeature
|
|
498
|
-
&& hasCcTddLog
|
|
499
|
-
&& hasCcRetro
|
|
500
|
-
&& hasCcRewind
|
|
501
|
-
&& hasCcRewindAck
|
|
476
|
+
&& hasCcView
|
|
477
|
+
&& hasCcOps
|
|
502
478
|
&& hasVerification
|
|
503
479
|
&& hasMinimalMarker
|
|
504
480
|
&& hasMetaSkillPointer;
|
|
@@ -1067,7 +1043,7 @@ export async function doctorChecks(projectRoot, options = {}) {
|
|
|
1067
1043
|
ok: staleStages.length === 0,
|
|
1068
1044
|
details: staleStages.length === 0
|
|
1069
1045
|
? "no stale stages pending acknowledgement"
|
|
1070
|
-
: `stale stages must be acknowledged via /cc-rewind-ack: ${staleStages.join(", ")}`
|
|
1046
|
+
: `stale stages must be acknowledged via /cc-ops rewind-ack: ${staleStages.join(", ")}`
|
|
1071
1047
|
});
|
|
1072
1048
|
const retroRequired = flowState.completedStages.includes("ship");
|
|
1073
1049
|
const retroComplete = !retroRequired ||
|
|
@@ -1079,7 +1055,7 @@ export async function doctorChecks(projectRoot, options = {}) {
|
|
|
1079
1055
|
? retroRequired
|
|
1080
1056
|
? `retro gate complete (${flowState.retro.compoundEntries} compound entries)`
|
|
1081
1057
|
: "retro gate not required yet (ship not completed)"
|
|
1082
|
-
: "retro gate incomplete: run /cc-retro and record at least one compound knowledge entry"
|
|
1058
|
+
: "retro gate incomplete: run /cc-ops retro and record at least one compound knowledge entry"
|
|
1083
1059
|
});
|
|
1084
1060
|
const flowSnapshotPath = path.join(projectRoot, RUNTIME_ROOT, "state", "flow-state.snapshot.json");
|
|
1085
1061
|
const flowSnapshotExists = await exists(flowSnapshotPath);
|
|
@@ -10,6 +10,7 @@ export interface HarnessAdapter {
|
|
|
10
10
|
structuredAsk: "AskUserQuestion" | "AskQuestion" | "plain-text";
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
|
+
export declare function harnessShimFileNames(): string[];
|
|
13
14
|
export declare const HARNESS_ADAPTERS: Record<HarnessId, HarnessAdapter>;
|
|
14
15
|
export type HarnessTier = "tier1" | "tier2" | "tier3";
|
|
15
16
|
export declare function harnessTier(harnessId: HarnessId): HarnessTier;
|
package/dist/harness-adapters.js
CHANGED
|
@@ -18,6 +18,12 @@ const UTILITY_SHIMS = [
|
|
|
18
18
|
skillFolder: "flow-next-step",
|
|
19
19
|
commandFile: "next.md"
|
|
20
20
|
},
|
|
21
|
+
{
|
|
22
|
+
fileName: "cc-view.md",
|
|
23
|
+
command: "view",
|
|
24
|
+
skillFolder: "flow-view",
|
|
25
|
+
commandFile: "view.md"
|
|
26
|
+
},
|
|
21
27
|
{
|
|
22
28
|
fileName: "cc-learn.md",
|
|
23
29
|
command: "learn",
|
|
@@ -25,54 +31,15 @@ const UTILITY_SHIMS = [
|
|
|
25
31
|
commandFile: "learn.md"
|
|
26
32
|
},
|
|
27
33
|
{
|
|
28
|
-
fileName: "cc-
|
|
29
|
-
command: "
|
|
30
|
-
skillFolder: "flow-
|
|
31
|
-
commandFile: "
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
fileName: "cc-tree.md",
|
|
35
|
-
command: "tree",
|
|
36
|
-
skillFolder: "flow-tree",
|
|
37
|
-
commandFile: "tree.md"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
fileName: "cc-diff.md",
|
|
41
|
-
command: "diff",
|
|
42
|
-
skillFolder: "flow-diff",
|
|
43
|
-
commandFile: "diff.md"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
fileName: "cc-feature.md",
|
|
47
|
-
command: "feature",
|
|
48
|
-
skillFolder: "feature-workspaces",
|
|
49
|
-
commandFile: "feature.md"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
fileName: "cc-tdd-log.md",
|
|
53
|
-
command: "tdd-log",
|
|
54
|
-
skillFolder: "tdd-cycle-log",
|
|
55
|
-
commandFile: "tdd-log.md"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
fileName: "cc-retro.md",
|
|
59
|
-
command: "retro",
|
|
60
|
-
skillFolder: "flow-retro",
|
|
61
|
-
commandFile: "retro.md"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
fileName: "cc-rewind.md",
|
|
65
|
-
command: "rewind",
|
|
66
|
-
skillFolder: "flow-rewind",
|
|
67
|
-
commandFile: "rewind.md"
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
fileName: "cc-rewind-ack.md",
|
|
71
|
-
command: "rewind-ack",
|
|
72
|
-
skillFolder: "flow-rewind",
|
|
73
|
-
commandFile: "rewind-ack.md"
|
|
34
|
+
fileName: "cc-ops.md",
|
|
35
|
+
command: "ops",
|
|
36
|
+
skillFolder: "flow-ops",
|
|
37
|
+
commandFile: "ops.md"
|
|
74
38
|
}
|
|
75
39
|
];
|
|
40
|
+
export function harnessShimFileNames() {
|
|
41
|
+
return ["cc.md", ...UTILITY_SHIMS.map((shim) => shim.fileName)];
|
|
42
|
+
}
|
|
76
43
|
export const HARNESS_ADAPTERS = {
|
|
77
44
|
claude: {
|
|
78
45
|
id: "claude",
|
|
@@ -166,15 +133,9 @@ When in doubt, prefer **non-trivial** — the quick track is opt-in and only saf
|
|
|
166
133
|
|---|---|
|
|
167
134
|
| \`/cc\` | **Entry point.** No args = resume current stage. With prompt = classify task and start the right flow. |
|
|
168
135
|
| \`/cc-next\` | **Progression.** Advances to the next stage when current is complete. |
|
|
136
|
+
| \`/cc-view\` | **Read-only router.** Unified entry for status/tree/diff views. |
|
|
169
137
|
| \`/cc-learn\` | **Cross-cutting.** Capture or review project knowledge (append-only JSONL). |
|
|
170
|
-
| \`/cc-
|
|
171
|
-
| \`/cc-tree\` | **Read-only.** Deep flow tree for stages, artifacts, and stale markers. |
|
|
172
|
-
| \`/cc-diff\` | **Delta map.** Compare current flow-state with saved baseline snapshot. |
|
|
173
|
-
| \`/cc-feature\` | **Workspace.** Manage active feature snapshots for parallel tracks. |
|
|
174
|
-
| \`/cc-tdd-log\` | **Evidence.** Record RED/GREEN/REFACTOR cycle events for enforcement. |
|
|
175
|
-
| \`/cc-retro\` | **Learning gate.** Mandatory retrospective before archive after ship. |
|
|
176
|
-
| \`/cc-rewind\` | **Recovery.** Rewind flow to an earlier stage and invalidate downstream work. |
|
|
177
|
-
| \`/cc-rewind-ack\` | **Recovery.** Clear stale-stage markers after redo. |
|
|
138
|
+
| \`/cc-ops\` | **Operations router.** Unified entry for feature/tdd-log/retro/archive/rewind actions. |
|
|
178
139
|
|
|
179
140
|
**Stage order:** brainstorm > scope > design > spec > plan > tdd > review > ship.
|
|
180
141
|
\`/cc-next\` loads the right stage skill automatically. Gates must pass before handoff.
|
package/dist/install.js
CHANGED
|
@@ -2,7 +2,7 @@ import { execFile } from "node:child_process";
|
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { promisify } from "node:util";
|
|
5
|
-
import { COMMAND_FILE_ORDER, REQUIRED_DIRS, RUNTIME_ROOT
|
|
5
|
+
import { COMMAND_FILE_ORDER, REQUIRED_DIRS, RUNTIME_ROOT } from "./constants.js";
|
|
6
6
|
import { writeConfig, createDefaultConfig, createProfileConfig, readConfig, configPath } from "./config.js";
|
|
7
7
|
import { commandContract } from "./content/contracts.js";
|
|
8
8
|
import { contextModeFiles, createInitialContextModeState } from "./content/contexts.js";
|
|
@@ -12,9 +12,12 @@ import { startCommandContract, startCommandSkillMarkdown } from "./content/start
|
|
|
12
12
|
import { statusCommandContract, statusCommandSkillMarkdown } from "./content/status-command.js";
|
|
13
13
|
import { treeCommandContract, treeCommandSkillMarkdown } from "./content/tree-command.js";
|
|
14
14
|
import { diffCommandContract, diffCommandSkillMarkdown } from "./content/diff-command.js";
|
|
15
|
+
import { viewCommandContract, viewCommandSkillMarkdown } from "./content/view-command.js";
|
|
16
|
+
import { opsCommandContract, opsCommandSkillMarkdown } from "./content/ops-command.js";
|
|
15
17
|
import { featureCommandContract, featureCommandSkillMarkdown } from "./content/feature-command.js";
|
|
16
18
|
import { tddLogCommandContract, tddLogCommandSkillMarkdown } from "./content/tdd-log-command.js";
|
|
17
19
|
import { retroCommandContract, retroCommandSkillMarkdown } from "./content/retro-command.js";
|
|
20
|
+
import { archiveCommandContract, archiveCommandSkillMarkdown } from "./content/archive-command.js";
|
|
18
21
|
import { rewindAcknowledgeCommandContract, rewindCommandContract, rewindCommandSkillMarkdown } from "./content/rewind-command.js";
|
|
19
22
|
import { subagentDrivenDevSkill, parallelAgentsSkill } from "./content/subagents.js";
|
|
20
23
|
import { sessionHooksSkillMarkdown } from "./content/session-hooks.js";
|
|
@@ -35,7 +38,7 @@ import { HOOK_EVENTS_BY_HARNESS, HOOK_SEMANTIC_EVENTS } from "./content/hook-eve
|
|
|
35
38
|
import { createInitialFlowState } from "./flow-state.js";
|
|
36
39
|
import { ensureDir, exists, writeFileSafe } from "./fs-utils.js";
|
|
37
40
|
import { ensureGitignore, removeGitignorePatterns } from "./gitignore.js";
|
|
38
|
-
import { HARNESS_ADAPTERS, harnessTier, syncHarnessShims, removeCclawFromAgentsMd } from "./harness-adapters.js";
|
|
41
|
+
import { HARNESS_ADAPTERS, harnessShimFileNames, harnessTier, syncHarnessShims, removeCclawFromAgentsMd } from "./harness-adapters.js";
|
|
39
42
|
import { validateHookDocument } from "./hook-schema.js";
|
|
40
43
|
import { ensureRunSystem, readFlowState } from "./runs.js";
|
|
41
44
|
const OPENCODE_PLUGIN_REL_PATH = ".opencode/plugins/cclaw-plugin.mjs";
|
|
@@ -202,13 +205,16 @@ async function writeSkills(projectRoot, config) {
|
|
|
202
205
|
await writeFileSafe(runtimePath(projectRoot, "skills", "learnings", "SKILL.md"), learnSkillMarkdown());
|
|
203
206
|
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-next-step", "SKILL.md"), nextCommandSkillMarkdown());
|
|
204
207
|
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-start", "SKILL.md"), startCommandSkillMarkdown());
|
|
208
|
+
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-view", "SKILL.md"), viewCommandSkillMarkdown());
|
|
205
209
|
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-status", "SKILL.md"), statusCommandSkillMarkdown());
|
|
206
210
|
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-tree", "SKILL.md"), treeCommandSkillMarkdown());
|
|
207
211
|
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-diff", "SKILL.md"), diffCommandSkillMarkdown());
|
|
212
|
+
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-ops", "SKILL.md"), opsCommandSkillMarkdown());
|
|
208
213
|
await writeFileSafe(runtimePath(projectRoot, "skills", "feature-workspaces", "SKILL.md"), featureCommandSkillMarkdown());
|
|
209
214
|
await writeFileSafe(runtimePath(projectRoot, "skills", "tdd-cycle-log", "SKILL.md"), tddLogCommandSkillMarkdown());
|
|
210
215
|
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-retro", "SKILL.md"), retroCommandSkillMarkdown());
|
|
211
216
|
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-rewind", "SKILL.md"), rewindCommandSkillMarkdown());
|
|
217
|
+
await writeFileSafe(runtimePath(projectRoot, "skills", "flow-archive", "SKILL.md"), archiveCommandSkillMarkdown());
|
|
212
218
|
await writeFileSafe(runtimePath(projectRoot, "skills", "subagent-dev", "SKILL.md"), subagentDrivenDevSkill());
|
|
213
219
|
await writeFileSafe(runtimePath(projectRoot, "skills", "parallel-dispatch", "SKILL.md"), parallelAgentsSkill());
|
|
214
220
|
await writeFileSafe(runtimePath(projectRoot, "skills", "session", "SKILL.md"), sessionHooksSkillMarkdown());
|
|
@@ -260,13 +266,16 @@ async function writeSkills(projectRoot, config) {
|
|
|
260
266
|
async function writeUtilityCommands(projectRoot) {
|
|
261
267
|
await writeFileSafe(runtimePath(projectRoot, "commands", "learn.md"), learnCommandContract());
|
|
262
268
|
await writeFileSafe(runtimePath(projectRoot, "commands", "next.md"), nextCommandContract());
|
|
269
|
+
await writeFileSafe(runtimePath(projectRoot, "commands", "view.md"), viewCommandContract());
|
|
263
270
|
await writeFileSafe(runtimePath(projectRoot, "commands", "start.md"), startCommandContract());
|
|
264
271
|
await writeFileSafe(runtimePath(projectRoot, "commands", "status.md"), statusCommandContract());
|
|
265
272
|
await writeFileSafe(runtimePath(projectRoot, "commands", "tree.md"), treeCommandContract());
|
|
266
273
|
await writeFileSafe(runtimePath(projectRoot, "commands", "diff.md"), diffCommandContract());
|
|
274
|
+
await writeFileSafe(runtimePath(projectRoot, "commands", "ops.md"), opsCommandContract());
|
|
267
275
|
await writeFileSafe(runtimePath(projectRoot, "commands", "feature.md"), featureCommandContract());
|
|
268
276
|
await writeFileSafe(runtimePath(projectRoot, "commands", "tdd-log.md"), tddLogCommandContract());
|
|
269
277
|
await writeFileSafe(runtimePath(projectRoot, "commands", "retro.md"), retroCommandContract());
|
|
278
|
+
await writeFileSafe(runtimePath(projectRoot, "commands", "archive.md"), archiveCommandContract());
|
|
270
279
|
await writeFileSafe(runtimePath(projectRoot, "commands", "rewind.md"), rewindCommandContract());
|
|
271
280
|
await writeFileSafe(runtimePath(projectRoot, "commands", "rewind-ack.md"), rewindAcknowledgeCommandContract());
|
|
272
281
|
}
|
|
@@ -695,7 +704,7 @@ version: 0.1.0 # semver; bump when hardGate or algorithm
|
|
|
695
704
|
|
|
696
705
|
| Field | Type | Required | Meaning |
|
|
697
706
|
|---|---|---|---|
|
|
698
|
-
| \`name\` | string (kebab-case) | yes | Unique id used by the router and by \`/cc-status\` diagnostics. |
|
|
707
|
+
| \`name\` | string (kebab-case) | yes | Unique id used by the router and by \`/cc-view status\` diagnostics. |
|
|
699
708
|
| \`description\` | string ≤180 chars (single line OR YAML \`>\` folded) | yes | Drives semantic routing. Include trigger + action. |
|
|
700
709
|
| \`stages\` | array of flow stages | no | When present, the meta-skill only surfaces this skill during those stages. Omit for "any stage". |
|
|
701
710
|
| \`triggers\` | array of strings | no | Extra literal substrings that route to this skill when found in the user prompt or the active artifact. |
|
|
@@ -1000,13 +1009,7 @@ async function cleanLegacyArtifacts(projectRoot) {
|
|
|
1000
1009
|
}
|
|
1001
1010
|
}
|
|
1002
1011
|
async function cleanStaleFiles(projectRoot) {
|
|
1003
|
-
const expectedShimFiles = new Set(
|
|
1004
|
-
...COMMAND_FILE_ORDER.map((stage) => `viby-${stage}.md`),
|
|
1005
|
-
...UTILITY_COMMANDS.map((cmd) => `viby-${cmd}.md`),
|
|
1006
|
-
...COMMAND_FILE_ORDER.map((stage) => `cc-${stage}.md`),
|
|
1007
|
-
...UTILITY_COMMANDS.map((cmd) => `cc-${cmd}.md`),
|
|
1008
|
-
"cc.md"
|
|
1009
|
-
]);
|
|
1012
|
+
const expectedShimFiles = new Set(harnessShimFileNames());
|
|
1010
1013
|
for (const adapter of Object.values(HARNESS_ADAPTERS)) {
|
|
1011
1014
|
const commandDir = path.join(projectRoot, adapter.commandDir);
|
|
1012
1015
|
if (!(await exists(commandDir)))
|
package/dist/policy.js
CHANGED
|
@@ -91,7 +91,7 @@ export async function policyChecks(projectRoot, options = {}) {
|
|
|
91
91
|
{ file: runtimeFile("skills/learnings/SKILL.md"), needle: "## HARD-GATE", name: "utility_skill:learnings:hard_gate" },
|
|
92
92
|
{ file: runtimeFile("commands/learn.md"), needle: "## Subcommands", name: "utility_command:learn:subcommands" },
|
|
93
93
|
{ file: runtimeFile("commands/status.md"), needle: "bar:", name: "utility_command:status:visual_bar" },
|
|
94
|
-
{ file: runtimeFile("commands/status.md"), needle: "/cc-tree · /cc-diff", name: "utility_command:status:tree_diff_link" },
|
|
94
|
+
{ file: runtimeFile("commands/status.md"), needle: "/cc-view tree · /cc-view diff", name: "utility_command:status:tree_diff_link" },
|
|
95
95
|
{ file: runtimeFile("commands/tree.md"), needle: "## Algorithm", name: "utility_command:tree:algorithm" },
|
|
96
96
|
{ file: runtimeFile("skills/flow-tree/SKILL.md"), needle: "## Protocol", name: "utility_skill:tree:protocol" },
|
|
97
97
|
{ file: runtimeFile("skills/flow-tree/SKILL.md"), needle: "## HARD-GATE", name: "utility_skill:tree:hard_gate" },
|
package/dist/runs.js
CHANGED
|
@@ -564,7 +564,7 @@ export async function archiveRun(projectRoot, featureName, options = {}) {
|
|
|
564
564
|
}
|
|
565
565
|
if (retroGate.required && !retroGate.completed && !skipRetro) {
|
|
566
566
|
throw new Error("Archive blocked: retro gate is required after ship completion. " +
|
|
567
|
-
"Run /cc-retro and append at least one compound knowledge entry, or re-run archive with --skip-retro and --retro-reason.");
|
|
567
|
+
"Run /cc-ops retro and append at least one compound knowledge entry, or re-run /cc-ops archive with --skip-retro and --retro-reason.");
|
|
568
568
|
}
|
|
569
569
|
if (retroGate.completed) {
|
|
570
570
|
const completedAt = sourceState.retro.completedAt ?? new Date().toISOString();
|
package/dist/types.d.ts
CHANGED
|
@@ -57,13 +57,11 @@ export interface VibyConfig {
|
|
|
57
57
|
version: string;
|
|
58
58
|
flowVersion: string;
|
|
59
59
|
harnesses: HarnessId[];
|
|
60
|
-
/** When true, stage skills instruct the agent to continue to the following stage after gates pass. */
|
|
61
|
-
autoAdvance?: boolean;
|
|
62
60
|
/** Prompt guard behavior for runtime write-risk detection hooks. */
|
|
63
61
|
promptGuardMode?: "advisory" | "strict";
|
|
64
62
|
/** TDD red->green->refactor enforcement mode used by workflow guard hooks. */
|
|
65
63
|
tddEnforcement?: "advisory" | "strict";
|
|
66
|
-
/** Optional test file globs used by guard guidance and /cc-tdd-log docs. */
|
|
64
|
+
/** Optional test file globs used by guard guidance and /cc-ops tdd-log docs. */
|
|
67
65
|
tddTestGlobs?: string[];
|
|
68
66
|
/** When true, cclaw installs managed git pre-commit/pre-push wrappers. */
|
|
69
67
|
gitHookGuards?: boolean;
|