specweave 3.1.4 → 3.1.6

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 +2 -2
  2. package/README.md +4 -5
  3. package/bin/specweave.js +18 -1
  4. package/dist/dashboard/assets/index-B4Xv671Q.css +1 -0
  5. package/dist/dashboard/assets/index-VnHjeVmH.js +16 -0
  6. package/dist/dashboard/index.html +2 -2
  7. package/dist/src/cli/commands/card.d.ts.map +1 -1
  8. package/dist/src/cli/commands/card.js +15 -10
  9. package/dist/src/cli/commands/card.js.map +1 -1
  10. package/dist/src/cli/commands/complete.d.ts.map +1 -1
  11. package/dist/src/cli/commands/complete.js +6 -0
  12. package/dist/src/cli/commands/complete.js.map +1 -1
  13. package/dist/src/cli/commands/create-increment.d.ts.map +1 -1
  14. package/dist/src/cli/commands/create-increment.js +4 -0
  15. package/dist/src/cli/commands/create-increment.js.map +1 -1
  16. package/dist/src/cli/commands/dashboard.d.ts.map +1 -1
  17. package/dist/src/cli/commands/dashboard.js +2 -0
  18. package/dist/src/cli/commands/dashboard.js.map +1 -1
  19. package/dist/src/cli/commands/gc.d.ts +5 -1
  20. package/dist/src/cli/commands/gc.d.ts.map +1 -1
  21. package/dist/src/cli/commands/gc.js +19 -2
  22. package/dist/src/cli/commands/gc.js.map +1 -1
  23. package/dist/src/cli/commands/jev-helpers.d.ts +12 -4
  24. package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -1
  25. package/dist/src/cli/commands/jev-helpers.js +22 -13
  26. package/dist/src/cli/commands/jev-helpers.js.map +1 -1
  27. package/dist/src/cli/commands/pickup.d.ts.map +1 -1
  28. package/dist/src/cli/commands/pickup.js +8 -4
  29. package/dist/src/cli/commands/pickup.js.map +1 -1
  30. package/dist/src/cli/commands/require-increment.d.ts +18 -0
  31. package/dist/src/cli/commands/require-increment.d.ts.map +1 -0
  32. package/dist/src/cli/commands/require-increment.js +75 -0
  33. package/dist/src/cli/commands/require-increment.js.map +1 -0
  34. package/dist/src/cli/commands/small-fix.d.ts +14 -0
  35. package/dist/src/cli/commands/small-fix.d.ts.map +1 -0
  36. package/dist/src/cli/commands/small-fix.js +52 -0
  37. package/dist/src/cli/commands/small-fix.js.map +1 -0
  38. package/dist/src/cli/commands/verify.d.ts.map +1 -1
  39. package/dist/src/cli/commands/verify.js +3 -0
  40. package/dist/src/cli/commands/verify.js.map +1 -1
  41. package/dist/src/core/config/types.d.ts +7 -0
  42. package/dist/src/core/config/types.d.ts.map +1 -1
  43. package/dist/src/core/config/types.js.map +1 -1
  44. package/dist/src/core/hooks/handlers/pre-compact.d.ts.map +1 -1
  45. package/dist/src/core/hooks/handlers/pre-compact.js +4 -1
  46. package/dist/src/core/hooks/handlers/pre-compact.js.map +1 -1
  47. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts +5 -2
  48. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts.map +1 -1
  49. package/dist/src/core/hooks/handlers/pre-tool-use.js +16 -3
  50. package/dist/src/core/hooks/handlers/pre-tool-use.js.map +1 -1
  51. package/dist/src/core/hooks/handlers/require-increment.d.ts +40 -0
  52. package/dist/src/core/hooks/handlers/require-increment.d.ts.map +1 -0
  53. package/dist/src/core/hooks/handlers/require-increment.js +123 -0
  54. package/dist/src/core/hooks/handlers/require-increment.js.map +1 -0
  55. package/dist/src/core/increment/completion-validator.d.ts +6 -2
  56. package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
  57. package/dist/src/core/increment/completion-validator.js +16 -9
  58. package/dist/src/core/increment/completion-validator.js.map +1 -1
  59. package/dist/src/core/session/checkpoint-retention.d.ts +45 -0
  60. package/dist/src/core/session/checkpoint-retention.d.ts.map +1 -0
  61. package/dist/src/core/session/checkpoint-retention.js +187 -0
  62. package/dist/src/core/session/checkpoint-retention.js.map +1 -0
  63. package/dist/src/core/session/checkpoint-worker.js +5 -0
  64. package/dist/src/core/session/checkpoint-worker.js.map +1 -1
  65. package/dist/src/core/session/pickup.d.ts +2 -0
  66. package/dist/src/core/session/pickup.d.ts.map +1 -1
  67. package/dist/src/core/session/pickup.js +4 -3
  68. package/dist/src/core/session/pickup.js.map +1 -1
  69. package/dist/src/core/session/work-handoff.d.ts.map +1 -1
  70. package/dist/src/core/session/work-handoff.js +6 -3
  71. package/dist/src/core/session/work-handoff.js.map +1 -1
  72. package/dist/src/core/tasks/ledger.d.ts +7 -0
  73. package/dist/src/core/tasks/ledger.d.ts.map +1 -1
  74. package/dist/src/core/tasks/ledger.js +20 -4
  75. package/dist/src/core/tasks/ledger.js.map +1 -1
  76. package/dist/src/core/tasks/verify-runner.d.ts +1 -1
  77. package/dist/src/core/tasks/verify-runner.d.ts.map +1 -1
  78. package/dist/src/core/tasks/verify-runner.js +5 -13
  79. package/dist/src/core/tasks/verify-runner.js.map +1 -1
  80. package/dist/src/core/tasks/work-session.d.ts +58 -0
  81. package/dist/src/core/tasks/work-session.d.ts.map +1 -0
  82. package/dist/src/core/tasks/work-session.js +88 -0
  83. package/dist/src/core/tasks/work-session.js.map +1 -0
  84. package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
  85. package/dist/src/dashboard/server/dashboard-server.js +2 -0
  86. package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
  87. package/dist/src/dashboard/server/data/plan-timeline.d.ts +40 -0
  88. package/dist/src/dashboard/server/data/plan-timeline.d.ts.map +1 -0
  89. package/dist/src/dashboard/server/data/plan-timeline.js +259 -0
  90. package/dist/src/dashboard/server/data/plan-timeline.js.map +1 -0
  91. package/dist/src/dashboard/server/data/work-projection.d.ts.map +1 -1
  92. package/dist/src/dashboard/server/data/work-projection.js +7 -2
  93. package/dist/src/dashboard/server/data/work-projection.js.map +1 -1
  94. package/dist/src/dashboard/server/routes/plan-routes.d.ts +4 -0
  95. package/dist/src/dashboard/server/routes/plan-routes.d.ts.map +1 -0
  96. package/dist/src/dashboard/server/routes/plan-routes.js +19 -0
  97. package/dist/src/dashboard/server/routes/plan-routes.js.map +1 -0
  98. package/dist/src/dashboard/work-types.d.ts +81 -0
  99. package/dist/src/dashboard/work-types.d.ts.map +1 -1
  100. package/dist/src/utils/find-project-root.d.ts +2 -0
  101. package/dist/src/utils/find-project-root.d.ts.map +1 -1
  102. package/dist/src/utils/find-project-root.js +8 -1
  103. package/dist/src/utils/find-project-root.js.map +1 -1
  104. package/dist/src/utils/main-checkout.d.ts +30 -0
  105. package/dist/src/utils/main-checkout.d.ts.map +1 -0
  106. package/dist/src/utils/main-checkout.js +74 -0
  107. package/dist/src/utils/main-checkout.js.map +1 -0
  108. package/package.json +1 -1
  109. package/plugins/specweave/.claude-plugin/plugin.json +1 -1
  110. package/plugins/specweave/hooks/run-worker.mjs +42 -5
  111. package/plugins/specweave/hooks/run.mjs +101 -6
  112. package/src/templates/AGENTS.md.template +1 -1
  113. package/src/templates/environments/minimal/README.md +3 -3
  114. package/src/templates/environments/progressive/README.md +5 -6
  115. package/src/templates/environments/standard/README.md +4 -4
  116. package/dist/dashboard/assets/index-BFPKNEDz.css +0 -1
  117. package/dist/dashboard/assets/index-DVaY9gOX.js +0 -13
