tempo-agent 1.3.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/cli/index.js +6 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/controller/runPipeline.js +6 -6
- package/dist/controller/runPipeline.js.map +1 -1
- package/dist/executor/aiClient.d.ts +2 -0
- package/dist/executor/aiClient.d.ts.map +1 -0
- package/dist/executor/{claudeClient.js → aiClient.js} +3 -3
- package/dist/executor/aiClient.js.map +1 -0
- package/dist/executor/runStep.d.ts +1 -1
- package/dist/executor/runStep.d.ts.map +1 -1
- package/dist/executor/runStep.js +6 -6
- package/dist/executor/runStep.js.map +1 -1
- package/dist/ideation/compile.d.ts +1 -1
- package/dist/ideation/compile.d.ts.map +1 -1
- package/dist/ideation/compile.js +57 -72
- package/dist/ideation/compile.js.map +1 -1
- package/dist/ideation/tune.js +3 -3
- package/dist/ideation/tune.js.map +1 -1
- package/package.json +1 -2
- package/dist/executor/claudeClient.d.ts +0 -2
- package/dist/executor/claudeClient.d.ts.map +0 -1
- package/dist/executor/claudeClient.js.map +0 -1
package/README.md
CHANGED
|
@@ -96,10 +96,10 @@ tempo run my-feature
|
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
Tempo will:
|
|
99
|
-
- Send each Step to
|
|
100
|
-
- Write
|
|
99
|
+
- Send each Step to the AI with the current file contents
|
|
100
|
+
- Write the AI's response back to disk
|
|
101
101
|
- Run lint, build, and tests
|
|
102
|
-
- Retry up to 3 times on failure, feeding errors back to
|
|
102
|
+
- Retry up to 3 times on failure, feeding errors back to the AI
|
|
103
103
|
- Save a full Session log to `.tempo/sessions/`
|
|
104
104
|
|
|
105
105
|
## Config
|
package/dist/cli/index.js
CHANGED
|
@@ -40,7 +40,7 @@ function cmdInit() {
|
|
|
40
40
|
if (!fs_1.default.existsSync(globalContextPath)) {
|
|
41
41
|
fs_1.default.writeFileSync(globalContextPath, `# Global Context
|
|
42
42
|
|
|
43
|
-
This file is injected into every
|
|
43
|
+
This file is injected into every AI prompt. Use it to define project-wide
|
|
44
44
|
design principles, code style rules, and safety constraints.
|
|
45
45
|
|
|
46
46
|
---
|
|
@@ -64,7 +64,7 @@ design principles, code style rules, and safety constraints.
|
|
|
64
64
|
|
|
65
65
|
## Safety & Constraints
|
|
66
66
|
|
|
67
|
-
<!-- Rules
|
|
67
|
+
<!-- Rules the AI must always follow when modifying code. Examples: -->
|
|
68
68
|
<!-- - Never modify files outside of files_allowed -->
|
|
69
69
|
<!-- - Do not introduce new external dependencies without a comment explaining why -->
|
|
70
70
|
<!-- - Never remove error handling or logging -->
|
|
@@ -89,7 +89,7 @@ design principles, code style rules, and safety constraints.
|
|
|
89
89
|
|
|
90
90
|
## Additional Notes
|
|
91
91
|
|
|
92
|
-
<!-- Anything else
|
|
92
|
+
<!-- Anything else the AI should always keep in mind for this project. -->
|
|
93
93
|
|
|
94
94
|
`, 'utf-8');
|
|
95
95
|
}
|
|
@@ -102,7 +102,7 @@ design principles, code style rules, and safety constraints.
|
|
|
102
102
|
console.log('');
|
|
103
103
|
console.log(chalk_1.default.yellow('Tip: add .tempo/sessions/ and .tempo/runs/ to your .gitignore'));
|
|
104
104
|
}
|
|
105
|
-
function cmdCompile(args) {
|
|
105
|
+
async function cmdCompile(args) {
|
|
106
106
|
const fileName = args[0];
|
|
107
107
|
if (!fileName) {
|
|
108
108
|
console.error(chalk_1.default.red('Usage: tempo compile <file>'));
|
|
@@ -112,7 +112,7 @@ function cmdCompile(args) {
|
|
|
112
112
|
? fileName
|
|
113
113
|
: path_1.default.join(cwd, '.tempo', 'ideation', fileName);
|
|
114
114
|
try {
|
|
115
|
-
const outPath = (0, compile_1.compileIdeation)(filePath, cwd);
|
|
115
|
+
const outPath = await (0, compile_1.compileIdeation)(filePath, cwd);
|
|
116
116
|
console.log(chalk_1.default.green(`✓ Score compiled → ${outPath}`));
|
|
117
117
|
}
|
|
118
118
|
catch (err) {
|
|
@@ -158,7 +158,7 @@ async function main() {
|
|
|
158
158
|
cmdInit();
|
|
159
159
|
break;
|
|
160
160
|
case 'compile':
|
|
161
|
-
cmdCompile(args);
|
|
161
|
+
await cmdCompile(args);
|
|
162
162
|
break;
|
|
163
163
|
case 'tune':
|
|
164
164
|
await (0, tune_1.tuneIdeation)(cwd);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;AAEA,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,2CAA4C;AAC5C,2DAAwD;AACxD,iDAAsD;AACtD,2CAAgD;AAEhD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE1B,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;IACpH,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,OAAO;IACd,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAExD,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,aAAa,CACd,UAAU,EACV,IAAI,CAAC,SAAS,CACZ;YACE,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,eAAe;YAC7B,WAAW,EAAE,cAAc;SAC5B,EACD,IAAI,EACJ,CAAC,CACF,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACnE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,YAAE,CAAC,aAAa,CACd,iBAAiB,EACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDL,EACK,OAAO,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,10 +16,10 @@ function ensureHistoryDir(cwd, runTimestamp) {
|
|
|
16
16
|
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
17
17
|
return dir;
|
|
18
18
|
}
|
|
19
|
-
function saveStepHistory(historyDir, stepId, instruction, filesAllowed,
|
|
19
|
+
function saveStepHistory(historyDir, stepId, instruction, filesAllowed, aiResponse, result) {
|
|
20
20
|
const content = `# Step ${stepId}
|
|
21
21
|
|
|
22
|
-
## Instruction Sent to
|
|
22
|
+
## Instruction Sent to AI
|
|
23
23
|
|
|
24
24
|
\`\`\`
|
|
25
25
|
${instruction}
|
|
@@ -29,10 +29,10 @@ ${instruction}
|
|
|
29
29
|
|
|
30
30
|
${filesAllowed.map((f) => `- ${f}`).join('\n')}
|
|
31
31
|
|
|
32
|
-
##
|
|
32
|
+
## AI Response
|
|
33
33
|
|
|
34
34
|
\`\`\`
|
|
35
|
-
${
|
|
35
|
+
${aiResponse}
|
|
36
36
|
\`\`\`
|
|
37
37
|
|
|
38
38
|
## Result
|
|
@@ -85,7 +85,7 @@ async function runPipeline(spec, cwd) {
|
|
|
85
85
|
const validation = await (0, runValidation_1.runValidation)(cwd);
|
|
86
86
|
if (validation.success) {
|
|
87
87
|
(0, logger_1.logSuccess)(`Step ${step.id} passed validation`);
|
|
88
|
-
saveStepHistory(historyDir, step.id, stepResult.instruction, stepResult.filesAllowed, stepResult.
|
|
88
|
+
saveStepHistory(historyDir, step.id, stepResult.instruction, stepResult.filesAllowed, stepResult.aiResponse, 'success');
|
|
89
89
|
succeeded = true;
|
|
90
90
|
passed++;
|
|
91
91
|
break;
|
|
@@ -94,7 +94,7 @@ async function runPipeline(spec, cwd) {
|
|
|
94
94
|
(0, logger_1.logRetry)(attempt, MAX_RETRIES, validation.errors);
|
|
95
95
|
if (attempt === MAX_RETRIES) {
|
|
96
96
|
saveErrors(historyDir, step.id, validation.errors, attempt);
|
|
97
|
-
saveStepHistory(historyDir, step.id, stepResult.instruction, stepResult.filesAllowed, stepResult.
|
|
97
|
+
saveStepHistory(historyDir, step.id, stepResult.instruction, stepResult.filesAllowed, stepResult.aiResponse, 'failure');
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
if (!succeeded) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runPipeline.js","sourceRoot":"","sources":["../../src/controller/runPipeline.ts"],"names":[],"mappings":";;;;;AA8EA,kCAkEC;AAhJD,gDAAwB;AACxB,4CAAoB;AACpB,kDAA0B;AAE1B,iDAA8C;AAC9C,8DAA2D;AAC3D,4CAAiG;AAEjG,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,SAAS,gBAAgB,CAAC,GAAW,EAAE,YAAoB;IACzD,MAAM,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,YAAY,EAAE,CAAC,CAAC;IAC5E,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CACtB,UAAkB,EAClB,MAAc,EACd,WAAmB,EACnB,YAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"runPipeline.js","sourceRoot":"","sources":["../../src/controller/runPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiClient.d.ts","sourceRoot":"","sources":["../../src/executor/aiClient.ts"],"names":[],"mappings":"AAKA,wBAAsB,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCtF"}
|
|
@@ -3,11 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.callAI = callAI;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
8
|
const GEMINI_MODEL = 'gemini-2.5-flash';
|
|
9
9
|
const GEMINI_API_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent`;
|
|
10
|
-
async function
|
|
10
|
+
async function callAI(systemPrompt, userPrompt) {
|
|
11
11
|
const apiKey = process.env.GEMINI_API_KEY;
|
|
12
12
|
if (!apiKey) {
|
|
13
13
|
throw new Error('GEMINI_API_KEY environment variable is not set');
|
|
@@ -36,4 +36,4 @@ async function callClaude(systemPrompt, userPrompt) {
|
|
|
36
36
|
}
|
|
37
37
|
return text;
|
|
38
38
|
}
|
|
39
|
-
//# sourceMappingURL=
|
|
39
|
+
//# sourceMappingURL=aiClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/executor/aiClient.ts"],"names":[],"mappings":";;;;;AAKA,wBAiCC;AAtCD,kDAA0C;AAE1C,MAAM,YAAY,GAAG,kBAAkB,CAAC;AACxC,MAAM,cAAc,GAAG,2DAA2D,YAAY,kBAAkB,CAAC;AAE1G,KAAK,UAAU,MAAM,CAAC,YAAoB,EAAE,UAAkB;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CACzB,GAAG,cAAc,QAAQ,MAAM,EAAE,EACjC;YACE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;YACtD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YAC3D,gBAAgB,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;SAC5C,EACD;YACE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,GAAiB,CAAC;QACnC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACtE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -3,7 +3,7 @@ export interface StepResult {
|
|
|
3
3
|
stepId: number;
|
|
4
4
|
instruction: string;
|
|
5
5
|
filesAllowed: string[];
|
|
6
|
-
|
|
6
|
+
aiResponse: string;
|
|
7
7
|
filesWritten: string[];
|
|
8
8
|
}
|
|
9
9
|
export declare function runStep(step: Step, spec: Spec, cwd: string, extraContext?: string): Promise<StepResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runStep.d.ts","sourceRoot":"","sources":["../../src/executor/runStep.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA8B5C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,
|
|
1
|
+
{"version":3,"file":"runStep.d.ts","sourceRoot":"","sources":["../../src/executor/runStep.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA8B5C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA0CD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CAoCrB"}
|
package/dist/executor/runStep.js
CHANGED
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.runStep = runStep;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const
|
|
9
|
+
const aiClient_1 = require("./aiClient");
|
|
10
10
|
const logger_1 = require("../utils/logger");
|
|
11
11
|
const BASE_SYSTEM_PROMPT = `You are an expert software engineer. You will receive:
|
|
12
12
|
1. A task description
|
|
@@ -45,7 +45,7 @@ function readAllowedFiles(filesAllowed, cwd) {
|
|
|
45
45
|
}
|
|
46
46
|
return contents;
|
|
47
47
|
}
|
|
48
|
-
function
|
|
48
|
+
function parseAIResponse(response) {
|
|
49
49
|
const files = {};
|
|
50
50
|
const regex = /===FILE: (.+?)===\n([\s\S]*?)===END===/g;
|
|
51
51
|
let match;
|
|
@@ -90,15 +90,15 @@ Current file contents:
|
|
|
90
90
|
${fileSection}
|
|
91
91
|
${extraContext ? `\nAdditional context:\n${extraContext}` : ''}
|
|
92
92
|
`.trim();
|
|
93
|
-
(0, logger_1.logInfo)(`Sending step ${step.id} to
|
|
94
|
-
const
|
|
95
|
-
const parsedFiles =
|
|
93
|
+
(0, logger_1.logInfo)(`Sending step ${step.id} to AI...`);
|
|
94
|
+
const aiResponse = await (0, aiClient_1.callAI)(buildSystemPrompt(cwd), instruction);
|
|
95
|
+
const parsedFiles = parseAIResponse(aiResponse);
|
|
96
96
|
const filesWritten = writeFiles(parsedFiles, cwd, step.files_allowed);
|
|
97
97
|
return {
|
|
98
98
|
stepId: step.id,
|
|
99
99
|
instruction,
|
|
100
100
|
filesAllowed: step.files_allowed,
|
|
101
|
-
|
|
101
|
+
aiResponse,
|
|
102
102
|
filesWritten,
|
|
103
103
|
};
|
|
104
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runStep.js","sourceRoot":"","sources":["../../src/executor/runStep.ts"],"names":[],"mappings":";;;;;AAgFA,0BAyCC;AAzHD,4CAAoB;AACpB,gDAAwB;AAExB,
|
|
1
|
+
{"version":3,"file":"runStep.js","sourceRoot":"","sources":["../../src/executor/runStep.ts"],"names":[],"mappings":";;;;;AAgFA,0BAyCC;AAzHD,4CAAoB;AACpB,gDAAwB;AAExB,yCAAoC;AACpC,4CAA0C;AAE1C,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;mDAewB,CAAC;AAEpD,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACxE,IAAI,YAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,YAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACzE,OAAO,GAAG,kBAAkB,cAAc,aAAa,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAUD,SAAS,gBAAgB,CAAC,YAAsB,EAAE,GAAW;IAC3D,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,QAAQ,CAAC,GAAG,YAAE,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,QAAQ,CAAC,GAAG,uCAAuC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,yCAAyC,CAAC;IACxD,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,KAA6B,EAAE,GAAW,EAAE,OAAiB;IAC/E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,IAAA,gBAAO,EAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,YAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,IAAU,EACV,IAAU,EACV,GAAW,EACX,YAAqB;IAErB,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC;SACjD,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,WAAW,GAAG;QACd,IAAI,CAAC,IAAI;;;EAGf,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;OAE3C,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW;;;EAGjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG7B,WAAW;EACX,YAAY,CAAC,CAAC,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;CAC7D,CAAC,IAAI,EAAE,CAAC;IAEP,IAAA,gBAAO,EAAC,gBAAgB,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,IAAA,iBAAM,EAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;IAErE,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAEtE,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,WAAW;QACX,YAAY,EAAE,IAAI,CAAC,aAAa;QAChC,UAAU;QACV,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function compileIdeation(filePath: string, cwd: string): string
|
|
1
|
+
export declare function compileIdeation(filePath: string, cwd: string): Promise<string>;
|
|
2
2
|
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/ideation/compile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/ideation/compile.ts"],"names":[],"mappings":"AAiCA,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CpF"}
|
package/dist/ideation/compile.js
CHANGED
|
@@ -6,84 +6,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.compileIdeation = compileIdeation;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
let currentSection = null;
|
|
24
|
-
const buffer = [];
|
|
25
|
-
function flush() {
|
|
26
|
-
if (!currentSection)
|
|
27
|
-
return;
|
|
28
|
-
const text = buffer.join('\n').trim();
|
|
29
|
-
if (currentSection === 'ideas') {
|
|
30
|
-
sections.ideas = text
|
|
31
|
-
.split('\n')
|
|
32
|
-
.map((l) => l.replace(/^[-*]\s*/, '').trim())
|
|
33
|
-
.filter(Boolean);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
sections[currentSection] = text;
|
|
37
|
-
}
|
|
38
|
-
buffer.length = 0;
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const aiClient_1 = require("../executor/aiClient");
|
|
11
|
+
const schema_1 = require("../spec/schema");
|
|
12
|
+
const SYSTEM_PROMPT = `You are a senior software architect and project planner. Analyze a markdown ideation document and produce a structured execution score as a valid JSON object.
|
|
13
|
+
|
|
14
|
+
The JSON must strictly follow this schema:
|
|
15
|
+
{
|
|
16
|
+
"goal": "<one concise sentence describing the overall feature objective>",
|
|
17
|
+
"constraints": ["<project constraints, rules, and technical boundaries the implementation must respect>"],
|
|
18
|
+
"steps": [
|
|
19
|
+
{
|
|
20
|
+
"id": 1,
|
|
21
|
+
"description": "<clear, actionable step description>",
|
|
22
|
+
"files_allowed": ["<file paths relative to project root that this step creates or modifies>"]
|
|
39
23
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
flush();
|
|
44
|
-
const heading = headingMatch[1].toLowerCase().trim();
|
|
45
|
-
currentSection = sectionMap[heading] ?? null;
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
buffer.push(line);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
flush();
|
|
52
|
-
return sections;
|
|
53
|
-
}
|
|
54
|
-
function buildSpec(parsed, name) {
|
|
55
|
-
const planLines = parsed.finalPlan.split('\n').filter(Boolean);
|
|
56
|
-
const steps = planLines
|
|
57
|
-
.map((line, i) => ({
|
|
58
|
-
id: i + 1,
|
|
59
|
-
description: line.replace(/^\d+[.)]\s*/, '').trim(),
|
|
60
|
-
files_allowed: [],
|
|
61
|
-
}))
|
|
62
|
-
.filter((s) => s.description.length > 0);
|
|
63
|
-
return {
|
|
64
|
-
goal: parsed.goal || name,
|
|
65
|
-
constraints: parsed.context
|
|
66
|
-
.split('\n')
|
|
67
|
-
.map((l) => l.replace(/^[-*]\s*/, '').trim())
|
|
68
|
-
.filter(Boolean),
|
|
69
|
-
steps: steps.length > 0
|
|
70
|
-
? steps
|
|
71
|
-
: [{ id: 1, description: parsed.finalPlan || 'Implement the plan', files_allowed: [] }],
|
|
72
|
-
tests: [],
|
|
73
|
-
definition_of_done: parsed.ideas,
|
|
74
|
-
};
|
|
24
|
+
],
|
|
25
|
+
"tests": ["<specific, verifiable test case descriptions>"],
|
|
26
|
+
"definition_of_done": ["<measurable acceptance criteria that must be true when the feature is complete>"]
|
|
75
27
|
}
|
|
76
|
-
|
|
28
|
+
|
|
29
|
+
Guidelines:
|
|
30
|
+
- Break the work into sequential, granular steps — each step should be a single focused unit of work
|
|
31
|
+
- Populate files_allowed with specific file paths (not directories) for each step
|
|
32
|
+
- tests must be concrete and verifiable (e.g. "GET /api/users returns 200 with a list of users")
|
|
33
|
+
- definition_of_done must be measurable outcomes (e.g. "All API endpoints return correct HTTP status codes")
|
|
34
|
+
- constraints should capture all technical rules, style requirements, and boundaries mentioned in the ideation
|
|
35
|
+
- Step IDs must be sequential integers starting from 1
|
|
36
|
+
|
|
37
|
+
Respond ONLY with the raw JSON object. No explanations, no markdown code fences, no extra text.`;
|
|
38
|
+
async function compileIdeation(filePath, cwd) {
|
|
77
39
|
if (!fs_1.default.existsSync(filePath)) {
|
|
78
40
|
throw new Error(`File not found: ${filePath}`);
|
|
79
41
|
}
|
|
80
|
-
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
42
|
+
const content = fs_1.default.readFileSync(filePath, 'utf-8').trim();
|
|
81
43
|
const name = path_1.default.basename(filePath, path_1.default.extname(filePath));
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
44
|
+
console.log(chalk_1.default.bold(`\nCompiling: ${path_1.default.basename(filePath)}`));
|
|
45
|
+
let aiResponse;
|
|
46
|
+
try {
|
|
47
|
+
aiResponse = await (0, aiClient_1.callAI)(SYSTEM_PROMPT, `Here is the ideation document:\n\n${content}`);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
throw new Error(`AI call failed: ${err.message}`);
|
|
51
|
+
}
|
|
52
|
+
// Strip markdown code fences if present (```json ... ```)
|
|
53
|
+
const jsonText = aiResponse
|
|
54
|
+
.replace(/^```(?:json)?\s*/i, '')
|
|
55
|
+
.replace(/\s*```\s*$/, '')
|
|
56
|
+
.trim();
|
|
57
|
+
let raw;
|
|
58
|
+
try {
|
|
59
|
+
raw = JSON.parse(jsonText);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new Error(`AI returned invalid JSON. Response:\n${jsonText.slice(0, 500)}`);
|
|
63
|
+
}
|
|
64
|
+
const parsed = schema_1.SpecSchema.safeParse(raw);
|
|
65
|
+
if (!parsed.success) {
|
|
66
|
+
throw new Error(`AI response does not match score schema:\n${JSON.stringify(parsed.error.format(), null, 2)}`);
|
|
67
|
+
}
|
|
68
|
+
const spec = parsed.data;
|
|
69
|
+
const scoresDir = path_1.default.join(cwd, '.tempo', 'scores');
|
|
70
|
+
fs_1.default.mkdirSync(scoresDir, { recursive: true });
|
|
71
|
+
const outPath = path_1.default.join(scoresDir, `${name}.json`);
|
|
87
72
|
fs_1.default.writeFileSync(outPath, JSON.stringify(spec, null, 2), 'utf-8');
|
|
88
73
|
return outPath;
|
|
89
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/ideation/compile.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/ideation/compile.ts"],"names":[],"mappings":";;;;;AAiCA,0CA4CC;AA7ED,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,mDAA8C;AAC9C,2CAAkD;AAElD,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;gGAyB0E,CAAC;AAE1F,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,GAAW;IACjE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnE,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,IAAA,iBAAM,EAAC,aAAa,EAAE,qCAAqC,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAoB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,UAAU;SACxB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,IAAI,EAAE,CAAC;IAEV,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,MAAM,GAAG,mBAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,IAAI,GAAS,MAAM,CAAC,IAAI,CAAC;IAE/B,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrD,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACrD,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAElE,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/ideation/tune.js
CHANGED
|
@@ -7,7 +7,7 @@ exports.tuneIdeation = tuneIdeation;
|
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
-
const
|
|
10
|
+
const aiClient_1 = require("../executor/aiClient");
|
|
11
11
|
const ROUGH_PREFIX_REGEX = /^\[(rough|r)\]/i;
|
|
12
12
|
const SYSTEM_PROMPT = `You are a senior software architect. Your task is to transform a rough feature blurb into a clean, organized design specification.
|
|
13
13
|
|
|
@@ -51,10 +51,10 @@ async function tuneIdeation(cwd) {
|
|
|
51
51
|
const blurb = fs_1.default.readFileSync(filePath, 'utf-8').trim();
|
|
52
52
|
let spec;
|
|
53
53
|
try {
|
|
54
|
-
spec = await (0,
|
|
54
|
+
spec = await (0, aiClient_1.callAI)(SYSTEM_PROMPT, `Here is the rough feature blurb:\n\n${blurb}`);
|
|
55
55
|
}
|
|
56
56
|
catch (err) {
|
|
57
|
-
console.error(chalk_1.default.red(` ✗
|
|
57
|
+
console.error(chalk_1.default.red(` ✗ AI call failed: ${err.message}`));
|
|
58
58
|
continue;
|
|
59
59
|
}
|
|
60
60
|
const output = `${spec.trim()}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tune.js","sourceRoot":"","sources":["../../src/ideation/tune.ts"],"names":[],"mappings":";;;;;AAgCA,oCAiDC;AAjFD,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"tune.js","sourceRoot":"","sources":["../../src/ideation/tune.ts"],"names":[],"mappings":";;;;;AAgCA,oCAiDC;AAjFD,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,mDAA8C;AAE9C,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAE7C,MAAM,aAAa,GAAG;;;;;;;;;;yNAUmM,CAAC;AAE1N,SAAS,cAAc,CAAC,WAAmB;IACzC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAE3C,OAAO,YAAE;SACN,WAAW,CAAC,WAAW,CAAC;SACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACvE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0FAA0F,CAAC,CAAC,CAAC;QACtH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,MAAM,2BAA2B,CAAC,CAAC,CAAC;IACjF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,cAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,YAAY,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC;QAElE,MAAM,KAAK,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAExD,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAA,iBAAM,EAAC,aAAa,EAAE,uCAAuC,KAAK,EAAE,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;;;;;;EAM/B,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;;CAElC,CAAC;QAEE,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAExB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tempo-agent",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "A modular CLI tool for AI-driven code generation and validation",
|
|
5
5
|
"main": "dist/cli/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
"cli",
|
|
23
23
|
"tempo",
|
|
24
24
|
"orchestrator",
|
|
25
|
-
"claude",
|
|
26
25
|
"ai"
|
|
27
26
|
],
|
|
28
27
|
"repository": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claudeClient.d.ts","sourceRoot":"","sources":["../../src/executor/claudeClient.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC1F"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claudeClient.js","sourceRoot":"","sources":["../../src/executor/claudeClient.ts"],"names":[],"mappings":";;;;;AAKA,gCAiCC;AAtCD,kDAA0C;AAE1C,MAAM,YAAY,GAAG,kBAAkB,CAAC;AACxC,MAAM,cAAc,GAAG,2DAA2D,YAAY,kBAAkB,CAAC;AAE1G,KAAK,UAAU,UAAU,CAAC,YAAoB,EAAE,UAAkB;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CACzB,GAAG,cAAc,QAAQ,MAAM,EAAE,EACjC;YACE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;YACtD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YAC3D,gBAAgB,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;SAC5C,EACD;YACE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,GAAiB,CAAC;QACnC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACtE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|