@gobing-ai/spur 0.4.3 → 0.4.4

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 (117) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/rules/docs/verdict-confidence.yaml +68 -0
  3. package/config/rules/quality/coverage-gate.yaml +13 -0
  4. package/config/rules/recommended-pre-check.yaml +6 -2
  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 +15 -9
  11. package/package.json +10 -10
  12. package/plugins/sp/agents/super-reviewer.md +5 -2
  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.d.mts +13 -0
  27. package/plugins/sp/lib/residual-scan.generated.mjs +51 -21
  28. package/plugins/sp/lib/step-profile.generated.mjs +8 -8
  29. package/plugins/sp/plugin.json +1 -1
  30. package/plugins/sp/scripts/batch-plan.mjs +62 -40
  31. package/plugins/sp/scripts/batch-preflight.mjs +34 -12
  32. package/plugins/sp/scripts/commit-guard.mjs +6 -6
  33. package/plugins/sp/scripts/daily-summary/daily-summary.mjs +26 -28
  34. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +11 -11
  35. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +4 -4
  36. package/plugins/sp/scripts/feature-verification-steps.mjs +15 -4
  37. package/plugins/sp/scripts/feature-verification-steps.ts +29 -1
  38. package/plugins/sp/scripts/history-anatomy-cache.mjs +19 -19
  39. package/plugins/sp/scripts/idea-handoff.mjs +2 -2
  40. package/plugins/sp/scripts/inline-run-dispatch.mjs +2 -2
  41. package/plugins/sp/scripts/inline-run-setup.mjs +20 -20
  42. package/plugins/sp/scripts/persist-out-check.mjs +5 -5
  43. package/plugins/sp/scripts/pr-reviewing.mjs +13 -13
  44. package/plugins/sp/scripts/quality-gate.mjs +13715 -13884
  45. package/plugins/sp/scripts/residual-scan.mjs +58 -27
  46. package/plugins/sp/scripts/residual-scan.ts +8 -8
  47. package/plugins/sp/scripts/run-summary.mjs +15 -15
  48. package/plugins/sp/scripts/script-root.mjs +6 -6
  49. package/plugins/sp/scripts/session-timeline.mjs +16 -16
  50. package/plugins/sp/scripts/task-diffstat.mjs +8 -8
  51. package/plugins/sp/scripts/workflow-step-profile.mjs +12 -12
  52. package/plugins/sp/scripts/wrapup-drift-probe.mjs +9 -9
  53. package/plugins/sp/scripts/wrapup-steps.mjs +25 -25
  54. package/plugins/sp/skills/next-router/SKILL.md +3 -1
  55. package/plugins/sp/skills/next-router/references/routing-table.md +9 -3
  56. package/plugins/sp/skills/spur-cli/references/tasks.md +24 -4
  57. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +8 -1
  58. package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -11
  59. package/plugins/sp/skills/spur-dev/references/execution-batch.md +6 -3
  60. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +4 -2
  61. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +22 -2
  62. package/schemas/section-matrix.schema.json +3 -2
  63. package/spur.js +24403 -32459
  64. package/web/_astro/{BoardApp.5IIl2O-z.js → BoardApp.Niubpe6z.js} +1 -1
  65. package/web/_astro/{BoardApp.Drnx-KeM.js → BoardApp.hF0RAIrg.js} +112 -112
  66. package/web/_astro/TaskDetail.DJpapt38.js +1 -0
  67. package/web/_astro/{arc.j2EVkYVd.js → arc.BgKcK0i8.js} +1 -1
  68. package/web/_astro/{architectureDiagram-3BPJPVTR.DZWSFqEG.js → architectureDiagram-3BPJPVTR.ChP-Ig0V.js} +1 -1
  69. package/web/_astro/{blockDiagram-GPEHLZMM.DE6GpXCN.js → blockDiagram-GPEHLZMM.BVaCBoeN.js} +1 -1
  70. package/web/_astro/{c4Diagram-AAUBKEIU.DoVR1G6B.js → c4Diagram-AAUBKEIU.CHSDpEO5.js} +1 -1
  71. package/web/_astro/channel.DkpvN2tD.js +1 -0
  72. package/web/_astro/{chunk-2J33WTMH.Do6-Gbyf.js → chunk-2J33WTMH.MYRcYVRa.js} +1 -1
  73. package/web/_astro/{chunk-4BX2VUAB.BYV1HGHx.js → chunk-4BX2VUAB.S5j22Zqa.js} +1 -1
  74. package/web/_astro/{chunk-55IACEB6.CvI1zkrc.js → chunk-55IACEB6.gciRPvmZ.js} +1 -1
  75. package/web/_astro/{chunk-727SXJPM.DNGSCRlX.js → chunk-727SXJPM.CdqrSQkX.js} +1 -1
  76. package/web/_astro/{chunk-AQP2D5EJ.DXhhgT5z.js → chunk-AQP2D5EJ.CyokdHT3.js} +1 -1
  77. package/web/_astro/{chunk-FMBD7UC4.dzkRKP2u.js → chunk-FMBD7UC4.Bg9KJhjW.js} +1 -1
  78. package/web/_astro/{chunk-ND2GUHAM.DujGLeEf.js → chunk-ND2GUHAM.1gxxI-vD.js} +1 -1
  79. package/web/_astro/{chunk-QZHKN3VN.BWtIT3ZU.js → chunk-QZHKN3VN.DDEYtCKU.js} +1 -1
  80. package/web/_astro/{classDiagram-4FO5ZUOK.DyApg0Nn.js → classDiagram-4FO5ZUOK.Ch3zi37T.js} +1 -1
  81. package/web/_astro/{classDiagram-v2-Q7XG4LA2.DyApg0Nn.js → classDiagram-v2-Q7XG4LA2.Ch3zi37T.js} +1 -1
  82. package/web/_astro/{cose-bilkent-S5V4N54A.DJQB-u_l.js → cose-bilkent-S5V4N54A.D2q5AINI.js} +1 -1
  83. package/web/_astro/{cynefin-OW5HDTMX.bi3D_siV.js → cynefin-OW5HDTMX.BA9kC2YT.js} +1 -1
  84. package/web/_astro/{dagre-BM42HDAG.C-f7TrRg.js → dagre-BM42HDAG.CHO08nRp.js} +1 -1
  85. package/web/_astro/{diagram-2AECGRRQ.DrPfjHQB.js → diagram-2AECGRRQ.BfFQt0LW.js} +1 -1
  86. package/web/_astro/{diagram-5GNKFQAL.C9S4WUHO.js → diagram-5GNKFQAL.CHMwMTe4.js} +1 -1
  87. package/web/_astro/{diagram-KO2AKTUF.Dzzye8QH.js → diagram-KO2AKTUF.BJ-7gK-w.js} +1 -1
  88. package/web/_astro/{diagram-LMA3HP47.DX-LRiof.js → diagram-LMA3HP47.C5xqcc0t.js} +1 -1
  89. package/web/_astro/{diagram-OG6HWLK6.Z-kAKwIz.js → diagram-OG6HWLK6.C2pQjfrC.js} +1 -1
  90. package/web/_astro/{erDiagram-TEJ5UH35.D6dyClSv.js → erDiagram-TEJ5UH35._FoNyxgC.js} +1 -1
  91. package/web/_astro/{flowDiagram-I6XJVG4X.Cx3q2cxD.js → flowDiagram-I6XJVG4X.B_ENkT2I.js} +1 -1
  92. package/web/_astro/{ganttDiagram-6RSMTGT7.DU3gH6CT.js → ganttDiagram-6RSMTGT7.B3q8h77C.js} +1 -1
  93. package/web/_astro/{gitGraphDiagram-PVQCEYII.ISmCnJ87.js → gitGraphDiagram-PVQCEYII.QWZFDboZ.js} +1 -1
  94. package/web/_astro/index.BFyW13JJ.css +1 -0
  95. package/web/_astro/{infoDiagram-5YYISTIA.DR6_iNOK.js → infoDiagram-5YYISTIA.Cs6eEc92.js} +1 -1
  96. package/web/_astro/{ishikawaDiagram-YF4QCWOH.D7wY-ZGA.js → ishikawaDiagram-YF4QCWOH.BU9DJMHA.js} +1 -1
  97. package/web/_astro/{journeyDiagram-JHISSGLW.DkP9-WK8.js → journeyDiagram-JHISSGLW.D35k6Jpe.js} +1 -1
  98. package/web/_astro/{kanban-definition-UN3LZRKU.wtgY98M2.js → kanban-definition-UN3LZRKU.DBqcAT4m.js} +1 -1
  99. package/web/_astro/{linear.CI6djNi7.js → linear.D-LSNK8W.js} +1 -1
  100. package/web/_astro/{mermaid.core.CuQPxS8b.js → mermaid.core.CSruWVOa.js} +4 -4
  101. package/web/_astro/{mindmap-definition-RKZ34NQL.5HNIEG7R.js → mindmap-definition-RKZ34NQL.BiFaUsfj.js} +1 -1
  102. package/web/_astro/{pieDiagram-4H26LBE5.CchhDFjE.js → pieDiagram-4H26LBE5.D1KTKqb9.js} +1 -1
  103. package/web/_astro/{quadrantDiagram-W4KKPZXB.PYXXJPSJ.js → quadrantDiagram-W4KKPZXB.DBHflsMG.js} +1 -1
  104. package/web/_astro/{requirementDiagram-4Y6WPE33.cUQuNAKU.js → requirementDiagram-4Y6WPE33.hwX9CNdk.js} +1 -1
  105. package/web/_astro/{sankeyDiagram-5OEKKPKP.BO7MnRIA.js → sankeyDiagram-5OEKKPKP.DkI8mJiE.js} +1 -1
  106. package/web/_astro/{sequenceDiagram-3UESZ5HK.D9bElyD6.js → sequenceDiagram-3UESZ5HK.DMz7jBDx.js} +1 -1
  107. package/web/_astro/{stateDiagram-AJRCARHV.DhGdRz7I.js → stateDiagram-AJRCARHV.B6Ef2xJ1.js} +1 -1
  108. package/web/_astro/{stateDiagram-v2-BHNVJYJU.5GvLeAoL.js → stateDiagram-v2-BHNVJYJU.CgoaufB9.js} +1 -1
  109. package/web/_astro/{timeline-definition-PNZ67QCA.LtAT9haM.js → timeline-definition-PNZ67QCA.B3c8h1t-.js} +1 -1
  110. package/web/_astro/{vennDiagram-CIIHVFJN.DRth1yLA.js → vennDiagram-CIIHVFJN.BdHPAxAb.js} +1 -1
  111. package/web/_astro/{wardleyDiagram-YWT4CUSO.h9MlZfcr.js → wardleyDiagram-YWT4CUSO.BrJXPPAj.js} +1 -1
  112. package/web/_astro/{xychartDiagram-2RQKCTM6.DHqy9DYA.js → xychartDiagram-2RQKCTM6.CMH5yFsV.js} +1 -1
  113. package/web/index.html +2 -2
  114. package/web/spur_logo.svg +1 -1
  115. package/web/_astro/TaskDetail.Ci4LNn9S.js +0 -1
  116. package/web/_astro/channel.DmdDxGsq.js +0 -1
  117. package/web/_astro/index.Do2lLdgo.css +0 -1
