monty-autonomous-fullstack-dev-multillm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +81 -0
- package/README.md +608 -0
- package/bin/cli.js +448 -0
- package/dist/agents/coding.d.ts +15 -0
- package/dist/agents/coding.d.ts.map +1 -0
- package/dist/agents/coding.js +189 -0
- package/dist/agents/coding.js.map +1 -0
- package/dist/agents/initializer.d.ts +15 -0
- package/dist/agents/initializer.d.ts.map +1 -0
- package/dist/agents/initializer.js +87 -0
- package/dist/agents/initializer.js.map +1 -0
- package/dist/agents/prompts/arbitrator.md +143 -0
- package/dist/agents/prompts/coding.md +247 -0
- package/dist/agents/prompts/initializer.md +98 -0
- package/dist/config/agent-config.d.ts +103 -0
- package/dist/config/agent-config.d.ts.map +1 -0
- package/dist/config/agent-config.js +138 -0
- package/dist/config/agent-config.js.map +1 -0
- package/dist/config/auth-config.d.ts +152 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +139 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/config/mcp-config.d.ts +109 -0
- package/dist/config/mcp-config.d.ts.map +1 -0
- package/dist/config/mcp-config.js +234 -0
- package/dist/config/mcp-config.js.map +1 -0
- package/dist/config/provider-config.d.ts +139 -0
- package/dist/config/provider-config.d.ts.map +1 -0
- package/dist/config/provider-config.js +344 -0
- package/dist/config/provider-config.js.map +1 -0
- package/dist/config/subagents-config.d.ts +85 -0
- package/dist/config/subagents-config.d.ts.map +1 -0
- package/dist/config/subagents-config.js +430 -0
- package/dist/config/subagents-config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +385 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/arbitrator.d.ts +93 -0
- package/dist/orchestrator/arbitrator.d.ts.map +1 -0
- package/dist/orchestrator/arbitrator.js +330 -0
- package/dist/orchestrator/arbitrator.js.map +1 -0
- package/dist/orchestrator/index.d.ts +113 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +217 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/review-coordinator.d.ts +143 -0
- package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
- package/dist/orchestrator/review-coordinator.js +401 -0
- package/dist/orchestrator/review-coordinator.js.map +1 -0
- package/dist/orchestrator/task-classifier.d.ts +87 -0
- package/dist/orchestrator/task-classifier.d.ts.map +1 -0
- package/dist/orchestrator/task-classifier.js +250 -0
- package/dist/orchestrator/task-classifier.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +64 -0
- package/dist/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/providers/anthropic-provider.js +264 -0
- package/dist/providers/anthropic-provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +219 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +143 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/cursor-provider.d.ts +82 -0
- package/dist/providers/cursor-provider.d.ts.map +1 -0
- package/dist/providers/cursor-provider.js +321 -0
- package/dist/providers/cursor-provider.js.map +1 -0
- package/dist/providers/google-provider.d.ts +75 -0
- package/dist/providers/google-provider.d.ts.map +1 -0
- package/dist/providers/google-provider.js +274 -0
- package/dist/providers/google-provider.js.map +1 -0
- package/dist/providers/index.d.ts +92 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +233 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +83 -0
- package/dist/providers/openai-provider.d.ts.map +1 -0
- package/dist/providers/openai-provider.js +295 -0
- package/dist/providers/openai-provider.js.map +1 -0
- package/dist/templates/feature_list.template.json +66 -0
- package/dist/templates/progress.template.txt +51 -0
- package/dist/utils/auth-manager.d.ts +121 -0
- package/dist/utils/auth-manager.d.ts.map +1 -0
- package/dist/utils/auth-manager.js +560 -0
- package/dist/utils/auth-manager.js.map +1 -0
- package/dist/utils/budget-enforcer.d.ts +181 -0
- package/dist/utils/budget-enforcer.d.ts.map +1 -0
- package/dist/utils/budget-enforcer.js +386 -0
- package/dist/utils/budget-enforcer.js.map +1 -0
- package/dist/utils/chatgpt-detector.d.ts +51 -0
- package/dist/utils/chatgpt-detector.d.ts.map +1 -0
- package/dist/utils/chatgpt-detector.js +274 -0
- package/dist/utils/chatgpt-detector.js.map +1 -0
- package/dist/utils/claude-code-detector.d.ts +39 -0
- package/dist/utils/claude-code-detector.d.ts.map +1 -0
- package/dist/utils/claude-code-detector.js +153 -0
- package/dist/utils/claude-code-detector.js.map +1 -0
- package/dist/utils/code-quality.d.ts +58 -0
- package/dist/utils/code-quality.d.ts.map +1 -0
- package/dist/utils/code-quality.js +258 -0
- package/dist/utils/code-quality.js.map +1 -0
- package/dist/utils/context-primer.d.ts +50 -0
- package/dist/utils/context-primer.d.ts.map +1 -0
- package/dist/utils/context-primer.js +429 -0
- package/dist/utils/context-primer.js.map +1 -0
- package/dist/utils/dependency-management.d.ts +40 -0
- package/dist/utils/dependency-management.d.ts.map +1 -0
- package/dist/utils/dependency-management.js +123 -0
- package/dist/utils/dependency-management.js.map +1 -0
- package/dist/utils/environment-validation.d.ts +33 -0
- package/dist/utils/environment-validation.d.ts.map +1 -0
- package/dist/utils/environment-validation.js +136 -0
- package/dist/utils/environment-validation.js.map +1 -0
- package/dist/utils/error-recovery.d.ts +60 -0
- package/dist/utils/error-recovery.d.ts.map +1 -0
- package/dist/utils/error-recovery.js +183 -0
- package/dist/utils/error-recovery.js.map +1 -0
- package/dist/utils/feature-list.d.ts +102 -0
- package/dist/utils/feature-list.d.ts.map +1 -0
- package/dist/utils/feature-list.js +191 -0
- package/dist/utils/feature-list.js.map +1 -0
- package/dist/utils/gemini-detector.d.ts +65 -0
- package/dist/utils/gemini-detector.d.ts.map +1 -0
- package/dist/utils/gemini-detector.js +340 -0
- package/dist/utils/gemini-detector.js.map +1 -0
- package/dist/utils/git-utils.d.ts +48 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +110 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/health-check.d.ts +32 -0
- package/dist/utils/health-check.d.ts.map +1 -0
- package/dist/utils/health-check.js +152 -0
- package/dist/utils/health-check.js.map +1 -0
- package/dist/utils/hooks-manager.d.ts +154 -0
- package/dist/utils/hooks-manager.d.ts.map +1 -0
- package/dist/utils/hooks-manager.js +359 -0
- package/dist/utils/hooks-manager.js.map +1 -0
- package/dist/utils/multi-auth-manager.d.ts +144 -0
- package/dist/utils/multi-auth-manager.d.ts.map +1 -0
- package/dist/utils/multi-auth-manager.js +588 -0
- package/dist/utils/multi-auth-manager.js.map +1 -0
- package/dist/utils/progress.d.ts +49 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +209 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/project-detection.d.ts +40 -0
- package/dist/utils/project-detection.d.ts.map +1 -0
- package/dist/utils/project-detection.js +230 -0
- package/dist/utils/project-detection.js.map +1 -0
- package/dist/utils/session-manager.d.ts +119 -0
- package/dist/utils/session-manager.d.ts.map +1 -0
- package/dist/utils/session-manager.js +389 -0
- package/dist/utils/session-manager.js.map +1 -0
- package/dist/utils/skills-manager.d.ts +113 -0
- package/dist/utils/skills-manager.d.ts.map +1 -0
- package/dist/utils/skills-manager.js +332 -0
- package/dist/utils/skills-manager.js.map +1 -0
- package/dist/utils/structured-output.d.ts +117 -0
- package/dist/utils/structured-output.d.ts.map +1 -0
- package/dist/utils/structured-output.js +191 -0
- package/dist/utils/structured-output.js.map +1 -0
- package/dist/utils/subagent-manager.d.ts +143 -0
- package/dist/utils/subagent-manager.d.ts.map +1 -0
- package/dist/utils/subagent-manager.js +326 -0
- package/dist/utils/subagent-manager.js.map +1 -0
- package/dist/utils/supabase-setup.d.ts +50 -0
- package/dist/utils/supabase-setup.d.ts.map +1 -0
- package/dist/utils/supabase-setup.js +151 -0
- package/dist/utils/supabase-setup.js.map +1 -0
- package/dist/utils/token-refresh.d.ts +21 -0
- package/dist/utils/token-refresh.d.ts.map +1 -0
- package/dist/utils/token-refresh.js +77 -0
- package/dist/utils/token-refresh.js.map +1 -0
- package/dist/utils/tos-warning.d.ts +115 -0
- package/dist/utils/tos-warning.d.ts.map +1 -0
- package/dist/utils/tos-warning.js +304 -0
- package/dist/utils/tos-warning.js.map +1 -0
- package/dist/utils/usage-monitor.d.ts +156 -0
- package/dist/utils/usage-monitor.d.ts.map +1 -0
- package/dist/utils/usage-monitor.js +296 -0
- package/dist/utils/usage-monitor.js.map +1 -0
- package/package.json +105 -0
- package/scripts/init.ps1 +73 -0
- package/scripts/init.sh +86 -0
- package/scripts/test-auth.sh +90 -0
- package/templates/feature_list.template.json +66 -0
- package/templates/progress.template.txt +51 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Validation Utilities
|
|
3
|
+
* Validates environment variables, configuration files, and required setup.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from "fs";
|
|
6
|
+
import { resolve } from "path";
|
|
7
|
+
import { agentConfig } from "../config/agent-config.js";
|
|
8
|
+
/**
|
|
9
|
+
* Validate environment variables from .env file
|
|
10
|
+
*/
|
|
11
|
+
export function validateEnvironment() {
|
|
12
|
+
const root = agentConfig.paths.projectRoot;
|
|
13
|
+
const envPath = resolve(root, ".env");
|
|
14
|
+
const envExamplePath = resolve(root, ".env.example");
|
|
15
|
+
const result = {
|
|
16
|
+
valid: true,
|
|
17
|
+
missing: [],
|
|
18
|
+
invalid: [],
|
|
19
|
+
warnings: [],
|
|
20
|
+
recommendations: [],
|
|
21
|
+
};
|
|
22
|
+
// Check if .env file exists
|
|
23
|
+
if (!existsSync(envPath)) {
|
|
24
|
+
if (existsSync(envExamplePath)) {
|
|
25
|
+
result.warnings.push(".env file not found, but .env.example exists");
|
|
26
|
+
result.recommendations.push("Copy .env.example to .env and fill in values");
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
result.warnings.push(".env file not found");
|
|
30
|
+
result.recommendations.push("Create .env file if environment variables are needed");
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
// Read .env file
|
|
35
|
+
try {
|
|
36
|
+
const envContent = readFileSync(envPath, "utf-8");
|
|
37
|
+
const lines = envContent.split("\n");
|
|
38
|
+
const envVars = {};
|
|
39
|
+
for (const line of lines) {
|
|
40
|
+
const trimmed = line.trim();
|
|
41
|
+
if (trimmed && !trimmed.startsWith("#")) {
|
|
42
|
+
const eqIndex = trimmed.indexOf("=");
|
|
43
|
+
if (eqIndex > 0) {
|
|
44
|
+
const key = trimmed.substring(0, eqIndex).trim();
|
|
45
|
+
const value = trimmed.substring(eqIndex + 1).trim().replace(/^["']|["']$/g, "");
|
|
46
|
+
envVars[key] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Check for placeholder values
|
|
51
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
52
|
+
if (!value || value === "placeholder" || value === "your-value-here" || value.startsWith("YOUR_")) {
|
|
53
|
+
result.invalid.push(key);
|
|
54
|
+
result.valid = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Check for common required variables based on project type
|
|
58
|
+
// This is a heuristic - actual requirements depend on the project
|
|
59
|
+
if (envVars["VITE_SUPABASE_URL"] && envVars["VITE_SUPABASE_ANON_KEY"]) {
|
|
60
|
+
// Supabase project - check if values are valid
|
|
61
|
+
if (envVars["VITE_SUPABASE_URL"] === "https://your-project.supabase.co") {
|
|
62
|
+
result.invalid.push("VITE_SUPABASE_URL");
|
|
63
|
+
result.valid = false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
result.warnings.push(`Error reading .env file: ${error instanceof Error ? error.message : String(error)}`);
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check for required configuration files
|
|
74
|
+
*/
|
|
75
|
+
export function checkRequiredConfigs() {
|
|
76
|
+
const root = agentConfig.paths.projectRoot;
|
|
77
|
+
const missing = [];
|
|
78
|
+
// Common config files that might be required
|
|
79
|
+
const configs = [
|
|
80
|
+
{ file: "package.json", required: true },
|
|
81
|
+
{ file: "tsconfig.json", required: false },
|
|
82
|
+
{ file: "vite.config.ts", required: false },
|
|
83
|
+
{ file: "next.config.js", required: false },
|
|
84
|
+
{ file: "tailwind.config.js", required: false },
|
|
85
|
+
];
|
|
86
|
+
for (const config of configs) {
|
|
87
|
+
if (config.required && !existsSync(resolve(root, config.file))) {
|
|
88
|
+
missing.push(config.file);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return missing;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Generate environment validation summary
|
|
95
|
+
*/
|
|
96
|
+
export function generateEnvironmentSummary() {
|
|
97
|
+
const validation = validateEnvironment();
|
|
98
|
+
const missingConfigs = checkRequiredConfigs();
|
|
99
|
+
let summary = "\n## ENVIRONMENT VALIDATION\n\n";
|
|
100
|
+
if (validation.valid && missingConfigs.length === 0) {
|
|
101
|
+
summary += "✅ Environment configuration valid\n";
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
if (!validation.valid) {
|
|
105
|
+
summary += "❌ Environment validation failed\n";
|
|
106
|
+
}
|
|
107
|
+
if (missingConfigs.length > 0) {
|
|
108
|
+
summary += `⚠️ Missing required config files: ${missingConfigs.join(", ")}\n`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (validation.invalid.length > 0) {
|
|
112
|
+
summary += "\n🚨 Invalid Environment Variables:\n";
|
|
113
|
+
validation.invalid.forEach(key => {
|
|
114
|
+
summary += ` - ${key} (contains placeholder or invalid value)\n`;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (validation.warnings.length > 0) {
|
|
118
|
+
summary += "\n⚠️ Warnings:\n";
|
|
119
|
+
validation.warnings.forEach(warning => {
|
|
120
|
+
summary += ` - ${warning}\n`;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (validation.recommendations.length > 0) {
|
|
124
|
+
summary += "\n💡 Recommendations:\n";
|
|
125
|
+
validation.recommendations.forEach(rec => {
|
|
126
|
+
summary += ` - ${rec}\n`;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return summary;
|
|
130
|
+
}
|
|
131
|
+
export default {
|
|
132
|
+
validateEnvironment,
|
|
133
|
+
checkRequiredConfigs,
|
|
134
|
+
generateEnvironmentSummary,
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=environment-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-validation.js","sourceRoot":"","sources":["../../src/utils/environment-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Recovery Utilities
|
|
3
|
+
* Provides rollback capabilities, error tracking, and recovery strategies.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Error entry
|
|
7
|
+
*/
|
|
8
|
+
export interface ErrorEntry {
|
|
9
|
+
timestamp: string;
|
|
10
|
+
session: string;
|
|
11
|
+
error: string;
|
|
12
|
+
context: string;
|
|
13
|
+
recovery: string | null;
|
|
14
|
+
resolved: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Session checkpoint for rollback
|
|
18
|
+
*/
|
|
19
|
+
export interface Checkpoint {
|
|
20
|
+
timestamp: string;
|
|
21
|
+
session: string;
|
|
22
|
+
gitCommit: string | null;
|
|
23
|
+
featureId: string | null;
|
|
24
|
+
description: string;
|
|
25
|
+
files: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Log an error
|
|
29
|
+
*/
|
|
30
|
+
export declare function logError(error: Error | string, context: string, recovery?: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get recent errors
|
|
33
|
+
*/
|
|
34
|
+
export declare function getRecentErrors(limit?: number): ErrorEntry[];
|
|
35
|
+
/**
|
|
36
|
+
* Create a checkpoint
|
|
37
|
+
*/
|
|
38
|
+
export declare function createCheckpoint(session: string, gitCommit: string | null, featureId: string | null, description: string, files?: string[]): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get recent checkpoints
|
|
41
|
+
*/
|
|
42
|
+
export declare function getRecentCheckpoints(limit?: number): Checkpoint[];
|
|
43
|
+
/**
|
|
44
|
+
* Get the last checkpoint
|
|
45
|
+
*/
|
|
46
|
+
export declare function getLastCheckpoint(): Checkpoint | null;
|
|
47
|
+
/**
|
|
48
|
+
* Generate error recovery summary
|
|
49
|
+
*/
|
|
50
|
+
export declare function generateErrorRecoverySummary(): string;
|
|
51
|
+
declare const _default: {
|
|
52
|
+
logError: typeof logError;
|
|
53
|
+
getRecentErrors: typeof getRecentErrors;
|
|
54
|
+
createCheckpoint: typeof createCheckpoint;
|
|
55
|
+
getRecentCheckpoints: typeof getRecentCheckpoints;
|
|
56
|
+
getLastCheckpoint: typeof getLastCheckpoint;
|
|
57
|
+
generateErrorRecoverySummary: typeof generateErrorRecoverySummary;
|
|
58
|
+
};
|
|
59
|
+
export default _default;
|
|
60
|
+
//# sourceMappingURL=error-recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-recovery.d.ts","sourceRoot":"","sources":["../../src/utils/error-recovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAyBD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,KAAK,GAAG,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAwCN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE,CAchE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,MAAM,EAAO,GACnB,IAAI,CAqCN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,GAAE,MAAU,GAAG,UAAU,EAAE,CAcpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,GAAG,IAAI,CAGrD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CA+BrD;;;;;;;;;AAED,wBAOE"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Recovery Utilities
|
|
3
|
+
* Provides rollback capabilities, error tracking, and recovery strategies.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
6
|
+
import { resolve } from "path";
|
|
7
|
+
import { agentConfig } from "../config/agent-config.js";
|
|
8
|
+
/**
|
|
9
|
+
* Get error log path
|
|
10
|
+
*/
|
|
11
|
+
function getErrorLogPath() {
|
|
12
|
+
return resolve(agentConfig.paths.agentDir, "error-log.json");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get checkpoint path
|
|
16
|
+
*/
|
|
17
|
+
function getCheckpointPath() {
|
|
18
|
+
return resolve(agentConfig.paths.agentDir, "checkpoints.json");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Ensure agent directory exists
|
|
22
|
+
*/
|
|
23
|
+
function ensureAgentDir() {
|
|
24
|
+
if (!existsSync(agentConfig.paths.agentDir)) {
|
|
25
|
+
mkdirSync(agentConfig.paths.agentDir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Log an error
|
|
30
|
+
*/
|
|
31
|
+
export function logError(error, context, recovery) {
|
|
32
|
+
ensureAgentDir();
|
|
33
|
+
const errorLogPath = getErrorLogPath();
|
|
34
|
+
const errorMessage = error instanceof Error ? error.message : error;
|
|
35
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
36
|
+
const entry = {
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
session: `session-${Date.now()}`,
|
|
39
|
+
error: errorMessage,
|
|
40
|
+
context,
|
|
41
|
+
recovery: recovery || null,
|
|
42
|
+
resolved: false,
|
|
43
|
+
};
|
|
44
|
+
let errors = [];
|
|
45
|
+
if (existsSync(errorLogPath)) {
|
|
46
|
+
try {
|
|
47
|
+
const content = readFileSync(errorLogPath, "utf-8");
|
|
48
|
+
errors = JSON.parse(content);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// If file is corrupted, start fresh
|
|
52
|
+
errors = [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
errors.push(entry);
|
|
56
|
+
// Keep only last 100 errors
|
|
57
|
+
if (errors.length > 100) {
|
|
58
|
+
errors = errors.slice(-100);
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
writeFileSync(errorLogPath, JSON.stringify(errors, null, 2), "utf-8");
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Silently fail if we can't write
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get recent errors
|
|
69
|
+
*/
|
|
70
|
+
export function getRecentErrors(limit = 10) {
|
|
71
|
+
const errorLogPath = getErrorLogPath();
|
|
72
|
+
if (!existsSync(errorLogPath)) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const content = readFileSync(errorLogPath, "utf-8");
|
|
77
|
+
const errors = JSON.parse(content);
|
|
78
|
+
return errors.slice(-limit).reverse();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create a checkpoint
|
|
86
|
+
*/
|
|
87
|
+
export function createCheckpoint(session, gitCommit, featureId, description, files = []) {
|
|
88
|
+
ensureAgentDir();
|
|
89
|
+
const checkpointPath = getCheckpointPath();
|
|
90
|
+
const checkpoint = {
|
|
91
|
+
timestamp: new Date().toISOString(),
|
|
92
|
+
session,
|
|
93
|
+
gitCommit,
|
|
94
|
+
featureId,
|
|
95
|
+
description,
|
|
96
|
+
files,
|
|
97
|
+
};
|
|
98
|
+
let checkpoints = [];
|
|
99
|
+
if (existsSync(checkpointPath)) {
|
|
100
|
+
try {
|
|
101
|
+
const content = readFileSync(checkpointPath, "utf-8");
|
|
102
|
+
checkpoints = JSON.parse(content);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
checkpoints = [];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
checkpoints.push(checkpoint);
|
|
109
|
+
// Keep only last 50 checkpoints
|
|
110
|
+
if (checkpoints.length > 50) {
|
|
111
|
+
checkpoints = checkpoints.slice(-50);
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
writeFileSync(checkpointPath, JSON.stringify(checkpoints, null, 2), "utf-8");
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Silently fail
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get recent checkpoints
|
|
122
|
+
*/
|
|
123
|
+
export function getRecentCheckpoints(limit = 5) {
|
|
124
|
+
const checkpointPath = getCheckpointPath();
|
|
125
|
+
if (!existsSync(checkpointPath)) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const content = readFileSync(checkpointPath, "utf-8");
|
|
130
|
+
const checkpoints = JSON.parse(content);
|
|
131
|
+
return checkpoints.slice(-limit).reverse();
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the last checkpoint
|
|
139
|
+
*/
|
|
140
|
+
export function getLastCheckpoint() {
|
|
141
|
+
const checkpoints = getRecentCheckpoints(1);
|
|
142
|
+
return checkpoints[0] || null;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Generate error recovery summary
|
|
146
|
+
*/
|
|
147
|
+
export function generateErrorRecoverySummary() {
|
|
148
|
+
const recentErrors = getRecentErrors(5);
|
|
149
|
+
const recentCheckpoints = getRecentCheckpoints(3);
|
|
150
|
+
let summary = "\n## ERROR RECOVERY STATUS\n\n";
|
|
151
|
+
if (recentErrors.length > 0) {
|
|
152
|
+
summary += `⚠️ Recent Errors (${recentErrors.length}):\n`;
|
|
153
|
+
recentErrors.slice(0, 3).forEach(err => {
|
|
154
|
+
summary += ` - ${err.error.substring(0, 60)}${err.error.length > 60 ? "..." : ""}\n`;
|
|
155
|
+
summary += ` Context: ${err.context.substring(0, 50)}${err.context.length > 50 ? "..." : ""}\n`;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
summary += "✅ No recent errors logged\n";
|
|
160
|
+
}
|
|
161
|
+
if (recentCheckpoints.length > 0) {
|
|
162
|
+
summary += `\n📌 Recent Checkpoints (${recentCheckpoints.length}):\n`;
|
|
163
|
+
recentCheckpoints.forEach(cp => {
|
|
164
|
+
summary += ` - ${cp.description.substring(0, 50)}${cp.description.length > 50 ? "..." : ""}\n`;
|
|
165
|
+
summary += ` ${cp.timestamp}\n`;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
summary += "\n💡 Recovery Options:\n";
|
|
169
|
+
summary += " - Check git log for recent commits\n";
|
|
170
|
+
summary += " - Use 'git reset --hard <commit>' to rollback if needed\n";
|
|
171
|
+
summary += " - Review error-log.json for detailed error history\n";
|
|
172
|
+
summary += " - Review checkpoints.json for session checkpoints\n";
|
|
173
|
+
return summary;
|
|
174
|
+
}
|
|
175
|
+
export default {
|
|
176
|
+
logError,
|
|
177
|
+
getRecentErrors,
|
|
178
|
+
createCheckpoint,
|
|
179
|
+
getRecentCheckpoints,
|
|
180
|
+
getLastCheckpoint,
|
|
181
|
+
generateErrorRecoverySummary,
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=error-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-recovery.js","sourceRoot":"","sources":["../../src/utils/error-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature List Utilities
|
|
3
|
+
* Manages feature list operations with Poka-yoke error prevention.
|
|
4
|
+
* Implements safeguards to prevent accidental modification of test criteria.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Feature definition matching the JSON schema
|
|
8
|
+
*/
|
|
9
|
+
export interface Feature {
|
|
10
|
+
id: string;
|
|
11
|
+
category: "functional" | "ui" | "integration" | "performance" | "accessibility";
|
|
12
|
+
priority: number;
|
|
13
|
+
description: string;
|
|
14
|
+
steps: string[];
|
|
15
|
+
passes: boolean;
|
|
16
|
+
last_tested: string | null;
|
|
17
|
+
tested_by?: string | null;
|
|
18
|
+
notes: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Project metadata in feature list
|
|
22
|
+
*/
|
|
23
|
+
export interface ProjectInfo {
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
created_at: string;
|
|
27
|
+
stack: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Complete feature list structure
|
|
31
|
+
*/
|
|
32
|
+
export interface FeatureList {
|
|
33
|
+
project: ProjectInfo;
|
|
34
|
+
features: Feature[];
|
|
35
|
+
metadata: {
|
|
36
|
+
total_features: number;
|
|
37
|
+
passing_features: number;
|
|
38
|
+
last_updated: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validation result type
|
|
43
|
+
*/
|
|
44
|
+
export interface ValidationResult {
|
|
45
|
+
valid: boolean;
|
|
46
|
+
error?: string;
|
|
47
|
+
warnings?: string[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load the feature list from disk
|
|
51
|
+
*/
|
|
52
|
+
export declare function loadFeatureList(): FeatureList | null;
|
|
53
|
+
/**
|
|
54
|
+
* Save the feature list to disk
|
|
55
|
+
*/
|
|
56
|
+
export declare function saveFeatureList(featureList: FeatureList): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Poka-yoke validation: Ensure feature list updates don't violate constraints
|
|
59
|
+
*
|
|
60
|
+
* CONSTRAINTS:
|
|
61
|
+
* - Cannot delete features
|
|
62
|
+
* - Cannot modify feature steps (test criteria)
|
|
63
|
+
* - Cannot modify feature descriptions
|
|
64
|
+
* - Can only update: passes, last_tested, notes
|
|
65
|
+
*/
|
|
66
|
+
export declare function validateFeatureListUpdate(original: FeatureList, updated: FeatureList): ValidationResult;
|
|
67
|
+
/**
|
|
68
|
+
* Get the next feature to work on (highest priority failing feature)
|
|
69
|
+
*/
|
|
70
|
+
export declare function getNextFeature(featureList: FeatureList): Feature | null;
|
|
71
|
+
/**
|
|
72
|
+
* Mark a feature as passing
|
|
73
|
+
*/
|
|
74
|
+
export declare function markFeaturePassing(featureList: FeatureList, featureId: string, notes?: string): FeatureList;
|
|
75
|
+
/**
|
|
76
|
+
* Get progress statistics
|
|
77
|
+
*/
|
|
78
|
+
export declare function getProgressStats(featureList: FeatureList): {
|
|
79
|
+
total: number;
|
|
80
|
+
passing: number;
|
|
81
|
+
failing: number;
|
|
82
|
+
percentage: number;
|
|
83
|
+
byCategory: Record<string, {
|
|
84
|
+
passing: number;
|
|
85
|
+
total: number;
|
|
86
|
+
}>;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Generate a progress report string
|
|
90
|
+
*/
|
|
91
|
+
export declare function generateProgressReport(featureList: FeatureList): string;
|
|
92
|
+
declare const _default: {
|
|
93
|
+
loadFeatureList: typeof loadFeatureList;
|
|
94
|
+
saveFeatureList: typeof saveFeatureList;
|
|
95
|
+
validateFeatureListUpdate: typeof validateFeatureListUpdate;
|
|
96
|
+
getNextFeature: typeof getNextFeature;
|
|
97
|
+
markFeaturePassing: typeof markFeaturePassing;
|
|
98
|
+
getProgressStats: typeof getProgressStats;
|
|
99
|
+
generateProgressReport: typeof generateProgressReport;
|
|
100
|
+
};
|
|
101
|
+
export default _default;
|
|
102
|
+
//# sourceMappingURL=feature-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-list.d.ts","sourceRoot":"","sources":["../../src/utils/feature-list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,aAAa,GAAG,aAAa,GAAG,eAAe,CAAC;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAcpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAgBjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,WAAW,GACnB,gBAAgB,CAwDlB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAMvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,WAAW,CAYb;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,GAAG;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE,CA2BA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CA6BvE;;;;;;;;;;AAED,wBAQE"}
|