@@ -1,9 +1,12 @@
1
1
  /**
2
- * PreToolUse hook handler (tools: Write, Edit, Bash) — two hard rules:
2
+ * PreToolUse hook handler (tools: Write, Edit, MultiEdit, NotebookEdit, Bash) — three rules:
3
3
  *
4
4
  * 1. Status Completion Guard — no manual `status: completed` in an increment's
5
5
  * metadata.json; closure goes through `/sw:done` / `specweave complete`.
6
- * 2. Jev Bash guard (opt-in, 0878) — when `.specweave/state/jev-guard.enabled`
6
+ * 2. Required increment (opt-in, 0996) — with `planning.requireIncrement` set
7
+ * to `remind` or `enforce`, an edit in a session with no increment and no
8
+ * `specweave small-fix` is warned about or denied (see require-increment.ts).
9
+ * 3. Jev Bash guard (opt-in, 0878) — when `.specweave/state/jev-guard.enabled`
7
10
  * exists AND `jev.enabled` AND `jev.guards.bash`, a shell command that
8
11
  * survives the regex prefilter is scored by Jev; a `deny` verdict blocks it,
9
12
  * a `warn` verdict is surfaced as additionalContext.
@@ -38,6 +41,7 @@ import * as fs from 'fs';
38
41
  import * as path from 'path';
39
42
  import { redactSecrets } from '../../jev/redact.js';
40
43
  import { deny, pass, warn } from './types.js';
44
+ import { checkRequireIncrement, EDIT_TOOLS } from './require-increment.js';
41
45
  import { extractIncrementId, getFilePath, getToolInput, getToolName, isIncrementFile, logHook, readJsonSafe, } from './utils.js';
42
46
  const METADATA_RE = /\.specweave\/increments\/[^/]+\/metadata\.json$/;
43
47
  /** Opt-in marker: `.specweave/state/jev-guard.enabled` (relative to stateDir). */
