@captain_z/zsk 1.8.7 → 1.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +34 -16
  2. package/dist/bin.js +6 -0
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/prepare.js +3 -0
  5. package/dist/commands/prepare.js.map +1 -1
  6. package/dist/core/anchor-drift.d.ts +79 -0
  7. package/dist/core/anchor-drift.js +198 -0
  8. package/dist/core/anchor-drift.js.map +1 -0
  9. package/dist/core/decoupling-eval.d.ts +53 -0
  10. package/dist/core/decoupling-eval.js +260 -0
  11. package/dist/core/decoupling-eval.js.map +1 -0
  12. package/dist/core/issue-publish-adapter.d.ts +50 -0
  13. package/dist/core/issue-publish-adapter.js +371 -0
  14. package/dist/core/issue-publish-adapter.js.map +1 -0
  15. package/dist/core/prepare-artifacts.d.ts +2 -0
  16. package/dist/core/prepare-artifacts.js +2 -0
  17. package/dist/core/prepare-artifacts.js.map +1 -1
  18. package/dist/core/prepare-readiness.d.ts +40 -0
  19. package/dist/core/prepare-readiness.js +268 -0
  20. package/dist/core/prepare-readiness.js.map +1 -0
  21. package/dist/core/prepare-sync.d.ts +2 -0
  22. package/dist/core/prepare-sync.js +8 -16
  23. package/dist/core/prepare-sync.js.map +1 -1
  24. package/dist/core/review-skill-policy.d.ts +74 -0
  25. package/dist/core/review-skill-policy.js +278 -0
  26. package/dist/core/review-skill-policy.js.map +1 -0
  27. package/dist/core/source-snapshot-adapters.d.ts +3 -0
  28. package/dist/core/source-snapshot-adapters.js.map +1 -1
  29. package/dist/core/task-decomposition.d.ts +64 -0
  30. package/dist/core/task-decomposition.js +325 -0
  31. package/dist/core/task-decomposition.js.map +1 -0
  32. package/dist/core/task-plan-adapter.d.ts +57 -0
  33. package/dist/core/task-plan-adapter.js +298 -0
  34. package/dist/core/task-plan-adapter.js.map +1 -0
  35. package/dist/core/validation-packet.d.ts +86 -0
  36. package/dist/core/validation-packet.js +313 -0
  37. package/dist/core/validation-packet.js.map +1 -0
  38. package/dist/core/workflow-orchestration-policy.d.ts +92 -0
  39. package/dist/core/workflow-orchestration-policy.js +215 -0
  40. package/dist/core/workflow-orchestration-policy.js.map +1 -0
  41. package/package.json +2 -2
