@warpgogol/forge 4.0.0 → 4.1.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.
Files changed (46) hide show
  1. package/AGENTS.md +18 -3
  2. package/bin/cli.ts +15 -8
  3. package/os/adr/adr.module.ts +24 -23
  4. package/os/adr/index.ts +1 -1
  5. package/os/audit/audit.module.ts +13 -8
  6. package/os/audit/index.ts +1 -1
  7. package/os/compass/compass.module.ts +22 -19
  8. package/os/core/core.module.ts +842 -864
  9. package/os/core/handlers/package-health.ts +20 -0
  10. package/os/core/index.ts +1 -1
  11. package/os/exploration/exploration.module.ts +19 -16
  12. package/os/exploration/index.ts +2 -2
  13. package/os/mission/index.ts +1 -1
  14. package/os/mission/mission.module.ts +13 -8
  15. package/os/naming/index.ts +1 -1
  16. package/os/naming/naming-convention.ts +1 -0
  17. package/os/naming/naming.module.ts +13 -7
  18. package/os/notes/index.ts +2 -2
  19. package/os/notes/notes.module.ts +20 -17
  20. package/os/plan/index.ts +1 -1
  21. package/os/plan/plan.module.ts +13 -8
  22. package/os/plugin/plugin.module.ts +10 -8
  23. package/os/program/program.module.ts +22 -20
  24. package/os/rfc/handlers/implement-stamp.ts +17 -1
  25. package/os/rfc/index.ts +1 -1
  26. package/os/rfc/rfc-0000-template.md +3 -2
  27. package/os/rfc/rfc.module.ts +54 -84
  28. package/os/rfc/types.ts +1 -0
  29. package/os/session/handlers/metrics-aggregate.ts +208 -0
  30. package/os/session/handlers/metrics-rfc.ts +339 -0
  31. package/os/session/handlers/metrics-session.ts +209 -0
  32. package/os/session/handlers/save.ts +19 -0
  33. package/os/session/index.ts +16 -1
  34. package/os/session/session.module.ts +133 -107
  35. package/os/session/types.ts +99 -0
  36. package/os/spec/spec.module.ts +28 -29
  37. package/os/werkstatt/werkstatt.module.ts +12 -9
  38. package/os/workflow/index.ts +1 -1
  39. package/os/workflow/workflow.module.ts +18 -12
  40. package/package.json +3 -1
  41. package/src/forge-module.ts +24 -10
  42. package/src/index.ts +12 -12
  43. package/src/onboarding/scaffold.ts +6 -4
  44. package/src/tests/metrics-rfc-1053.test.ts +355 -0
  45. package/src/types/werkstatt-engine-shims.d.ts +126 -48
  46. package/src/types/werkstatt-shared-shims.d.ts +6 -0
package/AGENTS.md CHANGED
@@ -27,13 +27,22 @@ Packet 000 will add the portable `forge/program@1` control plane under `os/progr
27
27
  | `forgeAdrModule` | `adr.list`, `adr.create`, `adr.validate`, `adr.archive`, `adr.implement.stamp` | `os/adr/` |
28
28
  | `forgePlanModule` | `plan.archive` | `os/plan/` |
29
29
  | `forgeAuditModule` | `audit.archive` | `os/audit/` |
30
- | `forgeSessionModule` | `session.save`, `session.archive`, `session.validate`, `session.list` | `os/session/` |
30
+ | `forgeSessionModule` | `session.save`, `session.archive`, `session.validate`, `session.list`, `metrics.aggregate` | `os/session/` |
31
31
  | `forgeMissionModule` | `mission.archive` | `os/mission/` |
32
32
  | `forgeExplorationModule` | `exploration.list`, `exploration.show`, `exploration.archive` | `os/exploration/` |
33
33
  | `forgeNotesModule` | `note.link.validate`, `note.frontmatter.validate`, `note.orphan.detect` | `os/notes/` |
34
34
  | `forgeProgramModule` | `program.packet.validate`, `program.packet.seal`, `program.packet.lease`, `program.packet.complete` | `os/program/` |
35
35
  | `forgePluginModule` | `forge.plugin.validate`, `forge.plugin.discover` | `os/plugin/` |
36
36
 
37
+ ## RFC-1053: Skill effectiveness metrics
38
+
39
+ `metrics.aggregate` (RFC-1053) queries and aggregates per-skill effectiveness metrics from `docs/metrics/` YAML files. Metrics are generated at two integration points:
40
+
41
+ - `rfc.implement.stamp` — generates `docs/metrics/rfcs/<rfc-id>.metrics.yaml` after successful stamp (non-fatal on failure).
42
+ - `session.save` — generates `docs/metrics/sessions/<session-id>.metrics.yaml` from parsed ATIF messages (non-fatal on failure).
43
+
44
+ Both generators are best-effort: metrics failures log a warning and never block the primary operation. Agents MUST NOT manually edit `docs/metrics/` files — they are generated artifacts produced by `rfc.implement.stamp` and `session.save`.
45
+
37
46
  ## Compass contract extension points (RFC-0943)
38
47
 
39
48
  Skill packs MAY declare additional Compass contract blocks beyond the built-in `MODULE_CONTRACT` and `CHANGE_SUMMARY` via `forge.plugin.yaml` `extensionPoints.compass.contract.blocks[]`. Each block spec is declarative data:
@@ -50,6 +59,8 @@ Skill packs MAY declare additional Compass contract blocks beyond the built-in `
50
59
  - **Wrap `loadForgeConfig` in try/catch in handlers that run in test workspaces.** `loadForgeConfig` throws when `forge.yaml` does not exist at the workspace root. Handlers that may be called from test workspaces without a `forge.yaml` (e.g. `runCompassValidation`) must guard the call with try/catch and skip pack-dependent logic when config is unavailable.
