@mytechtoday/augment-sdd 1.0.0 → 1.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.
- package/out/beads/BeadsAdapter.js +30 -0
- package/out/beads/BeadsAdapter.js.map +1 -0
- package/out/beads/ClassicBeadsAdapter.js +84 -0
- package/out/beads/ClassicBeadsAdapter.js.map +1 -0
- package/out/beads/PowerShellBeadsAdapter.js +118 -0
- package/out/beads/PowerShellBeadsAdapter.js.map +1 -0
- package/out/beads/getBeadsAdapter.js +94 -0
- package/out/beads/getBeadsAdapter.js.map +1 -0
- package/out/commands/executeBeadsBatch.js +29 -15
- package/out/commands/executeBeadsBatch.js.map +1 -1
- package/out/commands/generateBeads.js +25 -22
- package/out/commands/generateBeads.js.map +1 -1
- package/out/commands/initWizard.js +184 -0
- package/out/commands/initWizard.js.map +1 -0
- package/out/extension.js +10 -0
- package/out/extension.js.map +1 -1
- package/out/test/integration/executeBeadsBatch.test.js +83 -57
- package/out/test/integration/executeBeadsBatch.test.js.map +1 -1
- package/out/test/integration/generateBeads.test.js +156 -0
- package/out/test/integration/generateBeads.test.js.map +1 -0
- package/out/test/integration/generateOpenSpec.test.js +16 -39
- package/out/test/integration/generateOpenSpec.test.js.map +1 -1
- package/out/test/unit/ClassicBeadsAdapter.test.js +121 -0
- package/out/test/unit/ClassicBeadsAdapter.test.js.map +1 -0
- package/out/test/unit/PowerShellBeadsAdapter.test.js +120 -0
- package/out/test/unit/PowerShellBeadsAdapter.test.js.map +1 -0
- package/out/test/unit/getBeadsAdapter.test.js +97 -0
- package/out/test/unit/getBeadsAdapter.test.js.map +1 -0
- package/out/test/unit/initWizard.test.js +170 -0
- package/out/test/unit/initWizard.test.js.map +1 -0
- package/out/test/unit/runCli.test.js +11 -24
- package/out/test/unit/runCli.test.js.map +1 -1
- package/out/utils/detectCli.js +47 -1
- package/out/utils/detectCli.js.map +1 -1
- package/out/utils/runCli.js +9 -3
- package/out/utils/runCli.js.map +1 -1
- package/package.json +22 -1
- package/.eslintrc.json +0 -20
- package/src/commands/executeBeadsBatch.ts +0 -153
- package/src/commands/fullPipeline.ts +0 -120
- package/src/commands/generateBeads.ts +0 -127
- package/src/commands/generateOpenSpec.ts +0 -227
- package/src/dashboard/DashboardPanel.ts +0 -168
- package/src/extension.ts +0 -77
- package/src/parsers/parseBeadUpdates.ts +0 -26
- package/src/parsers/parseTasksMarkdown.ts +0 -61
- package/src/test/integration/executeBeadsBatch.test.ts +0 -129
- package/src/test/integration/generateOpenSpec.test.ts +0 -129
- package/src/test/runTest.ts +0 -15
- package/src/test/suite/index.ts +0 -37
- package/src/test/unit/parseBeadUpdates.test.ts +0 -48
- package/src/test/unit/parseTasksMarkdown.test.ts +0 -41
- package/src/test/unit/runCli.test.ts +0 -109
- package/src/utils/detectCli.ts +0 -28
- package/src/utils/getConfig.ts +0 -25
- package/src/utils/logger.ts +0 -42
- package/src/utils/runCli.ts +0 -102
- package/tsconfig.json +0 -18
|
@@ -0,0 +1,184 @@
|
|
|
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
|
+
exports.initWizard = initWizard;
|
|
37
|
+
/**
|
|
38
|
+
* initWizard — interactive Beads backend setup wizard.
|
|
39
|
+
*
|
|
40
|
+
* Triggered by the `augmentSdd.init` command. Probes available backends,
|
|
41
|
+
* presents a QuickPick, copies bundled scripts when needed, and writes the
|
|
42
|
+
* `augmentSdd.beadsBackend` workspace setting.
|
|
43
|
+
*/
|
|
44
|
+
const vscode = __importStar(require("vscode"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const detectCli_1 = require("../utils/detectCli");
|
|
48
|
+
const runCli_1 = require("../utils/runCli");
|
|
49
|
+
const logger_1 = require("../utils/logger");
|
|
50
|
+
/**
|
|
51
|
+
* Copy a single bundled script from the extension install dir to the
|
|
52
|
+
* workspace `scripts/` folder. Prompts before overwriting existing files.
|
|
53
|
+
* Throws if the source file is missing (extension needs reinstall).
|
|
54
|
+
*/
|
|
55
|
+
async function copyBundledScript(extensionPath, destDir, filename) {
|
|
56
|
+
const src = path.join(extensionPath, 'scripts', filename);
|
|
57
|
+
// Runtime guard: bundled script must exist inside the extension package.
|
|
58
|
+
if (!fs.existsSync(src)) {
|
|
59
|
+
throw new Error(`Bundled script not found: scripts/${filename}. ` +
|
|
60
|
+
'Reinstall the Augment SDD extension to restore bundled scripts.');
|
|
61
|
+
}
|
|
62
|
+
const dest = path.join(destDir, filename);
|
|
63
|
+
if (fs.existsSync(dest)) {
|
|
64
|
+
const choice = await vscode.window.showWarningMessage(`scripts/${filename} already exists in this workspace. Overwrite?`, 'Overwrite', 'Skip');
|
|
65
|
+
if (choice !== 'Overwrite') {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
await fs.promises.copyFile(src, dest);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Main entry point for the init wizard command.
|
|
73
|
+
*
|
|
74
|
+
* @param context VS Code extension context (provides extensionPath).
|
|
75
|
+
* @param workspaceRoot Absolute path to the open workspace folder.
|
|
76
|
+
*/
|
|
77
|
+
async function initWizard(context, workspaceRoot) {
|
|
78
|
+
// ── Step 1: Detect available backends ──────────────────────────────────────
|
|
79
|
+
(0, logger_1.log)('Init wizard: probing backends…');
|
|
80
|
+
const backends = await (0, detectCli_1.detectBackends)();
|
|
81
|
+
(0, logger_1.log)((0, detectCli_1.formatDetectionSummary)(backends));
|
|
82
|
+
const bdAvailable = backends.bd.version !== null;
|
|
83
|
+
const pwshAvailable = backends.pwsh.version !== null || backends.powershell.version !== null;
|
|
84
|
+
const doltAvailable = backends.dolt.version !== null;
|
|
85
|
+
// Idempotency: if a non-auto backend is already set, offer to keep it.
|
|
86
|
+
const config = vscode.workspace.getConfiguration('augmentSdd');
|
|
87
|
+
const current = config.get('beadsBackend', 'auto');
|
|
88
|
+
if (current !== 'auto') {
|
|
89
|
+
const choice = await vscode.window.showInformationMessage(`Augment SDD: Backend already configured as "${current}". Change it?`, 'Change', 'Keep');
|
|
90
|
+
if (choice !== 'Change') {
|
|
91
|
+
(0, logger_1.log)('Init wizard: user kept existing backend configuration.');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// ── Step 2: Backend selection QuickPick ────────────────────────────────────
|
|
96
|
+
const items = [
|
|
97
|
+
{
|
|
98
|
+
label: `$(beaker) Classic Beads (bd)${bdAvailable ? '' : ' ⚠ bd not found'}`,
|
|
99
|
+
description: bdAvailable
|
|
100
|
+
? `bd ${backends.bd.version ?? ''}${doltAvailable ? '' : ' — ⚠ dolt not found'}`
|
|
101
|
+
: 'Requires bd + dolt on PATH',
|
|
102
|
+
detail: 'Uses bd.exe + dolt database. Full-featured but requires external binaries.',
|
|
103
|
+
picked: bdAvailable && doltAvailable,
|
|
104
|
+
backendId: 'bd',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
label: `$(terminal-powershell) PowerShell Beads (beads-ps1)${pwshAvailable ? '' : ' ⚠ pwsh not found'}`,
|
|
108
|
+
description: 'Recommended — no external dependencies',
|
|
109
|
+
detail: 'Uses beads-helpers.ps1 + beads-query.ps1 in scripts/. Data in .beads/issues.jsonl.',
|
|
110
|
+
picked: !bdAvailable,
|
|
111
|
+
backendId: 'beads-ps1',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
label: '$(snake) Python Beads (beads-py) (coming soon)',
|
|
115
|
+
description: 'Pure Python 3 — not yet available',
|
|
116
|
+
detail: 'Requires python3 on PATH. Planned for a future release.',
|
|
117
|
+
backendId: null,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
label: '$(node) Node.js Beads (beads-js) (coming soon)',
|
|
121
|
+
description: 'Pure Node.js — not yet available',
|
|
122
|
+
detail: 'Requires node on PATH. Planned for a future release.',
|
|
123
|
+
backendId: null,
|
|
124
|
+
},
|
|
125
|
+
];
|
|
126
|
+
const picked = await vscode.window.showQuickPick(items, {
|
|
127
|
+
title: 'Augment SDD: Select Beads Backend',
|
|
128
|
+
placeHolder: 'Choose the backend for Beads issue tracking',
|
|
129
|
+
});
|
|
130
|
+
if (!picked) {
|
|
131
|
+
(0, logger_1.log)('Init wizard cancelled by user.');
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (picked.backendId === null) {
|
|
135
|
+
vscode.window.showInformationMessage('That backend is not yet available. Check back in a future release!');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// ── Step 3: Backend-specific setup ─────────────────────────────────────────
|
|
139
|
+
if (picked.backendId === 'beads-ps1') {
|
|
140
|
+
const destDir = path.join(workspaceRoot, 'scripts');
|
|
141
|
+
await fs.promises.mkdir(destDir, { recursive: true });
|
|
142
|
+
for (const file of ['beads-helpers.ps1', 'beads-query.ps1']) {
|
|
143
|
+
await copyBundledScript(context.extensionPath, destDir, file);
|
|
144
|
+
(0, logger_1.log)(`Copied scripts/${file} → workspace.`);
|
|
145
|
+
}
|
|
146
|
+
const beadsDir = path.join(workspaceRoot, '.beads');
|
|
147
|
+
await fs.promises.mkdir(beadsDir, { recursive: true });
|
|
148
|
+
const issuesFile = path.join(beadsDir, 'issues.jsonl');
|
|
149
|
+
if (!fs.existsSync(issuesFile)) {
|
|
150
|
+
await fs.promises.writeFile(issuesFile, '', 'utf8');
|
|
151
|
+
(0, logger_1.log)('Created .beads/issues.jsonl');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else if (picked.backendId === 'bd') {
|
|
155
|
+
if (!doltAvailable) {
|
|
156
|
+
const action = await vscode.window.showErrorMessage('Classic Beads requires dolt. Install: https://docs.dolthub.com/introduction/installation', 'Open Docs');
|
|
157
|
+
if (action === 'Open Docs') {
|
|
158
|
+
vscode.env.openExternal(vscode.Uri.parse('https://docs.dolthub.com/introduction/installation'));
|
|
159
|
+
}
|
|
160
|
+
(0, logger_1.log)('Init wizard: dolt not found — Classic Beads setup aborted.');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const out = await (0, runCli_1.runCli)('bd', ['init'], workspaceRoot);
|
|
165
|
+
(0, logger_1.log)(`bd init: ${out}`);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
(0, logger_1.log)(`bd init failed: ${String(err)}`);
|
|
169
|
+
vscode.window.showErrorMessage('Augment SDD: bd init failed. See Output Channel for details.');
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// ── Write config & report ───────────────────────────────────────────────────
|
|
174
|
+
await config.update('beadsBackend', picked.backendId, vscode.ConfigurationTarget.Workspace);
|
|
175
|
+
(0, logger_1.log)(`Init wizard: augmentSdd.beadsBackend set to "${picked.backendId}".`);
|
|
176
|
+
const activationHint = picked.backendId === 'beads-ps1'
|
|
177
|
+
? '\n\nTo activate, run in your repo root:\n . .\\scripts\\beads-helpers.ps1\n bd-help'
|
|
178
|
+
: '';
|
|
179
|
+
const action = await vscode.window.showInformationMessage(`Augment SDD: "${picked.backendId}" backend configured.${activationHint}`, 'View Logs');
|
|
180
|
+
if (action === 'View Logs') {
|
|
181
|
+
(0, logger_1.revealOutputChannel)();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=initWizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initWizard.js","sourceRoot":"","sources":["../../src/commands/initWizard.ts"],"names":[],"mappings":"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"}
|
package/out/extension.js
CHANGED
|
@@ -42,6 +42,7 @@ const generateOpenSpec_1 = require("./commands/generateOpenSpec");
|
|
|
42
42
|
const generateBeads_1 = require("./commands/generateBeads");
|
|
43
43
|
const executeBeadsBatch_1 = require("./commands/executeBeadsBatch");
|
|
44
44
|
const fullPipeline_1 = require("./commands/fullPipeline");
|
|
45
|
+
const initWizard_1 = require("./commands/initWizard");
|
|
45
46
|
/** CLI definitions: name on PATH and the npm package to install if missing. */
|
|
46
47
|
const REQUIRED_CLIS = [
|
|
47
48
|
{ name: 'auggie', pkg: 'auggie' },
|
|
@@ -78,6 +79,8 @@ function activate(context) {
|
|
|
78
79
|
checkRequiredClis().catch(err => {
|
|
79
80
|
(0, logger_1.log)(`CLI detection error: ${String(err)}`);
|
|
80
81
|
});
|
|
82
|
+
// Log backend detection summary on activation (non-blocking, informational only).
|
|
83
|
+
(0, detectCli_1.detectBackends)().then(result => (0, logger_1.log)((0, detectCli_1.formatDetectionSummary)(result))).catch(() => { });
|
|
81
84
|
// Register commands (implementations wired in subsequent beads).
|
|
82
85
|
context.subscriptions.push(vscode.commands.registerCommand('augmentSdd.generateOpenSpec', async () => {
|
|
83
86
|
await (0, generateOpenSpec_1.generateOpenSpec)();
|
|
@@ -87,6 +90,13 @@ function activate(context) {
|
|
|
87
90
|
await (0, executeBeadsBatch_1.executeBeadsBatch)();
|
|
88
91
|
}), vscode.commands.registerCommand('augmentSdd.fullPipeline', async () => {
|
|
89
92
|
await (0, fullPipeline_1.fullPipeline)();
|
|
93
|
+
}), vscode.commands.registerCommand('augmentSdd.init', async () => {
|
|
94
|
+
const folders = vscode.workspace.workspaceFolders;
|
|
95
|
+
if (!folders || folders.length === 0) {
|
|
96
|
+
vscode.window.showErrorMessage('Augment SDD: No workspace folder is open.');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
await (0, initWizard_1.initWizard)(context, folders[0].uri.fsPath);
|
|
90
100
|
}));
|
|
91
101
|
(0, logger_1.log)('Augment SDD extension activated.');
|
|
92
102
|
}
|
package/out/extension.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,53 +37,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
37
37
|
* Integration tests for executeBeadsBatch command.
|
|
38
38
|
* IT-3: 3 beads ready — all 3 bd update commands executed successfully.
|
|
39
39
|
* IT-4: Partial failure — second bd update fails; others succeed, warning shown.
|
|
40
|
+
* IT-7 (ps-fix): mock PowerShellBeadsAdapter → adapter.update called per bead.
|
|
40
41
|
*
|
|
41
|
-
* Strategy:
|
|
42
|
+
* Strategy:
|
|
43
|
+
* - IT-3/IT-4: stub getBeadsAdapter to return a mock ClassicBeadsAdapter
|
|
44
|
+
* backed by sinon stubs; also stub cp.spawn for the auggie call.
|
|
45
|
+
* - IT-7: stub getBeadsAdapter to return a mock PowerShellBeadsAdapter.
|
|
46
|
+
* - vscode.workspace.getConfiguration is stubbed so batchSize=3 is returned.
|
|
42
47
|
*/
|
|
43
48
|
const assert = __importStar(require("assert"));
|
|
44
|
-
const cp = __importStar(require("child_process"));
|
|
45
49
|
const fs = __importStar(require("fs"));
|
|
46
50
|
const os = __importStar(require("os"));
|
|
47
51
|
const path = __importStar(require("path"));
|
|
48
52
|
const sinon = __importStar(require("sinon"));
|
|
49
53
|
const vscode = __importStar(require("vscode"));
|
|
50
|
-
const events_1 = require("events");
|
|
51
54
|
const executeBeadsBatch_1 = require("../../commands/executeBeadsBatch");
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
}
|
|
55
|
+
const adapterFactory = __importStar(require("../../beads/getBeadsAdapter"));
|
|
56
|
+
const runCliModule = __importStar(require("../../utils/runCli"));
|
|
79
57
|
// ---------------------------------------------------------------------------
|
|
80
58
|
// Helpers
|
|
81
59
|
// ---------------------------------------------------------------------------
|
|
82
|
-
const FAKE_BEADS =
|
|
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
|
-
]
|
|
60
|
+
const FAKE_BEADS = [
|
|
61
|
+
{ id: 'bd-a1', title: 'Bead A1', description: 'Do A1', status: 'open', priority: 2 },
|
|
62
|
+
{ id: 'bd-b2', title: 'Bead B2', description: 'Do B2', status: 'open', priority: 3 },
|
|
63
|
+
{ id: 'bd-b3', title: 'Bead B3', description: 'Do B3', status: 'open', priority: 3 },
|
|
64
|
+
];
|
|
87
65
|
const AUGGIE_SENTINELS = 'bd update bd-a1 --status done\n' +
|
|
88
66
|
'bd update bd-b2 --status done\n' +
|
|
89
67
|
'bd update bd-b3 --status done';
|
|
@@ -99,57 +77,105 @@ function stubWorkspace(dir) {
|
|
|
99
77
|
}
|
|
100
78
|
};
|
|
101
79
|
}
|
|
80
|
+
/** Build a minimal mock adapter with controllable ready/update stubs. */
|
|
81
|
+
function buildMockAdapter(readyResult, updateImpl) {
|
|
82
|
+
const readyStub = sinon.stub().resolves(readyResult);
|
|
83
|
+
const updateStub = updateImpl
|
|
84
|
+
? sinon.stub().callsFake(async (id) => updateImpl(id))
|
|
85
|
+
: sinon.stub().resolves();
|
|
86
|
+
const adapter = {
|
|
87
|
+
ready: readyStub,
|
|
88
|
+
update: updateStub,
|
|
89
|
+
create: sinon.stub().resolves('bd-new'),
|
|
90
|
+
close: sinon.stub().resolves(),
|
|
91
|
+
search: sinon.stub().resolves([]),
|
|
92
|
+
};
|
|
93
|
+
return { adapter, readyStub, updateStub };
|
|
94
|
+
}
|
|
95
|
+
/** Stub VS Code config to return sensible defaults for batchSize / flags. */
|
|
96
|
+
function stubConfig() {
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
|
+
sinon.stub(vscode.workspace, 'getConfiguration').returns({
|
|
99
|
+
get: (key, def) => {
|
|
100
|
+
if (key === 'batchSize') {
|
|
101
|
+
return 3;
|
|
102
|
+
}
|
|
103
|
+
if (key === 'auggieExtraFlags') {
|
|
104
|
+
return '';
|
|
105
|
+
}
|
|
106
|
+
return def;
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
102
110
|
// ---------------------------------------------------------------------------
|
|
103
111
|
// Tests
|
|
104
112
|
// ---------------------------------------------------------------------------
|
|
105
113
|
suite('executeBeadsBatch — integration tests', () => {
|
|
106
114
|
let tmpDir;
|
|
107
115
|
let restoreWF;
|
|
108
|
-
let
|
|
116
|
+
let runCliStub;
|
|
109
117
|
let infoStub;
|
|
110
118
|
let warnStub;
|
|
111
119
|
let errStub;
|
|
112
120
|
setup(() => {
|
|
113
121
|
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'augsdd-batch-'));
|
|
114
122
|
restoreWF = stubWorkspace(tmpDir);
|
|
115
|
-
|
|
123
|
+
// Stub runCli for the auggie call (adapter calls are pure JS stubs).
|
|
124
|
+
runCliStub = sinon.stub(runCliModule, 'runCli');
|
|
116
125
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
117
126
|
infoStub = sinon.stub(vscode.window, 'showInformationMessage').resolves(undefined);
|
|
118
127
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
128
|
warnStub = sinon.stub(vscode.window, 'showWarningMessage').resolves(undefined);
|
|
120
129
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
121
130
|
errStub = sinon.stub(vscode.window, 'showErrorMessage').resolves(undefined);
|
|
131
|
+
stubConfig();
|
|
122
132
|
});
|
|
123
133
|
teardown(() => {
|
|
124
134
|
sinon.restore();
|
|
125
135
|
restoreWF();
|
|
126
136
|
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
127
137
|
});
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
spawnStub.onCall(4).returns(fakeProc({ stdout: '', code: 0 }));
|
|
138
|
+
// IT-3 -------------------------------------------------------------------
|
|
139
|
+
test('IT-3: 3 beads ready — all 3 adapter.update calls executed', async () => {
|
|
140
|
+
const { adapter, updateStub } = buildMockAdapter(FAKE_BEADS);
|
|
141
|
+
sinon.stub(adapterFactory, 'getBeadsAdapter').resolves(adapter);
|
|
142
|
+
// runCli is only called for auggie; adapter.update is a pure JS stub.
|
|
143
|
+
runCliStub.resolves(AUGGIE_SENTINELS);
|
|
135
144
|
await (0, executeBeadsBatch_1.executeBeadsBatch)();
|
|
136
|
-
assert.strictEqual(
|
|
145
|
+
assert.strictEqual(runCliStub.callCount, 1, 'runCli should be called once (auggie)');
|
|
146
|
+
assert.strictEqual(updateStub.callCount, 3, 'adapter.update should be called 3 times');
|
|
147
|
+
assert.ok(updateStub.calledWith('bd-a1', 'done'), 'should update bd-a1');
|
|
148
|
+
assert.ok(updateStub.calledWith('bd-b2', 'done'), 'should update bd-b2');
|
|
149
|
+
assert.ok(updateStub.calledWith('bd-b3', 'done'), 'should update bd-b3');
|
|
137
150
|
assert.ok(infoStub.called, 'success info message should be shown');
|
|
138
|
-
assert.ok(!warnStub.called, 'no warning
|
|
139
|
-
assert.ok(!errStub.called, 'no error
|
|
151
|
+
assert.ok(!warnStub.called, 'no warning on clean success');
|
|
152
|
+
assert.ok(!errStub.called, 'no error on clean success');
|
|
140
153
|
});
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
154
|
+
// IT-4 -------------------------------------------------------------------
|
|
155
|
+
test('IT-4: partial failure — second update fails, warning shown, others continue', async () => {
|
|
156
|
+
let callCount = 0;
|
|
157
|
+
const { adapter, updateStub } = buildMockAdapter(FAKE_BEADS, async (id) => {
|
|
158
|
+
callCount++;
|
|
159
|
+
if (id === 'bd-b2') {
|
|
160
|
+
throw new Error('simulated failure');
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
sinon.stub(adapterFactory, 'getBeadsAdapter').resolves(adapter);
|
|
164
|
+
runCliStub.resolves(AUGGIE_SENTINELS);
|
|
148
165
|
await (0, executeBeadsBatch_1.executeBeadsBatch)();
|
|
166
|
+
assert.strictEqual(updateStub.callCount, 3, 'all 3 update attempts should be made');
|
|
149
167
|
assert.ok(warnStub.called, 'warning message should be shown on partial failure');
|
|
150
|
-
assert.ok(!errStub.called, 'no hard error
|
|
151
|
-
|
|
152
|
-
|
|
168
|
+
assert.ok(!errStub.called, 'no hard error on partial failure');
|
|
169
|
+
});
|
|
170
|
+
// IT-7 (ps-fix) -----------------------------------------------------------
|
|
171
|
+
test('IT-7: mock PowerShellBeadsAdapter → adapter.update called per bead in batch', async () => {
|
|
172
|
+
const { adapter, updateStub } = buildMockAdapter(FAKE_BEADS);
|
|
173
|
+
// Simulate PS adapter (duck-typed; type is irrelevant to the command)
|
|
174
|
+
sinon.stub(adapterFactory, 'getBeadsAdapter').resolves(adapter);
|
|
175
|
+
runCliStub.resolves(AUGGIE_SENTINELS);
|
|
176
|
+
await (0, executeBeadsBatch_1.executeBeadsBatch)();
|
|
177
|
+
assert.strictEqual(updateStub.callCount, 3, 'IT-7: adapter.update must be called for each bead in the batch');
|
|
178
|
+
assert.ok(infoStub.called, 'success message should be shown');
|
|
153
179
|
});
|
|
154
180
|
});
|
|
155
181
|
//# sourceMappingURL=executeBeadsBatch.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeBeadsBatch.test.js","sourceRoot":"","sources":["../../../src/test/integration/executeBeadsBatch.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"executeBeadsBatch.test.js","sourceRoot":"","sources":["../../../src/test/integration/executeBeadsBatch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
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 generateBeads command (IT-6 — ps-fix test-spec.md)
|
|
38
|
+
*
|
|
39
|
+
* IT-6 Regression: refactored generateBeads with mock ClassicBeadsAdapter →
|
|
40
|
+
* - adapter.create() called once per task heading.
|
|
41
|
+
* - adapter.ready() called exactly once after all creates.
|
|
42
|
+
* - No direct runCli('bd',...) calls remain (verified by asserting cp.spawn
|
|
43
|
+
* is never invoked).
|
|
44
|
+
*
|
|
45
|
+
* Strategy:
|
|
46
|
+
* - Stub getBeadsAdapter module export to return a mock adapter.
|
|
47
|
+
* - Write a real tasks.md in a tmpDir; point workspaceFolders there.
|
|
48
|
+
* - Run generateBeads() and assert mock adapter call counts.
|
|
49
|
+
*/
|
|
50
|
+
const assert = __importStar(require("assert"));
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const os = __importStar(require("os"));
|
|
54
|
+
const sinon = __importStar(require("sinon"));
|
|
55
|
+
const vscode = __importStar(require("vscode"));
|
|
56
|
+
const generateBeads_1 = require("../../commands/generateBeads");
|
|
57
|
+
const adapterFactory = __importStar(require("../../beads/getBeadsAdapter"));
|
|
58
|
+
const runCliModule = __importStar(require("../../utils/runCli"));
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Helpers
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
function stubWorkspace(dir) {
|
|
63
|
+
const orig = Object.getOwnPropertyDescriptor(vscode.workspace, 'workspaceFolders');
|
|
64
|
+
Object.defineProperty(vscode.workspace, 'workspaceFolders', {
|
|
65
|
+
configurable: true,
|
|
66
|
+
get: () => [{ uri: vscode.Uri.file(dir), name: 'test', index: 0 }],
|
|
67
|
+
});
|
|
68
|
+
return () => {
|
|
69
|
+
if (orig) {
|
|
70
|
+
Object.defineProperty(vscode.workspace, 'workspaceFolders', orig);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const READY_BEADS = [
|
|
75
|
+
{ id: 'bd-r1', title: 'Task One', description: 'D1', status: 'open', priority: 2 },
|
|
76
|
+
{ id: 'bd-r2', title: 'Task Two', description: 'D2', status: 'open', priority: 3 },
|
|
77
|
+
];
|
|
78
|
+
/** Build a mock adapter where create/ready are sinon stubs. */
|
|
79
|
+
function buildMockAdapter() {
|
|
80
|
+
let callIndex = 0;
|
|
81
|
+
const ids = ['bd-new1', 'bd-new2'];
|
|
82
|
+
const createStub = sinon.stub().callsFake(async () => ids[callIndex++] ?? 'bd-fallback');
|
|
83
|
+
const readyStub = sinon.stub().resolves(READY_BEADS);
|
|
84
|
+
const adapter = {
|
|
85
|
+
create: createStub,
|
|
86
|
+
ready: readyStub,
|
|
87
|
+
update: sinon.stub().resolves(),
|
|
88
|
+
close: sinon.stub().resolves(),
|
|
89
|
+
search: sinon.stub().resolves([]),
|
|
90
|
+
};
|
|
91
|
+
return { adapter, createStub, readyStub };
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Tests
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
suite('generateBeads — integration tests', () => {
|
|
97
|
+
let tmpDir;
|
|
98
|
+
let restoreWF;
|
|
99
|
+
let infoStub;
|
|
100
|
+
let runCliStub;
|
|
101
|
+
setup(() => {
|
|
102
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'augsdd-gb-'));
|
|
103
|
+
restoreWF = stubWorkspace(tmpDir);
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
105
|
+
infoStub = sinon.stub(vscode.window, 'showInformationMessage').resolves(undefined);
|
|
106
|
+
sinon.stub(vscode.window, 'showErrorMessage').resolves(undefined); // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
107
|
+
// IT-6 regression guard: runCli should never be called when adapter is mocked.
|
|
108
|
+
runCliStub = sinon.stub(runCliModule, 'runCli');
|
|
109
|
+
});
|
|
110
|
+
teardown(() => {
|
|
111
|
+
sinon.restore();
|
|
112
|
+
restoreWF();
|
|
113
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
114
|
+
});
|
|
115
|
+
// Create the tasks.md file structure in tmpDir
|
|
116
|
+
function writeTasksFile(content) {
|
|
117
|
+
const changesDir = path.join(tmpDir, 'openspec', 'changes', 'ch-001');
|
|
118
|
+
fs.mkdirSync(changesDir, { recursive: true });
|
|
119
|
+
fs.writeFileSync(path.join(changesDir, 'tasks.md'), content);
|
|
120
|
+
}
|
|
121
|
+
// IT-6 -------------------------------------------------------------------
|
|
122
|
+
test('IT-6: adapter.create called per task heading; no direct bd spawn', async () => {
|
|
123
|
+
const md = '## Task One\nDo task one\n## Task Two\nDo task two\n';
|
|
124
|
+
writeTasksFile(md);
|
|
125
|
+
const { adapter, createStub, readyStub } = buildMockAdapter();
|
|
126
|
+
sinon.stub(adapterFactory, 'getBeadsAdapter').resolves(adapter);
|
|
127
|
+
await (0, generateBeads_1.generateBeads)();
|
|
128
|
+
assert.strictEqual(createStub.callCount, 2, 'adapter.create should be called once per task heading');
|
|
129
|
+
assert.ok(createStub.calledWith('Task One', 'Do task one'), 'first create call should use the first task');
|
|
130
|
+
assert.ok(createStub.calledWith('Task Two', 'Do task two'), 'second create call should use the second task');
|
|
131
|
+
assert.strictEqual(readyStub.callCount, 1, 'adapter.ready() should be called exactly once after all creates');
|
|
132
|
+
// Regression: no runCli calls when adapter is fully mocked
|
|
133
|
+
assert.strictEqual(runCliStub.callCount, 0, 'IT-6 regression: runCli must NOT be called when adapter is mocked');
|
|
134
|
+
assert.ok(infoStub.called, 'success info message should be shown');
|
|
135
|
+
});
|
|
136
|
+
test('IT-6b: create() failure is non-fatal — remaining tasks still attempted', async () => {
|
|
137
|
+
const md = '## Task A\nBody A\n## Task B\nBody B\n';
|
|
138
|
+
writeTasksFile(md);
|
|
139
|
+
const createStub = sinon.stub();
|
|
140
|
+
createStub.onCall(0).rejects(new Error('network timeout'));
|
|
141
|
+
createStub.onCall(1).resolves('bd-ok');
|
|
142
|
+
const readyStub = sinon.stub().resolves(READY_BEADS);
|
|
143
|
+
const adapter = {
|
|
144
|
+
create: createStub,
|
|
145
|
+
ready: readyStub,
|
|
146
|
+
update: sinon.stub().resolves(),
|
|
147
|
+
close: sinon.stub().resolves(),
|
|
148
|
+
search: sinon.stub().resolves([]),
|
|
149
|
+
};
|
|
150
|
+
sinon.stub(adapterFactory, 'getBeadsAdapter').resolves(adapter);
|
|
151
|
+
await (0, generateBeads_1.generateBeads)();
|
|
152
|
+
assert.strictEqual(createStub.callCount, 2, 'should attempt create for all tasks even after a failure');
|
|
153
|
+
assert.strictEqual(readyStub.callCount, 1, 'ready() should still be called after partial failures');
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=generateBeads.test.js.map
|