@gobing-ai/spur 0.4.3 → 0.4.5

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 (119) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/rules/docs/sourced-api-claims.yaml +3 -2
  3. package/config/rules/quality/coverage-gate.yaml +13 -0
  4. package/config/rules/recommended-pre-check.yaml +11 -5
  5. package/config/rules/strict/runtime-boundaries.yaml +3 -0
  6. package/config/rules/surface/check-cli-surface.yaml +1 -3
  7. package/config/templates/AGENTS.md +7 -0
  8. package/config/workflows/feature-verification.yaml +9 -1
  9. package/config/workflows/task-lifecycle.yaml +50 -0
  10. package/config/workflows/task-pipeline.yaml +31 -65
  11. package/package.json +10 -10
  12. package/plugins/sp/agents/super-reviewer.md +11 -24
  13. package/plugins/sp/commands/dev-changelog.md +1 -1
  14. package/plugins/sp/commands/dev-gitmsg.md +6 -2
  15. package/plugins/sp/commands/dev-handover.md +1 -0
  16. package/plugins/sp/commands/dev-job-dump.md +2 -1
  17. package/plugins/sp/commands/dev-refine.md +14 -2
  18. package/plugins/sp/commands/dev-refineall.md +7 -1
  19. package/plugins/sp/commands/dev-review.md +1 -0
  20. package/plugins/sp/lib/history-anatomy.generated.mjs +18 -18
  21. package/plugins/sp/lib/idea-handoff.generated.mjs +91 -91
  22. package/plugins/sp/lib/inline-run.generated.mjs +233 -277
  23. package/plugins/sp/lib/plan-projection.generated.mjs +62 -38
  24. package/plugins/sp/lib/quality-gate.generated.d.mts +1 -0
  25. package/plugins/sp/lib/quality-gate.generated.mjs +13793 -13966
  26. package/plugins/sp/lib/residual-scan.generated.mjs +20 -34
  27. package/plugins/sp/lib/step-profile.generated.mjs +8 -8
  28. package/plugins/sp/plugin.json +1 -1
  29. package/plugins/sp/scripts/batch-plan.mjs +62 -40
  30. package/plugins/sp/scripts/batch-preflight.mjs +34 -12
  31. package/plugins/sp/scripts/commit-guard.mjs +6 -6
  32. package/plugins/sp/scripts/daily-summary/daily-summary.mjs +26 -28
  33. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +11 -11
  34. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +4 -4
  35. package/plugins/sp/scripts/feature-verification-steps.mjs +15 -4
  36. package/plugins/sp/scripts/feature-verification-steps.ts +29 -1
  37. package/plugins/sp/scripts/history-anatomy-cache.mjs +19 -19
  38. package/plugins/sp/scripts/idea-handoff.mjs +2 -2
  39. package/plugins/sp/scripts/inline-run-dispatch.mjs +2 -2
  40. package/plugins/sp/scripts/inline-run-setup.mjs +20 -20
  41. package/plugins/sp/scripts/persist-out-check.mjs +5 -5
  42. package/plugins/sp/scripts/pr-reviewing.mjs +13 -13
  43. package/plugins/sp/scripts/quality-gate.mjs +13715 -13884
  44. package/plugins/sp/scripts/residual-scan.mjs +24 -38
  45. package/plugins/sp/scripts/residual-scan.ts +4 -6
  46. package/plugins/sp/scripts/run-summary.mjs +15 -15
  47. package/plugins/sp/scripts/script-root.mjs +6 -6
  48. package/plugins/sp/scripts/session-timeline.mjs +16 -16
  49. package/plugins/sp/scripts/task-diffstat.mjs +8 -8
  50. package/plugins/sp/scripts/workflow-step-profile.mjs +12 -12
  51. package/plugins/sp/scripts/wrapup-drift-probe.mjs +9 -9
  52. package/plugins/sp/scripts/wrapup-steps.mjs +25 -25
  53. package/plugins/sp/skills/code-verification/SKILL.md +1 -2
  54. package/plugins/sp/skills/code-verification/references/verdict-schema.md +11 -32
  55. package/plugins/sp/skills/next-router/SKILL.md +3 -1
  56. package/plugins/sp/skills/next-router/references/routing-table.md +9 -3
  57. package/plugins/sp/skills/spur-cli/references/tasks.md +24 -4
  58. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +8 -1
  59. package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -11
  60. package/plugins/sp/skills/spur-dev/references/execution-batch.md +6 -3
  61. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +7 -11
  62. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +4 -2
  63. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +29 -8
  64. package/schemas/section-matrix.schema.json +3 -2
  65. package/spur.js +24597 -32769
  66. package/web/_astro/{BoardApp.5IIl2O-z.js → BoardApp.Niubpe6z.js} +1 -1
  67. package/web/_astro/{BoardApp.Drnx-KeM.js → BoardApp.hF0RAIrg.js} +112 -112
  68. package/web/_astro/TaskDetail.DJpapt38.js +1 -0
  69. package/web/_astro/{arc.j2EVkYVd.js → arc.BgKcK0i8.js} +1 -1
  70. package/web/_astro/{architectureDiagram-3BPJPVTR.DZWSFqEG.js → architectureDiagram-3BPJPVTR.ChP-Ig0V.js} +1 -1
  71. package/web/_astro/{blockDiagram-GPEHLZMM.DE6GpXCN.js → blockDiagram-GPEHLZMM.BVaCBoeN.js} +1 -1
  72. package/web/_astro/{c4Diagram-AAUBKEIU.DoVR1G6B.js → c4Diagram-AAUBKEIU.CHSDpEO5.js} +1 -1
  73. package/web/_astro/channel.DkpvN2tD.js +1 -0
  74. package/web/_astro/{chunk-2J33WTMH.Do6-Gbyf.js → chunk-2J33WTMH.MYRcYVRa.js} +1 -1
  75. package/web/_astro/{chunk-4BX2VUAB.BYV1HGHx.js → chunk-4BX2VUAB.S5j22Zqa.js} +1 -1
  76. package/web/_astro/{chunk-55IACEB6.CvI1zkrc.js → chunk-55IACEB6.gciRPvmZ.js} +1 -1
  77. package/web/_astro/{chunk-727SXJPM.DNGSCRlX.js → chunk-727SXJPM.CdqrSQkX.js} +1 -1
  78. package/web/_astro/{chunk-AQP2D5EJ.DXhhgT5z.js → chunk-AQP2D5EJ.CyokdHT3.js} +1 -1
  79. package/web/_astro/{chunk-FMBD7UC4.dzkRKP2u.js → chunk-FMBD7UC4.Bg9KJhjW.js} +1 -1
  80. package/web/_astro/{chunk-ND2GUHAM.DujGLeEf.js → chunk-ND2GUHAM.1gxxI-vD.js} +1 -1
  81. package/web/_astro/{chunk-QZHKN3VN.BWtIT3ZU.js → chunk-QZHKN3VN.DDEYtCKU.js} +1 -1
  82. package/web/_astro/{classDiagram-4FO5ZUOK.DyApg0Nn.js → classDiagram-4FO5ZUOK.Ch3zi37T.js} +1 -1
  83. package/web/_astro/{classDiagram-v2-Q7XG4LA2.DyApg0Nn.js → classDiagram-v2-Q7XG4LA2.Ch3zi37T.js} +1 -1
  84. package/web/_astro/{cose-bilkent-S5V4N54A.DJQB-u_l.js → cose-bilkent-S5V4N54A.D2q5AINI.js} +1 -1
  85. package/web/_astro/{cynefin-OW5HDTMX.bi3D_siV.js → cynefin-OW5HDTMX.BA9kC2YT.js} +1 -1
  86. package/web/_astro/{dagre-BM42HDAG.C-f7TrRg.js → dagre-BM42HDAG.CHO08nRp.js} +1 -1
  87. package/web/_astro/{diagram-2AECGRRQ.DrPfjHQB.js → diagram-2AECGRRQ.BfFQt0LW.js} +1 -1
  88. package/web/_astro/{diagram-5GNKFQAL.C9S4WUHO.js → diagram-5GNKFQAL.CHMwMTe4.js} +1 -1
  89. package/web/_astro/{diagram-KO2AKTUF.Dzzye8QH.js → diagram-KO2AKTUF.BJ-7gK-w.js} +1 -1
  90. package/web/_astro/{diagram-LMA3HP47.DX-LRiof.js → diagram-LMA3HP47.C5xqcc0t.js} +1 -1
  91. package/web/_astro/{diagram-OG6HWLK6.Z-kAKwIz.js → diagram-OG6HWLK6.C2pQjfrC.js} +1 -1
  92. package/web/_astro/{erDiagram-TEJ5UH35.D6dyClSv.js → erDiagram-TEJ5UH35._FoNyxgC.js} +1 -1
  93. package/web/_astro/{flowDiagram-I6XJVG4X.Cx3q2cxD.js → flowDiagram-I6XJVG4X.B_ENkT2I.js} +1 -1
  94. package/web/_astro/{ganttDiagram-6RSMTGT7.DU3gH6CT.js → ganttDiagram-6RSMTGT7.B3q8h77C.js} +1 -1
  95. package/web/_astro/{gitGraphDiagram-PVQCEYII.ISmCnJ87.js → gitGraphDiagram-PVQCEYII.QWZFDboZ.js} +1 -1
  96. package/web/_astro/index.BFyW13JJ.css +1 -0
  97. package/web/_astro/{infoDiagram-5YYISTIA.DR6_iNOK.js → infoDiagram-5YYISTIA.Cs6eEc92.js} +1 -1
  98. package/web/_astro/{ishikawaDiagram-YF4QCWOH.D7wY-ZGA.js → ishikawaDiagram-YF4QCWOH.BU9DJMHA.js} +1 -1
  99. package/web/_astro/{journeyDiagram-JHISSGLW.DkP9-WK8.js → journeyDiagram-JHISSGLW.D35k6Jpe.js} +1 -1
  100. package/web/_astro/{kanban-definition-UN3LZRKU.wtgY98M2.js → kanban-definition-UN3LZRKU.DBqcAT4m.js} +1 -1
  101. package/web/_astro/{linear.CI6djNi7.js → linear.D-LSNK8W.js} +1 -1
  102. package/web/_astro/{mermaid.core.CuQPxS8b.js → mermaid.core.CSruWVOa.js} +4 -4
  103. package/web/_astro/{mindmap-definition-RKZ34NQL.5HNIEG7R.js → mindmap-definition-RKZ34NQL.BiFaUsfj.js} +1 -1
  104. package/web/_astro/{pieDiagram-4H26LBE5.CchhDFjE.js → pieDiagram-4H26LBE5.D1KTKqb9.js} +1 -1
  105. package/web/_astro/{quadrantDiagram-W4KKPZXB.PYXXJPSJ.js → quadrantDiagram-W4KKPZXB.DBHflsMG.js} +1 -1
  106. package/web/_astro/{requirementDiagram-4Y6WPE33.cUQuNAKU.js → requirementDiagram-4Y6WPE33.hwX9CNdk.js} +1 -1
  107. package/web/_astro/{sankeyDiagram-5OEKKPKP.BO7MnRIA.js → sankeyDiagram-5OEKKPKP.DkI8mJiE.js} +1 -1
  108. package/web/_astro/{sequenceDiagram-3UESZ5HK.D9bElyD6.js → sequenceDiagram-3UESZ5HK.DMz7jBDx.js} +1 -1
  109. package/web/_astro/{stateDiagram-AJRCARHV.DhGdRz7I.js → stateDiagram-AJRCARHV.B6Ef2xJ1.js} +1 -1
  110. package/web/_astro/{stateDiagram-v2-BHNVJYJU.5GvLeAoL.js → stateDiagram-v2-BHNVJYJU.CgoaufB9.js} +1 -1
  111. package/web/_astro/{timeline-definition-PNZ67QCA.LtAT9haM.js → timeline-definition-PNZ67QCA.B3c8h1t-.js} +1 -1
  112. package/web/_astro/{vennDiagram-CIIHVFJN.DRth1yLA.js → vennDiagram-CIIHVFJN.BdHPAxAb.js} +1 -1
  113. package/web/_astro/{wardleyDiagram-YWT4CUSO.h9MlZfcr.js → wardleyDiagram-YWT4CUSO.BrJXPPAj.js} +1 -1
  114. package/web/_astro/{xychartDiagram-2RQKCTM6.DHqy9DYA.js → xychartDiagram-2RQKCTM6.CMH5yFsV.js} +1 -1
  115. package/web/index.html +2 -2
  116. package/web/spur_logo.svg +1 -1
  117. package/web/_astro/TaskDetail.Ci4LNn9S.js +0 -1
  118. package/web/_astro/channel.DmdDxGsq.js +0 -1
  119. package/web/_astro/index.Do2lLdgo.css +0 -1
