@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.
- package/lib/dist/bin/specship.js +302 -4
- package/lib/dist/bin/specship.js.map +1 -1
- package/lib/dist/commands/specship/jira.md +74 -0
- package/lib/dist/commands/specship/spec.md +61 -1
- package/lib/dist/extraction/index.d.ts +6 -0
- package/lib/dist/extraction/index.d.ts.map +1 -1
- package/lib/dist/extraction/index.js.map +1 -1
- package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
- package/lib/dist/extraction/specs/markdown-spec-extractor.js +8 -1
- package/lib/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
- package/lib/dist/index.d.ts +7 -0
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +45 -18
- package/lib/dist/index.js.map +1 -1
- package/lib/dist/jira/auto-publish.d.ts +67 -0
- package/lib/dist/jira/auto-publish.d.ts.map +1 -0
- package/lib/dist/jira/auto-publish.js +232 -0
- package/lib/dist/jira/auto-publish.js.map +1 -0
- package/lib/dist/jira/board-first.d.ts +64 -0
- package/lib/dist/jira/board-first.d.ts.map +1 -0
- package/lib/dist/jira/board-first.js +91 -0
- package/lib/dist/jira/board-first.js.map +1 -0
- package/lib/dist/jira/client.d.ts +80 -1
- package/lib/dist/jira/client.d.ts.map +1 -1
- package/lib/dist/jira/client.js +213 -1
- package/lib/dist/jira/client.js.map +1 -1
- package/lib/dist/jira/config.d.ts +1 -1
- package/lib/dist/jira/config.d.ts.map +1 -1
- package/lib/dist/jira/config.js +14 -3
- package/lib/dist/jira/config.js.map +1 -1
- package/lib/dist/jira/coverage.d.ts +105 -0
- package/lib/dist/jira/coverage.d.ts.map +1 -0
- package/lib/dist/jira/coverage.js +160 -0
- package/lib/dist/jira/coverage.js.map +1 -0
- package/lib/dist/jira/index.d.ts +1 -0
- package/lib/dist/jira/index.d.ts.map +1 -1
- package/lib/dist/jira/index.js +1 -0
- package/lib/dist/jira/index.js.map +1 -1
- package/lib/dist/jira/milestone-comment.d.ts +95 -0
- package/lib/dist/jira/milestone-comment.d.ts.map +1 -0
- package/lib/dist/jira/milestone-comment.js +271 -0
- package/lib/dist/jira/milestone-comment.js.map +1 -0
- package/lib/dist/jira/publish.d.ts +69 -2
- package/lib/dist/jira/publish.d.ts.map +1 -1
- package/lib/dist/jira/publish.js +0 -0
- package/lib/dist/jira/publish.js.map +1 -1
- package/lib/dist/jira/published-specs.d.ts +23 -0
- package/lib/dist/jira/published-specs.d.ts.map +1 -0
- package/lib/dist/jira/published-specs.js +106 -0
- package/lib/dist/jira/published-specs.js.map +1 -0
- package/lib/dist/jira/reconcile.d.ts +81 -0
- package/lib/dist/jira/reconcile.d.ts.map +1 -0
- package/lib/dist/jira/reconcile.js +111 -0
- package/lib/dist/jira/reconcile.js.map +1 -0
- package/lib/dist/jira/regression-pack.d.ts +547 -0
- package/lib/dist/jira/regression-pack.d.ts.map +1 -0
- package/lib/dist/jira/regression-pack.js +986 -0
- package/lib/dist/jira/regression-pack.js.map +1 -0
- package/lib/dist/jira/repo-config.d.ts +59 -0
- package/lib/dist/jira/repo-config.d.ts.map +1 -0
- package/lib/dist/jira/repo-config.js +222 -0
- package/lib/dist/jira/repo-config.js.map +1 -0
- package/lib/dist/jira/spec-amend.d.ts +46 -0
- package/lib/dist/jira/spec-amend.d.ts.map +1 -0
- package/lib/dist/jira/spec-amend.js +232 -0
- package/lib/dist/jira/spec-amend.js.map +1 -0
- package/lib/dist/jira/spec-writer.d.ts +22 -0
- package/lib/dist/jira/spec-writer.d.ts.map +1 -1
- package/lib/dist/jira/spec-writer.js +113 -0
- package/lib/dist/jira/spec-writer.js.map +1 -1
- package/lib/dist/jira/types.d.ts +62 -0
- package/lib/dist/jira/types.d.ts.map +1 -1
- package/lib/dist/jira/types.js +15 -1
- package/lib/dist/jira/types.js.map +1 -1
- package/lib/dist/mcp/jira-tools.d.ts +102 -0
- package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
- package/lib/dist/mcp/jira-tools.js +807 -50
- package/lib/dist/mcp/jira-tools.js.map +1 -1
- package/lib/dist/mcp/server-instructions.d.ts +1 -1
- package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
- package/lib/dist/mcp/server-instructions.js +4 -0
- package/lib/dist/mcp/server-instructions.js.map +1 -1
- package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
- package/lib/dist/mcp/spec-tools.js +7 -1
- package/lib/dist/mcp/spec-tools.js.map +1 -1
- package/lib/dist/mcp/tools.d.ts +3 -0
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +50 -0
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/resolution/spec-link-resolver.d.ts +2 -0
- package/lib/dist/resolution/spec-link-resolver.d.ts.map +1 -1
- package/lib/dist/resolution/spec-link-resolver.js +11 -3
- package/lib/dist/resolution/spec-link-resolver.js.map +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +1 -1
- 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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"}
|