@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.
- package/.eslintrc.json +20 -0
- package/out/commands/executeBeadsBatch.js +165 -0
- package/out/commands/executeBeadsBatch.js.map +1 -0
- package/out/commands/fullPipeline.js +129 -0
- package/out/commands/fullPipeline.js.map +1 -0
- package/out/commands/generateBeads.js +148 -0
- package/out/commands/generateBeads.js.map +1 -0
- package/out/commands/generateOpenSpec.js +241 -0
- package/out/commands/generateOpenSpec.js.map +1 -0
- package/out/dashboard/DashboardPanel.js +171 -0
- package/out/dashboard/DashboardPanel.js.map +1 -0
- package/out/extension.js +96 -0
- package/out/extension.js.map +1 -0
- package/out/parsers/parseBeadUpdates.js +28 -0
- package/out/parsers/parseBeadUpdates.js.map +1 -0
- package/out/parsers/parseTasksMarkdown.js +49 -0
- package/out/parsers/parseTasksMarkdown.js.map +1 -0
- package/out/test/integration/executeBeadsBatch.test.js +155 -0
- package/out/test/integration/executeBeadsBatch.test.js.map +1 -0
- package/out/test/integration/generateOpenSpec.test.js +154 -0
- package/out/test/integration/generateOpenSpec.test.js.map +1 -0
- package/out/test/runTest.js +47 -0
- package/out/test/runTest.js.map +1 -0
- package/out/test/suite/index.js +74 -0
- package/out/test/suite/index.js.map +1 -0
- package/out/test/unit/parseBeadUpdates.test.js +73 -0
- package/out/test/unit/parseBeadUpdates.test.js.map +1 -0
- package/out/test/unit/parseTasksMarkdown.test.js +69 -0
- package/out/test/unit/parseTasksMarkdown.test.js.map +1 -0
- package/out/test/unit/runCli.test.js +113 -0
- package/out/test/unit/runCli.test.js.map +1 -0
- package/out/utils/detectCli.js +30 -0
- package/out/utils/detectCli.js.map +1 -0
- package/out/utils/getConfig.js +60 -0
- package/out/utils/getConfig.js.map +1 -0
- package/out/utils/logger.js +30 -0
- package/out/utils/logger.js.map +1 -0
- package/out/utils/runCli.js +122 -0
- package/out/utils/runCli.js.map +1 -0
- package/package.json +111 -0
- package/src/commands/executeBeadsBatch.ts +153 -0
- package/src/commands/fullPipeline.ts +120 -0
- package/src/commands/generateBeads.ts +127 -0
- package/src/commands/generateOpenSpec.ts +227 -0
- package/src/dashboard/DashboardPanel.ts +168 -0
- package/src/extension.ts +77 -0
- package/src/parsers/parseBeadUpdates.ts +26 -0
- package/src/parsers/parseTasksMarkdown.ts +61 -0
- package/src/test/integration/executeBeadsBatch.test.ts +129 -0
- package/src/test/integration/generateOpenSpec.test.ts +129 -0
- package/src/test/runTest.ts +15 -0
- package/src/test/suite/index.ts +37 -0
- package/src/test/unit/parseBeadUpdates.test.ts +48 -0
- package/src/test/unit/parseTasksMarkdown.test.ts +41 -0
- package/src/test/unit/runCli.test.ts +109 -0
- package/src/utils/detectCli.ts +28 -0
- package/src/utils/getConfig.ts +25 -0
- package/src/utils/logger.ts +42 -0
- package/src/utils/runCli.ts +102 -0
- 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;GAOG;AACH,+CAAiC;AACjC,kDAAuC;AACvC,uCAA4B;AAC5B,uCAA4B;AAC5B,2CAA8B;AAC9B,6CAA+B;AAC/B,+CAAiC;AACjC,mCAAsC;AACtC,sEAAmE;AAEnE,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAC9E,SAAS,QAAQ,CAAC,IAAwC;IACxD,MAAM,QAAQ,GAAG,IAAI,qBAAY,EAAE,CAAC;IACpC,MAAM,MAAM,GAAK,IAAI,qBAAY,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG;QACX,MAAM,EAAU,QAAQ;QACxB,MAAM,EAAU,IAAI,qBAAY,EAAE;QAClC,IAAI,EAAY,GAAG,EAAE,GAAc,CAAC;QACpC,EAAE,EAAc,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QACtC,IAAI,EAAY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACxC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAClD,IAAI,EAAY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;KACzC,CAAC;IACF,YAAY,CAAC,GAAG,EAAE;QAChB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,IAAkC,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAC9E,SAAS,iBAAiB;IACxB,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IACjE,gEAAgE;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACzE,gEAAgE;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACvE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACnF,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,EAAE;QAC1D,YAAY,EAAE,IAAI;QAClB,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;KACnE,CAAC,CAAC;IACH,OAAO,GAAG,EAAE;QACV,IAAI,IAAI,EAAE,CAAC;YAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;IAClF,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAC9E,KAAK,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACjD,IAAI,MAAM,GAAK,EAAE,CAAC;IAClB,IAAI,SAAqB,CAAC;IAC1B,IAAI,SAA0B,CAAC;IAC/B,IAAI,QAA0B,CAAC;IAC/B,IAAI,OAA0B,CAAC;IAE/B,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,GAAM,iBAAiB,EAAE,CAAC;QAChC,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAClC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAoB,CAAC;QACvD,8DAA8D;QAC9D,QAAQ,GAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,wBAA+B,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3F,8DAA8D;QAC9D,OAAO,GAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAyB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,SAAS,EAAE,CAAC;QACZ,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC1E,0DAA0D;QAC1D,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,kCAAkC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/F,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,2BAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxF,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjE,MAAM,IAAA,mCAAgB,GAAE,CAAC;QAEzB,qCAAqC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QAC5F,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,0BAA0B,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,0CAA0C,CAAC,CAAC;QAEpF,uCAAuC;QACvC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,oDAAoD,CAAC,CAAC;QACjF,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,kDAAkD,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACvF,8DAA8D;QAC9D,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE/D,MAAM,IAAA,mCAAgB,GAAE,CAAC;QAEzB,wDAAwD;QACxD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,mEAAmE,CAAC,CAAC;QAC/F,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QAC5F,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,8CAA8C,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}
|
|
@@ -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"}
|