@@ -0,0 +1,268 @@
1
+ import { escapeTable, safeFileName } from "./prepare-utils.js";
2
+ export const PREPARE_RESOURCE_CATEGORIES = [
3
+ "repo-context",
4
+ "docs",
5
+ "decision-records",
6
+ "issue-tracker",
7
+ "external-docs",
8
+ ];
9
+ export const PREPARE_CONSUMER_REQUIREMENTS = {
10
+ proposal: ["docs", "external-docs", "issue-tracker"],
11
+ spec: ["docs", "external-docs", "decision-records", "issue-tracker"],
12
+ design: ["repo-context", "docs", "decision-records", "external-docs"],
13
+ coding: ["repo-context", "docs", "decision-records"],
14
+ review: ["repo-context", "docs", "decision-records", "issue-tracker", "external-docs"],
15
+ prepare: ["repo-context", "docs", "decision-records", "issue-tracker", "external-docs"],
16
+ };
17
+ export function selectPrepareEntries(entries, opts) {
18
+ if (opts.all || noSelector(opts))
19
+ return entries;
20
+ if (opts.source)
21
+ return selectBySource(entries, opts.source);
22
+ if (opts.lane) {
23
+ const selector = normalizeSelector(opts.lane);
24
+ return entries.filter((entry) => normalizeSelector(entry.rawLane ?? "") === selector);
25
+ }
26
+ if (opts.resource) {
27
+ const selector = normalizeSelector(opts.resource);
28
+ const category = resolveCategorySelector(selector);
29
+ if (!category) {
30
+ throw new Error(`resource selector "${opts.resource}" is not supported. Supported categories: ${PREPARE_RESOURCE_CATEGORIES.join(", ")}`);
31
+ }
32
+ return entries.filter((entry) => classifyPrepareEntry(entry) === category);
33
+ }
34
+ if (opts.consumer) {
35
+ const selector = normalizeSelector(opts.consumer);
36
+ const required = PREPARE_CONSUMER_REQUIREMENTS[selector];
37
+ if (!required) {
38
+ throw new Error(`consumer selector "${opts.consumer}" is not supported. Supported consumers: ${Object.keys(PREPARE_CONSUMER_REQUIREMENTS).join(", ")}`);
39
+ }
40
+ return entries.filter((entry) => required.includes(classifyPrepareEntry(entry)));
41
+ }
42
+ return entries;
43
+ }
44
+ export function buildPrepareReadinessMatrix(entries, results, opts, now = new Date()) {
45
+ const resultByPath = new Map(results.map((result) => [result.sourcePath, result]));
46
+ const selected = new Set(selectPrepareEntries(entries, opts).map((entry) => entry.path));
47
+ const rows = entries.map((entry) => {
48
+ const result = resultByPath.get(entry.path);
49
+ const category = classifyPrepareEntry(entry);
50
+ const consumers = consumersForCategory(category);
51
+ const status = readinessStatus(result, selected.has(entry.path));
52
+ return {
53
+ sourceKey: entry.id,
54
+ sourcePath: entry.path,
55
+ rawLane: entry.rawLane,
56
+ area: entry.area,
57
+ provider: entry.provider,
58
+ category,
59
+ consumers,
60
+ selected: selected.has(entry.path),
61
+ status,
62
+ syncStatus: result?.status,
63
+ snapshot: result?.snapshot,
64
+ changed: result?.changed,
65
+ reason: readinessReason(status, result),
66
+ retry: readinessRetry(status, result, entry, opts),
67
+ impact: readinessImpact(status, consumers),
68
+ };
69
+ });
70
+ return {
71
+ version: 1,
72
+ generatedAt: now.toISOString(),
73
+ selector: {
74
+ source: opts.source,
75
+ resource: opts.resource,
76
+ lane: opts.lane,
77
+ consumer: opts.consumer,
78
+ all: opts.all,
79
+ },
80
+ summary: summarizeRows(rows),
81
+ rows,
82
+ };
83
+ }
84
+ export function renderPrepareReadinessMatrix(matrix) {
85
+ const rows = matrix.rows
86
+ .map((row) => [
87
+ row.sourcePath,
88
+ row.category,
89
+ row.selected ? "yes" : "no",
90
+ row.status,
91
+ row.syncStatus ?? "-",
92
+ row.consumers.join(", ") || "-",
93
+ row.reason,
94
+ row.retry,
95
+ row.impact,
96
+ ].map((value) => escapeTable(value)).join(" | "));
97
+ return [
98
+ "# Prepare Readiness Matrix",
99
+ "",
100
+ `Generated: ${matrix.generatedAt}`,
101
+ "",
102
+ "## Summary",
103
+ "",
104
+ `- available: ${matrix.summary.available}`,
105
+ `- stale: ${matrix.summary.stale}`,
106
+ `- missing: ${matrix.summary.missing}`,
107
+ `- failed: ${matrix.summary.failed}`,
108
+ `- skipped: ${matrix.summary.skipped}`,
109
+ "",
110
+ "## Resources",
111
+ "",
112
+ "| Source | Category | Selected | Readiness | Sync | Consumers | Reason | Retry | Impact |",
113
+ "| --- | --- | --- | --- | --- | --- | --- | --- | --- |",
114
+ ...rows.map((row) => `| ${row} |`),
115
+ "",
116
+ ].join("\n");
117
+ }
118
+ export function classifyPrepareEntry(entry) {
119
+ const tokens = entryTokens(entry);
120
+ if (hasAny(tokens, ["issue", "issues", "bug", "bugs", "defect", "defects", "ticket", "tickets", "jira", "qa"])) {
121
+ return "issue-tracker";
122
+ }
123
+ if (hasAny(tokens, ["decision", "decisions", "adr", "adrs"]))
124
+ return "decision-records";
125
+ if (hasAny(tokens, ["repo", "repos", "repository", "repositories", "backend-repo", "backend_repo", "git", "code", "backend", "frontend", "openapi", "contract", "contracts"])) {
126
+ return "repo-context";
127
+ }
128
+ const origin = entry.source.origin;
129
+ if (origin?.url || hasAny(tokens, ["confluence", "figma", "external", "remote", "url", "http", "https"])) {
130
+ return "external-docs";
131
+ }
132
+ return "docs";
133
+ }
134
+ function noSelector(opts) {
135
+ return !opts.source && !opts.resource && !opts.lane && !opts.consumer;
136
+ }
137
+ function selectBySource(entries, selector) {
138
+ const exact = entries.filter((entry) => entry.id === selector || entry.path === selector || entry.segments.join(".") === selector);
139
+ if (exact.length > 0)
140
+ return exact;
141
+ const alias = entries.filter((entry) => entry.provider === selector);
142
+ if (alias.length > 1) {
143
+ const matches = alias.map((entry) => `${entry.path} (${entry.id})`).join(", ");
144
+ throw new Error(`source selector "${selector}" matched multiple configured sources: ${matches}. Use a source path or path-scoped id.`);
145
+ }
146
+ if (alias.length === 0) {
147
+ const available = entries.map((entry) => `${entry.path} (${entry.id})`).join(", ") || "none";
148
+ throw new Error(`source selector "${selector}" matched no configured sources. Available sources: ${available}.`);
149
+ }
150
+ return alias;
151
+ }
152
+ function resolveCategorySelector(selector) {
153
+ if (PREPARE_RESOURCE_CATEGORIES.includes(selector))
154
+ return selector;
155
+ const aliases = {
156
+ repo: "repo-context",
157
+ repository: "repo-context",
158
+ repositories: "repo-context",
159
+ code: "repo-context",
160
+ decisions: "decision-records",
161
+ decision: "decision-records",
162
+ adr: "decision-records",
163
+ issue: "issue-tracker",
164
+ issues: "issue-tracker",
165
+ defects: "issue-tracker",
166
+ bugs: "issue-tracker",
167
+ jira: "issue-tracker",
168
+ external: "external-docs",
169
+ remote: "external-docs",
170
+ };
171
+ return aliases[selector];
172
+ }
173
+ function readinessStatus(result, selected) {
174
+ if (!selected || !result)
175
+ return "skipped";
176
+ if (result.status === "materialized" || result.status === "materialized-partial" || result.status === "metadata-only") {
177
+ return "available";
178
+ }
179
+ if (result.previousSnapshotHash)
180
+ return "stale";
181
+ if (result.status === "source-gap" || result.status === "blocked-auth")
182
+ return "missing";
183
+ if (result.status === "failed")
184
+ return "failed";
185
+ return "skipped";
186
+ }
187
+ function readinessReason(status, result) {
188
+ if (!result)
189
+ return "Resource was not selected for this prepare run.";
190
+ if (status === "available")
191
+ return result.reason || "Source snapshot is available.";
192
+ if (status === "stale")
193
+ return `${result.reason || "Current sync did not refresh the source."} Previous snapshot is preserved.`;
194
+ return result.reason || "No readiness reason was provided by the adapter.";
195
+ }
196
+ function readinessRetry(status, result, entry, opts) {
197
+ if (status === "available")
198
+ return result?.changed ? "Review downstream consumers for freshness." : "No retry required.";
199
+ if (status === "skipped")
200
+ return `Run prepare sync with --source=${entry.path}, --resource=${classifyPrepareEntry(entry)}, --lane=${entry.rawLane ?? "lane"}, --consumer=<consumer>, or --all.`;
201
+ if (result?.status === "blocked-auth")
202
+ return "Fix credentials, provider readiness, --auth-state/--auth-profile, --browser, or --allow-network, then rerun prepare sync.";
203
+ if (result?.status === "source-gap")
204
+ return "Fix the configured origin path/URL/snapshot mapping, then rerun prepare sync.";
205
+ if (result?.status === "failed")
206
+ return "Inspect adapter-results for this source, repair the adapter/origin, then rerun prepare sync.";
207
+ const selector = opts.consumer ? `--consumer=${opts.consumer}` : opts.resource ? `--resource=${opts.resource}` : opts.lane ? `--lane=${opts.lane}` : "--all";
208
+ return `Rerun prepare sync ${selector} after fixing the resource.`;
209
+ }
210
+ function readinessImpact(status, consumers) {
211
+ if (status === "available")
212
+ return "No blocking impact.";
213
+ if (status === "skipped")
214
+ return consumers.length > 0 ? `Not refreshed for consumers: ${consumers.join(", ")}.` : "Not refreshed for any mapped consumer.";
215
+ return consumers.length > 0 ? `May block or degrade consumers: ${consumers.join(", ")}.` : "May block downstream consumers until accepted or repaired.";
216
+ }
217
+ function summarizeRows(rows) {
218
+ return rows.reduce((summary, row) => {
219
+ summary[row.status] += 1;
220
+ return summary;
221
+ }, { available: 0, stale: 0, missing: 0, failed: 0, skipped: 0 });
222
+ }
223
+ function consumersForCategory(category) {
224
+ return Object.entries(PREPARE_CONSUMER_REQUIREMENTS)
225
+ .filter(([, categories]) => categories.includes(category))
226
+ .map(([consumer]) => consumer)
227
+ .sort();
228
+ }
229
+ function entryTokens(entry) {
230
+ const values = [
231
+ entry.id,
232
+ entry.path,
233
+ entry.rawLane,
234
+ entry.area,
235
+ entry.provider,
236
+ entry.source.kind,
237
+ entry.source.type,
238
+ entry.source.adapter,
239
+ entry.source.provider,
240
+ entry.source.origin?.kind,
241
+ entry.source.origin?.provider,
242
+ entry.source.origin?.path,
243
+ entry.source.origin?.url,
244
+ entry.source.origin?.repository,
245
+ entry.resource?.type,
246
+ entry.resource?.area,
247
+ ];
248
+ const tokens = new Set();
249
+ for (const value of values) {
250
+ if (typeof value !== "string")
251
+ continue;
252
+ for (const token of value.split(/[^a-zA-Z0-9_/-]+|[/]+/)) {
253
+ const normalized = normalizeSelector(token);
254
+ if (normalized)
255
+ tokens.add(normalized);
256
+ }
257
+ tokens.add(normalizeSelector(value));
258
+ }
259
+ tokens.add(safeFileName(entry.id));
260
+ return tokens;
261
+ }
262
+ function hasAny(tokens, values) {
263
+ return values.some((value) => tokens.has(normalizeSelector(value)));
264
+ }
265
+ function normalizeSelector(value) {
266
+ return value.trim().toLowerCase().replace(/_/g, "-");
267
+ }
268
+ //# sourceMappingURL=prepare-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-readiness.js","sourceRoot":"","sources":["../../src/core/prepare-readiness.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { type ProjectConfig } from "./config.js";
2
2
  import { type ProviderReadinessEvidence } from "./provider-readiness.js";
