@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,241 @@
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.generateOpenSpec = generateOpenSpec;
37
+ /**
38
+ * generateOpenSpec — Bead 5 command implementation.
39
+ *
40
+ * Steps (tasks 5.1–5.7):
41
+ * 5.1 File selection: file-picker dialog with fallback auto-detect from jiraFolder.
42
+ * 5.2 Run `openspec init --tools auggie --force`.
43
+ * 5.3 Retrieve proposal template via `openspec instructions proposal --json`;
44
+ * fallback to `spec` then `tasks`.
45
+ * 5.4 Build Auggie prompt: template + JIRA Markdown (truncate at 8 000 chars).
46
+ * 5.5 Execute `auggie --print --quiet <prompt>`; retry once on empty response.
47
+ * 5.6 Save Auggie output to `openspec/changes/<id>/proposal.md`.
48
+ * 5.7 Run `openspec validate`; surface result as info or error notification.
49
+ */
50
+ const vscode = __importStar(require("vscode"));
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const runCli_1 = require("../utils/runCli");
54
+ const getConfig_1 = require("../utils/getConfig");
55
+ const logger_1 = require("../utils/logger");
56
+ /** Maximum JIRA content characters included in the Auggie prompt (risk D62). */
57
+ const MAX_JIRA_CHARS = 8000;
58
+ /** Entry point registered as `augmentSdd.generateOpenSpec`. */
59
+ async function generateOpenSpec() {
60
+ const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
61
+ if (!workspaceRoot) {
62
+ vscode.window.showErrorMessage('Augment SDD: No workspace folder open.');
63
+ return;
64
+ }
65
+ // 5.1 — Select the JIRA Markdown file.
66
+ const jiraFile = await selectJiraFile(workspaceRoot);
67
+ if (!jiraFile) {
68
+ vscode.window.showInformationMessage('Augment SDD: No file selected. Operation cancelled.');
69
+ return;
70
+ }
71
+ (0, logger_1.log)(`JIRA file selected: ${jiraFile}`);
72
+ // 5.2 — openspec init.
73
+ try {
74
+ await (0, runCli_1.runCli)('openspec', ['init', '--tools', 'auggie', '--force'], workspaceRoot, 60000, logger_1.log);
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : String(err);
78
+ (0, logger_1.log)(`openspec init failed: ${msg}`);
79
+ const action = await vscode.window.showErrorMessage(`Augment SDD: openspec init failed.\n${msg}`, 'View Logs');
80
+ if (action === 'View Logs') {
81
+ (0, logger_1.revealOutputChannel)();
82
+ }
83
+ return;
84
+ }
85
+ // Determine the change directory created by openspec init.
86
+ const changeId = findNewestChangeDir(workspaceRoot);
87
+ if (!changeId) {
88
+ vscode.window.showErrorMessage('Augment SDD: Could not locate an openspec change directory after init.');
89
+ return;
90
+ }
91
+ const changeDir = path.join(workspaceRoot, 'openspec', 'changes', changeId);
92
+ (0, logger_1.log)(`Using openspec change directory: ${changeId}`);
93
+ // 5.3 — Retrieve the proposal template (with fallbacks).
94
+ const template = await fetchProposalTemplate(workspaceRoot);
95
+ // 5.4 — Build the Auggie prompt.
96
+ const jiraRaw = fs.readFileSync(jiraFile, 'utf8');
97
+ let jiraContent = jiraRaw;
98
+ if (jiraRaw.length > MAX_JIRA_CHARS) {
99
+ jiraContent = jiraRaw.slice(0, MAX_JIRA_CHARS) + '\n[...truncated]';
100
+ (0, logger_1.log)(`Warning: JIRA content truncated from ${jiraRaw.length} to ${MAX_JIRA_CHARS} chars`);
101
+ }
102
+ const prompt = template ? `${template}\n\n---\n\n${jiraContent}` : jiraContent;
103
+ // 5.5 — Run Auggie with one retry on empty output.
104
+ let auggieOutput;
105
+ try {
106
+ auggieOutput = await runAuggieWithRetry(workspaceRoot, prompt);
107
+ }
108
+ catch (err) {
109
+ const msg = err instanceof Error ? err.message : String(err);
110
+ (0, logger_1.log)(`Auggie execution failed: ${msg}`);
111
+ const action = await vscode.window.showErrorMessage(`Augment SDD: Auggie failed.\n${msg}`, 'View Logs');
112
+ if (action === 'View Logs') {
113
+ (0, logger_1.revealOutputChannel)();
114
+ }
115
+ return;
116
+ }
117
+ // 5.6 — Save proposal.md.
118
+ const proposalPath = path.join(changeDir, 'proposal.md');
119
+ fs.mkdirSync(changeDir, { recursive: true });
120
+ fs.writeFileSync(proposalPath, auggieOutput, 'utf8');
121
+ (0, logger_1.log)(`Saved proposal.md → ${proposalPath}`);
122
+ // 5.7 — openspec validate.
123
+ try {
124
+ await (0, runCli_1.runCli)('openspec', ['validate'], workspaceRoot, 30000, logger_1.log);
125
+ vscode.window.showInformationMessage(`Augment SDD: OpenSpec generated and validated. Change: ${changeId}`);
126
+ }
127
+ catch (err) {
128
+ const msg = err instanceof Error ? err.message : String(err);
129
+ (0, logger_1.log)(`openspec validate failed: ${msg}`);
130
+ const action = await vscode.window.showErrorMessage(`Augment SDD: OpenSpec generated but validation failed.\n${msg}`, 'View Logs');
131
+ if (action === 'View Logs') {
132
+ (0, logger_1.revealOutputChannel)();
133
+ }
134
+ }
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // Helpers
138
+ // ---------------------------------------------------------------------------
139
+ /**
140
+ * 5.1: Present a file-picker dialog filtered to Markdown files. If exactly one
141
+ * `.md` file exists in the configured `jiraFolder`, auto-select it; if multiple
142
+ * exist, show a Quick Pick; otherwise fall back to the OS open-file dialog.
143
+ */
144
+ async function selectJiraFile(workspaceRoot) {
145
+ const jiraFolder = (0, getConfig_1.getConfig)('jiraFolder', '.jira');
146
+ const jiraDir = path.join(workspaceRoot, jiraFolder);
147
+ if (fs.existsSync(jiraDir)) {
148
+ const mdFiles = fs.readdirSync(jiraDir)
149
+ .filter(f => f.toLowerCase().endsWith('.md'))
150
+ .map(f => path.join(jiraDir, f));
151
+ if (mdFiles.length === 1) {
152
+ (0, logger_1.log)(`Auto-detected JIRA file: ${mdFiles[0]}`);
153
+ return mdFiles[0];
154
+ }
155
+ if (mdFiles.length > 1) {
156
+ const items = mdFiles.map(f => ({ label: path.basename(f), description: f }));
157
+ const pick = await vscode.window.showQuickPick(items, {
158
+ placeHolder: 'Select JIRA Markdown ticket file',
159
+ });
160
+ return pick?.description;
161
+ }
162
+ }
163
+ // Fall back to the OS file-picker dialog.
164
+ const uris = await vscode.window.showOpenDialog({
165
+ canSelectMany: false,
166
+ filters: { 'Markdown': ['md'] },
167
+ title: 'Select JIRA Ticket Markdown File',
168
+ });
169
+ return uris?.[0]?.fsPath;
170
+ }
171
+ /**
172
+ * Return the name of the most-recently-modified directory inside
173
+ * `openspec/changes/` (excluding the `archive` subdirectory).
174
+ * Returns `undefined` when no directories are found.
175
+ */
176
+ function findNewestChangeDir(workspaceRoot) {
177
+ const changesDir = path.join(workspaceRoot, 'openspec', 'changes');
178
+ if (!fs.existsSync(changesDir)) {
179
+ return undefined;
180
+ }
181
+ const dirs = fs.readdirSync(changesDir, { withFileTypes: true })
182
+ .filter(e => e.isDirectory() && e.name !== 'archive')
183
+ .map(e => ({
184
+ name: e.name,
185
+ mtime: fs.statSync(path.join(changesDir, e.name)).mtimeMs,
186
+ }))
187
+ .sort((a, b) => b.mtime - a.mtime);
188
+ return dirs[0]?.name;
189
+ }
190
+ /**
191
+ * 5.3: Try `openspec instructions proposal --json`, then `spec`, then `tasks`.
192
+ * Returns the template string, or an empty string if all attempts fail.
193
+ */
194
+ async function fetchProposalTemplate(workspaceRoot) {
195
+ for (const type of ['proposal', 'spec', 'tasks']) {
196
+ try {
197
+ const raw = await (0, runCli_1.runCli)('openspec', ['instructions', type, '--json'], workspaceRoot, 30000, logger_1.log);
198
+ // The JSON may have a `template` or `content` field; fall back to raw text.
199
+ try {
200
+ const parsed = JSON.parse(raw);
201
+ const tmpl = (parsed['template'] ?? parsed['content'] ?? raw);
202
+ (0, logger_1.log)(`Fetched ${type} template (${String(tmpl).length} chars)`);
203
+ return String(tmpl);
204
+ }
205
+ catch {
206
+ (0, logger_1.log)(`Fetched ${type} template as raw text (${raw.length} chars)`);
207
+ return raw;
208
+ }
209
+ }
210
+ catch {
211
+ (0, logger_1.log)(`openspec instructions ${type} --json failed; trying next fallback`);
212
+ }
213
+ }
214
+ (0, logger_1.log)('Warning: could not retrieve any proposal template; proceeding with JIRA content only');
215
+ return '';
216
+ }
217
+ /**
218
+ * 5.5: Run `auggie --print --quiet <prompt>`, retrying once with a reinforced
219
+ * suffix when the first attempt returns an empty string (design D6).
220
+ */
221
+ async function runAuggieWithRetry(workspaceRoot, prompt) {
222
+ const extraFlags = (0, getConfig_1.getConfig)('auggieExtraFlags', '');
223
+ const buildArgs = (p) => {
224
+ const base = ['--print', '--quiet', p];
225
+ if (extraFlags) {
226
+ base.push(...extraFlags.split(/\s+/).filter(Boolean));
227
+ }
228
+ return base;
229
+ };
230
+ let output = await (0, runCli_1.runCli)('auggie', buildArgs(prompt), workspaceRoot, 300000, logger_1.log);
231
+ if (!output) {
232
+ (0, logger_1.log)('Auggie returned empty output; retrying with reinforced prompt…');
233
+ const retryPrompt = prompt + '\nPlease provide the full output.';
234
+ output = await (0, runCli_1.runCli)('auggie', buildArgs(retryPrompt), workspaceRoot, 300000, logger_1.log);
235
+ if (!output) {
236
+ throw new Error('Auggie returned empty output after retry (max 2 attempts)');
237
+ }
238
+ }
239
+ return output;
240
+ }
241
+ //# sourceMappingURL=generateOpenSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateOpenSpec.js","sourceRoot":"","sources":["../../src/commands/generateOpenSpec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
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.DashboardPanel = void 0;
37
+ /**
38
+ * DashboardPanel — Webview panel for the Augment SDD Dashboard (Bead 10 / bd-d47o).
39
+ *
40
+ * Renders a list of ready Beads fetched from `bd ready --json`.
41
+ * Provides "Run Next Batch" (triggers augmentSdd.executeBeadsBatch then refreshes)
42
+ * and "Refresh" (re-fetches and re-renders) buttons.
43
+ *
44
+ * The singleton is kept alive as long as the panel is visible.
45
+ * Callers: fullPipeline.ts (opens after each pipeline step when enabled).
46
+ */
47
+ const vscode = __importStar(require("vscode"));
48
+ const runCli_1 = require("../utils/runCli");
49
+ const logger_1 = require("../utils/logger");
50
+ class DashboardPanel {
51
+ // ---------------------------------------------------------------------------
52
+ // Public API
53
+ // ---------------------------------------------------------------------------
54
+ /**
55
+ * Open (or reveal + refresh) the Augment SDD Dashboard.
56
+ * Safe to call multiple times; only one panel is ever open.
57
+ */
58
+ static show(workspaceRoot) {
59
+ if (DashboardPanel._current) {
60
+ DashboardPanel._current._panel.reveal(vscode.ViewColumn.Two);
61
+ DashboardPanel._current._workspaceRoot = workspaceRoot;
62
+ DashboardPanel._current._refresh().catch(e => (0, logger_1.log)(`DashboardPanel.refresh error: ${String(e)}`));
63
+ return;
64
+ }
65
+ const panel = vscode.window.createWebviewPanel(DashboardPanel.viewType, 'Augment SDD Dashboard', vscode.ViewColumn.Two, { enableScripts: true, retainContextWhenHidden: true });
66
+ DashboardPanel._current = new DashboardPanel(panel, workspaceRoot);
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Constructor
70
+ // ---------------------------------------------------------------------------
71
+ constructor(panel, workspaceRoot) {
72
+ this._disposables = [];
73
+ this._panel = panel;
74
+ this._workspaceRoot = workspaceRoot;
75
+ // Initial render
76
+ this._refresh().catch(e => (0, logger_1.log)(`DashboardPanel initial render error: ${String(e)}`));
77
+ // Dispose when the user closes the panel
78
+ this._panel.onDidDispose(() => this._dispose(), null, this._disposables);
79
+ // Handle messages sent from the webview script
80
+ this._panel.webview.onDidReceiveMessage(async (message) => {
81
+ if (message.command === 'runBatch') {
82
+ (0, logger_1.log)('DashboardPanel: Run Next Batch clicked');
83
+ await vscode.commands.executeCommand('augmentSdd.executeBeadsBatch');
84
+ await this._refresh();
85
+ }
86
+ else if (message.command === 'refresh') {
87
+ (0, logger_1.log)('DashboardPanel: Refresh clicked');
88
+ await this._refresh();
89
+ }
90
+ }, null, this._disposables);
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Private helpers
94
+ // ---------------------------------------------------------------------------
95
+ _dispose() {
96
+ DashboardPanel._current = undefined;
97
+ this._panel.dispose();
98
+ for (const d of this._disposables) {
99
+ d.dispose();
100
+ }
101
+ this._disposables.length = 0;
102
+ }
103
+ /** Fetch beads and re-render the webview HTML. */
104
+ async _refresh() {
105
+ let beads = [];
106
+ try {
107
+ const raw = await (0, runCli_1.runCli)('bd', ['ready', '--json'], this._workspaceRoot, 30000, logger_1.log);
108
+ beads = JSON.parse(raw);
109
+ }
110
+ catch (err) {
111
+ (0, logger_1.log)(`DashboardPanel: failed to fetch ready beads — ${err instanceof Error ? err.message : String(err)}`);
112
+ }
113
+ this._panel.webview.html = this._buildHtml(beads);
114
+ }
115
+ _buildHtml(beads) {
116
+ const cards = beads.length > 0
117
+ ? beads.map(b => `
118
+ <div class="card">
119
+ <span class="bead-id">${esc(b.id)}</span>
120
+ <div class="bead-title">${esc(b.title)}</div>
121
+ <div class="bead-desc">${esc(b.description)}</div>
122
+ </div>`).join('')
123
+ : '<p class="empty">No beads ready.</p>';
124
+ return `<!DOCTYPE html>
125
+ <html lang="en">
126
+ <head>
127
+ <meta charset="UTF-8">
128
+ <meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline';">
129
+ <title>Augment SDD Dashboard</title>
130
+ <style>
131
+ body { font-family: var(--vscode-font-family); color: var(--vscode-foreground); padding: 16px; margin: 0; }
132
+ h1 { font-size: 1.1em; margin-bottom: 10px; }
133
+ .actions { margin-bottom: 14px; }
134
+ button { margin-right: 8px; padding: 5px 14px; cursor: pointer;
135
+ background: var(--vscode-button-background); color: var(--vscode-button-foreground);
136
+ border: none; border-radius: 2px; }
137
+ button:hover { background: var(--vscode-button-hoverBackground); }
138
+ .card { border: 1px solid var(--vscode-panel-border); border-radius: 4px;
139
+ padding: 10px 14px; margin-bottom: 8px; }
140
+ .bead-id { font-size: 0.8em; color: var(--vscode-descriptionForeground); }
141
+ .bead-title { font-weight: bold; margin: 3px 0; }
142
+ .bead-desc { font-size: 0.9em; }
143
+ .empty { color: var(--vscode-descriptionForeground); }
144
+ </style>
145
+ </head>
146
+ <body>
147
+ <h1>Augment SDD Dashboard</h1>
148
+ <div class="actions">
149
+ <button onclick="post('runBatch')">Run Next Batch</button>
150
+ <button onclick="post('refresh')">Refresh</button>
151
+ </div>
152
+ <div id="beads">${cards}</div>
153
+ <script>
154
+ const vscode = acquireVsCodeApi();
155
+ function post(cmd) { vscode.postMessage({ command: cmd }); }
156
+ </script>
157
+ </body>
158
+ </html>`;
159
+ }
160
+ }
161
+ exports.DashboardPanel = DashboardPanel;
162
+ DashboardPanel.viewType = 'augmentSddDashboard';
163
+ /** Minimal HTML entity escaping to prevent XSS in bead data. */
164
+ function esc(text) {
165
+ return text
166
+ .replace(/&/g, '&amp;')
167
+ .replace(/</g, '&lt;')
168
+ .replace(/>/g, '&gt;')
169
+ .replace(/"/g, '&quot;');
170
+ }
171
+ //# sourceMappingURL=DashboardPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardPanel.js","sourceRoot":"","sources":["../../src/dashboard/DashboardPanel.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,+CAAiC;AACjC,4CAAyC;AACzC,4CAAsC;AAStC,MAAa,cAAc;IAQzB,8EAA8E;IAC9E,aAAa;IACb,8EAA8E;IAE9E;;;OAGG;IACI,MAAM,CAAC,IAAI,CAAC,aAAqB;QACtC,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC5B,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7D,cAAc,CAAC,QAAQ,CAAC,cAAc,GAAG,aAAa,CAAC;YACvD,cAAc,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAC3C,IAAA,YAAG,EAAC,iCAAiC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAClD,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAC5C,cAAc,CAAC,QAAQ,EACvB,uBAAuB,EACvB,MAAM,CAAC,UAAU,CAAC,GAAG,EACrB,EAAE,aAAa,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,CACvD,CAAC;QAEF,cAAc,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACrE,CAAC;IAED,8EAA8E;IAC9E,cAAc;IACd,8EAA8E;IAE9E,YAAoB,KAA0B,EAAE,aAAqB;QAlCpD,iBAAY,GAAwB,EAAE,CAAC;QAmCtD,IAAI,CAAC,MAAM,GAAY,KAAK,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAI,aAAa,CAAC;QAErC,iBAAiB;QACjB,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,YAAG,EAAC,wCAAwC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErF,yCAAyC;QACzC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAEzE,+CAA+C;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CACrC,KAAK,EAAE,OAA4B,EAAE,EAAE;YACrC,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACnC,IAAA,YAAG,EAAC,wCAAwC,CAAC,CAAC;gBAC9C,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC;gBACrE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC;iBAAM,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACzC,IAAA,YAAG,EAAC,iCAAiC,CAAC,CAAC;gBACvC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,EACD,IAAI,EACJ,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,QAAQ;QACd,cAAc,CAAC,QAAQ,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QACnD,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,kDAAkD;IAC1C,KAAK,CAAC,QAAQ;QACpB,IAAI,KAAK,GAAgB,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAA,eAAM,EAAC,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,KAAM,EAAE,YAAG,CAAC,CAAC;YACtF,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,YAAG,EAAC,iDAAiD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAEO,UAAU,CAAC,KAAkB;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;YAC5B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;kCAEW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oCACP,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;mCACb,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;eACtC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,CAAC,CAAC,sCAAsC,CAAC;QAE3C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA4BS,KAAK;;;;;;QAMjB,CAAC;IACP,CAAC;;AAvIH,wCAwIC;AAvIwB,uBAAQ,GAAG,qBAAqB,AAAxB,CAAyB;AAyI1D,gEAAgE;AAChE,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,96 @@
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.activate = activate;
37
+ exports.deactivate = deactivate;
38
+ const vscode = __importStar(require("vscode"));
39
+ const logger_1 = require("./utils/logger");
40
+ const detectCli_1 = require("./utils/detectCli");
41
+ const generateOpenSpec_1 = require("./commands/generateOpenSpec");
42
+ const generateBeads_1 = require("./commands/generateBeads");
43
+ const executeBeadsBatch_1 = require("./commands/executeBeadsBatch");
44
+ const fullPipeline_1 = require("./commands/fullPipeline");
45
+ /** CLI definitions: name on PATH and the npm package to install if missing. */
46
+ const REQUIRED_CLIS = [
47
+ { name: 'auggie', pkg: 'auggie' },
48
+ { name: 'openspec', pkg: 'openspec' },
49
+ { name: 'bd', pkg: '@beads/cli' },
50
+ ];
51
+ /**
52
+ * Run CLI presence checks on activation. For each missing CLI, show an error
53
+ * message with the exact `npm install -g <pkg>` command and a "View Logs" button.
54
+ */
55
+ async function checkRequiredClis() {
56
+ for (const { name, pkg } of REQUIRED_CLIS) {
57
+ const found = await (0, detectCli_1.detectCli)(name);
58
+ if (!found) {
59
+ (0, logger_1.log)(`CLI not found on PATH: ${name} (install with: npm install -g ${pkg})`);
60
+ const action = await vscode.window.showErrorMessage(`Augment SDD: Required CLI "${name}" not found. Install it with: npm install -g ${pkg}`, 'View Logs');
61
+ if (action === 'View Logs') {
62
+ (0, logger_1.revealOutputChannel)();
63
+ }
64
+ }
65
+ else {
66
+ (0, logger_1.log)(`CLI detected: ${name}`);
67
+ }
68
+ }
69
+ }
70
+ function activate(context) {
71
+ // Create the Output Channel first and initialise the shared logger so all
72
+ // subsequent code (including commands) can call log() / revealOutputChannel().
73
+ const outputChannel = vscode.window.createOutputChannel('Augment SDD');
74
+ (0, logger_1.initLogger)(outputChannel);
75
+ context.subscriptions.push(outputChannel);
76
+ (0, logger_1.log)('Augment SDD extension activating…');
77
+ // Run CLI detection (non-blocking — failures are surfaced as error messages).
78
+ checkRequiredClis().catch(err => {
79
+ (0, logger_1.log)(`CLI detection error: ${String(err)}`);
80
+ });
81
+ // Register commands (implementations wired in subsequent beads).
82
+ context.subscriptions.push(vscode.commands.registerCommand('augmentSdd.generateOpenSpec', async () => {
83
+ await (0, generateOpenSpec_1.generateOpenSpec)();
84
+ }), vscode.commands.registerCommand('augmentSdd.generateBeads', async () => {
85
+ await (0, generateBeads_1.generateBeads)();
86
+ }), vscode.commands.registerCommand('augmentSdd.executeBeadsBatch', async () => {
87
+ await (0, executeBeadsBatch_1.executeBeadsBatch)();
88
+ }), vscode.commands.registerCommand('augmentSdd.fullPipeline', async () => {
89
+ await (0, fullPipeline_1.fullPipeline)();
90
+ }));
91
+ (0, logger_1.log)('Augment SDD extension activated.');
92
+ }
93
+ function deactivate() {
94
+ // Nothing to clean up; subscriptions are disposed automatically.
95
+ }
96
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,4BAkCC;AAED,gCAEC;AA3ED,+CAAiC;AACjC,2CAAsE;AACtE,iDAA8C;AAC9C,kEAA+D;AAC/D,4DAAyD;AACzD,oEAAiE;AACjE,0DAAuD;AAEvD,+EAA+E;AAC/E,MAAM,aAAa,GAAoC;IACrD,EAAE,IAAI,EAAE,QAAQ,EAAI,GAAG,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE;IACrC,EAAE,IAAI,EAAE,IAAI,EAAQ,GAAG,EAAE,YAAY,EAAE;CACxC,CAAC;AAEF;;;GAGG;AACH,KAAK,UAAU,iBAAiB;IAC9B,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAS,EAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAA,YAAG,EAAC,0BAA0B,IAAI,kCAAkC,GAAG,GAAG,CAAC,CAAC;YAC5E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CACjD,8BAA8B,IAAI,gDAAgD,GAAG,EAAE,EACvF,WAAW,CACZ,CAAC;YACF,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC3B,IAAA,4BAAmB,GAAE,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAA,YAAG,EAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,QAAQ,CAAC,OAAgC;IACvD,0EAA0E;IAC1E,+EAA+E;IAC/E,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACvE,IAAA,mBAAU,EAAC,aAAa,CAAC,CAAC;IAC1B,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE1C,IAAA,YAAG,EAAC,mCAAmC,CAAC,CAAC;IAEzC,8EAA8E;IAC9E,iBAAiB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QAC9B,IAAA,YAAG,EAAC,wBAAwB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,OAAO,CAAC,aAAa,CAAC,IAAI,CACxB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,IAAA,mCAAgB,GAAE,CAAC;IAC3B,CAAC,CAAC,EAEF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,IAAA,6BAAa,GAAE,CAAC;IACxB,CAAC,CAAC,EAEF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,IAAA,qCAAiB,GAAE,CAAC;IAC5B,CAAC,CAAC,EAEF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,IAAA,2BAAY,GAAE,CAAC;IACvB,CAAC,CAAC,CACH,CAAC;IAEF,IAAA,YAAG,EAAC,kCAAkC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,UAAU;IACxB,iEAAiE;AACnE,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * parseBeadUpdates — Sentinel line parser for Bead 7.
4
+ *
5
+ * Extracts all lines that match the Auggie completion sentinel format
6
+ * from a free-form text response. Each matched line can be executed
7
+ * directly as a CLI command via runCli.
8
+ *
9
+ * Design D4: Sentinel-based parsing is format-agnostic — it works
10
+ * regardless of how much prose Auggie wraps around the commands.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.parseBeadUpdates = parseBeadUpdates;
14
+ /**
15
+ * Extract all `bd update <ID> --status done` lines from Auggie output.
16
+ *
17
+ * @param output Raw text returned by `auggie --print --quiet`.
18
+ * @returns Array of matched command strings (may be empty).
19
+ *
20
+ * @example
21
+ * parseBeadUpdates('done\nbd update bd-abc --status done\nmore text')
22
+ * // => ['bd update bd-abc --status done']
23
+ */
24
+ function parseBeadUpdates(output) {
25
+ const matches = [...output.matchAll(/^bd update \S+ --status done$/gm)];
26
+ return matches.map(m => m[0]);
27
+ }
28
+ //# sourceMappingURL=parseBeadUpdates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBeadUpdates.js","sourceRoot":"","sources":["../../src/parsers/parseBeadUpdates.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAYH,4CAGC;AAbD;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * parseTasksMarkdown — heading-based task extractor for Auggie-generated tasks.md.
4
+ *
5
+ * Design (D3): Uses a deterministic heading-based regex (`/^#{1,3}\s+(.+)/gm`)
6
+ * to extract task titles and their body text. No external parser dependency is
7
+ * required; Auggie's structured output is regular enough for this approach.
8
+ *
9
+ * Each H1–H3 heading becomes a Bead title; the body text between that heading
10
+ * and the next heading (or EOF) becomes the Bead description.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.parseTasksMarkdown = parseTasksMarkdown;
14
+ /**
15
+ * Parse `content` (the raw text of a `tasks.md` file) into an ordered array of
16
+ * `{ title, description }` objects.
17
+ *
18
+ * - Recognises H1, H2, and H3 headings (`#`, `##`, `###`).
19
+ * - The heading line itself is the title; everything after it up to the next
20
+ * heading (or end-of-file) is the description (whitespace-trimmed).
21
+ * - Returns an empty array when no headings are found.
22
+ *
23
+ * @param content Raw markdown text of a `tasks.md` file.
24
+ */
25
+ function parseTasksMarkdown(content) {
26
+ const headingRegex = /^#{1,3}\s+(.+)/gm;
27
+ const tasks = [];
28
+ // Collect all heading positions and titles in one pass.
29
+ const positions = [];
30
+ let match;
31
+ while ((match = headingRegex.exec(content)) !== null) {
32
+ positions.push({ index: match.index, title: match[1].trim() });
33
+ }
34
+ // For each heading, extract the body as everything between its start and the
35
+ // start of the next heading (or end-of-file).
36
+ for (let i = 0; i < positions.length; i++) {
37
+ const { index, title } = positions[i];
38
+ const nextIndex = i + 1 < positions.length ? positions[i + 1].index : content.length;
39
+ // Slice the segment, skip the heading line itself, then trim whitespace.
40
+ const segment = content.slice(index, nextIndex);
41
+ const firstNewline = segment.indexOf('\n');
42
+ const description = firstNewline >= 0
43
+ ? segment.slice(firstNewline + 1).trim()
44
+ : '';
45
+ tasks.push({ title, description });
46
+ }
47
+ return tasks;
48
+ }
49
+ //# sourceMappingURL=parseTasksMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTasksMarkdown.js","sourceRoot":"","sources":["../../src/parsers/parseTasksMarkdown.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAqBH,gDA6BC;AAxCD;;;;;;;;;;GAUG;AACH,SAAgB,kBAAkB,CAAC,OAAe;IAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC;IACxC,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,wDAAwD;IACxD,MAAM,SAAS,GAA4C,EAAE,CAAC;IAC9D,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrD,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,6EAA6E;IAC7E,8CAA8C;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAErF,yEAAyE;QACzE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,YAAY,IAAI,CAAC;YACnC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;YACxC,CAAC,CAAC,EAAE,CAAC;QAEP,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}