agents-reverse-engineer 0.3.6 → 0.4.1
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/dist/ai/backends/claude.d.ts +92 -0
- package/dist/ai/backends/claude.d.ts.map +1 -0
- package/dist/ai/backends/claude.js +213 -0
- package/dist/ai/backends/claude.js.map +1 -0
- package/dist/ai/backends/gemini.d.ts +53 -0
- package/dist/ai/backends/gemini.d.ts.map +1 -0
- package/dist/ai/backends/gemini.js +66 -0
- package/dist/ai/backends/gemini.js.map +1 -0
- package/dist/ai/backends/opencode.d.ts +53 -0
- package/dist/ai/backends/opencode.d.ts.map +1 -0
- package/dist/ai/backends/opencode.js +66 -0
- package/dist/ai/backends/opencode.js.map +1 -0
- package/dist/ai/index.d.ts +39 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +54 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/pricing.d.ts +84 -0
- package/dist/ai/pricing.d.ts.map +1 -0
- package/dist/ai/pricing.js +149 -0
- package/dist/ai/pricing.js.map +1 -0
- package/dist/ai/pricing.test.d.ts +2 -0
- package/dist/ai/pricing.test.d.ts.map +1 -0
- package/dist/ai/pricing.test.js +164 -0
- package/dist/ai/pricing.test.js.map +1 -0
- package/dist/ai/registry.d.ts +128 -0
- package/dist/ai/registry.d.ts.map +1 -0
- package/dist/ai/registry.js +192 -0
- package/dist/ai/registry.js.map +1 -0
- package/dist/ai/retry.d.ts +77 -0
- package/dist/ai/retry.d.ts.map +1 -0
- package/dist/ai/retry.js +100 -0
- package/dist/ai/retry.js.map +1 -0
- package/dist/ai/service.d.ts +124 -0
- package/dist/ai/service.d.ts.map +1 -0
- package/dist/ai/service.js +239 -0
- package/dist/ai/service.js.map +1 -0
- package/dist/ai/subprocess.d.ts +45 -0
- package/dist/ai/subprocess.d.ts.map +1 -0
- package/dist/ai/subprocess.js +90 -0
- package/dist/ai/subprocess.js.map +1 -0
- package/dist/ai/telemetry/cleanup.d.ts +30 -0
- package/dist/ai/telemetry/cleanup.d.ts.map +1 -0
- package/dist/ai/telemetry/cleanup.js +56 -0
- package/dist/ai/telemetry/cleanup.js.map +1 -0
- package/dist/ai/telemetry/logger.d.ts +76 -0
- package/dist/ai/telemetry/logger.d.ts.map +1 -0
- package/dist/ai/telemetry/logger.js +130 -0
- package/dist/ai/telemetry/logger.js.map +1 -0
- package/dist/ai/telemetry/run-log.d.ts +29 -0
- package/dist/ai/telemetry/run-log.d.ts.map +1 -0
- package/dist/ai/telemetry/run-log.js +43 -0
- package/dist/ai/telemetry/run-log.js.map +1 -0
- package/dist/ai/types.d.ts +235 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +34 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/discover.d.ts.map +1 -1
- package/dist/cli/discover.js +0 -2
- package/dist/cli/discover.js.map +1 -1
- package/dist/cli/generate.d.ts +22 -14
- package/dist/cli/generate.d.ts.map +1 -1
- package/dist/cli/generate.js +91 -50
- package/dist/cli/generate.js.map +1 -1
- package/dist/cli/index.js +12 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/update.d.ts +13 -4
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +93 -131
- package/dist/cli/update.js.map +1 -1
- package/dist/config/defaults.d.ts +2 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +2 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +175 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +36 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/generation/executor.d.ts.map +1 -1
- package/dist/generation/executor.js +2 -5
- package/dist/generation/executor.js.map +1 -1
- package/dist/generation/prompts/builder.d.ts +10 -0
- package/dist/generation/prompts/builder.d.ts.map +1 -1
- package/dist/generation/prompts/builder.js +77 -1
- package/dist/generation/prompts/builder.js.map +1 -1
- package/dist/generation/prompts/index.d.ts +1 -1
- package/dist/generation/prompts/index.d.ts.map +1 -1
- package/dist/generation/prompts/index.js +1 -1
- package/dist/generation/prompts/index.js.map +1 -1
- package/dist/generation/prompts/templates.d.ts +5 -0
- package/dist/generation/prompts/templates.d.ts.map +1 -1
- package/dist/generation/prompts/templates.js +94 -7
- package/dist/generation/prompts/templates.js.map +1 -1
- package/dist/generation/prompts/types.d.ts +2 -2
- package/dist/generation/prompts/types.js +1 -1
- package/dist/generation/writers/agents-md.d.ts +3 -59
- package/dist/generation/writers/agents-md.d.ts.map +1 -1
- package/dist/generation/writers/agents-md.js +11 -249
- package/dist/generation/writers/agents-md.js.map +1 -1
- package/dist/generation/writers/index.d.ts +1 -1
- package/dist/generation/writers/index.d.ts.map +1 -1
- package/dist/generation/writers/index.js +1 -1
- package/dist/generation/writers/index.js.map +1 -1
- package/dist/integration/templates.d.ts.map +1 -1
- package/dist/integration/templates.js +46 -130
- package/dist/integration/templates.js.map +1 -1
- package/dist/orchestration/index.d.ts +27 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +34 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/pool.d.ts +62 -0
- package/dist/orchestration/pool.d.ts.map +1 -0
- package/dist/orchestration/pool.js +75 -0
- package/dist/orchestration/pool.js.map +1 -0
- package/dist/orchestration/progress.d.ts +124 -0
- package/dist/orchestration/progress.d.ts.map +1 -0
- package/dist/orchestration/progress.js +214 -0
- package/dist/orchestration/progress.js.map +1 -0
- package/dist/orchestration/runner.d.ts +76 -0
- package/dist/orchestration/runner.d.ts.map +1 -0
- package/dist/orchestration/runner.js +494 -0
- package/dist/orchestration/runner.js.map +1 -0
- package/dist/orchestration/types.d.ts +123 -0
- package/dist/orchestration/types.d.ts.map +1 -0
- package/dist/orchestration/types.js +11 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/quality/density/validator.d.ts +38 -0
- package/dist/quality/density/validator.d.ts.map +1 -0
- package/dist/quality/density/validator.js +61 -0
- package/dist/quality/density/validator.js.map +1 -0
- package/dist/quality/inconsistency/code-vs-code.d.ts +26 -0
- package/dist/quality/inconsistency/code-vs-code.d.ts.map +1 -0
- package/dist/quality/inconsistency/code-vs-code.js +51 -0
- package/dist/quality/inconsistency/code-vs-code.js.map +1 -0
- package/dist/quality/inconsistency/code-vs-doc.d.ts +35 -0
- package/dist/quality/inconsistency/code-vs-doc.d.ts.map +1 -0
- package/dist/quality/inconsistency/code-vs-doc.js +59 -0
- package/dist/quality/inconsistency/code-vs-doc.js.map +1 -0
- package/dist/quality/inconsistency/code-vs-doc.test.d.ts +2 -0
- package/dist/quality/inconsistency/code-vs-doc.test.d.ts.map +1 -0
- package/dist/quality/inconsistency/code-vs-doc.test.js +196 -0
- package/dist/quality/inconsistency/code-vs-doc.test.js.map +1 -0
- package/dist/quality/inconsistency/reporter.d.ts +49 -0
- package/dist/quality/inconsistency/reporter.d.ts.map +1 -0
- package/dist/quality/inconsistency/reporter.js +99 -0
- package/dist/quality/inconsistency/reporter.js.map +1 -0
- package/dist/quality/index.d.ts +15 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +25 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/types.d.ts +63 -0
- package/dist/quality/types.d.ts.map +1 -0
- package/dist/quality/types.js +5 -0
- package/dist/quality/types.js.map +1 -0
- package/dist/update/orchestrator.d.ts.map +1 -1
- package/dist/update/orchestrator.js +2 -1
- package/dist/update/orchestrator.js.map +1 -1
- package/dist/update/orphan-cleaner.js +1 -1
- package/dist/update/orphan-cleaner.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory telemetry logger for AI service calls.
|
|
3
|
+
*
|
|
4
|
+
* Accumulates {@link TelemetryEntry} instances during a run and computes
|
|
5
|
+
* aggregate summaries. The logger is created once per CLI invocation and
|
|
6
|
+
* finalized when the run completes.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Accumulates per-call telemetry entries in memory and produces a
|
|
12
|
+
* complete {@link RunLog} when the run finishes.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const logger = new TelemetryLogger('2026-02-07T12:00:00.000Z');
|
|
17
|
+
* logger.addEntry(entry);
|
|
18
|
+
* const summary = logger.getSummary();
|
|
19
|
+
* const runLog = logger.toRunLog();
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export class TelemetryLogger {
|
|
23
|
+
/** Unique identifier for this run (ISO timestamp-based) */
|
|
24
|
+
runId;
|
|
25
|
+
/** ISO 8601 timestamp when the run started */
|
|
26
|
+
startTime;
|
|
27
|
+
/** Accumulated telemetry entries */
|
|
28
|
+
entries = [];
|
|
29
|
+
/**
|
|
30
|
+
* Create a new telemetry logger for a run.
|
|
31
|
+
*
|
|
32
|
+
* @param runId - Unique run identifier (typically an ISO timestamp)
|
|
33
|
+
*/
|
|
34
|
+
constructor(runId) {
|
|
35
|
+
this.runId = runId;
|
|
36
|
+
this.startTime = new Date().toISOString();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Record a telemetry entry for a completed AI call.
|
|
40
|
+
*
|
|
41
|
+
* @param entry - The telemetry entry to record
|
|
42
|
+
*/
|
|
43
|
+
addEntry(entry) {
|
|
44
|
+
this.entries.push(entry);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get all recorded entries as a read-only array.
|
|
48
|
+
*
|
|
49
|
+
* @returns Immutable view of the accumulated entries
|
|
50
|
+
*/
|
|
51
|
+
getEntries() {
|
|
52
|
+
return this.entries;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Update the most recent entry's filesRead array.
|
|
56
|
+
*
|
|
57
|
+
* Called by the AI service after the command runner attaches file
|
|
58
|
+
* metadata to the last call.
|
|
59
|
+
*
|
|
60
|
+
* @param filesRead - Array of file-read records to attach
|
|
61
|
+
*/
|
|
62
|
+
setFilesReadOnLastEntry(filesRead) {
|
|
63
|
+
if (this.entries.length === 0)
|
|
64
|
+
return;
|
|
65
|
+
this.entries[this.entries.length - 1].filesRead = filesRead;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Compute aggregate summary statistics from all recorded entries.
|
|
69
|
+
*
|
|
70
|
+
* Totals are computed on every call (not cached) so the summary
|
|
71
|
+
* always reflects the current state of the entries array.
|
|
72
|
+
*
|
|
73
|
+
* @returns Summary with totals for calls, tokens, cost, duration, and errors
|
|
74
|
+
*/
|
|
75
|
+
getSummary() {
|
|
76
|
+
let totalInputTokens = 0;
|
|
77
|
+
let totalOutputTokens = 0;
|
|
78
|
+
let totalCostUsd = 0;
|
|
79
|
+
let totalDurationMs = 0;
|
|
80
|
+
let errorCount = 0;
|
|
81
|
+
let costAvailable = false;
|
|
82
|
+
let totalFilesRead = 0;
|
|
83
|
+
const uniqueFilePaths = new Set();
|
|
84
|
+
for (const entry of this.entries) {
|
|
85
|
+
totalInputTokens += entry.inputTokens;
|
|
86
|
+
totalOutputTokens += entry.outputTokens;
|
|
87
|
+
totalCostUsd += entry.costUsd;
|
|
88
|
+
totalDurationMs += entry.latencyMs;
|
|
89
|
+
if (entry.error !== undefined) {
|
|
90
|
+
errorCount++;
|
|
91
|
+
}
|
|
92
|
+
if (entry.costSource !== 'unavailable') {
|
|
93
|
+
costAvailable = true;
|
|
94
|
+
}
|
|
95
|
+
totalFilesRead += entry.filesRead.length;
|
|
96
|
+
for (const file of entry.filesRead) {
|
|
97
|
+
uniqueFilePaths.add(file.path);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
totalCalls: this.entries.length,
|
|
102
|
+
totalInputTokens,
|
|
103
|
+
totalOutputTokens,
|
|
104
|
+
totalCostUsd,
|
|
105
|
+
totalDurationMs,
|
|
106
|
+
errorCount,
|
|
107
|
+
costAvailable,
|
|
108
|
+
totalFilesRead,
|
|
109
|
+
uniqueFilesRead: uniqueFilePaths.size,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Assemble the complete {@link RunLog} for this run.
|
|
114
|
+
*
|
|
115
|
+
* Sets `endTime` to the current time, includes all entries, and
|
|
116
|
+
* computes the summary. Call this once when the run is finished.
|
|
117
|
+
*
|
|
118
|
+
* @returns Complete run log ready for serialization
|
|
119
|
+
*/
|
|
120
|
+
toRunLog() {
|
|
121
|
+
return {
|
|
122
|
+
runId: this.runId,
|
|
123
|
+
startTime: this.startTime,
|
|
124
|
+
endTime: new Date().toISOString(),
|
|
125
|
+
entries: [...this.entries],
|
|
126
|
+
summary: this.getSummary(),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/ai/telemetry/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAe;IAC1B,2DAA2D;IAClD,KAAK,CAAS;IAEvB,8CAA8C;IACrC,SAAS,CAAS;IAE3B,oCAAoC;IACnB,OAAO,GAAqB,EAAE,CAAC;IAEhD;;;;OAIG;IACH,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAqB;QAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;;;;;OAOG;IACH,uBAAuB,CAAC,SAAqB;QAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/D,CAAC;IAED;;;;;;;OAOG;IACH,UAAU;QACR,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;QAE1C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,gBAAgB,IAAI,KAAK,CAAC,WAAW,CAAC;YACtC,iBAAiB,IAAI,KAAK,CAAC,YAAY,CAAC;YACxC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC;YAC9B,eAAe,IAAI,KAAK,CAAC,SAAS,CAAC;YACnC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,UAAU,EAAE,CAAC;YACf,CAAC;YACD,IAAI,KAAK,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;gBACvC,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,cAAc,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACnC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC/B,gBAAgB;YAChB,iBAAiB;YACjB,YAAY;YACZ,eAAe;YACf,UAAU;YACV,aAAa;YACb,cAAc;YACd,eAAe,EAAE,eAAe,CAAC,IAAI;SACtC,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ;QACN,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run log writer for AI telemetry.
|
|
3
|
+
*
|
|
4
|
+
* Writes a completed {@link RunLog} to disk as pretty-printed JSON.
|
|
5
|
+
* Each run produces a single file in `.agents-reverse-engineer/logs/`
|
|
6
|
+
* with a filename derived from the run's start timestamp.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import type { RunLog } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Write a completed run log to disk as pretty-printed JSON.
|
|
13
|
+
*
|
|
14
|
+
* Creates the logs directory if it does not exist. The filename is derived
|
|
15
|
+
* from the run's `startTime` field with `:` and `.` replaced by `-` so
|
|
16
|
+
* that it forms a valid filename on all platforms.
|
|
17
|
+
*
|
|
18
|
+
* @param projectRoot - Absolute path to the project root directory
|
|
19
|
+
* @param runLog - The completed run log to write
|
|
20
|
+
* @returns Absolute path to the written file
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const logPath = await writeRunLog('/home/user/project', runLog);
|
|
25
|
+
* // logPath: /home/user/project/.agents-reverse-engineer/logs/run-2026-02-07T12-00-00-000Z.json
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function writeRunLog(projectRoot: string, runLog: RunLog): Promise<string>;
|
|
29
|
+
//# sourceMappingURL=run-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-log.d.ts","sourceRoot":"","sources":["../../../src/ai/telemetry/run-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAK1C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAetF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run log writer for AI telemetry.
|
|
3
|
+
*
|
|
4
|
+
* Writes a completed {@link RunLog} to disk as pretty-printed JSON.
|
|
5
|
+
* Each run produces a single file in `.agents-reverse-engineer/logs/`
|
|
6
|
+
* with a filename derived from the run's start timestamp.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'node:fs/promises';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
/** Directory name for telemetry log files (relative to project root) */
|
|
13
|
+
const LOGS_DIR = '.agents-reverse-engineer/logs';
|
|
14
|
+
/**
|
|
15
|
+
* Write a completed run log to disk as pretty-printed JSON.
|
|
16
|
+
*
|
|
17
|
+
* Creates the logs directory if it does not exist. The filename is derived
|
|
18
|
+
* from the run's `startTime` field with `:` and `.` replaced by `-` so
|
|
19
|
+
* that it forms a valid filename on all platforms.
|
|
20
|
+
*
|
|
21
|
+
* @param projectRoot - Absolute path to the project root directory
|
|
22
|
+
* @param runLog - The completed run log to write
|
|
23
|
+
* @returns Absolute path to the written file
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const logPath = await writeRunLog('/home/user/project', runLog);
|
|
28
|
+
* // logPath: /home/user/project/.agents-reverse-engineer/logs/run-2026-02-07T12-00-00-000Z.json
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export async function writeRunLog(projectRoot, runLog) {
|
|
32
|
+
const logsDir = path.join(projectRoot, LOGS_DIR);
|
|
33
|
+
// Create the logs directory if it does not exist
|
|
34
|
+
await fs.mkdir(logsDir, { recursive: true });
|
|
35
|
+
// Build filename: replace : and . with - so ISO timestamps become valid filenames
|
|
36
|
+
const safeTimestamp = runLog.startTime.replace(/[:.]/g, '-');
|
|
37
|
+
const filename = `run-${safeTimestamp}.json`;
|
|
38
|
+
const filePath = path.join(logsDir, filename);
|
|
39
|
+
// Write pretty-printed JSON
|
|
40
|
+
await fs.writeFile(filePath, JSON.stringify(runLog, null, 2), 'utf-8');
|
|
41
|
+
return filePath;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=run-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-log.js","sourceRoot":"","sources":["../../../src/ai/telemetry/run-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,wEAAwE;AACxE,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AAEjD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,MAAc;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEjD,iDAAiD;IACjD,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,kFAAkF;IAClF,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,OAAO,aAAa,OAAO,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE9C,4BAA4B;IAC5B,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEvE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the AI service layer.
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for backends, responses, subprocess results,
|
|
5
|
+
* retry configuration, and telemetry logging. Every AI service module
|
|
6
|
+
* imports from this file.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Result returned by the subprocess wrapper after a CLI process completes.
|
|
10
|
+
*
|
|
11
|
+
* Always populated -- even on error or timeout, the fields are filled
|
|
12
|
+
* with whatever information was available.
|
|
13
|
+
*/
|
|
14
|
+
export interface SubprocessResult {
|
|
15
|
+
/** Standard output captured from the child process */
|
|
16
|
+
stdout: string;
|
|
17
|
+
/** Standard error captured from the child process */
|
|
18
|
+
stderr: string;
|
|
19
|
+
/** Numeric exit code (0 = success, non-zero = failure) */
|
|
20
|
+
exitCode: number;
|
|
21
|
+
/** Signal that terminated the process, or `null` if it exited normally */
|
|
22
|
+
signal: string | null;
|
|
23
|
+
/** Wall-clock duration in milliseconds */
|
|
24
|
+
durationMs: number;
|
|
25
|
+
/** Whether the process was killed because it exceeded its timeout */
|
|
26
|
+
timedOut: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Input options for an AI call.
|
|
30
|
+
*
|
|
31
|
+
* Only `prompt` is required; all other fields have backend-specific defaults.
|
|
32
|
+
*/
|
|
33
|
+
export interface AICallOptions {
|
|
34
|
+
/** The prompt to send to the AI model */
|
|
35
|
+
prompt: string;
|
|
36
|
+
/** Optional system prompt to set context/behavior */
|
|
37
|
+
systemPrompt?: string;
|
|
38
|
+
/** Model identifier (e.g., "sonnet", "opus") -- backend interprets this */
|
|
39
|
+
model?: string;
|
|
40
|
+
/** Subprocess timeout in milliseconds (overrides config default) */
|
|
41
|
+
timeoutMs?: number;
|
|
42
|
+
/** Maximum number of agentic turns (backend-specific) */
|
|
43
|
+
maxTurns?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Normalized response from any AI CLI backend.
|
|
47
|
+
*
|
|
48
|
+
* Every backend adapter must parse its CLI's raw output into this shape
|
|
49
|
+
* so that callers never need to know which backend was used.
|
|
50
|
+
*/
|
|
51
|
+
export interface AIResponse {
|
|
52
|
+
/** The AI model's text response */
|
|
53
|
+
text: string;
|
|
54
|
+
/** Model identifier as reported by the backend */
|
|
55
|
+
model: string;
|
|
56
|
+
/** Number of input tokens consumed */
|
|
57
|
+
inputTokens: number;
|
|
58
|
+
/** Number of output tokens generated */
|
|
59
|
+
outputTokens: number;
|
|
60
|
+
/** Number of tokens served from cache reads */
|
|
61
|
+
cacheReadTokens: number;
|
|
62
|
+
/** Number of tokens written to cache */
|
|
63
|
+
cacheCreationTokens: number;
|
|
64
|
+
/** Estimated cost in USD for this call */
|
|
65
|
+
costUsd: number;
|
|
66
|
+
/** Wall-clock duration in milliseconds */
|
|
67
|
+
durationMs: number;
|
|
68
|
+
/** Process exit code from the CLI */
|
|
69
|
+
exitCode: number;
|
|
70
|
+
/** Original CLI JSON output for debugging */
|
|
71
|
+
raw: unknown;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Contract for an AI CLI backend adapter.
|
|
75
|
+
*
|
|
76
|
+
* Each supported CLI (Claude, Gemini, OpenCode) implements this interface.
|
|
77
|
+
* The registry selects the appropriate backend at runtime.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const backend: AIBackend = new ClaudeBackend();
|
|
82
|
+
* if (await backend.isAvailable()) {
|
|
83
|
+
* const args = backend.buildArgs({ prompt: 'Hello' });
|
|
84
|
+
* // spawn the process with backend.cliCommand and args
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export interface AIBackend {
|
|
89
|
+
/** Human-readable backend name (e.g., "Claude", "Gemini") */
|
|
90
|
+
readonly name: string;
|
|
91
|
+
/** CLI executable name on PATH (e.g., "claude", "gemini") */
|
|
92
|
+
readonly cliCommand: string;
|
|
93
|
+
/** Check whether this backend's CLI is available on PATH */
|
|
94
|
+
isAvailable(): Promise<boolean>;
|
|
95
|
+
/** Build the CLI argument array for a given call */
|
|
96
|
+
buildArgs(options: AICallOptions): string[];
|
|
97
|
+
/** Parse the CLI's stdout into a normalized {@link AIResponse} */
|
|
98
|
+
parseResponse(stdout: string, durationMs: number, exitCode: number): AIResponse;
|
|
99
|
+
/** Get user-facing install instructions when the CLI is not found */
|
|
100
|
+
getInstallInstructions(): string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Configuration for the retry utility.
|
|
104
|
+
*
|
|
105
|
+
* Controls exponential backoff timing and which errors are retryable.
|
|
106
|
+
*/
|
|
107
|
+
export interface RetryOptions {
|
|
108
|
+
/** Maximum number of retries (e.g., 3 means up to 4 total attempts) */
|
|
109
|
+
maxRetries: number;
|
|
110
|
+
/** Base delay in milliseconds before first retry */
|
|
111
|
+
baseDelayMs: number;
|
|
112
|
+
/** Maximum delay cap in milliseconds */
|
|
113
|
+
maxDelayMs: number;
|
|
114
|
+
/** Exponential multiplier applied to the base delay */
|
|
115
|
+
multiplier: number;
|
|
116
|
+
/** Predicate that returns `true` if the error is transient and retryable */
|
|
117
|
+
isRetryable: (error: unknown) => boolean;
|
|
118
|
+
/** Optional callback invoked before each retry attempt */
|
|
119
|
+
onRetry?: (attempt: number, error: unknown) => void;
|
|
120
|
+
}
|
|
121
|
+
import type { CostSource } from './pricing.js';
|
|
122
|
+
export type { CostSource } from './pricing.js';
|
|
123
|
+
/**
|
|
124
|
+
* Record of a single file read that was sent as context to an AI call.
|
|
125
|
+
*/
|
|
126
|
+
export interface FileRead {
|
|
127
|
+
/** File path relative to project root */
|
|
128
|
+
path: string;
|
|
129
|
+
/** File size in bytes at time of read */
|
|
130
|
+
sizeBytes: number;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Per-call telemetry log entry.
|
|
134
|
+
*
|
|
135
|
+
* Captures everything needed to replay or debug a single AI call
|
|
136
|
+
* without re-running it.
|
|
137
|
+
*/
|
|
138
|
+
export interface TelemetryEntry {
|
|
139
|
+
/** ISO 8601 timestamp when the call was initiated */
|
|
140
|
+
timestamp: string;
|
|
141
|
+
/** The prompt that was sent */
|
|
142
|
+
prompt: string;
|
|
143
|
+
/** The system prompt, if one was used */
|
|
144
|
+
systemPrompt?: string;
|
|
145
|
+
/** The AI model's text response */
|
|
146
|
+
response: string;
|
|
147
|
+
/** Model identifier */
|
|
148
|
+
model: string;
|
|
149
|
+
/** Number of input tokens consumed */
|
|
150
|
+
inputTokens: number;
|
|
151
|
+
/** Number of output tokens generated */
|
|
152
|
+
outputTokens: number;
|
|
153
|
+
/** Number of tokens served from cache reads */
|
|
154
|
+
cacheReadTokens: number;
|
|
155
|
+
/** Number of tokens written to cache */
|
|
156
|
+
cacheCreationTokens: number;
|
|
157
|
+
/** Estimated cost in USD */
|
|
158
|
+
costUsd: number;
|
|
159
|
+
/** Wall-clock latency in milliseconds */
|
|
160
|
+
latencyMs: number;
|
|
161
|
+
/** Process exit code */
|
|
162
|
+
exitCode: number;
|
|
163
|
+
/** Error message, if the call failed */
|
|
164
|
+
error?: string;
|
|
165
|
+
/** Number of retries that occurred before this result */
|
|
166
|
+
retryCount: number;
|
|
167
|
+
/** AI thinking/reasoning content. "not supported" when backend doesn't provide it */
|
|
168
|
+
thinking: string;
|
|
169
|
+
/** Files sent as context for this call */
|
|
170
|
+
filesRead: FileRead[];
|
|
171
|
+
/** How the cost was determined */
|
|
172
|
+
costSource: CostSource;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Per-run log file structure.
|
|
176
|
+
*
|
|
177
|
+
* Aggregates all {@link TelemetryEntry} instances for a single CLI run,
|
|
178
|
+
* plus a computed summary for quick cost/performance review.
|
|
179
|
+
*/
|
|
180
|
+
export interface RunLog {
|
|
181
|
+
/** Unique run identifier (ISO timestamp-based) */
|
|
182
|
+
runId: string;
|
|
183
|
+
/** ISO 8601 timestamp when the run started */
|
|
184
|
+
startTime: string;
|
|
185
|
+
/** ISO 8601 timestamp when the run finished */
|
|
186
|
+
endTime: string;
|
|
187
|
+
/** All individual call entries */
|
|
188
|
+
entries: TelemetryEntry[];
|
|
189
|
+
/** Aggregated summary across all entries */
|
|
190
|
+
summary: {
|
|
191
|
+
/** Total number of AI calls made */
|
|
192
|
+
totalCalls: number;
|
|
193
|
+
/** Sum of input tokens across all calls */
|
|
194
|
+
totalInputTokens: number;
|
|
195
|
+
/** Sum of output tokens across all calls */
|
|
196
|
+
totalOutputTokens: number;
|
|
197
|
+
/** Sum of estimated cost across all calls */
|
|
198
|
+
totalCostUsd: number;
|
|
199
|
+
/** Total wall-clock duration in milliseconds */
|
|
200
|
+
totalDurationMs: number;
|
|
201
|
+
/** Number of calls that resulted in an error */
|
|
202
|
+
errorCount: number;
|
|
203
|
+
/** Whether cost data is available for all/most entries */
|
|
204
|
+
costAvailable: boolean;
|
|
205
|
+
/** Total file reads across all calls (including duplicates) */
|
|
206
|
+
totalFilesRead: number;
|
|
207
|
+
/** Unique files read (deduped by path) */
|
|
208
|
+
uniqueFilesRead: number;
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/** Error codes for typed error handling in the AI service layer */
|
|
212
|
+
export type AIServiceErrorCode = 'CLI_NOT_FOUND' | 'TIMEOUT' | 'PARSE_ERROR' | 'SUBPROCESS_ERROR' | 'RATE_LIMIT';
|
|
213
|
+
/**
|
|
214
|
+
* Typed error for AI service failures.
|
|
215
|
+
*
|
|
216
|
+
* Carries a machine-readable {@link AIServiceErrorCode} so callers can
|
|
217
|
+
* branch on the error type without parsing message strings.
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* ```typescript
|
|
221
|
+
* try {
|
|
222
|
+
* await callAI(options);
|
|
223
|
+
* } catch (error) {
|
|
224
|
+
* if (error instanceof AIServiceError && error.code === 'RATE_LIMIT') {
|
|
225
|
+
* // handle rate limiting
|
|
226
|
+
* }
|
|
227
|
+
* }
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
export declare class AIServiceError extends Error {
|
|
231
|
+
/** Machine-readable error code */
|
|
232
|
+
readonly code: AIServiceErrorCode;
|
|
233
|
+
constructor(code: AIServiceErrorCode, message: string);
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/types.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the AI service layer.
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for backends, responses, subprocess results,
|
|
5
|
+
* retry configuration, and telemetry logging. Every AI service module
|
|
6
|
+
* imports from this file.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Typed error for AI service failures.
|
|
10
|
+
*
|
|
11
|
+
* Carries a machine-readable {@link AIServiceErrorCode} so callers can
|
|
12
|
+
* branch on the error type without parsing message strings.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* try {
|
|
17
|
+
* await callAI(options);
|
|
18
|
+
* } catch (error) {
|
|
19
|
+
* if (error instanceof AIServiceError && error.code === 'RATE_LIMIT') {
|
|
20
|
+
* // handle rate limiting
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class AIServiceError extends Error {
|
|
26
|
+
/** Machine-readable error code */
|
|
27
|
+
code;
|
|
28
|
+
constructor(code, message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = 'AIServiceError';
|
|
31
|
+
this.code = code;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0PH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,kCAAkC;IACzB,IAAI,CAAqB;IAElC,YAAY,IAAwB,EAAE,OAAe;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/cli/discover.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/cli/discover.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CA2Gf"}
|
package/dist/cli/discover.js
CHANGED
package/dist/cli/discover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/cli/discover.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/cli/discover.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/generate.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI generate command
|
|
3
3
|
*
|
|
4
|
-
* Creates a documentation generation plan by:
|
|
4
|
+
* Creates and executes a documentation generation plan by:
|
|
5
5
|
* 1. Discovering files to analyze
|
|
6
|
-
* 2. Detecting file types
|
|
7
|
-
* 3.
|
|
8
|
-
* 4.
|
|
6
|
+
* 2. Detecting file types and creating analysis tasks
|
|
7
|
+
* 3. Resolving an AI CLI backend
|
|
8
|
+
* 4. Running concurrent AI analysis via CommandRunner
|
|
9
|
+
* 5. Producing .sum files, AGENTS.md, and root documents
|
|
9
10
|
*
|
|
10
|
-
* With --
|
|
11
|
+
* With --dry-run, shows the plan without making any AI calls.
|
|
12
|
+
* With --execute or --stream (deprecated), outputs JSON for external tools.
|
|
11
13
|
*/
|
|
12
14
|
/**
|
|
13
15
|
* Options for the generate command.
|
|
@@ -21,21 +23,27 @@ export interface GenerateOptions {
|
|
|
21
23
|
dryRun?: boolean;
|
|
22
24
|
/** Override token budget */
|
|
23
25
|
budget?: number;
|
|
24
|
-
/**
|
|
26
|
+
/** Number of concurrent AI calls */
|
|
27
|
+
concurrency?: number;
|
|
28
|
+
/** Stop on first file analysis failure */
|
|
29
|
+
failFast?: boolean;
|
|
30
|
+
/** Show AI prompts and backend details */
|
|
31
|
+
debug?: boolean;
|
|
32
|
+
/** @deprecated Execute mode - output JSON for AI agent execution */
|
|
25
33
|
execute?: boolean;
|
|
26
|
-
/** Stream mode - output tasks one per line */
|
|
34
|
+
/** @deprecated Stream mode - output tasks one per line */
|
|
27
35
|
stream?: boolean;
|
|
28
36
|
}
|
|
29
37
|
/**
|
|
30
|
-
* Generate command -
|
|
38
|
+
* Generate command - discovers files, plans analysis, and executes AI-driven
|
|
39
|
+
* documentation generation.
|
|
31
40
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* 3. Creates analysis tasks (prompts)
|
|
36
|
-
* 4. Reports budget and plan
|
|
41
|
+
* Default behavior: resolves an AI CLI backend, builds an execution plan,
|
|
42
|
+
* and runs concurrent AI analysis via the CommandRunner. Produces .sum files,
|
|
43
|
+
* AGENTS.md per directory, and root documents (CLAUDE.md, ARCHITECTURE.md, etc.).
|
|
37
44
|
*
|
|
38
|
-
*
|
|
45
|
+
* @param targetPath - Directory to generate documentation for
|
|
46
|
+
* @param options - Command options (concurrency, failFast, debug, etc.)
|
|
39
47
|
*/
|
|
40
48
|
export declare function generateCommand(targetPath: string, options: GenerateOptions): Promise<void>;
|
|
41
49
|
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/cli/generate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/cli/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAyBH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuFD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CA6Kf"}
|