3
3
  import { type PrepareSyncArtifacts } from "./prepare-artifacts.js";
4
+ import { type PrepareReadinessMatrix } from "./prepare-readiness.js";
4
5
  import { type PrepareRouteResult } from "./prepare-routing.js";
5
6
  import { type PrepareSyncOptions, type PrepareSyncResult, type PrepareSyncStatus } from "./source-snapshot-adapters.js";
6
7
  export type { PrepareSyncOptions, PrepareSyncResult, PrepareSyncStatus };
@@ -16,6 +17,7 @@ export type PrepareSyncBundle = {
16
17
  providerReadiness: ProviderReadinessEvidence[];
17
18
  downstreamImpact: string;
18
19
  syncReport: string;
20
+ readinessMatrix: PrepareReadinessMatrix;
19
21
  };
20
22
  export type PrepareAuthCheckStatus = "ready" | "reachable" | "missing-auth" | "blocked-auth" | "source-gap" | "failed";
21
23
  export type PrepareAuthCheckResult = {
@@ -13,6 +13,7 @@ import { describeResource, updateRawIndexes, updateRawManifest } from "./raw-man
13
13
  import { createSyncRunId, resolvePrepareSyncArtifacts, } from "./prepare-artifacts.js";
14
14
  import { hashIfExists, sha256, writePreparedSnapshot } from "./prepare-materialization.js";
15
15
  import { renderDownstreamImpact, renderPreparationReport } from "./prepare-reporting.js";
16
+ import { buildPrepareReadinessMatrix, renderPrepareReadinessMatrix, selectPrepareEntries, } from "./prepare-readiness.js";
16
17
  import { routePreparedResources } from "./prepare-routing.js";
17
18
  import { escapeTable, exists, isRecord, safeFileName } from "./prepare-utils.js";
18
19
  import { interpretSourceAdapter } from "./source-adapter-normalization.js";
@@ -29,7 +30,7 @@ export async function syncPrepareSources(target, config, opts = {}) {
29
30
  const runId = opts.runId ?? createSyncRunId();
30
31
  const artifacts = resolvePrepareSyncArtifacts(target, config, runId);
31
32
  const entries = flattenPrepareEntries(config);
32
- const selected = new Set(selectSourceEntries(entries, opts));
33
+ const selected = new Set(selectPrepareEntries(entries, opts));
33
34
  const results = [];
34
35
  await mkdir(artifacts.adapterResultsDir, { recursive: true });
35
36
  await mkdir(artifacts.providerReadinessDir, { recursive: true });
@@ -56,6 +57,10 @@ export async function syncPrepareSources(target, config, opts = {}) {
56
57
  const syncReport = renderPreparationReport(entries, results, routes);
57
58
  await mkdir(dirname(artifacts.syncReportPath), { recursive: true });
58
59
  await writeFile(artifacts.syncReportPath, syncReport, "utf8");
60
+ const readinessMatrix = buildPrepareReadinessMatrix(entries, results, opts);
61
+ await mkdir(dirname(artifacts.readinessMatrixPath), { recursive: true });
62
+ await writeFile(artifacts.readinessMatrixPath, `${JSON.stringify(readinessMatrix, null, 2)}\n`, "utf8");
63
+ await writeFile(artifacts.readinessMatrixMarkdownPath, renderPrepareReadinessMatrix(readinessMatrix), "utf8");
59
64
  return {
60
65
  artifacts,
61
66
  results,
@@ -63,12 +68,13 @@ export async function syncPrepareSources(target, config, opts = {}) {
63
68
  providerReadiness: [...providerReadiness.byProvider.values()].map((item) => item.evidence),
64
69
  downstreamImpact,
65
70
  syncReport,
71
+ readinessMatrix,
66
72
  };
67
73
  }
68
74
  export async function checkPrepareAuth(target, config, opts = {}) {
69
75
  const runId = opts.runId ?? createSyncRunId();
70
76
  const artifacts = resolvePrepareSyncArtifacts(target, config, runId);
71
- const entries = selectSourceEntries(flattenPrepareEntries(config), opts);
77
+ const entries = selectPrepareEntries(flattenPrepareEntries(config), opts);
72
78
  const authStatePath = resolveSelectedAuthStatePath(target, config, opts);
73
79
  const results = [];
74
80
  for (const entry of entries) {
@@ -78,20 +84,6 @@ export async function checkPrepareAuth(target, config, opts = {}) {
78
84
  await writeFile(artifacts.authCheckPath, `${JSON.stringify({ runId, results }, null, 2)}\n`, "utf8");
79
85
  return { artifacts, results };
80
86
  }
81
- function selectSourceEntries(entries, opts) {
82
- if (opts.all || !opts.source)
83
- return entries;
84
- const selector = opts.source;
85
- const exact = entries.filter((entry) => entry.id === selector || entry.path === selector || entry.segments.join(".") === selector);
86
- if (exact.length > 0)
87
- return exact;
88
- const alias = entries.filter((entry) => entry.provider === selector);
89
- if (alias.length > 1) {
90
- const matches = alias.map((entry) => `${entry.path} (${entry.id})`).join(", ");
91
- throw new Error(`source selector "${selector}" matched multiple configured sources: ${matches}. Use a source path or path-scoped id.`);
92
- }
93
- return alias;
94
- }
95
87
  async function resolveProviderReadiness(target, artifacts, entries) {
96
88
  const names = new Map();
97
89
  for (const entry of entries) {