@@ -908,24 +908,24 @@ ${reasons}`, stderr: "" };
908
908
  process.exitCode = exitCode;
909
909
  }
910
910
  export {
911
- validateSelector,
912
- stampReport,
913
- semanticArtifactDigest,
914
- runCacheCli,
915
- resolvePaths,
916
- renderProvenanceFrontmatter,
917
- refreshReport,
918
- publishAtomically,
919
- probe,
920
- porcelainPaths,
921
- parseProvenance,
922
- logicDigest,
923
- importedSnapshotAsOf,
924
- diffPorcelain,
925
- decideCache,
926
- checkReportStructure,
927
- buildProvenance,
928
- bannerLine,
911
+ FINDING_FIELDS,
929
912
  REPORT_SECTIONS,
930
- FINDING_FIELDS
913
+ bannerLine,
914
+ buildProvenance,
915
+ checkReportStructure,
916
+ decideCache,
917
+ diffPorcelain,
918
+ importedSnapshotAsOf,
919
+ logicDigest,
920
+ parseProvenance,
921
+ porcelainPaths,
922
+ probe,
923
+ publishAtomically,
924
+ refreshReport,
925
+ renderProvenanceFrontmatter,
926
+ resolvePaths,
927
+ runCacheCli,
928
+ semanticArtifactDigest,
929
+ stampReport,
930
+ validateSelector
931
931
  };
@@ -26,7 +26,7 @@ async function main(argv, env = getEnvVars()) {
26
26
  process.exit(await main(process.argv.slice(2)));
27
27
  }
28
28
  export {
29
- main,
29
+ IDEA_HANDOFF_USAGE,
30
30
  loadHandoffLib,
31
- IDEA_HANDOFF_USAGE
31
+ main
32
32
  };
@@ -34,8 +34,8 @@ function resolveAppEntry(spurBin) {
34
34
  }
35
35
  return { entry, portable: true };
36
36
  }
37
- async function loadInlineApp(spurBin, resolveAppEntry2, required) {
38
- const { entry, portable } = resolveAppEntry2(spurBin);
37
+ async function loadInlineApp(spurBin, resolveAppEntry, required) {
38
+ const { entry, portable } = resolveAppEntry(spurBin);
39
39
  const app = await import(entry);
40
40
  const missing = portable ? required.filter((name) => typeof app[name] !== "function") : [];
41
41
  if (missing.length > 0) {
@@ -34,8 +34,8 @@ function resolveAppEntry(spurBin) {
34
34
  }
35
35
  return { entry, portable: true };
36
36
  }
37
- async function loadInlineApp(spurBin, resolveAppEntry2, required) {
38
- const { entry, portable } = resolveAppEntry2(spurBin);
37
+ async function loadInlineApp(spurBin, resolveAppEntry, required) {
38
+ const { entry, portable } = resolveAppEntry(spurBin);
39
39
  const app = await import(entry);
40
40
  const missing = portable ? required.filter((name) => typeof app[name] !== "function") : [];
41
41
  if (missing.length > 0) {
@@ -149,21 +149,21 @@ function accumulate(acc, row, ts) {
149
149
  if (row.type === "message") {
150
150
  const m = row.message;
151
151
  if (m?.role === "assistant") {
152
- const blocks2 = Array.isArray(m.content) ? m.content : [];
153
- for (const b of blocks2) {
152
+ const blocks = Array.isArray(m.content) ? m.content : [];
153
+ for (const b of blocks) {
154
154
  if (b.type === "toolCall" && b.id) {
155
155
  acc.toolIds.add(b.id);
156
156
  if (b.name && OPERATOR_TOOLS.has(b.name))
157
157
  acc.asks.set(b.id, ts);
158
158
  }
159
159
  }
160
- const u2 = m.usage;
161
- if (u2 && row.id)
160
+ const u = m.usage;
161
+ if (u && row.id)
162
162
  acc.messages.set(row.id, {
163
- input: u2.input ?? 0,
164
- cacheCreate: u2.cacheWrite ?? 0,
165
- cacheRead: u2.cacheRead ?? 0,
166
- output: u2.output ?? 0
163
+ input: u.input ?? 0,
164
+ cacheCreate: u.cacheWrite ?? 0,
165
+ cacheRead: u.cacheRead ?? 0,
166
+ output: u.output ?? 0
167
167
  });
168
168
  } else if (m?.role === "toolResult" && m.toolCallId && acc.asks.has(m.toolCallId)) {
169
169
  acc.askMs += ts - (acc.asks.get(m.toolCallId) ?? ts);
@@ -658,8 +658,8 @@ async function main() {
658
658
  if (fingerprint) {
659
659
  if (runId !== "" || file !== "" || taskFiles.length !== 1 || (taskFiles[0] ?? "").trim() === "")
660
660
  usage();
661
- const { app: app2 } = await loadInlineApp(spurBin, resolveAppEntry, ["runInlineRunFingerprint"]);
662
- process.exit(await app2.runInlineRunFingerprint({ taskFile: taskFiles[0] ?? "", featureFile }));
661
+ const { app } = await loadInlineApp(spurBin, resolveAppEntry, ["runInlineRunFingerprint"]);
662
+ process.exit(await app.runInlineRunFingerprint({ taskFile: taskFiles[0] ?? "", featureFile }));
663
663
  }
664
664
  if (decide) {
665
665
  if (action || close || fingerprint || file !== "" || taskFiles.length > 0)
@@ -669,14 +669,14 @@ async function main() {
669
669
  if (!SAFE_RUN_ID_RE.test(runId))
670
670
  refuseUnsafeRunId(runId);
671
671
  try {
672
- const { app: app2, portable: portable2 } = await loadInlineApp(spurBin, resolveAppEntry, ["runInlineRunDecide"]);
673
- const { app: lib } = await loadInlineApp(spurBin, () => ({ entry: fileURLToPath2(new URL("../lib/inline-run.generated.mjs", import.meta.url)), portable: portable2 }), ["resolveDecideDecisionMakerEnabled", "loadSpurConfig"]);
674
- const loadOpts = portable2 ? { embeddedSchemas: lib.EMBEDDED_SPUR_SCHEMAS } : undefined;
672
+ const { app, portable } = await loadInlineApp(spurBin, resolveAppEntry, ["runInlineRunDecide"]);
673
+ const { app: lib } = await loadInlineApp(spurBin, () => ({ entry: fileURLToPath2(new URL("../lib/inline-run.generated.mjs", import.meta.url)), portable }), ["resolveDecideDecisionMakerEnabled", "loadSpurConfig"]);
674
+ const loadOpts = portable ? { embeddedSchemas: lib.EMBEDDED_SPUR_SCHEMAS } : undefined;
675
675
  const [enabled, spurConfig] = await Promise.all([
676
676
  lib.resolveDecideDecisionMakerEnabled(process.cwd(), loadOpts),
677
677
  lib.loadSpurConfig(process.cwd(), loadOpts)
678
678
  ]);
679
- process.exit(await app2.runInlineRunDecide({ runId, node, optionsFile: optionsJson, enabled, spurConfig }));
679
+ process.exit(await app.runInlineRunDecide({ runId, node, optionsFile: optionsJson, enabled, spurConfig }));
680
680
  } catch (error) {
681
681
  const message = error instanceof Error ? error.message : String(error);
682
682
  process.stdout.write(`${JSON.stringify({ ok: false, runId, error: message })}
