@captain_z/zsk 1.8.6 → 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 (108) hide show
  1. package/README.md +34 -16
  2. package/dist/bin.js +134 -0
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/add-flow.js +7 -1
  5. package/dist/commands/add-flow.js.map +1 -1
  6. package/dist/commands/add.js +22 -5
  7. package/dist/commands/add.js.map +1 -1
  8. package/dist/commands/dispatch.d.ts +4 -0
  9. package/dist/commands/dispatch.js +483 -7
  10. package/dist/commands/dispatch.js.map +1 -1
  11. package/dist/commands/doctor.js +21 -5
  12. package/dist/commands/doctor.js.map +1 -1
  13. package/dist/commands/issue.d.ts +1 -0
  14. package/dist/commands/issue.js +2 -2
  15. package/dist/commands/issue.js.map +1 -1
  16. package/dist/commands/prepare.js +3 -0
  17. package/dist/commands/prepare.js.map +1 -1
  18. package/dist/commands/project-init.js +14 -8
  19. package/dist/commands/project-init.js.map +1 -1
  20. package/dist/commands/work.d.ts +34 -0
  21. package/dist/commands/work.js +1769 -0
  22. package/dist/commands/work.js.map +1 -0
  23. package/dist/commands/workflow.d.ts +32 -0
  24. package/dist/commands/workflow.js +270 -0
  25. package/dist/commands/workflow.js.map +1 -0
  26. package/dist/core/anchor-drift.d.ts +79 -0
  27. package/dist/core/anchor-drift.js +198 -0
  28. package/dist/core/anchor-drift.js.map +1 -0
  29. package/dist/core/config.d.ts +29 -0
  30. package/dist/core/config.js +157 -1
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/decoupling-eval.d.ts +53 -0
  33. package/dist/core/decoupling-eval.js +260 -0
  34. package/dist/core/decoupling-eval.js.map +1 -0
  35. package/dist/core/issue-publish-adapter.d.ts +50 -0
  36. package/dist/core/issue-publish-adapter.js +371 -0
  37. package/dist/core/issue-publish-adapter.js.map +1 -0
  38. package/dist/core/prepare-artifacts.d.ts +2 -0
  39. package/dist/core/prepare-artifacts.js +2 -0
  40. package/dist/core/prepare-artifacts.js.map +1 -1
  41. package/dist/core/prepare-readiness.d.ts +40 -0
  42. package/dist/core/prepare-readiness.js +268 -0
  43. package/dist/core/prepare-readiness.js.map +1 -0
  44. package/dist/core/prepare-sync.d.ts +2 -0
  45. package/dist/core/prepare-sync.js +8 -16
  46. package/dist/core/prepare-sync.js.map +1 -1
  47. package/dist/core/review-skill-policy.d.ts +74 -0
  48. package/dist/core/review-skill-policy.js +278 -0
  49. package/dist/core/review-skill-policy.js.map +1 -0
  50. package/dist/core/skill-classification.d.ts +13 -0
  51. package/dist/core/skill-classification.js +50 -0
  52. package/dist/core/skill-classification.js.map +1 -0
  53. package/dist/core/source-snapshot-adapters.d.ts +3 -0
  54. package/dist/core/source-snapshot-adapters.js.map +1 -1
  55. package/dist/core/stage-clarity-verification.js +58 -7
  56. package/dist/core/stage-clarity-verification.js.map +1 -1
  57. package/dist/core/task-decomposition.d.ts +64 -0
  58. package/dist/core/task-decomposition.js +325 -0
  59. package/dist/core/task-decomposition.js.map +1 -0
  60. package/dist/core/task-plan-adapter.d.ts +57 -0
  61. package/dist/core/task-plan-adapter.js +298 -0
  62. package/dist/core/task-plan-adapter.js.map +1 -0
  63. package/dist/core/template-registry.js +26 -7
  64. package/dist/core/template-registry.js.map +1 -1
  65. package/dist/core/validation-packet.d.ts +86 -0
  66. package/dist/core/validation-packet.js +313 -0
  67. package/dist/core/validation-packet.js.map +1 -0
  68. package/dist/core/work-ledger.d.ts +44 -0
  69. package/dist/core/work-ledger.js +88 -0
  70. package/dist/core/work-ledger.js.map +1 -0
  71. package/dist/core/work-provider-adapters.d.ts +110 -0
  72. package/dist/core/work-provider-adapters.js +484 -0
  73. package/dist/core/work-provider-adapters.js.map +1 -0
  74. package/dist/core/workflow-graph.d.ts +100 -0
  75. package/dist/core/workflow-graph.js +655 -0
  76. package/dist/core/workflow-graph.js.map +1 -0
  77. package/dist/core/workflow-orchestration-policy.d.ts +92 -0
  78. package/dist/core/workflow-orchestration-policy.js +215 -0
  79. package/dist/core/workflow-orchestration-policy.js.map +1 -0
  80. package/dist/core/workspace-conformance.js +55 -0
  81. package/dist/core/workspace-conformance.js.map +1 -1
  82. package/dist/core/workspace-layout.d.ts +3 -1
  83. package/dist/core/workspace-layout.js +4 -0
  84. package/dist/core/workspace-layout.js.map +1 -1
  85. package/package.json +2 -2
  86. package/schemas/zsk-config.schema.json +112 -1
  87. package/templates/module/frontend-module/CONTEXT.md +22 -0
  88. package/templates/module/frontend-module/design.md +1 -1
  89. package/templates/module/frontend-module/proposal.md +1 -1
  90. package/templates/module/frontend-module/spec.md +1 -1
  91. package/templates/module/frontend-module/tasks.md +14 -1
  92. package/templates/project-init/.zsk/CONTEXT.md +35 -0
  93. package/templates/project-init/.zsk/README.md +94 -10
  94. package/templates/project-init/.zsk/config.yaml +2 -0
  95. package/templates/project-init/.zsk/docs/CONFIG-SCHEMA.md +13 -1
  96. package/templates/project-init/.zsk/docs/PROJECT-CONFIG.md +25 -7
  97. package/templates/project-init/.zsk/docs/SYSTEM-SPEC.md +1 -0
  98. package/templates/project-init/.zsk/team.yaml +218 -0
  99. package/templates/project-init/.zsk/work.yaml +75 -0
  100. package/templates/project-init/.zsk/evidence/README.md +0 -21
  101. package/templates/project-init/.zsk/evidence/prepare/README.md +0 -22
  102. package/templates/project-init/.zsk/issues/README.md +0 -10
  103. package/templates/project-init/.zsk/templates/module/README.md +0 -13
  104. package/templates/project-init/.zsk/templates/module/design.md +0 -22
  105. package/templates/project-init/.zsk/templates/module/module.yaml +0 -15
  106. package/templates/project-init/.zsk/templates/module/proposal.md +0 -20
  107. package/templates/project-init/.zsk/templates/module/spec.md +0 -22
  108. package/templates/project-init/.zsk/templates/module/tasks.md +0 -16
