@specship/specship-win32-arm64 0.21.2 → 0.22.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 (96) hide show
  1. package/lib/dist/bin/specship.js +302 -4
  2. package/lib/dist/bin/specship.js.map +1 -1
  3. package/lib/dist/commands/specship/jira.md +74 -0
  4. package/lib/dist/commands/specship/spec.md +61 -1
  5. package/lib/dist/extraction/index.d.ts +6 -0
  6. package/lib/dist/extraction/index.d.ts.map +1 -1
  7. package/lib/dist/extraction/index.js.map +1 -1
  8. package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
  9. package/lib/dist/extraction/specs/markdown-spec-extractor.js +8 -1
  10. package/lib/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
  11. package/lib/dist/index.d.ts +7 -0
  12. package/lib/dist/index.d.ts.map +1 -1
  13. package/lib/dist/index.js +45 -18
  14. package/lib/dist/index.js.map +1 -1
  15. package/lib/dist/jira/auto-publish.d.ts +67 -0
  16. package/lib/dist/jira/auto-publish.d.ts.map +1 -0
  17. package/lib/dist/jira/auto-publish.js +232 -0
  18. package/lib/dist/jira/auto-publish.js.map +1 -0
  19. package/lib/dist/jira/board-first.d.ts +64 -0
  20. package/lib/dist/jira/board-first.d.ts.map +1 -0
  21. package/lib/dist/jira/board-first.js +91 -0
  22. package/lib/dist/jira/board-first.js.map +1 -0
  23. package/lib/dist/jira/client.d.ts +80 -1
  24. package/lib/dist/jira/client.d.ts.map +1 -1
  25. package/lib/dist/jira/client.js +213 -1
  26. package/lib/dist/jira/client.js.map +1 -1
  27. package/lib/dist/jira/config.d.ts +1 -1
  28. package/lib/dist/jira/config.d.ts.map +1 -1
  29. package/lib/dist/jira/config.js +14 -3
  30. package/lib/dist/jira/config.js.map +1 -1
  31. package/lib/dist/jira/coverage.d.ts +105 -0
  32. package/lib/dist/jira/coverage.d.ts.map +1 -0
  33. package/lib/dist/jira/coverage.js +160 -0
  34. package/lib/dist/jira/coverage.js.map +1 -0
  35. package/lib/dist/jira/index.d.ts +1 -0
  36. package/lib/dist/jira/index.d.ts.map +1 -1
  37. package/lib/dist/jira/index.js +1 -0
  38. package/lib/dist/jira/index.js.map +1 -1
  39. package/lib/dist/jira/milestone-comment.d.ts +95 -0
  40. package/lib/dist/jira/milestone-comment.d.ts.map +1 -0
  41. package/lib/dist/jira/milestone-comment.js +271 -0
  42. package/lib/dist/jira/milestone-comment.js.map +1 -0
  43. package/lib/dist/jira/publish.d.ts +69 -2
  44. package/lib/dist/jira/publish.d.ts.map +1 -1
  45. package/lib/dist/jira/publish.js +0 -0
  46. package/lib/dist/jira/publish.js.map +1 -1
  47. package/lib/dist/jira/published-specs.d.ts +23 -0
  48. package/lib/dist/jira/published-specs.d.ts.map +1 -0
  49. package/lib/dist/jira/published-specs.js +106 -0
  50. package/lib/dist/jira/published-specs.js.map +1 -0
  51. package/lib/dist/jira/reconcile.d.ts +81 -0
  52. package/lib/dist/jira/reconcile.d.ts.map +1 -0
  53. package/lib/dist/jira/reconcile.js +111 -0
  54. package/lib/dist/jira/reconcile.js.map +1 -0
  55. package/lib/dist/jira/regression-pack.d.ts +547 -0
  56. package/lib/dist/jira/regression-pack.d.ts.map +1 -0
  57. package/lib/dist/jira/regression-pack.js +986 -0
  58. package/lib/dist/jira/regression-pack.js.map +1 -0
  59. package/lib/dist/jira/repo-config.d.ts +59 -0
  60. package/lib/dist/jira/repo-config.d.ts.map +1 -0
  61. package/lib/dist/jira/repo-config.js +222 -0
  62. package/lib/dist/jira/repo-config.js.map +1 -0
  63. package/lib/dist/jira/spec-amend.d.ts +46 -0
  64. package/lib/dist/jira/spec-amend.d.ts.map +1 -0
  65. package/lib/dist/jira/spec-amend.js +232 -0
  66. package/lib/dist/jira/spec-amend.js.map +1 -0
  67. package/lib/dist/jira/spec-writer.d.ts +22 -0
  68. package/lib/dist/jira/spec-writer.d.ts.map +1 -1
  69. package/lib/dist/jira/spec-writer.js +113 -0
  70. package/lib/dist/jira/spec-writer.js.map +1 -1
  71. package/lib/dist/jira/types.d.ts +62 -0
  72. package/lib/dist/jira/types.d.ts.map +1 -1
  73. package/lib/dist/jira/types.js +15 -1
  74. package/lib/dist/jira/types.js.map +1 -1
  75. package/lib/dist/mcp/jira-tools.d.ts +102 -0
  76. package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
  77. package/lib/dist/mcp/jira-tools.js +807 -50
  78. package/lib/dist/mcp/jira-tools.js.map +1 -1
  79. package/lib/dist/mcp/server-instructions.d.ts +1 -1
  80. package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
  81. package/lib/dist/mcp/server-instructions.js +4 -0
  82. package/lib/dist/mcp/server-instructions.js.map +1 -1
  83. package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
  84. package/lib/dist/mcp/spec-tools.js +7 -1
  85. package/lib/dist/mcp/spec-tools.js.map +1 -1
  86. package/lib/dist/mcp/tools.d.ts +3 -0
  87. package/lib/dist/mcp/tools.d.ts.map +1 -1
  88. package/lib/dist/mcp/tools.js +50 -0
  89. package/lib/dist/mcp/tools.js.map +1 -1
  90. package/lib/dist/resolution/spec-link-resolver.d.ts +2 -0
  91. package/lib/dist/resolution/spec-link-resolver.d.ts.map +1 -1
  92. package/lib/dist/resolution/spec-link-resolver.js +11 -3
  93. package/lib/dist/resolution/spec-link-resolver.js.map +1 -1
  94. package/lib/node_modules/.package-lock.json +1 -1
  95. package/lib/package.json +1 -1
  96. package/package.json +1 -1