@@ -18,10 +18,16 @@
18
18
  * Always exits 0 after a completed pass; the transition guard reads the status file and the
19
19
  * completion boundary validates the receipt (fail-closed). Unsafe ids are refused by the operation.
20
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
+ *
21
26
  * Node-builtin imports only (ADR-065); the application seams come from the generated inline bundle,
22
27
  * never from `packages/app/src/index.ts`, which is not a plugin-script contract surface (0948 R3).
23
28
  */
24
29
 
30
+ import { spawnSync } from 'node:child_process';
25
31
  import { existsSync } from 'node:fs';
26
32
  import { fileURLToPath } from 'node:url';
27
33
  import { getEnvVar } from '../lib/env';
@@ -97,6 +103,8 @@ async function verify(
97
103
  cmdOverride: string,
98
104
  spurBin: string,
99
105
  mode: ModuleMode,
106
+ confidenceOverride: string,
107
+ ackLowConfidence: boolean,
100
108
  ): Promise<void> {
101
109
  const mod = await loadModule(spurBin, mode);
102
110
  const result = await mod.runFeatureVerification({
@@ -104,11 +112,26 @@ async function verify(
104
112
  featureId,
105
113
  runId,
106
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,
107
120
  });
108
121
  console.log(`feature-verification-steps: ${featureId} ${result.message}`);
109
122
  }
110
123
 
111
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
+ }
112
135
  const args = process.argv.slice(2);
113
136
  const command = args[0];
114
137
  const flag = (name: string): string => {
@@ -116,7 +139,10 @@ function main(): void {
116
139
  return i >= 0 && i + 1 < args.length ? (args[i + 1] ?? '') : '';
117
140
  };
118
141
  if (command !== 'verify') {
119
- console.error('Usage: feature-verification-steps.ts verify --feature-id <id> --run-id <id> [--cmd <command>]');
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
+ );
120
146
  process.exit(2);
121
147
  }
122
148
  verify(
@@ -125,6 +151,8 @@ function main(): void {
125
151
  flag('--cmd') || getEnvVar('verificationCmd') || '',
126
152
  flag('--spur-bin') || getEnvVar('spurBin') || '',
127
153
  resolveModuleMode(flag('--module-mode')),
154
+ flag('--confidence') || getEnvVar('confidence') || '',
155
+ args.includes('--ack-low-confidence') || getEnvVar('ackLowConfidence') === 'true',
128
156
  )
129
157
  .then(() => process.exit(0))
130
158
  .catch((err: unknown) => {
@@ -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
  };