51
60
  - **Register new top-level directories in `NAMING_CONVENTION_IGNORED_TOP_LEVEL`.** When a new top-level directory appears in the repo (e.g. `.adr-locks`, `.devin`, `.forge`, `.rfc-locks`, `patches`, `storage`), add it to `NAMING_CONVENTION_IGNORED_TOP_LEVEL` in `os/naming/naming-convention.ts`. Otherwise `naming.convention.lint` reports "unknown top-level directory" errors.
52
61
  - **Add tool-generated/imported/historical dirs to `NAMING_CONVENTION_EXEMPT_DIRS`.** Directories containing tool-generated files (e.g. `docs/performance` with timestamp-based names), imported specification documents (e.g. `docs/specs` with `01-PBP-System-Specification.md`), and archived RFCs (e.g. `docs/rfcs/archive`) should be added to `NAMING_CONVENTION_EXEMPT_DIRS` in `os/naming/naming-convention.ts` to avoid false-positive kebab-case violations on files whose naming is controlled by external tools or conventions.
62
+ - **Use `%s` not `%B` for git log delimiter parsing.** When parsing `git log --format` output with `\x1f`-delimited fields, use `%s` (subject only) instead of `%B` (full body). `%B` includes newlines which break the per-line `split("\x1f")` parsing, causing all entries to be silently skipped. Discovered during RFC-1053 `metrics-rfc.ts` implementation.
63
+ - **Chicken-and-egg with self-referential acceptance probes.** When an RFC's acceptance probe checks for a file that is created by `rfc.implement.stamp` itself (e.g. `docs/metrics/rfcs/<rfc-id>.metrics.yaml`), `rfc.verification.emit` will always report "fail" before stamping because the file doesn't exist yet. Solution: generate the file manually first (e.g. via a node script calling the generator function), re-emit evidence, then stamp. The stamp's `RFC-IMP-06` check requires evidence to be "pass" before proceeding. Discovered during RFC-1053 stamping.
53
64
 
54
65
  ## Program packet control plane (RFC-0856)
55
66
 
@@ -68,6 +79,8 @@ When archiving terminal artifacts, prefer the `docs.archive` umbrella command ov
68
79
 
69
80
  - **RFC-0711: `docs.archive` post-loop `spec.live.merge` step.** After archiving, `docs.archive` scans implemented RFCs with a `liveSpec` frontmatter field and calls `spec.live.merge` for each, creating or updating living feature specs under `docs/specs/live/<domain>.md`. Rejected RFCs with `liveSpec` are skipped. Merge failures are non-fatal — the archive step still completes. Use `--dry-run` to preview merges without writing.
70
81
 
