aspectcode 0.3.0 → 0.3.2
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/bin/aspectcode.js +3 -0
- package/dist/cli.d.ts +5 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/complaintProcessor.d.ts +16 -0
- package/dist/complaintProcessor.d.ts.map +1 -0
- package/dist/complaintProcessor.js +134 -0
- package/dist/complaintProcessor.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +34 -2
- package/dist/main.js.map +1 -1
- package/dist/optimize.d.ts +7 -1
- package/dist/optimize.d.ts.map +1 -1
- package/dist/optimize.js +26 -5
- package/dist/optimize.js.map +1 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +85 -17
- package/dist/pipeline.js.map +1 -1
- package/dist/ui/Dashboard.d.ts +12 -0
- package/dist/ui/Dashboard.d.ts.map +1 -0
- package/dist/ui/Dashboard.js +162 -0
- package/dist/ui/Dashboard.js.map +1 -0
- package/dist/ui/inkLogger.d.ts +20 -0
- package/dist/ui/inkLogger.d.ts.map +1 -0
- package/dist/ui/inkLogger.js +42 -0
- package/dist/ui/inkLogger.js.map +1 -0
- package/dist/ui/prompts.d.ts +19 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +125 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/store.d.ts +60 -0
- package/dist/ui/store.d.ts.map +1 -0
- package/dist/ui/store.js +104 -0
- package/dist/ui/store.js.map +1 -0
- package/dist/ui/theme.d.ts +27 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +41 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/workspace.d.ts +2 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +3 -2
- package/dist/workspace.js.map +1 -1
- package/dist/writer.d.ts +18 -4
- package/dist/writer.d.ts.map +1 -1
- package/dist/writer.js +49 -5
- package/dist/writer.js.map +1 -1
- package/node_modules/@aspectcode/core/package.json +1 -1
- package/node_modules/@aspectcode/emitters/package.json +2 -2
- package/node_modules/@aspectcode/optimizer/dist/agent.d.ts +9 -1
- package/node_modules/@aspectcode/optimizer/dist/agent.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/agent.js +38 -0
- package/node_modules/@aspectcode/optimizer/dist/agent.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/index.d.ts +3 -3
- package/node_modules/@aspectcode/optimizer/dist/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/index.js +4 -1
- package/node_modules/@aspectcode/optimizer/dist/index.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/prompts.d.ts +12 -0
- package/node_modules/@aspectcode/optimizer/dist/prompts.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/prompts.js +55 -0
- package/node_modules/@aspectcode/optimizer/dist/prompts.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/anthropic.js +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/anthropic.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/openai.js +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/openai.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/types.d.ts +24 -0
- package/node_modules/@aspectcode/optimizer/dist/types.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/types.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/package.json +1 -1
- package/node_modules/dotenv/CHANGELOG.md +520 -0
- package/node_modules/dotenv/LICENSE +23 -0
- package/node_modules/dotenv/README-es.md +411 -0
- package/node_modules/dotenv/README.md +645 -0
- package/node_modules/dotenv/SECURITY.md +1 -0
- package/node_modules/dotenv/config.d.ts +1 -0
- package/node_modules/dotenv/config.js +9 -0
- package/node_modules/dotenv/lib/cli-options.js +17 -0
- package/node_modules/dotenv/lib/env-options.js +28 -0
- package/node_modules/dotenv/lib/main.d.ts +162 -0
- package/node_modules/dotenv/lib/main.js +386 -0
- package/node_modules/dotenv/package.json +62 -0
- package/package.json +12 -5
package/dist/pipeline.js
CHANGED
|
@@ -56,6 +56,9 @@ const kbBuilder_1 = require("./kbBuilder");
|
|
|
56
56
|
const toolIngestion_1 = require("./toolIngestion");
|
|
57
57
|
const writer_1 = require("./writer");
|
|
58
58
|
const optimize_1 = require("./optimize");
|
|
59
|
+
const complaintProcessor_1 = require("./complaintProcessor");
|
|
60
|
+
const prompts_1 = require("./ui/prompts");
|
|
61
|
+
const store_1 = require("./ui/store");
|
|
59
62
|
// ── Watch constants ──────────────────────────────────────────
|
|
60
63
|
const DEBOUNCE_MS = 2000;
|
|
61
64
|
const IGNORED_SEGMENTS = [
|
|
@@ -72,22 +75,25 @@ function isSupportedSourceFile(filePath) {
|
|
|
72
75
|
return core_1.SUPPORTED_EXTENSIONS.includes(ext);
|
|
73
76
|
}
|
|
74
77
|
// ── Single pipeline run ──────────────────────────────────────
|
|
75
|
-
async function runOnce(ctx) {
|
|
78
|
+
async function runOnce(ctx, ownership) {
|
|
76
79
|
const { root, flags, log } = ctx;
|
|
77
80
|
const config = (0, config_1.loadConfig)(root);
|
|
78
81
|
const startMs = Date.now();
|
|
82
|
+
store_1.store.resetRun();
|
|
79
83
|
// ── 1. Discover & read files ──────────────────────────────
|
|
80
|
-
|
|
84
|
+
store_1.store.setPhase('discovering');
|
|
85
|
+
const workspace = await (0, workspace_1.loadWorkspaceFiles)(root, config, log, { quiet: flags.quiet, spin: ctx.spin });
|
|
81
86
|
if (workspace.discoveredPaths.length === 0) {
|
|
82
87
|
log.warn('No source files found. Check your workspace or exclude patterns.');
|
|
83
|
-
return cli_1.ExitCode.ERROR;
|
|
88
|
+
return { code: cli_1.ExitCode.ERROR, kbContent: '' };
|
|
84
89
|
}
|
|
85
90
|
// ── 2. Analyze ────────────────────────────────────────────
|
|
86
|
-
const spinAnalyze =
|
|
91
|
+
const spinAnalyze = ctx.spin('Analyzing…', 'analyzing');
|
|
87
92
|
const model = await (0, core_1.analyzeRepoWithDependencies)(root, workspace.relativeFiles, workspace.absoluteFiles, workspace.host);
|
|
88
93
|
spinAnalyze.stop(`Analyzed ${model.files.length} files, ${model.graph.edges.length} edges`);
|
|
94
|
+
store_1.store.setStats(model.files.length, model.graph.edges.length);
|
|
89
95
|
// ── 3. Build KB content in memory ─────────────────────────
|
|
90
|
-
const spinKb =
|
|
96
|
+
const spinKb = ctx.spin('Building knowledge base…', 'building-kb');
|
|
91
97
|
const kbContent = (0, kbBuilder_1.buildKbContent)(model, root, workspace.relativeFiles);
|
|
92
98
|
spinKb.stop('Knowledge base built');
|
|
93
99
|
// ── 4. Read other AI tool instruction files ───────────────
|
|
@@ -97,43 +103,83 @@ async function runOnce(ctx) {
|
|
|
97
103
|
log.debug(`Read ${toolInstructions.size} AI tool instruction file(s) as context`);
|
|
98
104
|
}
|
|
99
105
|
// ── 5. Optimize or fallback ───────────────────────────────
|
|
100
|
-
|
|
106
|
+
store_1.store.setPhase('optimizing');
|
|
107
|
+
const optimizeResult = await (0, optimize_1.tryOptimize)(ctx, kbContent, toolInstructions, config);
|
|
101
108
|
// ── 6. Write AGENTS.md ────────────────────────────────────
|
|
109
|
+
store_1.store.setPhase('writing');
|
|
102
110
|
if (flags.dryRun) {
|
|
103
111
|
log.info(logger_1.fmt.bold('Dry run — proposed AGENTS.md:'));
|
|
104
112
|
log.blank();
|
|
105
|
-
console.log(
|
|
113
|
+
console.log(optimizeResult.content);
|
|
106
114
|
log.blank();
|
|
107
115
|
}
|
|
108
116
|
else {
|
|
109
|
-
await (0, writer_1.writeAgentsMd)(host, root,
|
|
110
|
-
const
|
|
111
|
-
|
|
117
|
+
await (0, writer_1.writeAgentsMd)(host, root, optimizeResult.content, ownership);
|
|
118
|
+
const modeLabel = ownership === 'section' ? ' (section)' : '';
|
|
119
|
+
const verb = optimizeResult.reasoning.length > 0 ? 'updated' : 'written';
|
|
120
|
+
store_1.store.addOutput(`AGENTS.md ${verb}${modeLabel}`);
|
|
121
|
+
log.success(`AGENTS.md ${verb}${modeLabel}`);
|
|
112
122
|
}
|
|
113
123
|
// ── 7. Optionally write kb.md ─────────────────────────────
|
|
114
124
|
if (flags.kb && !flags.dryRun) {
|
|
115
125
|
await (0, writer_1.writeKbMd)(host, root, kbContent);
|
|
126
|
+
store_1.store.addOutput('kb.md written');
|
|
116
127
|
log.success('kb.md written');
|
|
117
128
|
}
|
|
118
129
|
const elapsedMs = Date.now() - startMs;
|
|
130
|
+
store_1.store.setElapsed(`${(elapsedMs / 1000).toFixed(1)}s`);
|
|
131
|
+
store_1.store.setPhase('done');
|
|
119
132
|
log.info(logger_1.fmt.dim(`Done in ${(elapsedMs / 1000).toFixed(1)}s`));
|
|
120
|
-
return cli_1.ExitCode.OK;
|
|
133
|
+
return { code: cli_1.ExitCode.OK, kbContent };
|
|
121
134
|
}
|
|
122
135
|
// ── Pipeline entry point ─────────────────────────────────────
|
|
123
136
|
async function runPipeline(ctx) {
|
|
124
137
|
const { root, flags, log } = ctx;
|
|
125
138
|
log.info(`${logger_1.fmt.bold('aspectcode')} — ${logger_1.fmt.cyan(root)}`);
|
|
126
139
|
log.blank();
|
|
140
|
+
// ── Resolve AGENTS.md ownership mode ─────────────────────
|
|
141
|
+
const config = (0, config_1.loadConfig)(root);
|
|
142
|
+
let ownership = config?.ownership ?? 'full';
|
|
143
|
+
// If AGENTS.md exists and we haven't stored a preference yet, ask
|
|
144
|
+
if (!config?.ownership) {
|
|
145
|
+
try {
|
|
146
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
147
|
+
const agentsPath = path.join(root, 'AGENTS.md');
|
|
148
|
+
if (fs.existsSync(agentsPath)) {
|
|
149
|
+
const existing = fs.readFileSync(agentsPath, 'utf-8');
|
|
150
|
+
if (!(0, writer_1.hasMarkers)(existing)) {
|
|
151
|
+
const idx = await (0, prompts_1.selectPrompt)('AGENTS.md already exists. How should AspectCode manage it?', ['Replace entire file (full ownership)', 'Own a section (preserve your content)'], 0);
|
|
152
|
+
ownership = idx === 1 ? 'section' : 'full';
|
|
153
|
+
(0, config_1.saveConfig)(root, { ownership });
|
|
154
|
+
log.info(logger_1.fmt.dim(`Saved preference → ${ownership} mode`));
|
|
155
|
+
log.blank();
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
ownership = 'section';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Non-interactive or read error — default to full
|
|
164
|
+
}
|
|
165
|
+
}
|
|
127
166
|
// ── Initial run ──────────────────────────────────────────
|
|
128
|
-
const
|
|
129
|
-
if (code !== cli_1.ExitCode.OK)
|
|
130
|
-
return code;
|
|
131
|
-
//
|
|
132
|
-
|
|
167
|
+
const result = await runOnce(ctx, ownership);
|
|
168
|
+
if (result.code !== cli_1.ExitCode.OK)
|
|
169
|
+
return result.code;
|
|
170
|
+
// Keep track of latest KB for complaint processing
|
|
171
|
+
let latestKb = result.kbContent;
|
|
172
|
+
// ── --once: process any queued complaints, then exit ──────
|
|
173
|
+
if (flags.once) {
|
|
174
|
+
if (store_1.store.state.complaintQueue.length > 0) {
|
|
175
|
+
await (0, complaintProcessor_1.processComplaints)(ctx, ownership, latestKb);
|
|
176
|
+
}
|
|
133
177
|
return cli_1.ExitCode.OK;
|
|
178
|
+
}
|
|
134
179
|
// ── Watch mode ────────────────────────────────────────────
|
|
135
180
|
log.blank();
|
|
136
181
|
log.info(logger_1.fmt.dim('Watching for changes… (Ctrl+C to stop)'));
|
|
182
|
+
store_1.store.setPhase('watching');
|
|
137
183
|
const chokidarModule = await Promise.resolve().then(() => __importStar(require('chokidar')));
|
|
138
184
|
const chokidar = chokidarModule.default ?? chokidarModule;
|
|
139
185
|
const watcher = chokidar.watch('.', {
|
|
@@ -160,7 +206,11 @@ async function runPipeline(ctx) {
|
|
|
160
206
|
try {
|
|
161
207
|
log.blank();
|
|
162
208
|
log.info(`${logger_1.fmt.bold('change detected:')} ${reason}`);
|
|
163
|
-
|
|
209
|
+
store_1.store.setLastChange(reason);
|
|
210
|
+
const runResult = await runOnce(ctx, ownership);
|
|
211
|
+
if (runResult.kbContent)
|
|
212
|
+
latestKb = runResult.kbContent;
|
|
213
|
+
store_1.store.setPhase('watching');
|
|
164
214
|
}
|
|
165
215
|
catch (error) {
|
|
166
216
|
const msg = error instanceof Error ? error.message : String(error);
|
|
@@ -191,11 +241,29 @@ async function runPipeline(ctx) {
|
|
|
191
241
|
watcher.on('error', (e) => log.error(`Watcher error: ${String(e)}`));
|
|
192
242
|
await new Promise((resolve) => watcher.once('ready', resolve));
|
|
193
243
|
log.info(logger_1.fmt.dim('Watcher ready.'));
|
|
244
|
+
// ── Complaint polling — check for queued complaints periodically ──
|
|
245
|
+
const COMPLAINT_POLL_MS = 500;
|
|
246
|
+
const complaintPoll = setInterval(async () => {
|
|
247
|
+
if (stopped || running || store_1.store.state.complaintQueue.length === 0)
|
|
248
|
+
return;
|
|
249
|
+
running = true;
|
|
250
|
+
try {
|
|
251
|
+
await (0, complaintProcessor_1.processComplaints)(ctx, ownership, latestKb);
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
255
|
+
log.error(`Complaint processing failed: ${msg}`);
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
running = false;
|
|
259
|
+
}
|
|
260
|
+
}, COMPLAINT_POLL_MS);
|
|
194
261
|
return await new Promise((resolve) => {
|
|
195
262
|
const shutdown = async (signal) => {
|
|
196
263
|
if (stopped)
|
|
197
264
|
return;
|
|
198
265
|
stopped = true;
|
|
266
|
+
clearInterval(complaintPoll);
|
|
199
267
|
if (timer) {
|
|
200
268
|
clearTimeout(timer);
|
|
201
269
|
timer = undefined;
|
package/dist/pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard — condensed ink-based CLI dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Layout:
|
|
5
|
+
* Banner
|
|
6
|
+
* Status line (spinner/icon + phase + stats)
|
|
7
|
+
* [Detail] (change trigger, outputs, warning, reasoning)
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
declare const Dashboard: React.FC;
|
|
11
|
+
export default Dashboard;
|
|
12
|
+
//# sourceMappingURL=Dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard.d.ts","sourceRoot":"","sources":["../../src/ui/Dashboard.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AA0DnD,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAmItB,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard — condensed ink-based CLI dashboard.
|
|
4
|
+
*
|
|
5
|
+
* Layout:
|
|
6
|
+
* Banner
|
|
7
|
+
* Status line (spinner/icon + phase + stats)
|
|
8
|
+
* [Detail] (change trigger, outputs, warning, reasoning)
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
const react_1 = __importStar(require("react"));
|
|
45
|
+
const ink_1 = require("ink");
|
|
46
|
+
const theme_1 = require("./theme");
|
|
47
|
+
const store_1 = require("./store");
|
|
48
|
+
// ── Spinner ──────────────────────────────────────────────────
|
|
49
|
+
const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
50
|
+
function useSpinner(active) {
|
|
51
|
+
const [frame, setFrame] = (0, react_1.useState)(0);
|
|
52
|
+
(0, react_1.useEffect)(() => {
|
|
53
|
+
if (!active)
|
|
54
|
+
return;
|
|
55
|
+
const id = setInterval(() => setFrame((f) => (f + 1) % FRAMES.length), 80);
|
|
56
|
+
return () => clearInterval(id);
|
|
57
|
+
}, [active]);
|
|
58
|
+
return FRAMES[frame];
|
|
59
|
+
}
|
|
60
|
+
// ── Phase labels ─────────────────────────────────────────────
|
|
61
|
+
const PHASE_TEXT = {
|
|
62
|
+
idle: 'Starting…',
|
|
63
|
+
discovering: 'Discovering files…',
|
|
64
|
+
analyzing: 'Analyzing…',
|
|
65
|
+
'building-kb': 'Building knowledge base…',
|
|
66
|
+
optimizing: 'Optimizing…',
|
|
67
|
+
writing: 'Writing…',
|
|
68
|
+
watching: 'Watching',
|
|
69
|
+
done: 'Done',
|
|
70
|
+
error: 'Error',
|
|
71
|
+
};
|
|
72
|
+
const WORKING = new Set([
|
|
73
|
+
'idle', 'discovering', 'analyzing', 'building-kb', 'optimizing', 'writing',
|
|
74
|
+
]);
|
|
75
|
+
// ── Stats string ─────────────────────────────────────────────
|
|
76
|
+
function statsText(s) {
|
|
77
|
+
const parts = [];
|
|
78
|
+
if (s.fileCount > 0)
|
|
79
|
+
parts.push(`${s.fileCount} files`);
|
|
80
|
+
if (s.edgeCount > 0)
|
|
81
|
+
parts.push(`${s.edgeCount} edges`);
|
|
82
|
+
if (s.provider)
|
|
83
|
+
parts.push(s.provider);
|
|
84
|
+
if (s.elapsed)
|
|
85
|
+
parts.push(s.elapsed);
|
|
86
|
+
return parts.length > 0 ? parts.join(' · ') : '';
|
|
87
|
+
}
|
|
88
|
+
// ── Component ────────────────────────────────────────────────
|
|
89
|
+
/** Phases where the complaint input is shown. */
|
|
90
|
+
const INPUT_VISIBLE = new Set([
|
|
91
|
+
'watching', 'done', 'idle',
|
|
92
|
+
'discovering', 'analyzing', 'building-kb', 'optimizing', 'writing',
|
|
93
|
+
]);
|
|
94
|
+
const Dashboard = () => {
|
|
95
|
+
const [s, setS] = (0, react_1.useState)({ ...store_1.store.state });
|
|
96
|
+
(0, react_1.useEffect)(() => {
|
|
97
|
+
const fn = () => setS({ ...store_1.store.state });
|
|
98
|
+
store_1.store.on('change', fn);
|
|
99
|
+
return () => { store_1.store.removeListener('change', fn); };
|
|
100
|
+
}, []);
|
|
101
|
+
// ── Complaint text input via useInput ────────────────────
|
|
102
|
+
(0, ink_1.useInput)((input, key) => {
|
|
103
|
+
if (key.return) {
|
|
104
|
+
const text = store_1.store.state.complaintInput.trim();
|
|
105
|
+
if (text.length > 0) {
|
|
106
|
+
store_1.store.queueComplaint(text);
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (key.backspace || key.delete) {
|
|
111
|
+
const cur = store_1.store.state.complaintInput;
|
|
112
|
+
if (cur.length > 0) {
|
|
113
|
+
store_1.store.setComplaintInput(cur.slice(0, -1));
|
|
114
|
+
}
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (key.escape) {
|
|
118
|
+
store_1.store.setComplaintInput('');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Ignore control / arrow / meta keys
|
|
122
|
+
if (key.ctrl || key.meta || key.upArrow || key.downArrow || key.leftArrow || key.rightArrow || key.tab) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (input) {
|
|
126
|
+
store_1.store.setComplaintInput(store_1.store.state.complaintInput + input);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
const working = WORKING.has(s.phase);
|
|
130
|
+
const spinner = useSpinner(working || s.processingComplaint);
|
|
131
|
+
const stats = statsText(s);
|
|
132
|
+
const detail = s.phaseDetail ? ` (${s.phaseDetail})` : '';
|
|
133
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
134
|
+
react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
|
|
135
|
+
react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.primary, bold: true }, (0, theme_1.getBannerText)())),
|
|
136
|
+
INPUT_VISIBLE.has(s.phase) && (react_1.default.createElement(ink_1.Box, null,
|
|
137
|
+
react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.primary }, ' ❯ '),
|
|
138
|
+
react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.white }, s.complaintInput),
|
|
139
|
+
react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.primaryDim }, '▌'))),
|
|
140
|
+
s.complaintQueue.length > 0 && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.primaryDim }, ` ${s.complaintQueue.length} complaint${s.complaintQueue.length === 1 ? '' : 's'} queued`)),
|
|
141
|
+
react_1.default.createElement(ink_1.Box, null,
|
|
142
|
+
s.processingComplaint && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.primary }, ` ${spinner} Processing complaint…`)),
|
|
143
|
+
!s.processingComplaint && working && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.primary }, ` ${spinner} ${PHASE_TEXT[s.phase]}${detail}`)),
|
|
144
|
+
!s.processingComplaint && s.phase === 'watching' && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.green }, ' ● Watching')),
|
|
145
|
+
!s.processingComplaint && s.phase === 'done' && s.outputs.length > 0 && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.green }, ` ✔ ${s.outputs.join(', ')}`)),
|
|
146
|
+
!s.processingComplaint && s.phase === 'done' && s.outputs.length === 0 && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.green }, ' ✔ Done')),
|
|
147
|
+
!s.processingComplaint && s.phase === 'error' && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.red }, ' ✖ Error')),
|
|
148
|
+
stats !== '' && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.gray }, ` ${stats}`))),
|
|
149
|
+
s.lastChange !== '' && working && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.gray }, ` ↳ ${s.lastChange}`)),
|
|
150
|
+
s.warning !== '' && (react_1.default.createElement(ink_1.Box, { marginTop: 0 },
|
|
151
|
+
react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.yellow }, ` ⚠ ${s.warning}`))),
|
|
152
|
+
s.complaintChanges.length > 0 && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 },
|
|
153
|
+
react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.primary }, ' Complaint changes applied:'),
|
|
154
|
+
s.complaintChanges.map((c, i) => (react_1.default.createElement(ink_1.Text, { key: i, color: theme_1.COLORS.primaryDim }, ` → ${c}`))))),
|
|
155
|
+
s.reasoning.length > 0 && (s.phase === 'done' || s.phase === 'watching') && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 },
|
|
156
|
+
react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.primaryDim }, ' Optimization details:'),
|
|
157
|
+
s.reasoning.map((r, i) => (react_1.default.createElement(ink_1.Text, { key: i, color: theme_1.COLORS.gray }, ` ${r}`))))),
|
|
158
|
+
s.phase === 'watching' && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.gray, dimColor: true }, ' Type a complaint above, or Ctrl+C to stop')),
|
|
159
|
+
s.phase === 'done' && (react_1.default.createElement(ink_1.Text, { color: theme_1.COLORS.gray, dimColor: true }, ' Type a complaint above to refine AGENTS.md'))));
|
|
160
|
+
};
|
|
161
|
+
exports.default = Dashboard;
|
|
162
|
+
//# sourceMappingURL=Dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../src/ui/Dashboard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ink logger adapter — implements Logger + Spinner interfaces via the
|
|
3
|
+
* DashboardStore so pipeline output flows through the ink dashboard.
|
|
4
|
+
*
|
|
5
|
+
* Most log calls are absorbed — the dashboard shows structured phases,
|
|
6
|
+
* not individual log lines. Only warnings and errors surface.
|
|
7
|
+
*/
|
|
8
|
+
import type { Logger, Spinner } from '../logger';
|
|
9
|
+
import type { PipelinePhase } from './store';
|
|
10
|
+
/**
|
|
11
|
+
* Logger that feeds the dashboard store.
|
|
12
|
+
* Info/success/debug are absorbed; warnings and errors surface.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createDashboardLogger(): Logger;
|
|
15
|
+
/**
|
|
16
|
+
* Spinner that sets the dashboard phase. `stop()` is a no-op since the
|
|
17
|
+
* pipeline will advance to the next phase automatically.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createDashboardSpinner(phase: PipelinePhase, _initialMsg: string): Spinner;
|
|
20
|
+
//# sourceMappingURL=inkLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inkLogger.d.ts","sourceRoot":"","sources":["../../src/ui/inkLogger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAS9C;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAUzF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ink logger adapter — implements Logger + Spinner interfaces via the
|
|
4
|
+
* DashboardStore so pipeline output flows through the ink dashboard.
|
|
5
|
+
*
|
|
6
|
+
* Most log calls are absorbed — the dashboard shows structured phases,
|
|
7
|
+
* not individual log lines. Only warnings and errors surface.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createDashboardLogger = createDashboardLogger;
|
|
11
|
+
exports.createDashboardSpinner = createDashboardSpinner;
|
|
12
|
+
const store_1 = require("./store");
|
|
13
|
+
/**
|
|
14
|
+
* Logger that feeds the dashboard store.
|
|
15
|
+
* Info/success/debug are absorbed; warnings and errors surface.
|
|
16
|
+
*/
|
|
17
|
+
function createDashboardLogger() {
|
|
18
|
+
return {
|
|
19
|
+
info() { },
|
|
20
|
+
success(_msg) { },
|
|
21
|
+
warn(msg) { store_1.store.setWarning(msg); },
|
|
22
|
+
error(msg) { store_1.store.setWarning(msg); },
|
|
23
|
+
debug() { },
|
|
24
|
+
blank() { },
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Spinner that sets the dashboard phase. `stop()` is a no-op since the
|
|
29
|
+
* pipeline will advance to the next phase automatically.
|
|
30
|
+
*/
|
|
31
|
+
function createDashboardSpinner(phase, _initialMsg) {
|
|
32
|
+
store_1.store.setPhase(phase);
|
|
33
|
+
return {
|
|
34
|
+
update() { },
|
|
35
|
+
stop() { },
|
|
36
|
+
fail(msg) {
|
|
37
|
+
store_1.store.setPhase('error');
|
|
38
|
+
store_1.store.setWarning(msg);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=inkLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inkLogger.js","sourceRoot":"","sources":["../../src/ui/inkLogger.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAUH,sDASC;AAMD,wDAUC;AAhCD,mCAAgC;AAGhC;;;GAGG;AACH,SAAgB,qBAAqB;IACnC,OAAO;QACL,IAAI,KAA2D,CAAC;QAChE,OAAO,CAAC,IAAY,IAAgD,CAAC;QACrE,IAAI,CAAC,GAAW,IAAO,aAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,GAAW,IAAM,aAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,KAAiC,CAAC;QACvC,KAAK,KAA8B,CAAC;KACrC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,KAAoB,EAAE,WAAmB;IAC9E,aAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO;QACL,MAAM,KAAI,CAAC;QACX,IAAI,KAAK,CAAC;QACV,IAAI,CAAC,GAAW;YACd,aAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxB,aAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple interactive prompts — readline-based, no dependencies.
|
|
3
|
+
*
|
|
4
|
+
* Falls back to a default when stdin is not a TTY (CI / piped).
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Ask the user to pick from a list of options using arrow keys.
|
|
8
|
+
* Returns the 0-based index of the chosen option.
|
|
9
|
+
*
|
|
10
|
+
* Falls back to `defaultIndex` when not interactive.
|
|
11
|
+
*/
|
|
12
|
+
export declare function selectPrompt(question: string, options: string[], defaultIndex?: number): Promise<number>;
|
|
13
|
+
/**
|
|
14
|
+
* Ask a yes/no question. Returns `true` for yes.
|
|
15
|
+
*
|
|
16
|
+
* Falls back to `defaultValue` when not interactive.
|
|
17
|
+
*/
|
|
18
|
+
export declare function confirmPrompt(question: string, defaultValue?: boolean): Promise<boolean>;
|
|
19
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,SAAI,GACf,OAAO,CAAC,MAAM,CAAC,CAsDjB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,YAAY,UAAO,GAClB,OAAO,CAAC,OAAO,CAAC,CAalB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simple interactive prompts — readline-based, no dependencies.
|
|
4
|
+
*
|
|
5
|
+
* Falls back to a default when stdin is not a TTY (CI / piped).
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.selectPrompt = selectPrompt;
|
|
42
|
+
exports.confirmPrompt = confirmPrompt;
|
|
43
|
+
const readline = __importStar(require("readline"));
|
|
44
|
+
function isInteractive() {
|
|
45
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Ask the user to pick from a list of options using arrow keys.
|
|
49
|
+
* Returns the 0-based index of the chosen option.
|
|
50
|
+
*
|
|
51
|
+
* Falls back to `defaultIndex` when not interactive.
|
|
52
|
+
*/
|
|
53
|
+
async function selectPrompt(question, options, defaultIndex = 0) {
|
|
54
|
+
if (!isInteractive())
|
|
55
|
+
return defaultIndex;
|
|
56
|
+
return new Promise((resolve) => {
|
|
57
|
+
let selected = defaultIndex;
|
|
58
|
+
const render = () => {
|
|
59
|
+
// Move cursor up to re-render (skip on first paint)
|
|
60
|
+
if (painted) {
|
|
61
|
+
process.stdout.write(`\x1b[${options.length}A`);
|
|
62
|
+
}
|
|
63
|
+
for (let i = 0; i < options.length; i++) {
|
|
64
|
+
const prefix = i === selected ? '\x1b[35m❯\x1b[0m' : ' ';
|
|
65
|
+
const label = i === selected ? `\x1b[1m${options[i]}\x1b[0m` : options[i];
|
|
66
|
+
process.stdout.write(`\x1b[2K ${prefix} ${label}\n`);
|
|
67
|
+
}
|
|
68
|
+
painted = true;
|
|
69
|
+
};
|
|
70
|
+
let painted = false;
|
|
71
|
+
process.stdout.write(`\x1b[35m?\x1b[0m ${question}\n`);
|
|
72
|
+
render();
|
|
73
|
+
// Raw mode for arrow key input
|
|
74
|
+
process.stdin.setRawMode(true);
|
|
75
|
+
process.stdin.resume();
|
|
76
|
+
process.stdin.setEncoding('utf-8');
|
|
77
|
+
const onData = (key) => {
|
|
78
|
+
if (key === '\x1b[A' || key === 'k') {
|
|
79
|
+
// Up
|
|
80
|
+
selected = (selected - 1 + options.length) % options.length;
|
|
81
|
+
render();
|
|
82
|
+
}
|
|
83
|
+
else if (key === '\x1b[B' || key === 'j') {
|
|
84
|
+
// Down
|
|
85
|
+
selected = (selected + 1) % options.length;
|
|
86
|
+
render();
|
|
87
|
+
}
|
|
88
|
+
else if (key === '\r' || key === '\n') {
|
|
89
|
+
// Enter
|
|
90
|
+
process.stdin.setRawMode(false);
|
|
91
|
+
process.stdin.pause();
|
|
92
|
+
process.stdin.removeListener('data', onData);
|
|
93
|
+
resolve(selected);
|
|
94
|
+
}
|
|
95
|
+
else if (key === '\x03') {
|
|
96
|
+
// Ctrl+C
|
|
97
|
+
process.stdin.setRawMode(false);
|
|
98
|
+
process.stdin.pause();
|
|
99
|
+
process.stdin.removeListener('data', onData);
|
|
100
|
+
process.exit(130);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
process.stdin.on('data', onData);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Ask a yes/no question. Returns `true` for yes.
|
|
108
|
+
*
|
|
109
|
+
* Falls back to `defaultValue` when not interactive.
|
|
110
|
+
*/
|
|
111
|
+
async function confirmPrompt(question, defaultValue = true) {
|
|
112
|
+
if (!isInteractive())
|
|
113
|
+
return defaultValue;
|
|
114
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
115
|
+
const hint = defaultValue ? 'Y/n' : 'y/N';
|
|
116
|
+
return new Promise((resolve) => {
|
|
117
|
+
rl.question(`\x1b[35m?\x1b[0m ${question} (${hint}) `, (answer) => {
|
|
118
|
+
rl.close();
|
|
119
|
+
if (answer.trim() === '')
|
|
120
|
+
return resolve(defaultValue);
|
|
121
|
+
resolve(answer.trim().toLowerCase().startsWith('y'));
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=prompts.js.map
|