@gobing-ai/spur 0.4.8 → 0.4.9

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 (145) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/pipeline-budgets.json +2 -2
  3. package/config/rules/boundary/config-loading-ownership.yaml +1 -0
  4. package/config/rules/boundary/sp-plugin-standalone.yaml +1 -1
  5. package/config/rules/boundary/sp-script-placement.yaml +1 -1
  6. package/config/rules/docs/sourced-api-claims.yaml +45 -7
  7. package/config/rules/strict/runtime-boundaries.yaml +40 -1
  8. package/config/rules/structure/protected-files.yaml +1 -1
  9. package/config/rules/surface/check-cli-surface.yaml +33 -0
  10. package/config/rules/typescript/no-debugger.yaml +3 -0
  11. package/config/workflow-candidates.json +2 -2
  12. package/config/workflows/feature-verification.yaml +6 -11
  13. package/config/workflows/history-anatomy.yaml +14 -28
  14. package/config/workflows/idea-pipeline.yaml +6 -19
  15. package/config/workflows/pr-review.yaml +9 -16
  16. package/config/workflows/task-pipeline.yaml +16 -23
  17. package/config/workflows/wrapup-pipeline.yaml +21 -63
  18. package/package.json +3 -3
  19. package/plugins/sp/README.md +70 -37
  20. package/plugins/sp/agents/super-planner.md +5 -5
  21. package/plugins/sp/agents/super-reviewer.md +2 -2
  22. package/plugins/sp/commands/dev-changelog.md +1 -1
  23. package/plugins/sp/commands/dev-daily.md +1 -1
  24. package/plugins/sp/commands/dev-pr-review.md +1 -1
  25. package/plugins/sp/commands/dev-review-session.md +1 -1
  26. package/plugins/sp/commands/dev-runall.md +4 -4
  27. package/plugins/sp/commands/dev-verify.md +4 -6
  28. package/plugins/sp/commands/dev-verifyall.md +4 -5
  29. package/plugins/sp/hooks/hooks.json +11 -1
  30. package/plugins/sp/lib/context-post-tool.ts +1 -1
  31. package/plugins/sp/lib/context-session-start.ts +1 -1
  32. package/plugins/sp/lib/context-session-stop.ts +1 -1
  33. package/plugins/sp/lib/destructive-policy.ts +65 -1
  34. package/plugins/sp/plugin.json +2 -5
  35. package/plugins/sp/{hooks → scripts/hooks}/agent-lifecycle.ts +1 -1
  36. package/plugins/sp/scripts/hooks/careful-guard.ts +94 -0
  37. package/plugins/sp/{hooks → scripts/hooks}/context-post-tool.ts +2 -2
  38. package/plugins/sp/{hooks → scripts/hooks}/context-session-start.ts +1 -1
  39. package/plugins/sp/{hooks → scripts/hooks}/context-session-stop.ts +1 -1
  40. package/plugins/sp/{hooks → scripts/hooks}/fleet-guest-stop.ts +6 -4
  41. package/plugins/sp/{hooks → scripts/hooks}/task-write-guard.ts +38 -21
  42. package/plugins/sp/skills/code-implementation/SKILL.md +1 -1
  43. package/plugins/sp/skills/code-verification/SKILL.md +8 -8
  44. package/plugins/sp/skills/code-verification/references/secu-review.md +4 -3
  45. package/plugins/sp/skills/code-verification/references/verdict-schema.md +9 -1
  46. package/plugins/sp/skills/daily-summary/SKILL.md +4 -5
  47. package/plugins/sp/skills/dogfood-testing/SKILL.md +9 -9
  48. package/plugins/sp/skills/dogfood-testing/references/report-template.md +1 -1
  49. package/plugins/sp/skills/history-anatomy/references/modes.md +2 -2
  50. package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
  51. package/plugins/sp/skills/parallel-execution/SKILL.md +1 -1
  52. package/plugins/sp/skills/pr-reviewing/SKILL.md +14 -15
  53. package/plugins/sp/skills/session-review/SKILL.md +3 -3
  54. package/plugins/sp/skills/source-driven-development/SKILL.md +7 -4
  55. package/plugins/sp/skills/spur-check/SKILL.md +14 -13
  56. package/plugins/sp/skills/spur-cli/SKILL.md +1 -1
  57. package/plugins/sp/skills/spur-cli/references/agent.md +12 -0
  58. package/plugins/sp/skills/spur-cli/references/builder.md +27 -6
  59. package/plugins/sp/skills/spur-cli/references/features.md +6 -1
  60. package/plugins/sp/skills/spur-cli/references/history.md +3 -0
  61. package/plugins/sp/skills/spur-cli/references/self.md +5 -3
  62. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +3 -0
  63. package/plugins/sp/skills/spur-cli/references/tasks.md +13 -3
  64. package/plugins/sp/skills/spur-cli/references/workflows.md +36 -1
  65. package/plugins/sp/skills/spur-dev/SKILL.md +1 -1
  66. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +1 -1
  67. package/plugins/sp/skills/spur-dev/references/dev-operations.md +12 -12
  68. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +10 -11
  69. package/plugins/sp/skills/spur-dev/references/execution-batch.md +16 -17
  70. package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +1 -1
  71. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +8 -11
  72. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +6 -8
  73. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +1 -1
  74. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +33 -40
  75. package/plugins/sp/skills/spur-dev/references/structured-trace-emission.md +24 -24
  76. package/plugins/sp/skills/spur-doctor/SKILL.md +5 -4
  77. package/spur.js +41901 -30598
  78. package/config/plugin-scripts.json +0 -116
  79. package/config/script-placement-baseline.json +0 -33
  80. package/plugins/sp/hooks/careful-guard.ts +0 -74
  81. package/plugins/sp/hooks/pi/guard-extension.ts +0 -304
  82. package/plugins/sp/lib/dogfood-pipeline.ts +0 -265
  83. package/plugins/sp/lib/dogfood-report.ts +0 -278
  84. package/plugins/sp/lib/history-anatomy.generated.d.mts +0 -112
  85. package/plugins/sp/lib/history-anatomy.generated.mjs +0 -691
  86. package/plugins/sp/lib/idea-handoff.generated.d.mts +0 -17
  87. package/plugins/sp/lib/idea-handoff.generated.mjs +0 -1446
  88. package/plugins/sp/lib/inline-run-app.ts +0 -68
  89. package/plugins/sp/lib/inline-run.generated.d.mts +0 -37
  90. package/plugins/sp/lib/inline-run.generated.mjs +0 -3103
  91. package/plugins/sp/lib/plan-projection.generated.d.mts +0 -197
  92. package/plugins/sp/lib/plan-projection.generated.mjs +0 -982
  93. package/plugins/sp/lib/quality-gate.generated.d.mts +0 -139
  94. package/plugins/sp/lib/quality-gate.generated.mjs +0 -30510
  95. package/plugins/sp/lib/residual-scan.generated.d.mts +0 -93
  96. package/plugins/sp/lib/residual-scan.generated.mjs +0 -383
  97. package/plugins/sp/lib/run-summary-core.ts +0 -225
  98. package/plugins/sp/lib/spur-bin.ts +0 -36
  99. package/plugins/sp/lib/step-profile.generated.d.mts +0 -71
  100. package/plugins/sp/lib/step-profile.generated.mjs +0 -174
  101. package/plugins/sp/lib/transcript.ts +0 -112
  102. package/plugins/sp/scripts/batch-plan.mjs +0 -1096
  103. package/plugins/sp/scripts/batch-plan.ts +0 -145
  104. package/plugins/sp/scripts/batch-preflight.mjs +0 -423
  105. package/plugins/sp/scripts/batch-preflight.ts +0 -270
  106. package/plugins/sp/scripts/commit-guard.mjs +0 -226
  107. package/plugins/sp/scripts/commit-guard.ts +0 -248
  108. package/plugins/sp/scripts/daily-summary/daily-summary.mjs +0 -626
  109. package/plugins/sp/scripts/daily-summary/daily-summary.ts +0 -855
  110. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +0 -211
  111. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +0 -110
  112. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +0 -282
  113. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +0 -98
  114. package/plugins/sp/scripts/feature-verification-steps.mjs +0 -82
  115. package/plugins/sp/scripts/feature-verification-steps.ts +0 -164
  116. package/plugins/sp/scripts/history-anatomy-cache.mjs +0 -931
  117. package/plugins/sp/scripts/history-anatomy-cache.ts +0 -247
  118. package/plugins/sp/scripts/idea-handoff.mjs +0 -32
  119. package/plugins/sp/scripts/idea-handoff.ts +0 -47
  120. package/plugins/sp/scripts/inline-run-dispatch.mjs +0 -131
  121. package/plugins/sp/scripts/inline-run-dispatch.ts +0 -115
  122. package/plugins/sp/scripts/inline-run-setup.mjs +0 -746
  123. package/plugins/sp/scripts/inline-run-setup.ts +0 -198
  124. package/plugins/sp/scripts/persist-out-check.mjs +0 -217
  125. package/plugins/sp/scripts/persist-out-check.ts +0 -249
  126. package/plugins/sp/scripts/pr-reviewing.mjs +0 -712
  127. package/plugins/sp/scripts/pr-reviewing.ts +0 -952
  128. package/plugins/sp/scripts/quality-gate.mjs +0 -30491
  129. package/plugins/sp/scripts/quality-gate.ts +0 -80
  130. package/plugins/sp/scripts/residual-scan.mjs +0 -634
  131. package/plugins/sp/scripts/residual-scan.ts +0 -248
  132. package/plugins/sp/scripts/run-summary.mjs +0 -758
  133. package/plugins/sp/scripts/run-summary.ts +0 -107
  134. package/plugins/sp/scripts/script-root.mjs +0 -129
  135. package/plugins/sp/scripts/script-root.ts +0 -199
  136. package/plugins/sp/scripts/session-timeline.mjs +0 -359
  137. package/plugins/sp/scripts/session-timeline.ts +0 -190
  138. package/plugins/sp/scripts/task-diffstat.mjs +0 -181
  139. package/plugins/sp/scripts/task-diffstat.ts +0 -219
  140. package/plugins/sp/scripts/workflow-step-profile.mjs +0 -338
  141. package/plugins/sp/scripts/workflow-step-profile.ts +0 -165
  142. package/plugins/sp/scripts/wrapup-drift-probe.mjs +0 -190
  143. package/plugins/sp/scripts/wrapup-drift-probe.ts +0 -261
  144. package/plugins/sp/scripts/wrapup-steps.mjs +0 -627
  145. package/plugins/sp/scripts/wrapup-steps.ts +0 -891