82
+ - **`rfc.validate --root <file>` does NOT scope validation to a single file.** It validates ALL RFCs in the repo regardless of the `--root` flag. To check specific RFCs, use `--json` with `2>/dev/null` (log lines go to stderr) and filter the `data.violations[]` array by `rfcId`. Discovered during RFC-1035–1038 gap analysis.
83
+ - **`rfc.archive` does NOT accept `--id`.** It archives ALL terminal-status RFCs at once. Available flags: `--dry-run` (preview), `--status <status>` (filter by status). Use `--dry-run` first to verify which files will move. Discovered during RFC-1038 archiving.
71
84
  - **Post-rename cleanup for `fs.rename` on watched directories:** When an archive handler uses `fs.rename` to move a directory that an IDE or file watcher is tracking (e.g. mission workpiece with an open `.astro/` cache), the watcher may recreate stale cache at the source path after the rename completes. Always add a post-rename cleanup check using `trashPath` from `utils/fs-trash.ts`: `if (existsSync(sourcePath)) { await trashPath(sourcePath); }` after the `fs.rename` call. See `os/mission/handlers/archive.ts` `moveMissionDir` for the reference implementation.
72
85
 
73
86
  ## Pinned-files protection (RFC-0733)
@@ -86,11 +99,12 @@ The pinned-files protection system prevents accidental deletion, move, or modifi
86
99
  All Forge stack profiles include portable agent-safety scripts as embedded file content blocks. These scripts protect AI agents from destructive git operations and enforce session-end protocol.
87
100
 
88
101
  - **`scripts/git-guard.sh`** — shell function intercepting `git stash`, `git reset --hard`, `git checkout --`, `git checkout -f`, `git switch -f`, `git clean -f`, `git restore`. Override: `ALLOW_DESTRUCTIVE_GIT=1`. Uses `FORGE_GIT_GUARD` marker (not `WERKSTATT_GIT_GUARD`).
89
- - **`scripts/setup-git-guards.sh`** — installs git-guard.sh into `~/.zshenv`. Supports `install`, `--verify`, `--remove` modes.
102
+ - **`scripts/setup-git-guards.sh`** — auto-detects shell (zsh → `~/.zshenv`, bash → `~/.bashrc`) and installs git-guard.sh source line. Supports `install`, `--verify`, `--remove` modes.
90
103
  - **`scripts/clean-stale-stashes.sh`** — detects and optionally drops stale git stash entries. Report mode (`--drop` to clean, `--drop-all` for all).
91
104
  - **`scripts/check-clean-trees.sh`** — universal dirty-tree checker. Finds all `.git` directories up to 3 levels deep and checks each for dirty state.
92
105
  - **`hooks/pre-user-prompt.sh`** — session-end protocol enforcement + stale-stash detection + git-guard verification. Requires `jq`. Exits with code 2 on session-end trigger phrases to inject protocol instructions.
93
- - **`.windsurf/hooks.json`** Windsurf hook registration for `pre_user_prompt`.
106
+ - **`hooks/pre-user-prompt-wrapper.mjs`** — Node.js cross-platform wrapper called by `.windsurf/hooks.json`. Detects bash availability, prints one-time warning if bash not found (Windows without Git Bash), then delegates to `hooks/pre-user-prompt.sh`.
107
+ - **`.windsurf/hooks.json`** — Windsurf hook registration for `pre_user_prompt`, calls `node $ROOT_WORKSPACE_PATH/hooks/pre-user-prompt-wrapper.mjs`.
94
108
  - **PREFERENCES.md** generated by `forge init` includes `formOfAddress` field and operational rules: plan confirmation vs implementation, skill invocation tracking, commit granularity, session-end protocol.
95
109
 
96
110
  ## Skills
@@ -174,6 +188,7 @@ RFC-0997 binds acceptance probes to criteria via the `criterion: "AC-N"` field a
174
188
  - **V-37**: checked criteria evidence SHALL resolve — `probe:AC-N` must reference a criterion with at least one bound probe; `test:<path>` and `<path>:<line>` must reference an existing file. **Evidence annotations MUST NOT contain em-dashes (—) or nested quotes** — the V-37 parser breaks on `test: path — "description"` and reports the file as non-existent. **The `<path>` token MUST be the file path only — no AC-N suffixes, no descriptions, no extra text after the path.** The parser treats everything after `test:` until end-of-parenthesis as the file path; `test: packages/forge/os/rfc/file.test.ts AC-1` is reported as non-existent because the parser looks for a file named `packages/forge/os/rfc/file.test.ts AC-1`. Use simple `(evidence: test:packages/forge/src/tests/file.test.ts)` without em-dashes, nested quotes, or AC-N suffixes. Discovered during RFC-0998 and RFC-0999.
