@warpgogol/forge 2.8.0 → 2.8.2
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.md +1 -1
- package/README.md +23 -13
- package/README.uk.md +19 -12
- package/dist/os/session/handlers/validate.d.ts.map +1 -1
- package/dist/os/session/handlers/validate.js +23 -1
- package/dist/os/session/handlers/validate.js.map +1 -1
- package/dist/os/session/types.d.ts +31 -1
- package/dist/os/session/types.d.ts.map +1 -1
- package/dist/os/session/types.js +7 -0
- package/dist/os/session/types.js.map +1 -1
- package/os/adr/adr.module.ts +158 -0
- package/os/adr/frontmatter-io.ts +80 -0
- package/os/adr/handlers/archive.ts +244 -0
- package/os/adr/handlers/implement-stamp.ts +331 -0
- package/os/adr/handlers/list-create.ts +207 -0
- package/os/adr/handlers/validate.test.ts +232 -0
- package/os/adr/handlers/validate.ts +429 -0
- package/os/adr/index.ts +33 -0
- package/os/adr/types.ts +141 -0
- package/os/audit/audit.module.ts +48 -0
- package/os/audit/frontmatter-io.ts +84 -0
- package/os/audit/handlers/archive.ts +239 -0
- package/os/audit/index.ts +23 -0
- package/os/audit/types.ts +29 -0
- package/os/compass/compass.module.ts +186 -0
- package/os/compass/handlers/compass-audit-handler.ts +382 -0
- package/os/compass/handlers/compass-change-summary-handler.ts +272 -0
- package/os/compass/handlers/compass-inventory-handler.ts +294 -0
- package/os/compass/handlers/compass-inventory.ts +521 -0
- package/os/compass/handlers/git-revision.ts +137 -0
- package/os/compass/handlers/resolve-scan-root-workpiece.test.ts +65 -0
- package/os/compass/handlers/resolve-scan-root.ts +79 -0
- package/os/compass/index.ts +33 -0
- package/os/core/core.module.ts +948 -0
- package/os/core/handlers/assets-check.ts +122 -0
- package/os/core/handlers/assets-helpers.ts +174 -0
- package/os/core/handlers/assets-list.ts +99 -0
- package/os/core/handlers/build.ts +155 -0
- package/os/core/handlers/determinism-check.ts +354 -0
- package/os/core/handlers/dev.ts +127 -0
- package/os/core/handlers/invariant-engine.test.ts +681 -0
- package/os/core/handlers/knowledge-compact.ts +248 -0
- package/os/core/handlers/lifecycle-handlers.test.ts +524 -0
- package/os/core/handlers/note-frontmatter-validate.test.ts +93 -0
- package/os/core/handlers/note-link-validate.test.ts +117 -0
- package/os/core/handlers/note-orphan-detect.test.ts +94 -0
- package/os/core/handlers/package-health.test.ts +226 -0
- package/os/core/handlers/package-health.ts +231 -0
- package/os/core/handlers/pinned-check.ts +200 -0
- package/os/core/handlers/pinned-init.ts +333 -0
- package/os/core/handlers/pinned-types.ts +50 -0
- package/os/core/handlers/pinned-validate.ts +301 -0
- package/os/core/handlers/profile-resolve.ts +92 -0
- package/os/core/handlers/release-prepare.ts +294 -0
- package/os/core/handlers/release-publish.ts +211 -0
- package/os/core/handlers/validate.ts +262 -0
- package/os/core/handlers/workspace-deps.ts +55 -0
- package/os/core/index.ts +13 -0
- package/os/exploration/exploration.module.ts +90 -0
- package/os/exploration/frontmatter-io.ts +77 -0
- package/os/exploration/handlers/archive.ts +159 -0
- package/os/exploration/handlers/list.ts +77 -0
- package/os/exploration/handlers/show.ts +107 -0
- package/os/exploration/index.ts +25 -0
- package/os/exploration/types.ts +65 -0
- package/os/mission/handlers/archive.test.ts +391 -0
- package/os/mission/handlers/archive.ts +453 -0
- package/os/mission/index.ts +1 -0
- package/os/mission/mission.module.ts +48 -0
- package/os/mission/types.ts +41 -0
- package/os/naming/index.ts +14 -0
- package/os/naming/naming-convention.test.ts +163 -0
- package/os/naming/naming-convention.ts +378 -0
- package/os/naming/naming.module.ts +36 -0
- package/os/notes/index.ts +10 -0
- package/os/notes/notes.module.ts +109 -0
- package/os/plan/frontmatter-io.ts +82 -0
- package/os/plan/handlers/archive.ts +238 -0
- package/os/plan/index.ts +23 -0
- package/os/plan/plan.module.ts +48 -0
- package/os/plan/types.ts +29 -0
- package/os/program/discovery.ts +294 -0
- package/os/program/handlers/complete.ts +419 -0
- package/os/program/handlers/lease.ts +433 -0
- package/os/program/handlers/seal.ts +332 -0
- package/os/program/handlers/validate.ts +213 -0
- package/os/program/lease.ts +156 -0
- package/os/program/program.module.ts +212 -0
- package/os/program/schemas.ts +218 -0
- package/os/program/state.ts +264 -0
- package/os/rfc/acceptance.ts +344 -0
- package/os/rfc/decision-log.ts +310 -0
- package/os/rfc/dna-trace.ts +280 -0
- package/os/rfc/frontmatter-io.test.ts +132 -0
- package/os/rfc/frontmatter-io.ts +130 -0
- package/os/rfc/handlers/archive.ts +300 -0
- package/os/rfc/handlers/check.ts +238 -0
- package/os/rfc/handlers/implement-stamp.ts +515 -0
- package/os/rfc/handlers/index-graph.ts +237 -0
- package/os/rfc/handlers/lifecycle.test.ts +127 -0
- package/os/rfc/handlers/lifecycle.ts +249 -0
- package/os/rfc/handlers/list-create.ts +296 -0
- package/os/rfc/handlers/pipeline-status.ts +173 -0
- package/os/rfc/handlers/shared.ts +121 -0
- package/os/rfc/handlers/supersede-propose.ts +241 -0
- package/os/rfc/handlers/validate-rules.test.ts +891 -0
- package/os/rfc/handlers/validate-rules.ts +984 -0
- package/os/rfc/handlers/validate.ts +166 -0
- package/os/rfc/handlers.ts +19 -0
- package/os/rfc/index.ts +97 -0
- package/os/rfc/rfc.module.ts +416 -0
- package/os/rfc/types.ts +596 -0
- package/os/rfc/verification-evidence.ts +244 -0
- package/os/session/atif-parser.ts +166 -0
- package/os/session/frontmatter-io.ts +163 -0
- package/os/session/handlers/archive.ts +288 -0
- package/os/session/handlers/list.ts +174 -0
- package/os/session/handlers/save.ts +348 -0
- package/os/session/handlers/validate.ts +250 -0
- package/os/session/index.ts +50 -0
- package/os/session/session.module.ts +126 -0
- package/os/session/types.ts +203 -0
- package/os/spec/live-spec-list-show-validate.test.ts +257 -0
- package/os/spec/live-spec-list.ts +78 -0
- package/os/spec/live-spec-merge.test.ts +261 -0
- package/os/spec/live-spec-merge.ts +413 -0
- package/os/spec/live-spec-show.ts +117 -0
- package/os/spec/live-spec-types.ts +93 -0
- package/os/spec/live-spec-validate.ts +170 -0
- package/os/spec/spec-materialize.ts +390 -0
- package/os/spec/spec-schema.ts +174 -0
- package/os/spec/spec-status.ts +284 -0
- package/os/spec/spec-validate.ts +513 -0
- package/os/spec/spec.module.ts +135 -0
- package/os/werkstatt/handlers/lock.ts +168 -0
- package/os/werkstatt/handlers/schema.ts +47 -0
- package/os/werkstatt/handlers/werkstatt-lock-recover.ts +175 -0
- package/os/werkstatt/handlers/werkstatt-lock-status.ts +73 -0
- package/os/werkstatt/handlers/werkstatt-operation-validate.ts +104 -0
- package/os/werkstatt/index.ts +39 -0
- package/os/werkstatt/werkstatt.module.ts +62 -0
- package/os/workflow/handlers.ts +304 -0
- package/os/workflow/index.ts +28 -0
- package/os/workflow/types.ts +99 -0
- package/os/workflow/workflow.module.ts +54 -0
- package/package.json +3 -3
- package/profiles/godot-csharp.yaml +4 -4
- package/profiles/knowledge-typescript-turborepo.yaml +110 -0
- package/profiles/phaser-turborepo.yaml +5 -5
- package/skills/_shared/fo-session-summary.md +132 -16
- package/skills/fo/fo-add-tests/pbt-guide.md +13 -13
- package/skills/fo/fo-doc-audit/SKILL.md +6 -6
- package/skills/fo/fo-handoff/SKILL.md +5 -0
- package/skills/fo/fo-idea/SKILL.md +1 -1
- package/skills/fo/fo-review/SKILL.md +1 -1
- package/skills/fo/fo-session-retro/SKILL.md +8 -0
- package/skills/fo/fo-session-save/SKILL.md +8 -0
- package/src/cli-output.ts +59 -0
- package/src/config/__tests__/resolve-terminology.test.ts +45 -0
- package/src/config/forge-config.ts +524 -0
- package/src/forge-module.ts +39 -0
- package/src/index.ts +172 -0
- package/src/knowledge/__tests__/promote.test.ts +219 -0
- package/src/knowledge/__tests__/serialize.test.ts +192 -0
- package/src/knowledge/budgets.ts +202 -0
- package/src/knowledge/compact.ts +405 -0
- package/src/knowledge/index.ts +53 -0
- package/src/knowledge/parse.ts +227 -0
- package/src/knowledge/promote.ts +156 -0
- package/src/knowledge/schema.ts +112 -0
- package/src/knowledge/serialize.ts +72 -0
- package/src/migration-adapters/__tests__/ignored-files.test.ts +51 -0
- package/src/migration-adapters/__tests__/registry.test.ts +131 -0
- package/src/migration-adapters/__tests__/types.test.ts +86 -0
- package/src/migration-adapters/git-utils.ts +71 -0
- package/src/migration-adapters/ignored-files.ts +221 -0
- package/src/migration-adapters/index.ts +21 -0
- package/src/migration-adapters/node-typescript-pnpm/index.ts +189 -0
- package/src/migration-adapters/phaser-pnpm/index.ts +189 -0
- package/src/migration-adapters/registry.ts +61 -0
- package/src/migration-adapters/types.ts +68 -0
- package/src/onboarding/__tests__/workspace-discovery.test.ts +134 -0
- package/src/onboarding/agents-generate.ts +443 -0
- package/src/onboarding/create.ts +427 -0
- package/src/onboarding/doctor.ts +1297 -0
- package/src/onboarding/init.ts +337 -0
- package/src/onboarding/invariant-engine.ts +448 -0
- package/src/onboarding/memory-scaffold.ts +189 -0
- package/src/onboarding/nested-agents-generate.ts +93 -0
- package/src/onboarding/nested-agents-templates.ts +233 -0
- package/src/onboarding/profile-validate.ts +139 -0
- package/src/onboarding/scaffold-project.ts +299 -0
- package/src/onboarding/scaffold.ts +143 -0
- package/src/onboarding/upgrade.ts +558 -0
- package/src/onboarding/workspace-discovery.ts +167 -0
- package/src/profiles/__tests__/profile-schema.test.ts +228 -0
- package/src/profiles/__tests__/stack-profile.test.ts +190 -0
- package/src/profiles/__tests__/terminology-utils.test.ts +71 -0
- package/src/profiles/profile-schema.ts +350 -0
- package/src/profiles/stack-profile.ts +188 -0
- package/src/profiles/terminology-utils.ts +36 -0
- package/src/registry.ts +185 -0
- package/src/skill-schema.ts +37 -0
- package/src/tests/acceptance-criteria.test.ts +99 -0
- package/src/tests/adr-implement-stamp.test.ts +368 -0
- package/src/tests/agents-generate-domain.test.ts +317 -0
- package/src/tests/agents-generate.test.ts +458 -0
- package/src/tests/bindings-schema.test.ts +314 -0
- package/src/tests/budgets.test.ts +213 -0
- package/src/tests/cli-output.test.ts +196 -0
- package/src/tests/compact.test.ts +796 -0
- package/src/tests/create.test.ts +289 -0
- package/src/tests/doctor-autonomy.test.ts +98 -0
- package/src/tests/doctor-bindings.test.ts +286 -0
- package/src/tests/doctor-domain.test.ts +113 -0
- package/src/tests/exploration-handlers.test.ts +256 -0
- package/src/tests/fixtures/agents-generate-business-before.txt +288 -0
- package/src/tests/forge-config.test.ts +420 -0
- package/src/tests/fs-atomic.test.ts +96 -0
- package/src/tests/fs.test.ts +103 -0
- package/src/tests/generated-marker.test.ts +161 -0
- package/src/tests/hash.test.ts +37 -0
- package/src/tests/implement-stamp.test.ts +505 -0
- package/src/tests/init-bindings.test.ts +183 -0
- package/src/tests/knowledge-parse.test.ts +307 -0
- package/src/tests/knowledge-pbt.test.ts +164 -0
- package/src/tests/memory-scaffold.test.ts +192 -0
- package/src/tests/migration-adapters.test.ts +480 -0
- package/src/tests/package-files.test.ts +54 -0
- package/src/tests/pinned-check.test.ts +194 -0
- package/src/tests/pinned-init.test.ts +126 -0
- package/src/tests/profile-schema.test.ts +194 -0
- package/src/tests/profile-validate.test.ts +120 -0
- package/src/tests/program-lease.test.ts +245 -0
- package/src/tests/program-paths-extended.test.ts +117 -0
- package/src/tests/program-paths.test.ts +98 -0
- package/src/tests/program-property.test.ts +139 -0
- package/src/tests/program-schemas.test.ts +445 -0
- package/src/tests/program-spec-node.test.ts +250 -0
- package/src/tests/promote.test.ts +481 -0
- package/src/tests/registry.test.ts +73 -0
- package/src/tests/scaffold-project.test.ts +150 -0
- package/src/tests/session-handlers.test.ts +503 -0
- package/src/tests/session-pbt.test.ts +190 -0
- package/src/tests/skill-schema.test.ts +146 -0
- package/src/tests/skill-validate-knowledge.test.ts +26 -0
- package/src/tests/skill-validate.test.ts +254 -0
- package/src/tests/stack-profile.test.ts +221 -0
- package/src/tests/string-utils.test.ts +42 -0
- package/src/tests/upgrade.test.ts +428 -0
- package/src/tests/werkstatt-lock.test.ts +343 -0
- package/src/tests/workspace-discovery-domain.test.ts +112 -0
- package/src/tests/workspace-discovery.test.ts +135 -0
- package/src/types.ts +221 -0
- package/src/utils/__tests__/fs-idempotent.test.ts +73 -0
- package/src/utils/__tests__/fs-trash.test.ts +45 -0
- package/src/utils/fs-atomic.ts +93 -0
- package/src/utils/fs-idempotent.ts +41 -0
- package/src/utils/fs-trash-sync.ts +37 -0
- package/src/utils/fs-trash.ts +24 -0
- package/src/utils/fs.ts +74 -0
- package/src/utils/generated-marker.ts +166 -0
- package/src/utils/hash.ts +19 -0
- package/src/utils/index.ts +29 -0
- package/src/utils/string-utils.ts +19 -0
- package/src/validators/__tests__/note-orphan-detect.test.ts +94 -0
- package/src/validators/note-frontmatter-validate.ts +142 -0
- package/src/validators/note-link-validate.ts +145 -0
- package/src/validators/note-orphan-detect.ts +146 -0
- package/src/validators/port-validate.ts +97 -0
- package/src/validators/skill-validate.ts +831 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>Facilitates the registration and execution of commands related to RFC management within the workspace.</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Do not manage RFC storage or persistence mechanisms.</item>
|
|
6
|
+
<item>Do not handle user interface concerns or command-line parsing.</item>
|
|
7
|
+
</non-goals>
|
|
8
|
+
</MODULE_CONTRACT>
|
|
9
|
+
<CHANGE_SUMMARY>
|
|
10
|
+
<item>RFC-0260: declare typed `flags` schemas for the whole rfc.* command family; unknown/malformed flags now fail with KERNEL-FLAG-01/02/03 instead of being silently ignored.</item>
|
|
11
|
+
<item>Post-refactor hardening: expose `rfc.create --satisfies` for explicit DNA trace scaffolding.</item>
|
|
12
|
+
<item>RFC-0795: add `--batch` flag to `rfc.list` for filtering by batch slug.</item>
|
|
13
|
+
</CHANGE_SUMMARY>
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { ForgeModule } from "../../src/forge-module.ts";
|
|
17
|
+
|
|
18
|
+
export const forgeRfcModule: ForgeModule = {
|
|
19
|
+
name: "rfc",
|
|
20
|
+
version: "0.1.0",
|
|
21
|
+
|
|
22
|
+
async register(registry) {
|
|
23
|
+
const {
|
|
24
|
+
runRfcList,
|
|
25
|
+
runRfcCreate,
|
|
26
|
+
runRfcNextId,
|
|
27
|
+
runRfcValidate,
|
|
28
|
+
runRfcCommandLifecycleValidate,
|
|
29
|
+
runRfcCheck,
|
|
30
|
+
runRfcIndexGenerate,
|
|
31
|
+
runRfcIndexValidate,
|
|
32
|
+
runRfcGraph,
|
|
33
|
+
} = await import("./handlers.ts");
|
|
34
|
+
const { runRfcAcceptanceRun } = await import("./acceptance.ts");
|
|
35
|
+
const { runRfcVerificationEmit } = await import("./verification-evidence.ts");
|
|
36
|
+
const { runRfcDnaTraceValidate, runRfcDnaTraceGenerate } = await import("./dna-trace.ts");
|
|
37
|
+
const { runRfcDecisionLogGenerate } = await import("./decision-log.ts");
|
|
38
|
+
const { runRfcSupersedePropose } = await import("./handlers/supersede-propose.ts");
|
|
39
|
+
const { runRfcArchive } = await import("./handlers/archive.ts");
|
|
40
|
+
const { runRfcPipelineStatus } = await import("./handlers/pipeline-status.ts");
|
|
41
|
+
const { runRfcImplementStamp } = await import("./handlers/implement-stamp.ts");
|
|
42
|
+
// ── rfc.list ─────────────────────────────────────────────────────────────
|
|
43
|
+
registry.registerCommand({
|
|
44
|
+
name: "rfc.list",
|
|
45
|
+
description:
|
|
46
|
+
"List all RFCs. Filter with --status, --kind, --owner flags. " +
|
|
47
|
+
"Use --json for machine-readable output. " +
|
|
48
|
+
"Parses frontmatter on the fly — no index file needed.",
|
|
49
|
+
scope: "workspace",
|
|
50
|
+
// RFC-0260: typed flag schema.
|
|
51
|
+
flags: {
|
|
52
|
+
status: {
|
|
53
|
+
kind: "string",
|
|
54
|
+
description: "Filter by RFC status (e.g. draft, accepted, implemented).",
|
|
55
|
+
},
|
|
56
|
+
kind: {
|
|
57
|
+
kind: "string",
|
|
58
|
+
description: "Filter by RFC kind (e.g. architecture, contract, command).",
|
|
59
|
+
},
|
|
60
|
+
owner: { kind: "string", description: "Filter by an owner string." },
|
|
61
|
+
batch: {
|
|
62
|
+
kind: "string",
|
|
63
|
+
description: "Filter by batch slug (e.g. engine-consolidation).",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
67
|
+
execute: runRfcList,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// ── rfc.create ───────────────────────────────────────────────────────────
|
|
71
|
+
registry.registerCommand({
|
|
72
|
+
name: "rfc.create",
|
|
73
|
+
description:
|
|
74
|
+
"Create a new RFC draft from the template. " +
|
|
75
|
+
'Pass --title "Short title" (required). ' +
|
|
76
|
+
"Optional: --kind, --scope, --satisfies DNA-N,DNA-M. " +
|
|
77
|
+
"Always creates status: draft. " +
|
|
78
|
+
"AI agents are allowed to use this command.",
|
|
79
|
+
scope: "workspace",
|
|
80
|
+
mutatesState: true,
|
|
81
|
+
writes: ["docs/rfcs/RFC-*.md"],
|
|
82
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
83
|
+
cacheable: false,
|
|
84
|
+
// RFC-0260: typed flag schema.
|
|
85
|
+
flags: {
|
|
86
|
+
title: { kind: "string", required: true, description: "Short imperative RFC title." },
|
|
87
|
+
kind: {
|
|
88
|
+
kind: "string",
|
|
89
|
+
default: "architecture",
|
|
90
|
+
description: "RFC kind: architecture | contract | command | policy | deprecation.",
|
|
91
|
+
},
|
|
92
|
+
scope: { kind: "string", default: "workspace", description: "RFC scope: app | workspace." },
|
|
93
|
+
satisfies: {
|
|
94
|
+
kind: "string",
|
|
95
|
+
description:
|
|
96
|
+
"Comma-separated DNA ids this RFC satisfies. Required for architecture/contract RFCs.",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
execute: runRfcCreate,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// ── rfc.next-id ───────────────────────────────────────────────────────────
|
|
103
|
+
registry.registerCommand({
|
|
104
|
+
name: "rfc.next-id",
|
|
105
|
+
description:
|
|
106
|
+
"Return the next free RFC number (max existing + 1) by scanning docs/rfcs/ recursively including archive/.",
|
|
107
|
+
scope: "workspace",
|
|
108
|
+
flags: {},
|
|
109
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
110
|
+
execute: runRfcNextId,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// ── rfc.validate ─────────────────────────────────────────────────────────
|
|
114
|
+
registry.registerCommand({
|
|
115
|
+
name: "rfc.validate",
|
|
116
|
+
description:
|
|
117
|
+
"Validate RFC frontmatter schema, required markdown sections, " +
|
|
118
|
+
"referential integrity (supersedes/supersededBy), date consistency, " +
|
|
119
|
+
"and RFC command lifecycle metadata (RFC-CMD-*). " +
|
|
120
|
+
"Pass --id to validate a single file, or run without arguments for all.",
|
|
121
|
+
scope: "workspace",
|
|
122
|
+
flags: {
|
|
123
|
+
id: { kind: "string", description: "Target a single RFC by id (e.g. RFC-0609)." },
|
|
124
|
+
},
|
|
125
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
126
|
+
execute: runRfcValidate,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// ── rfc.command-lifecycle.validate ───────────────────────────────────────
|
|
130
|
+
registry.registerCommand({
|
|
131
|
+
name: "rfc.command-lifecycle.validate",
|
|
132
|
+
description:
|
|
133
|
+
"Validate RFC commands.proposed/added/changed/removed lifecycle metadata " +
|
|
134
|
+
"against live registered commands. Emits RFC-CMD-* diagnostics.",
|
|
135
|
+
scope: "workspace",
|
|
136
|
+
flags: {
|
|
137
|
+
id: { kind: "string", description: "Target a single RFC by id (e.g. RFC-0609)." },
|
|
138
|
+
},
|
|
139
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
140
|
+
cacheable: false,
|
|
141
|
+
execute: runRfcCommandLifecycleValidate,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// ── rfc.check ────────────────────────────────────────────────────────────
|
|
145
|
+
registry.registerCommand({
|
|
146
|
+
name: "rfc.check",
|
|
147
|
+
description:
|
|
148
|
+
"Validate that artifacts declared by accepted/implemented RFCs exist on disk. " +
|
|
149
|
+
"Checks files from 'File system responsibilities' tables and feature flag references. " +
|
|
150
|
+
"Use --status to override which RFC statuses to check.",
|
|
151
|
+
scope: "workspace",
|
|
152
|
+
// RFC-0260: typed flag schema.
|
|
153
|
+
flags: {
|
|
154
|
+
status: {
|
|
155
|
+
kind: "string[]",
|
|
156
|
+
description: "Override which RFC statuses to check (default: accepted, implemented).",
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
160
|
+
execute: runRfcCheck,
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// ── rfc.index.generate ───────────────────────────────────────────────────
|
|
164
|
+
registry.registerCommand({
|
|
165
|
+
name: "rfc.index.generate",
|
|
166
|
+
description:
|
|
167
|
+
"Emit a machine-readable relationship index of all RFCs (id, status, dates, " +
|
|
168
|
+
"supersedes/supersededBy/amends/amendedBy/related). Use --json, or --write to " +
|
|
169
|
+
"persist docs/rfcs/index.yaml.",
|
|
170
|
+
scope: "workspace",
|
|
171
|
+
// RFC-0260: typed flag schema.
|
|
172
|
+
flags: {
|
|
173
|
+
write: {
|
|
174
|
+
kind: "boolean",
|
|
175
|
+
description: "Persist the generated index to docs/rfcs/index.yaml.",
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
179
|
+
cacheable: false,
|
|
180
|
+
execute: runRfcIndexGenerate,
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// ── rfc.index.validate ───────────────────────────────────────────────────
|
|
184
|
+
registry.registerCommand({
|
|
185
|
+
name: "rfc.index.validate",
|
|
186
|
+
description:
|
|
187
|
+
"Validate that docs/rfcs/index.yaml exists, is parseable, and its entry count " +
|
|
188
|
+
"matches the number of RFC files on disk. Reports RFC-IDX-01 (missing), " +
|
|
189
|
+
"RFC-IDX-02 (unparseable), RFC-IDX-03 (count mismatch).",
|
|
190
|
+
scope: "workspace",
|
|
191
|
+
flags: {},
|
|
192
|
+
reads: ["docs/rfcs/**/*.md", "docs/rfcs/index.yaml"],
|
|
193
|
+
execute: runRfcIndexValidate,
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// ── rfc.graph ────────────────────────────────────────────────────────────
|
|
197
|
+
registry.registerCommand({
|
|
198
|
+
name: "rfc.graph",
|
|
199
|
+
description:
|
|
200
|
+
"Print one RFC's relationship neighbours (supersedes/supersededBy/amends/" +
|
|
201
|
+
"amendedBy/related). Pass --id RFC-0152.",
|
|
202
|
+
scope: "workspace",
|
|
203
|
+
flags: {
|
|
204
|
+
id: { kind: "string", description: "Target a single RFC by id (e.g. RFC-0152)." },
|
|
205
|
+
},
|
|
206
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
207
|
+
execute: runRfcGraph,
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// ── rfc.acceptance.run ───────────────────────────────────────────────────
|
|
211
|
+
registry.registerCommand({
|
|
212
|
+
name: "rfc.acceptance.run",
|
|
213
|
+
description:
|
|
214
|
+
"RFC-0268: execute the acceptance: probes declared in an RFC's frontmatter and report " +
|
|
215
|
+
"pass/fail per probe (RFC-ACC-01 failed probe, RFC-ACC-02 accepted/implemented RFC with " +
|
|
216
|
+
"zero probes). Requires --id <rfc-id> or --status <status>; never runs automatically inside " +
|
|
217
|
+
"build pipelines.",
|
|
218
|
+
scope: "workspace",
|
|
219
|
+
flags: {
|
|
220
|
+
id: { kind: "string", description: "Target a single RFC by id (e.g. rfc-0268)." },
|
|
221
|
+
status: {
|
|
222
|
+
kind: "string",
|
|
223
|
+
description: "Target every RFC with this status (e.g. accepted).",
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
227
|
+
cacheable: false,
|
|
228
|
+
execute: runRfcAcceptanceRun,
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// ── rfc.verification.emit ────────────────────────────────────────────────
|
|
232
|
+
registry.registerCommand({
|
|
233
|
+
name: "rfc.verification.emit",
|
|
234
|
+
description:
|
|
235
|
+
"RFC-0330: execute acceptance probes for target RFC(s) and write per-RFC verification " +
|
|
236
|
+
"evidence artifacts to docs/rfcs/verification/*.generated.yaml. Requires --id <rfc-id> " +
|
|
237
|
+
"or --status <status>. Reuses runProbe from RFC-0268. Writes via writeFileAtomic.",
|
|
238
|
+
scope: "workspace",
|
|
239
|
+
mutatesState: true,
|
|
240
|
+
writes: ["docs/rfcs/verification/*.generated.yaml"],
|
|
241
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
242
|
+
cacheable: false,
|
|
243
|
+
flags: {
|
|
244
|
+
id: { kind: "string", description: "Target a single RFC by id (e.g. rfc-0330)." },
|
|
245
|
+
status: {
|
|
246
|
+
kind: "string",
|
|
247
|
+
description: "Target every RFC with this status (e.g. implemented).",
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
execute: runRfcVerificationEmit,
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// ── rfc.dna.trace.validate ───────────────────────────────────────────────
|
|
254
|
+
registry.registerCommand({
|
|
255
|
+
name: "rfc.dna.trace.validate",
|
|
256
|
+
description:
|
|
257
|
+
"RFC-0331: validate the bidirectional DNA-trace matrix — which RFCs satisfy each DNA " +
|
|
258
|
+
"invariant and which invariants each RFC claims to satisfy. Reports DNA-TRACE-01 " +
|
|
259
|
+
"(nonexistent id), DNA-TRACE-02 (uncovered invariant), DNA-TRACE-03 (rejected claim).",
|
|
260
|
+
scope: "workspace",
|
|
261
|
+
flags: {
|
|
262
|
+
dna: {
|
|
263
|
+
kind: "string",
|
|
264
|
+
description: "Filter output to a single DNA invariant (e.g. DNA-35).",
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
reads: ["docs/rfcs/**/*.md", "docs/architecture-dna.md"],
|
|
268
|
+
execute: runRfcDnaTraceValidate,
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// ── rfc.dna.trace.generate ───────────────────────────────────────────────
|
|
272
|
+
registry.registerCommand({
|
|
273
|
+
name: "rfc.dna.trace.generate",
|
|
274
|
+
description:
|
|
275
|
+
"RFC-0331: generate docs/rfcs/dna-trace.generated.yaml — the machine-readable " +
|
|
276
|
+
"requirements-traceability matrix of DNA invariants and satisfying RFCs.",
|
|
277
|
+
scope: "workspace",
|
|
278
|
+
mutatesState: true,
|
|
279
|
+
writes: ["docs/rfcs/dna-trace.generated.yaml"],
|
|
280
|
+
reads: ["docs/rfcs/**/*.md", "docs/architecture-dna.md"],
|
|
281
|
+
cacheable: false,
|
|
282
|
+
flags: {},
|
|
283
|
+
execute: runRfcDnaTraceGenerate,
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// ── rfc.decision-log.generate ────────────────────────────────────────────
|
|
287
|
+
registry.registerCommand({
|
|
288
|
+
name: "rfc.decision-log.generate",
|
|
289
|
+
description:
|
|
290
|
+
"RFC-0329: generate docs/rfcs/decision-log.generated.yaml and .md aggregating every " +
|
|
291
|
+
"rejected/superseded RFC and every non-empty Alternatives considered section. " +
|
|
292
|
+
"Use --check to verify projections are up to date without writing.",
|
|
293
|
+
scope: "workspace",
|
|
294
|
+
mutatesState: true,
|
|
295
|
+
writes: ["docs/rfcs/decision-log.generated.yaml", "docs/rfcs/decision-log.generated.md"],
|
|
296
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
297
|
+
cacheable: false,
|
|
298
|
+
flags: {
|
|
299
|
+
check: {
|
|
300
|
+
kind: "boolean",
|
|
301
|
+
description: "Drift check only — no writes, exit 1 if projections differ.",
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
execute: runRfcDecisionLogGenerate,
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// ── rfc.supersede.propose ─────────────────────────────────────────────────
|
|
308
|
+
registry.registerCommand({
|
|
309
|
+
name: "rfc.supersede.propose",
|
|
310
|
+
description:
|
|
311
|
+
"RFC-0334: escalate a blocked implementation by creating a draft superseding RFC " +
|
|
312
|
+
"with the conflict stated and TODO sections for the proposed alternative.",
|
|
313
|
+
scope: "workspace",
|
|
314
|
+
mutatesState: true,
|
|
315
|
+
writes: ["docs/rfcs/RFC-*.md"],
|
|
316
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
317
|
+
cacheable: false,
|
|
318
|
+
flags: {
|
|
319
|
+
id: {
|
|
320
|
+
kind: "string",
|
|
321
|
+
description: "Target RFC id to supersede (e.g. RFC-0322).",
|
|
322
|
+
},
|
|
323
|
+
reason: {
|
|
324
|
+
kind: "string",
|
|
325
|
+
description: "Why the accepted design is unimplementable.",
|
|
326
|
+
},
|
|
327
|
+
invariant: {
|
|
328
|
+
kind: "string",
|
|
329
|
+
description: "Comma-separated invariant ids (DNA-N or RFC-XXXX) that conflict.",
|
|
330
|
+
},
|
|
331
|
+
title: {
|
|
332
|
+
kind: "string",
|
|
333
|
+
description: "Optional replacement title for the new draft.",
|
|
334
|
+
},
|
|
335
|
+
},
|
|
336
|
+
execute: runRfcSupersedePropose,
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
// ── rfc.archive ───────────────────────────────────────────────────────────
|
|
340
|
+
registry.registerCommand({
|
|
341
|
+
name: "rfc.archive",
|
|
342
|
+
description:
|
|
343
|
+
"Move terminal-status RFC files (implemented, rejected, superseded) into " +
|
|
344
|
+
"docs/rfcs/archive/<status>/ subdirectories. Bidirectional: moves non-terminal " +
|
|
345
|
+
"files found in subdirectories back to root. Use --dry-run to preview. " +
|
|
346
|
+
"Use --status to filter to a single terminal status. " +
|
|
347
|
+
"Prefer the docs.archive umbrella command unless you need to archive only RFCs.",
|
|
348
|
+
scope: "workspace",
|
|
349
|
+
mutatesState: true,
|
|
350
|
+
writes: ["docs/rfcs/*.md", "docs/rfcs/archive/**"],
|
|
351
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
352
|
+
cacheable: false,
|
|
353
|
+
flags: {
|
|
354
|
+
"dry-run": {
|
|
355
|
+
kind: "boolean",
|
|
356
|
+
description: "Preview what would be moved without touching the filesystem.",
|
|
357
|
+
},
|
|
358
|
+
status: {
|
|
359
|
+
kind: "string",
|
|
360
|
+
description: "Filter to a single terminal status (implemented, rejected, superseded).",
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
execute: runRfcArchive,
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// ── rfc.pipeline.status ──────────────────────────────────────────────────
|
|
367
|
+
registry.registerCommand({
|
|
368
|
+
name: "rfc.pipeline.status",
|
|
369
|
+
description:
|
|
370
|
+
"Report the pipeline status of RFCs — which steps (audit, enhance, plan, implement) " +
|
|
371
|
+
"are complete or missing. Pass --id to check a single file, or run without " +
|
|
372
|
+
"arguments for all. Read-only — does not mutate files. Skills keep their own " +
|
|
373
|
+
"prerequisite checks; this command is for agents and humans to inspect pipeline state.",
|
|
374
|
+
scope: "workspace",
|
|
375
|
+
flags: {
|
|
376
|
+
id: { kind: "string", description: "Target a single RFC by id (e.g. RFC-0609)." },
|
|
377
|
+
},
|
|
378
|
+
reads: ["docs/rfcs/**/*.md"],
|
|
379
|
+
execute: runRfcPipelineStatus,
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
// ── rfc.implement.stamp ──────────────────────────────────────────────────
|
|
383
|
+
registry.registerCommand({
|
|
384
|
+
name: "rfc.implement.stamp",
|
|
385
|
+
description:
|
|
386
|
+
"RFC-0476: the exclusive atomic path for accepted → implemented transitions. " +
|
|
387
|
+
"Verifies preconditions (accepted status, checked+evidenced criteria, clean tree, " +
|
|
388
|
+
"reachable RFC-referencing commit, passing probe evidence) then atomically sets " +
|
|
389
|
+
"status: implemented, implementedAt, and updatedAt. Use --dry-run to preview.",
|
|
390
|
+
scope: "workspace",
|
|
391
|
+
mutatesState: true,
|
|
392
|
+
writes: ["docs/rfcs/**/*.md"],
|
|
393
|
+
reads: ["docs/rfcs/**/*.md", "docs/rfcs/verification/*.generated.yaml"],
|
|
394
|
+
cacheable: false,
|
|
395
|
+
flags: {
|
|
396
|
+
id: {
|
|
397
|
+
kind: "string",
|
|
398
|
+
required: true,
|
|
399
|
+
description: "Target RFC id to stamp (e.g. RFC-0476).",
|
|
400
|
+
},
|
|
401
|
+
"implementation-commit": {
|
|
402
|
+
kind: "string",
|
|
403
|
+
required: false,
|
|
404
|
+
description:
|
|
405
|
+
"SHA of the implementation commit (must be reachable from HEAD and reference the RFC id). " +
|
|
406
|
+
"When omitted, the command auto-detects the commit via git log --grep=<RFC-ID> (RFC-0756).",
|
|
407
|
+
},
|
|
408
|
+
"dry-run": {
|
|
409
|
+
kind: "boolean",
|
|
410
|
+
description: "Perform all checks without mutating the RFC file or emitting evidence.",
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
execute: runRfcImplementStamp,
|
|
414
|
+
});
|
|
415
|
+
},
|
|
416
|
+
};
|