midas-mcp 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/README.md +167 -0
- package/dist/docs/CHEATSHEET.md +122 -0
- package/dist/docs/INGREDIENTS.md +173 -0
- package/dist/docs/METHODOLOGY.md +334 -0
- package/dist/docs/PROMPTS.md +347 -0
- package/dist/docs/SPEC.md +330 -0
- package/dist/docs/USER_RULES.md +90 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/development.d.ts +3 -0
- package/dist/prompts/development.d.ts.map +1 -0
- package/dist/prompts/development.js +90 -0
- package/dist/prompts/development.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +11 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/research.d.ts +3 -0
- package/dist/prompts/research.d.ts.map +1 -0
- package/dist/prompts/research.js +56 -0
- package/dist/prompts/research.js.map +1 -0
- package/dist/prompts/review.d.ts +3 -0
- package/dist/prompts/review.d.ts.map +1 -0
- package/dist/prompts/review.js +76 -0
- package/dist/prompts/review.js.map +1 -0
- package/dist/prompts/session.d.ts +3 -0
- package/dist/prompts/session.d.ts.map +1 -0
- package/dist/prompts/session.js +35 -0
- package/dist/prompts/session.js.map +1 -0
- package/dist/resources/index.d.ts +3 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +63 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +65 -0
- package/dist/server.js.map +1 -0
- package/dist/state/phase.d.ts +32 -0
- package/dist/state/phase.d.ts.map +1 -0
- package/dist/state/phase.js +125 -0
- package/dist/state/phase.js.map +1 -0
- package/dist/tools/audit.d.ts +23 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +212 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/docs.d.ts +23 -0
- package/dist/tools/docs.d.ts.map +1 -0
- package/dist/tools/docs.js +66 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/horizon.d.ts +20 -0
- package/dist/tools/horizon.d.ts.map +1 -0
- package/dist/tools/horizon.js +75 -0
- package/dist/tools/horizon.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/oneshot.d.ts +21 -0
- package/dist/tools/oneshot.d.ts.map +1 -0
- package/dist/tools/oneshot.js +27 -0
- package/dist/tools/oneshot.js.map +1 -0
- package/dist/tools/phase.d.ts +51 -0
- package/dist/tools/phase.d.ts.map +1 -0
- package/dist/tools/phase.js +152 -0
- package/dist/tools/phase.js.map +1 -0
- package/dist/tools/tornado.d.ts +20 -0
- package/dist/tools/tornado.d.ts.map +1 -0
- package/dist/tools/tornado.js +61 -0
- package/dist/tools/tornado.js.map +1 -0
- package/docs/CHEATSHEET.md +122 -0
- package/docs/INGREDIENTS.md +173 -0
- package/docs/METHODOLOGY.md +334 -0
- package/docs/PROMPTS.md +347 -0
- package/docs/SPEC.md +330 -0
- package/docs/USER_RULES.md +90 -0
- package/package.json +42 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
export const auditSchema = z.object({
|
|
5
|
+
projectPath: z.string().optional().describe('Path to project root'),
|
|
6
|
+
});
|
|
7
|
+
function checkFilePatterns(projectPath, patterns) {
|
|
8
|
+
try {
|
|
9
|
+
const files = getAllFiles(projectPath);
|
|
10
|
+
return patterns.some(pattern => files.some(f => f.toLowerCase().includes(pattern.toLowerCase())));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function getAllFiles(dir, files = []) {
|
|
17
|
+
if (!existsSync(dir))
|
|
18
|
+
return files;
|
|
19
|
+
try {
|
|
20
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
21
|
+
for (const entry of entries) {
|
|
22
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
23
|
+
continue;
|
|
24
|
+
const path = join(dir, entry.name);
|
|
25
|
+
if (entry.isDirectory()) {
|
|
26
|
+
getAllFiles(path, files);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
files.push(path);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Permission denied or other error
|
|
35
|
+
}
|
|
36
|
+
return files;
|
|
37
|
+
}
|
|
38
|
+
function checkPackageJson(projectPath) {
|
|
39
|
+
const pkgPath = join(projectPath, 'package.json');
|
|
40
|
+
if (!existsSync(pkgPath))
|
|
41
|
+
return null;
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function hasDependency(pkg, deps) {
|
|
50
|
+
if (!pkg)
|
|
51
|
+
return false;
|
|
52
|
+
const allDeps = {
|
|
53
|
+
...(pkg.dependencies || {}),
|
|
54
|
+
...(pkg.devDependencies || {}),
|
|
55
|
+
};
|
|
56
|
+
return deps.some(d => d in allDeps);
|
|
57
|
+
}
|
|
58
|
+
export function audit(input) {
|
|
59
|
+
const projectPath = input.projectPath || process.cwd();
|
|
60
|
+
const pkg = checkPackageJson(projectPath);
|
|
61
|
+
const scores = {};
|
|
62
|
+
// 1. Frontend
|
|
63
|
+
const hasFrontend = checkFilePatterns(projectPath, [
|
|
64
|
+
'index.html', 'app.tsx', 'app.jsx', 'app.vue', 'app.svelte',
|
|
65
|
+
'pages/', 'components/', 'src/app',
|
|
66
|
+
]) || hasDependency(pkg, ['react', 'vue', 'svelte', 'next', 'nuxt']);
|
|
67
|
+
scores['1-frontend'] = {
|
|
68
|
+
exists: hasFrontend,
|
|
69
|
+
score: hasFrontend ? 70 : 0,
|
|
70
|
+
issues: hasFrontend ? [] : ['No frontend detected'],
|
|
71
|
+
suggestions: hasFrontend ? ['Add loading states', 'Verify responsive design'] : ['Create UI components'],
|
|
72
|
+
};
|
|
73
|
+
// 2. Backend
|
|
74
|
+
const hasBackend = checkFilePatterns(projectPath, [
|
|
75
|
+
'server.ts', 'server.js', 'api/', 'routes/', 'controllers/',
|
|
76
|
+
]) || hasDependency(pkg, ['express', 'fastify', 'hono', 'koa', 'nest']);
|
|
77
|
+
scores['2-backend'] = {
|
|
78
|
+
exists: hasBackend,
|
|
79
|
+
score: hasBackend ? 70 : 0,
|
|
80
|
+
issues: hasBackend ? [] : ['No backend detected'],
|
|
81
|
+
suggestions: hasBackend ? ['Add input validation', 'Add rate limiting'] : ['Create API endpoints'],
|
|
82
|
+
};
|
|
83
|
+
// 3. Database
|
|
84
|
+
const hasDatabase = checkFilePatterns(projectPath, [
|
|
85
|
+
'schema.prisma', 'migrations/', 'models/', 'db.ts', 'database.ts',
|
|
86
|
+
]) || hasDependency(pkg, ['prisma', 'mongoose', 'typeorm', 'drizzle', 'firebase']);
|
|
87
|
+
scores['3-database'] = {
|
|
88
|
+
exists: hasDatabase,
|
|
89
|
+
score: hasDatabase ? 70 : 0,
|
|
90
|
+
issues: hasDatabase ? [] : ['No database detected'],
|
|
91
|
+
suggestions: hasDatabase ? ['Add indexes', 'Verify backup strategy'] : ['Set up database'],
|
|
92
|
+
};
|
|
93
|
+
// 4. Authentication
|
|
94
|
+
const hasAuth = checkFilePatterns(projectPath, [
|
|
95
|
+
'auth.ts', 'auth/', 'login', 'session', 'jwt',
|
|
96
|
+
]) || hasDependency(pkg, ['next-auth', 'passport', 'lucia', 'clerk', 'auth0']);
|
|
97
|
+
scores['4-authentication'] = {
|
|
98
|
+
exists: hasAuth,
|
|
99
|
+
score: hasAuth ? 70 : 0,
|
|
100
|
+
issues: hasAuth ? [] : ['No authentication detected'],
|
|
101
|
+
suggestions: hasAuth ? ['Verify secure password hashing', 'Add account lockout'] : ['Add authentication'],
|
|
102
|
+
};
|
|
103
|
+
// 5. API Integrations
|
|
104
|
+
const hasApiIntegrations = checkFilePatterns(projectPath, [
|
|
105
|
+
'integrations/', 'services/', 'api-client', 'sdk',
|
|
106
|
+
]) || hasDependency(pkg, ['axios', 'openai', 'stripe', 'twilio']);
|
|
107
|
+
scores['5-api-integrations'] = {
|
|
108
|
+
exists: hasApiIntegrations,
|
|
109
|
+
score: hasApiIntegrations ? 70 : 0,
|
|
110
|
+
issues: hasApiIntegrations ? [] : ['No API integrations found'],
|
|
111
|
+
suggestions: hasApiIntegrations ? ['Add retry logic', 'Add circuit breakers'] : [],
|
|
112
|
+
};
|
|
113
|
+
// 6. State Management
|
|
114
|
+
const hasStateManagement = checkFilePatterns(projectPath, [
|
|
115
|
+
'store/', 'state/', 'context/', 'atoms/',
|
|
116
|
+
]) || hasDependency(pkg, ['zustand', 'redux', 'jotai', 'recoil', 'mobx']);
|
|
117
|
+
scores['6-state-management'] = {
|
|
118
|
+
exists: hasStateManagement,
|
|
119
|
+
score: hasStateManagement ? 70 : 0,
|
|
120
|
+
issues: hasStateManagement ? [] : ['No state management detected'],
|
|
121
|
+
suggestions: hasStateManagement ? ['Verify cache invalidation', 'Check for prop drilling'] : [],
|
|
122
|
+
};
|
|
123
|
+
// 7. Design/UX
|
|
124
|
+
const hasDesign = checkFilePatterns(projectPath, [
|
|
125
|
+
'styles/', 'css/', 'tailwind.config', 'theme',
|
|
126
|
+
]) || hasDependency(pkg, ['tailwindcss', 'styled-components', 'emotion', 'sass']);
|
|
127
|
+
scores['7-design-ux'] = {
|
|
128
|
+
exists: hasDesign,
|
|
129
|
+
score: hasDesign ? 70 : 0,
|
|
130
|
+
issues: hasDesign ? [] : ['No design system detected'],
|
|
131
|
+
suggestions: hasDesign ? ['Verify empty states', 'Check mobile responsiveness'] : [],
|
|
132
|
+
};
|
|
133
|
+
// 8. Testing
|
|
134
|
+
const hasTesting = checkFilePatterns(projectPath, [
|
|
135
|
+
'.test.', '.spec.', '__tests__/', 'test/', 'tests/',
|
|
136
|
+
]) || hasDependency(pkg, ['jest', 'vitest', 'mocha', 'playwright', 'cypress']);
|
|
137
|
+
scores['8-testing'] = {
|
|
138
|
+
exists: hasTesting,
|
|
139
|
+
score: hasTesting ? 70 : 0,
|
|
140
|
+
issues: hasTesting ? [] : ['No tests detected'],
|
|
141
|
+
suggestions: hasTesting ? ['Add E2E tests for critical flows', 'Verify CI runs tests'] : ['Add unit tests'],
|
|
142
|
+
};
|
|
143
|
+
// 9. Security
|
|
144
|
+
const hasSecurity = checkFilePatterns(projectPath, [
|
|
145
|
+
'security/', 'middleware/auth', 'helmet', 'cors',
|
|
146
|
+
]) || hasDependency(pkg, ['helmet', 'cors', 'csurf', 'express-rate-limit']);
|
|
147
|
+
const hasEnvExample = existsSync(join(projectPath, '.env.example'));
|
|
148
|
+
const hasGitignore = existsSync(join(projectPath, '.gitignore'));
|
|
149
|
+
scores['9-security'] = {
|
|
150
|
+
exists: hasSecurity || hasEnvExample,
|
|
151
|
+
score: (hasSecurity ? 40 : 0) + (hasEnvExample ? 15 : 0) + (hasGitignore ? 15 : 0),
|
|
152
|
+
issues: [
|
|
153
|
+
...(!hasSecurity ? ['No security middleware detected'] : []),
|
|
154
|
+
...(!hasEnvExample ? ['No .env.example for secrets documentation'] : []),
|
|
155
|
+
...(!hasGitignore ? ['No .gitignore'] : []),
|
|
156
|
+
],
|
|
157
|
+
suggestions: ['Audit dependencies for vulnerabilities', 'Verify no secrets in code'],
|
|
158
|
+
};
|
|
159
|
+
// 10. Error Handling
|
|
160
|
+
const hasErrorHandling = checkFilePatterns(projectPath, [
|
|
161
|
+
'error', 'exception', 'catch', 'errorBoundary',
|
|
162
|
+
]);
|
|
163
|
+
scores['10-error-handling'] = {
|
|
164
|
+
exists: hasErrorHandling,
|
|
165
|
+
score: hasErrorHandling ? 70 : 0,
|
|
166
|
+
issues: hasErrorHandling ? [] : ['No centralized error handling detected'],
|
|
167
|
+
suggestions: ['Add error boundaries', 'Ensure user-friendly error messages'],
|
|
168
|
+
};
|
|
169
|
+
// 11. Version Control
|
|
170
|
+
const hasGit = existsSync(join(projectPath, '.git'));
|
|
171
|
+
const hasGitignoreFile = existsSync(join(projectPath, '.gitignore'));
|
|
172
|
+
scores['11-version-control'] = {
|
|
173
|
+
exists: hasGit,
|
|
174
|
+
score: (hasGit ? 50 : 0) + (hasGitignoreFile ? 20 : 0),
|
|
175
|
+
issues: [
|
|
176
|
+
...(!hasGit ? ['Not a git repository'] : []),
|
|
177
|
+
...(!hasGitignoreFile ? ['No .gitignore'] : []),
|
|
178
|
+
],
|
|
179
|
+
suggestions: ['Verify no secrets in git history', 'Use conventional commits'],
|
|
180
|
+
};
|
|
181
|
+
// 12. Deployment
|
|
182
|
+
const hasDeployment = checkFilePatterns(projectPath, [
|
|
183
|
+
'dockerfile', 'docker-compose', 'vercel.json', 'netlify.toml',
|
|
184
|
+
'.github/workflows', 'fly.toml', 'railway.json',
|
|
185
|
+
]);
|
|
186
|
+
scores['12-deployment'] = {
|
|
187
|
+
exists: hasDeployment,
|
|
188
|
+
score: hasDeployment ? 70 : 0,
|
|
189
|
+
issues: hasDeployment ? [] : ['No deployment configuration detected'],
|
|
190
|
+
suggestions: hasDeployment ? ['Add health checks', 'Verify rollback capability'] : ['Set up CI/CD'],
|
|
191
|
+
};
|
|
192
|
+
// Calculate overall
|
|
193
|
+
const scoreValues = Object.values(scores).map(s => s.score);
|
|
194
|
+
const overall = Math.round(scoreValues.reduce((a, b) => a + b, 0) / scoreValues.length);
|
|
195
|
+
// Determine level
|
|
196
|
+
const existsCounts = Object.values(scores).filter(s => s.exists).length;
|
|
197
|
+
let level;
|
|
198
|
+
if (existsCounts >= 11) {
|
|
199
|
+
level = 'production';
|
|
200
|
+
}
|
|
201
|
+
else if (existsCounts >= 8) {
|
|
202
|
+
level = 'protected';
|
|
203
|
+
}
|
|
204
|
+
else if (existsCounts >= 5) {
|
|
205
|
+
level = 'integrated';
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
level = 'functional';
|
|
209
|
+
}
|
|
210
|
+
return { scores, overall, level };
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/tools/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const checkDocsSchema: z.ZodObject<{
|
|
3
|
+
projectPath: z.ZodOptional<z.ZodString>;
|
|
4
|
+
}, "strip", z.ZodTypeAny, {
|
|
5
|
+
projectPath?: string | undefined;
|
|
6
|
+
}, {
|
|
7
|
+
projectPath?: string | undefined;
|
|
8
|
+
}>;
|
|
9
|
+
export type CheckDocsInput = z.infer<typeof checkDocsSchema>;
|
|
10
|
+
interface DocStatus {
|
|
11
|
+
exists: boolean;
|
|
12
|
+
complete: boolean;
|
|
13
|
+
issues: string[];
|
|
14
|
+
}
|
|
15
|
+
interface CheckDocsResult {
|
|
16
|
+
brainlift: DocStatus;
|
|
17
|
+
prd: DocStatus;
|
|
18
|
+
gameplan: DocStatus;
|
|
19
|
+
ready: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function checkDocs(input: CheckDocsInput): CheckDocsResult;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D,UAAU,SAAS;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;CAChB;AA6CD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAoChE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { existsSync, readFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { loadState, saveState } from '../state/phase.js';
|
|
5
|
+
export const checkDocsSchema = z.object({
|
|
6
|
+
projectPath: z.string().optional().describe('Path to project root'),
|
|
7
|
+
});
|
|
8
|
+
function checkDocComplete(filePath, requiredSections) {
|
|
9
|
+
if (!existsSync(filePath)) {
|
|
10
|
+
return {
|
|
11
|
+
exists: false,
|
|
12
|
+
complete: false,
|
|
13
|
+
issues: ['File does not exist'],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
17
|
+
const issues = [];
|
|
18
|
+
// Check for template placeholders
|
|
19
|
+
if (content.includes('[') && content.includes(']')) {
|
|
20
|
+
const placeholderMatches = content.match(/\[[^\]]+\]/g) || [];
|
|
21
|
+
const realPlaceholders = placeholderMatches.filter(p => !p.startsWith('[x]') && !p.startsWith('[ ]') // Exclude checkboxes
|
|
22
|
+
);
|
|
23
|
+
if (realPlaceholders.length > 0) {
|
|
24
|
+
issues.push(`Contains ${realPlaceholders.length} unfilled placeholders`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Check for required sections
|
|
28
|
+
for (const section of requiredSections) {
|
|
29
|
+
if (!content.toLowerCase().includes(section.toLowerCase())) {
|
|
30
|
+
issues.push(`Missing section: ${section}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Check minimum content length
|
|
34
|
+
const lines = content.split('\n').filter(l => l.trim() && !l.startsWith('#'));
|
|
35
|
+
if (lines.length < 5) {
|
|
36
|
+
issues.push('Too short - needs more content');
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
exists: true,
|
|
40
|
+
complete: issues.length === 0,
|
|
41
|
+
issues,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function checkDocs(input) {
|
|
45
|
+
const projectPath = input.projectPath || process.cwd();
|
|
46
|
+
const docsPath = join(projectPath, 'docs');
|
|
47
|
+
const brainlift = checkDocComplete(join(docsPath, 'brainlift.md'), ['contrarian', 'domain', 'lessons']);
|
|
48
|
+
const prd = checkDocComplete(join(docsPath, 'prd.md'), ['overview', 'goals', 'non-goals']);
|
|
49
|
+
const gameplan = checkDocComplete(join(docsPath, 'gameplan.md'), ['tech stack', 'architecture', 'phase']);
|
|
50
|
+
const ready = brainlift.complete && prd.complete && gameplan.complete;
|
|
51
|
+
// Update state docs tracking
|
|
52
|
+
const state = loadState(projectPath);
|
|
53
|
+
state.docs = {
|
|
54
|
+
brainlift: brainlift.complete,
|
|
55
|
+
prd: prd.complete,
|
|
56
|
+
gameplan: gameplan.complete,
|
|
57
|
+
};
|
|
58
|
+
saveState(projectPath, state);
|
|
59
|
+
return {
|
|
60
|
+
brainlift,
|
|
61
|
+
prd,
|
|
62
|
+
gameplan,
|
|
63
|
+
ready,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const horizonSchema: z.ZodObject<{
|
|
3
|
+
currentOutput: z.ZodString;
|
|
4
|
+
expectedOutput: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
currentOutput: string;
|
|
7
|
+
expectedOutput: string;
|
|
8
|
+
}, {
|
|
9
|
+
currentOutput: string;
|
|
10
|
+
expectedOutput: string;
|
|
11
|
+
}>;
|
|
12
|
+
export type HorizonInput = z.infer<typeof horizonSchema>;
|
|
13
|
+
interface HorizonResult {
|
|
14
|
+
missingContext: string[];
|
|
15
|
+
expandedPrompt: string;
|
|
16
|
+
checklist: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function expandHorizon(input: HorizonInput): HorizonResult;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=horizon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"horizon.d.ts","sourceRoot":"","sources":["../../src/tools/horizon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,aAAa;;;;;;;;;EAGxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEzD,UAAU,aAAa;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAyEhE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const horizonSchema = z.object({
|
|
3
|
+
currentOutput: z.string().describe('What the AI produced that does not fit'),
|
|
4
|
+
expectedOutput: z.string().describe('What you actually needed'),
|
|
5
|
+
});
|
|
6
|
+
export function expandHorizon(input) {
|
|
7
|
+
// The checklist of horizontal context categories
|
|
8
|
+
const checklist = [
|
|
9
|
+
'INTEGRATIONS - What existing systems does this connect to?',
|
|
10
|
+
'PATTERNS - What patterns or conventions should be followed?',
|
|
11
|
+
'CONSTRAINTS - What limitations or restrictions apply?',
|
|
12
|
+
'HISTORY - Why were previous decisions made?',
|
|
13
|
+
'FUTURE - What planned features must be supported later?',
|
|
14
|
+
'DOMAIN - What domain-specific knowledge is needed?',
|
|
15
|
+
];
|
|
16
|
+
// Analyze the gap to suggest missing context
|
|
17
|
+
const missingContext = [];
|
|
18
|
+
// Simple heuristics based on common gaps
|
|
19
|
+
if (input.currentOutput.includes('generic') || input.expectedOutput.includes('specific')) {
|
|
20
|
+
missingContext.push('Missing specific patterns or conventions to follow');
|
|
21
|
+
}
|
|
22
|
+
if (input.currentOutput.includes('new') || input.expectedOutput.includes('existing')) {
|
|
23
|
+
missingContext.push('Missing integration context with existing code');
|
|
24
|
+
}
|
|
25
|
+
if (input.expectedOutput.includes('because') || input.expectedOutput.includes('reason')) {
|
|
26
|
+
missingContext.push('Missing historical context for past decisions');
|
|
27
|
+
}
|
|
28
|
+
// Always suggest the full checklist review
|
|
29
|
+
if (missingContext.length === 0) {
|
|
30
|
+
missingContext.push('Review the horizontal context checklist to identify gaps');
|
|
31
|
+
}
|
|
32
|
+
const expandedPrompt = `The output doesn't match what I need.
|
|
33
|
+
|
|
34
|
+
**Current output:** ${input.currentOutput}
|
|
35
|
+
|
|
36
|
+
**Expected output:** ${input.expectedOutput}
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
HORIZONTAL CONTEXT (what was missing):
|
|
41
|
+
|
|
42
|
+
**Integrations:**
|
|
43
|
+
- [What existing systems this connects to]
|
|
44
|
+
- [What services/APIs are already in use]
|
|
45
|
+
|
|
46
|
+
**Patterns:**
|
|
47
|
+
- [File/folder conventions in this codebase]
|
|
48
|
+
- [Naming conventions to follow]
|
|
49
|
+
- [Similar implementations to reference: @filename]
|
|
50
|
+
|
|
51
|
+
**Constraints:**
|
|
52
|
+
- [Technical limitations]
|
|
53
|
+
- [Budget/resource constraints]
|
|
54
|
+
- [Dependencies that cannot be changed]
|
|
55
|
+
|
|
56
|
+
**History:**
|
|
57
|
+
- [Why we use X instead of Y]
|
|
58
|
+
- [Previous attempts and why they failed]
|
|
59
|
+
|
|
60
|
+
**Future:**
|
|
61
|
+
- [Planned features that this must support]
|
|
62
|
+
- [Extensibility requirements]
|
|
63
|
+
|
|
64
|
+
**Domain:**
|
|
65
|
+
- [Industry-specific requirements]
|
|
66
|
+
- [User behavior patterns]
|
|
67
|
+
|
|
68
|
+
Please regenerate with this additional context.`;
|
|
69
|
+
return {
|
|
70
|
+
missingContext,
|
|
71
|
+
expandedPrompt,
|
|
72
|
+
checklist,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=horizon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"horizon.js","sourceRoot":"","sources":["../../src/tools/horizon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IAC5E,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAChE,CAAC,CAAC;AAUH,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC/C,iDAAiD;IACjD,MAAM,SAAS,GAAG;QAChB,4DAA4D;QAC5D,6DAA6D;QAC7D,uDAAuD;QACvD,6CAA6C;QAC7C,yDAAyD;QACzD,oDAAoD;KACrD,CAAC;IAEF,6CAA6C;IAC7C,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,yCAAyC;IACzC,IAAI,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzF,cAAc,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACrF,cAAc,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxF,cAAc,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACvE,CAAC;IAED,2CAA2C;IAC3C,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,cAAc,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,cAAc,GAAG;;sBAEH,KAAK,CAAC,aAAa;;uBAElB,KAAK,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gDAgCK,CAAC;IAE/C,OAAO;QACL,cAAc;QACd,cAAc;QACd,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { startProject, startProjectSchema, getPhase, getPhaseSchema, setPhaseManually, setPhaseSchema, } from './phase.js';
|
|
2
|
+
export { audit, auditSchema } from './audit.js';
|
|
3
|
+
export { checkDocs, checkDocsSchema } from './docs.js';
|
|
4
|
+
export { constructOneshot, oneshotSchema } from './oneshot.js';
|
|
5
|
+
export { triggerTornado, tornadoSchema } from './tornado.js';
|
|
6
|
+
export { expandHorizon, horizonSchema } from './horizon.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG/D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Phase tools
|
|
2
|
+
export { startProject, startProjectSchema, getPhase, getPhaseSchema, setPhaseManually, setPhaseSchema, } from './phase.js';
|
|
3
|
+
// Audit tool
|
|
4
|
+
export { audit, auditSchema } from './audit.js';
|
|
5
|
+
// Docs check tool
|
|
6
|
+
export { checkDocs, checkDocsSchema } from './docs.js';
|
|
7
|
+
// Oneshot tool
|
|
8
|
+
export { constructOneshot, oneshotSchema } from './oneshot.js';
|
|
9
|
+
// Tornado tool
|
|
10
|
+
export { triggerTornado, tornadoSchema } from './tornado.js';
|
|
11
|
+
// Horizon tool
|
|
12
|
+
export { expandHorizon, horizonSchema } from './horizon.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,aAAa;AACb,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhD,kBAAkB;AAClB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEvD,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D,eAAe;AACf,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7D,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const oneshotSchema: z.ZodObject<{
|
|
3
|
+
originalPrompt: z.ZodString;
|
|
4
|
+
error: z.ZodString;
|
|
5
|
+
learnings: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
error: string;
|
|
8
|
+
originalPrompt: string;
|
|
9
|
+
learnings?: string[] | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
error: string;
|
|
12
|
+
originalPrompt: string;
|
|
13
|
+
learnings?: string[] | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export type OneshotInput = z.infer<typeof oneshotSchema>;
|
|
16
|
+
interface OneshotResult {
|
|
17
|
+
prompt: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function constructOneshot(input: OneshotInput): OneshotResult;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=oneshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneshot.d.ts","sourceRoot":"","sources":["../../src/tools/oneshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,aAAa;;;;;;;;;;;;EAIxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEzD,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAqBnE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const oneshotSchema = z.object({
|
|
3
|
+
originalPrompt: z.string().describe('The original prompt that failed'),
|
|
4
|
+
error: z.string().describe('The error message or description of what went wrong'),
|
|
5
|
+
learnings: z.array(z.string()).optional().describe('What you learned from the failure'),
|
|
6
|
+
});
|
|
7
|
+
export function constructOneshot(input) {
|
|
8
|
+
const learningsSection = input.learnings && input.learnings.length > 0
|
|
9
|
+
? `\nWhat I learned:\n${input.learnings.map(l => `- ${l}`).join('\n')}`
|
|
10
|
+
: '';
|
|
11
|
+
const prompt = `${input.originalPrompt}
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
Previous attempt failed with:
|
|
16
|
+
\`\`\`
|
|
17
|
+
${input.error}
|
|
18
|
+
\`\`\`
|
|
19
|
+
${learningsSection}
|
|
20
|
+
|
|
21
|
+
Requirements for this retry:
|
|
22
|
+
- Avoid the approach that caused the above error
|
|
23
|
+
- Explain your reasoning before implementing
|
|
24
|
+
- Test the solution before considering it complete`;
|
|
25
|
+
return { prompt };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=oneshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneshot.js","sourceRoot":"","sources":["../../src/tools/oneshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACtE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IACjF,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CACxF,CAAC,CAAC;AAQH,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QACpE,CAAC,CAAC,sBAAsB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACvE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,cAAc;;;;;;EAMtC,KAAK,CAAC,KAAK;;EAEX,gBAAgB;;;;;mDAKiC,CAAC;IAElD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type Phase } from '../state/phase.js';
|
|
3
|
+
export declare const startProjectSchema: z.ZodObject<{
|
|
4
|
+
projectName: z.ZodString;
|
|
5
|
+
projectPath: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
projectName: string;
|
|
8
|
+
projectPath?: string | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
projectName: string;
|
|
11
|
+
projectPath?: string | undefined;
|
|
12
|
+
}>;
|
|
13
|
+
export type StartProjectInput = z.infer<typeof startProjectSchema>;
|
|
14
|
+
export declare function startProject(input: StartProjectInput): {
|
|
15
|
+
success: boolean;
|
|
16
|
+
message: string;
|
|
17
|
+
nextSteps: string[];
|
|
18
|
+
};
|
|
19
|
+
export declare const getPhaseSchema: z.ZodObject<{
|
|
20
|
+
projectPath: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
projectPath?: string | undefined;
|
|
23
|
+
}, {
|
|
24
|
+
projectPath?: string | undefined;
|
|
25
|
+
}>;
|
|
26
|
+
export type GetPhaseInput = z.infer<typeof getPhaseSchema>;
|
|
27
|
+
export declare function getPhase(input: GetPhaseInput): {
|
|
28
|
+
current: Phase;
|
|
29
|
+
nextSteps: string[];
|
|
30
|
+
prompt?: string;
|
|
31
|
+
};
|
|
32
|
+
export declare const setPhaseSchema: z.ZodObject<{
|
|
33
|
+
phase: z.ZodEnum<["IDLE", "EAGLE_SIGHT", "BUILD", "SHIPPED"]>;
|
|
34
|
+
step: z.ZodOptional<z.ZodString>;
|
|
35
|
+
projectPath: z.ZodOptional<z.ZodString>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
phase: "IDLE" | "EAGLE_SIGHT" | "BUILD" | "SHIPPED";
|
|
38
|
+
projectPath?: string | undefined;
|
|
39
|
+
step?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
phase: "IDLE" | "EAGLE_SIGHT" | "BUILD" | "SHIPPED";
|
|
42
|
+
projectPath?: string | undefined;
|
|
43
|
+
step?: string | undefined;
|
|
44
|
+
}>;
|
|
45
|
+
export type SetPhaseInput = z.infer<typeof setPhaseSchema>;
|
|
46
|
+
export declare function setPhaseManually(input: SetPhaseInput): {
|
|
47
|
+
success: boolean;
|
|
48
|
+
current: Phase;
|
|
49
|
+
nextSteps: string[];
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase.d.ts","sourceRoot":"","sources":["../../src/tools/phase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAML,KAAK,KAAK,EAGX,MAAM,mBAAmB,CAAC;AAK3B,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAwGA;AAGD,eAAO,MAAM,cAAc;;;;;;EAEzB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG;IAC9C,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAUA;AAGD,eAAO,MAAM,cAAc;;;;;;;;;;;;EAIzB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAyBA"}
|