@@ -1,82 +0,0 @@
1
- #!/usr/bin/env node
2
- // @bun
3
-
4
- // plugins/sp/scripts/feature-verification-steps.ts
5
- import { spawnSync } from "child_process";
6
- import { existsSync } from "fs";
7
- import { fileURLToPath } from "url";
8
-
9
- // plugins/sp/lib/env.ts
10
- function getEnvVar(name, fallback) {
11
- const raw = process.env[name];
12
- return raw === undefined ? fallback : raw;
13
- }
14
-
15
- // plugins/sp/scripts/feature-verification-steps.ts
16
- function bundleEntry() {
17
- return fileURLToPath(new URL("../lib/inline-run.generated.mjs", import.meta.url));
18
- }
19
- function sourceModeError(spurBin) {
20
- return new Error(`source mode: refusing to load packages/app/src/index.ts (spurBin=${JSON.stringify(spurBin)}). ` + "That entry is not the feature-verification contract surface \u2014 it does not export " + "runFeatureVerification. Fix: run in bundle mode so " + "plugins/sp/lib/inline-run.generated.mjs is loaded (omit --module-mode, or pass --module-mode bundle) " + "and regenerate that bundle if it is missing. Reinstalling the sp plugin does not add the operation to the app source entry.");
21
- }
22
- function resolveModuleMode(raw) {
23
- if (raw === "" || raw === "bundle")
24
- return "bundle";
25
- if (raw === "source")
26
- return "source";
27
- throw new Error(`unknown --module-mode ${JSON.stringify(raw)}; expected "source" or "bundle"`);
28
- }
29
- async function loadModule(spurBin, mode) {
30
- if (mode === "source")
31
- throw sourceModeError(spurBin);
32
- const bundle = bundleEntry();
33
- if (!existsSync(bundle)) {
34
- throw new Error(`feature-verification-steps: mode=bundle \u2014 the generated inline bundle is missing at ${bundle}` + `${spurBin === "" ? "" : ` (spurBin=${spurBin})`}. ` + "Fix: in a source checkout run `bun run build:bundle`; for an installed plugin reinstall it.");
35
- }
36
- return requireModule(bundle, mode);
37
- }
38
- async function requireModule(entry, mode) {
39
- const mod = await import(entry);
40
- const missing = ["runFeatureVerification"].filter((k) => typeof mod[k] !== "function");
41
- if (missing.length > 0) {
42
- throw new Error(`feature-verification-steps: mode=${mode} \u2014 application entry ${entry} is missing feature-verification seams (${missing.join(", ")}). ` + "Fix: the generated inline bundle is stale or incomplete \u2014 run `bun run build:bundle` in a source checkout, or reinstall the sp plugin.");
43
- }
44
- return mod;
45
- }
46
- async function verify(featureId, runId, cmdOverride, spurBin, mode, confidenceOverride, ackLowConfidence) {
47
- const mod = await loadModule(spurBin, mode);
48
- const result = await mod.runFeatureVerification({
49
- workdir: process.cwd(),
50
- featureId,
51
- runId,
52
- cmdOverride,
53
- confidenceOverride,
54
- ackLowConfidence
55
- });
56
- console.log(`feature-verification-steps: ${featureId} ${result.message}`);
57
- }
58
- function main() {
59
- if (!process.versions.bun) {
60
- const child = spawnSync("bun", [fileURLToPath(import.meta.url), ...process.argv.slice(2)], {
61
- stdio: "inherit"
62
- });
63
- if (child.error)
64
- console.error(`feature-verification-steps requires Bun on PATH: ${child.error.message}`);
65
- process.exit(child.status ?? 1);
66
- }
67
- const args = process.argv.slice(2);
68
- const command = args[0];
69
- const flag = (name) => {
70
- const i = args.indexOf(name);
71
- return i >= 0 && i + 1 < args.length ? args[i + 1] ?? "" : "";
72
- };
73
- if (command !== "verify") {
74
- console.error("Usage: feature-verification-steps.ts verify --feature-id <id> --run-id <id> [--cmd <command>] [--confidence HIGH|MEDIUM|LOW] [--ack-low-confidence]");
75
- process.exit(2);
76
- }
77
- verify(flag("--feature-id") || getEnvVar("featureId") || "", flag("--run-id") || getEnvVar("__runId") || "", flag("--cmd") || getEnvVar("verificationCmd") || "", flag("--spur-bin") || getEnvVar("spurBin") || "", resolveModuleMode(flag("--module-mode")), flag("--confidence") || getEnvVar("confidence") || "", args.includes("--ack-low-confidence") || getEnvVar("ackLowConfidence") === "true").then(() => process.exit(0)).catch((err) => {
78
- console.error(`feature-verification-steps: ${String(err)}`);
79
- process.exit(1);
80
- });
81
- }
82
- main();
@@ -1,164 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * feature-verification-steps — argv adapter for the feature-verification pass (task 0915; reduced to
4
- * an adapter in task 1176).
5
- *
6
- * The pass itself — resolve the selected `feature-verification` definition, capture the before
7
- * proof-input digest, record and register the RUNNING receipt, run the effective command through the
8
- * safe argv splitter (never `sh -c`), compare the after digest, complete PASS/FAIL plus the coarse
9
- * status file — lives in the application operation
10
- * `packages/app/src/workflow/feature-verification-run.ts`, reached through the generated inline
11
- * bundle. This entry owns argv, usage and exit codes only: it opens no project DB, constructs no
12
- * `ArtifactDao`, and scans no feature directory (that lookup is app-owned too).
13
- *
14
- * Usage (workflow onEnter, vars: featureId, verificationCmd, spurBin, __runId):
15
- * bun plugins/sp/scripts/feature-verification-steps.ts verify \
16
- * --feature-id D63 --run-id <runId> [--cmd "bun run spur-check-feature"] [--module-mode bundle]
17
- *
18
- * Always exits 0 after a completed pass; the transition guard reads the status file and the
19
- * completion boundary validates the receipt (fail-closed). Unsafe ids are refused by the operation.
20
- *
21
- * The installed `.mjs` twin may be launched with plain `node` (the `feature-verification` workflow
22
- * selects `installed -> node`), but the generated inline bundle keeps `bun:sqlite` external by design, so the
23
- * twin re-enters Bun at the top of `main()` (task 1197). Unlike daily-summary it fails closed when Bun
24
- * is missing — a verifier that cannot load its bundle cannot run the checks.
25
- *
26
- * Node-builtin imports only (ADR-065); the application seams come from the generated inline bundle,
27
- * never from `packages/app/src/index.ts`, which is not a plugin-script contract surface (0948 R3).
28
- */
29
-
30
- import { spawnSync } from 'node:child_process';
31
- import { existsSync } from 'node:fs';
32
- import { fileURLToPath } from 'node:url';
33
- import { getEnvVar } from '../lib/env';
34
-
35
- /** Shape of the generated inline bundle / repo app source this script consumes. */
36
- interface VerificationModule {
37
- runFeatureVerification: typeof import('../../../packages/app/src/workflow/feature-verification-run')['runFeatureVerification'];
38
- }
39
-
40
- /** Explicit module surface. Source is not the contract; the generated bundle is (0948 R3). */
41
- type ModuleMode = 'source' | 'bundle';
42
-
43
- function bundleEntry(): string {
44
- return fileURLToPath(new URL('../lib/inline-run.generated.mjs', import.meta.url));
45
- }
46
-
47
- /**
48
- * Source mode names the mode and the fix. The app source entry does not export the verification
49
- * operation, and "rebuild/install the sp plugin" cannot add it.
50
- */
51
- function sourceModeError(spurBin: string): Error {
52
- return new Error(
53
- `source mode: refusing to load packages/app/src/index.ts (spurBin=${JSON.stringify(spurBin)}). ` +
54
- 'That entry is not the feature-verification contract surface — it does not export ' +
55
- 'runFeatureVerification. Fix: run in bundle mode so ' +
56
- 'plugins/sp/lib/inline-run.generated.mjs is loaded (omit --module-mode, or pass --module-mode bundle) ' +
57
- 'and regenerate that bundle if it is missing. Reinstalling the sp plugin does not add the operation to the app source entry.',
58
- );
59
- }
60
-
61
- function resolveModuleMode(raw: string): ModuleMode {
62
- if (raw === '' || raw === 'bundle') return 'bundle';
63
- if (raw === 'source') return 'source';
64
- throw new Error(`unknown --module-mode ${JSON.stringify(raw)}; expected "source" or "bundle"`);
65
- }
66
-
67
- /**
68
- * Bundle mode loads the generated inline bundle. Source mode fails closed with a named fix.
69
- *
70
- * `spurBin` no longer selects the module (it named the *caller's* CLI entry, not this script's runtime
71
- * surface); it is kept only to make the failure message actionable.
72
- */
73
- async function loadModule(spurBin: string, mode: ModuleMode): Promise<VerificationModule> {
74
- if (mode === 'source') throw sourceModeError(spurBin);
75
- const bundle = bundleEntry();
76
- if (!existsSync(bundle)) {
77
- throw new Error(
78
- `feature-verification-steps: mode=bundle — the generated inline bundle is missing at ${bundle}` +
79
- `${spurBin === '' ? '' : ` (spurBin=${spurBin})`}. ` +
80
- 'Fix: in a source checkout run `bun run build:bundle`; for an installed plugin reinstall it.',
81
- );
82
- }
83
- return requireModule(bundle, mode);
84
- }
85
-
86
- /** Dynamic-import the entry and refuse a module missing the verification operation. */
87
- async function requireModule(entry: string, mode: ModuleMode): Promise<VerificationModule> {
88
- const mod = (await import(entry)) as Partial<VerificationModule> & Record<string, unknown>;
89
- const missing = (['runFeatureVerification'] as const).filter((k) => typeof mod[k] !== 'function');
90
- if (missing.length > 0) {
91
- throw new Error(
92
- `feature-verification-steps: mode=${mode} — application entry ${entry} is missing feature-verification seams (${missing.join(', ')}). ` +
93
- 'Fix: the generated inline bundle is stale or incomplete — run `bun run build:bundle` in a source checkout, or reinstall the sp plugin.',
94
- );
95
- }
96
- return mod as VerificationModule;
97
- }
98
-
99
- /** One full verification pass for one feature. Always exits 0. */
100
- async function verify(
101
- featureId: string,
102
- runId: string,
103
- cmdOverride: string,
104
- spurBin: string,
105
- mode: ModuleMode,
106
- confidenceOverride: string,
107
- ackLowConfidence: boolean,
108
- ): Promise<void> {
109
- const mod = await loadModule(spurBin, mode);
110
- const result = await mod.runFeatureVerification({
111
- workdir: process.cwd(),
112
- featureId,
113
- runId,
114
- cmdOverride,
115
- // Operator-declared level (empty = derive from the pass) and the acknowledgement of a LOW
116
- // level. Both ride the receipt, so the completion boundary reads them from the evidence
117
- // rather than from whatever flags a later transition happens to pass.
118
- confidenceOverride,
119
- ackLowConfidence,
120
- });
121
- console.log(`feature-verification-steps: ${featureId} ${result.message}`);
122
- }
123
-
124
- function main(): void {
125
- // The portable Node twin has no workspace imports; the generated bundle still uses Spur's Bun
126
- // runtime (bun:sqlite stays external by design). Re-enter Bun before any app import; fail closed
127
- // when Bun is missing — the verifier must not report a pass it could not run.
128
- if (!process.versions.bun) {
129
- const child = spawnSync('bun', [fileURLToPath(import.meta.url), ...process.argv.slice(2)], {
130
- stdio: 'inherit',
131
- });
132
- if (child.error) console.error(`feature-verification-steps requires Bun on PATH: ${child.error.message}`);
133
- process.exit(child.status ?? 1);
134
- }
135
- const args = process.argv.slice(2);
136
- const command = args[0];
137
- const flag = (name: string): string => {
138
- const i = args.indexOf(name);
139
- return i >= 0 && i + 1 < args.length ? (args[i + 1] ?? '') : '';
140
- };
141
- if (command !== 'verify') {
142
- console.error(
143
- 'Usage: feature-verification-steps.ts verify --feature-id <id> --run-id <id> [--cmd <command>] ' +
144
- '[--confidence HIGH|MEDIUM|LOW] [--ack-low-confidence]',
145
- );
146
- process.exit(2);
147
- }
148
- verify(
149
- flag('--feature-id') || getEnvVar('featureId') || '',
150
- flag('--run-id') || getEnvVar('__runId') || '',
151
- flag('--cmd') || getEnvVar('verificationCmd') || '',
152
- flag('--spur-bin') || getEnvVar('spurBin') || '',
153
- resolveModuleMode(flag('--module-mode')),
154
- flag('--confidence') || getEnvVar('confidence') || '',
155
- args.includes('--ack-low-confidence') || getEnvVar('ackLowConfidence') === 'true',
156
- )
157
- .then(() => process.exit(0))
158
- .catch((err: unknown) => {
159
- console.error(`feature-verification-steps: ${String(err)}`);
160
- process.exit(1);
161
- });
162
- }
163
-
164
- main();