@ngocsangairvds/vsaf 4.0.16 → 4.1.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.
Files changed (111) hide show
  1. package/package.json +5 -3
  2. package/packages/cli/dist/commands/doctor.js +1 -1
  3. package/packages/cli/dist/commands/doctor.js.map +1 -1
  4. package/packages/cli/dist/commands/init.d.ts.map +1 -1
  5. package/packages/cli/dist/commands/init.js +37 -7
  6. package/packages/cli/dist/commands/init.js.map +1 -1
  7. package/packages/cli/dist/commands/list.js +8 -1
  8. package/packages/cli/dist/commands/list.js.map +1 -1
  9. package/packages/cli/dist/commands/run.d.ts.map +1 -1
  10. package/packages/cli/dist/commands/run.js +17 -4
  11. package/packages/cli/dist/commands/run.js.map +1 -1
  12. package/packages/cli/dist/commands/skill.d.ts.map +1 -1
  13. package/packages/cli/dist/commands/skill.js +14 -2
  14. package/packages/cli/dist/commands/skill.js.map +1 -1
  15. package/packages/cli/dist/mcp/server.d.ts +22 -0
  16. package/packages/cli/dist/mcp/server.d.ts.map +1 -1
  17. package/packages/cli/dist/mcp/server.js +311 -20
  18. package/packages/cli/dist/mcp/server.js.map +1 -1
  19. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  20. package/packages/cli/dist/server/routes/runs.js +7 -1
  21. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  22. package/packages/cli/dist/server/routes/workflows.d.ts.map +1 -1
  23. package/packages/cli/dist/server/routes/workflows.js +3 -0
  24. package/packages/cli/dist/server/routes/workflows.js.map +1 -1
  25. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  26. package/packages/cli/dist/server/services/execution-manager.js +68 -41
  27. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  28. package/packages/cli/dist/server/services/sse-manager.d.ts.map +1 -1
  29. package/packages/cli/dist/server/services/sse-manager.js +7 -2
  30. package/packages/cli/dist/server/services/sse-manager.js.map +1 -1
  31. package/packages/core/dist/commands/command-loader.d.ts.map +1 -1
  32. package/packages/core/dist/commands/command-loader.js +3 -0
  33. package/packages/core/dist/commands/command-loader.js.map +1 -1
  34. package/packages/core/dist/engine/condition-evaluator.js +3 -2
  35. package/packages/core/dist/engine/condition-evaluator.js.map +1 -1
  36. package/packages/core/dist/engine/dag-executor.d.ts +29 -1
  37. package/packages/core/dist/engine/dag-executor.d.ts.map +1 -1
  38. package/packages/core/dist/engine/dag-executor.js +279 -130
  39. package/packages/core/dist/engine/dag-executor.js.map +1 -1
  40. package/packages/core/dist/engine/dag-parser.d.ts.map +1 -1
  41. package/packages/core/dist/engine/dag-parser.js +3 -0
  42. package/packages/core/dist/engine/dag-parser.js.map +1 -1
  43. package/packages/core/dist/engine/node-runner.d.ts +1 -0
  44. package/packages/core/dist/engine/node-runner.d.ts.map +1 -1
  45. package/packages/core/dist/engine/node-runner.js +14 -2
  46. package/packages/core/dist/engine/node-runner.js.map +1 -1
  47. package/packages/core/dist/engine/variable-resolver.d.ts +1 -1
  48. package/packages/core/dist/engine/variable-resolver.d.ts.map +1 -1
  49. package/packages/core/dist/engine/variable-resolver.js +21 -11
  50. package/packages/core/dist/engine/variable-resolver.js.map +1 -1
  51. package/packages/core/dist/index.d.ts +5 -1
  52. package/packages/core/dist/index.d.ts.map +1 -1
  53. package/packages/core/dist/index.js +13 -3
  54. package/packages/core/dist/index.js.map +1 -1
  55. package/packages/core/dist/isolation/artifact-store.d.ts.map +1 -1
  56. package/packages/core/dist/isolation/artifact-store.js +30 -5
  57. package/packages/core/dist/isolation/artifact-store.js.map +1 -1
  58. package/packages/core/dist/isolation/workspace-manager.d.ts +2 -0
  59. package/packages/core/dist/isolation/workspace-manager.d.ts.map +1 -1
  60. package/packages/core/dist/isolation/workspace-manager.js +81 -7
  61. package/packages/core/dist/isolation/workspace-manager.js.map +1 -1
  62. package/packages/core/dist/schema/workflow-schema.d.ts +13 -0
  63. package/packages/core/dist/schema/workflow-schema.d.ts.map +1 -1
  64. package/packages/core/dist/schema/workflow-schema.js +6 -3
  65. package/packages/core/dist/schema/workflow-schema.js.map +1 -1
  66. package/packages/core/dist/skills/skill-loader.d.ts.map +1 -1
  67. package/packages/core/dist/skills/skill-loader.js +7 -0
  68. package/packages/core/dist/skills/skill-loader.js.map +1 -1
  69. package/packages/core/dist/store/atomic.d.ts +11 -0
  70. package/packages/core/dist/store/atomic.d.ts.map +1 -0
  71. package/packages/core/dist/store/atomic.js +51 -0
  72. package/packages/core/dist/store/atomic.js.map +1 -0
  73. package/packages/core/dist/store/recovery.d.ts +3 -0
  74. package/packages/core/dist/store/recovery.d.ts.map +1 -0
  75. package/packages/core/dist/store/recovery.js +206 -0
  76. package/packages/core/dist/store/recovery.js.map +1 -0
  77. package/packages/core/dist/store/run-lock.d.ts +9 -0
  78. package/packages/core/dist/store/run-lock.d.ts.map +1 -0
  79. package/packages/core/dist/store/run-lock.js +62 -0
  80. package/packages/core/dist/store/run-lock.js.map +1 -0
  81. package/packages/core/dist/store/run-store.d.ts +20 -7
  82. package/packages/core/dist/store/run-store.d.ts.map +1 -1
  83. package/packages/core/dist/store/run-store.js +175 -34
  84. package/packages/core/dist/store/run-store.js.map +1 -1
  85. package/packages/core/dist/store/snapshot.d.ts +4 -0
  86. package/packages/core/dist/store/snapshot.d.ts.map +1 -0
  87. package/packages/core/dist/store/snapshot.js +59 -0
  88. package/packages/core/dist/store/snapshot.js.map +1 -0
  89. package/packages/core/dist/store/types.d.ts +89 -4
  90. package/packages/core/dist/store/types.d.ts.map +1 -1
  91. package/packages/core/dist/store/types.js +14 -0
  92. package/packages/core/dist/store/types.js.map +1 -1
  93. package/packages/core/dist/store/wal.d.ts +39 -0
  94. package/packages/core/dist/store/wal.d.ts.map +1 -0
  95. package/packages/core/dist/store/wal.js +203 -0
  96. package/packages/core/dist/store/wal.js.map +1 -0
  97. package/packages/core/dist/types/dag.d.ts +3 -0
  98. package/packages/core/dist/types/dag.d.ts.map +1 -1
  99. package/packages/core/dist/types/workflow.d.ts +6 -3
  100. package/packages/core/dist/types/workflow.d.ts.map +1 -1
  101. package/skills/sdlc/workflows/hotfix-tdd.yaml +3 -0
  102. package/skills/sdlc/workflows/master-sdlc.yaml +10 -0
  103. package/skills/sdlc/workflows/onboarding.yaml +2 -0
  104. package/skills/sdlc/workflows/sdlc-build.yaml +2 -0
  105. package/skills/sdlc/workflows/sdlc-design.yaml +2 -0
  106. package/skills/sdlc/workflows/sdlc-qa.yaml +3 -0
  107. package/skills/sdlc/workflows/sdlc-testcase.yaml +1 -0
  108. package/packages/core/dist/store/event-log.d.ts +0 -8
  109. package/packages/core/dist/store/event-log.d.ts.map +0 -1
  110. package/packages/core/dist/store/event-log.js +0 -30
  111. package/packages/core/dist/store/event-log.js.map +0 -1
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WAL = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const atomic_js_1 = require("./atomic.js");
7
+ const types_js_1 = require("./types.js");
8
+ const OUTPUT_THRESHOLD = 4096;
9
+ class WAL {
10
+ walPath;
11
+ runDir;
12
+ seq;
13
+ outputDirCreated = false;
14
+ cachedContent = null;
15
+ constructor(runDir) {
16
+ this.runDir = runDir;
17
+ this.walPath = (0, path_1.join)(runDir, 'wal.jsonl');
18
+ (0, fs_1.mkdirSync)(runDir, { recursive: true });
19
+ this.seq = this.loadLastSeq();
20
+ }
21
+ get currentSeq() {
22
+ return this.seq;
23
+ }
24
+ append(partial) {
25
+ const nextSeq = this.seq + 1;
26
+ const event = {
27
+ seq: nextSeq,
28
+ ts: new Date().toISOString(),
29
+ ...partial,
30
+ };
31
+ const line = JSON.stringify(event) + '\n';
32
+ try {
33
+ (0, fs_1.appendFileSync)(this.walPath, line, { encoding: 'utf-8', mode: 0o600 });
34
+ }
35
+ catch (err) {
36
+ const e = err;
37
+ if (e.code === 'ENOSPC') {
38
+ throw new types_js_1.StorageError('Disk full — cannot append WAL', 'DISK_FULL', this.walPath, e);
39
+ }
40
+ throw e;
41
+ }
42
+ this.cachedContent = null; // Invalidate cache — file content changed
43
+ this.seq = nextSeq;
44
+ return event;
45
+ }
46
+ ensureOutputDir() {
47
+ if (!this.outputDirCreated) {
48
+ (0, fs_1.mkdirSync)((0, path_1.join)(this.runDir, 'outputs'), { recursive: true });
49
+ this.outputDirCreated = true;
50
+ }
51
+ }
52
+ readWALContent() {
53
+ if (!(0, fs_1.existsSync)(this.walPath))
54
+ return null;
55
+ const content = (0, atomic_js_1.safeReadSync)(this.walPath);
56
+ if (content instanceof types_js_1.StorageError)
57
+ return null;
58
+ return content;
59
+ }
60
+ replay(afterSeq = 0) {
61
+ const content = this.cachedContent ?? this.readWALContent();
62
+ this.cachedContent = null; // Free after use
63
+ if (!content)
64
+ return [];
65
+ const events = [];
66
+ for (const line of content.split('\n')) {
67
+ if (!line.trim())
68
+ continue;
69
+ try {
70
+ const event = JSON.parse(line);
71
+ if (event.seq > afterSeq) {
72
+ events.push(event);
73
+ }
74
+ }
75
+ catch {
76
+ // Skip corrupt lines (spec: replay partial)
77
+ continue;
78
+ }
79
+ }
80
+ return events;
81
+ }
82
+ persistOutput(nodeId, output) {
83
+ if (output.length <= OUTPUT_THRESHOLD)
84
+ return output;
85
+ const refPath = `outputs/${nodeId}.txt`;
86
+ this.ensureOutputDir();
87
+ (0, atomic_js_1.atomicWriteSync)((0, path_1.join)(this.runDir, refPath), output);
88
+ return { __vsaf_ref: refPath };
89
+ }
90
+ persistStructuredOutput(nodeId, data) {
91
+ const json = JSON.stringify(data);
92
+ if (json.length <= OUTPUT_THRESHOLD)
93
+ return data;
94
+ const refPath = `outputs/${nodeId}.json`;
95
+ this.ensureOutputDir();
96
+ (0, atomic_js_1.atomicWriteSync)((0, path_1.join)(this.runDir, refPath), json);
97
+ return { __vsaf_ref: refPath };
98
+ }
99
+ getOutputRef(nodeId, output) {
100
+ if (output.length <= OUTPUT_THRESHOLD)
101
+ return output;
102
+ return { __vsaf_ref: `outputs/${nodeId}.txt` };
103
+ }
104
+ getStructuredOutputRef(nodeId, data) {
105
+ const json = JSON.stringify(data);
106
+ if (json.length <= OUTPUT_THRESHOLD)
107
+ return data;
108
+ return { __vsaf_ref: `outputs/${nodeId}.json` };
109
+ }
110
+ resolveOutput(stored) {
111
+ if (typeof stored === 'string')
112
+ return stored;
113
+ const refPath = '__vsaf_ref' in stored ? stored.__vsaf_ref : stored.ref;
114
+ const content = (0, atomic_js_1.safeReadSync)((0, path_1.join)(this.runDir, refPath));
115
+ if (content instanceof types_js_1.StorageError) {
116
+ console.error(`[WAL] Warning: output file missing: ${refPath}`);
117
+ return '';
118
+ }
119
+ return content;
120
+ }
121
+ resolveStructuredOutput(stored) {
122
+ // Check for new sentinel first
123
+ if ('__vsaf_ref' in stored) {
124
+ const refPath = stored.__vsaf_ref;
125
+ const content = (0, atomic_js_1.safeReadSync)((0, path_1.join)(this.runDir, refPath));
126
+ if (content instanceof types_js_1.StorageError) {
127
+ console.error(`[WAL] Warning: structured output file missing: ${refPath}`);
128
+ return {};
129
+ }
130
+ try {
131
+ return JSON.parse(content);
132
+ }
133
+ catch {
134
+ console.error(`[WAL] Warning: corrupted structured output: ${refPath}`);
135
+ return {};
136
+ }
137
+ }
138
+ // Legacy sentinel: { ref: string } with exactly one key
139
+ if ('ref' in stored && typeof stored.ref === 'string' && Object.keys(stored).length === 1) {
140
+ const refPath = stored.ref;
141
+ if (!refPath.startsWith('outputs/')) {
142
+ return stored;
143
+ }
144
+ const content = (0, atomic_js_1.safeReadSync)((0, path_1.join)(this.runDir, refPath));
145
+ if (content instanceof types_js_1.StorageError) {
146
+ console.error(`[WAL] Warning: structured output file missing: ${refPath}`);
147
+ return {};
148
+ }
149
+ try {
150
+ return JSON.parse(content);
151
+ }
152
+ catch {
153
+ console.error(`[WAL] Warning: corrupted structured output: ${refPath}`);
154
+ return {};
155
+ }
156
+ }
157
+ return stored;
158
+ }
159
+ loadLastSeq() {
160
+ const content = this.readWALContent();
161
+ if (!content)
162
+ return 0;
163
+ this.cachedContent = content; // Cache for subsequent replay()
164
+ const lines = content.trim().split('\n').filter(Boolean);
165
+ if (lines.length === 0)
166
+ return 0;
167
+ // Read last valid line
168
+ for (let i = lines.length - 1; i >= 0; i--) {
169
+ try {
170
+ const event = JSON.parse(lines[i]);
171
+ return event.seq;
172
+ }
173
+ catch {
174
+ continue;
175
+ }
176
+ }
177
+ return 0;
178
+ }
179
+ static hasTerminalAfter(runDir, afterSeq) {
180
+ const walPath = (0, path_1.join)(runDir, 'wal.jsonl');
181
+ if (!(0, fs_1.existsSync)(walPath))
182
+ return false;
183
+ const content = (0, atomic_js_1.safeReadSync)(walPath);
184
+ if (content instanceof types_js_1.StorageError)
185
+ return false;
186
+ for (const line of content.split('\n')) {
187
+ if (!line.trim())
188
+ continue;
189
+ try {
190
+ const event = JSON.parse(line);
191
+ if (event.seq > afterSeq && (event.type === 'run:complete' || event.type === 'run:fail')) {
192
+ return true;
193
+ }
194
+ }
195
+ catch {
196
+ continue;
197
+ }
198
+ }
199
+ return false;
200
+ }
201
+ }
202
+ exports.WAL = WAL;
203
+ //# sourceMappingURL=wal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wal.js","sourceRoot":"","sources":["../../src/store/wal.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { ErrorStrategy, OutputFormat, InputParamDef } from './workflow.js';
2
2
  export type NodeStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