@@ -201,8 +205,17 @@ export const handle = async (input, context) => {
201
205
  return pass();
202
206
  }
203
207
  }
204
- if (toolName !== 'Edit' && toolName !== 'Write')
208
+ if (!EDIT_TOOLS.has(toolName))
205
209
  return pass();
210
+ try {
211
+ const required = checkRequireIncrement(input, context);
212
+ if (required.hookSpecificOutput)
213
+ return required;
214
+ }
215
+ catch (error) {
216
+ const msg = error instanceof Error ? error.message : String(error);
217
+ logHook(context, 'require-increment', `[ERROR] ${msg}`, 'error');
218
+ }
206
219
  const filePath = getFilePath(input);
207
220
  if (!filePath || !isIncrementFile(filePath))
208
221
  return pass();
@@ -1 +1 @@
1
- {"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/pre-tool-use.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/pre-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,eAAe,EACf,OAAO,EACP,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,GAAG,iDAAiD,CAAC;AAEtE,kFAAkF;AAClF,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,8EAA8E;AAC9E,SAAS,OAAO,CAAC,KAAgB;IAC/B,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E,SAAS,0BAA0B,CAAC,KAAgB,EAAE,OAAoB,EAAE,QAAgB;IAC1F,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAEtE,gEAAgE;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAEtF,mCAAmC;IACnC,MAAM,OAAO,GAAG,YAAY,CAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CACpD,CAAC;IACF,IAAI,OAAO,EAAE,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,KAAK,IAAI;QAAE,OAAO,IAAI,EAAE,CAAC;IAElF,MAAM,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,IAAI,CACT,sDAAsD,EAAE,IAAI;QAC1D,gBAAgB,EAAE,6BAA6B,EAAE,+BAA+B,CACnF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,wDAAwD;AACxD,SAAS,UAAU,CAAC,KAAgB;IAClC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;IACxC,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,UAAU,CAAC,KAAyB;IAC3C,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;AACnD,CAAC;AAED,6DAA6D;AAC7D,SAAS,cAAc,CAAC,KAAgB;IACtC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;IAC1C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,UAAU,CAAI,OAAmB,EAAE,EAAU;IAC1D,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5C,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;oBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;YACvD,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAS,mBAAmB,CAAC,aAAqC;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;SAChD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,GACf,0FAA0F;IAC1F,8EAA8E,CAAC;AAEjF,KAAK,UAAU,iBAAiB,CAAC,KAAgB,EAAE,OAAoB;IACrE,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,EAAE,CAAC;IAE5B,6EAA6E;IAC7E,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAE/D,0EAA0E;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAEjF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAE/C,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI;QAAE,OAAO,IAAI,EAAE,CAAC;IAEpD,kDAAkD;IAClD,IAAI,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,EAAE,CAAC;IAE5D,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,EAAE,CAAC,CAAC,gCAAgC;IAE5D,uEAAuE;IACvE,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;IACxE,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CACL,OAAO,EACP,gBAAgB,EAChB,UAAU,UAAU,mEAAmE,GAAG,CAAC,QAAQ,GAAG,EACtG,MAAM,CACP,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,IAAI,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW;QACpE,WAAW,EAAE,eAAe,EAAE,IAAI;KACnC,CAAC,EACF,mBAAmB,CACpB,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,mBAAmB,cAAc,EAAE,MAAM,CAAC,CAAC;QAC/F,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,EAAE,CAAC;IAC/C,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,IAAI,EAAE,CAAC;IAEhD,MAAM,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClE,MAAM,MAAM,GACV,SAAS,QAAQ,CAAC,KAAK,gBAAgB,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;QAC/E,eAAe,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAChD,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE7D,IAAI,QAAQ,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,2CAA2C,MAAM,KAAK,WAAW,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,IAAI,CAAC,8BAA8B,MAAM,0CAA0C,CAAC,CAAC;AAC9F,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,CAAC,MAAM,MAAM,GAAc,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qEAAqE;YACrE,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,WAAW,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;YAC9D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,QAAQ,CAAC,kBAAkB;YAAE,OAAO,QAAQ,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,OAAO,CAAC,OAAO,EAAE,mBAAmB,EAAE,WAAW,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAE3D,MAAM,YAAY,GAAG,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAI,YAAY,CAAC,kBAAkB;QAAE,OAAO,YAAY,CAAC;IAEzD,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Required-increment guard (opt-in, `planning.requireIncrement`).
3
+ *
4
+ * An Edit or Write inside the project, outside `.specweave/`, is planned work
5
+ * when the agent session has a work marker (`~/.specweave/sessions/<id>.json`,
6
+ * written by any ledger append, `create-increment`, `verify`, `complete` or
7
+ * `small-fix`, keyed `studio-<thread>` for a SpecWithCode thread) for this
8
+ * project, naming an open increment or a small fix, or its SpecWithCode thread
9
+ * is bound to an open increment here.
10
+ * Otherwise:
11
+ *
12
+ * off → nothing (the default)
13
+ * remind → one additionalContext note per session
14
+ * enforce → deny, naming the commands that unblock the edit
15
+ *
16
+ * Offline, a few file reads, fail-open: any error passes.
17
+ *
18
+ * @module core/hooks/handlers/require-increment
19
+ */
20
+ import type { HookContext, HookInput, HookResult } from './types.js';
21
+ export declare const REQUIRE_INCREMENT_MODES: readonly ["off", "remind", "enforce"];
22
+ export type RequireIncrementMode = (typeof REQUIRE_INCREMENT_MODES)[number];
23
+ export declare const EDIT_TOOLS: ReadonlySet<string>;
24
+ export declare function readRequireIncrementMode(configPath: string): RequireIncrementMode;
25
+ /** Marker `specweave require-increment` leaves so the hook launcher's fast path knows to run the guard. */
26
+ export declare const REQUIRE_INCREMENT_MARKER = "require-increment.enabled";
27
+ /**
28
+ * Is this session already working, in this project, on an open increment or a
29
+ * declared small fix? Markers from another project or a closed increment do not count.
30
+ */
31
+ export declare function hasPlannedWork(input: HookInput, projectRoot: string, opts?: {
32
+ env?: NodeJS.ProcessEnv;
33
+ home?: string;
34
+ }): boolean;
35
+ export declare function requireIncrementMessage(mode: RequireIncrementMode): string;
36
+ export declare function checkRequireIncrement(input: HookInput, context: HookContext, opts?: {
37
+ env?: NodeJS.ProcessEnv;
38
+ home?: string;
39
+ }): HookResult;
40
+ //# sourceMappingURL=require-increment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-increment.d.ts","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/require-increment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIrE,eAAO,MAAM,uBAAuB,uCAAwC,CAAC;AAC7E,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,MAAM,CAA2D,CAAC;AAEvG,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CAGjF;AAOD,2GAA2G;AAC3G,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AAuBpE;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAoBT;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAU1E;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,UAAU,CA4BZ"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Required-increment guard (opt-in, `planning.requireIncrement`).
3
+ *
4
+ * An Edit or Write inside the project, outside `.specweave/`, is planned work
5
+ * when the agent session has a work marker (`~/.specweave/sessions/<id>.json`,
6
+ * written by any ledger append, `create-increment`, `verify`, `complete` or
7
+ * `small-fix`, keyed `studio-<thread>` for a SpecWithCode thread) for this
8
+ * project, naming an open increment or a small fix, or its SpecWithCode thread
9
+ * is bound to an open increment here.
10
+ * Otherwise:
11
+ *
12
+ * off → nothing (the default)
13
+ * remind → one additionalContext note per session
14
+ * enforce → deny, naming the commands that unblock the edit
15
+ *
16
+ * Offline, a few file reads, fail-open: any error passes.
17
+ *
18
+ * @module core/hooks/handlers/require-increment
19
+ */
20
+ import * as fs from 'fs';
21
+ import * as os from 'os';
22
+ import * as path from 'path';
23
+ import { readWorkSession } from '../../tasks/work-session.js';
24
+ import { studioThreadBindingFile } from '../../tasks/studio-thread-binding.js';
25
+ import { mainCheckoutOf } from '../../../utils/main-checkout.js';
26
+ import { deny, pass, warn } from './types.js';
27
+ import { getFilePath, getToolInput, readJsonSafe } from './utils.js';
28
+ export const REQUIRE_INCREMENT_MODES = ['off', 'remind', 'enforce'];
29
+ export const EDIT_TOOLS = new Set(['Edit', 'Write', 'MultiEdit', 'NotebookEdit']);
30
+ export function readRequireIncrementMode(configPath) {
31
+ const mode = readJsonSafe(configPath)?.planning?.requireIncrement;
32
+ return REQUIRE_INCREMENT_MODES.includes(mode) ? mode : 'off';
33
+ }
34
+ function inside(child, parent) {
35
+ const rel = path.relative(parent, child);
36
+ return rel === '' || (!!rel && !rel.startsWith('..') && !path.isAbsolute(rel));
37
+ }
38
+ /** Marker `specweave require-increment` leaves so the hook launcher's fast path knows to run the guard. */
39
+ export const REQUIRE_INCREMENT_MARKER = 'require-increment.enabled';
40
+ const CLOSED = new Set(['completed', 'abandoned', 'cancelled']);
41
+ function nested(a, b) {
42
+ return inside(path.resolve(a), path.resolve(b)) || inside(path.resolve(b), path.resolve(a));
43
+ }
44
+ /**
45
+ * Same project: one root contains the other (an umbrella and its nested repos
46
+ * count as one). A Git worktree also counts as its main checkout, so a
47
+ * SpecWithCode worktree matches the project it came from.
48
+ */
49
+ function sameProject(a, b) {
50
+ return nested(a, b) || nested(mainCheckoutOf(a) ?? a, mainCheckoutOf(b) ?? b);
51
+ }
52
+ function openIncrement(root, incrementId) {
53
+ if (!incrementId)
54
+ return false;
55
+ const status = readJsonSafe(path.join(root, '.specweave', 'increments', incrementId, 'metadata.json'))?.status;
56
+ return !CLOSED.has(String(status ?? ''));
57
+ }
58
+ /**
59
+ * Is this session already working, in this project, on an open increment or a
60
+ * declared small fix? Markers from another project or a closed increment do not count.
61
+ */
62
+ export function hasPlannedWork(input, projectRoot, opts = {}) {
63
+ const env = opts.env ?? process.env;
64
+ const home = opts.home ?? os.homedir();
65
+ const thread = env.SPECWEAVE_STUDIO_THREAD_ID?.trim();
66
+ // `specweave small-fix` in a thread without a session id keys its marker by the thread.
67
+ const ids = [input.session_id, env.SPECWEAVE_SESSION_ID, env.CLAUDE_CODE_SESSION_ID, thread ? `studio-${thread}` : undefined].filter((id) => typeof id === 'string' && !!id.trim());
68
+ for (const id of ids) {
69
+ const marker = readWorkSession(id, home);
70
+ if (!marker || !sameProject(marker.root, projectRoot))
71
+ continue;
72
+ if (marker.kind === 'small-fix' || openIncrement(marker.root, marker.incrementId))
73
+ return true;
74
+ }
75
+ if (!thread)
76
+ return false;
77
+ const binding = readJsonSafe(studioThreadBindingFile(thread, home));
78
+ return (!!binding?.root &&
79
+ sameProject(binding.root, projectRoot) &&
80
+ openIncrement(binding.root, binding.incrementId ?? null));
81
+ }
82
+ export function requireIncrementMessage(mode) {
83
+ const lead = mode === 'enforce'
84
+ ? 'This project requires an increment before code changes (planning.requireIncrement = enforce), and this session has none.'
85
+ : 'Reminder: this project plans changes as increments (planning.requireIncrement = remind), and this session has none yet.';
86
+ return (`${lead} Plan it with \`specweave create-increment "<title>"\` and fill spec.md, ` +
87
+ 'or continue an open one with `specweave task claim T-NN <increment>`. ' +
88
+ 'If the change is too small to plan, run `specweave small-fix "<why>"`. Then retry the edit.');
89
+ }
90
+ export function checkRequireIncrement(input, context, opts = {}) {
91
+ const mode = readRequireIncrementMode(context.configPath);
92
+ if (mode === 'off')
93
+ return pass();
94
+ const notebook = getToolInput(input).notebook_path;
95
+ const raw = getFilePath(input) || (typeof notebook === 'string' ? notebook : '');
96
+ if (!raw)
97
+ return pass();
98
+ const cwd = typeof input.cwd === 'string' && input.cwd ? input.cwd : context.projectRoot;
99
+ const file = path.resolve(cwd, raw);
100
+ // Planning files and anything outside this project are never gated.
101
+ if (/[\\/]\.specweave[\\/]/.test(file))
102
+ return pass();
103
+ if (!inside(file, context.projectRoot) && !inside(file, cwd))
104
+ return pass();
105
+ if (hasPlannedWork(input, context.projectRoot, opts))
106
+ return pass();
107
+ if (mode === 'enforce')
108
+ return deny(requireIncrementMessage(mode));
109
+ // remind: once per session.
110
+ const session = (input.session_id || 'unknown').replace(/[^\w.-]/g, '_');
111
+ const marker = path.join(context.stateDir, 'require-increment', `${session}.reminded`);
112
+ if (fs.existsSync(marker))
113
+ return pass();
114
+ try {
115
+ fs.mkdirSync(path.dirname(marker), { recursive: true });
116
+ fs.writeFileSync(marker, context.timestamp);
117
+ }
118
+ catch {
119
+ // Reminding twice is better than never.
120
+ }
121
+ return warn(requireIncrementMessage(mode));
122
+ }
123
+ //# sourceMappingURL=require-increment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-increment.js","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/require-increment.ts"],"names":[],"mappings":"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"}
@@ -93,9 +93,13 @@ export declare class IncrementCompletionValidator {
93
93
  */
94
94
  private static parseAllACsWithPriority;
95
95
  /**
96
- * Count open (unchecked) acceptance criteria in spec.md
96
+ * Count acceptance criteria that are not met.
97
97
  *
98
- * Searches for pattern: - [ ] **AC-
98
+ * Uses the same ledger-derived AC status as `specweave verify`: an AC is met
99
+ * when ticked in spec.md or when every task covering it is done in the
100
+ * ledger. State lives only in ledger.jsonl, so spec.md boxes are never ticked
101
+ * for ledger-tracked work. When no task references any AC (the ledger can say
102
+ * nothing about ACs), falls back to counting `- [ ] **AC-` lines in spec.md.
99
103
  *
100
104
  * @param incrementId - The increment ID
101
105
  * @returns Number of open ACs
@@ -1 +1 @@
1
- {"version":3,"file":"completion-validator.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/completion-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAMpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA4B;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;WACU,kBAAkB,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7E,OAAO,CAAC,gBAAgB,CAAC;IA+N5B;;;;;;;;;;;;;;;;OAgBG;WACU,+BAA+B,CAC1C,MAAM,EAAE,GAAG,EACX,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IA8DhB;;;;;;;;;;;OAWG;mBACkB,kBAAkB;IAoEvC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAiDtC;;;;;;;OAOG;WACU,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa/D;;;;;;;;;OASG;WACU,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAOrE"}
1
+ {"version":3,"file":"completion-validator.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/completion-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAMpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA4B;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;WACU,kBAAkB,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7E,OAAO,CAAC,gBAAgB,CAAC;IA+N5B;;;;;;;;;;;;;;;;OAgBG;WACU,+BAA+B,CAC1C,MAAM,EAAE,GAAG,EACX,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IA8DhB;;;;;;;;;;;OAWG;mBACkB,kBAAkB;IAoEvC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAiDtC;;;;;;;;;;;OAWG;WACU,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc/D;;;;;;;;;OASG;WACU,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAOrE"}
@@ -423,21 +423,28 @@ export class IncrementCompletionValidator {
423
423
  return acs;
424
424
  }
425
425
  /**
426
- * Count open (unchecked) acceptance criteria in spec.md
426
+ * Count acceptance criteria that are not met.
427
427
  *
428
- * Searches for pattern: - [ ] **AC-
428
+ * Uses the same ledger-derived AC status as `specweave verify`: an AC is met
429
+ * when ticked in spec.md or when every task covering it is done in the
430
+ * ledger. State lives only in ledger.jsonl, so spec.md boxes are never ticked
431
+ * for ledger-tracked work. When no task references any AC (the ledger can say
432
+ * nothing about ACs), falls back to counting `- [ ] **AC-` lines in spec.md.
429
433
  *
430
434
  * @param incrementId - The increment ID
431
435
  * @returns Number of open ACs
432
436
  */
433
437
  static async countOpenACs(incrementId) {
434
- const specPath = path.join(resolveEffectiveRoot(), '.specweave', 'increments', incrementId, 'spec.md');
435
- const content = await fs.readFile(specPath, 'utf-8');
436
- // Match unchecked ACs: - [ ] **AC-
437
- // Must be at start of line (^), followed by - [ ], then **AC-
438
- const openACPattern = /^- \[ \] \*\*AC-/gm;
439
- const matches = content.match(openACPattern) || [];
440
- return matches.length;
438
+ const incrementPath = path.join(resolveEffectiveRoot(), '.specweave', 'increments', incrementId);
439
+ const { loadTaskBoard } = await import('../tasks/task-board.js');
440
+ const { readSpecAcs, deriveAcStatus } = await import('../tasks/verify-runner.js');
441
+ const specAcs = readSpecAcs(incrementPath);
442
+ const board = loadTaskBoard(incrementPath);
443
+ if (specAcs.length > 0 && board.tasks.some((t) => (t.acs ?? []).length > 0)) {
444
+ return deriveAcStatus(specAcs, board).filter((a) => !a.done).length;
445
+ }
446
+ const content = await fs.readFile(path.join(incrementPath, 'spec.md'), 'utf-8');
447
+ return (content.match(/^- \[ \] \*\*AC-/gm) || []).length;
441
448
  }
442
449
  /**
443
450
  * Count tasks that are neither done nor skipped.
@@ -1 +1 @@
1
- {"version":3,"file":"completion-validator.js","sourceRoot":"","sources":["../../../../src/core/increment/completion-validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"completion-validator.js","sourceRoot":"","sources":["../../../../src/core/increment/completion-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Seven days: a checkpoint only matters until the next session picks the work
3
+ * up, and pending handoffs are kept regardless. At October 2026 rates (about
4
+ * 230 sessions and 140 MB a day on one Mac) 14 days would hold about 2 GB.
5
+ */
6
+ export declare const CHECKPOINT_RETENTION_DAYS = 7;
7
+ export declare const CHECKPOINT_RETENTION_MS: number;
8
+ export declare const CHECKPOINT_PRUNE_INTERVAL_MS: number;
9
+ /** Wall-clock cap for one background run; the rest waits for the next day. */
10
+ export declare const CHECKPOINT_PRUNE_BUDGET_MS = 20000;
11
+ /** Records the last background run. Readers skip dot-names in the root. */
12
+ export declare const CHECKPOINT_PRUNE_MARKER = ".retention";
13
+ export interface CheckpointPruneOptions {
14
+ now?: number;
15
+ maxAgeMs?: number;
16
+ /** Delete; otherwise only report what would go. */
17
+ apply?: boolean;
18
+ /** Stop deleting after this many milliseconds. */
19
+ budgetMs?: number;
20
+ }
21
+ export interface CheckpointPruneResult {
22
+ applied: boolean;
23
+ /** Session folders removed (or that would be). */
24
+ sessions: number;
25
+ /** Their size in bytes. */
26
+ bytes: number;
27
+ /** Studio pointers removed (or that would be). */
28
+ pointers: number;
29
+ /** Session folders kept: recent, or holding a pending handoff. */
30
+ kept: number;
31
+ /** Folders kept only because they hold a pending handoff. */
32
+ pendingHandoffs: number;
33
+ /** The time budget ran out before every candidate was removed. */
34
+ partial: boolean;
35
+ }
36
+ /** Remove (or count) expired session folders and the Studio pointers left without a checkpoint. */
37
+ export declare function pruneCheckpoints(root: string, opts?: CheckpointPruneOptions): CheckpointPruneResult;
38
+ /**
39
+ * At most once a day, prune with a time budget. Called from the detached
40
+ * checkpoint supervisor, never from a hook; every error is swallowed.
41
+ */
42
+ export declare function maybePruneCheckpoints(root: string, opts?: {
43
+ now?: number;
44
+ }): CheckpointPruneResult | undefined;
45
+ //# sourceMappingURL=checkpoint-retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-retention.d.ts","sourceRoot":"","sources":["../../../../src/core/session/checkpoint-retention.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,uBAAuB,QAA+C,CAAC;AACpF,eAAO,MAAM,4BAA4B,QAAmB,CAAC;AAC7D,8EAA8E;AAC9E,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,eAAe,CAAC;AAIpD,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;CAClB;AAiCD,mGAAmG;AACnG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,sBAA2B,GAAG,qBAAqB,CA0BvG;AAwBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,qBAAqB,GAAG,SAAS,CAalH"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Retention for `~/.specweave/checkpoints`. Every session leaves a folder there
3
+ * and the worker only prunes old generations inside one, so whole folders are
4
+ * removed here once nothing reads them: newest file older than 7 days and no
5
+ * pending handoff (`handoff.json` without a later `picked.json`). Studio
6
+ * pointers (`studio/<thread>.json`) go when the checkpoint they name is gone.
7
+ *
8
+ * The checkpoint supervisor runs it at most once a day, after its capture, in
9
+ * a detached process; `specweave gc` reports it and `gc --yes` applies it.
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import { SESSION_HANDOFF_FILE, SESSION_PICKED_FILE } from './session-checkpoint.js';
14
+ /**
15
+ * Seven days: a checkpoint only matters until the next session picks the work
16
+ * up, and pending handoffs are kept regardless. At October 2026 rates (about
17
+ * 230 sessions and 140 MB a day on one Mac) 14 days would hold about 2 GB.
18
+ */
19
+ export const CHECKPOINT_RETENTION_DAYS = 7;
20
+ export const CHECKPOINT_RETENTION_MS = CHECKPOINT_RETENTION_DAYS * 24 * 60 * 60000;
21
+ export const CHECKPOINT_PRUNE_INTERVAL_MS = 24 * 60 * 60000;
22
+ /** Wall-clock cap for one background run; the rest waits for the next day. */
23
+ export const CHECKPOINT_PRUNE_BUDGET_MS = 20000;
24
+ /** Records the last background run. Readers skip dot-names in the root. */
25
+ export const CHECKPOINT_PRUNE_MARKER = '.retention';
26
+ /** Session folders are sha256(cwd, session id); nothing else in the root is touched. */
27
+ const SESSION_FOLDER = /^[0-9a-f]{64}$/;
28
+ function readJson(file) {
29
+ try {
30
+ return JSON.parse(fs.readFileSync(file, 'utf8'));
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ /** Newest mtime and total size under a session folder, without following symlinks. */
37
+ function scan(dir) {
38
+ let newest = 0;
39
+ let bytes = 0;
40
+ const walk = (p) => {
41
+ let st;
42
+ try {
43
+ st = fs.lstatSync(p);
44
+ }
45
+ catch {
46
+ return;
47
+ }
48
+ newest = Math.max(newest, st.mtimeMs);
49
+ if (!st.isDirectory()) {
50
+ bytes += st.size;
51
+ return;
52
+ }
53
+ let names;
54
+ try {
55
+ names = fs.readdirSync(p);
56
+ }
57
+ catch {
58
+ return;
59
+ }
60
+ for (const name of names)
61
+ walk(path.join(p, name));
62
+ };
63
+ walk(dir);
64
+ return { newest, bytes };
65
+ }
66
+ /** Same rule as `specweave handoff list`, but an unreadable mark counts as pending. */
67
+ function hasPendingHandoff(dir) {
68
+ if (!fs.existsSync(path.join(dir, SESSION_HANDOFF_FILE)))
69
+ return false;
70
+ const mark = readJson(path.join(dir, SESSION_HANDOFF_FILE));
71
+ const picked = readJson(path.join(dir, SESSION_PICKED_FILE));
72
+ const markAt = mark?.at ? Date.parse(mark.at) : NaN;
73
+ const pickedAt = picked?.at ? Date.parse(picked.at) : NaN;
74
+ return !(Number.isFinite(markAt) && Number.isFinite(pickedAt) && pickedAt >= markAt);
75
+ }
76
+ /** Remove (or count) expired session folders and the Studio pointers left without a checkpoint. */
77
+ export function pruneCheckpoints(root, opts = {}) {
78
+ const now = opts.now ?? Date.now();
79
+ const cutoff = now - (opts.maxAgeMs ?? CHECKPOINT_RETENTION_MS);
80
+ const deadline = opts.budgetMs === undefined ? Infinity : Date.now() + opts.budgetMs;
81
+ const result = { applied: !!opts.apply, sessions: 0, bytes: 0, pointers: 0, kept: 0, pendingHandoffs: 0, partial: false };
82
+ let names;
83
+ try {
84
+ names = fs.readdirSync(root);
85
+ }
86
+ catch {
87
+ return result;
88
+ }
89
+ const removed = new Set();
90
+ for (const name of names) {
91
+ if (!SESSION_FOLDER.test(name))
92
+ continue;
93
+ const dir = path.join(root, name);
94
+ if (Date.now() > deadline) {
95
+ result.partial = true;
96
+ break;
97
+ }
98
+ if (hasPendingHandoff(dir)) {
99
+ result.kept++;
100
+ result.pendingHandoffs++;
101
+ continue;
102
+ }
103
+ const { newest, bytes } = scan(dir);
104
+ if (!newest || newest >= cutoff) {
105
+ result.kept++;
106
+ continue;
107
+ }
108
+ if (opts.apply) {
109
+ // A session that came back since the scan touches the folder first.
110
+ try {
111
+ if (fs.statSync(dir).mtimeMs >= cutoff || hasPendingHandoff(dir)) {
112
+ result.kept++;
113
+ continue;
114
+ }
115
+ }
116
+ catch {
117
+ continue;
118
+ }
119
+ try {
120
+ fs.rmSync(dir, { recursive: true, force: true });
121
+ }
122
+ catch {
123
+ result.kept++;
124
+ continue;
125
+ }
126
+ }
127
+ removed.add(dir);
128
+ result.sessions++;
129
+ result.bytes += bytes;
130
+ }
131
+ result.pointers = prunePointers(root, removed, cutoff, !!opts.apply);
132
+ return result;
133
+ }
134
+ /** Pointers older than the cutoff whose checkpoint document is gone (or about to be). */
135
+ function prunePointers(root, removed, cutoff, apply) {
136
+ const studio = path.join(root, 'studio');
137
+ let names;
138
+ try {
139
+ names = fs.readdirSync(studio);
140
+ }
141
+ catch {
142
+ return 0;
143
+ }
144
+ let count = 0;
145
+ for (const name of names) {
146
+ const file = path.join(studio, name);
147
+ try {
148
+ const st = fs.lstatSync(file);
149
+ if (!st.isFile() || st.mtimeMs >= cutoff)
150
+ continue;
151
+ // Leftover `<thread>.json.<token>` temp files carry no receipt and also go.
152
+ const docPath = name.endsWith('.json') ? readJson(file)?.docPath : undefined;
153
+ if (typeof docPath === 'string' && fs.existsSync(docPath)
154
+ && !removed.has(path.dirname(path.dirname(docPath))))
155
+ continue;
156
+ if (apply)
157
+ fs.unlinkSync(file);
158
+ count++;
159
+ }
160
+ catch { /* raced with a writer or another prune */ }
161
+ }
162
+ return count;
163
+ }
164
+ /**
165
+ * At most once a day, prune with a time budget. Called from the detached
166
+ * checkpoint supervisor, never from a hook; every error is swallowed.
167
+ */
168
+ export function maybePruneCheckpoints(root, opts = {}) {
169
+ try {
170
+ const now = opts.now ?? Date.now();
171
+ const marker = path.join(root, CHECKPOINT_PRUNE_MARKER);
172
+ try {
173
+ const last = fs.statSync(marker).mtimeMs;
174
+ if (now >= last && now - last < CHECKPOINT_PRUNE_INTERVAL_MS)
175
+ return undefined;
176
+ }
177
+ catch { /* first run */ }
178
+ // Claim the day before the work, so concurrent supervisors skip it.
179
+ fs.writeFileSync(marker, JSON.stringify({ at: new Date(now).toISOString() }) + '\n', { mode: 0o600 });
180
+ fs.utimesSync(marker, now / 1000, now / 1000);
181
+ return pruneCheckpoints(root, { now, apply: true, budgetMs: CHECKPOINT_PRUNE_BUDGET_MS });
182
+ }
183
+ catch {
184
+ return undefined;
185
+ }
186
+ }
187
+ //# sourceMappingURL=checkpoint-retention.js.map