175
189
  - **RFC-IMP-08**: `rfc.implement.stamp` blocks stamping for post-cutoff RFCs of kind `architecture`, `contract`, or `command` that declare zero acceptance probes. Policy and deprecation kinds are exempt.
176
190
  - **Coverage report**: `rfc.validate --json` and `rfc.acceptance.run` emit a non-blocking `coverage` block per post-cutoff RFC with `totalCriteria`, `probeBackedCriteria`, `coverageRatio`, `uncoveredCriteria`, `unboundProbes`.
191
+ - **`file-contains` probe `pattern` is RegExp, not literal.** The `file-contains` acceptance probe compiles its `pattern` field via `new RegExp(pattern, "m")`. Parentheses, brackets, dots, and other regex metacharacters MUST be escaped (e.g. `\\(RFC-1023\\)` not `(RFC-1023)`). Unescaped parentheses silently fail to match and produce false "pattern not found" results. Discovered during RFC-1023 verification.
177
192
 
178
193
  ## RFC criteria content rules: phase separation, reject checklist, criterion versioning (RFC-1006)
179
194
 
package/bin/cli.ts CHANGED
@@ -145,19 +145,26 @@ async function buildRegistry(): Promise<ForgeCliRegistry> {
145
145
  const registry = new ForgeCliRegistry();
146
146
 
147
147
  const modules: ForgeModule[] = [
148
- await import("../os/core/core.module.ts").then((m) => m.forgeCoreModule),
149
- await import("../os/rfc/rfc.module.ts").then((m) => m.forgeRfcModule),
150
- await import("../os/workflow/workflow.module.ts").then((m) => m.forgeWorkflowModule),
151
- await import("../os/naming/naming.module.ts").then((m) => m.forgeNamingModule),
148
+ await import("../os/core/core.module.ts").then((m) => m.createForgeCoreModule()),
149
+ await import("../os/rfc/rfc.module.ts").then((m) => m.createForgeRfcModule()),
150
+ await import("../os/workflow/workflow.module.ts").then((m) => m.createForgeWorkflowModule()),
151
+ await import("../os/naming/naming.module.ts").then((m) => m.createForgeNamingModule()),
152
152
  await import("../os/compass/compass.module.ts").then((m) => m.forgeCompassModule),
153
153
  await import("../os/werkstatt/werkstatt.module.ts").then((m) => m.forgeWerkstattModule),
154
- await import("../os/session/session.module.ts").then((m) => m.forgeSessionModule),
155
- await import("../os/exploration/exploration.module.ts").then((m) => m.forgeExplorationModule),
156
- await import("../os/notes/notes.module.ts").then((m) => m.forgeNotesModule),
154
+ await import("../os/session/session.module.ts").then((m) => m.createForgeSessionModule()),
155
+ await import("../os/exploration/exploration.module.ts").then((m) =>
156
+ m.createForgeExplorationModule(),
157
+ ),
158
+ await import("../os/notes/notes.module.ts").then((m) => m.createForgeNotesModule()),
157
159
  ].filter((m): m is ForgeModule => m !== null);
158
160
 
159
161
  for (const mod of modules) {
160
- await mod.register(registry);
162
+ for (const cmd of mod.commands) {
163
+ registry.registerCommand(cmd);
164
+ }
165
+ for (const pipe of mod.pipelines) {
166
+ registry.registerPipeline(pipe.name, pipe.steps);
167
+ }
161
168
  }
162
169
 
163
170
  return registry;
@@ -14,18 +14,19 @@
14
14
 
15
15
  import type { ForgeModule } from "../../src/forge-module.ts";
16
16
 
17
- export const forgeAdrModule: ForgeModule = {
18
- name: "forge-adr",
19
- version: "0.1.0",
20
- runtime: "autonomous",
21
-
22
- async register(registry) {
23
- const { runAdrList, runAdrCreate } = await import("./handlers/list-create.ts");
17
+ export async function createForgeAdrModule(): Promise<ForgeModule> {
18
+ const { runAdrList, runAdrCreate } = await import("./handlers/list-create.ts");
24
19
  const { runAdrValidate } = await import("./handlers/validate.ts");
25
20
  const { runAdrArchive } = await import("./handlers/archive.ts");
26
21
  const { runAdrImplementStamp } = await import("./handlers/implement-stamp.ts");
22
+ return {
23
+ name: "forge-adr",
24
+ version: "0.1.0",
25
+ runtime: "autonomous",
27
26
 
28
- registry.registerCommand({
27
+ declarations: [],
28
+ commands: [
29
+ {
29
30
  name: "adr.list",
30
31
  description:
31
32
  "List all ADRs. Filter with --status, --scope, --decider flags. " +
@@ -45,9 +46,8 @@ export const forgeAdrModule: ForgeModule = {
45
46
  },
46
47
  reads: ["docs/adrs/**/*.md"],
47
48
  execute: runAdrList,
48
- });
49
-
50
- registry.registerCommand({
49
+ },
50
+ {
51
51
  name: "adr.create",
52
52
  description:
53
53
  "Create a new ADR draft from the template. " +
@@ -83,9 +83,8 @@ export const forgeAdrModule: ForgeModule = {
83
83
  },
84
84
  },
85
85
  execute: runAdrCreate,
86
- });
87
-
88
- registry.registerCommand({
86
+ },
87
+ {
89
88
  name: "adr.validate",
90
89
  contract: "adr",
91
90
  rules: [],
@@ -99,9 +98,8 @@ export const forgeAdrModule: ForgeModule = {
99
98
  },
100
99
  reads: ["docs/adrs/**/*.md"],
101
100
  execute: runAdrValidate,
102
- });
103
-
104
- registry.registerCommand({
101
+ },
102
+ {
105
103
  name: "adr.archive",
106
104
  description:
107
105
  "Move terminal-status ADR files (implemented, rejected, superseded) into " +
@@ -125,9 +123,8 @@ export const forgeAdrModule: ForgeModule = {
125
123
  },
126
124
  },
127
125
  execute: runAdrArchive,
128
- });
129
-
130
- registry.registerCommand({
126
+ },
127
+ {
131
128
  name: "adr.implement.stamp",
132
129
  description:
133
130
  "Atomically transition an ADR from accepted/proposed to implemented. " +
@@ -156,6 +153,10 @@ export const forgeAdrModule: ForgeModule = {
156
153
  },
157
154
  },
158
155
  execute: runAdrImplementStamp,
159
- });
160
- },
161
- };
156
+ }
157
+ ],
158
+ pipelines: [
159
+
160
+ ]};
161
+ }
162
+ ;
package/os/adr/index.ts CHANGED
@@ -11,7 +11,7 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- export { forgeAdrModule } from "./adr.module.ts";
14
+ export { createForgeAdrModule } from "./adr.module.ts";
15
15
  export { runAdrList, runAdrCreate } from "./handlers/list-create.ts";
