@specship/specship-win32-arm64 0.25.0 → 0.28.0

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 (274) hide show
  1. package/bin/specship.cmd +31 -1
  2. package/lib/dist/activation/cheatsheet.d.ts +17 -1
  3. package/lib/dist/activation/cheatsheet.d.ts.map +1 -1
  4. package/lib/dist/activation/cheatsheet.js +47 -3
  5. package/lib/dist/activation/cheatsheet.js.map +1 -1
  6. package/lib/dist/activation/hook-output.d.ts +80 -0
  7. package/lib/dist/activation/hook-output.d.ts.map +1 -0
  8. package/lib/dist/activation/hook-output.js +103 -0
  9. package/lib/dist/activation/hook-output.js.map +1 -0
  10. package/lib/dist/activation/search-intercept.d.ts +60 -29
  11. package/lib/dist/activation/search-intercept.d.ts.map +1 -1
  12. package/lib/dist/activation/search-intercept.js +159 -55
  13. package/lib/dist/activation/search-intercept.js.map +1 -1
  14. package/lib/dist/activation/steering.d.ts +8 -10
  15. package/lib/dist/activation/steering.d.ts.map +1 -1
  16. package/lib/dist/activation/steering.js +21 -6
  17. package/lib/dist/activation/steering.js.map +1 -1
  18. package/lib/dist/behaviour/behaviour-surface.d.ts +47 -0
  19. package/lib/dist/behaviour/behaviour-surface.d.ts.map +1 -1
  20. package/lib/dist/behaviour/behaviour-surface.js +108 -2
  21. package/lib/dist/behaviour/behaviour-surface.js.map +1 -1
  22. package/lib/dist/bin/node-version-check.d.ts +22 -7
  23. package/lib/dist/bin/node-version-check.d.ts.map +1 -1
  24. package/lib/dist/bin/node-version-check.js +39 -9
  25. package/lib/dist/bin/node-version-check.js.map +1 -1
  26. package/lib/dist/bin/specship.js +762 -81
  27. package/lib/dist/bin/specship.js.map +1 -1
  28. package/lib/dist/commands/specship/learn.md +22 -0
  29. package/lib/dist/commands/specship/spec.md +12 -0
  30. package/lib/dist/db/sqlite-adapter.d.ts +7 -5
  31. package/lib/dist/db/sqlite-adapter.d.ts.map +1 -1
  32. package/lib/dist/db/sqlite-adapter.js +11 -9
  33. package/lib/dist/db/sqlite-adapter.js.map +1 -1
  34. package/lib/dist/enforce/changed-files.d.ts +11 -0
  35. package/lib/dist/enforce/changed-files.d.ts.map +1 -1
  36. package/lib/dist/enforce/changed-files.js +42 -0
  37. package/lib/dist/enforce/changed-files.js.map +1 -1
  38. package/lib/dist/enforce/enforce.d.ts +25 -1
  39. package/lib/dist/enforce/enforce.d.ts.map +1 -1
  40. package/lib/dist/enforce/enforce.js +58 -3
  41. package/lib/dist/enforce/enforce.js.map +1 -1
  42. package/lib/dist/enforce/mutation.d.ts +46 -0
  43. package/lib/dist/enforce/mutation.d.ts.map +1 -0
  44. package/lib/dist/enforce/mutation.js +104 -0
  45. package/lib/dist/enforce/mutation.js.map +1 -0
  46. package/lib/dist/enforce/suppressions.d.ts +33 -0
  47. package/lib/dist/enforce/suppressions.d.ts.map +1 -0
  48. package/lib/dist/enforce/suppressions.js +159 -0
  49. package/lib/dist/enforce/suppressions.js.map +1 -0
  50. package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
  51. package/lib/dist/extraction/specs/markdown-spec-extractor.js +16 -2
  52. package/lib/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
  53. package/lib/dist/graph/spec-coverage.d.ts +57 -1
  54. package/lib/dist/graph/spec-coverage.d.ts.map +1 -1
  55. package/lib/dist/graph/spec-coverage.js +129 -5
  56. package/lib/dist/graph/spec-coverage.js.map +1 -1
  57. package/lib/dist/health/smoke-check.js +2 -2
  58. package/lib/dist/health/smoke-check.js.map +1 -1
  59. package/lib/dist/index.d.ts +8 -3
  60. package/lib/dist/index.d.ts.map +1 -1
  61. package/lib/dist/index.js +65 -9
  62. package/lib/dist/index.js.map +1 -1
  63. package/lib/dist/installer/gemini-commands.d.ts +107 -0
  64. package/lib/dist/installer/gemini-commands.d.ts.map +1 -0
  65. package/lib/dist/installer/gemini-commands.js +264 -0
  66. package/lib/dist/installer/gemini-commands.js.map +1 -0
  67. package/lib/dist/installer/index.d.ts +23 -1
  68. package/lib/dist/installer/index.d.ts.map +1 -1
  69. package/lib/dist/installer/index.js +22 -3
  70. package/lib/dist/installer/index.js.map +1 -1
  71. package/lib/dist/installer/install-defaults.d.ts +19 -0
  72. package/lib/dist/installer/install-defaults.d.ts.map +1 -1
  73. package/lib/dist/installer/install-defaults.js +28 -0
  74. package/lib/dist/installer/install-defaults.js.map +1 -1
  75. package/lib/dist/installer/instructions-template.d.ts +22 -0
  76. package/lib/dist/installer/instructions-template.d.ts.map +1 -1
  77. package/lib/dist/installer/instructions-template.js +37 -1
  78. package/lib/dist/installer/instructions-template.js.map +1 -1
  79. package/lib/dist/installer/targets/claude.d.ts +4 -0
  80. package/lib/dist/installer/targets/claude.d.ts.map +1 -1
  81. package/lib/dist/installer/targets/claude.js +8 -25
  82. package/lib/dist/installer/targets/claude.js.map +1 -1
  83. package/lib/dist/installer/targets/gemini.d.ts +85 -12
  84. package/lib/dist/installer/targets/gemini.d.ts.map +1 -1
  85. package/lib/dist/installer/targets/gemini.js +527 -30
  86. package/lib/dist/installer/targets/gemini.js.map +1 -1
  87. package/lib/dist/installer/targets/shared.d.ts +13 -0
  88. package/lib/dist/installer/targets/shared.d.ts.map +1 -1
  89. package/lib/dist/installer/targets/shared.js +18 -0
  90. package/lib/dist/installer/targets/shared.js.map +1 -1
  91. package/lib/dist/installer/targets/types.d.ts +12 -0
  92. package/lib/dist/installer/targets/types.d.ts.map +1 -1
  93. package/lib/dist/jira/auto-publish.d.ts +71 -4
  94. package/lib/dist/jira/auto-publish.d.ts.map +1 -1
  95. package/lib/dist/jira/auto-publish.js +186 -17
  96. package/lib/dist/jira/auto-publish.js.map +1 -1
  97. package/lib/dist/jira/reconcile.d.ts +24 -1
  98. package/lib/dist/jira/reconcile.d.ts.map +1 -1
  99. package/lib/dist/jira/reconcile.js +46 -2
  100. package/lib/dist/jira/reconcile.js.map +1 -1
  101. package/lib/dist/jira/repo-config.d.ts +9 -0
  102. package/lib/dist/jira/repo-config.d.ts.map +1 -1
  103. package/lib/dist/jira/repo-config.js +11 -0
  104. package/lib/dist/jira/repo-config.js.map +1 -1
  105. package/lib/dist/jira/types.d.ts +7 -0
  106. package/lib/dist/jira/types.d.ts.map +1 -1
  107. package/lib/dist/jira/types.js.map +1 -1
  108. package/lib/dist/knowledge/enforce.d.ts +75 -0
  109. package/lib/dist/knowledge/enforce.d.ts.map +1 -0
  110. package/lib/dist/knowledge/enforce.js +250 -0
  111. package/lib/dist/knowledge/enforce.js.map +1 -0
  112. package/lib/dist/knowledge/facts.d.ts +33 -0
  113. package/lib/dist/knowledge/facts.d.ts.map +1 -0
  114. package/lib/dist/knowledge/facts.js +117 -0
  115. package/lib/dist/knowledge/facts.js.map +1 -0
  116. package/lib/dist/knowledge/proposals.d.ts +88 -0
  117. package/lib/dist/knowledge/proposals.d.ts.map +1 -0
  118. package/lib/dist/knowledge/proposals.js +360 -0
  119. package/lib/dist/knowledge/proposals.js.map +1 -0
  120. package/lib/dist/knowledge/stale.d.ts +64 -0
  121. package/lib/dist/knowledge/stale.d.ts.map +1 -0
  122. package/lib/dist/knowledge/stale.js +174 -0
  123. package/lib/dist/knowledge/stale.js.map +1 -0
  124. package/lib/dist/mcp/gemini-session.d.ts +50 -0
  125. package/lib/dist/mcp/gemini-session.d.ts.map +1 -0
  126. package/lib/dist/mcp/gemini-session.js +159 -0
  127. package/lib/dist/mcp/gemini-session.js.map +1 -0
  128. package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
  129. package/lib/dist/mcp/jira-tools.js +25 -0
  130. package/lib/dist/mcp/jira-tools.js.map +1 -1
  131. package/lib/dist/mcp/model-context.d.ts +22 -9
  132. package/lib/dist/mcp/model-context.d.ts.map +1 -1
  133. package/lib/dist/mcp/model-context.js +35 -13
  134. package/lib/dist/mcp/model-context.js.map +1 -1
  135. package/lib/dist/mcp/proxy.js +1 -1
  136. package/lib/dist/mcp/proxy.js.map +1 -1
  137. package/lib/dist/mcp/server-instructions.d.ts +16 -15
  138. package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
  139. package/lib/dist/mcp/server-instructions.js +67 -1
  140. package/lib/dist/mcp/server-instructions.js.map +1 -1
  141. package/lib/dist/mcp/session.js +1 -1
  142. package/lib/dist/mcp/session.js.map +1 -1
  143. package/lib/dist/mcp/spec-tools.d.ts +9 -1
  144. package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
  145. package/lib/dist/mcp/spec-tools.js +69 -21
  146. package/lib/dist/mcp/spec-tools.js.map +1 -1
  147. package/lib/dist/mcp/tools.d.ts +37 -1
  148. package/lib/dist/mcp/tools.d.ts.map +1 -1
  149. package/lib/dist/mcp/tools.js +120 -9
  150. package/lib/dist/mcp/tools.js.map +1 -1
  151. package/lib/dist/pulse/pulse.d.ts +93 -0
  152. package/lib/dist/pulse/pulse.d.ts.map +1 -0
  153. package/lib/dist/pulse/pulse.js +401 -0
  154. package/lib/dist/pulse/pulse.js.map +1 -0
  155. package/lib/dist/reflect/apply.d.ts.map +1 -1
  156. package/lib/dist/reflect/apply.js +38 -3
  157. package/lib/dist/reflect/apply.js.map +1 -1
  158. package/lib/dist/reflect/auto-sweep.d.ts +26 -0
  159. package/lib/dist/reflect/auto-sweep.d.ts.map +1 -0
  160. package/lib/dist/reflect/auto-sweep.js +90 -0
  161. package/lib/dist/reflect/auto-sweep.js.map +1 -0
  162. package/lib/dist/reflect/cli.d.ts +62 -0
  163. package/lib/dist/reflect/cli.d.ts.map +1 -0
  164. package/lib/dist/reflect/cli.js +163 -0
  165. package/lib/dist/reflect/cli.js.map +1 -0
  166. package/lib/dist/reflect/miner.d.ts.map +1 -1
  167. package/lib/dist/reflect/miner.js +119 -0
  168. package/lib/dist/reflect/miner.js.map +1 -1
  169. package/lib/dist/reflect/sweep.d.ts +1 -0
  170. package/lib/dist/reflect/sweep.d.ts.map +1 -1
  171. package/lib/dist/reflect/sweep.js +62 -13
  172. package/lib/dist/reflect/sweep.js.map +1 -1
  173. package/lib/dist/reflect/targets.d.ts +2 -0
  174. package/lib/dist/reflect/targets.d.ts.map +1 -1
  175. package/lib/dist/reflect/targets.js +33 -0
  176. package/lib/dist/reflect/targets.js.map +1 -1
  177. package/lib/dist/reflect/types.d.ts +19 -2
  178. package/lib/dist/reflect/types.d.ts.map +1 -1
  179. package/lib/dist/resolution/test-title-links.d.ts.map +1 -1
  180. package/lib/dist/resolution/test-title-links.js +3 -14
  181. package/lib/dist/resolution/test-title-links.js.map +1 -1
  182. package/lib/dist/server/routes/claude.js +15 -7
  183. package/lib/dist/server/routes/knowledge.js +118 -0
  184. package/lib/dist/server/server.js +2 -0
  185. package/lib/dist/spec-lint/lint.d.ts +1 -1
  186. package/lib/dist/spec-lint/lint.d.ts.map +1 -1
  187. package/lib/dist/spec-lint/lint.js +63 -2
  188. package/lib/dist/spec-lint/lint.js.map +1 -1
  189. package/lib/dist/spec-quality/criterion-ids.d.ts +13 -0
  190. package/lib/dist/spec-quality/criterion-ids.d.ts.map +1 -0
  191. package/lib/dist/spec-quality/criterion-ids.js +38 -0
  192. package/lib/dist/spec-quality/criterion-ids.js.map +1 -0
  193. package/lib/dist/spec-quality/evidence-kind.d.ts +54 -0
  194. package/lib/dist/spec-quality/evidence-kind.d.ts.map +1 -0
  195. package/lib/dist/spec-quality/evidence-kind.js +183 -0
  196. package/lib/dist/spec-quality/evidence-kind.js.map +1 -0
  197. package/lib/dist/spec-quality/link-persist.d.ts +65 -0
  198. package/lib/dist/spec-quality/link-persist.d.ts.map +1 -0
  199. package/lib/dist/spec-quality/link-persist.js +249 -0
  200. package/lib/dist/spec-quality/link-persist.js.map +1 -0
  201. package/lib/dist/spec-quality/plan-scope.d.ts +38 -0
  202. package/lib/dist/spec-quality/plan-scope.d.ts.map +1 -0
  203. package/lib/dist/spec-quality/plan-scope.js +129 -0
  204. package/lib/dist/spec-quality/plan-scope.js.map +1 -0
  205. package/lib/dist/spec-quality/postcheck.d.ts +85 -0
  206. package/lib/dist/spec-quality/postcheck.d.ts.map +1 -0
  207. package/lib/dist/spec-quality/postcheck.js +390 -0
  208. package/lib/dist/spec-quality/postcheck.js.map +1 -0
  209. package/lib/dist/spec-quality/readiness.d.ts +72 -0
  210. package/lib/dist/spec-quality/readiness.d.ts.map +1 -0
  211. package/lib/dist/spec-quality/readiness.js +226 -0
  212. package/lib/dist/spec-quality/readiness.js.map +1 -0
  213. package/lib/dist/workflows/agents/claude.d.ts +16 -0
  214. package/lib/dist/workflows/agents/claude.d.ts.map +1 -0
  215. package/lib/dist/workflows/agents/claude.js +82 -0
  216. package/lib/dist/workflows/agents/claude.js.map +1 -0
  217. package/lib/dist/workflows/agents/gemini.d.ts +21 -0
  218. package/lib/dist/workflows/agents/gemini.d.ts.map +1 -0
  219. package/lib/dist/workflows/agents/gemini.js +124 -0
  220. package/lib/dist/workflows/agents/gemini.js.map +1 -0
  221. package/lib/dist/workflows/agents/index.d.ts +28 -0
  222. package/lib/dist/workflows/agents/index.d.ts.map +1 -0
  223. package/lib/dist/workflows/agents/index.js +104 -0
  224. package/lib/dist/workflows/agents/index.js.map +1 -0
  225. package/lib/dist/workflows/agents/types.d.ts +55 -0
  226. package/lib/dist/workflows/agents/types.d.ts.map +1 -0
  227. package/lib/dist/workflows/agents/types.js +46 -0
  228. package/lib/dist/workflows/agents/types.js.map +1 -0
  229. package/lib/dist/workflows/batch.d.ts +63 -0
  230. package/lib/dist/workflows/batch.d.ts.map +1 -0
  231. package/lib/dist/workflows/batch.js +151 -0
  232. package/lib/dist/workflows/batch.js.map +1 -0
  233. package/lib/dist/workflows/defaults/claude-design-implement.yaml +3 -4
  234. package/lib/dist/workflows/defaults/spec-author.yaml +11 -9
  235. package/lib/dist/workflows/defaults/spec-implement-mixed.yaml +21 -436
  236. package/lib/dist/workflows/defaults/spec-implement.yaml +465 -46
  237. package/lib/dist/workflows/discovery.d.ts +13 -0
  238. package/lib/dist/workflows/discovery.d.ts.map +1 -1
  239. package/lib/dist/workflows/discovery.js +79 -17
  240. package/lib/dist/workflows/discovery.js.map +1 -1
  241. package/lib/dist/workflows/executor.d.ts +18 -0
  242. package/lib/dist/workflows/executor.d.ts.map +1 -1
  243. package/lib/dist/workflows/executor.js +130 -33
  244. package/lib/dist/workflows/executor.js.map +1 -1
  245. package/lib/dist/workflows/gc.d.ts +50 -0
  246. package/lib/dist/workflows/gc.d.ts.map +1 -0
  247. package/lib/dist/workflows/gc.js +120 -0
  248. package/lib/dist/workflows/gc.js.map +1 -0
  249. package/lib/dist/workflows/merge-queue.d.ts +64 -0
  250. package/lib/dist/workflows/merge-queue.d.ts.map +1 -0
  251. package/lib/dist/workflows/merge-queue.js +162 -0
  252. package/lib/dist/workflows/merge-queue.js.map +1 -0
  253. package/lib/dist/workflows/runners/approval.d.ts +1 -1
  254. package/lib/dist/workflows/runners/approval.d.ts.map +1 -1
  255. package/lib/dist/workflows/runners/approval.js +11 -2
  256. package/lib/dist/workflows/runners/approval.js.map +1 -1
  257. package/lib/dist/workflows/runners/bash.d.ts +15 -0
  258. package/lib/dist/workflows/runners/bash.d.ts.map +1 -1
  259. package/lib/dist/workflows/runners/bash.js +50 -1
  260. package/lib/dist/workflows/runners/bash.js.map +1 -1
  261. package/lib/dist/workflows/runners/prompt.d.ts +16 -41
  262. package/lib/dist/workflows/runners/prompt.d.ts.map +1 -1
  263. package/lib/dist/workflows/runners/prompt.js +55 -120
  264. package/lib/dist/workflows/runners/prompt.js.map +1 -1
  265. package/lib/dist/workflows/runners/types.d.ts +12 -0
  266. package/lib/dist/workflows/runners/types.d.ts.map +1 -1
  267. package/lib/dist/workflows/schemas/workflow.d.ts +17 -0
  268. package/lib/dist/workflows/schemas/workflow.d.ts.map +1 -1
  269. package/lib/dist/workflows/schemas/workflow.js +27 -0
  270. package/lib/dist/workflows/schemas/workflow.js.map +1 -1
  271. package/lib/node_modules/.package-lock.json +1 -1
  272. package/lib/package.json +2 -2
  273. package/package.json +5 -3
  274. package/node.exe +0 -4
