@mytechtoday/augment-sdd 1.0.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 (60) hide show
  1. package/.eslintrc.json +20 -0
  2. package/out/commands/executeBeadsBatch.js +165 -0
  3. package/out/commands/executeBeadsBatch.js.map +1 -0
  4. package/out/commands/fullPipeline.js +129 -0
  5. package/out/commands/fullPipeline.js.map +1 -0
  6. package/out/commands/generateBeads.js +148 -0
  7. package/out/commands/generateBeads.js.map +1 -0
  8. package/out/commands/generateOpenSpec.js +241 -0
  9. package/out/commands/generateOpenSpec.js.map +1 -0
  10. package/out/dashboard/DashboardPanel.js +171 -0
  11. package/out/dashboard/DashboardPanel.js.map +1 -0
  12. package/out/extension.js +96 -0
  13. package/out/extension.js.map +1 -0
  14. package/out/parsers/parseBeadUpdates.js +28 -0
  15. package/out/parsers/parseBeadUpdates.js.map +1 -0
  16. package/out/parsers/parseTasksMarkdown.js +49 -0
  17. package/out/parsers/parseTasksMarkdown.js.map +1 -0
  18. package/out/test/integration/executeBeadsBatch.test.js +155 -0
  19. package/out/test/integration/executeBeadsBatch.test.js.map +1 -0
  20. package/out/test/integration/generateOpenSpec.test.js +154 -0
  21. package/out/test/integration/generateOpenSpec.test.js.map +1 -0
  22. package/out/test/runTest.js +47 -0
  23. package/out/test/runTest.js.map +1 -0
  24. package/out/test/suite/index.js +74 -0
  25. package/out/test/suite/index.js.map +1 -0
  26. package/out/test/unit/parseBeadUpdates.test.js +73 -0
  27. package/out/test/unit/parseBeadUpdates.test.js.map +1 -0
  28. package/out/test/unit/parseTasksMarkdown.test.js +69 -0
  29. package/out/test/unit/parseTasksMarkdown.test.js.map +1 -0
  30. package/out/test/unit/runCli.test.js +113 -0
  31. package/out/test/unit/runCli.test.js.map +1 -0
  32. package/out/utils/detectCli.js +30 -0
  33. package/out/utils/detectCli.js.map +1 -0
  34. package/out/utils/getConfig.js +60 -0
  35. package/out/utils/getConfig.js.map +1 -0
  36. package/out/utils/logger.js +30 -0
  37. package/out/utils/logger.js.map +1 -0
  38. package/out/utils/runCli.js +122 -0
  39. package/out/utils/runCli.js.map +1 -0
  40. package/package.json +111 -0
  41. package/src/commands/executeBeadsBatch.ts +153 -0
  42. package/src/commands/fullPipeline.ts +120 -0
  43. package/src/commands/generateBeads.ts +127 -0
  44. package/src/commands/generateOpenSpec.ts +227 -0
  45. package/src/dashboard/DashboardPanel.ts +168 -0
  46. package/src/extension.ts +77 -0
  47. package/src/parsers/parseBeadUpdates.ts +26 -0
  48. package/src/parsers/parseTasksMarkdown.ts +61 -0
  49. package/src/test/integration/executeBeadsBatch.test.ts +129 -0
  50. package/src/test/integration/generateOpenSpec.test.ts +129 -0
  51. package/src/test/runTest.ts +15 -0
  52. package/src/test/suite/index.ts +37 -0
  53. package/src/test/unit/parseBeadUpdates.test.ts +48 -0
  54. package/src/test/unit/parseTasksMarkdown.test.ts +41 -0
  55. package/src/test/unit/runCli.test.ts +109 -0
  56. package/src/utils/detectCli.ts +28 -0
  57. package/src/utils/getConfig.ts +25 -0
  58. package/src/utils/logger.ts +42 -0
  59. package/src/utils/runCli.ts +102 -0
  60. package/tsconfig.json +18 -0
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /**
37
+ * Integration tests for executeBeadsBatch command.
38
+ * IT-3: 3 beads ready — all 3 bd update commands executed successfully.
39
+ * IT-4: Partial failure — second bd update fails; others succeed, warning shown.
40
+ *
41
+ * Strategy: stub cp.spawn via sinon so no real CLIs are invoked.
42
+ */
43
+ const assert = __importStar(require("assert"));
44
+ const cp = __importStar(require("child_process"));
45
+ const fs = __importStar(require("fs"));
46
+ const os = __importStar(require("os"));
47
+ const path = __importStar(require("path"));
48
+ const sinon = __importStar(require("sinon"));
49
+ const vscode = __importStar(require("vscode"));
50
+ const events_1 = require("events");
51
+ const executeBeadsBatch_1 = require("../../commands/executeBeadsBatch");
52
+ // ---------------------------------------------------------------------------
53
+ // Fake process factory
54
+ // ---------------------------------------------------------------------------
55
+ function fakeProc(opts) {
56
+ const stdoutEE = new events_1.EventEmitter();
57
+ const stderrEE = new events_1.EventEmitter();
58
+ const procEE = new events_1.EventEmitter();
59
+ const proc = {
60
+ stdout: stdoutEE,
61
+ stderr: stderrEE,
62
+ kill: () => { },
63
+ on: procEE.on.bind(procEE),
64
+ once: procEE.once.bind(procEE),
65
+ removeListener: procEE.removeListener.bind(procEE),
66
+ emit: procEE.emit.bind(procEE),
67
+ };
68
+ setImmediate(() => {
69
+ if (opts.stdout) {
70
+ stdoutEE.emit('data', Buffer.from(opts.stdout));
71
+ }
72
+ if (opts.stderr) {
73
+ stderrEE.emit('data', Buffer.from(opts.stderr));
74
+ }
75
+ procEE.emit('close', opts.code ?? 0);
76
+ });
77
+ return proc;
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Helpers
81
+ // ---------------------------------------------------------------------------
82
+ const FAKE_BEADS = JSON.stringify([
83
+ { id: 'bd-a1', title: 'Bead A1', description: 'Do A1' },
84
+ { id: 'bd-b2', title: 'Bead B2', description: 'Do B2' },
85
+ { id: 'bd-b3', title: 'Bead B3', description: 'Do B3' },
86
+ ]);
87
+ const AUGGIE_SENTINELS = 'bd update bd-a1 --status done\n' +
88
+ 'bd update bd-b2 --status done\n' +
89
+ 'bd update bd-b3 --status done';
90
+ function stubWorkspace(dir) {
91
+ const orig = Object.getOwnPropertyDescriptor(vscode.workspace, 'workspaceFolders');
92
+ Object.defineProperty(vscode.workspace, 'workspaceFolders', {
93
+ configurable: true,
94
+ get: () => [{ uri: vscode.Uri.file(dir), name: 'test', index: 0 }],
95
+ });
96
+ return () => {
97
+ if (orig) {
98
+ Object.defineProperty(vscode.workspace, 'workspaceFolders', orig);
99
+ }
100
+ };
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Tests
104
+ // ---------------------------------------------------------------------------
105
+ suite('executeBeadsBatch — integration tests', () => {
106
+ let tmpDir;
107
+ let restoreWF;
108
+ let spawnStub;
109
+ let infoStub;
110
+ let warnStub;
111
+ let errStub;
112
+ setup(() => {
113
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'augsdd-batch-'));
114
+ restoreWF = stubWorkspace(tmpDir);
115
+ spawnStub = sinon.stub(cp, 'spawn');
116
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
+ infoStub = sinon.stub(vscode.window, 'showInformationMessage').resolves(undefined);
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ warnStub = sinon.stub(vscode.window, 'showWarningMessage').resolves(undefined);
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ errStub = sinon.stub(vscode.window, 'showErrorMessage').resolves(undefined);
122
+ });
123
+ teardown(() => {
124
+ sinon.restore();
125
+ restoreWF();
126
+ fs.rmSync(tmpDir, { recursive: true, force: true });
127
+ });
128
+ test('IT-3: 3 beads ready — all 3 bd update commands executed', async () => {
129
+ // Call order: bd ready, auggie, bd update ×3
130
+ spawnStub.onCall(0).returns(fakeProc({ stdout: FAKE_BEADS, code: 0 }));
131
+ spawnStub.onCall(1).returns(fakeProc({ stdout: AUGGIE_SENTINELS, code: 0 }));
132
+ spawnStub.onCall(2).returns(fakeProc({ stdout: '', code: 0 }));
133
+ spawnStub.onCall(3).returns(fakeProc({ stdout: '', code: 0 }));
134
+ spawnStub.onCall(4).returns(fakeProc({ stdout: '', code: 0 }));
135
+ await (0, executeBeadsBatch_1.executeBeadsBatch)();
136
+ assert.strictEqual(spawnStub.callCount, 5, 'spawn should be called 5 times total');
137
+ assert.ok(infoStub.called, 'success info message should be shown');
138
+ assert.ok(!warnStub.called, 'no warning should be shown on clean success');
139
+ assert.ok(!errStub.called, 'no error should be shown on clean success');
140
+ });
141
+ test('IT-4: partial failure — second bd update fails, warning shown', async () => {
142
+ // bd ready → auggie → bd-a1 ok → bd-b2 FAIL → bd-b3 ok
143
+ spawnStub.onCall(0).returns(fakeProc({ stdout: FAKE_BEADS, code: 0 }));
144
+ spawnStub.onCall(1).returns(fakeProc({ stdout: AUGGIE_SENTINELS, code: 0 }));
145
+ spawnStub.onCall(2).returns(fakeProc({ stdout: '', code: 0 }));
146
+ spawnStub.onCall(3).returns(fakeProc({ stdout: '', stderr: 'not found', code: 1 }));
147
+ spawnStub.onCall(4).returns(fakeProc({ stdout: '', code: 0 }));
148
+ await (0, executeBeadsBatch_1.executeBeadsBatch)();
149
+ assert.ok(warnStub.called, 'warning message should be shown on partial failure');
150
+ assert.ok(!errStub.called, 'no hard error should be shown on partial failure');
151
+ // Verify all 5 spawns happened (pipeline did not abort)
152
+ assert.strictEqual(spawnStub.callCount, 5, 'all 3 bd update attempts should be made');
153
+ });
154
+ });
155
+ //# sourceMappingURL=executeBeadsBatch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeBeadsBatch.test.js","sourceRoot":"","sources":["../../../src/test/integration/executeBeadsBatch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /**
37
+ * Integration tests for generateOpenSpec command.
38
+ * IT-1: Happy path — proposal.md written, validate passes.
39
+ * IT-2: Auggie returns empty output on both attempts → showErrorMessage called.
40
+ *
41
+ * Strategy: stub cp.spawn via sinon so no real CLIs are invoked.
42
+ * A temp directory is created on each test and wired as the workspace root.
43
+ */
44
+ const assert = __importStar(require("assert"));
45
+ const cp = __importStar(require("child_process"));
46
+ const fs = __importStar(require("fs"));
47
+ const os = __importStar(require("os"));
48
+ const path = __importStar(require("path"));
49
+ const sinon = __importStar(require("sinon"));
50
+ const vscode = __importStar(require("vscode"));
51
+ const events_1 = require("events");
52
+ const generateOpenSpec_1 = require("../../commands/generateOpenSpec");
53
+ // ---------------------------------------------------------------------------
54
+ // Fake process factory (mirrors the one in runCli.test.ts)
55
+ // ---------------------------------------------------------------------------
56
+ function fakeProc(opts) {
57
+ const stdoutEE = new events_1.EventEmitter();
58
+ const procEE = new events_1.EventEmitter();
59
+ const proc = {
60
+ stdout: stdoutEE,
61
+ stderr: new events_1.EventEmitter(),
62
+ kill: () => { },
63
+ on: procEE.on.bind(procEE),
64
+ once: procEE.once.bind(procEE),
65
+ removeListener: procEE.removeListener.bind(procEE),
66
+ emit: procEE.emit.bind(procEE),
67
+ };
68
+ setImmediate(() => {
69
+ if (opts.stdout) {
70
+ stdoutEE.emit('data', Buffer.from(opts.stdout));
71
+ }
72
+ procEE.emit('close', opts.code ?? 0);
73
+ });
74
+ return proc;
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Helpers
78
+ // ---------------------------------------------------------------------------
79
+ function makeTempWorkspace() {
80
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'augsdd-it-'));
81
+ // .jira folder with a single markdown ticket for auto-detection
82
+ const jiraDir = path.join(dir, '.jira');
83
+ fs.mkdirSync(jiraDir);
84
+ fs.writeFileSync(path.join(jiraDir, 'TICKET-1.md'), '# Ticket\nDetails');
85
+ // openspec/changes/<id> must exist so findNewestChangeDir works
86
+ const changeDir = path.join(dir, 'openspec', 'changes', 'test-change');
87
+ fs.mkdirSync(changeDir, { recursive: true });
88
+ return dir;
89
+ }
90
+ function stubWorkspace(dir) {
91
+ const orig = Object.getOwnPropertyDescriptor(vscode.workspace, 'workspaceFolders');
92
+ Object.defineProperty(vscode.workspace, 'workspaceFolders', {
93
+ configurable: true,
94
+ get: () => [{ uri: vscode.Uri.file(dir), name: 'test', index: 0 }],
95
+ });
96
+ return () => {
97
+ if (orig) {
98
+ Object.defineProperty(vscode.workspace, 'workspaceFolders', orig);
99
+ }
100
+ };
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Tests
104
+ // ---------------------------------------------------------------------------
105
+ suite('generateOpenSpec — integration tests', () => {
106
+ let tmpDir = '';
107
+ let restoreWF;
108
+ let spawnStub;
109
+ let infoStub;
110
+ let errStub;
111
+ setup(() => {
112
+ tmpDir = makeTempWorkspace();
113
+ restoreWF = stubWorkspace(tmpDir);
114
+ spawnStub = sinon.stub(cp, 'spawn');
115
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
116
+ infoStub = sinon.stub(vscode.window, 'showInformationMessage').resolves(undefined);
117
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
118
+ errStub = sinon.stub(vscode.window, 'showErrorMessage').resolves(undefined);
119
+ });
120
+ teardown(() => {
121
+ sinon.restore();
122
+ restoreWF();
123
+ fs.rmSync(tmpDir, { recursive: true, force: true });
124
+ });
125
+ test('IT-1: happy path — proposal.md written, validate exits 0', async () => {
126
+ // Spawn sequence: init → instructions → auggie → validate
127
+ spawnStub.onCall(0).returns(fakeProc({ stdout: '', code: 0 }));
128
+ spawnStub.onCall(1).returns(fakeProc({ stdout: '{"template":"Write a proposal."}', code: 0 }));
129
+ spawnStub.onCall(2).returns(fakeProc({ stdout: '# Proposal\nContent here.', code: 0 }));
130
+ spawnStub.onCall(3).returns(fakeProc({ stdout: 'OK', code: 0 }));
131
+ await (0, generateOpenSpec_1.generateOpenSpec)();
132
+ // proposal.md must have been written
133
+ const proposalPath = path.join(tmpDir, 'openspec', 'changes', 'test-change', 'proposal.md');
134
+ assert.ok(fs.existsSync(proposalPath), 'proposal.md should exist');
135
+ const content = fs.readFileSync(proposalPath, 'utf8');
136
+ assert.ok(content.includes('Proposal'), 'proposal.md should contain Auggie output');
137
+ // Success info message shown, no error
138
+ assert.ok(infoStub.called, 'showInformationMessage should be called on success');
139
+ assert.ok(!errStub.called, 'showErrorMessage should NOT be called on success');
140
+ });
141
+ test('IT-2: Auggie returns empty on both attempts → showErrorMessage called', async () => {
142
+ // init → instructions → auggie (empty) → auggie retry (empty)
143
+ spawnStub.onCall(0).returns(fakeProc({ stdout: '', code: 0 }));
144
+ spawnStub.onCall(1).returns(fakeProc({ stdout: '{"template":"template"}', code: 0 }));
145
+ spawnStub.onCall(2).returns(fakeProc({ stdout: '', code: 0 }));
146
+ spawnStub.onCall(3).returns(fakeProc({ stdout: '', code: 0 }));
147
+ await (0, generateOpenSpec_1.generateOpenSpec)();
148
+ // Error message must be shown; no proposal file written
149
+ assert.ok(errStub.called, 'showErrorMessage should be called after two empty Auggie attempts');
150
+ const proposalPath = path.join(tmpDir, 'openspec', 'changes', 'test-change', 'proposal.md');
151
+ assert.ok(!fs.existsSync(proposalPath), 'proposal.md should NOT be written on failure');
152
+ });
153
+ });
154
+ //# sourceMappingURL=generateOpenSpec.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateOpenSpec.test.js","sourceRoot":"","sources":["../../../src/test/integration/generateOpenSpec.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const path = __importStar(require("path"));
37
+ const test_electron_1 = require("@vscode/test-electron");
38
+ async function main() {
39
+ const extensionDevelopmentPath = path.resolve(__dirname, '../../');
40
+ const extensionTestsPath = path.resolve(__dirname, './suite/index');
41
+ await (0, test_electron_1.runTests)({ extensionDevelopmentPath, extensionTestsPath });
42
+ }
43
+ main().catch(err => {
44
+ console.error('Failed to run tests:', err);
45
+ process.exit(1);
46
+ });
47
+ //# sourceMappingURL=runTest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runTest.js","sourceRoot":"","sources":["../../src/test/runTest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,yDAAiD;AAEjD,KAAK,UAAU,IAAI;IACjB,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAEpE,MAAM,IAAA,wBAAQ,EAAC,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.run = run;
40
+ const path = __importStar(require("path"));
41
+ const fs = __importStar(require("fs"));
42
+ const mocha_1 = __importDefault(require("mocha"));
43
+ /** Recursively collect all *.test.js files under `dir`. */
44
+ function findTestFiles(dir) {
45
+ const results = [];
46
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
47
+ const full = path.join(dir, entry.name);
48
+ if (entry.isDirectory()) {
49
+ results.push(...findTestFiles(full));
50
+ }
51
+ else if (entry.isFile() && entry.name.endsWith('.test.js')) {
52
+ results.push(full);
53
+ }
54
+ }
55
+ return results;
56
+ }
57
+ function run() {
58
+ const mocha = new mocha_1.default({ ui: 'tdd', color: true, timeout: 10000 });
59
+ const testsRoot = path.resolve(__dirname, '..');
60
+ for (const f of findTestFiles(testsRoot)) {
61
+ mocha.addFile(f);
62
+ }
63
+ return new Promise((resolve, reject) => {
64
+ mocha.run(failures => {
65
+ if (failures > 0) {
66
+ reject(new Error(`${failures} test(s) failed.`));
67
+ }
68
+ else {
69
+ resolve();
70
+ }
71
+ });
72
+ });
73
+ }
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test/suite/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,kBAiBC;AAnCD,2CAA6B;AAC7B,uCAAyB;AACzB,kDAA0B;AAE1B,2DAA2D;AAC3D,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,GAAG;IACjB,MAAM,KAAK,GAAG,IAAI,eAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAM,EAAE,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACnB,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /**
37
+ * Unit tests for parseBeadUpdates.ts
38
+ * UT-5: parses valid sentinel lines from Auggie output
39
+ * UT-6: returns empty array when no sentinel lines found
40
+ */
41
+ const assert = __importStar(require("assert"));
42
+ const parseBeadUpdates_1 = require("../../parsers/parseBeadUpdates");
43
+ suite('parseBeadUpdates — unit tests', () => {
44
+ test('UT-5: parses bd update lines from Auggie output', () => {
45
+ const output = 'some text\n' +
46
+ 'bd update bd-a1 --status done\n' +
47
+ 'more text\n' +
48
+ 'bd update bd-b2 --status done';
49
+ const lines = (0, parseBeadUpdates_1.parseBeadUpdates)(output);
50
+ assert.deepStrictEqual(lines, [
51
+ 'bd update bd-a1 --status done',
52
+ 'bd update bd-b2 --status done',
53
+ ]);
54
+ });
55
+ test('UT-6: returns empty array when no sentinel lines found', () => {
56
+ const lines = (0, parseBeadUpdates_1.parseBeadUpdates)('Auggie did not finish');
57
+ assert.deepStrictEqual(lines, []);
58
+ });
59
+ test('ignores lines that are partial / malformed sentinels', () => {
60
+ const output = 'bd update --status done\n' + // missing id
61
+ ' bd update bd-x1 --status done\n' + // leading spaces (not at start)
62
+ 'bd update bd-x2 --status pending\n' + // wrong status
63
+ 'bd update bd-x3 --status done'; // valid
64
+ const lines = (0, parseBeadUpdates_1.parseBeadUpdates)(output);
65
+ assert.deepStrictEqual(lines, ['bd update bd-x3 --status done']);
66
+ });
67
+ test('handles CRLF line endings', () => {
68
+ const output = 'preamble\r\nbd update bd-crlf --status done\r\npostamble';
69
+ const lines = (0, parseBeadUpdates_1.parseBeadUpdates)(output);
70
+ assert.deepStrictEqual(lines, ['bd update bd-crlf --status done']);
71
+ });
72
+ });
73
+ //# sourceMappingURL=parseBeadUpdates.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBeadUpdates.test.js","sourceRoot":"","sources":["../../../src/test/unit/parseBeadUpdates.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,+CAAiC;AACjC,qEAAkE;AAElE,KAAK,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAE1C,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GACV,aAAa;YACb,iCAAiC;YACjC,aAAa;YACb,+BAA+B,CAAC;QAElC,MAAM,KAAK,GAAG,IAAA,mCAAgB,EAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE;YAC5B,+BAA+B;YAC/B,+BAA+B;SAChC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAClE,MAAM,KAAK,GAAG,IAAA,mCAAgB,EAAC,uBAAuB,CAAC,CAAC;QACxD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GACV,2BAA2B,GAAgB,aAAa;YACxD,mCAAmC,GAAQ,gCAAgC;YAC3E,oCAAoC,GAAO,eAAe;YAC1D,+BAA+B,CAAC,CAAW,QAAQ;QAErD,MAAM,KAAK,GAAG,IAAA,mCAAgB,EAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,0DAA0D,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAA,mCAAgB,EAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /**
37
+ * Unit tests for parseTasksMarkdown.ts
38
+ * UT-4: Headings extracted as task titles with descriptions
39
+ */
40
+ const assert = __importStar(require("assert"));
41
+ const parseTasksMarkdown_1 = require("../../parsers/parseTasksMarkdown");
42
+ suite('parseTasksMarkdown — unit tests', () => {
43
+ test('UT-4: extracts headings as task titles', () => {
44
+ const md = '## Task 1\nDo this\n## Task 2\nDo that';
45
+ const tasks = (0, parseTasksMarkdown_1.parseTasksMarkdown)(md);
46
+ assert.deepStrictEqual(tasks.map(t => t.title), ['Task 1', 'Task 2']);
47
+ });
48
+ test('extracts body text as task description', () => {
49
+ const md = '## Alpha\nFirst line\nSecond line\n## Beta\nOther';
50
+ const tasks = (0, parseTasksMarkdown_1.parseTasksMarkdown)(md);
51
+ assert.strictEqual(tasks[0].description, 'First line\nSecond line');
52
+ assert.strictEqual(tasks[1].description, 'Other');
53
+ });
54
+ test('returns empty array when no headings are found', () => {
55
+ const tasks = (0, parseTasksMarkdown_1.parseTasksMarkdown)('No headings here.');
56
+ assert.deepStrictEqual(tasks, []);
57
+ });
58
+ test('handles H1, H2, and H3 headings', () => {
59
+ const md = '# One\na\n## Two\nb\n### Three\nc';
60
+ const tasks = (0, parseTasksMarkdown_1.parseTasksMarkdown)(md);
61
+ assert.deepStrictEqual(tasks.map(t => t.title), ['One', 'Two', 'Three']);
62
+ });
63
+ test('trims extra whitespace from titles', () => {
64
+ const md = '## Spaced Title \nBody';
65
+ const tasks = (0, parseTasksMarkdown_1.parseTasksMarkdown)(md);
66
+ assert.strictEqual(tasks[0].title, 'Spaced Title');
67
+ });
68
+ });
69
+ //# sourceMappingURL=parseTasksMarkdown.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTasksMarkdown.test.js","sourceRoot":"","sources":["../../../src/test/unit/parseTasksMarkdown.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;GAGG;AACH,+CAAiC;AACjC,yEAAgF;AAEhF,KAAK,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAE5C,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,GAAG,wCAAwC,CAAC;QACpD,MAAM,KAAK,GAAe,IAAA,uCAAkB,EAAC,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,GAAG,mDAAmD,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAA,uCAAkB,EAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAG,IAAA,uCAAkB,EAAC,mBAAmB,CAAC,CAAC;QACtD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,GAAG,mCAAmC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAA,uCAAkB,EAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,EAAE,GAAG,4BAA4B,CAAC;QACxC,MAAM,KAAK,GAAG,IAAA,uCAAkB,EAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}