@@ -0,0 +1,547 @@
1
+ /**
2
+ * Regression pack builder + upsert (JIRA-REGRESSION-DOC, REQ-JIRAREG-001).
3
+ *
4
+ * Reads the loaded spec set, filters to requirements whose acceptance-side
5
+ * link roll-up counts as implemented or verified (at least one implements-kind
6
+ * link on the requirement or one of its acceptance children reads implemented
7
+ * or verified), and expands each `REQ-*.A<N>` into a regression case grouped by
8
+ * a domain area. Domain-area derivation is REQ-JIRAREG-002's concern — this
9
+ * module files every case under the single `Uncategorised` placeholder area;
10
+ * `groupCasesByDomain` is a trivial passthrough so REQ-JIRAREG-002 has one
11
+ * seam to enrich later.
12
+ *
13
+ * The upsert side is a fingerprint-gated idempotent writer, mirroring
14
+ * `publish.ts`: one watermarked epic per project (found by label, never
15
+ * created twice), one Story per domain area (found by label), one Sub-task
16
+ * per case (found by label). Fingerprint drift on the rendered body drives
17
+ * create / update / skip.
18
+ *
19
+ * SECURITY (REQ-JIRA-009): only public keys + spec-derived text ever travel
20
+ * through here — no credential is handled or echoed.
21
+ */
22
+ import type { Node, Spec, SpecLink, SpecLinkState } from '../types';
23
+ import { type MilestoneJiraClient, type PostMilestoneResult, type PackRunEvidence } from './milestone-comment';
24
+ /** One regression case — one acceptance criterion of an implemented spec. */
25
+ export interface RegressionCase {
26
+ /** The requirement id, e.g. `REQ-FOO-001`. */
27
+ reqId: string;
28
+ /** The acceptance criterion id, e.g. `REQ-FOO-001.A2`. */
29
+ criterionId: string;
30
+ /** The criterion text (bullet body / title). */
31
+ criterionText: string;
32
+ /** The requirement spec's source path (repo-relative). */
33
+ specPath: string;
34
+ /**
35
+ * Behaviour tier derived from the requirement's behaviour surface
36
+ * (REQ-JIRAREG-004.A2): `'ui'` iff any linked or neighbour node is a
37
+ * component / lives in a front-end file, otherwise `'backend'`.
38
+ * `'unknown'` is retained for callers that construct cases without a
39
+ * graph in reach (fixtures, dry planners) — never emitted by
40
+ * {@link buildRegressionPack} which always resolves a concrete tier.
41
+ */
42
+ tier: 'ui' | 'backend' | 'unknown';
43
+ /**
44
+ * True when the criterion body is too vague to execute against, or leaks
45
+ * code-shaped tokens (paths, symbols) the black-box pack must not echo
46
+ * (REQ-JIRAREG-004.A3). The case is still emitted so the pack stays
47
+ * complete; the report drives a human rephrase pass.
48
+ */
49
+ needsRephrase?: boolean;
50
+ /** Free-text reason surfaced by {@link renderRephraseReport}. */
51
+ rephraseReason?: string;
52
+ /**
53
+ * Domain area label for THIS case row — the area under which the case files.
54
+ * A requirement with two domain facts produces two `RegressionCase` rows: an
55
+ * `executable` under the first area and a `crossref` under the second.
56
+ */
57
+ domainArea: string;
58
+ /**
59
+ * All domain areas the requirement links to (sorted by domain spec id).
60
+ * Same list on every case row derived from the requirement — useful for the
61
+ * cross-reference body pointing back at siblings.
62
+ */
63
+ areasAll: string[];
64
+ /**
65
+ * `'executable'` files as the primary case in the requirement's first area.
66
+ * `'crossref'` files as a pointer in each additional area — same spec, no
67
+ * duplicate steps — so a tester scanning either area finds the case.
68
+ */
69
+ kind: 'executable' | 'crossref';
70
+ /**
71
+ * When `kind === 'crossref'`, the criterion id of the executable sibling
72
+ * (always equals `criterionId` — the cross-ref carries the same source id;
73
+ * this field lets renderers name the pair without recomputing).
74
+ */
75
+ crossReferenceOf?: string;
76
+ }
77
+ export interface EpicPlan {
78
+ summary: string;
79
+ description: string;
80
+ label: string;
81
+ }
82
+ export interface StoryPlan {
83
+ domainArea: string;
84
+ summary: string;
85
+ description: string;
86
+ label: string;
87
+ cases: CasePlan[];
88
+ }
89
+ export interface CasePlan {
90
+ reqId: string;
91
+ criterionId: string;
92
+ summary: string;
93
+ description: string;
94
+ label: string;
95
+ specPath: string;
96
+ /** `'executable'` or `'crossref'` — cross-refs carry a different label prefix. */
97
+ kind: 'executable' | 'crossref';
98
+ /** Tier label attached alongside the case marker (REQ-JIRAREG-004.A2). */
99
+ tierLabel: string;
100
+ }
101
+ /** One requirement with no domain-fact linkage — REQ-JIRAREG-002.A2. */
102
+ export interface DomainGap {
103
+ reqId: string;
104
+ specPath: string;
105
+ }
106
+ export interface RegressionPackModel {
107
+ epic: EpicPlan;
108
+ stories: StoryPlan[];
109
+ cases: CasePlan[];
110
+ /**
111
+ * Requirements that entered the pack with no domain-fact linkage. Rendered
112
+ * separately by {@link renderDomainGapReport} so the caller can prompt the
113
+ * `/specship:spec domain` capture flow (REQ-JIRAREG-002.A2).
114
+ */
115
+ domainGaps: DomainGap[];
116
+ /**
117
+ * Criteria the classifier flagged for human rephrase (REQ-JIRAREG-004.A3) —
118
+ * vague ("system works correctly") or leaking code-shaped tokens the
119
+ * black-box body must not echo. Rendered by {@link renderRephraseReport}.
120
+ */
121
+ rephraseFlags: RephraseFlag[];
122
+ }
123
+ /** One criterion flagged for rephrase (REQ-JIRAREG-004.A3). */
124
+ export interface RephraseFlag {
125
+ criterionId: string;
126
+ specPath: string;
127
+ reason: string;
128
+ }
129
+ export interface UpsertContext {
130
+ projectKey: string;
131
+ /** JIRA issue-type name for the pack epic. Default `Epic`. */
132
+ epicIssueType?: string;
133
+ /** JIRA issue-type name for the domain area. Default `Story`. */
134
+ storyIssueType?: string;
135
+ /** JIRA issue-type name for a case. Default `Sub-task`. */
136
+ caseIssueType?: string;
137
+ /** Dry-run: build the plan, do zero JIRA writes. */
138
+ dryRun?: boolean;
139
+ }
140
+ export interface UpsertResult {
141
+ epicKey: string | null;
142
+ epicCreated: boolean;
143
+ storiesCreated: number;
144
+ storiesUpdated: number;
145
+ storiesSkipped: number;
146
+ casesCreated: number;
147
+ casesUpdated: number;
148
+ casesSkipped: number;
149
+ /**
150
+ * Cross-reference sub-tasks (secondary-area pointers, REQ-JIRAREG-002.A1) —
151
+ * counted separately from executable cases so a re-run's zero-write bar can
152
+ * be asserted per kind.
153
+ */
154
+ crossRefsCreated: number;
155
+ crossRefsUpdated: number;
156
+ crossRefsSkipped: number;
157
+ /**
158
+ * Cases newly marked obsolete on this run — REQ-JIRAREG-003.A3. A re-run
159
+ * that finds the same case already carrying the obsolete watermark + label
160
+ * does not re-count it (REQ-JIRAREG-003.A4).
161
+ */
162
+ casesObsoleted: number;
163
+ /** JIRA keys of cases marked obsolete on this run (in scan order). */
164
+ obsoletedCaseKeys: string[];
165
+ /** Extra pack-epic issue keys found under the same label (single-epic invariant). */
166
+ orphanedEpicKeys: string[];
167
+ /** Per-case JIRA keys, keyed on `<reqId>.<criterionSuffix>` for back-linking. */
168
+ caseKeysByCriterion: Record<string, string>;
169
+ }
170
+ export declare const REG_PACK_EPIC_LABEL = "specship-regression-pack";
171
+ export declare const REG_PACK_DOMAIN_LABEL_PREFIX = "specship-regdomain-";
172
+ export declare const REG_PACK_CASE_LABEL_PREFIX = "specship-regcase-";
173
+ /**
174
+ * Cross-reference sub-tasks (REQ-JIRAREG-002.A1). Distinct prefix from the
175
+ * executable case label so a re-run finds the same cross-ref in the same area
176
+ * (idempotent) without conflating it with the primary case.
177
+ */
178
+ export declare const REG_PACK_XREF_LABEL_PREFIX = "specship-regxref-";
179
+ /**
180
+ * Stable marker label every regression case carries alongside its per-case
181
+ * slug label (REQ-JIRAREG-003). JIRA JQL cannot wildcard `labels`, so the
182
+ * orphan scan queries this fixed label to enumerate every case in the pack
183
+ * without touching the epic or area stories (which never carry it).
184
+ */
185
+ export declare const REG_PACK_CASE_MARKER_LABEL = "specship-regcase";
186
+ /**
187
+ * Board-filterable label attached to cases whose source criterion no longer
188
+ * exists in the spec set (REQ-JIRAREG-003.A3). A comment alone would be
189
+ * invisible in a JIRA filter — this label makes `labels = "specship-reg-obsolete"`
190
+ * a valid JQL query. Never removed automatically.
191
+ */
192
+ export declare const REG_PACK_OBSOLETE_LABEL = "specship-reg-obsolete";
193
+ /**
194
+ * Board-filterable tier labels (REQ-JIRAREG-004.A2) — testers can filter a
195
+ * board to just UI or just backend cases with a single label query. Attached
196
+ * to every executable + cross-ref case; the same tier is derived once per
197
+ * requirement so both rows in a two-area case carry the same label.
198
+ */
199
+ export declare const REG_PACK_TIER_LABEL_UI = "specship-tier-ui";
200
+ export declare const REG_PACK_TIER_LABEL_BACKEND = "specship-tier-backend";
201
+ export declare const REG_PACK_EPIC_WATERMARK = "<!-- specship:regression-pack v1 -->";
202
+ export declare const REG_PACK_STORY_WATERMARK = "<!-- specship:regression-pack:story v1 -->";
203
+ export declare const REG_PACK_CASE_WATERMARK = "<!-- specship:regression-pack:case v1 -->";
204
+ /**
205
+ * Stable prefix of the obsolete-marker comment (REQ-JIRAREG-003.A3). The
206
+ * per-run body carries a timestamp, but the idempotency key here does NOT
207
+ * include the timestamp — a re-run with the same `reason` finds the prior
208
+ * marker via `body.startsWith(prefix + reason + " -->")` and writes nothing
209
+ * (REQ-JIRAREG-003.A4).
210
+ */
211
+ export declare const REG_PACK_OBSOLETE_WATERMARK_PREFIX = "<!-- specship:regobsolete v1";
212
+ export interface BuilderSpecQueries {
213
+ getAllSpecs(): Spec[];
214
+ getSpecsByParent(parentId: string): Spec[];
215
+ getLinksBySpec(specId: string): SpecLink[];
216
+ /**
217
+ * Point lookup used by the domain-area walk (REQ-JIRAREG-002). Mirrors
218
+ * {@link SpecLinkResolver.getInheritedLinks}'s traversal — we need to
219
+ * resolve each declared spec id (via `parentId` / `metadata.depends_on`) to
220
+ * a `Spec` so its own dependency chain can be followed to the next hop.
221
+ */
222
+ getSpecById(id: string): Spec | undefined | null;
223
+ /**
224
+ * Optional graph accessor (REQ-JIRAREG-004.A2): the resolved code nodes a
225
+ * requirement + its acceptance children link to. Populated by the CLI /
226
+ * MCP wiring; absent in test fixtures unless a fixture opts in. When
227
+ * absent, {@link deriveCaseTier} falls back to `'backend'` (never spurious
228
+ * `'ui'`).
229
+ */
230
+ getLinkedNodesForReq?(reqId: string): Node[];
231
+ /**
232
+ * Optional graph accessor (REQ-JIRAREG-004.A2): 1-hop caller/callee
233
+ * neighbours of the given nodes. Widens tier detection so a backend
234
+ * handler that renders a linked UI component still classifies as UI.
235
+ */
236
+ getNeighbourNodes?(nodeIds: readonly string[]): Node[];
237
+ }
238
+ /** Stable fingerprint of a rendered body — mirrors publish.ts. */
239
+ export declare function regressionContentFingerprint(summary: string, description: string): string;
240
+ /**
241
+ * Read a stored fingerprint from an issue description, or `null` when absent.
242
+ * The fingerprint travels as `<!-- specship:regfp:<hex> -->` on its own line.
243
+ */
244
+ export declare function readStoredFingerprint(description: string | undefined | null): string | null;
245
+ /**
246
+ * Derive a case's tier from the requirement's behaviour surface
247
+ * (REQ-JIRAREG-004.A2). Delegates the UI/backend split to
248
+ * {@link computeBehaviourSurface} so the classification stays consistent
249
+ * with `/ss-behaviour`. A requirement with no linked nodes (or a
250
+ * fixture-mode sq without graph accessors) resolves to `'backend'` —
251
+ * never spurious UI.
252
+ */
253
+ export declare function deriveCaseTier(req: Spec, sq: BuilderSpecQueries): 'ui' | 'backend';
254
+ /**
255
+ * Classify a criterion body for A3: does it name an observable outcome, and
256
+ * does it stay in black-box vocabulary? Two failure modes both flag the case
257
+ * for human rephrase (never silently vague, never leaking file paths /
258
+ * symbols into the pack):
259
+ *
260
+ * 1. **Vague** — no observable verb ("returns", "renders", "MUST", …) and
261
+ * no reference to a concrete artefact ("response", "row", …).
262
+ * 2. **Code-shaped** — the text names a file path (`src/…`), a `.ts` / `.tsx`
263
+ * / `.js` / `.jsx` extension, or a backticked identifier
264
+ * (CamelCase / snake_case). Black-box cases must not echo white-box
265
+ * detail; the flag drives a rephrase pass.
266
+ *
267
+ * Deterministic and cheap on purpose — the goal is surfacing the flags,
268
+ * not scoring prose.
269
+ */
270
+ export declare function classifyCriterion(text: string): {
271
+ observable: boolean;
272
+ reason?: string;
273
+ };
274
+ /**
275
+ * Render the executable steps + reference section for a case
276
+ * (REQ-JIRAREG-001.A3, REQ-JIRAREG-004.A1). Black-box body: Steps carry no
277
+ * file paths, no code symbols, and no `- Spec:` pointer — those are
278
+ * white-box detail belonging on the source spec, not on the tester's
279
+ * checklist. The tier lands as a header line (readable) AND as a JIRA label
280
+ * on the issue (board-filterable, see {@link tierLabel}).
281
+ */
282
+ export declare function renderCaseSteps(rc: RegressionCase): string;
283
+ /**
284
+ * Render a cross-reference sub-task body (REQ-JIRAREG-002.A1). Same source
285
+ * id, no duplicate steps — just a pointer at the executable sibling so a
286
+ * tester scanning this area finds it. The label is separate so the same
287
+ * criterion produces one issue per area, and a re-run stays idempotent.
288
+ */
289
+ export declare function renderCrossReferenceBody(rc: RegressionCase, executableAreaLabel: string): string;
290
+ /**
291
+ * Render the domain-gap report the caller prints after upsert
292
+ * (REQ-JIRAREG-002.A2). Empty when there are no gaps.
293
+ */
294
+ /**
295
+ * Render the rephrase report (REQ-JIRAREG-004.A3). Empty when zero flags —
296
+ * the caller conditionally prints it after the pack upsert, mirroring the
297
+ * domain-gap report shape.
298
+ */
299
+ export declare function renderRephraseReport(flags: RephraseFlag[]): string;
300
+ export declare function renderDomainGapReport(gaps: DomainGap[]): string;
301
+ /**
302
+ * Compute the domain areas each requirement inherits transitively, keyed on
303
+ * requirement id (REQ-JIRAREG-002.A1).
304
+ *
305
+ * Direction: domain facts declare `depends_on: REQ-...` (they point AT
306
+ * requirements, per DOMAIN-KNOWLEDGE-DOC), so a requirement's own spec-tier
307
+ * chain does NOT reach the domain facts that govern it. We walk in the
308
+ * OTHER direction — for each `domain` spec, follow its parent /
309
+ * `metadata.depends_on` chain outward and register that domain fact against
310
+ * every requirement it reaches.
311
+ *
312
+ * This mirrors {@link SpecLinkResolver.getInheritedLinks} — same BFS, same
313
+ * `sourceSpecIds` traversal, same depth cap ({@link INHERITED_LINK_MAX_DEPTH}).
314
+ * `sourceSpecIds` is imported from the resolver (single source of truth for
315
+ * "the spec-tier edges a spec has"), but the walk itself is reproduced here
316
+ * to keep the regression-pack module free of a `SpecLinkResolver` dependency
317
+ * (which would require threading `QueryBuilder` all the way through). Per the
318
+ * approval note, the mirror is deliberate; `BuilderSpecQueries` exposes only
319
+ * the point-lookup surface it needs (`getAllSpecs`, `getSpecById`) so the
320
+ * builder stays trivially fixture-able.
321
+ *
322
+ * Per-domain-fact BFS is cycle-guarded and depth-capped. Ordering of the
323
+ * output list is deterministic: domain spec ids sorted lex, deduped.
324
+ */
325
+ export declare function computeDomainAreasByReqId(sq: BuilderSpecQueries): Map<string, Spec[]>;
326
+ /**
327
+ * Group cases by their pre-computed `domainArea`. In REQ-JIRAREG-001 every
328
+ * case was `Uncategorised`; REQ-JIRAREG-002 fills in real domain-fact areas
329
+ * — same input shape, same output shape, richer bucketing.
330
+ */
331
+ export declare function groupCasesByDomain(cases: RegressionCase[]): Map<string, RegressionCase[]>;
332
+ /**
333
+ * Build a full regression pack plan from the loaded spec set (REQ-JIRAREG-001).
334
+ * Pure — no JIRA calls. Deterministic ordering: requirements sorted by id,
335
+ * criteria in the order they appear as `acceptance` children of the requirement.
336
+ */
337
+ export declare function buildRegressionPack(sq: BuilderSpecQueries): RegressionPackModel;
338
+ /** Structural client slice — just enough to run the upsert idempotently. */
339
+ export interface RegressionPackJiraClient {
340
+ /**
341
+ * Return every issue in `projectKey` that carries `label`. Empty list on no
342
+ * match. Called with SpecShip's own labels — `specship-regression-pack`,
343
+ * `specship-regdomain-<slug>`, `specship-regcase-<slug>` — never user input.
344
+ */
345
+ searchIssuesByLabel(projectKey: string, label: string): Promise<Array<{
346
+ key: string;
347
+ summary: string;
348
+ }>>;
349
+ /**
350
+ * Fetch a single issue's summary + description + current parent key — for
351
+ * fingerprint compare AND parent-reassignment no-op decision
352
+ * (REQ-JIRAREG-002.A3). `parentKey` MAY be `undefined` when the issue has
353
+ * no parent (a top-level issue or one JIRA didn't return a parent for).
354
+ */
355
+ getIssue(key: string): Promise<{
356
+ ok: true;
357
+ issue: {
358
+ key: string;
359
+ summary: string;
360
+ description: string;
361
+ parentKey?: string;
362
+ };
363
+ }>;
364
+ createIssue(fields: {
365
+ projectKey: string;
366
+ issueType: string;
367
+ summary: string;
368
+ description?: string;
369
+ parentKey?: string;
370
+ labels?: string[];
371
+ }): Promise<{
372
+ key: string;
373
+ id: string;
374
+ }>;
375
+ /**
376
+ * Update an issue's summary, description, and/or parent (REQ-JIRAREG-002.A3
377
+ * needs parent reassignment when a case moves from Uncategorised to its new
378
+ * area). Callers pass only the fields that changed — a plain `parentKey`
379
+ * change with no body drift lands a `{ fields: { parent: { key } } }` PUT.
380
+ */
381
+ updateIssue(key: string, fields: {
382
+ summary?: string;
383
+ description?: string;
384
+ parentKey?: string;
385
+ }): Promise<void>;
386
+ /**
387
+ * Enumerate an issue's comments with ids (REQ-JIRAREG-003.A3). Used by the
388
+ * obsolete-marker upsert to check for a prior marker before writing.
389
+ */
390
+ listCommentsDetailed(key: string): Promise<Array<{
391
+ id: string;
392
+ body: string;
393
+ }>>;
394
+ /** Append a comment to an issue (REQ-JIRAREG-003.A3). */
395
+ addComment(key: string, body: string): Promise<{
396
+ id: string;
397
+ } | void>;
398
+ /**
399
+ * Add a label to an issue idempotently (REQ-JIRAREG-003.A3 + A4). Returns
400
+ * `{ added: false }` when the label is already present so a re-run is a
401
+ * zero-write. Implementations MUST NOT issue a PUT when the label is set.
402
+ */
403
+ addLabel(key: string, label: string): Promise<{
404
+ added: boolean;
405
+ }>;
406
+ }
407
+ /**
408
+ * Idempotent regression-pack upsert (REQ-JIRAREG-001, REQ-JIRAREG-003 skeleton).
409
+ * Walks the model epic → story → case; each level is keyed on its SpecShip
410
+ * label and its body is fingerprint-gated so a re-run without spec changes
411
+ * writes nothing new. Extra epics under the pack label are refused (single-epic
412
+ * invariant, A1) and reported as orphans; the caller decides how to surface.
413
+ */
414
+ export declare function upsertRegressionPack(client: RegressionPackJiraClient, model: RegressionPackModel, ctx: UpsertContext): Promise<UpsertResult>;
415
+ /**
416
+ * Enumerate case issues in the pack (via the fixed case marker label) that are
417
+ * not in `expectedKeys` — the caller's set of case keys just upserted from the
418
+ * current model. The result is deterministic (sorted lex on key) so re-runs
419
+ * report obsolete work in the same order.
420
+ */
421
+ export declare function findOrphanedCases(client: RegressionPackJiraClient, projectKey: string, expectedKeys: Set<string>): Promise<Array<{
422
+ key: string;
423
+ summary: string;
424
+ }>>;
425
+ export type MarkObsoleteOutcome = {
426
+ action: 'obsoleted';
427
+ commentAdded: boolean;
428
+ labelAdded: boolean;
429
+ } | {
430
+ action: 'skipped';
431
+ };
432
+ /**
433
+ * Mark a case obsolete on JIRA (REQ-JIRAREG-003.A3): attach a stable
434
+ * watermarked comment naming the reason AND add the board-filterable
435
+ * `specship-reg-obsolete` label. Both writes are idempotent — a re-run with
436
+ * the same reason finds the prior marker and adds nothing (A4).
437
+ *
438
+ * Never transitions the issue's workflow status (spec-driven correction:
439
+ * "no workflow transitions by default") and never deletes it — the run
440
+ * history and any prior evidence stay intact.
441
+ */
442
+ export declare function markCaseObsolete(client: RegressionPackJiraClient, issueKey: string, reason: string): Promise<MarkObsoleteOutcome>;
443
+ /** The four terminal outcomes a pack run can report per case. */
444
+ export type RegressionRunStatus = 'passed' | 'failed' | 'unexecuted' | 'obsolete';
445
+ /** Who / what executed the case. */
446
+ export type RegressionRunExecutor = 'human' | 'agent';
447
+ /** Optional behaviour-harness identifier for agent-executed cases. */
448
+ export type RegressionRunHarness = 'behaviour-e2e' | 'manual';
449
+ /** One case result recorded by a pack run (REQ-JIRAREG-005). */
450
+ export interface RegressionRunResult {
451
+ /** JIRA case key (e.g. `PROJ-42`). */
452
+ caseKey: string;
453
+ /** Source acceptance criterion id (e.g. `REQ-FOO-001.A2`). */
454
+ criterionId: string;
455
+ status: RegressionRunStatus;
456
+ executor: RegressionRunExecutor;
457
+ /** Behaviour-harness id when the agent executed the case; omit for manual. */
458
+ harness?: RegressionRunHarness;
459
+ /**
460
+ * Stable run identifier. A single run identifier per suite pass keys the
461
+ * comment-upsert (one comment per case per runId). Omit only for a one-off
462
+ * ad-hoc record — the recorder synthesises a timestamped id in that case.
463
+ */
464
+ runId?: string;
465
+ /** Freeform evidence pointers (log lines, error strings — never credentials). */
466
+ evidence?: {
467
+ logRef?: string;
468
+ error?: string;
469
+ };
470
+ }
471
+ /** Prefix of the recorder-owned comment marker. Body carries the runId + status. */
472
+ export declare const REG_PACK_RUN_MARKER_PREFIX = "<!-- specship:regression-run";
473
+ /**
474
+ * Structural client slice for the recorder — a superset of the pack upsert
475
+ * client with the comment-edit + workflow-transition surface.
476
+ */
477
+ export interface RunResultJiraClient extends MilestoneJiraClient {
478
+ transitionIssue(key: string, nameOrId: string): Promise<{
479
+ ok: true;
480
+ transitioned?: string;
481
+ skipped?: string;
482
+ reason?: string;
483
+ }>;
484
+ }
485
+ /**
486
+ * Minimal SpecQueries surface the recorder needs to upsert a `validates`
487
+ * spec-link pointing at the JIRA case as external evidence. Structural so
488
+ * tests can pass a fixture without wiring the full `SpecQueries` class.
489
+ */
490
+ export interface RunResultSpecQueries {
491
+ getSpecById(id: string): Spec | undefined | null;
492
+ findLogicalLink(specId: string, targetFilePath: string, targetQualifiedName: string, kind: SpecLink['kind']): SpecLink | null;
493
+ upsertSpecLink(link: Omit<SpecLink, 'id'>): number;
494
+ updateSpecLinkState(id: number, state: SpecLinkState, driftAxis?: SpecLink['driftAxis'], updatedAt?: number): void;
495
+ }
496
+ export interface RecordRunResultDeps {
497
+ client: RunResultJiraClient;
498
+ /** Optional graph writer — omit to skip the spec-link write (comment-only). */
499
+ specQueries?: RunResultSpecQueries;
500
+ /** Injectable clock — tests pin the run timestamp. */
501
+ now?: () => number;
502
+ /** Workflow transition names to try; use the client's graceful-skip path. */
503
+ transitions?: {
504
+ passed?: string;
505
+ failed?: string;
506
+ };
507
+ }
508
+ export interface RecordRunResultOutcome {
509
+ pending: false;
510
+ status: RegressionRunStatus;
511
+ /** Whether a `validates`-kind spec_link row was upserted or updated. */
512
+ linked: boolean;
513
+ /** Comment upsert outcome. */
514
+ comment: 'created' | 'updated' | 'skipped';
515
+ /** Transition outcome — `skipped` covers workflow-graceful skips + unexecuted. */
516
+ transition: 'moved' | 'skipped';
517
+ /** Present when status === 'failed'; the triage hand-off shown in the comment. */
518
+ triageHint?: string;
519
+ }
520
+ /**
521
+ * Record a pack-run result on a case issue (REQ-JIRAREG-005).
522
+ *
523
+ * Idempotent by (caseKey, runId): a second call with the same pair edits the
524
+ * prior comment in place. Pass → `Done` transition + validates-link state
525
+ * `verified`. Fail → `In Review` + `broken` + a triage hint line. Unexecuted →
526
+ * comment only; the case's workflow status and any existing validates-link
527
+ * state stay untouched (A3). External-evidence links use `jira://<CASE-KEY>`
528
+ * as the `targetFilePath` — {@link SpecLinkResolver} refuses to re-resolve
529
+ * that prefix, so a code-graph sync never flips the state to orphaned.
530
+ */
531
+ export declare function recordRunResult(deps: RecordRunResultDeps, result: RegressionRunResult): Promise<RecordRunResultOutcome>;
532
+ export interface PackRunSummary {
533
+ runId: string;
534
+ results: RegressionRunResult[];
535
+ startedAt?: string;
536
+ finishedAt?: string;
537
+ }
538
+ /** Aggregate per-result counts + triage list from a run's recorded results. */
539
+ export declare function summarizePackRun(summary: PackRunSummary): PackRunEvidence;
540
+ /**
541
+ * Close a pack run: post (or edit-in-place) the single summary comment on the
542
+ * pack epic. The marker keys on the epic + kind — never on the runId — so a
543
+ * subsequent run's summary edits the prior comment rather than appending
544
+ * (REQ-JIRAREG-005.A4).
545
+ */
546
+ export declare function finalizePackRun(client: MilestoneJiraClient, epicKey: string, summary: PackRunSummary): Promise<PostMilestoneResult>;
547
+ //# sourceMappingURL=regression-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression-pack.d.ts","sourceRoot":"","sources":["../../src/jira/regression-pack.ts"],"names":[],"mappings":"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"}