@@ -689,15 +689,15 @@ async function main() {
689
689
  usage();
690
690
  if (from.trim() === "" || taskFiles.some((taskFile) => taskFile.trim() === ""))
691
691
  usage();
692
- const { app: app2 } = await loadInlineApp(spurBin, resolveAppEntry, ["runInlineRunPersistOut"]);
693
- process.exit(await app2.runInlineRunPersistOut({ from, taskFiles }));
692
+ const { app } = await loadInlineApp(spurBin, resolveAppEntry, ["runInlineRunPersistOut"]);
693
+ process.exit(await app.runInlineRunPersistOut({ from, taskFiles }));
694
694
  }
695
695
  if (nodeEnter || actionsFile !== "" || action || close) {
696
696
  if (!SAFE_RUN_ID_RE.test(runId))
697
697
  refuseUnsafeRunId(runId);
698
698
  const mode = nodeEnter ? "node-enter" : actionsFile !== "" ? "actions-file" : close ? "close" : "action";
699
- const { app: app2 } = await loadInlineApp(spurBin, resolveAppEntry, ["runInlineRunTraceMode"]);
700
- const code = await app2.runInlineRunTraceMode({
699
+ const { app } = await loadInlineApp(spurBin, resolveAppEntry, ["runInlineRunTraceMode"]);
700
+ const code = await app.runInlineRunTraceMode({
701
701
  mode,
702
702
  runId,
703
703
  node,
@@ -204,10 +204,10 @@ persist-out-check: --from must be an existing worktree directory
204
204
  process.exit(main(process.argv.slice(2)));
205
205
  }
206
206
  export {
207
- wbsOfTaskFile,
208
- persistOutCheckUsage,
209
- main,
210
- listObligations,
207
+ compareTrees,
211
208
  defaultInvokeRoot,
212
- compareTrees
209
+ listObligations,
210
+ main,
211
+ persistOutCheckUsage,
212
+ wbsOfTaskFile
213
213
  };
@@ -695,18 +695,18 @@ function main(argv) {
695
695
  process.exit(main(process.argv.slice(2)));
696
696
  }
697
697
  export {
698
- spawnRunner,
699
- setCommandRunner,
700
- scanHygiene,
701
- renderFindings,
702
- parseArgs,
703
- normalizeFindings,
704
- main,
705
- isHeadReviewed,
706
- isExplicitCleanReview,
707
- isCodexAuthor,
708
- hasCurrentCleanReview,
709
- hasCodeReviewRules,
698
+ buildRequestBody,
710
699
  extractSeverity,
711
- buildRequestBody
700
+ hasCodeReviewRules,
701
+ hasCurrentCleanReview,
702
+ isCodexAuthor,
703
+ isExplicitCleanReview,
704
+ isHeadReviewed,
705
+ main,
706
+ normalizeFindings,
707
+ parseArgs,
708
+ renderFindings,
709
+ scanHygiene,
710
+ setCommandRunner,
711
+ spawnRunner
712
712
  };