3
3
  export interface DAGNode {
4
4
  id: string;
5
+ description?: string;
5
6
  type: 'prompt' | 'bash' | 'command';
6
7
  content: string;
7
8
  dependsOn: string[];
@@ -17,7 +18,9 @@ export interface DAGNode {
17
18
  structuredOutput?: Record<string, unknown>;
18
19
  durationMs?: number;
19
20
  error?: string;
21
+ idempotent: boolean;
20
22
  errorStrategy: ErrorStrategy;
23
+ timeout?: number;
21
24
  loop?: {
22
25
  onFail: string;
23
26
  maxRetries: number;
@@ -1 +1 @@
1
- {"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../../src/types/dag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,aAAa,GAAG,aAAa,CAAC;IAC3C,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B"}
1
+ {"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../../src/types/dag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,aAAa,GAAG,aAAa,CAAC;IAC3C,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B"}
@@ -22,6 +22,7 @@ export interface LoopConfig {
22
22
  }
23
23
  export interface NodeDefinition {
24
24
  id: string;
25
+ description?: string;
25
26
  prompt?: string;
26
27
  bash?: string;
27
28
  command?: string;
@@ -35,12 +36,14 @@ export interface NodeDefinition {
35
36
  workspace?: boolean;
36
37
  loop?: LoopConfig;
37
38
  on_error?: ErrorStrategy;
39
+ idempotent?: boolean;
40
+ timeout?: number;
38
41
  }
39
42
  export interface WorkflowDefinition {
40
43
  name: string;
41
- description: string;
42
- provider: string;
43
- model: string;
44
+ description?: string;
45
+ provider?: string;
46
+ model?: string;
44
47
  inputs?: Record<string, InputParamDef>;
45
48
  nodes: NodeDefinition[];
46
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/types/workflow.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,UAAU,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/types/workflow.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,UAAU,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB"}
@@ -3,14 +3,17 @@ description: "Sub-flow: TDD RED → GREEN → Test Gate — write failing test,
3
3
 
4
4
  nodes:
5
5
  - id: red
6
+ description: "RED: write failing test that reproduces the bug"
6
7
  command: sdlc-hotfix-red
7
8
  depends_on: []
8
9
 
9
10
  - id: green
11
+ description: "GREEN: implement minimal fix to make the test pass"
10
12
  command: sdlc-hotfix-green
11
13
  depends_on: [red]
12
14
 
13
15
  - id: test-gate
16
+ description: "Test Gate: run full test suite to verify fix and catch regressions"
14
17
  bash: |
15
18
  cd $WORKSPACE && npm test 2>&1
16
19
  depends_on: [green]
@@ -2,28 +2,35 @@ name: master-sdlc
2
2
  description: "Full SDLC pipeline — Discovery → PRD → Architecture → SRS → Test Design → Implement → Review → Feature Complete → Ship"
3
3
  nodes:
4
4
  - id: discovery
5
+ description: "Phase 1 — Discovery: analyze requirements, grill stakeholders, brainstorm solutions"
5
6
  command: sdlc-discovery
6
7
  workspace: false
7
8
  - id: prd
9
+ description: "Phase 2 — PRD: write Product Requirements Document from discovery output"
8
10
  command: sdlc-prd
9
11
  depends_on: [discovery]
10
12
  workspace: false
11
13
  - id: architecture
14
+ description: "Phase 3 — Architecture: design solution architecture and write ADR + epic breakdown"
12
15
  command: sdlc-architecture
13
16
  depends_on: [prd]
14
17
  workspace: false
15
18
  - id: srs
19
+ description: "Phase 4 — SRS: write Software Requirements Specification with API contracts"
16
20
  command: sdlc-srs
17
21
  depends_on: [architecture]
18
22
  workspace: false
19
23
  - id: test-design
24
+ description: "Phase 5 — Test Design: generate test cases from SRS (tests before code)"
20
25
  command: sdlc-test-design
21
26
  depends_on: [srs]
22
27
  workspace: false
23
28
  - id: implement
29
+ description: "Phase 6 — Implement: TDD implementation per vertical slice"
24
30
  command: sdlc-implement
25
31
  depends_on: [test-design]
26
32
  - id: test-gate
33
+ description: "Phase 6b — Test Gate: run automated tests to verify implementation"
27
34
  bash: |
28
35
  cd $WORKSPACE && npm test 2>&1
29
36
  depends_on: [implement]
@@ -32,14 +39,17 @@ nodes:
32
39
  max_retries: 3
33
40
  inject_error: true
34
41
  - id: review
42
+ description: "Phase 7 — Review: code review against SRS, architecture, and best practices"
35
43
  command: sdlc-review
36
44
  depends_on: [test-gate]
37
45
  workspace: false
38
46
  - id: complete
47
+ description: "Phase 8 — Feature Complete: update knowledge base and project documentation"
39
48
  command: sdlc-feature-complete
40
49
  depends_on: [review]
41
50
  workspace: false
42
51
  - id: ship
52
+ description: "Phase 9 — Ship: create PR, final checks, deploy"
43
53
  command: sdlc-ship
44
54
  depends_on: [complete]
45
55
  workspace: false
@@ -2,8 +2,10 @@ name: onboarding
2
2
  description: "Utility — Onboarding: docs graph + code graph + env setup (not part of main flow)"
3
3
  nodes:
4
4
  - id: docs
5
+ description: "Onboard Docs: build documentation knowledge graph"
5
6
  command: sdlc-onboard-docs
6
7
  workspace: false
7
8
  - id: code
9
+ description: "Onboard Code: analyze codebase structure and conventions"
8
10
  command: sdlc-onboard-code
9
11
  workspace: false
@@ -3,10 +3,12 @@ description: "Sub-flow: Implement → Test Gate — TDD code + automated test ve
3
3
 
4
4
  nodes:
5
5
  - id: implement
6
+ description: "Implement: TDD implementation per vertical slice"
6
7
  command: sdlc-implement
7
8
  depends_on: []
8
9
 
9
10
  - id: test-gate
11
+ description: "Test Gate: run automated tests to verify implementation"
10
12
  bash: |
11
13
  cd $WORKSPACE && npm test 2>&1
12
14
  depends_on: [implement]
@@ -3,10 +3,12 @@ description: "Sub-flow: Architecture → SRS — design solution and write detai
3
3
 
4
4
  nodes:
5
5
  - id: architecture
6
+ description: "Architecture: design solution architecture and write ADR + epic breakdown"
6
7
  command: sdlc-architecture
7
8
  workspace: false
8
9
 
9
10
  - id: srs
11
+ description: "SRS: write Software Requirements Specification with API contracts"
10
12
  command: sdlc-srs
11
13
  depends_on: [architecture]
12
14
  workspace: false
@@ -3,15 +3,18 @@ description: "Sub-flow: Review → Feature Complete → Ship — quality gate +
3
3
 
4
4
  nodes:
5
5
  - id: review
6
+ description: "Review: code review against SRS, architecture, and best practices"
6
7
  command: sdlc-review
7
8
  workspace: false
8
9
 
9
10
  - id: complete
11
+ description: "Feature Complete: update knowledge base and project documentation"
10
12
  command: sdlc-feature-complete
11
13
  depends_on: [review]
12
14
  workspace: false
13
15
 
14
16
  - id: ship
17
+ description: "Ship: create PR, final checks, deploy"
15
18
  command: sdlc-ship
16
19
  depends_on: [complete]
17
20
  workspace: false
@@ -3,5 +3,6 @@ description: "Sub-flow: Test Design — generate test cases from SRS (tests befo
3
3
 
4
4
  nodes:
5
5
  - id: test-design
6
+ description: "Test Design: generate test cases from SRS (tests before code)"
6
7
  command: sdlc-test-design
7
8
  workspace: false
@@ -1,8 +0,0 @@
1
- import type { WorkflowEvent } from './types.js';
2
- export declare class EventLog {
3
- private readonly filePath;
4
- constructor(runDir: string);
5
- append(event: Omit<WorkflowEvent, 'timestamp'>): void;
6
- readAll(): WorkflowEvent[];
7
- }
8
- //# sourceMappingURL=event-log.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-log.d.ts","sourceRoot":"","sources":["../../src/store/event-log.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,MAAM,EAAE,MAAM;IAI1B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG,IAAI;IAQrD,OAAO,IAAI,aAAa,EAAE;CAQ3B"}
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventLog = void 0;
4
- const fs_1 = require("fs");
5
- const path_1 = require("path");
6
- class EventLog {
7
- filePath;
8
- constructor(runDir) {
9
- this.filePath = (0, path_1.join)(runDir, 'events.jsonl');
10
- }
11
- append(event) {
12
- const entry = {
13
- timestamp: new Date().toISOString(),
14
- ...event,
15
- };
16
- (0, fs_1.appendFileSync)(this.filePath, JSON.stringify(entry) + '\n', 'utf-8');
17
- }
18
- readAll() {
19
- if (!(0, fs_1.existsSync)(this.filePath))
20
- return [];
21
- const content = (0, fs_1.readFileSync)(this.filePath, 'utf-8').trim();
22
- if (!content)
23
- return [];
24
- return content
25
- .split('\n')
26
- .map(line => JSON.parse(line));
27
- }
28
- }
29
- exports.EventLog = EventLog;
30
- //# sourceMappingURL=event-log.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../src/store/event-log.ts"],"names":[],"mappings":";;;AAAA,2BAA8D;AAC9D,+BAA4B;AAG5B,MAAa,QAAQ;IACF,QAAQ,CAAS;IAElC,YAAY,MAAc;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,KAAuC;QAC5C,MAAM,KAAK,GAAkB;YAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,GAAG,KAAK;SACT,CAAC;QACF,IAAA,mBAAc,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO;aACX,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC,CAAC;IACpD,CAAC;CACF;AAvBD,4BAuBC"}