@@ -0,0 +1,390 @@
1
+ "use strict";
2
+ /**
3
+ * Mechanical post-implement checks (PIPETRUST-DOC, REQ-PIPETRUST-005).
4
+ *
5
+ * On 2026-10-26 every `spec-implement` run needed a human to finish it, for
6
+ * reasons a script can see: test evidence linked by `it()` title strings (no
7
+ * edge, so the requirement could never reach `verified`), criteria with no
8
+ * test, source changes with no CHANGELOG entry, generated reference docs not
9
+ * regenerated. Postcheck checks those mechanically after implement so the
10
+ * workflow can fix them before a human ever looks.
11
+ *
12
+ * File-based by design: it runs inside a workflow worktree, which has no
13
+ * SpecShip index, so it reads the spec file and the test files directly.
14
+ *
15
+ * 1. `verifies:` coverage — every bullet is `path:Symbol` with a real,
16
+ * space-free symbol defined in the test file; every acceptance criterion
17
+ * id appears in at least one of those test files.
18
+ * 2. CHANGELOG — when files under `src/` changed against the base ref, the
19
+ * `## [Unreleased]` section of CHANGELOG.md changed too.
20
+ * 3. Project checks — each `postcheck.commands` entry in specship.config.json
21
+ * (`{ name, check, fix? }`); with `fix`, the fix command runs first.
22
+ */
23
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
30
+ }) : (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ o[k2] = m[k];
33
+ }));
34
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }) : function(o, v) {
37
+ o["default"] = v;
38
+ });
39
+ var __importStar = (this && this.__importStar) || (function () {
40
+ var ownKeys = function(o) {
41
+ ownKeys = Object.getOwnPropertyNames || function (o) {
42
+ var ar = [];
43
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
44
+ return ar;
45
+ };
46
+ return ownKeys(o);
47
+ };
48
+ return function (mod) {
49
+ if (mod && mod.__esModule) return mod;
50
+ var result = {};
51
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
52
+ __setModuleDefault(result, mod);
53
+ return result;
54
+ };
55
+ })();
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.requirementBlock = requirementBlock;
58
+ exports.criterionIds = criterionIds;
59
+ exports.linkBullets = linkBullets;
60
+ exports.checkVerifiesCoverage = checkVerifiesCoverage;
61
+ exports.unreleasedSection = unreleasedSection;
62
+ exports.resolveBaseRef = resolveBaseRef;
63
+ exports.checkChangelog = checkChangelog;
64
+ exports.readPostcheckCommands = readPostcheckCommands;
65
+ exports.checkConfiguredCommands = checkConfiguredCommands;
66
+ exports.checkMutation = checkMutation;
67
+ exports.findSpecFile = findSpecFile;
68
+ exports.runPostcheck = runPostcheck;
69
+ exports.formatPostcheck = formatPostcheck;
70
+ const fs = __importStar(require("fs"));
71
+ const path = __importStar(require("path"));
72
+ const child_process_1 = require("child_process");
73
+ const enforce_1 = require("../knowledge/enforce");
74
+ const criterion_ids_1 = require("./criterion-ids");
75
+ const enforce_2 = require("../enforce/enforce");
76
+ const mutation_1 = require("../enforce/mutation");
77
+ const ID_MARKER = /^<!--\s*id:\s*([A-Za-z0-9._-]+)\s*-->\s*$/;
78
+ /** The requirement's block of the spec file: from its id marker to the next requirement-level marker. */
79
+ function requirementBlock(source, requirementId) {
80
+ const lines = source.split(/\r?\n/);
81
+ let start = -1;
82
+ for (let i = 0; i < lines.length; i++) {
83
+ const m = (lines[i] ?? '').match(ID_MARKER);
84
+ if (!m)
85
+ continue;
86
+ if (start === -1) {
87
+ if (m[1] === requirementId)
88
+ start = i;
89
+ }
90
+ else if (!m[1].startsWith(`${requirementId}.`)) {
91
+ return lines.slice(start, i).join('\n');
92
+ }
93
+ }
94
+ return start === -1 ? null : lines.slice(start).join('\n');
95
+ }
96
+ /** Acceptance criterion ids declared under the requirement. */
97
+ function criterionIds(block, requirementId) {
98
+ const ids = [];
99
+ for (const line of block.split(/\r?\n/)) {
100
+ const m = line.match(ID_MARKER);
101
+ if (m && m[1].startsWith(`${requirementId}.A`))
102
+ ids.push(m[1]);
103
+ }
104
+ return ids;
105
+ }
106
+ /** Bullets of a `<name>:` link block inside the requirement block. */
107
+ function linkBullets(block, blockName) {
108
+ const lines = block.split(/\r?\n/);
109
+ const out = [];
110
+ let inBlock = false;
111
+ for (const line of lines) {
112
+ if (new RegExp(`^${blockName}:\\s*$`).test(line.trim()) && !/^\s/.test(line)) {
113
+ inBlock = true;
114
+ continue;
115
+ }
116
+ if (!inBlock)
117
+ continue;
118
+ const m = line.match(/^\s+-\s+(.+?)\s*$/);
119
+ if (m) {
120
+ out.push(m[1]);
121
+ continue;
122
+ }
123
+ if (line.trim() === '')
124
+ continue;
125
+ inBlock = false;
126
+ }
127
+ return out;
128
+ }
129
+ function symbolDefined(source, symbol) {
130
+ const s = symbol.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
131
+ return new RegExp(`\\b(function\\*?|const|let|var|class|def|fn|func)\\s+${s}\\b|\\b${s}\\s*[:=]\\s*(async\\s+)?(function|\\()`).test(source);
132
+ }
133
+ /** REQ-PIPETRUST-005.A1/A2 — `verifies:` bullets are real named test symbols and cover every criterion. */
134
+ function checkVerifiesCoverage(projectRoot, specSource, requirementId) {
135
+ const findings = [];
136
+ const block = requirementBlock(specSource, requirementId);
137
+ if (!block)
138
+ return [{ check: 'verifies', message: `${requirementId} not found in its spec file` }];
139
+ const testSources = [];
140
+ for (const bullet of linkBullets(block, 'verifies')) {
141
+ const idx = bullet.lastIndexOf(':');
142
+ const file = idx > 0 ? bullet.slice(0, idx) : bullet;
143
+ const symbol = idx > 0 ? bullet.slice(idx + 1) : '';
144
+ if (!symbol) {
145
+ findings.push({ check: 'verifies', message: `verifies bullet "${bullet}" names no symbol (use path:Symbol)` });
146
+ continue;
147
+ }
148
+ if (/\s/.test(symbol)) {
149
+ findings.push({
150
+ check: 'verifies',
151
+ message: `verifies bullet "${bullet}" names a title string, not a symbol — pass a named function to it() and list that name`,
152
+ });
153
+ continue;
154
+ }
155
+ let source;
156
+ try {
157
+ source = fs.readFileSync(path.join(projectRoot, file), 'utf-8');
158
+ }
159
+ catch {
160
+ findings.push({ check: 'verifies', message: `verifies bullet "${bullet}": file ${file} not found` });
161
+ continue;
162
+ }
163
+ if (!symbolDefined(source, symbol)) {
164
+ findings.push({ check: 'verifies', message: `verifies bullet "${bullet}": no symbol ${symbol} defined in ${file}` });
165
+ continue;
166
+ }
167
+ testSources.push(source);
168
+ }
169
+ // Whole-id match with shorthand expanded: `REQ-X.A1/A3` covers A3, and
170
+ // `REQ-X.A10` never counts for A1 (REQ-PIPETRUST-008).
171
+ const named = new Set(testSources.flatMap((src) => (0, criterion_ids_1.criterionIdsInText)(src)));
172
+ for (const id of criterionIds(block, requirementId)) {
173
+ if (!named.has(id)) {
174
+ findings.push({
175
+ check: 'verifies',
176
+ message: `${id} has no test evidence — no verifies-listed test file mentions it (put the id in the it() title)`,
177
+ });
178
+ }
179
+ }
180
+ return findings;
181
+ }
182
+ /** The `## [Unreleased]` section of a CHANGELOG, or '' when absent. */
183
+ function unreleasedSection(changelog) {
184
+ const start = changelog.indexOf('## [Unreleased]');
185
+ if (start === -1)
186
+ return '';
187
+ const next = changelog.indexOf('\n## [', start + 1);
188
+ return changelog.slice(start, next === -1 ? undefined : next);
189
+ }
190
+ function git(cwd, args) {
191
+ return (0, child_process_1.execSync)(`git ${args}`, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
192
+ }
193
+ /** Base ref: explicit, else the run base the readiness step recorded, else merge-base with the default branch. */
194
+ function resolveBaseRef(projectRoot, explicit) {
195
+ if (explicit)
196
+ return explicit;
197
+ try {
198
+ const gitDir = git(projectRoot, 'rev-parse --git-dir');
199
+ const recorded = path.join(path.isAbsolute(gitDir) ? gitDir : path.join(projectRoot, gitDir), 'specship-run-base');
200
+ if (fs.existsSync(recorded)) {
201
+ const ref = fs.readFileSync(recorded, 'utf8').trim();
202
+ if (ref)
203
+ return ref;
204
+ }
205
+ }
206
+ catch {
207
+ /* not a git repo — fall through */
208
+ }
209
+ for (const candidate of ['origin/main', 'main', 'origin/master', 'master']) {
210
+ try {
211
+ return git(projectRoot, `merge-base HEAD ${candidate}`);
212
+ }
213
+ catch {
214
+ /* try the next */
215
+ }
216
+ }
217
+ return null;
218
+ }
219
+ /** REQ-PIPETRUST-005.A3 — source changes need a CHANGELOG [Unreleased] change. */
220
+ function checkChangelog(opts) {
221
+ const base = resolveBaseRef(opts.projectRoot, opts.base);
222
+ if (!base)
223
+ return [];
224
+ const changed = opts.changedFiles?.(base) ??
225
+ git(opts.projectRoot, `diff --name-only ${base}`).split('\n').filter(Boolean);
226
+ if (!changed.some((f) => f.startsWith('src/')))
227
+ return [];
228
+ const changelogPath = path.join(opts.projectRoot, 'CHANGELOG.md');
229
+ if (!fs.existsSync(changelogPath))
230
+ return [];
231
+ const now = unreleasedSection(fs.readFileSync(changelogPath, 'utf8'));
232
+ let before;
233
+ if (opts.baseFile)
234
+ before = opts.baseFile(base, 'CHANGELOG.md');
235
+ else {
236
+ try {
237
+ before = git(opts.projectRoot, `show ${base}:CHANGELOG.md`);
238
+ }
239
+ catch {
240
+ before = null;
241
+ }
242
+ }
243
+ if (before !== null && unreleasedSection(before) === now) {
244
+ return [
245
+ {
246
+ check: 'changelog',
247
+ message: 'files under src/ changed but CHANGELOG.md ## [Unreleased] did not — add a user-facing entry',
248
+ },
249
+ ];
250
+ }
251
+ return [];
252
+ }
253
+ /** `postcheck.commands` from specship.config.json (empty when absent or malformed). */
254
+ function readPostcheckCommands(projectRoot) {
255
+ try {
256
+ const cfg = JSON.parse(fs.readFileSync(path.join(projectRoot, 'specship.config.json'), 'utf8'));
257
+ const cmds = cfg?.postcheck?.commands;
258
+ if (!Array.isArray(cmds))
259
+ return [];
260
+ return cmds.filter((c) => !!c && typeof c.name === 'string' && typeof c.check === 'string');
261
+ }
262
+ catch {
263
+ return [];
264
+ }
265
+ }
266
+ function defaultRun(command, cwd) {
267
+ const r = (0, child_process_1.spawnSync)('bash', ['-c', command], { cwd, encoding: 'utf8' });
268
+ return { code: r.status ?? 1, output: `${r.stdout ?? ''}${r.stderr ?? ''}` };
269
+ }
270
+ /** REQ-PIPETRUST-005.A4 — configured check commands, fix first when asked. */
271
+ function checkConfiguredCommands(opts, ran) {
272
+ const run = opts.run ?? defaultRun;
273
+ const findings = [];
274
+ for (const cmd of readPostcheckCommands(opts.projectRoot)) {
275
+ if (opts.fix && cmd.fix)
276
+ run(cmd.fix, opts.projectRoot);
277
+ const res = run(cmd.check, opts.projectRoot);
278
+ ran.push(`command ${cmd.name}: ${res.code === 0 ? 'ok' : 'failed'}`);
279
+ if (res.code !== 0) {
280
+ findings.push({
281
+ check: 'command',
282
+ message: `${cmd.name} failed (${cmd.check})${cmd.fix ? '' : ' — no fix configured'}:\n${res.output.trim().split('\n').slice(-15).join('\n')}`,
283
+ });
284
+ }
285
+ }
286
+ return findings;
287
+ }
288
+ /**
289
+ * REQ-THRU-010 — when `enforce.mutation` is configured, the requirement's
290
+ * implementation files must clear the mutant kill-rate threshold in the
291
+ * project's mutation report. Without configuration the check does not exist;
292
+ * an unreadable report is reported as skipped (never a pass, never a failure),
293
+ * matching the enforcement gate (REQ-QGATE-002.A3).
294
+ */
295
+ function checkMutation(opts, specFile, ran) {
296
+ const cfg = (0, enforce_2.loadEnforceConfig)(opts.projectRoot);
297
+ if (cfg.mutation === undefined)
298
+ return [];
299
+ const deps = (0, mutation_1.loadMutationDeps)(opts.projectRoot, cfg.mutation);
300
+ if (deps.stats === null) {
301
+ ran.push(`mutation: skipped — ${deps.reason ?? 'no report'}`);
302
+ return [];
303
+ }
304
+ const block = specFile ? requirementBlock(fs.readFileSync(specFile, 'utf8'), opts.requirementId) : null;
305
+ const files = new Set((block ? linkBullets(block, 'implementations') : []).map((b) => {
306
+ const idx = b.lastIndexOf(':');
307
+ return (idx > 0 ? b.slice(0, idx) : b).replace(/\\/g, '/');
308
+ }));
309
+ const findings = [];
310
+ const pct = (n) => `${Math.round(n * 100)}%`;
311
+ for (const file of files) {
312
+ const st = deps.stats.get(file);
313
+ if (!st || st.total === 0)
314
+ continue;
315
+ const rate = st.killed / st.total;
316
+ if (rate < deps.threshold) {
317
+ findings.push({
318
+ check: 'mutation',
319
+ message: `${file} mutant kill rate ${pct(rate)} < ${pct(deps.threshold)} threshold (${st.killed}/${st.total} killed) — the tests would not notice this code breaking`,
320
+ });
321
+ }
322
+ }
323
+ ran.push(`mutation: ${findings.length === 0 ? 'ok' : `${findings.length} weak file(s)`} (threshold ${pct(deps.threshold)})`);
324
+ return findings;
325
+ }
326
+ /** Locate the spec file declaring `requirementId` under specs/. */
327
+ function findSpecFile(projectRoot, requirementId) {
328
+ const marker = `<!-- id: ${requirementId} -->`;
329
+ const walk = (dir) => {
330
+ let entries;
331
+ try {
332
+ entries = fs.readdirSync(dir, { withFileTypes: true });
333
+ }
334
+ catch {
335
+ return null;
336
+ }
337
+ for (const e of entries) {
338
+ const p = path.join(dir, e.name);
339
+ if (e.isDirectory()) {
340
+ const hit = walk(p);
341
+ if (hit)
342
+ return hit;
343
+ }
344
+ else if (e.name.endsWith('.md') && fs.readFileSync(p, 'utf8').includes(marker)) {
345
+ return p;
346
+ }
347
+ }
348
+ return null;
349
+ };
350
+ return walk(path.join(projectRoot, 'specs'));
351
+ }
352
+ function runPostcheck(opts) {
353
+ const ran = [];
354
+ const findings = [];
355
+ const specFile = findSpecFile(opts.projectRoot, opts.requirementId);
356
+ if (!specFile) {
357
+ findings.push({ check: 'verifies', message: `no spec file under specs/ declares ${opts.requirementId}` });
358
+ }
359
+ else {
360
+ const f = checkVerifiesCoverage(opts.projectRoot, fs.readFileSync(specFile, 'utf8'), opts.requirementId);
361
+ ran.push(`verifies coverage: ${f.length === 0 ? 'ok' : `${f.length} finding(s)`}`);
362
+ findings.push(...f);
363
+ }
364
+ const c = checkChangelog(opts);
365
+ ran.push(`changelog: ${c.length === 0 ? 'ok' : 'missing entry'}`);
366
+ findings.push(...c);
367
+ findings.push(...checkConfiguredCommands(opts, ran));
368
+ // REQ-THRU-010 — the mutation gate, when the project configured one.
369
+ findings.push(...checkMutation(opts, specFile, ran));
370
+ // REQ-KNOW-003.A4 — enforced domain-fact rules are a built-in check.
371
+ const enforced = (0, enforce_1.checkEnforcedRules)(opts.projectRoot);
372
+ if (enforced.rulesChecked > 0) {
373
+ ran.push(`knowledge check: ${enforced.violations.length === 0 ? 'ok' : `${enforced.violations.length} violation(s)`} (${enforced.rulesChecked} enforced rule(s))`);
374
+ }
375
+ for (const v of enforced.violations) {
376
+ findings.push({
377
+ check: 'knowledge',
378
+ message: `${v.file}:${v.line} violates ${v.factId} (${v.rule}): ${v.text.trim()}`,
379
+ });
380
+ }
381
+ return { ok: findings.length === 0, findings, ran };
382
+ }
383
+ /** Marker-led rendering; POSTCHECK=passed|failed is the workflow contract. */
384
+ function formatPostcheck(result) {
385
+ const lines = [`POSTCHECK=${result.ok ? 'passed' : 'failed'}`, ...result.ran.map((r) => `- ${r}`)];
386
+ for (const f of result.findings)
387
+ lines.push(`✗ [${f.check}] ${f.message}`);
388
+ return lines.join('\n');
389
+ }
390
+ //# sourceMappingURL=postcheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postcheck.js","sourceRoot":"","sources":["../../src/spec-quality/postcheck.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CH,4CAaC;AAGD,oCAOC;AAGD,kCAmBC;AAUD,sDA+CC;AAGD,8CAKC;AAOD,wCAoBC;AAGD,wCA4BC;AAGD,sDAYC;AAQD,0DAeC;AASD,sCA8BC;AAGD,oCAqBC;AAED,oCAmCC;AAGD,0CAIC;AArWD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAoD;AACpD,kDAA0D;AAC1D,mDAAqD;AACrD,gDAAuD;AACvD,kDAAuD;AAmCvD,MAAM,SAAS,GAAG,2CAA2C,CAAC;AAE9D,yGAAyG;AACzG,SAAgB,gBAAgB,CAAC,MAAc,EAAE,aAAqB;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,aAAa;gBAAE,KAAK,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,+DAA+D;AAC/D,SAAgB,YAAY,CAAC,KAAa,EAAE,aAAqB;IAC/D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,GAAG,aAAa,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sEAAsE;AACtE,SAAgB,WAAW,CAAC,KAAa,EAAE,SAAyC;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7E,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,MAAc;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,IAAI,MAAM,CACf,wDAAwD,CAAC,UAAU,CAAC,wCAAwC,CAC7G,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,2GAA2G;AAC3G,SAAgB,qBAAqB,CAAC,WAAmB,EAAE,UAAkB,EAAE,aAAqB;IAClG,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,aAAa,6BAA6B,EAAE,CAAC,CAAC;IAEnG,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,MAAM,qCAAqC,EAAE,CAAC,CAAC;YAC/G,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,oBAAoB,MAAM,yFAAyF;aAC7H,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC,CAAC;YACrG,SAAS;QACX,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,MAAM,gBAAgB,MAAM,eAAe,IAAI,EAAE,EAAE,CAAC,CAAC;YACrH,SAAS;QACX,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,uEAAuE;IACvE,uDAAuD;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,kCAAkB,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7E,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,GAAG,EAAE,iGAAiG;aAChH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,uEAAuE;AACvE,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,GAAG,CAAC,GAAW,EAAE,IAAY;IACpC,OAAO,IAAA,wBAAQ,EAAC,OAAO,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACxG,CAAC;AAED,kHAAkH;AAClH,SAAgB,cAAc,CAAC,WAAmB,EAAE,QAAiB;IACnE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACnH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,WAAW,EAAE,mBAAmB,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,SAAgB,cAAc,CAAC,IAAsB;IACnD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,OAAO,GACX,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,IAAI,MAAqB,CAAC;IAC1B,IAAI,IAAI,CAAC,QAAQ;QAAE,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;SAC3D,CAAC;QACJ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,IAAI,eAAe,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QACzD,OAAO;YACL;gBACE,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,6FAA6F;aACvG;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,uFAAuF;AACvF,SAAgB,qBAAqB,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,CAAU,EAAyB,EAAE,CACpC,CAAC,CAAC,CAAC,IAAI,OAAQ,CAAsB,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAQ,CAAsB,CAAC,KAAK,KAAK,QAAQ,CAC/G,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,GAAW;IAC9C,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,8EAA8E;AAC9E,SAAgB,uBAAuB,CAAC,IAAsB,EAAE,GAAa;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC;IACnC,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1D,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC9I,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,IAAsB,EAAE,QAAuB,EAAE,GAAa;IAC1F,MAAM,GAAG,GAAG,IAAA,2BAAiB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC;QAC9D,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxG,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7D,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC;YAAE,SAAS;QACpC,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC;QAClC,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,GAAG,IAAI,qBAAqB,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,0DAA0D;aACtK,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,eAAe,eAAe,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7H,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,mEAAmE;AACnE,SAAgB,YAAY,CAAC,WAAmB,EAAE,aAAqB;IACrE,MAAM,MAAM,GAAG,YAAY,aAAa,MAAM,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,GAAW,EAAiB,EAAE;QAC1C,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,GAAG;oBAAE,OAAO,GAAG,CAAC;YACtB,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjF,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,YAAY,CAAC,IAAsB;IACjD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sCAAsC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAC5G,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACzG,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;QACnF,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/B,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEpB,QAAQ,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAErD,qEAAqE;IACrE,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAErD,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAA,4BAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,eAAe,KAAK,QAAQ,CAAC,YAAY,oBAAoB,CAAC,CAAC;IACrK,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;SAClF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,SAAgB,eAAe,CAAC,MAAuB;IACrD,MAAM,KAAK,GAAG,CAAC,aAAa,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACnG,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Spec readiness gate (PIPETRUST-DOC, REQ-PIPETRUST-004).
3
+ *
4
+ * Implement must not start on a spec that cannot be implemented to a
5
+ * verifiable result. A requirement is READY when its spec file lints without
6
+ * errors, it has at least one acceptance criterion, and no criterion still
7
+ * carries a `[needs review]` marker. A ready requirement also yields an
8
+ * EVIDENCE PLAN — one line per criterion with the evidence kind it requires
9
+ * (REQ-PIPETRUST-001) and a suggested named test function — which the
10
+ * implement workflows hand to their plan and implement steps so "untested"
11
+ * can never be planned in.
12
+ *
13
+ * Pure core (`assessReadiness`) over plain inputs, plus a thin loader
14
+ * (`assessReadinessFromIndex`) that reads them from a SpecShip index.
15
+ */
16
+ import type { Spec, SpecLink } from '../types';
17
+ import { type LintFinding } from '../spec-lint/lint';
18
+ import { type EvidenceKind } from './evidence-kind';
19
+ export interface EvidencePlanLine {
20
+ criterionId: string;
21
+ text: string;
22
+ kind: EvidenceKind;
23
+ /** Suggested named test function — a real symbol `verifies:` can point at. */
24
+ testName: string;
25
+ }
26
+ export interface ReadinessResult {
27
+ requirementId: string;
28
+ ready: boolean;
29
+ /** Why the requirement is not ready (empty when ready). */
30
+ reasons: string[];
31
+ plan: EvidencePlanLine[];
32
+ }
33
+ export interface ReadinessInput {
34
+ requirementId: string;
35
+ requirement: Spec | null;
36
+ criteria: Spec[];
37
+ /** The requirement's (and its criteria's) `implements` links. */
38
+ implementsLinks: SpecLink[];
39
+ /** Lint findings for the requirement's spec file. */
40
+ lintFindings: LintFinding[];
41
+ }
42
+ /**
43
+ * Deterministic test-function name for a criterion id:
44
+ * `REQ-PIPETRUST-004.A1` → `reqPipetrust004A1`. Authors are expected to rename
45
+ * it to describe the behaviour; it exists so the plan names a real symbol.
46
+ */
47
+ export declare function suggestedTestName(criterionId: string): string;
48
+ export declare function assessReadiness(input: ReadinessInput): ReadinessResult;
49
+ /** Human / prompt-facing rendering. The READY marker is the machine contract. */
50
+ export declare function formatEvidencePlan(result: ReadinessResult): string;
51
+ /** Structural slice of SpecQueries the loader reads. */
52
+ export interface ReadinessSpecQueries {
53
+ getSpecById(id: string): Spec | null;
54
+ getSpecsByParent(parentId: string): Spec[];
55
+ getLinksBySpec(specId: string): SpecLink[];
56
+ }
57
+ /** Load the inputs for `assessReadiness` from an index and the spec file on disk. */
58
+ export declare function assessReadinessFromIndex(sq: ReadinessSpecQueries, projectRoot: string, requirementId: string): ReadinessResult;
59
+ /** Acceptance bullets (id → text) read straight from a requirement block. */
60
+ export declare function criteriaFromBlock(block: string, requirementId: string): Array<{
61
+ id: string;
62
+ text: string;
63
+ }>;
64
+ /**
65
+ * File-based readiness: works without a SpecShip index (a workflow worktree
66
+ * has none — and a CLI with no project index must never walk up to $HOME).
67
+ * UI linkage comes from the `implementations:` bullets' file extensions;
68
+ * route linkage needs the index, so it is only known when `routeTargets`
69
+ * is supplied by an index-backed caller.
70
+ */
71
+ export declare function assessReadinessFromFile(projectRoot: string, requirementId: string, routeTargets?: Set<string>): ReadinessResult;
72
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../src/spec-quality/readiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO1E,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,gBAAgB,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,iEAAiE;IACjE,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,qDAAqD;IACrD,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAOD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CA+BtE;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiBlE;AAED,wDAAwD;AACxD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC;IAC3C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;CAC5C;AAED,qFAAqF;AACrF,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,oBAAoB,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,eAAe,CA8BjB;AAID,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB3G;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,YAAY,GAAE,GAAG,CAAC,MAAM,CAAa,GACpC,eAAe,CAiCjB"}