@vyuhlabs/dxkit 0.1.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/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +173 -0
- package/dist/cli.js.map +1 -0
- package/dist/codebase-scanner.d.ts +33 -0
- package/dist/codebase-scanner.d.ts.map +1 -0
- package/dist/codebase-scanner.js +497 -0
- package/dist/codebase-scanner.js.map +1 -0
- package/dist/constants.d.ts +17 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +80 -0
- package/dist/constants.js.map +1 -0
- package/dist/detect.d.ts +3 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +264 -0
- package/dist/detect.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +157 -0
- package/dist/doctor.js.map +1 -0
- package/dist/files.d.ts +17 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +99 -0
- package/dist/files.js.map +1 -0
- package/dist/generator.d.ts +10 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +405 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +51 -0
- package/dist/logger.js.map +1 -0
- package/dist/prompts.d.ts +10 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +125 -0
- package/dist/prompts.js.map +1 -0
- package/dist/template-engine.d.ts +22 -0
- package/dist/template-engine.d.ts.map +1 -0
- package/dist/template-engine.js +63 -0
- package/dist/template-engine.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/update.d.ts +2 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +97 -0
- package/dist/update.js.map +1 -0
- package/package.json +43 -0
- package/templates/.ai/README.md +117 -0
- package/templates/.ai/prompts/execution-prompt.md +9 -0
- package/templates/.ai/prompts/planning-prompt.md +18 -0
- package/templates/.ai/prompts/session-end-template.md +182 -0
- package/templates/.ai/prompts/session-end.md +132 -0
- package/templates/.ai/prompts/session-start.md +109 -0
- package/templates/.ai/prompts/step-by-step.md +113 -0
- package/templates/.ai/sessions/.gitkeep +0 -0
- package/templates/.ai/templates/session-checkpoint-template.md +97 -0
- package/templates/.claude/agents/knowledge-bot.md +62 -0
- package/templates/.claude/agents/onboarding.md +61 -0
- package/templates/.claude/agents/quality-reviewer.md +85 -0
- package/templates/.claude/agents-available/code-reviewer.md +29 -0
- package/templates/.claude/agents-available/codebase-explorer.md +99 -0
- package/templates/.claude/agents-available/debugger.md +29 -0
- package/templates/.claude/agents-available/knowledge-bot.md +62 -0
- package/templates/.claude/agents-available/test-writer.md +34 -0
- package/templates/.claude/commands/ask.md +7 -0
- package/templates/.claude/commands/check.md.template +55 -0
- package/templates/.claude/commands/doctor.md +21 -0
- package/templates/.claude/commands/enable-agent.md +12 -0
- package/templates/.claude/commands/explore-codebase.md +12 -0
- package/templates/.claude/commands/fix-issue.md +12 -0
- package/templates/.claude/commands/fix.md.template +32 -0
- package/templates/.claude/commands/help.md +36 -0
- package/templates/.claude/commands/learn.md +48 -0
- package/templates/.claude/commands/onboarding.md +21 -0
- package/templates/.claude/commands/quality.md.template +42 -0
- package/templates/.claude/commands/session-end.md +40 -0
- package/templates/.claude/commands/session-start.md +30 -0
- package/templates/.claude/commands/setup-hooks.md +60 -0
- package/templates/.claude/commands/test.md.template +49 -0
- package/templates/.claude/rules/csharp.md +18 -0
- package/templates/.claude/rules/go.md +16 -0
- package/templates/.claude/rules/nextjs.md +17 -0
- package/templates/.claude/rules/python.md +19 -0
- package/templates/.claude/rules/rust.md +14 -0
- package/templates/.claude/skills/build/SKILL.md.template +98 -0
- package/templates/.claude/skills/deploy/SKILL.md.template +131 -0
- package/templates/.claude/skills/deploy/references/gotchas.md +5 -0
- package/templates/.claude/skills/doctor/SKILL.md +54 -0
- package/templates/.claude/skills/gcloud/SKILL.md +61 -0
- package/templates/.claude/skills/gcloud/references/gotchas.md +5 -0
- package/templates/.claude/skills/learned/SKILL.md +55 -0
- package/templates/.claude/skills/learned/references/conventions.md +11 -0
- package/templates/.claude/skills/learned/references/deny-recommendations.md +18 -0
- package/templates/.claude/skills/learned/references/gotchas.md +11 -0
- package/templates/.claude/skills/pulumi/SKILL.md +67 -0
- package/templates/.claude/skills/quality/SKILL.md.template +108 -0
- package/templates/.claude/skills/quality/references/gotchas.md +5 -0
- package/templates/.claude/skills/review/SKILL.md.template +73 -0
- package/templates/.claude/skills/scaffold/SKILL.md.template +123 -0
- package/templates/.claude/skills/secrets/SKILL.md +45 -0
- package/templates/.claude/skills/session/SKILL.md +43 -0
- package/templates/.claude/skills/test/SKILL.md.template +109 -0
- package/templates/.claude/skills/test/references/gotchas.md +5 -0
- package/templates/.devcontainer/Dockerfile.dev.template +89 -0
- package/templates/.devcontainer/devcontainer.json.template +184 -0
- package/templates/.devcontainer/docker-compose.yml.template +105 -0
- package/templates/.devcontainer/init-scripts/01-init.sql.template +12 -0
- package/templates/.devcontainer/post-create.sh.template +298 -0
- package/templates/.github/workflows/ci.yml.template +399 -0
- package/templates/.github/workflows/quality.yml.template +376 -0
- package/templates/.pre-commit-config.yaml.template +106 -0
- package/templates/.project/config/edit_config.py +275 -0
- package/templates/.project/config/project_config.py +894 -0
- package/templates/.project/scripts/codegen/generate-all.sh +20 -0
- package/templates/.project/scripts/codegen/validate-all.sh +17 -0
- package/templates/.project/scripts/docs/generate-all.sh +30 -0
- package/templates/.project/scripts/docs/serve.sh +20 -0
- package/templates/.project/scripts/quality/fix-all.sh +138 -0
- package/templates/.project/scripts/quality/lint-go.sh +34 -0
- package/templates/.project/scripts/quality/lint-python.sh +54 -0
- package/templates/.project/scripts/quality/run-all.sh +497 -0
- package/templates/.project/scripts/session/commit.sh +70 -0
- package/templates/.project/scripts/session/create-pr.sh +165 -0
- package/templates/.project/scripts/session/end.sh +207 -0
- package/templates/.project/scripts/session/start.sh +233 -0
- package/templates/.project/scripts/setup/doctor.sh +404 -0
- package/templates/.project/scripts/setup/interactive-setup.sh +581 -0
- package/templates/.project/scripts/sync/sync-template.sh +328 -0
- package/templates/.project/scripts/test/run-all.sh +179 -0
- package/templates/.project/scripts/test/run-quick.sh +25 -0
- package/templates/CLAUDE.md.template +228 -0
- package/templates/Makefile +514 -0
- package/templates/config/versions.yaml +57 -0
- package/templates/configs/go/.golangci.yml.template +172 -0
- package/templates/configs/go/go.mod.template +15 -0
- package/templates/configs/node/package.json.template +67 -0
- package/templates/configs/node/tsconfig.json.template +53 -0
- package/templates/configs/python/pyproject.toml.template +92 -0
- package/templates/configs/python/pytest.ini.template +64 -0
- package/templates/configs/python/ruff.toml.template +79 -0
- package/templates/configs/rust/Cargo.toml.template +51 -0
- package/templates/configs/shared/.editorconfig +67 -0
- package/templates/scripts/validate-templates.sh +449 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.scanCodebase = scanCodebase;
|
|
37
|
+
exports.renderCodebaseSkill = renderCodebaseSkill;
|
|
38
|
+
exports.renderArchitectureRef = renderArchitectureRef;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const IGNORE_DIRS = new Set([
|
|
42
|
+
'node_modules', 'vendor', '.venv', 'venv', 'target', 'bin', 'obj',
|
|
43
|
+
'.git', '.next', '__pycache__', 'dist', 'build', '.tox', '.eggs',
|
|
44
|
+
'htmlcov', 'coverage', '.mypy_cache', '.pytest_cache', '.ruff_cache',
|
|
45
|
+
]);
|
|
46
|
+
const BINARY_EXTENSIONS = new Set([
|
|
47
|
+
'.png', '.jpg', '.jpeg', '.gif', '.ico', '.webp', '.svg',
|
|
48
|
+
'.woff', '.woff2', '.ttf', '.eot',
|
|
49
|
+
'.pdf', '.zip', '.tar', '.gz', '.br',
|
|
50
|
+
'.exe', '.dll', '.so', '.dylib',
|
|
51
|
+
'.lock', '.sum',
|
|
52
|
+
]);
|
|
53
|
+
const MAX_FILE_SIZE = 100 * 1024; // 100KB
|
|
54
|
+
// --- File Walking ---
|
|
55
|
+
function walkFiles(cwd, callback, maxDepth = 5) {
|
|
56
|
+
function walk(dir, depth) {
|
|
57
|
+
if (depth > maxDepth)
|
|
58
|
+
return;
|
|
59
|
+
let entries;
|
|
60
|
+
try {
|
|
61
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
if (entry.name.startsWith('.') && entry.name !== '.env.example')
|
|
68
|
+
continue;
|
|
69
|
+
const full = path.join(dir, entry.name);
|
|
70
|
+
const rel = path.relative(cwd, full);
|
|
71
|
+
if (entry.isDirectory()) {
|
|
72
|
+
if (!IGNORE_DIRS.has(entry.name))
|
|
73
|
+
walk(full, depth + 1);
|
|
74
|
+
}
|
|
75
|
+
else if (entry.isFile()) {
|
|
76
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
77
|
+
if (BINARY_EXTENSIONS.has(ext))
|
|
78
|
+
continue;
|
|
79
|
+
try {
|
|
80
|
+
const stat = fs.statSync(full);
|
|
81
|
+
if (stat.size > MAX_FILE_SIZE)
|
|
82
|
+
continue;
|
|
83
|
+
const content = fs.readFileSync(full, 'utf-8');
|
|
84
|
+
callback(rel, content);
|
|
85
|
+
}
|
|
86
|
+
catch { /* skip unreadable */ }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
walk(cwd, 0);
|
|
91
|
+
}
|
|
92
|
+
// --- Entry Points ---
|
|
93
|
+
const ENTRY_POINT_FILES = {
|
|
94
|
+
'main.go': 'Go entry point',
|
|
95
|
+
'app.py': 'Python application',
|
|
96
|
+
'main.py': 'Python entry point',
|
|
97
|
+
'manage.py': 'Django management',
|
|
98
|
+
'index.ts': 'Node.js entry (TypeScript)',
|
|
99
|
+
'index.js': 'Node.js entry',
|
|
100
|
+
'server.ts': 'Node.js server (TypeScript)',
|
|
101
|
+
'server.js': 'Node.js server',
|
|
102
|
+
'Program.cs': 'C# entry point',
|
|
103
|
+
'Startup.cs': 'C# ASP.NET startup',
|
|
104
|
+
'main.rs': 'Rust entry point',
|
|
105
|
+
};
|
|
106
|
+
function findEntryPoints(cwd) {
|
|
107
|
+
const results = [];
|
|
108
|
+
const seen = new Set();
|
|
109
|
+
walkFiles(cwd, (rel, content) => {
|
|
110
|
+
const basename = path.basename(rel);
|
|
111
|
+
// Known entry point filenames
|
|
112
|
+
if (ENTRY_POINT_FILES[basename] && !seen.has(rel)) {
|
|
113
|
+
results.push({ file: rel, type: ENTRY_POINT_FILES[basename] });
|
|
114
|
+
seen.add(rel);
|
|
115
|
+
}
|
|
116
|
+
// Python __main__ pattern
|
|
117
|
+
if (basename.endsWith('.py') && content.includes("__name__") && content.includes("__main__") && !seen.has(rel)) {
|
|
118
|
+
results.push({ file: rel, type: 'Python __main__ entry' });
|
|
119
|
+
seen.add(rel);
|
|
120
|
+
}
|
|
121
|
+
// Go func main pattern (for non-main.go files)
|
|
122
|
+
if (basename.endsWith('.go') && /^func\s+main\s*\(/m.test(content) && basename !== 'main.go' && !seen.has(rel)) {
|
|
123
|
+
results.push({ file: rel, type: 'Go main function' });
|
|
124
|
+
seen.add(rel);
|
|
125
|
+
}
|
|
126
|
+
}, 3); // shallow depth for entry points
|
|
127
|
+
// Check package.json main field
|
|
128
|
+
const pkgPath = path.join(cwd, 'package.json');
|
|
129
|
+
if (fs.existsSync(pkgPath)) {
|
|
130
|
+
try {
|
|
131
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
132
|
+
if (pkg.main && !seen.has(pkg.main)) {
|
|
133
|
+
results.push({ file: pkg.main, type: 'package.json main' });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch { /* ignore */ }
|
|
137
|
+
}
|
|
138
|
+
return results;
|
|
139
|
+
}
|
|
140
|
+
// --- API Routes ---
|
|
141
|
+
const ROUTE_PATTERNS = [
|
|
142
|
+
// Python FastAPI/Flask
|
|
143
|
+
{ lang: 'python', regex: /@(?:app|router)\.(get|post|put|delete|patch)\s*\(\s*['"]([^'"]+)/gi, methodGroup: 1, pathGroup: 2 },
|
|
144
|
+
// Express/Node
|
|
145
|
+
{ lang: 'node', regex: /(?:app|router)\.(get|post|put|delete|patch)\s*\(\s*['"]([^'"]+)/gi, methodGroup: 1, pathGroup: 2 },
|
|
146
|
+
// Go
|
|
147
|
+
{ lang: 'go', regex: /(?:HandleFunc|Handle)\s*\(\s*"([^"]+)"/g, methodGroup: -1, pathGroup: 1 },
|
|
148
|
+
// C# attributes
|
|
149
|
+
{ lang: 'csharp', regex: /\[Http(Get|Post|Put|Delete|Patch)(?:\s*\("([^"]*)"\))?\]/g, methodGroup: 1, pathGroup: 2 },
|
|
150
|
+
];
|
|
151
|
+
function isSourceFile(rel) {
|
|
152
|
+
// Exclude test files, docs, and generated files from API route detection
|
|
153
|
+
const lower = rel.toLowerCase();
|
|
154
|
+
if (lower.endsWith('_test.go') || lower.includes('test_') || lower.includes('/tests/'))
|
|
155
|
+
return false;
|
|
156
|
+
if (lower.endsWith('.test.ts') || lower.endsWith('.test.js') || lower.endsWith('.spec.ts') || lower.endsWith('.spec.js'))
|
|
157
|
+
return false;
|
|
158
|
+
if (lower.includes('/docs/') || lower.includes('/documentation/'))
|
|
159
|
+
return false;
|
|
160
|
+
if (lower.endsWith('.md') || lower.endsWith('.mdx') || lower.endsWith('.txt') || lower.endsWith('.rst'))
|
|
161
|
+
return false;
|
|
162
|
+
if (lower.includes('example') || lower.includes('sample') || lower.includes('fixture'))
|
|
163
|
+
return false;
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
function findApiRoutes(cwd) {
|
|
167
|
+
const results = [];
|
|
168
|
+
walkFiles(cwd, (rel, content) => {
|
|
169
|
+
if (!isSourceFile(rel))
|
|
170
|
+
return;
|
|
171
|
+
for (const pattern of ROUTE_PATTERNS) {
|
|
172
|
+
const regex = new RegExp(pattern.regex.source, pattern.regex.flags);
|
|
173
|
+
let match;
|
|
174
|
+
while ((match = regex.exec(content)) !== null) {
|
|
175
|
+
const method = pattern.methodGroup === -1 ? 'ANY' : (match[pattern.methodGroup] || 'GET').toUpperCase();
|
|
176
|
+
const routePath = match[pattern.pathGroup] || '/';
|
|
177
|
+
results.push({ method, path: routePath, file: rel });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Next.js API routes (file-based)
|
|
181
|
+
if (rel.includes('app/api/') || rel.includes('pages/api/')) {
|
|
182
|
+
const routePath = '/' + rel
|
|
183
|
+
.replace(/^.*(?:app|pages)\//, '')
|
|
184
|
+
.replace(/\/route\.[tj]sx?$/, '')
|
|
185
|
+
.replace(/\/index\.[tj]sx?$/, '')
|
|
186
|
+
.replace(/\.[tj]sx?$/, '');
|
|
187
|
+
results.push({ method: 'ANY', path: routePath, file: rel });
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
return results.slice(0, 50); // cap at 50 to avoid bloat
|
|
191
|
+
}
|
|
192
|
+
// --- Directory Classification ---
|
|
193
|
+
const DIR_PURPOSES = {
|
|
194
|
+
'src': 'Source code',
|
|
195
|
+
'lib': 'Library code',
|
|
196
|
+
'pkg': 'Packages',
|
|
197
|
+
'internal': 'Internal packages (Go)',
|
|
198
|
+
'cmd': 'CLI commands (Go)',
|
|
199
|
+
'tests': 'Test files',
|
|
200
|
+
'test': 'Test files',
|
|
201
|
+
'__tests__': 'Test files (Jest)',
|
|
202
|
+
'spec': 'Test specifications',
|
|
203
|
+
'docs': 'Documentation',
|
|
204
|
+
'documentation': 'Documentation',
|
|
205
|
+
'scripts': 'Utility scripts',
|
|
206
|
+
'tools': 'Development tools',
|
|
207
|
+
'config': 'Configuration',
|
|
208
|
+
'configs': 'Configuration',
|
|
209
|
+
'migrations': 'Database migrations',
|
|
210
|
+
'db': 'Database',
|
|
211
|
+
'api': 'API layer',
|
|
212
|
+
'routes': 'Route handlers',
|
|
213
|
+
'controllers': 'Controllers',
|
|
214
|
+
'handlers': 'Request handlers',
|
|
215
|
+
'models': 'Data models',
|
|
216
|
+
'services': 'Service layer',
|
|
217
|
+
'middleware': 'Middleware',
|
|
218
|
+
'components': 'UI components',
|
|
219
|
+
'pages': 'Page components',
|
|
220
|
+
'app': 'Application (Next.js App Router)',
|
|
221
|
+
'public': 'Static assets',
|
|
222
|
+
'static': 'Static files',
|
|
223
|
+
'assets': 'Assets',
|
|
224
|
+
'frontend': 'Frontend application',
|
|
225
|
+
'backend': 'Backend application',
|
|
226
|
+
'infra': 'Infrastructure code',
|
|
227
|
+
'deploy': 'Deployment configuration',
|
|
228
|
+
'.github': 'GitHub workflows and config',
|
|
229
|
+
};
|
|
230
|
+
function classifyDirectories(cwd) {
|
|
231
|
+
const results = [];
|
|
232
|
+
try {
|
|
233
|
+
for (const entry of fs.readdirSync(cwd, { withFileTypes: true })) {
|
|
234
|
+
if (!entry.isDirectory())
|
|
235
|
+
continue;
|
|
236
|
+
if (entry.name.startsWith('.') && entry.name !== '.github')
|
|
237
|
+
continue;
|
|
238
|
+
if (IGNORE_DIRS.has(entry.name))
|
|
239
|
+
continue;
|
|
240
|
+
const purpose = DIR_PURPOSES[entry.name];
|
|
241
|
+
if (purpose) {
|
|
242
|
+
results.push({ path: entry.name + '/', purpose });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Check one level deep for common patterns (services/python/, src/api/, etc.)
|
|
246
|
+
for (const dir of ['src', 'services', 'packages', 'apps']) {
|
|
247
|
+
const subdir = path.join(cwd, dir);
|
|
248
|
+
if (!fs.existsSync(subdir))
|
|
249
|
+
continue;
|
|
250
|
+
try {
|
|
251
|
+
for (const sub of fs.readdirSync(subdir, { withFileTypes: true })) {
|
|
252
|
+
if (!sub.isDirectory() || IGNORE_DIRS.has(sub.name))
|
|
253
|
+
continue;
|
|
254
|
+
const purpose = DIR_PURPOSES[sub.name];
|
|
255
|
+
if (purpose) {
|
|
256
|
+
results.push({ path: `${dir}/${sub.name}/`, purpose });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch { /* skip */ }
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch { /* skip */ }
|
|
264
|
+
return results;
|
|
265
|
+
}
|
|
266
|
+
// --- Test Patterns ---
|
|
267
|
+
function detectTestPatterns(cwd) {
|
|
268
|
+
const results = [];
|
|
269
|
+
// pytest
|
|
270
|
+
if (fs.existsSync(path.join(cwd, 'pytest.ini')) ||
|
|
271
|
+
fs.existsSync(path.join(cwd, 'conftest.py'))) {
|
|
272
|
+
results.push({ framework: 'pytest', location: 'tests/', pattern: 'test_*.py' });
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
try {
|
|
276
|
+
const pyproject = fs.readFileSync(path.join(cwd, 'pyproject.toml'), 'utf-8');
|
|
277
|
+
if (pyproject.includes('[tool.pytest')) {
|
|
278
|
+
results.push({ framework: 'pytest', location: 'tests/', pattern: 'test_*.py' });
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
catch { /* no pyproject */ }
|
|
282
|
+
}
|
|
283
|
+
// go test
|
|
284
|
+
let hasGoTests = false;
|
|
285
|
+
walkFiles(cwd, (rel) => {
|
|
286
|
+
if (rel.endsWith('_test.go'))
|
|
287
|
+
hasGoTests = true;
|
|
288
|
+
}, 2);
|
|
289
|
+
if (hasGoTests) {
|
|
290
|
+
results.push({ framework: 'go test', location: 'alongside source', pattern: '*_test.go' });
|
|
291
|
+
}
|
|
292
|
+
// Jest
|
|
293
|
+
if (fs.existsSync(path.join(cwd, 'jest.config.js')) ||
|
|
294
|
+
fs.existsSync(path.join(cwd, 'jest.config.ts'))) {
|
|
295
|
+
results.push({ framework: 'jest', location: '__tests__/ or *.test.ts', pattern: '*.test.{ts,tsx,js,jsx}' });
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
try {
|
|
299
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8'));
|
|
300
|
+
if (pkg.jest || pkg.devDependencies?.jest) {
|
|
301
|
+
results.push({ framework: 'jest', location: '__tests__/ or *.test.ts', pattern: '*.test.{ts,tsx,js,jsx}' });
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch { /* no package.json */ }
|
|
305
|
+
}
|
|
306
|
+
// xUnit / NUnit (C#)
|
|
307
|
+
let hasCsharpTests = false;
|
|
308
|
+
walkFiles(cwd, (rel, content) => {
|
|
309
|
+
if (rel.endsWith('.csproj') && (content.includes('xunit') || content.includes('nunit') || content.includes('MSTest'))) {
|
|
310
|
+
hasCsharpTests = true;
|
|
311
|
+
const framework = content.includes('xunit') ? 'xUnit' : content.includes('nunit') ? 'NUnit' : 'MSTest';
|
|
312
|
+
results.push({ framework, location: '*.Tests projects', pattern: '*.cs with [Fact]/[Test]' });
|
|
313
|
+
}
|
|
314
|
+
}, 2);
|
|
315
|
+
// cargo test
|
|
316
|
+
if (fs.existsSync(path.join(cwd, 'Cargo.toml'))) {
|
|
317
|
+
results.push({ framework: 'cargo test', location: 'src/ (#[cfg(test)]) + tests/', pattern: '#[test] functions' });
|
|
318
|
+
}
|
|
319
|
+
return results;
|
|
320
|
+
}
|
|
321
|
+
// --- Config Files ---
|
|
322
|
+
const CONFIG_FILES = {
|
|
323
|
+
'package.json': 'Node.js package manifest',
|
|
324
|
+
'pyproject.toml': 'Python project config',
|
|
325
|
+
'go.mod': 'Go module definition',
|
|
326
|
+
'Cargo.toml': 'Rust package manifest',
|
|
327
|
+
'Makefile': 'Build automation',
|
|
328
|
+
'docker-compose.yml': 'Docker services',
|
|
329
|
+
'docker-compose.yaml': 'Docker services',
|
|
330
|
+
'Dockerfile': 'Container build',
|
|
331
|
+
'.env.example': 'Environment template',
|
|
332
|
+
'tsconfig.json': 'TypeScript config',
|
|
333
|
+
'.eslintrc.js': 'ESLint config',
|
|
334
|
+
'.eslintrc.json': 'ESLint config',
|
|
335
|
+
'ruff.toml': 'Python linter config',
|
|
336
|
+
'.golangci.yml': 'Go linter config',
|
|
337
|
+
'pytest.ini': 'Python test config',
|
|
338
|
+
'.pre-commit-config.yaml': 'Pre-commit hooks',
|
|
339
|
+
'.editorconfig': 'Editor config',
|
|
340
|
+
'.project.yaml': 'Project config (template)',
|
|
341
|
+
'Pulumi.yaml': 'Pulumi IaC config',
|
|
342
|
+
'appsettings.json': 'C# application config',
|
|
343
|
+
'global.json': '.NET SDK config',
|
|
344
|
+
};
|
|
345
|
+
function findConfigFiles(cwd) {
|
|
346
|
+
const results = [];
|
|
347
|
+
for (const [file, purpose] of Object.entries(CONFIG_FILES)) {
|
|
348
|
+
if (fs.existsSync(path.join(cwd, file))) {
|
|
349
|
+
results.push({ file, purpose });
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return results;
|
|
353
|
+
}
|
|
354
|
+
// --- Convention Detection ---
|
|
355
|
+
function detectConventions(cwd) {
|
|
356
|
+
const conventions = [];
|
|
357
|
+
const fileNames = [];
|
|
358
|
+
walkFiles(cwd, (rel) => {
|
|
359
|
+
fileNames.push(path.basename(rel, path.extname(rel)));
|
|
360
|
+
}, 2);
|
|
361
|
+
// Naming convention
|
|
362
|
+
const snakeCount = fileNames.filter(n => n.includes('_') && !n.includes('-')).length;
|
|
363
|
+
const kebabCount = fileNames.filter(n => n.includes('-') && !n.includes('_')).length;
|
|
364
|
+
const camelCount = fileNames.filter(n => /^[a-z][a-zA-Z]+$/.test(n) && !n.includes('_') && !n.includes('-')).length;
|
|
365
|
+
const pascalCount = fileNames.filter(n => /^[A-Z][a-zA-Z]+$/.test(n)).length;
|
|
366
|
+
const max = Math.max(snakeCount, kebabCount, camelCount, pascalCount);
|
|
367
|
+
if (max > 5) {
|
|
368
|
+
if (snakeCount === max)
|
|
369
|
+
conventions.push({ pattern: 'snake_case', description: 'File names use snake_case convention' });
|
|
370
|
+
else if (kebabCount === max)
|
|
371
|
+
conventions.push({ pattern: 'kebab-case', description: 'File names use kebab-case convention' });
|
|
372
|
+
else if (pascalCount === max)
|
|
373
|
+
conventions.push({ pattern: 'PascalCase', description: 'File names use PascalCase convention' });
|
|
374
|
+
else if (camelCount === max)
|
|
375
|
+
conventions.push({ pattern: 'camelCase', description: 'File names use camelCase convention' });
|
|
376
|
+
}
|
|
377
|
+
// Test location
|
|
378
|
+
if (fs.existsSync(path.join(cwd, 'tests')) || fs.existsSync(path.join(cwd, 'test'))) {
|
|
379
|
+
conventions.push({ pattern: 'Separate test directory', description: 'Tests in dedicated tests/ directory' });
|
|
380
|
+
}
|
|
381
|
+
return conventions;
|
|
382
|
+
}
|
|
383
|
+
// --- Main Scanner ---
|
|
384
|
+
function scanCodebase(cwd) {
|
|
385
|
+
let fileCount = 0;
|
|
386
|
+
walkFiles(cwd, () => { fileCount++; }, 4);
|
|
387
|
+
return {
|
|
388
|
+
entryPoints: findEntryPoints(cwd),
|
|
389
|
+
directories: classifyDirectories(cwd),
|
|
390
|
+
testPatterns: detectTestPatterns(cwd),
|
|
391
|
+
apiEndpoints: findApiRoutes(cwd),
|
|
392
|
+
configFiles: findConfigFiles(cwd),
|
|
393
|
+
conventions: detectConventions(cwd),
|
|
394
|
+
fileCount,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
// --- Render Functions ---
|
|
398
|
+
function renderCodebaseSkill(analysis) {
|
|
399
|
+
const lines = [
|
|
400
|
+
'---',
|
|
401
|
+
'name: codebase',
|
|
402
|
+
'description: Architecture overview and navigation guide for this project. Check before starting any task to understand structure, entry points, and conventions.',
|
|
403
|
+
'---',
|
|
404
|
+
'',
|
|
405
|
+
'# Codebase Overview',
|
|
406
|
+
'',
|
|
407
|
+
`Scanned ${analysis.fileCount} files.`,
|
|
408
|
+
'',
|
|
409
|
+
];
|
|
410
|
+
if (analysis.entryPoints.length) {
|
|
411
|
+
lines.push('## Entry Points', '');
|
|
412
|
+
for (const ep of analysis.entryPoints) {
|
|
413
|
+
lines.push(`- \`${ep.file}\` — ${ep.type}`);
|
|
414
|
+
}
|
|
415
|
+
lines.push('');
|
|
416
|
+
}
|
|
417
|
+
if (analysis.directories.length) {
|
|
418
|
+
lines.push('## Key Directories', '');
|
|
419
|
+
for (const dir of analysis.directories) {
|
|
420
|
+
lines.push(`- \`${dir.path}\` — ${dir.purpose}`);
|
|
421
|
+
}
|
|
422
|
+
lines.push('');
|
|
423
|
+
}
|
|
424
|
+
if (analysis.apiEndpoints.length) {
|
|
425
|
+
lines.push('## API Surface', '');
|
|
426
|
+
for (const ep of analysis.apiEndpoints.slice(0, 30)) {
|
|
427
|
+
lines.push(`- ${ep.method} ${ep.path} (\`${ep.file}\`)`);
|
|
428
|
+
}
|
|
429
|
+
if (analysis.apiEndpoints.length > 30) {
|
|
430
|
+
lines.push(`- ... and ${analysis.apiEndpoints.length - 30} more (see references/architecture.md)`);
|
|
431
|
+
}
|
|
432
|
+
lines.push('');
|
|
433
|
+
}
|
|
434
|
+
if (analysis.testPatterns.length) {
|
|
435
|
+
lines.push('## Test Patterns', '');
|
|
436
|
+
for (const tp of analysis.testPatterns) {
|
|
437
|
+
lines.push(`- **${tp.framework}** — ${tp.location} (${tp.pattern})`);
|
|
438
|
+
}
|
|
439
|
+
lines.push('');
|
|
440
|
+
}
|
|
441
|
+
if (analysis.configFiles.length) {
|
|
442
|
+
lines.push('## Configuration', '');
|
|
443
|
+
for (const cf of analysis.configFiles) {
|
|
444
|
+
lines.push(`- \`${cf.file}\` — ${cf.purpose}`);
|
|
445
|
+
}
|
|
446
|
+
lines.push('');
|
|
447
|
+
}
|
|
448
|
+
if (analysis.conventions.length) {
|
|
449
|
+
lines.push('## Detected Conventions', '');
|
|
450
|
+
for (const c of analysis.conventions) {
|
|
451
|
+
lines.push(`- **${c.pattern}** — ${c.description}`);
|
|
452
|
+
}
|
|
453
|
+
lines.push('');
|
|
454
|
+
}
|
|
455
|
+
return lines.join('\n');
|
|
456
|
+
}
|
|
457
|
+
function renderArchitectureRef(analysis) {
|
|
458
|
+
const lines = [
|
|
459
|
+
'# Architecture Reference',
|
|
460
|
+
'',
|
|
461
|
+
'<!-- Auto-generated by vyuh-dxkit codebase scanner. -->',
|
|
462
|
+
'<!-- This file is evolving — your edits will be preserved across updates. -->',
|
|
463
|
+
'<!-- Use `vyuh-dxkit update --rescan` to regenerate. -->',
|
|
464
|
+
'',
|
|
465
|
+
];
|
|
466
|
+
if (analysis.entryPoints.length) {
|
|
467
|
+
lines.push('## Entry Points', '');
|
|
468
|
+
for (const ep of analysis.entryPoints) {
|
|
469
|
+
lines.push(`### \`${ep.file}\``, `- Type: ${ep.type}`, '');
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
if (analysis.directories.length) {
|
|
473
|
+
lines.push('## Directory Map', '');
|
|
474
|
+
lines.push('```');
|
|
475
|
+
for (const dir of analysis.directories) {
|
|
476
|
+
lines.push(`${dir.path.padEnd(30)} # ${dir.purpose}`);
|
|
477
|
+
}
|
|
478
|
+
lines.push('```', '');
|
|
479
|
+
}
|
|
480
|
+
if (analysis.apiEndpoints.length) {
|
|
481
|
+
lines.push('## API Endpoints', '');
|
|
482
|
+
lines.push('| Method | Path | File |', '|--------|------|------|');
|
|
483
|
+
for (const ep of analysis.apiEndpoints) {
|
|
484
|
+
lines.push(`| ${ep.method} | ${ep.path} | \`${ep.file}\` |`);
|
|
485
|
+
}
|
|
486
|
+
lines.push('');
|
|
487
|
+
}
|
|
488
|
+
if (analysis.configFiles.length) {
|
|
489
|
+
lines.push('## Config Inventory', '');
|
|
490
|
+
for (const cf of analysis.configFiles) {
|
|
491
|
+
lines.push(`- \`${cf.file}\` — ${cf.purpose}`);
|
|
492
|
+
}
|
|
493
|
+
lines.push('');
|
|
494
|
+
}
|
|
495
|
+
return lines.join('\n');
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=codebase-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebase-scanner.js","sourceRoot":"","sources":["../src/codebase-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ResolvedConfig } from './types';
|
|
2
|
+
export declare const VERSION = "0.1.0";
|
|
3
|
+
export declare const DEFAULT_VERSIONS: {
|
|
4
|
+
python: string;
|
|
5
|
+
go: string;
|
|
6
|
+
node: string;
|
|
7
|
+
rust: string;
|
|
8
|
+
csharp: string;
|
|
9
|
+
postgres: string;
|
|
10
|
+
redis: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const DEFAULT_COVERAGE = "80";
|
|
13
|
+
/** Files that must NEVER be overwritten (user-accumulated knowledge). */
|
|
14
|
+
export declare const EVOLVING_FILES: string[];
|
|
15
|
+
export declare function buildVariables(config: ResolvedConfig): Record<string, string>;
|
|
16
|
+
export declare function buildConditions(config: ResolvedConfig): Record<string, boolean>;
|
|
17
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,eAAO,MAAM,gBAAgB;;;;;;;;CAQ5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,yEAAyE;AACzE,eAAO,MAAM,cAAc,UAU1B,CAAC;AAEF,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4B7E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuB/E"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EVOLVING_FILES = exports.DEFAULT_COVERAGE = exports.DEFAULT_VERSIONS = exports.VERSION = void 0;
|
|
4
|
+
exports.buildVariables = buildVariables;
|
|
5
|
+
exports.buildConditions = buildConditions;
|
|
6
|
+
exports.VERSION = '0.1.0';
|
|
7
|
+
exports.DEFAULT_VERSIONS = {
|
|
8
|
+
python: '3.12',
|
|
9
|
+
go: '1.24.0',
|
|
10
|
+
node: '20',
|
|
11
|
+
rust: 'stable',
|
|
12
|
+
csharp: '8.0',
|
|
13
|
+
postgres: '16',
|
|
14
|
+
redis: '7',
|
|
15
|
+
};
|
|
16
|
+
exports.DEFAULT_COVERAGE = '80';
|
|
17
|
+
/** Files that must NEVER be overwritten (user-accumulated knowledge). */
|
|
18
|
+
exports.EVOLVING_FILES = [
|
|
19
|
+
'.claude/skills/learned/references/gotchas.md',
|
|
20
|
+
'.claude/skills/learned/references/conventions.md',
|
|
21
|
+
'.claude/skills/learned/references/deny-recommendations.md',
|
|
22
|
+
'.claude/skills/quality/references/gotchas.md',
|
|
23
|
+
'.claude/skills/test/references/gotchas.md',
|
|
24
|
+
'.claude/skills/deploy/references/gotchas.md',
|
|
25
|
+
'.claude/skills/gcloud/references/gotchas.md',
|
|
26
|
+
'.claude/skills/codebase/SKILL.md',
|
|
27
|
+
'.claude/skills/codebase/references/architecture.md',
|
|
28
|
+
];
|
|
29
|
+
function buildVariables(config) {
|
|
30
|
+
const v = {
|
|
31
|
+
PROJECT_NAME: config.projectName,
|
|
32
|
+
PROJECT_NAME_SNAKE: config.projectName.replace(/-/g, '_'),
|
|
33
|
+
PROJECT_NAME_KEBAB: config.projectName.replace(/_/g, '-'),
|
|
34
|
+
PROJECT_DESCRIPTION: config.projectDescription || 'A project',
|
|
35
|
+
GITHUB_ORG: 'myorg',
|
|
36
|
+
PYTHON_VERSION: config.versions.python ?? exports.DEFAULT_VERSIONS.python,
|
|
37
|
+
GO_VERSION: config.versions.go ?? exports.DEFAULT_VERSIONS.go,
|
|
38
|
+
NODE_VERSION: config.versions.node ?? exports.DEFAULT_VERSIONS.node,
|
|
39
|
+
RUST_VERSION: config.versions.rust ?? exports.DEFAULT_VERSIONS.rust,
|
|
40
|
+
CSHARP_VERSION: config.versions.csharp ?? exports.DEFAULT_VERSIONS.csharp,
|
|
41
|
+
POSTGRES_VERSION: exports.DEFAULT_VERSIONS.postgres,
|
|
42
|
+
REDIS_VERSION: exports.DEFAULT_VERSIONS.redis,
|
|
43
|
+
DB_NAME: 'app_dev',
|
|
44
|
+
DB_USER: 'app_user',
|
|
45
|
+
DB_PASSWORD: 'dev_password',
|
|
46
|
+
COVERAGE_THRESHOLD: config.coverageThreshold || exports.DEFAULT_COVERAGE,
|
|
47
|
+
};
|
|
48
|
+
// Derived variables
|
|
49
|
+
v.PYTHON_VERSION_NODOT = v.PYTHON_VERSION.replace('.', '');
|
|
50
|
+
const goParts = v.GO_VERSION.split('.');
|
|
51
|
+
v.GO_VERSION_SHORT = goParts.length >= 2 ? goParts.slice(0, 2).join('.') : v.GO_VERSION;
|
|
52
|
+
v.RUST_MSRV = ['stable', 'nightly', 'beta'].includes(v.RUST_VERSION) ? '1.75' : v.RUST_VERSION;
|
|
53
|
+
v.CSHARP_TFM = 'net' + v.CSHARP_VERSION;
|
|
54
|
+
return v;
|
|
55
|
+
}
|
|
56
|
+
function buildConditions(config) {
|
|
57
|
+
return {
|
|
58
|
+
IF_PYTHON: config.languages.python,
|
|
59
|
+
IF_GO: config.languages.go,
|
|
60
|
+
IF_NODE: config.languages.node || config.languages.nextjs,
|
|
61
|
+
IF_RUST: config.languages.rust,
|
|
62
|
+
IF_NEXTJS: config.languages.nextjs,
|
|
63
|
+
IF_CSHARP: config.languages.csharp,
|
|
64
|
+
IF_POSTGRES: config.infrastructure.postgres,
|
|
65
|
+
IF_REDIS: config.infrastructure.redis,
|
|
66
|
+
IF_HAS_SERVICES: config.infrastructure.postgres || config.infrastructure.redis,
|
|
67
|
+
IF_DOCKER: config.infrastructure.docker,
|
|
68
|
+
IF_GCLOUD: config.tools.gcloud,
|
|
69
|
+
IF_PULUMI: config.tools.pulumi,
|
|
70
|
+
IF_INFISICAL: config.tools.infisical,
|
|
71
|
+
IF_GH_CLI: config.tools.ghCli,
|
|
72
|
+
IF_CLAUDE_CODE: config.claudeCode,
|
|
73
|
+
IF_QUALITY_CHECKS: config.qualityChecks,
|
|
74
|
+
IF_COVERAGE_ENABLED: parseInt(config.coverageThreshold || exports.DEFAULT_COVERAGE) > 0,
|
|
75
|
+
IF_PRECOMMIT: config.precommit,
|
|
76
|
+
IF_AI_SESSIONS: config.aiSessions,
|
|
77
|
+
IF_AI_PROMPTS: config.aiPrompts,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/detect.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA4LxC,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAmCjD"}
|