@@ -0,0 +1,313 @@
1
+ const REAL_WIRING_EVIDENCE = new Set(["integration", "smoke", "manual", "review"]);
2
+ const TARGET_SCORE = 100;
3
+ export function evaluateValidationPacket(packet) {
4
+ const diagnostics = [
5
+ ...diagnoseAcceptanceMapping(packet),
6
+ ...diagnoseImplementationLoop(packet),
7
+ ...diagnoseContractTiers(packet),
8
+ ...diagnoseBugfixRedEvidence(packet),
9
+ ...diagnoseMockOnlyCriticalPaths(packet),
10
+ ...diagnoseImplementationAssertions(packet),
11
+ ...diagnoseMissingNegativeEvidence(packet),
12
+ ...diagnoseQualitySignals(packet),
13
+ ];
14
+ const status = assessmentStatus(diagnostics);
15
+ const score = scoreDiagnostics(diagnostics);
16
+ return {
17
+ status,
18
+ targetScore: TARGET_SCORE,
19
+ score,
20
+ confidence: confidenceFor(status, score),
21
+ nextActions: nextActionsFor(diagnostics),
22
+ diagnostics,
23
+ };
24
+ }
25
+ export function formatValidationPacketForPullRequest(packet) {
26
+ const assessment = evaluateValidationPacket(packet);
27
+ const lines = [
28
+ "### Validation packet",
29
+ `Validation: ${assessment.status}`,
30
+ `Score: ${assessment.score}/${assessment.targetScore}`,
31
+ `Confidence: ${assessment.confidence}`,
32
+ "",
33
+ "Acceptance criteria",
34
+ ];
35
+ for (const criterion of packet.acceptanceCriteria) {
36
+ lines.push(`- ${criterion.id}: ${criterion.description}`);
37
+ for (const evidenceId of criterion.evidence) {
38
+ const evidence = packet.evidence.find((candidate) => candidate.id === evidenceId);
39
+ if (!evidence) {
40
+ lines.push(` - ${evidenceId} [missing]`);
41
+ continue;
42
+ }
43
+ lines.push(` - ${evidence.id} [${evidence.kind}/${evidence.status}]: ${evidence.behavior}`);
44
+ }
45
+ }
46
+ if (packet.implementationLoop) {
47
+ lines.push("", "Implementation loop");
48
+ lines.push(`- strategy: ${packet.implementationLoop.strategy}`);
49
+ for (const cycle of packet.implementationLoop.cycles) {
50
+ lines.push(`- ${cycle.behavior}${cycle.sourceId ? ` (${cycle.sourceId})` : ""}`);
51
+ lines.push(` - RED: ${cycle.redEvidence ?? cycle.noRedReason ?? "missing"}`);
52
+ lines.push(` - GREEN: ${cycle.greenEvidence || "missing"}`);
53
+ if (cycle.refactorEvidence) {
54
+ lines.push(` - REFACTOR: ${cycle.refactorEvidence}`);
55
+ }
56
+ if (cycle.changedFiles && cycle.changedFiles.length > 0) {
57
+ lines.push(` - changed files: ${joinList(cycle.changedFiles)}`);
58
+ }
59
+ }
60
+ }
61
+ if (packet.contractTiers) {
62
+ lines.push("", "Contract tiers");
63
+ lines.push(`- intrinsic engineering: ${joinList(packet.contractTiers.intrinsicEngineering)}`);
64
+ lines.push(`- contextual spec/design/task: ${joinList(packet.contractTiers.contextualSpecDesignTask)}`);
65
+ lines.push(`- workflow governance: ${joinList(packet.contractTiers.workflowGovernance)}`);
66
+ }
67
+ if (packet.mockBoundary) {
68
+ lines.push("", "Mock boundary");
69
+ lines.push(`- mocked: ${joinList(packet.mockBoundary.mocked)}`);
70
+ lines.push(`- real: ${joinList(packet.mockBoundary.real)}`);
71
+ lines.push(`- integration required: ${joinList(packet.mockBoundary.integrationRequired)}`);
72
+ }
73
+ if (assessment.diagnostics.length > 0) {
74
+ lines.push("", "Gaps");
75
+ for (const item of assessment.diagnostics) {
76
+ lines.push(`- ${item.code} [${item.severity}/${item.tier}]: ${item.message}`);
77
+ }
78
+ }
79
+ return lines.join("\n");
80
+ }
81
+ function diagnoseAcceptanceMapping(packet) {
82
+ return packet.acceptanceCriteria.flatMap((criterion) => {
83
+ const referenced = criterion.evidence
84
+ .map((id) => packet.evidence.find((evidence) => evidence.id === id))
85
+ .filter((evidence) => Boolean(evidence));
86
+ const passing = referenced.filter((evidence) => evidence.status === "pass");
87
+ if (passing.length === 0) {
88
+ return [
89
+ diagnostic({
90
+ code: "acceptance-criteria-unmapped",
91
+ severity: "failure",
92
+ tier: "contextual-spec-design-task",
93
+ message: `Acceptance criterion ${criterion.id} has no passing evidence.`,
94
+ evidence: criterion.evidence,
95
+ }),
96
+ ];
97
+ }
98
+ const covering = passing.filter((evidence) => evidence.covers?.includes(criterion.id));
99
+ if (covering.length > 0)
100
+ return [];
101
+ return [
102
+ diagnostic({
103
+ code: "evidence-does-not-cover-criterion",
104
+ severity: "failure",
105
+ tier: "contextual-spec-design-task",
106
+ message: `Acceptance criterion ${criterion.id} references passing evidence that does not explicitly cover it.`,
107
+ evidence: passing.map((evidence) => evidence.id),
108
+ }),
109
+ ];
110
+ });
111
+ }
112
+ function diagnoseImplementationLoop(packet) {
113
+ if (!isMeaningfulBehaviorChange(packet))
114
+ return [];
115
+ const loop = packet.implementationLoop;
116
+ if (!loop || loop.cycles.length === 0) {
117
+ return [
118
+ diagnostic({
119
+ code: "missing-implementation-loop",
120
+ severity: "warning",
121
+ tier: "intrinsic-engineering",
122
+ message: "Meaningful coding changes should record a per-behavior TDD, tracer-bullet, or focused-validation loop.",
123
+ evidence: [],
124
+ }),
125
+ ];
126
+ }
127
+ const diagnostics = [];
128
+ for (const cycle of loop.cycles) {
129
+ if (!cycle.greenEvidence?.trim()) {
130
+ diagnostics.push(diagnostic({
131
+ code: "missing-cycle-green-evidence",
132
+ severity: "failure",
133
+ tier: "intrinsic-engineering",
134
+ message: `Implementation cycle ${cycle.behavior} has no GREEN evidence.`,
135
+ evidence: [cycle.behavior],
136
+ }));
137
+ }
138
+ if (loop.strategy === "tdd" && !cycle.redEvidence?.trim() && !cycle.noRedReason?.trim()) {
139
+ diagnostics.push(diagnostic({
140
+ code: "missing-cycle-red-evidence",
141
+ severity: "warning",
142
+ tier: "intrinsic-engineering",
143
+ message: `TDD cycle ${cycle.behavior} has no RED evidence or explicit no-red reason.`,
144
+ evidence: [cycle.behavior],
145
+ }));
146
+ }
147
+ }
148
+ return diagnostics;
149
+ }
150
+ function diagnoseContractTiers(packet) {
151
+ if (!isMeaningfulBehaviorChange(packet))
152
+ return [];
153
+ if (packet.contractTiers)
154
+ return [];
155
+ return [
156
+ diagnostic({
157
+ code: "missing-contract-tiers",
158
+ severity: "warning",
159
+ tier: "intrinsic-engineering",
160
+ message: "Coding validation packets should mark intrinsic, contextual, and workflow-governance contract tiers.",
161
+ evidence: [],
162
+ }),
163
+ ];
164
+ }
165
+ function diagnoseBugfixRedEvidence(packet) {
166
+ if (packet.change?.kind !== "bugfix")
167
+ return [];
168
+ if (packet.change.noRedReason)
169
+ return [];
170
+ if (packet.evidence.some((evidence) => evidence.red))
171
+ return [];
172
+ return [
173
+ diagnostic({
174
+ code: "missing-red-evidence",
175
+ severity: "warning",
176
+ tier: "intrinsic-engineering",
177
+ message: "Bug fix packet has no red evidence or explicit reason why red-first was not possible.",
178
+ evidence: [],
179
+ }),
180
+ ];
181
+ }
182
+ function diagnoseMockOnlyCriticalPaths(packet) {
183
+ const boundary = packet.mockBoundary;
184
+ if (!boundary || boundary.integrationRequired.length === 0)
185
+ return [];
186
+ const missing = boundary.integrationRequired.filter((requiredPath) => !hasRealWiringEvidenceFor(packet.evidence, requiredPath));
187
+ if (missing.length === 0)
188
+ return [];
189
+ return [
190
+ diagnostic({
191
+ code: "mock-only-critical-path",
192
+ severity: "failure",
193
+ tier: "intrinsic-engineering",
194
+ message: "Critical integration path is represented only by mocked or unit evidence.",
195
+ evidence: missing,
196
+ }),
197
+ ];
198
+ }
199
+ function hasRealWiringEvidenceFor(evidenceList, requiredPath) {
200
+ return evidenceList.some((evidence) => evidence.status === "pass" &&
201
+ REAL_WIRING_EVIDENCE.has(evidence.kind) &&
202
+ evidenceMatchesRequiredPath(evidence, requiredPath));
203
+ }
204
+ function evidenceMatchesRequiredPath(evidence, requiredPath) {
205
+ const required = normalizeEvidenceText(requiredPath);
206
+ const candidates = [
207
+ evidence.id,
208
+ evidence.behavior,
209
+ ...(evidence.covers ?? []),
210
+ ...(evidence.exercises ?? []),
211
+ ].map(normalizeEvidenceText).filter(Boolean);
212
+ return candidates.some((candidate) => candidate === required || candidate.includes(required));
213
+ }
214
+ function diagnoseImplementationAssertions(packet) {
215
+ return packet.evidence
216
+ .filter((evidence) => evidence.assertion === "implementation")
217
+ .map((evidence) => diagnostic({
218
+ code: "implementation-detail-assertion",
219
+ severity: "warning",
220
+ tier: "intrinsic-engineering",
221
+ message: `Evidence ${evidence.id} asserts implementation details instead of observable behavior.`,
222
+ evidence: [evidence.id],
223
+ }));
224
+ }
225
+ function diagnoseMissingNegativeEvidence(packet) {
226
+ if (packet.change?.kind !== "feature" && packet.change?.kind !== "bugfix")
227
+ return [];
228
+ if (packet.evidence.some((evidence) => evidence.negative))
229
+ return [];
230
+ return [
231
+ diagnostic({
232
+ code: "missing-negative-evidence",
233
+ severity: "warning",
234
+ tier: "intrinsic-engineering",
235
+ message: "Feature or bugfix packet has no negative evidence for invalid, failing, or guarded behavior.",
236
+ evidence: [],
237
+ }),
238
+ ];
239
+ }
240
+ function diagnoseQualitySignals(packet) {
241
+ const signals = packet.qualitySignals;
242
+ if (!signals)
243
+ return [];
244
+ return [
245
+ ...qualityListDiagnostic("placeholder-left-in-code", "failure", signals.placeholders),
246
+ ...qualityListDiagnostic("hack-left-in-code", "failure", signals.hacks),
247
+ ...qualityListDiagnostic("style-issue", "warning", signals.styleIssues),
248
+ ...qualityListDiagnostic("type-issue", "warning", signals.typeIssues),
249
+ ...qualityListDiagnostic("error-handling-gap", "warning", signals.errorHandlingGaps),
250
+ ...qualityListDiagnostic("scope-violation", "failure", signals.scopeViolations),
251
+ ...qualityListDiagnostic("contract-violation", "failure", signals.contractViolations),
252
+ ...(signals.broadRefactor
253
+ ? [
254
+ diagnostic({
255
+ code: "broad-refactor-without-validation",
256
+ severity: "warning",
257
+ tier: "intrinsic-engineering",
258
+ message: "Packet reports broad refactor risk; require focused validation evidence before trusting green tests.",
259
+ evidence: [],
260
+ }),
261
+ ]
262
+ : []),
263
+ ];
264
+ }
265
+ function qualityListDiagnostic(code, severity, values) {
266
+ if (!values || values.length === 0)
267
+ return [];
268
+ return [
269
+ diagnostic({
270
+ code,
271
+ severity,
272
+ tier: "intrinsic-engineering",
273
+ message: `${code} detected in validation packet.`,
274
+ evidence: values,
275
+ }),
276
+ ];
277
+ }
278
+ function diagnostic(d) {
279
+ return d;
280
+ }
281
+ function assessmentStatus(diagnostics) {
282
+ if (diagnostics.some((diagnostic) => diagnostic.severity === "failure"))
283
+ return "untrusted";
284
+ if (diagnostics.length > 0)
285
+ return "warning";
286
+ return "trusted";
287
+ }
288
+ function scoreDiagnostics(diagnostics) {
289
+ const penalty = diagnostics.reduce((total, diagnostic) => {
290
+ return total + (diagnostic.severity === "failure" ? 35 : 15);
291
+ }, 0);
292
+ return Math.max(0, TARGET_SCORE - penalty);
293
+ }
294
+ function confidenceFor(status, score) {
295
+ if (status === "untrusted" || score < 70)
296
+ return "low";
297
+ if (status === "warning" || score < 90)
298
+ return "medium";
299
+ return "high";
300
+ }
301
+ function nextActionsFor(diagnostics) {
302
+ return Array.from(new Set(diagnostics.map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`)));
303
+ }
304
+ function isMeaningfulBehaviorChange(packet) {
305
+ return packet.change?.kind === "feature" || packet.change?.kind === "bugfix";
306
+ }
307
+ function normalizeEvidenceText(value) {
308
+ return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, " ").replace(/\s+/g, " ").trim();
309
+ }
310
+ function joinList(values) {
311
+ return values.length > 0 ? values.join(", ") : "none";
312
+ }
313
+ //# sourceMappingURL=validation-packet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-packet.js","sourceRoot":"","sources":["../../src/core/validation-packet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { ProjectConfig } from "./config.js";
2
+ export type WorkEvent = {
3
+ event?: string;
4
+ version?: number;
5
+ occurredAt?: string;
6
+ producer?: {
7
+ skill?: string;
8
+ stage?: string;
9
+ };
10
+ workItem?: {
11
+ id?: string;
12
+ type?: string;
13
+ title?: string;
14
+ project?: string | {
15
+ id?: string;
16
+ name?: string;
17
+ };
18
+ module?: string | {
19
+ id?: string;
20
+ name?: string;
21
+ };
22
+ stage?: string;
23
+ status?: string;
24
+ sourceArtifacts?: unknown[];
25
+ externalRefs?: Record<string, unknown>;
26
+ [key: string]: unknown;
27
+ };
28
+ assignment?: Record<string, unknown>;
29
+ status?: {
30
+ from?: string;
31
+ to?: string;
32
+ [key: string]: unknown;
33
+ };
34
+ links?: Record<string, unknown>;
35
+ evidence?: Record<string, unknown>;
36
+ [key: string]: unknown;
37
+ };
38
+ export declare function resolveWorkLedgerPath(target: string, config: ProjectConfig): Promise<{
39
+ workConfigPath: string;
40
+ ledgerPath: string;
41
+ }>;
42
+ export declare function readWorkEvents(path: string): Promise<WorkEvent[]>;
43
+ export declare function appendWorkEvents(path: string, events: WorkEvent[]): Promise<void>;
44
+ export declare function latestWorkItem(events: WorkEvent[], localId: string): NonNullable<WorkEvent["workItem"]> | undefined;
@@ -0,0 +1,88 @@
1
+ import { access, appendFile, mkdir, readFile } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import YAML from "yaml";
4
+ import { isPathInside, resolveProjectPath } from "./workspace-conformance.js";
5
+ export async function resolveWorkLedgerPath(target, config) {
6
+ const workConfigPath = resolveInsideProject(target, config.customize?.work ?? ".zsk/work.yaml");
7
+ let ledgerRel = ".zsk/work.jsonl";
8
+ try {
9
+ const raw = await readFile(workConfigPath, "utf8");
10
+ const parsed = YAML.parse(raw);
11
+ if (isRecord(parsed)) {
12
+ const workConfig = parsed;
13
+ ledgerRel = workConfig.ledger?.path ?? ledgerRel;
14
+ }
15
+ }
16
+ catch {
17
+ ledgerRel = ".zsk/work.jsonl";
18
+ }
19
+ return {
20
+ workConfigPath,
21
+ ledgerPath: resolveInsideProject(target, ledgerRel),
22
+ };
23
+ }
24
+ export async function readWorkEvents(path) {
25
+ try {
26
+ await access(path);
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ const raw = await readFile(path, "utf8");
32
+ const events = [];
33
+ for (const [index, line] of raw.split(/\r?\n/).entries()) {
34
+ const trimmed = line.trim();
35
+ if (!trimmed)
36
+ continue;
37
+ try {
38
+ const parsed = JSON.parse(trimmed);
39
+ if (isRecord(parsed)) {
40
+ events.push(parsed);
41
+ continue;
42
+ }
43
+ events.push(invalidWorkEvent(index + 1, "Invalid work event"));
44
+ }
45
+ catch {
46
+ events.push(invalidWorkEvent(index + 1, "Invalid JSONL event"));
47
+ }
48
+ }
49
+ return events;
50
+ }
51
+ export async function appendWorkEvents(path, events) {
52
+ await mkdir(dirname(path), { recursive: true });
53
+ await appendFile(path, events.map((event) => JSON.stringify(event)).join("\n") + "\n", "utf8");
54
+ }
55
+ export function latestWorkItem(events, localId) {
56
+ for (const event of [...events].reverse()) {
57
+ if (event.workItem?.id === localId)
58
+ return event.workItem;
59
+ }
60
+ return undefined;
61
+ }
62
+ function invalidWorkEvent(line, title) {
63
+ return {
64
+ event: "invalid",
65
+ producer: { skill: "work", stage: "sync" },
66
+ workItem: {
67
+ id: `line-${line}`,
68
+ type: "invalid",
69
+ title,
70
+ project: "unknown",
71
+ module: "unknown",
72
+ stage: "sync",
73
+ status: "blocked",
74
+ sourceArtifacts: [],
75
+ },
76
+ };
77
+ }
78
+ function resolveInsideProject(root, value) {
79
+ const resolved = resolveProjectPath(root, value);
80
+ if (!isPathInside(resolve(root), resolved)) {
81
+ throw new Error(`work ledger path must stay inside the project: ${value}`);
82
+ }
83
+ return resolved;
84
+ }
85
+ function isRecord(value) {
86
+ return typeof value === "object" && value !== null && !Array.isArray(value);
87
+ }
88
+ //# sourceMappingURL=work-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-ledger.js","sourceRoot":"","sources":["../../src/core/work-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAuC9E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,MAAqB;IAErB,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,gBAAgB,CAAC,CAAC;IAChG,IAAI,SAAS,GAAG,iBAAiB,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,MAA0B,CAAC;YAC9C,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,iBAAiB,CAAC;IAChC,CAAC;IACD,OAAO;QACL,cAAc;QACd,UAAU,EAAE,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;YAC9C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,MAAmB,CAAC,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAmB;IACtE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAmB,EAAE,OAAe;IACjE,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;IAC5D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAa;IACnD,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1C,QAAQ,EAAE;YACR,EAAE,EAAE,QAAQ,IAAI,EAAE;YAClB,IAAI,EAAE,SAAS;YACf,KAAK;YACL,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,EAAE;SACpB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,KAAa;IACvD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,kDAAkD,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,110 @@
1
+ import type { WorkEvent } from "./work-ledger.js";
2
+ export type WorkProviderConfig = {
3
+ adapter?: string;
4
+ mode?: string;
5
+ workspace?: string;
6
+ expertCatalog?: {
7
+ path?: string;
8
+ };
9
+ commandPlan?: {
10
+ executable?: string;
11
+ mode?: string;
12
+ };
13
+ projectMapping?: {
14
+ strategy?: string;
15
+ projects?: Record<string, string | undefined>;
16
+ };
17
+ statusMapping?: Record<string, string | undefined>;
18
+ assignment?: Record<string, unknown>;
19
+ };
20
+ export type WorkSyncPlanItem = {
21
+ line: number;
22
+ event: string;
23
+ action: string;
24
+ localId: string | null;
25
+ project: string | null;
26
+ module: string | null;
27
+ stage: string | null;
28
+ localStatus: string | null;
29
+ providerStatus: string | null;
30
+ remoteRef: unknown;
31
+ remoteReady: boolean;
32
+ blockedReasons: string[];
33
+ };
34
+ export type WorkProviderCommand = {
35
+ line: number;
36
+ action: string;
37
+ operation: string;
38
+ executable: string;
39
+ argv: string[];
40
+ display: string;
41
+ metadata: Record<string, unknown>;
42
+ dryRun: true;
43
+ remoteSideEffects: "none";
44
+ ready: boolean;
45
+ blockedReasons: string[];
46
+ notes: string[];
47
+ };
48
+ export type WorkProviderCommandPlan = {
49
+ mode: "dry-run";
50
+ adapter: string | null;
51
+ executable: string;
52
+ commandCount: number;
53
+ blockedCount: number;
54
+ commands: WorkProviderCommand[];
55
+ };
56
+ export type WorkAssignmentCommandInput = {
57
+ workItem: {
58
+ id: string;
59
+ project: string | null;
60
+ module: string | null;
61
+ stage: string | null;
62
+ };
63
+ assignment: {
64
+ mode: "agent" | "squad" | "role";
65
+ role: string;
66
+ agent: string | null;
67
+ squad: string | null;
68
+ providerAgent: string | null;
69
+ rationale: string;
70
+ };
71
+ };
72
+ export type WorkProviderExecutableInput = {
73
+ provider: string;
74
+ providerConfig: WorkProviderConfig;
75
+ };
76
+ export type WorkProviderItemCommandInput = WorkProviderExecutableInput & {
77
+ item: WorkSyncPlanItem;
78
+ event: WorkEvent | undefined;
79
+ providerConfigured: boolean;
80
+ executable: string;
81
+ };
82
+ export type WorkProviderAssignmentCommandInput = WorkProviderExecutableInput & {
83
+ providerConfigured: boolean;
84
+ workItem: WorkAssignmentCommandInput["workItem"];
85
+ assignment: WorkAssignmentCommandInput["assignment"];
86
+ executable: string;
87
+ };
88
+ export type WorkProviderAdapter = {
89
+ id: string;
90
+ defaultExecutable: (input: WorkProviderExecutableInput) => string;
91
+ buildItemCommand: (input: WorkProviderItemCommandInput) => WorkProviderCommand;
92
+ buildAssignmentCommand: (input: WorkProviderAssignmentCommandInput) => WorkProviderCommand;
93
+ };
94
+ export declare const workProviderAdapters: Record<string, WorkProviderAdapter>;
95
+ export declare function buildProviderCommandPlan(input: {
96
+ provider: string;
97
+ providerConfig: WorkProviderConfig;
98
+ providerConfigured: boolean;
99
+ items: WorkSyncPlanItem[];
100
+ events: WorkEvent[];
101
+ }): WorkProviderCommandPlan;
102
+ export declare function buildAssignmentProviderCommandPlan(input: {
103
+ provider: string;
104
+ providerConfig: WorkProviderConfig;
105
+ providerConfigured: boolean;
106
+ workItem: WorkAssignmentCommandInput["workItem"];
107
+ assignment: WorkAssignmentCommandInput["assignment"];
108
+ }): WorkProviderCommandPlan;
109
+ export declare function assignmentProviderRef(assignment: Record<string, unknown>, provider: string): string | null;
110
+ export declare function commandDisplayWithMetadata(command: WorkProviderCommand): string;