16
16
  export { runAdrValidate } from "./handlers/validate.ts";
17
17
  export { runAdrArchive } from "./handlers/archive.ts";
@@ -12,14 +12,15 @@
12
12
 
13
13
  import type { ForgeModule } from "../../src/forge-module.ts";
14
14
 
15
- export const forgeAuditModule: ForgeModule = {
15
+ export async function createForgeAuditModule(): Promise<ForgeModule> {
16
+ const { runAuditArchive } = await import("./handlers/archive.ts");
17
+ return {
16
18
  name: "forge-audit",
17
19
  version: "0.1.0",
18
20
  runtime: "autonomous",
19
- async register(registry) {
20
- const { runAuditArchive } = await import("./handlers/archive.ts");
21
-
22
- registry.registerCommand({
21
+ declarations: [],
22
+ commands: [
23
+ {
23
24
  name: "audit.archive",
24
25
  description:
25
26
  "Move audit files whose parent RFC has terminal status " +
@@ -44,6 +45,10 @@ export const forgeAuditModule: ForgeModule = {
44
45
  },
45
46
  },
46
47
  execute: runAuditArchive,
47
- });
48
- },
49
- };
48
+ }
49
+ ],
50
+ pipelines: [
51
+
52
+ ]};
53
+ }
54
+ ;
package/os/audit/index.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  </CHANGE_SUMMARY>
11
11
  */
12
12
 
