@specship/specship-win32-arm64 0.25.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/specship.cmd +31 -1
- package/lib/dist/activation/cheatsheet.d.ts +17 -1
- package/lib/dist/activation/cheatsheet.d.ts.map +1 -1
- package/lib/dist/activation/cheatsheet.js +47 -3
- package/lib/dist/activation/cheatsheet.js.map +1 -1
- package/lib/dist/activation/hook-output.d.ts +80 -0
- package/lib/dist/activation/hook-output.d.ts.map +1 -0
- package/lib/dist/activation/hook-output.js +103 -0
- package/lib/dist/activation/hook-output.js.map +1 -0
- package/lib/dist/activation/search-intercept.d.ts +60 -29
- package/lib/dist/activation/search-intercept.d.ts.map +1 -1
- package/lib/dist/activation/search-intercept.js +159 -55
- package/lib/dist/activation/search-intercept.js.map +1 -1
- package/lib/dist/activation/steering.d.ts +8 -10
- package/lib/dist/activation/steering.d.ts.map +1 -1
- package/lib/dist/activation/steering.js +21 -6
- package/lib/dist/activation/steering.js.map +1 -1
- package/lib/dist/behaviour/behaviour-surface.d.ts +47 -0
- package/lib/dist/behaviour/behaviour-surface.d.ts.map +1 -1
- package/lib/dist/behaviour/behaviour-surface.js +108 -2
- package/lib/dist/behaviour/behaviour-surface.js.map +1 -1
- package/lib/dist/bin/node-version-check.d.ts +22 -7
- package/lib/dist/bin/node-version-check.d.ts.map +1 -1
- package/lib/dist/bin/node-version-check.js +39 -9
- package/lib/dist/bin/node-version-check.js.map +1 -1
- package/lib/dist/bin/specship.js +762 -81
- package/lib/dist/bin/specship.js.map +1 -1
- package/lib/dist/commands/specship/learn.md +22 -0
- package/lib/dist/commands/specship/spec.md +12 -0
- package/lib/dist/db/sqlite-adapter.d.ts +7 -5
- package/lib/dist/db/sqlite-adapter.d.ts.map +1 -1
- package/lib/dist/db/sqlite-adapter.js +11 -9
- package/lib/dist/db/sqlite-adapter.js.map +1 -1
- package/lib/dist/enforce/changed-files.d.ts +11 -0
- package/lib/dist/enforce/changed-files.d.ts.map +1 -1
- package/lib/dist/enforce/changed-files.js +42 -0
- package/lib/dist/enforce/changed-files.js.map +1 -1
- package/lib/dist/enforce/enforce.d.ts +25 -1
- package/lib/dist/enforce/enforce.d.ts.map +1 -1
- package/lib/dist/enforce/enforce.js +58 -3
- package/lib/dist/enforce/enforce.js.map +1 -1
- package/lib/dist/enforce/mutation.d.ts +46 -0
- package/lib/dist/enforce/mutation.d.ts.map +1 -0
- package/lib/dist/enforce/mutation.js +104 -0
- package/lib/dist/enforce/mutation.js.map +1 -0
- package/lib/dist/enforce/suppressions.d.ts +33 -0
- package/lib/dist/enforce/suppressions.d.ts.map +1 -0
- package/lib/dist/enforce/suppressions.js +159 -0
- package/lib/dist/enforce/suppressions.js.map +1 -0
- package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
- package/lib/dist/extraction/specs/markdown-spec-extractor.js +16 -2
- package/lib/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
- package/lib/dist/graph/spec-coverage.d.ts +57 -1
- package/lib/dist/graph/spec-coverage.d.ts.map +1 -1
- package/lib/dist/graph/spec-coverage.js +129 -5
- package/lib/dist/graph/spec-coverage.js.map +1 -1
- package/lib/dist/health/smoke-check.js +2 -2
- package/lib/dist/health/smoke-check.js.map +1 -1
- package/lib/dist/index.d.ts +8 -3
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +65 -9
- package/lib/dist/index.js.map +1 -1
- package/lib/dist/installer/gemini-commands.d.ts +107 -0
- package/lib/dist/installer/gemini-commands.d.ts.map +1 -0
- package/lib/dist/installer/gemini-commands.js +264 -0
- package/lib/dist/installer/gemini-commands.js.map +1 -0
- package/lib/dist/installer/index.d.ts +23 -1
- package/lib/dist/installer/index.d.ts.map +1 -1
- package/lib/dist/installer/index.js +22 -3
- package/lib/dist/installer/index.js.map +1 -1
- package/lib/dist/installer/install-defaults.d.ts +19 -0
- package/lib/dist/installer/install-defaults.d.ts.map +1 -1
- package/lib/dist/installer/install-defaults.js +28 -0
- package/lib/dist/installer/install-defaults.js.map +1 -1
- package/lib/dist/installer/instructions-template.d.ts +22 -0
- package/lib/dist/installer/instructions-template.d.ts.map +1 -1
- package/lib/dist/installer/instructions-template.js +37 -1
- package/lib/dist/installer/instructions-template.js.map +1 -1
- package/lib/dist/installer/targets/claude.d.ts +4 -0
- package/lib/dist/installer/targets/claude.d.ts.map +1 -1
- package/lib/dist/installer/targets/claude.js +8 -25
- package/lib/dist/installer/targets/claude.js.map +1 -1
- package/lib/dist/installer/targets/gemini.d.ts +85 -12
- package/lib/dist/installer/targets/gemini.d.ts.map +1 -1
- package/lib/dist/installer/targets/gemini.js +527 -30
- package/lib/dist/installer/targets/gemini.js.map +1 -1
- package/lib/dist/installer/targets/shared.d.ts +13 -0
- package/lib/dist/installer/targets/shared.d.ts.map +1 -1
- package/lib/dist/installer/targets/shared.js +18 -0
- package/lib/dist/installer/targets/shared.js.map +1 -1
- package/lib/dist/installer/targets/types.d.ts +12 -0
- package/lib/dist/installer/targets/types.d.ts.map +1 -1
- package/lib/dist/jira/auto-publish.d.ts +71 -4
- package/lib/dist/jira/auto-publish.d.ts.map +1 -1
- package/lib/dist/jira/auto-publish.js +186 -17
- package/lib/dist/jira/auto-publish.js.map +1 -1
- package/lib/dist/jira/reconcile.d.ts +24 -1
- package/lib/dist/jira/reconcile.d.ts.map +1 -1
- package/lib/dist/jira/reconcile.js +46 -2
- package/lib/dist/jira/reconcile.js.map +1 -1
- package/lib/dist/jira/repo-config.d.ts +9 -0
- package/lib/dist/jira/repo-config.d.ts.map +1 -1
- package/lib/dist/jira/repo-config.js +11 -0
- package/lib/dist/jira/repo-config.js.map +1 -1
- package/lib/dist/jira/types.d.ts +7 -0
- package/lib/dist/jira/types.d.ts.map +1 -1
- package/lib/dist/jira/types.js.map +1 -1
- package/lib/dist/knowledge/enforce.d.ts +75 -0
- package/lib/dist/knowledge/enforce.d.ts.map +1 -0
- package/lib/dist/knowledge/enforce.js +250 -0
- package/lib/dist/knowledge/enforce.js.map +1 -0
- package/lib/dist/knowledge/facts.d.ts +33 -0
- package/lib/dist/knowledge/facts.d.ts.map +1 -0
- package/lib/dist/knowledge/facts.js +117 -0
- package/lib/dist/knowledge/facts.js.map +1 -0
- package/lib/dist/knowledge/proposals.d.ts +88 -0
- package/lib/dist/knowledge/proposals.d.ts.map +1 -0
- package/lib/dist/knowledge/proposals.js +360 -0
- package/lib/dist/knowledge/proposals.js.map +1 -0
- package/lib/dist/knowledge/stale.d.ts +64 -0
- package/lib/dist/knowledge/stale.d.ts.map +1 -0
- package/lib/dist/knowledge/stale.js +174 -0
- package/lib/dist/knowledge/stale.js.map +1 -0
- package/lib/dist/mcp/gemini-session.d.ts +50 -0
- package/lib/dist/mcp/gemini-session.d.ts.map +1 -0
- package/lib/dist/mcp/gemini-session.js +159 -0
- package/lib/dist/mcp/gemini-session.js.map +1 -0
- package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
- package/lib/dist/mcp/jira-tools.js +25 -0
- package/lib/dist/mcp/jira-tools.js.map +1 -1
- package/lib/dist/mcp/model-context.d.ts +22 -9
- package/lib/dist/mcp/model-context.d.ts.map +1 -1
- package/lib/dist/mcp/model-context.js +35 -13
- package/lib/dist/mcp/model-context.js.map +1 -1
- package/lib/dist/mcp/proxy.js +1 -1
- package/lib/dist/mcp/proxy.js.map +1 -1
- package/lib/dist/mcp/server-instructions.d.ts +16 -15
- package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
- package/lib/dist/mcp/server-instructions.js +67 -1
- package/lib/dist/mcp/server-instructions.js.map +1 -1
- package/lib/dist/mcp/session.js +1 -1
- package/lib/dist/mcp/session.js.map +1 -1
- package/lib/dist/mcp/spec-tools.d.ts +9 -1
- package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
- package/lib/dist/mcp/spec-tools.js +69 -21
- package/lib/dist/mcp/spec-tools.js.map +1 -1
- package/lib/dist/mcp/tools.d.ts +37 -1
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +120 -9
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/pulse/pulse.d.ts +93 -0
- package/lib/dist/pulse/pulse.d.ts.map +1 -0
- package/lib/dist/pulse/pulse.js +401 -0
- package/lib/dist/pulse/pulse.js.map +1 -0
- package/lib/dist/reflect/apply.d.ts.map +1 -1
- package/lib/dist/reflect/apply.js +38 -3
- package/lib/dist/reflect/apply.js.map +1 -1
- package/lib/dist/reflect/auto-sweep.d.ts +26 -0
- package/lib/dist/reflect/auto-sweep.d.ts.map +1 -0
- package/lib/dist/reflect/auto-sweep.js +90 -0
- package/lib/dist/reflect/auto-sweep.js.map +1 -0
- package/lib/dist/reflect/cli.d.ts +62 -0
- package/lib/dist/reflect/cli.d.ts.map +1 -0
- package/lib/dist/reflect/cli.js +163 -0
- package/lib/dist/reflect/cli.js.map +1 -0
- package/lib/dist/reflect/miner.d.ts.map +1 -1
- package/lib/dist/reflect/miner.js +119 -0
- package/lib/dist/reflect/miner.js.map +1 -1
- package/lib/dist/reflect/sweep.d.ts +1 -0
- package/lib/dist/reflect/sweep.d.ts.map +1 -1
- package/lib/dist/reflect/sweep.js +62 -13
- package/lib/dist/reflect/sweep.js.map +1 -1
- package/lib/dist/reflect/targets.d.ts +2 -0
- package/lib/dist/reflect/targets.d.ts.map +1 -1
- package/lib/dist/reflect/targets.js +33 -0
- package/lib/dist/reflect/targets.js.map +1 -1
- package/lib/dist/reflect/types.d.ts +19 -2
- package/lib/dist/reflect/types.d.ts.map +1 -1
- package/lib/dist/resolution/test-title-links.d.ts.map +1 -1
- package/lib/dist/resolution/test-title-links.js +3 -14
- package/lib/dist/resolution/test-title-links.js.map +1 -1
- package/lib/dist/server/routes/claude.js +15 -7
- package/lib/dist/server/routes/knowledge.js +118 -0
- package/lib/dist/server/server.js +2 -0
- package/lib/dist/spec-lint/lint.d.ts +1 -1
- package/lib/dist/spec-lint/lint.d.ts.map +1 -1
- package/lib/dist/spec-lint/lint.js +63 -2
- package/lib/dist/spec-lint/lint.js.map +1 -1
- package/lib/dist/spec-quality/criterion-ids.d.ts +13 -0
- package/lib/dist/spec-quality/criterion-ids.d.ts.map +1 -0
- package/lib/dist/spec-quality/criterion-ids.js +38 -0
- package/lib/dist/spec-quality/criterion-ids.js.map +1 -0
- package/lib/dist/spec-quality/evidence-kind.d.ts +54 -0
- package/lib/dist/spec-quality/evidence-kind.d.ts.map +1 -0
- package/lib/dist/spec-quality/evidence-kind.js +183 -0
- package/lib/dist/spec-quality/evidence-kind.js.map +1 -0
- package/lib/dist/spec-quality/link-persist.d.ts +65 -0
- package/lib/dist/spec-quality/link-persist.d.ts.map +1 -0
- package/lib/dist/spec-quality/link-persist.js +249 -0
- package/lib/dist/spec-quality/link-persist.js.map +1 -0
- package/lib/dist/spec-quality/plan-scope.d.ts +38 -0
- package/lib/dist/spec-quality/plan-scope.d.ts.map +1 -0
- package/lib/dist/spec-quality/plan-scope.js +129 -0
- package/lib/dist/spec-quality/plan-scope.js.map +1 -0
- package/lib/dist/spec-quality/postcheck.d.ts +85 -0
- package/lib/dist/spec-quality/postcheck.d.ts.map +1 -0
- package/lib/dist/spec-quality/postcheck.js +390 -0
- package/lib/dist/spec-quality/postcheck.js.map +1 -0
- package/lib/dist/spec-quality/readiness.d.ts +72 -0
- package/lib/dist/spec-quality/readiness.d.ts.map +1 -0
- package/lib/dist/spec-quality/readiness.js +226 -0
- package/lib/dist/spec-quality/readiness.js.map +1 -0
- package/lib/dist/workflows/agents/claude.d.ts +16 -0
- package/lib/dist/workflows/agents/claude.d.ts.map +1 -0
- package/lib/dist/workflows/agents/claude.js +82 -0
- package/lib/dist/workflows/agents/claude.js.map +1 -0
- package/lib/dist/workflows/agents/gemini.d.ts +21 -0
- package/lib/dist/workflows/agents/gemini.d.ts.map +1 -0
- package/lib/dist/workflows/agents/gemini.js +124 -0
- package/lib/dist/workflows/agents/gemini.js.map +1 -0
- package/lib/dist/workflows/agents/index.d.ts +28 -0
- package/lib/dist/workflows/agents/index.d.ts.map +1 -0
- package/lib/dist/workflows/agents/index.js +104 -0
- package/lib/dist/workflows/agents/index.js.map +1 -0
- package/lib/dist/workflows/agents/types.d.ts +55 -0
- package/lib/dist/workflows/agents/types.d.ts.map +1 -0
- package/lib/dist/workflows/agents/types.js +46 -0
- package/lib/dist/workflows/agents/types.js.map +1 -0
- package/lib/dist/workflows/batch.d.ts +63 -0
- package/lib/dist/workflows/batch.d.ts.map +1 -0
- package/lib/dist/workflows/batch.js +151 -0
- package/lib/dist/workflows/batch.js.map +1 -0
- package/lib/dist/workflows/defaults/claude-design-implement.yaml +3 -4
- package/lib/dist/workflows/defaults/spec-author.yaml +11 -9
- package/lib/dist/workflows/defaults/spec-implement-mixed.yaml +21 -436
- package/lib/dist/workflows/defaults/spec-implement.yaml +465 -46
- package/lib/dist/workflows/discovery.d.ts +13 -0
- package/lib/dist/workflows/discovery.d.ts.map +1 -1
- package/lib/dist/workflows/discovery.js +79 -17
- package/lib/dist/workflows/discovery.js.map +1 -1
- package/lib/dist/workflows/executor.d.ts +18 -0
- package/lib/dist/workflows/executor.d.ts.map +1 -1
- package/lib/dist/workflows/executor.js +130 -33
- package/lib/dist/workflows/executor.js.map +1 -1
- package/lib/dist/workflows/gc.d.ts +50 -0
- package/lib/dist/workflows/gc.d.ts.map +1 -0
- package/lib/dist/workflows/gc.js +120 -0
- package/lib/dist/workflows/gc.js.map +1 -0
- package/lib/dist/workflows/merge-queue.d.ts +64 -0
- package/lib/dist/workflows/merge-queue.d.ts.map +1 -0
- package/lib/dist/workflows/merge-queue.js +162 -0
- package/lib/dist/workflows/merge-queue.js.map +1 -0
- package/lib/dist/workflows/runners/approval.d.ts +1 -1
- package/lib/dist/workflows/runners/approval.d.ts.map +1 -1
- package/lib/dist/workflows/runners/approval.js +11 -2
- package/lib/dist/workflows/runners/approval.js.map +1 -1
- package/lib/dist/workflows/runners/bash.d.ts +15 -0
- package/lib/dist/workflows/runners/bash.d.ts.map +1 -1
- package/lib/dist/workflows/runners/bash.js +50 -1
- package/lib/dist/workflows/runners/bash.js.map +1 -1
- package/lib/dist/workflows/runners/prompt.d.ts +16 -41
- package/lib/dist/workflows/runners/prompt.d.ts.map +1 -1
- package/lib/dist/workflows/runners/prompt.js +55 -120
- package/lib/dist/workflows/runners/prompt.js.map +1 -1
- package/lib/dist/workflows/runners/types.d.ts +12 -0
- package/lib/dist/workflows/runners/types.d.ts.map +1 -1
- package/lib/dist/workflows/schemas/workflow.d.ts +17 -0
- package/lib/dist/workflows/schemas/workflow.d.ts.map +1 -1
- package/lib/dist/workflows/schemas/workflow.js +27 -0
- package/lib/dist/workflows/schemas/workflow.js.map +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +2 -2
- package/package.json +5 -3
- package/node.exe +0 -4
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
* - subtask divergence: a Sub-task was added in JIRA that has no matching
|
|
11
11
|
* acceptance criterion — reported with a proposed `.A<N+1>` id and text
|
|
12
12
|
* derived from the Sub-task summary.
|
|
13
|
+
* - criterion divergence (REQ-THRU-009): the reverse direction — an
|
|
14
|
+
* acceptance criterion with no Sub-task of matching summary
|
|
15
|
+
* (`missingSubtasks`), or one matched by more than one Sub-task
|
|
16
|
+
* (`duplicateSubtasks`).
|
|
13
17
|
*
|
|
14
18
|
* Sub-task matching reuses `subtaskSummary()` from `./publish` so the
|
|
15
19
|
* comparison uses the EXACT same one-line truncation the publisher wrote
|
|
@@ -23,10 +27,14 @@ exports.diffIssueVsSpec = diffIssueVsSpec;
|
|
|
23
27
|
const publish_1 = require("./publish");
|
|
24
28
|
/**
|
|
25
29
|
* True when the report has any divergence to show. A clean report (no content
|
|
26
|
-
* mismatch, no orphan Sub-task
|
|
30
|
+
* mismatch, no orphan Sub-task, no criterion missing or duplicated as a
|
|
31
|
+
* Sub-task) is not surfaced to the user.
|
|
27
32
|
*/
|
|
28
33
|
function reportHasDivergence(report) {
|
|
29
|
-
return Boolean(report.content) ||
|
|
34
|
+
return (Boolean(report.content) ||
|
|
35
|
+
report.subtasks.length > 0 ||
|
|
36
|
+
(report.missingSubtasks?.length ?? 0) > 0 ||
|
|
37
|
+
(report.duplicateSubtasks?.length ?? 0) > 0);
|
|
30
38
|
}
|
|
31
39
|
/**
|
|
32
40
|
* The next `.A<N>` id after the largest existing suffix under `requirementId`.
|
|
@@ -66,6 +74,8 @@ function diffIssueVsSpec(issue, spec, storedFingerprint) {
|
|
|
66
74
|
issueKey: issue.key,
|
|
67
75
|
requirementId: spec.requirementId,
|
|
68
76
|
subtasks: [],
|
|
77
|
+
missingSubtasks: [],
|
|
78
|
+
duplicateSubtasks: [],
|
|
69
79
|
};
|
|
70
80
|
// Content divergence (REQ-JIRATEAM-005.A1). The publisher's fingerprint is
|
|
71
81
|
// over (summary, description); we recompute the LIVE fingerprint and compare.
|
|
@@ -106,6 +116,40 @@ function diffIssueVsSpec(issue, spec, storedFingerprint) {
|
|
|
106
116
|
const n = Number(nextId.slice(`${spec.requirementId}.A`.length)) + 1;
|
|
107
117
|
nextId = `${spec.requirementId}.A${n}`;
|
|
108
118
|
}
|
|
119
|
+
// Criterion → Sub-task direction (REQ-THRU-009). Only judged when the live
|
|
120
|
+
// issue carries its sub-task list (the detail path); a summary-only read
|
|
121
|
+
// can't tell "no sub-tasks" from "not fetched".
|
|
122
|
+
if (Array.isArray(issue.subtasks)) {
|
|
123
|
+
const keysBySummary = new Map();
|
|
124
|
+
for (const st of issue.subtasks) {
|
|
125
|
+
const summary = (0, publish_1.subtaskSummary)(st.summary ?? '');
|
|
126
|
+
if (!summary)
|
|
127
|
+
continue;
|
|
128
|
+
const keys = keysBySummary.get(summary) ?? [];
|
|
129
|
+
keys.push(st.key);
|
|
130
|
+
keysBySummary.set(summary, keys);
|
|
131
|
+
}
|
|
132
|
+
for (const a of spec.acceptance) {
|
|
133
|
+
const expected = (0, publish_1.subtaskSummary)(a.text);
|
|
134
|
+
if (!expected)
|
|
135
|
+
continue;
|
|
136
|
+
const keys = keysBySummary.get(expected) ?? [];
|
|
137
|
+
if (keys.length === 0) {
|
|
138
|
+
report.missingSubtasks.push({
|
|
139
|
+
criterionId: a.id,
|
|
140
|
+
criterionText: a.text,
|
|
141
|
+
expectedSummary: expected,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else if (keys.length > 1) {
|
|
145
|
+
report.duplicateSubtasks.push({
|
|
146
|
+
criterionId: a.id,
|
|
147
|
+
criterionText: a.text,
|
|
148
|
+
subtaskKeys: [...keys],
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
109
153
|
return report;
|
|
110
154
|
}
|
|
111
155
|
//# sourceMappingURL=reconcile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/jira/reconcile.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/jira/reconcile.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,15 @@ export declare function loadRepoJiraBinding(cwd: string): {
|
|
|
34
34
|
binding: JiraRepoBinding | null;
|
|
35
35
|
path: string | null;
|
|
36
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* Read and validate the repo-committed JIRA binding, including the
|
|
39
|
+
* `jira.autoPublish` opt-in (REQ-THRU-006): only a literal `true` enables
|
|
40
|
+
* publishing on `sync`; any other value (or absence) leaves it off.
|
|
41
|
+
*/
|
|
42
|
+
export declare function readRepoJiraBinding(cwd: string): {
|
|
43
|
+
binding: JiraRepoBinding | null;
|
|
44
|
+
path: string | null;
|
|
45
|
+
};
|
|
37
46
|
/**
|
|
38
47
|
* Merge a partial `jira` binding patch into the committed
|
|
39
48
|
* `specship.config.json` (REQ-JIRATEAM-006 — used when the intake gate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-config.d.ts","sourceRoot":"","sources":["../../src/jira/repo-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAkB3D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,MAAM,GACjB,IAAI,CAcN;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GACV;IAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"repo-config.d.ts","sourceRoot":"","sources":["../../src/jira/repo-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAkB3D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,MAAM,GACjB,IAAI,CAcN;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GACV;IAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GACV;IAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA8C1D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAyC5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAClB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAc9C;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,KAAK,EACV,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC9D,eAAe,CAMjB"}
|
|
@@ -49,6 +49,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
49
49
|
exports.findRepoRoot = findRepoRoot;
|
|
50
50
|
exports.assertNoCredentialsInRepoConfig = assertNoCredentialsInRepoConfig;
|
|
51
51
|
exports.loadRepoJiraBinding = loadRepoJiraBinding;
|
|
52
|
+
exports.readRepoJiraBinding = readRepoJiraBinding;
|
|
52
53
|
exports.updateRepoJiraBinding = updateRepoJiraBinding;
|
|
53
54
|
exports.bindingIssueTypes = bindingIssueTypes;
|
|
54
55
|
exports.wrapRepoBindingProjectError = wrapRepoBindingProjectError;
|
|
@@ -117,6 +118,14 @@ function assertNoCredentialsInRepoConfig(raw, configPath) {
|
|
|
117
118
|
* through to the solo-lane user-level behavior (REQ-JIRATEAM-001.A3).
|
|
118
119
|
*/
|
|
119
120
|
function loadRepoJiraBinding(cwd) {
|
|
121
|
+
return readRepoJiraBinding(cwd);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Read and validate the repo-committed JIRA binding, including the
|
|
125
|
+
* `jira.autoPublish` opt-in (REQ-THRU-006): only a literal `true` enables
|
|
126
|
+
* publishing on `sync`; any other value (or absence) leaves it off.
|
|
127
|
+
*/
|
|
128
|
+
function readRepoJiraBinding(cwd) {
|
|
120
129
|
const root = findRepoRoot(cwd);
|
|
121
130
|
if (!root)
|
|
122
131
|
return { binding: null, path: null };
|
|
@@ -159,6 +168,8 @@ function loadRepoJiraBinding(cwd) {
|
|
|
159
168
|
binding.sprint = j.sprint;
|
|
160
169
|
if (typeof j.epicKey === 'string' && j.epicKey.trim())
|
|
161
170
|
binding.epicKey = j.epicKey.trim();
|
|
171
|
+
if (j.autoPublish === true)
|
|
172
|
+
binding.autoPublish = true;
|
|
162
173
|
return { binding, path: configPath };
|
|
163
174
|
}
|
|
164
175
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-config.js","sourceRoot":"","sources":["../../src/jira/repo-config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BH,oCAUC;AAOD,0EAiBC;AAQD,
|
|
1
|
+
{"version":3,"file":"repo-config.js","sourceRoot":"","sources":["../../src/jira/repo-config.ts"],"names":[],"mappings":"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"}
|
package/lib/dist/jira/types.d.ts
CHANGED
|
@@ -95,6 +95,13 @@ export interface JiraRepoBinding {
|
|
|
95
95
|
* unless the spec's frontmatter names a different `epicKey`.
|
|
96
96
|
*/
|
|
97
97
|
epicKey?: string;
|
|
98
|
+
/**
|
|
99
|
+
* Explicit opt-in for publishing to JIRA during `specship sync`
|
|
100
|
+
* (REQ-THRU-006). Absent or anything but `true` → sync publishes nothing
|
|
101
|
+
* and only reports the pending count; `specship jira publish --pending`
|
|
102
|
+
* publishes explicitly.
|
|
103
|
+
*/
|
|
104
|
+
autoPublish?: boolean;
|
|
98
105
|
}
|
|
99
106
|
/**
|
|
100
107
|
* One open epic returned from `listEpics` (REQ-JIRATEAM-006), used to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,8CAA8C;AAC9C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,YAAY,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,UAAU,EAAE,cAAc,CAAC;IAC3B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAkOH;;;;;;GAMG;AACH,MAAa,SAAU,SAAQ,KAAK;IACzB,IAAI,CAAS;IACtB,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAPD,8BAOC;AAED,iEAAiE;AACjE,MAAa,eAAgB,SAAQ,SAAS;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED;;;;;;GAMG;AACH,MAAa,qBAAsB,SAAQ,SAAS;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC;AAED,8DAA8D;AAC9D,MAAa,aAAc,SAAQ,SAAS;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC;AAED;;;;;GAKG;AACH,MAAa,iBAAkB,SAAQ,SAAS;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AALD,8CAKC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Machine-enforced domain rules (KNOWLEDGE-DOC, REQ-KNOW-003).
|
|
3
|
+
*
|
|
4
|
+
* A domain fact MAY carry an `## Enforced` section whose bullets read
|
|
5
|
+
*
|
|
6
|
+
* - `<glob>` must not match `/<regex>/` (flags allowed: `/x/i`)
|
|
7
|
+
*
|
|
8
|
+
* `checkEnforcedRules` scans every project file matching each glob and reports
|
|
9
|
+
* each matching line as a violation naming the fact, file and line. A bullet
|
|
10
|
+
* that doesn't follow the form is returned as malformed (the spec lint turns
|
|
11
|
+
* it into an error — `spec_malformed_enforced_rule`).
|
|
12
|
+
*
|
|
13
|
+
* Read-only over the project tree; never writes.
|
|
14
|
+
*/
|
|
15
|
+
export interface EnforcedRule {
|
|
16
|
+
/** Project-relative glob the rule applies to. */
|
|
17
|
+
glob: string;
|
|
18
|
+
/** The regex source, as written between the slashes. */
|
|
19
|
+
pattern: string;
|
|
20
|
+
/** Regex flags as written (without `g`/`y`, which are meaningless per line). */
|
|
21
|
+
flags: string;
|
|
22
|
+
/** 1-indexed line of the bullet within the parsed body. */
|
|
23
|
+
line: number;
|
|
24
|
+
}
|
|
25
|
+
export interface MalformedEnforcedBullet {
|
|
26
|
+
/** 1-indexed line of the bullet within the parsed body. */
|
|
27
|
+
line: number;
|
|
28
|
+
text: string;
|
|
29
|
+
reason: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ParsedEnforcedRules {
|
|
32
|
+
rules: EnforcedRule[];
|
|
33
|
+
malformed: MalformedEnforcedBullet[];
|
|
34
|
+
}
|
|
35
|
+
export interface EnforcedViolation {
|
|
36
|
+
factId: string;
|
|
37
|
+
/** Project-relative, forward-slashed path. */
|
|
38
|
+
file: string;
|
|
39
|
+
/** 1-indexed line of the match. */
|
|
40
|
+
line: number;
|
|
41
|
+
/** The matching line, trimmed. */
|
|
42
|
+
text: string;
|
|
43
|
+
/** The rule that matched, as `` `glob` must not match `/re/` ``. */
|
|
44
|
+
rule: string;
|
|
45
|
+
}
|
|
46
|
+
export interface EnforceCheckResult {
|
|
47
|
+
violations: EnforcedViolation[];
|
|
48
|
+
/** Number of well-formed rules evaluated. */
|
|
49
|
+
rulesChecked: number;
|
|
50
|
+
}
|
|
51
|
+
export interface CheckEnforcedRulesOptions {
|
|
52
|
+
/** Extra directory names to skip during the walk (added to the defaults). */
|
|
53
|
+
skipDirs?: string[];
|
|
54
|
+
/** Files larger than this are skipped (default 2 MiB). */
|
|
55
|
+
maxFileBytes?: number;
|
|
56
|
+
}
|
|
57
|
+
/** Directories never scanned: dependencies, VCS, build output, tool state. */
|
|
58
|
+
export declare const ENFORCE_SKIP_DIRS: string[];
|
|
59
|
+
/**
|
|
60
|
+
* Parse the `## Enforced` section of a fact body. The section runs to the next
|
|
61
|
+
* `#` / `##` heading; non-bullet prose inside it is ignored, every bullet must
|
|
62
|
+
* be a rule. A body with no such section yields no rules and no malformed bullets.
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseEnforcedRules(factBody: string): ParsedEnforcedRules;
|
|
65
|
+
/**
|
|
66
|
+
* Evaluate every well-formed enforced rule of every domain fact under
|
|
67
|
+
* `<projectRoot>/specs/domain/` against the project tree. Malformed bullets
|
|
68
|
+
* are skipped here (the lint reports them).
|
|
69
|
+
*/
|
|
70
|
+
export declare function checkEnforcedRules(projectRoot: string, opts?: CheckEnforcedRulesOptions): EnforceCheckResult;
|
|
71
|
+
/** Exit code for `knowledge check`: non-zero when any violation exists. */
|
|
72
|
+
export declare function exitCodeForEnforce(result: EnforceCheckResult): number;
|
|
73
|
+
/** Human-readable report for `knowledge check`. */
|
|
74
|
+
export declare function formatEnforceReport(result: EnforceCheckResult): string;
|
|
75
|
+
//# sourceMappingURL=enforce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforce.d.ts","sourceRoot":"","sources":["../../src/knowledge/enforce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,EAAE,uBAAuB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,UAA2D,CAAC;AAQ1F;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CA2DxE;AAuBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,yBAA8B,GACnC,kBAAkB,CAwDpB;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAErE;AAED,mDAAmD;AACnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAuBtE"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Machine-enforced domain rules (KNOWLEDGE-DOC, REQ-KNOW-003).
|
|
4
|
+
*
|
|
5
|
+
* A domain fact MAY carry an `## Enforced` section whose bullets read
|
|
6
|
+
*
|
|
7
|
+
* - `<glob>` must not match `/<regex>/` (flags allowed: `/x/i`)
|
|
8
|
+
*
|
|
9
|
+
* `checkEnforcedRules` scans every project file matching each glob and reports
|
|
10
|
+
* each matching line as a violation naming the fact, file and line. A bullet
|
|
11
|
+
* that doesn't follow the form is returned as malformed (the spec lint turns
|
|
12
|
+
* it into an error — `spec_malformed_enforced_rule`).
|
|
13
|
+
*
|
|
14
|
+
* Read-only over the project tree; never writes.
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.ENFORCE_SKIP_DIRS = void 0;
|
|
54
|
+
exports.parseEnforcedRules = parseEnforcedRules;
|
|
55
|
+
exports.checkEnforcedRules = checkEnforcedRules;
|
|
56
|
+
exports.exitCodeForEnforce = exitCodeForEnforce;
|
|
57
|
+
exports.formatEnforceReport = formatEnforceReport;
|
|
58
|
+
const fs = __importStar(require("fs"));
|
|
59
|
+
const path = __importStar(require("path"));
|
|
60
|
+
const picomatch_1 = __importDefault(require("picomatch"));
|
|
61
|
+
const facts_1 = require("./facts");
|
|
62
|
+
/** Directories never scanned: dependencies, VCS, build output, tool state. */
|
|
63
|
+
exports.ENFORCE_SKIP_DIRS = ['node_modules', '.git', 'dist', '.specship', '.claude'];
|
|
64
|
+
const ENFORCED_HEADING = /^\s*##\s+Enforced\s*$/i;
|
|
65
|
+
const ANY_SECTION_HEADING = /^\s*#{1,2}\s+\S/;
|
|
66
|
+
const BULLET = /^\s*[-*+]\s+(.*)$/;
|
|
67
|
+
const RULE_FORM = /^`([^`]+)`\s+must\s+not\s+match\s+`?\/(.+)\/([a-z]*)`?\s*$/;
|
|
68
|
+
const VALID_FLAGS = /^[dimsuvgy]*$/;
|
|
69
|
+
/**
|
|
70
|
+
* Parse the `## Enforced` section of a fact body. The section runs to the next
|
|
71
|
+
* `#` / `##` heading; non-bullet prose inside it is ignored, every bullet must
|
|
72
|
+
* be a rule. A body with no such section yields no rules and no malformed bullets.
|
|
73
|
+
*/
|
|
74
|
+
function parseEnforcedRules(factBody) {
|
|
75
|
+
const rules = [];
|
|
76
|
+
const malformed = [];
|
|
77
|
+
const lines = factBody.split(/\r?\n/);
|
|
78
|
+
let inSection = false;
|
|
79
|
+
let inFence = false;
|
|
80
|
+
for (let i = 0; i < lines.length; i++) {
|
|
81
|
+
const raw = lines[i] ?? '';
|
|
82
|
+
if (/^\s*```/.test(raw)) {
|
|
83
|
+
inFence = !inFence;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (inFence)
|
|
87
|
+
continue;
|
|
88
|
+
if (ENFORCED_HEADING.test(raw)) {
|
|
89
|
+
inSection = true;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (ANY_SECTION_HEADING.test(raw)) {
|
|
93
|
+
inSection = false;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (!inSection)
|
|
97
|
+
continue;
|
|
98
|
+
const b = raw.match(BULLET);
|
|
99
|
+
if (!b)
|
|
100
|
+
continue;
|
|
101
|
+
const text = (b[1] ?? '').trim();
|
|
102
|
+
const m = text.match(RULE_FORM);
|
|
103
|
+
if (!m) {
|
|
104
|
+
malformed.push({
|
|
105
|
+
line: i + 1,
|
|
106
|
+
text,
|
|
107
|
+
reason: 'expected the form `<glob>` must not match `/<regex>/`',
|
|
108
|
+
});
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const glob = (m[1] ?? '').trim();
|
|
112
|
+
const pattern = m[2] ?? '';
|
|
113
|
+
const rawFlags = m[3] ?? '';
|
|
114
|
+
if (!VALID_FLAGS.test(rawFlags)) {
|
|
115
|
+
malformed.push({ line: i + 1, text, reason: `invalid regex flags "${rawFlags}"` });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const flags = [...new Set(rawFlags.replace(/[gy]/g, ''))].join('');
|
|
119
|
+
try {
|
|
120
|
+
new RegExp(pattern, flags);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
malformed.push({
|
|
124
|
+
line: i + 1,
|
|
125
|
+
text,
|
|
126
|
+
reason: `invalid regex: ${err instanceof Error ? err.message : String(err)}`,
|
|
127
|
+
});
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (glob.length === 0) {
|
|
131
|
+
malformed.push({ line: i + 1, text, reason: 'empty glob' });
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
rules.push({ glob, pattern, flags, line: i + 1 });
|
|
135
|
+
}
|
|
136
|
+
return { rules, malformed };
|
|
137
|
+
}
|
|
138
|
+
function walkFiles(root, skip, out, dir = root) {
|
|
139
|
+
let entries;
|
|
140
|
+
try {
|
|
141
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
for (const e of entries) {
|
|
147
|
+
const full = path.join(dir, e.name);
|
|
148
|
+
if (e.isDirectory()) {
|
|
149
|
+
if (!skip.has(e.name))
|
|
150
|
+
walkFiles(root, skip, out, full);
|
|
151
|
+
}
|
|
152
|
+
else if (e.isFile()) {
|
|
153
|
+
out.push(path.relative(root, full).split(path.sep).join('/'));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function describeRule(r) {
|
|
158
|
+
return `\`${r.glob}\` must not match \`/${r.pattern}/${r.flags}\``;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Evaluate every well-formed enforced rule of every domain fact under
|
|
162
|
+
* `<projectRoot>/specs/domain/` against the project tree. Malformed bullets
|
|
163
|
+
* are skipped here (the lint reports them).
|
|
164
|
+
*/
|
|
165
|
+
function checkEnforcedRules(projectRoot, opts = {}) {
|
|
166
|
+
const root = path.resolve(projectRoot);
|
|
167
|
+
const facts = (0, facts_1.loadDomainFacts)(root)
|
|
168
|
+
.map((f) => ({ id: f.id, rules: parseEnforcedRules(f.body).rules }))
|
|
169
|
+
.filter((f) => f.rules.length > 0);
|
|
170
|
+
const rulesChecked = facts.reduce((n, f) => n + f.rules.length, 0);
|
|
171
|
+
if (rulesChecked === 0)
|
|
172
|
+
return { violations: [], rulesChecked: 0 };
|
|
173
|
+
const skip = new Set([...exports.ENFORCE_SKIP_DIRS, ...(opts.skipDirs ?? [])]);
|
|
174
|
+
const maxBytes = opts.maxFileBytes ?? 2 * 1024 * 1024;
|
|
175
|
+
const files = [];
|
|
176
|
+
walkFiles(root, skip, files);
|
|
177
|
+
files.sort();
|
|
178
|
+
const lineCache = new Map();
|
|
179
|
+
const readLines = (rel) => {
|
|
180
|
+
if (lineCache.has(rel))
|
|
181
|
+
return lineCache.get(rel) ?? null;
|
|
182
|
+
let lines = null;
|
|
183
|
+
try {
|
|
184
|
+
const full = path.join(root, rel);
|
|
185
|
+
if (fs.statSync(full).size <= maxBytes) {
|
|
186
|
+
const content = fs.readFileSync(full, 'utf8');
|
|
187
|
+
if (!content.includes('\u0000'))
|
|
188
|
+
lines = content.split(/\r?\n/);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
lines = null;
|
|
193
|
+
}
|
|
194
|
+
lineCache.set(rel, lines);
|
|
195
|
+
return lines;
|
|
196
|
+
};
|
|
197
|
+
const violations = [];
|
|
198
|
+
for (const fact of facts) {
|
|
199
|
+
for (const rule of fact.rules) {
|
|
200
|
+
const isMatch = (0, picomatch_1.default)(rule.glob, { dot: true });
|
|
201
|
+
const re = new RegExp(rule.pattern, rule.flags);
|
|
202
|
+
for (const rel of files) {
|
|
203
|
+
if (!isMatch(rel))
|
|
204
|
+
continue;
|
|
205
|
+
const lines = readLines(rel);
|
|
206
|
+
if (!lines)
|
|
207
|
+
continue;
|
|
208
|
+
for (let i = 0; i < lines.length; i++) {
|
|
209
|
+
const text = lines[i] ?? '';
|
|
210
|
+
if (re.test(text)) {
|
|
211
|
+
violations.push({
|
|
212
|
+
factId: fact.id,
|
|
213
|
+
file: rel,
|
|
214
|
+
line: i + 1,
|
|
215
|
+
text: text.trim(),
|
|
216
|
+
rule: describeRule(rule),
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return { violations, rulesChecked };
|
|
224
|
+
}
|
|
225
|
+
/** Exit code for `knowledge check`: non-zero when any violation exists. */
|
|
226
|
+
function exitCodeForEnforce(result) {
|
|
227
|
+
return result.violations.length > 0 ? 1 : 0;
|
|
228
|
+
}
|
|
229
|
+
/** Human-readable report for `knowledge check`. */
|
|
230
|
+
function formatEnforceReport(result) {
|
|
231
|
+
const out = [];
|
|
232
|
+
if (result.violations.length === 0) {
|
|
233
|
+
out.push(result.rulesChecked === 0
|
|
234
|
+
? 'Knowledge check: no enforced rules declared in specs/domain/.'
|
|
235
|
+
: `Knowledge check: clean — ${result.rulesChecked} enforced rule${result.rulesChecked === 1 ? '' : 's'} checked, 0 violations.`);
|
|
236
|
+
return out.join('\n');
|
|
237
|
+
}
|
|
238
|
+
out.push(`Knowledge check: ${result.violations.length} violation${result.violations.length === 1 ? '' : 's'} of ${result.rulesChecked} enforced rule${result.rulesChecked === 1 ? '' : 's'}.`);
|
|
239
|
+
let lastGroup = '';
|
|
240
|
+
for (const v of result.violations) {
|
|
241
|
+
const group = `${v.factId} ${v.rule}`;
|
|
242
|
+
if (group !== lastGroup) {
|
|
243
|
+
out.push('', group);
|
|
244
|
+
lastGroup = group;
|
|
245
|
+
}
|
|
246
|
+
out.push(` ${v.file}:${v.line} ${v.text}`);
|
|
247
|
+
}
|
|
248
|
+
return out.join('\n');
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=enforce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/knowledge/enforce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read domain facts straight from disk (KNOWLEDGE-DOC).
|
|
3
|
+
*
|
|
4
|
+
* The knowledge commands (`stale`, `check`) are file-based: they must work on
|
|
5
|
+
* a project that has never been indexed, so they read `specs/domain/**\/*.md`
|
|
6
|
+
* and run each file through the real `MarkdownSpecExtractor` — the same parse
|
|
7
|
+
* the indexer and the lint use, so all three agree on what a fact says.
|
|
8
|
+
*
|
|
9
|
+
* Read-only. Nothing in `src/knowledge/` writes to `specs/domain/`
|
|
10
|
+
* (DOM-SPECSHIP-003: domain knowledge is human-confirmed, never auto-extracted).
|
|
11
|
+
*/
|
|
12
|
+
export interface DomainFactFile {
|
|
13
|
+
/** The fact's `DOM-<AREA>-NNN` id. */
|
|
14
|
+
id: string;
|
|
15
|
+
/** Project-relative, forward-slashed path of the fact file. */
|
|
16
|
+
filePath: string;
|
|
17
|
+
/** The fact's frontmatter `type` (term / rule / decision / constraint / external), when set. */
|
|
18
|
+
type?: string;
|
|
19
|
+
/** Frontmatter metadata (for an external fact: dependency, version, source, fixture). */
|
|
20
|
+
metadata: Record<string, unknown>;
|
|
21
|
+
/** Post-frontmatter prose. */
|
|
22
|
+
body: string;
|
|
23
|
+
}
|
|
24
|
+
/** Every addressable domain fact under `<projectRoot>/specs/domain/`, sorted by path. */
|
|
25
|
+
export declare function loadDomainFacts(projectRoot: string): DomainFactFile[];
|
|
26
|
+
/**
|
|
27
|
+
* Split a `fixture:` frontmatter value into `path:Symbol` entries
|
|
28
|
+
* (REQ-KNOW-006). The frontmatter parser is single-line `key: value` only (no
|
|
29
|
+
* YAML lists), so several fixtures are written comma-separated; an optional
|
|
30
|
+
* surrounding `[ ... ]` (YAML flow style) is tolerated.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseFixtureList(value: unknown): string[];
|
|
33
|
+
//# sourceMappingURL=facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../src/knowledge/facts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAmBD,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CA0BrE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAQzD"}
|