@selvakumaresra/specship 0.5.0 → 0.7.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/README.md +6 -6
- package/dist/bin/specship.js +173 -0
- package/dist/bin/specship.js.map +1 -1
- package/dist/extraction/specs/markdown-spec-extractor.d.ts +19 -0
- package/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
- package/dist/extraction/specs/markdown-spec-extractor.js +132 -11
- package/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/spec-tools.d.ts.map +1 -1
- package/dist/mcp/spec-tools.js +87 -6
- package/dist/mcp/spec-tools.js.map +1 -1
- package/dist/resolution/brief-link-resolver.d.ts +114 -0
- package/dist/resolution/brief-link-resolver.d.ts.map +1 -0
- package/dist/resolution/brief-link-resolver.js +261 -0
- package/dist/resolution/brief-link-resolver.js.map +1 -0
- package/dist/server/routes/events.js +114 -0
- package/dist/server/routes/projects.js +1 -1
- package/dist/server/routes/spec.js +9 -0
- package/dist/server/server.js +2 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/dist/web/chunk-HGBF7AY5.js +1 -0
- package/dist/web/chunk-JQ534IB6.js +6 -0
- package/dist/web/chunk-WQWYTRFN.js +1 -0
- package/dist/web/icon-192.png +0 -0
- package/dist/web/icon-512.png +0 -0
- package/dist/web/index.html +2 -1
- package/dist/web/main-LHCYPOXF.js +1 -0
- package/dist/web/manifest.webmanifest +15 -0
- package/package.json +1 -1
- package/dist/web/chunk-BYZFQSM6.js +0 -1
- package/dist/web/chunk-ODX6CT3I.js +0 -6
- package/dist/web/chunk-SBWU7JFC.js +0 -1
- package/dist/web/main-X2KCYXZ4.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-tools.js","sourceRoot":"","sources":["../../src/mcp/spec-tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"spec-tools.js","sourceRoot":"","sources":["../../src/mcp/spec-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brief ↔ spec link reconciliation (REQ-FUNNEL-002).
|
|
3
|
+
*
|
|
4
|
+
* A brainstorm brief (`specs/<slug>/brief.md`, indexed as a `brief`-kind spec by
|
|
5
|
+
* REQ-FUNNEL-001) is linked to the spec it produced by reconciling BOTH pointer
|
|
6
|
+
* directions:
|
|
7
|
+
*
|
|
8
|
+
* - the brief's own `spec:` frontmatter (carried in `brief.metadata.spec`),
|
|
9
|
+
* which MAY name a requirement — in which case it resolves UP to that
|
|
10
|
+
* requirement's enclosing document; and
|
|
11
|
+
* - a document spec whose `brief:` frontmatter points back at the brief's file.
|
|
12
|
+
*
|
|
13
|
+
* A link is established when EITHER direction resolves. With neither, the brief
|
|
14
|
+
* is an unlinked `idea`. When the two directions resolve to DIFFERENT documents,
|
|
15
|
+
* the link is `conflict` — surfaced rather than silently resolved to one side.
|
|
16
|
+
*
|
|
17
|
+
* The link is COMPUTED from current DB state (not materialized), so it is always
|
|
18
|
+
* fresh and needs no re-index bookkeeping.
|
|
19
|
+
*/
|
|
20
|
+
import { Spec, SpecLink } from '../types';
|
|
21
|
+
export type BriefLinkState = 'idea' | 'specified' | 'conflict';
|
|
22
|
+
export interface BriefLink {
|
|
23
|
+
briefId: string;
|
|
24
|
+
/** Document the brief links to, or null when `idea` / `conflict`. */
|
|
25
|
+
linkedSpecId: string | null;
|
|
26
|
+
state: BriefLinkState;
|
|
27
|
+
/** Document the brief's own `spec:` resolves to (requirement → document), or null. */
|
|
28
|
+
briefSide: string | null;
|
|
29
|
+
/** Document whose `brief:` points back at this brief, or null. */
|
|
30
|
+
specSide: string | null;
|
|
31
|
+
}
|
|
32
|
+
/** Minimal slice of SpecQueries this resolver needs (eases testing). */
|
|
33
|
+
export interface SpecLookup {
|
|
34
|
+
getSpecById(id: string): Spec | null;
|
|
35
|
+
getAllSpecs(): Spec[];
|
|
36
|
+
}
|
|
37
|
+
/** Strip a trailing ` # comment` and surrounding quotes from a frontmatter value. */
|
|
38
|
+
export declare function cleanSpecPointer(raw: unknown): string | null;
|
|
39
|
+
/** Resolve a spec id up to its enclosing document id (walk parent_id to the root). */
|
|
40
|
+
export declare function resolveToDocumentId(sq: SpecLookup, id: string): string | null;
|
|
41
|
+
/** Reconcile a brief's link to its spec from both pointer directions. */
|
|
42
|
+
export declare function resolveBriefLink(sq: SpecLookup, brief: Spec): BriefLink;
|
|
43
|
+
export interface SpecFunnelSummary {
|
|
44
|
+
ideas: number;
|
|
45
|
+
specified: number;
|
|
46
|
+
conflicts: number;
|
|
47
|
+
documents: number;
|
|
48
|
+
requirements: number;
|
|
49
|
+
links: {
|
|
50
|
+
implemented: number;
|
|
51
|
+
verified: number;
|
|
52
|
+
drifted: number;
|
|
53
|
+
broken: number;
|
|
54
|
+
orphaned: number;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export interface SpecFunnelDoc {
|
|
58
|
+
id: string;
|
|
59
|
+
title: string;
|
|
60
|
+
rollup: BriefRollup;
|
|
61
|
+
}
|
|
62
|
+
export interface SpecFunnel {
|
|
63
|
+
summary: SpecFunnelSummary;
|
|
64
|
+
documents: SpecFunnelDoc[];
|
|
65
|
+
ideas: Array<{
|
|
66
|
+
briefId: string;
|
|
67
|
+
title: string;
|
|
68
|
+
}>;
|
|
69
|
+
conflicts: Array<{
|
|
70
|
+
briefId: string;
|
|
71
|
+
briefSide: string | null;
|
|
72
|
+
specSide: string | null;
|
|
73
|
+
}>;
|
|
74
|
+
}
|
|
75
|
+
/** Compute the project-wide spec lifecycle funnel (idea → spec → implemented). */
|
|
76
|
+
export declare function computeSpecFunnel(sq: FunnelLookup): SpecFunnel;
|
|
77
|
+
/** All briefs that resolve (non-conflicting) to a given document. */
|
|
78
|
+
export declare function findBriefsForSpec(sq: SpecLookup, docId: string): BriefLink[];
|
|
79
|
+
/** SpecLookup plus the queries needed to roll up a document's implementation. */
|
|
80
|
+
export interface FunnelLookup extends SpecLookup {
|
|
81
|
+
getSpecsByParent(parentId: string): Spec[];
|
|
82
|
+
getLinksBySpec(specId: string): SpecLink[];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Implementation rollup for a linked brief's document — counts of the
|
|
86
|
+
* document's requirement→code links by state. `implemented` (declared) and
|
|
87
|
+
* `verified` (test-confirmed) are kept distinct so a declared-but-unverified
|
|
88
|
+
* link is never reported as proven. `drafted` / `implementing` are in-progress
|
|
89
|
+
* and counted as neither (they are not "implemented").
|
|
90
|
+
*/
|
|
91
|
+
export interface BriefRollup {
|
|
92
|
+
requirements: number;
|
|
93
|
+
implemented: number;
|
|
94
|
+
verified: number;
|
|
95
|
+
drifted: number;
|
|
96
|
+
broken: number;
|
|
97
|
+
orphaned: number;
|
|
98
|
+
}
|
|
99
|
+
export interface BriefFunnelEntry {
|
|
100
|
+
briefId: string;
|
|
101
|
+
state: BriefLinkState;
|
|
102
|
+
linkedSpecId: string | null;
|
|
103
|
+
/** Implementation rollup of the linked document; null for `idea` / `conflict`. */
|
|
104
|
+
rollup: BriefRollup | null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Roll a brief up to its lifecycle state (REQ-FUNNEL-003): `idea` (unlinked),
|
|
108
|
+
* `conflict` (ambiguous link), or `specified` with an implementation rollup of
|
|
109
|
+
* the linked document's requirements. A document whose links are all
|
|
110
|
+
* drifted/broken/orphaned yields implemented=0 — degraded states are surfaced
|
|
111
|
+
* rather than mistaken for a working implementation.
|
|
112
|
+
*/
|
|
113
|
+
export declare function summarizeBriefFunnel(sq: FunnelLookup, brief: Spec): BriefFunnelEntry;
|
|
114
|
+
//# sourceMappingURL=brief-link-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief-link-resolver.d.ts","sourceRoot":"","sources":["../../src/resolution/brief-link-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Brief ↔ spec link reconciliation (REQ-FUNNEL-002).
|
|
4
|
+
*
|
|
5
|
+
* A brainstorm brief (`specs/<slug>/brief.md`, indexed as a `brief`-kind spec by
|
|
6
|
+
* REQ-FUNNEL-001) is linked to the spec it produced by reconciling BOTH pointer
|
|
7
|
+
* directions:
|
|
8
|
+
*
|
|
9
|
+
* - the brief's own `spec:` frontmatter (carried in `brief.metadata.spec`),
|
|
10
|
+
* which MAY name a requirement — in which case it resolves UP to that
|
|
11
|
+
* requirement's enclosing document; and
|
|
12
|
+
* - a document spec whose `brief:` frontmatter points back at the brief's file.
|
|
13
|
+
*
|
|
14
|
+
* A link is established when EITHER direction resolves. With neither, the brief
|
|
15
|
+
* is an unlinked `idea`. When the two directions resolve to DIFFERENT documents,
|
|
16
|
+
* the link is `conflict` — surfaced rather than silently resolved to one side.
|
|
17
|
+
*
|
|
18
|
+
* The link is COMPUTED from current DB state (not materialized), so it is always
|
|
19
|
+
* fresh and needs no re-index bookkeeping.
|
|
20
|
+
*/
|
|
21
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
24
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
25
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
26
|
+
}
|
|
27
|
+
Object.defineProperty(o, k2, desc);
|
|
28
|
+
}) : (function(o, m, k, k2) {
|
|
29
|
+
if (k2 === undefined) k2 = k;
|
|
30
|
+
o[k2] = m[k];
|
|
31
|
+
}));
|
|
32
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
33
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
34
|
+
}) : function(o, v) {
|
|
35
|
+
o["default"] = v;
|
|
36
|
+
});
|
|
37
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
38
|
+
var ownKeys = function(o) {
|
|
39
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
40
|
+
var ar = [];
|
|
41
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
42
|
+
return ar;
|
|
43
|
+
};
|
|
44
|
+
return ownKeys(o);
|
|
45
|
+
};
|
|
46
|
+
return function (mod) {
|
|
47
|
+
if (mod && mod.__esModule) return mod;
|
|
48
|
+
var result = {};
|
|
49
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
50
|
+
__setModuleDefault(result, mod);
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
})();
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
exports.cleanSpecPointer = cleanSpecPointer;
|
|
56
|
+
exports.resolveToDocumentId = resolveToDocumentId;
|
|
57
|
+
exports.resolveBriefLink = resolveBriefLink;
|
|
58
|
+
exports.computeSpecFunnel = computeSpecFunnel;
|
|
59
|
+
exports.findBriefsForSpec = findBriefsForSpec;
|
|
60
|
+
exports.summarizeBriefFunnel = summarizeBriefFunnel;
|
|
61
|
+
const path = __importStar(require("path"));
|
|
62
|
+
/** Strip a trailing ` # comment` and surrounding quotes from a frontmatter value. */
|
|
63
|
+
function cleanSpecPointer(raw) {
|
|
64
|
+
if (typeof raw !== 'string')
|
|
65
|
+
return null;
|
|
66
|
+
let v = raw.trim();
|
|
67
|
+
if (!v)
|
|
68
|
+
return null;
|
|
69
|
+
if ((v.startsWith('"') && v.endsWith('"')) ||
|
|
70
|
+
(v.startsWith("'") && v.endsWith("'"))) {
|
|
71
|
+
v = v.slice(1, -1).trim();
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Strip an unquoted trailing comment (whitespace + '#'), mirroring the
|
|
75
|
+
// server's parseBriefField — a '#fragment' with no leading space is kept.
|
|
76
|
+
const h = v.search(/\s#/);
|
|
77
|
+
if (h !== -1)
|
|
78
|
+
v = v.slice(0, h).trim();
|
|
79
|
+
}
|
|
80
|
+
return v || null;
|
|
81
|
+
}
|
|
82
|
+
const fwd = (p) => p.replace(/\\/g, '/');
|
|
83
|
+
/** Resolve a spec id up to its enclosing document id (walk parent_id to the root). */
|
|
84
|
+
function resolveToDocumentId(sq, id) {
|
|
85
|
+
let cur = sq.getSpecById(id);
|
|
86
|
+
if (!cur)
|
|
87
|
+
return null;
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
while (cur.kind !== 'document' && cur.parentId && !seen.has(cur.id)) {
|
|
90
|
+
seen.add(cur.id);
|
|
91
|
+
const parent = sq.getSpecById(cur.parentId);
|
|
92
|
+
if (!parent)
|
|
93
|
+
break;
|
|
94
|
+
cur = parent;
|
|
95
|
+
}
|
|
96
|
+
return cur.id;
|
|
97
|
+
}
|
|
98
|
+
/** The document (if any) whose `brief:` frontmatter resolves to this brief's file. */
|
|
99
|
+
function documentPointingAtBrief(sq, brief) {
|
|
100
|
+
const target = fwd(brief.sourcePath);
|
|
101
|
+
for (const s of sq.getAllSpecs()) {
|
|
102
|
+
if (s.kind !== 'document' || !s.metadata || typeof s.metadata !== 'object')
|
|
103
|
+
continue;
|
|
104
|
+
const ref = cleanSpecPointer(s.metadata.brief);
|
|
105
|
+
if (!ref)
|
|
106
|
+
continue;
|
|
107
|
+
// `brief:` is relative to the spec file's own directory.
|
|
108
|
+
const resolved = path.posix.normalize(path.posix.join(path.posix.dirname(fwd(s.sourcePath)), fwd(ref)));
|
|
109
|
+
if (resolved === target)
|
|
110
|
+
return s.id;
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
/** Reconcile a brief's link to its spec from both pointer directions. */
|
|
115
|
+
function resolveBriefLink(sq, brief) {
|
|
116
|
+
const meta = brief.metadata && typeof brief.metadata === 'object'
|
|
117
|
+
? brief.metadata
|
|
118
|
+
: {};
|
|
119
|
+
const ptr = cleanSpecPointer(meta.spec);
|
|
120
|
+
const briefSide = ptr ? resolveToDocumentId(sq, ptr) : null;
|
|
121
|
+
const specSide = documentPointingAtBrief(sq, brief);
|
|
122
|
+
if (briefSide && specSide && briefSide !== specSide) {
|
|
123
|
+
return { briefId: brief.id, linkedSpecId: null, state: 'conflict', briefSide, specSide };
|
|
124
|
+
}
|
|
125
|
+
const linkedSpecId = briefSide ?? specSide ?? null;
|
|
126
|
+
return {
|
|
127
|
+
briefId: brief.id,
|
|
128
|
+
linkedSpecId,
|
|
129
|
+
state: linkedSpecId ? 'specified' : 'idea',
|
|
130
|
+
briefSide,
|
|
131
|
+
specSide,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** Implementation rollup for a single document's requirements. */
|
|
135
|
+
function documentRollup(sq, docId) {
|
|
136
|
+
const reqs = sq.getSpecsByParent(docId).filter((s) => s.kind === 'requirement');
|
|
137
|
+
const r = {
|
|
138
|
+
requirements: reqs.length,
|
|
139
|
+
implemented: 0,
|
|
140
|
+
verified: 0,
|
|
141
|
+
drifted: 0,
|
|
142
|
+
broken: 0,
|
|
143
|
+
orphaned: 0,
|
|
144
|
+
};
|
|
145
|
+
for (const req of reqs) {
|
|
146
|
+
for (const lk of sq.getLinksBySpec(req.id)) {
|
|
147
|
+
if (lk.state === 'implemented')
|
|
148
|
+
r.implemented++;
|
|
149
|
+
else if (lk.state === 'verified')
|
|
150
|
+
r.verified++;
|
|
151
|
+
else if (lk.state === 'drifted')
|
|
152
|
+
r.drifted++;
|
|
153
|
+
else if (lk.state === 'broken')
|
|
154
|
+
r.broken++;
|
|
155
|
+
else if (lk.state === 'orphaned')
|
|
156
|
+
r.orphaned++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return r;
|
|
160
|
+
}
|
|
161
|
+
/** Compute the project-wide spec lifecycle funnel (idea → spec → implemented). */
|
|
162
|
+
function computeSpecFunnel(sq) {
|
|
163
|
+
const all = sq.getAllSpecs();
|
|
164
|
+
const documents = all.filter((s) => s.kind === 'document');
|
|
165
|
+
const requirements = all.filter((s) => s.kind === 'requirement');
|
|
166
|
+
const briefLinks = all.filter((s) => s.kind === 'brief').map((b) => resolveBriefLink(sq, b));
|
|
167
|
+
const links = { implemented: 0, verified: 0, drifted: 0, broken: 0, orphaned: 0 };
|
|
168
|
+
for (const req of requirements) {
|
|
169
|
+
for (const lk of sq.getLinksBySpec(req.id)) {
|
|
170
|
+
if (lk.state === 'implemented')
|
|
171
|
+
links.implemented++;
|
|
172
|
+
else if (lk.state === 'verified')
|
|
173
|
+
links.verified++;
|
|
174
|
+
else if (lk.state === 'drifted')
|
|
175
|
+
links.drifted++;
|
|
176
|
+
else if (lk.state === 'broken')
|
|
177
|
+
links.broken++;
|
|
178
|
+
else if (lk.state === 'orphaned')
|
|
179
|
+
links.orphaned++;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const ideas = briefLinks
|
|
183
|
+
.filter((l) => l.state === 'idea')
|
|
184
|
+
.map((l) => ({ briefId: l.briefId, title: sq.getSpecById(l.briefId)?.title ?? '' }));
|
|
185
|
+
const conflicts = briefLinks
|
|
186
|
+
.filter((l) => l.state === 'conflict')
|
|
187
|
+
.map((l) => ({ briefId: l.briefId, briefSide: l.briefSide, specSide: l.specSide }));
|
|
188
|
+
return {
|
|
189
|
+
summary: {
|
|
190
|
+
ideas: ideas.length,
|
|
191
|
+
specified: briefLinks.filter((l) => l.state === 'specified').length,
|
|
192
|
+
conflicts: conflicts.length,
|
|
193
|
+
documents: documents.length,
|
|
194
|
+
requirements: requirements.length,
|
|
195
|
+
links,
|
|
196
|
+
},
|
|
197
|
+
documents: documents.map((d) => ({ id: d.id, title: d.title, rollup: documentRollup(sq, d.id) })),
|
|
198
|
+
ideas,
|
|
199
|
+
conflicts,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/** All briefs that resolve (non-conflicting) to a given document. */
|
|
203
|
+
function findBriefsForSpec(sq, docId) {
|
|
204
|
+
const out = [];
|
|
205
|
+
for (const s of sq.getAllSpecs()) {
|
|
206
|
+
if (s.kind !== 'brief')
|
|
207
|
+
continue;
|
|
208
|
+
const link = resolveBriefLink(sq, s);
|
|
209
|
+
if (link.linkedSpecId === docId)
|
|
210
|
+
out.push(link);
|
|
211
|
+
}
|
|
212
|
+
return out;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Roll a brief up to its lifecycle state (REQ-FUNNEL-003): `idea` (unlinked),
|
|
216
|
+
* `conflict` (ambiguous link), or `specified` with an implementation rollup of
|
|
217
|
+
* the linked document's requirements. A document whose links are all
|
|
218
|
+
* drifted/broken/orphaned yields implemented=0 — degraded states are surfaced
|
|
219
|
+
* rather than mistaken for a working implementation.
|
|
220
|
+
*/
|
|
221
|
+
function summarizeBriefFunnel(sq, brief) {
|
|
222
|
+
const link = resolveBriefLink(sq, brief);
|
|
223
|
+
if (link.state !== 'specified' || !link.linkedSpecId) {
|
|
224
|
+
return { briefId: brief.id, state: link.state, linkedSpecId: link.linkedSpecId, rollup: null };
|
|
225
|
+
}
|
|
226
|
+
const requirements = sq
|
|
227
|
+
.getSpecsByParent(link.linkedSpecId)
|
|
228
|
+
.filter((s) => s.kind === 'requirement');
|
|
229
|
+
const rollup = {
|
|
230
|
+
requirements: requirements.length,
|
|
231
|
+
implemented: 0,
|
|
232
|
+
verified: 0,
|
|
233
|
+
drifted: 0,
|
|
234
|
+
broken: 0,
|
|
235
|
+
orphaned: 0,
|
|
236
|
+
};
|
|
237
|
+
for (const req of requirements) {
|
|
238
|
+
for (const lk of sq.getLinksBySpec(req.id)) {
|
|
239
|
+
switch (lk.state) {
|
|
240
|
+
case 'implemented':
|
|
241
|
+
rollup.implemented++;
|
|
242
|
+
break;
|
|
243
|
+
case 'verified':
|
|
244
|
+
rollup.verified++;
|
|
245
|
+
break;
|
|
246
|
+
case 'drifted':
|
|
247
|
+
rollup.drifted++;
|
|
248
|
+
break;
|
|
249
|
+
case 'broken':
|
|
250
|
+
rollup.broken++;
|
|
251
|
+
break;
|
|
252
|
+
case 'orphaned':
|
|
253
|
+
rollup.orphaned++;
|
|
254
|
+
break;
|
|
255
|
+
default: break; // drafted / implementing — in-progress, not "implemented"
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return { briefId: brief.id, state: 'specified', linkedSpecId: link.linkedSpecId, rollup };
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=brief-link-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief-link-resolver.js","sourceRoot":"","sources":["../../src/resolution/brief-link-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/events — cross-project alert stream (REQ-PWA-002).
|
|
3
|
+
*
|
|
4
|
+
* A single SSE stream that watches EVERY initialized project (not just the
|
|
5
|
+
* selected one) and emits an event when an alert-worthy transition happens:
|
|
6
|
+
* - `approval` — a workflow run entered `paused` (an approval gate)
|
|
7
|
+
* - `runDone` — a run entered `completed` or `failed`
|
|
8
|
+
* - `drift` — a spec→code link newly entered drifted/broken/orphaned
|
|
9
|
+
*
|
|
10
|
+
* Polls the same SQLite the executor/resolver write to (mirrors the workflow
|
|
11
|
+
* SSE's 500ms-poll approach), diffing against per-connection seen-state so only
|
|
12
|
+
* NEW transitions are emitted — never a backlog burst on connect, never a repeat
|
|
13
|
+
* for the same transition. The client (NotificationsService) turns these into
|
|
14
|
+
* desktop notifications, gated on permission + per-type toggles.
|
|
15
|
+
*/
|
|
16
|
+
import os from 'node:os';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { enumerate } from './projects.js';
|
|
19
|
+
const POLL_MS = 3000;
|
|
20
|
+
const KEEPALIVE_MS = 15000;
|
|
21
|
+
export async function registerEventsRoutes(app) {
|
|
22
|
+
const claudeRoot = path.join(os.homedir(), '.claude', 'projects');
|
|
23
|
+
app.get('/api/events', async (req, reply) => {
|
|
24
|
+
reply.raw.setHeader('Content-Type', 'text/event-stream');
|
|
25
|
+
reply.raw.setHeader('Cache-Control', 'no-cache');
|
|
26
|
+
reply.raw.setHeader('Connection', 'keep-alive');
|
|
27
|
+
reply.raw.write(': connected\n\n');
|
|
28
|
+
// Per-connection seen-state — emit only NEW transitions.
|
|
29
|
+
const lastStatus = new Map(); // `${slug}:${runId}` -> status
|
|
30
|
+
const seenDrift = new Set(); // `${slug}:${linkId}`
|
|
31
|
+
let primed = false; // first pass seeds state silently (no burst on connect)
|
|
32
|
+
let closed = false;
|
|
33
|
+
const send = (ev) => {
|
|
34
|
+
if (closed)
|
|
35
|
+
return;
|
|
36
|
+
try {
|
|
37
|
+
reply.raw.write(`data: ${JSON.stringify(ev)}\n\n`);
|
|
38
|
+
}
|
|
39
|
+
catch { /* peer gone */ }
|
|
40
|
+
};
|
|
41
|
+
const poll = async () => {
|
|
42
|
+
let projects;
|
|
43
|
+
try {
|
|
44
|
+
projects = await enumerate(claudeRoot);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
for (const p of projects) {
|
|
50
|
+
if (!p.initialized || closed)
|
|
51
|
+
continue;
|
|
52
|
+
let cg;
|
|
53
|
+
try {
|
|
54
|
+
cg = await app.projects.getBySlug(p.slug);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
cg = null;
|
|
58
|
+
}
|
|
59
|
+
if (!cg)
|
|
60
|
+
continue;
|
|
61
|
+
const sq = cg.getSpecQueries();
|
|
62
|
+
// Workflow run transitions.
|
|
63
|
+
let runs = [];
|
|
64
|
+
try {
|
|
65
|
+
runs = sq.getAllWorkflowRuns(50);
|
|
66
|
+
}
|
|
67
|
+
catch { /* ignore */ }
|
|
68
|
+
for (const r of runs) {
|
|
69
|
+
const key = `${p.slug}:${r.id}`;
|
|
70
|
+
if (lastStatus.get(key) === r.status)
|
|
71
|
+
continue;
|
|
72
|
+
lastStatus.set(key, r.status);
|
|
73
|
+
if (!primed)
|
|
74
|
+
continue;
|
|
75
|
+
if (r.status === 'paused') {
|
|
76
|
+
send({ kind: 'approval', project: p.slug, projectPath: p.path, id: r.id, title: 'Run needs approval', detail: r.workflowName });
|
|
77
|
+
}
|
|
78
|
+
else if (r.status === 'completed' || r.status === 'failed') {
|
|
79
|
+
send({ kind: 'runDone', project: p.slug, projectPath: p.path, id: r.id, title: `Run ${r.status}`, detail: r.workflowName, status: r.status });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Newly-drifted links.
|
|
83
|
+
let links = [];
|
|
84
|
+
try {
|
|
85
|
+
links = sq.getLinksByState(['drifted', 'broken', 'orphaned']);
|
|
86
|
+
}
|
|
87
|
+
catch { /* ignore */ }
|
|
88
|
+
for (const l of links) {
|
|
89
|
+
const key = `${p.slug}:${l.id}`;
|
|
90
|
+
if (seenDrift.has(key))
|
|
91
|
+
continue;
|
|
92
|
+
seenDrift.add(key);
|
|
93
|
+
if (!primed)
|
|
94
|
+
continue;
|
|
95
|
+
send({ kind: 'drift', project: p.slug, projectPath: p.path, id: String(l.id), title: 'Drift detected', detail: `${l.specId} → ${l.targetQualifiedName}` });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
primed = true;
|
|
99
|
+
};
|
|
100
|
+
await poll(); // prime: seed seen-state without emitting
|
|
101
|
+
const pollTimer = setInterval(() => { void poll(); }, POLL_MS);
|
|
102
|
+
const kaTimer = setInterval(() => { if (!closed) {
|
|
103
|
+
try {
|
|
104
|
+
reply.raw.write(': ka\n\n');
|
|
105
|
+
}
|
|
106
|
+
catch { /* noop */ }
|
|
107
|
+
} }, KEEPALIVE_MS);
|
|
108
|
+
req.raw.on('close', () => {
|
|
109
|
+
closed = true;
|
|
110
|
+
clearInterval(pollTimer);
|
|
111
|
+
clearInterval(kaTimer);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
@@ -18,7 +18,7 @@ import path from 'node:path';
|
|
|
18
18
|
import { decodeProjectSlug } from '../ingest/ingestor.js';
|
|
19
19
|
const projectsBus = new EventEmitter();
|
|
20
20
|
projectsBus.setMaxListeners(0); // many SSE subscribers + internal
|
|
21
|
-
async function enumerate(claudeRoot) {
|
|
21
|
+
export async function enumerate(claudeRoot) {
|
|
22
22
|
let entries;
|
|
23
23
|
try {
|
|
24
24
|
entries = await fs.readdir(claudeRoot, { withFileTypes: true });
|
|
@@ -101,6 +101,15 @@ export async function registerSpecRoutes(app) {
|
|
|
101
101
|
const docs = cg.getSpecQueries().getAllSpecs();
|
|
102
102
|
return { specs: docs };
|
|
103
103
|
});
|
|
104
|
+
// Spec lifecycle funnel: idea → spec → implemented (REQ-FUNNEL-006). Computed
|
|
105
|
+
// on the dynamically-loaded SpecShip instance — no runtime import of the
|
|
106
|
+
// package from the server.
|
|
107
|
+
app.get('/api/spec/funnel', async (req, reply) => {
|
|
108
|
+
const cg = await resolveCg(app, req, reply);
|
|
109
|
+
if (!cg)
|
|
110
|
+
return;
|
|
111
|
+
return cg.getSpecFunnel();
|
|
112
|
+
});
|
|
104
113
|
app.get('/api/spec/:id', async (req, reply) => {
|
|
105
114
|
const cg = await resolveCg(app, req, reply);
|
|
106
115
|
if (!cg)
|
package/dist/server/server.js
CHANGED
|
@@ -27,6 +27,7 @@ import { registerClaudeRoutes } from './routes/claude.js';
|
|
|
27
27
|
import { registerStatusRoutes } from './routes/status.js';
|
|
28
28
|
import { registerMemoryRoutes } from './routes/memory.js';
|
|
29
29
|
import { registerProjectsRoutes } from './routes/projects.js';
|
|
30
|
+
import { registerEventsRoutes } from './routes/events.js';
|
|
30
31
|
/**
|
|
31
32
|
* Lazy-import the specship core. Two delivery shapes are supported:
|
|
32
33
|
*
|
|
@@ -164,6 +165,7 @@ export async function createServer(options) {
|
|
|
164
165
|
await registerClaudeRoutes(app);
|
|
165
166
|
await registerMemoryRoutes(app);
|
|
166
167
|
await registerProjectsRoutes(app);
|
|
168
|
+
await registerEventsRoutes(app);
|
|
167
169
|
// Optional: serve the built Angular UI from `webDir` and fall back to
|
|
168
170
|
// index.html for client-side routes. Must register AFTER the /api/*
|
|
169
171
|
// routes so they take precedence over the SPA wildcard.
|
package/dist/types.d.ts
CHANGED
|
@@ -384,7 +384,7 @@ export interface FindRelevantContextOptions {
|
|
|
384
384
|
* - `contract`: an API/data contract (OpenAPI, AsyncAPI, etc.)
|
|
385
385
|
* - `data_schema`: a data shape definition
|
|
386
386
|
*/
|
|
387
|
-
export declare const SPEC_KINDS: readonly ["document", "requirement", "acceptance", "contract", "data_schema"];
|
|
387
|
+
export declare const SPEC_KINDS: readonly ["document", "requirement", "acceptance", "contract", "data_schema", "brief"];
|
|
388
388
|
export type SpecKind = (typeof SPEC_KINDS)[number];
|
|
389
389
|
/**
|
|
390
390
|
* Spec source format. Each format has its own extractor under
|