13
- export { forgeAuditModule } from "./audit.module.ts";
13
+ export { createForgeAuditModule } from "./audit.module.ts";
14
14
  export { runAuditArchive } from "./handlers/archive.ts";
15
15
  export {
16
16
  listAuditFiles,
@@ -46,8 +46,9 @@ export const forgeCompassModule: ForgeModule = {
46
46
  name: "forge-compass",
47
47
  version: "0.1.0",
48
48
  runtime: "autonomous",
49
- async register(registry) {
50
- registry.registerCommand({
49
+ declarations: [],
50
+ commands: [
51
+ {
51
52
  name: "compass.inventory",
52
53
  description: "Generate the repository-wide Compass source inventory XML report.",
53
54
  scope: "workspace",
@@ -59,8 +60,8 @@ export const forgeCompassModule: ForgeModule = {
59
60
  "services/**/*.{ts,tsx,astro,js,mjs,css,cs,tscn,tres,gd,md}",
60
61
  ],
61
62
  execute: runCompassInventory,
62
- });
63
- registry.registerCommand({
63
+ },
64
+ {
64
65
  name: "compass.validate",
65
66
  contract: "compass",
66
67
  rules: [],
@@ -76,8 +77,8 @@ export const forgeCompassModule: ForgeModule = {
76
77
  "docs/source-markup.xml",
77
78
  ],
78
79
  execute: runCompassValidation,
79
- });
80
- registry.registerCommand({
80
+ },
81
+ {
81
82
  name: "compass.changesummary.validate",
82
83
  contract: "compass",
83
84
  rules: [],
@@ -92,8 +93,8 @@ export const forgeCompassModule: ForgeModule = {
92
93
  "services/**/*.{ts,tsx,astro,js,mjs,css,cs,tscn,tres,gd,md}",
93
94
  ],
94
95
  execute: runCompassChangeSummaryValidate,
95
- });
96
- registry.registerCommand({
96
+ },
97
+ {
97
98
  name: "compass.summary.trim",
98
99
  description:
99
100
  "Deterministically trim CHANGE_SUMMARY blocks: remove boilerplate, cap total items to 30, preserve protected items (RFC-0538).",
@@ -113,8 +114,8 @@ export const forgeCompassModule: ForgeModule = {
113
114
  cacheable: false,
114
115
  flags: { ...compassScanFlags },
115
116
  execute: runCompassSummaryTrim,
116
- });
117
- registry.registerCommand({
117
+ },
118
+ {
118
119
  name: "compass.audit.plan",
119
120
  description:
120
121
  "Emit a deterministic work-order of files whose revision has advanced past the threshold since their last Compass audit (RFC-0352). Read-only, no LLM.",
@@ -134,8 +135,8 @@ export const forgeCompassModule: ForgeModule = {
134
135
  "docs/compass-audit-ledger.generated.yaml",
135
136
  ],
136
137
  execute: runCompassAuditPlan,
137
- });
138
- registry.registerCommand({
138
+ },
139
+ {
139
140
  name: "compass.audit.record",
140
141
  description:
141
142
  "Stamp a file's audit verdict and current revision into the compass-audit ledger (RFC-0352). Mutating.",
@@ -155,8 +156,8 @@ export const forgeCompassModule: ForgeModule = {
155
156
  agent: { kind: "string", description: "Agent identity to record in the ledger." },
156
157
  },
157
158
  execute: runCompassAuditRecord,
158
- });
159
- registry.registerCommand({
159
+ },
160
+ {
160
161
  name: "compass.audit.baseline",
161
162
  description:
162
163
  "Seed the compass-audit ledger for every authored file at its current revision with verdict=baseline (RFC-0352). One-time bootstrap.",
@@ -172,8 +173,8 @@ export const forgeCompassModule: ForgeModule = {
172
173
  cacheable: false,
173
174
  flags: { ...compassScanFlags },
174
175
  execute: runCompassAuditBaseline,
175
- });
176
- registry.registerCommand({
176
+ },
177
+ {
177
178
  name: "compass.audit.validate",
178
179
  contract: "compass",
179
180
  rules: [],
@@ -204,6 +205,8 @@ export const forgeCompassModule: ForgeModule = {
204
205
  description: "Warns by default, fails with --strict",
205
206
  },
206
207
  },
207
- });
208
- },
209
- };
208
+ }
209
+ ],
210
+ pipelines: [
211
+
212
+ ]};