@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
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
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.promptForConfig = promptForConfig;
|
|
37
|
+
const readline = __importStar(require("readline/promises"));
|
|
38
|
+
const process_1 = require("process");
|
|
39
|
+
const constants_1 = require("./constants");
|
|
40
|
+
const logger = __importStar(require("./logger"));
|
|
41
|
+
async function ask(rl, question, defaultValue) {
|
|
42
|
+
const answer = await rl.question(` ${question} [${defaultValue}]: `);
|
|
43
|
+
return answer.trim() || defaultValue;
|
|
44
|
+
}
|
|
45
|
+
async function confirm(rl, question, defaultYes) {
|
|
46
|
+
const hint = defaultYes ? 'Y/n' : 'y/N';
|
|
47
|
+
const answer = await rl.question(` ${question} [${hint}]: `);
|
|
48
|
+
if (!answer.trim())
|
|
49
|
+
return defaultYes;
|
|
50
|
+
return answer.trim().toLowerCase().startsWith('y');
|
|
51
|
+
}
|
|
52
|
+
async function promptForConfig(detected, options) {
|
|
53
|
+
// Non-interactive: accept all defaults
|
|
54
|
+
if (options.yes || options.detect) {
|
|
55
|
+
return {
|
|
56
|
+
config: {
|
|
57
|
+
...detected,
|
|
58
|
+
projectName: options.name || detected.projectName,
|
|
59
|
+
coverageThreshold: constants_1.DEFAULT_COVERAGE,
|
|
60
|
+
precommit: true,
|
|
61
|
+
qualityChecks: true,
|
|
62
|
+
aiSessions: true,
|
|
63
|
+
aiPrompts: true,
|
|
64
|
+
claudeCode: true,
|
|
65
|
+
},
|
|
66
|
+
mode: options.detect ? 'dx-only' : 'full',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const rl = readline.createInterface({ input: process_1.stdin, output: process_1.stdout });
|
|
70
|
+
try {
|
|
71
|
+
// Show detected stack
|
|
72
|
+
logger.header('Detected Stack');
|
|
73
|
+
const langs = Object.entries(detected.languages)
|
|
74
|
+
.filter(([, v]) => v)
|
|
75
|
+
.map(([k]) => k);
|
|
76
|
+
const tools = Object.entries(detected.tools)
|
|
77
|
+
.filter(([, v]) => v)
|
|
78
|
+
.map(([k]) => k);
|
|
79
|
+
const infra = Object.entries(detected.infrastructure)
|
|
80
|
+
.filter(([, v]) => v)
|
|
81
|
+
.map(([k]) => k);
|
|
82
|
+
if (langs.length)
|
|
83
|
+
logger.info(`Languages: ${langs.join(', ')}`);
|
|
84
|
+
if (infra.length)
|
|
85
|
+
logger.info(`Infrastructure: ${infra.join(', ')}`);
|
|
86
|
+
if (tools.length)
|
|
87
|
+
logger.info(`Tools: ${tools.join(', ')}`);
|
|
88
|
+
console.log('');
|
|
89
|
+
const includeAll = await confirm(rl, 'Include all detected?', true);
|
|
90
|
+
if (!includeAll) {
|
|
91
|
+
// Allow deselecting — for simplicity, just ask per language
|
|
92
|
+
for (const lang of Object.keys(detected.languages)) {
|
|
93
|
+
if (detected.languages[lang]) {
|
|
94
|
+
detected.languages[lang] = await confirm(rl, `Include ${lang}?`, true);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const projectName = options.name || await ask(rl, 'Project name?', detected.projectName);
|
|
99
|
+
const includeFull = await confirm(rl, 'Include quality infrastructure (CI, hooks, linters)?', true);
|
|
100
|
+
const mode = includeFull ? 'full' : 'dx-only';
|
|
101
|
+
let coverageThreshold = constants_1.DEFAULT_COVERAGE;
|
|
102
|
+
let precommit = true;
|
|
103
|
+
if (includeFull) {
|
|
104
|
+
coverageThreshold = await ask(rl, 'Coverage threshold?', constants_1.DEFAULT_COVERAGE);
|
|
105
|
+
precommit = await confirm(rl, 'Enable pre-commit hooks?', true);
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
config: {
|
|
109
|
+
...detected,
|
|
110
|
+
projectName,
|
|
111
|
+
coverageThreshold,
|
|
112
|
+
precommit,
|
|
113
|
+
qualityChecks: includeFull,
|
|
114
|
+
aiSessions: true,
|
|
115
|
+
aiPrompts: true,
|
|
116
|
+
claudeCode: true,
|
|
117
|
+
},
|
|
118
|
+
mode,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
rl.close();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template engine — JS port of .template/scripts/bootstrap/template_engine.py
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* {{VAR_NAME}} → variable substitution
|
|
6
|
+
* {{#IF_CONDITION}}...{{/IF_CONDITION}} → conditional blocks
|
|
7
|
+
* {{#IF_CONDITION}}...{{#ELSE}}...{{/IF_CONDITION}} → if/else
|
|
8
|
+
* Nested conditionals (max 20 iterations)
|
|
9
|
+
*
|
|
10
|
+
* Avoids matching GitHub Actions ${{ }} syntax via negative lookbehind.
|
|
11
|
+
*/
|
|
12
|
+
export declare class TemplateEngine {
|
|
13
|
+
private variables;
|
|
14
|
+
private conditions;
|
|
15
|
+
constructor(variables: Record<string, string>, conditions: Record<string, boolean>);
|
|
16
|
+
process(content: string): string;
|
|
17
|
+
private processConditionals;
|
|
18
|
+
private processVariables;
|
|
19
|
+
}
|
|
20
|
+
/** Process a template string with the given variables and conditions. */
|
|
21
|
+
export declare function processTemplate(content: string, variables: Record<string, string>, conditions: Record<string, boolean>): string;
|
|
22
|
+
//# sourceMappingURL=template-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../src/template-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAA0B;gBAG1C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAMrC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAQhC,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,gBAAgB;CASzB;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAER"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Template engine — JS port of .template/scripts/bootstrap/template_engine.py
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* {{VAR_NAME}} → variable substitution
|
|
7
|
+
* {{#IF_CONDITION}}...{{/IF_CONDITION}} → conditional blocks
|
|
8
|
+
* {{#IF_CONDITION}}...{{#ELSE}}...{{/IF_CONDITION}} → if/else
|
|
9
|
+
* Nested conditionals (max 20 iterations)
|
|
10
|
+
*
|
|
11
|
+
* Avoids matching GitHub Actions ${{ }} syntax via negative lookbehind.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.TemplateEngine = void 0;
|
|
15
|
+
exports.processTemplate = processTemplate;
|
|
16
|
+
class TemplateEngine {
|
|
17
|
+
variables;
|
|
18
|
+
conditions;
|
|
19
|
+
constructor(variables, conditions) {
|
|
20
|
+
this.variables = variables;
|
|
21
|
+
this.conditions = conditions;
|
|
22
|
+
}
|
|
23
|
+
process(content) {
|
|
24
|
+
content = this.processConditionals(content);
|
|
25
|
+
content = this.processVariables(content);
|
|
26
|
+
// Normalize trailing whitespace: collapse blank lines at end, ensure single newline
|
|
27
|
+
content = content.replace(/\n{3,}/g, '\n\n');
|
|
28
|
+
return content.trimEnd() + '\n';
|
|
29
|
+
}
|
|
30
|
+
processConditionals(content) {
|
|
31
|
+
// Process innermost conditionals first, iterate to handle nesting
|
|
32
|
+
const pattern = /\{\{#(IF_[A-Z_]+)\}\}([\s\S]*?)\{\{\/\1\}\}/;
|
|
33
|
+
for (let i = 0; i < 20; i++) {
|
|
34
|
+
const match = pattern.exec(content);
|
|
35
|
+
if (!match)
|
|
36
|
+
break;
|
|
37
|
+
const [fullMatch, condName, block] = match;
|
|
38
|
+
const elseParts = block.split('{{#ELSE}}');
|
|
39
|
+
const ifContent = elseParts[0];
|
|
40
|
+
const elseContent = elseParts.length > 1 ? elseParts[1] : '';
|
|
41
|
+
const isTrue = this.conditions[condName] ?? false;
|
|
42
|
+
const replacement = isTrue ? ifContent : elseContent;
|
|
43
|
+
content = content.replace(fullMatch, replacement);
|
|
44
|
+
}
|
|
45
|
+
return content;
|
|
46
|
+
}
|
|
47
|
+
processVariables(content) {
|
|
48
|
+
// Match {{VAR}} but not ${{ (GitHub Actions syntax)
|
|
49
|
+
// JS doesn't support lookbehind in all environments, so we use a workaround
|
|
50
|
+
return content.replace(/(\$?)\{\{([A-Z][A-Z0-9_]*)\}\}/g, (match, prefix, name) => {
|
|
51
|
+
// If preceded by $, it's GitHub Actions syntax — leave it
|
|
52
|
+
if (prefix === '$')
|
|
53
|
+
return match;
|
|
54
|
+
return this.variables[name] ?? match;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.TemplateEngine = TemplateEngine;
|
|
59
|
+
/** Process a template string with the given variables and conditions. */
|
|
60
|
+
function processTemplate(content, variables, conditions) {
|
|
61
|
+
return new TemplateEngine(variables, conditions).process(content);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=template-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../src/template-engine.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAwDH,0CAMC;AA5DD,MAAa,cAAc;IACjB,SAAS,CAAyB;IAClC,UAAU,CAA0B;IAE5C,YACE,SAAiC,EACjC,UAAmC;QAEnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACzC,oFAAoF;QACpF,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,CAAC;IAEO,mBAAmB,CAAC,OAAe;QACzC,kEAAkE;QAClE,MAAM,OAAO,GAAG,6CAA6C,CAAC;QAE9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,MAAM;YAElB,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;YAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE7D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;YAClD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YAErD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,gBAAgB,CAAC,OAAe;QACtC,oDAAoD;QACpD,4EAA4E;QAC5E,OAAO,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAChF,0DAA0D;YAC1D,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,KAAK,CAAC;YACjC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAnDD,wCAmDC;AAED,yEAAyE;AACzE,SAAgB,eAAe,CAC7B,OAAe,EACf,SAAiC,EACjC,UAAmC;IAEnC,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export interface DetectedStack {
|
|
2
|
+
languages: {
|
|
3
|
+
python: boolean;
|
|
4
|
+
go: boolean;
|
|
5
|
+
node: boolean;
|
|
6
|
+
nextjs: boolean;
|
|
7
|
+
rust: boolean;
|
|
8
|
+
csharp: boolean;
|
|
9
|
+
};
|
|
10
|
+
infrastructure: {
|
|
11
|
+
docker: boolean;
|
|
12
|
+
postgres: boolean;
|
|
13
|
+
redis: boolean;
|
|
14
|
+
};
|
|
15
|
+
tools: {
|
|
16
|
+
gcloud: boolean;
|
|
17
|
+
pulumi: boolean;
|
|
18
|
+
infisical: boolean;
|
|
19
|
+
ghCli: boolean;
|
|
20
|
+
};
|
|
21
|
+
projectName: string;
|
|
22
|
+
projectDescription: string;
|
|
23
|
+
versions: {
|
|
24
|
+
python?: string;
|
|
25
|
+
go?: string;
|
|
26
|
+
node?: string;
|
|
27
|
+
rust?: string;
|
|
28
|
+
csharp?: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface ResolvedConfig extends DetectedStack {
|
|
32
|
+
coverageThreshold: string;
|
|
33
|
+
precommit: boolean;
|
|
34
|
+
qualityChecks: boolean;
|
|
35
|
+
aiSessions: boolean;
|
|
36
|
+
aiPrompts: boolean;
|
|
37
|
+
claudeCode: boolean;
|
|
38
|
+
}
|
|
39
|
+
export type GenerationMode = 'dx-only' | 'full';
|
|
40
|
+
export interface FileEntry {
|
|
41
|
+
templatePath: string;
|
|
42
|
+
outputPath: string;
|
|
43
|
+
mode: GenerationMode;
|
|
44
|
+
isTemplate: boolean;
|
|
45
|
+
evolving: boolean;
|
|
46
|
+
condition?: string;
|
|
47
|
+
executable?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface ManifestFileEntry {
|
|
50
|
+
hash: string | null;
|
|
51
|
+
evolving: boolean;
|
|
52
|
+
}
|
|
53
|
+
export interface Manifest {
|
|
54
|
+
version: string;
|
|
55
|
+
mode: GenerationMode;
|
|
56
|
+
generatedAt: string;
|
|
57
|
+
config: ResolvedConfig;
|
|
58
|
+
files: Record<string, ManifestFileEntry>;
|
|
59
|
+
}
|
|
60
|
+
export interface InitOptions {
|
|
61
|
+
mode: GenerationMode;
|
|
62
|
+
force: boolean;
|
|
63
|
+
yes: boolean;
|
|
64
|
+
detect: boolean;
|
|
65
|
+
name?: string;
|
|
66
|
+
}
|
|
67
|
+
export type WriteResult = 'created' | 'skipped' | 'overwritten';
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE;QACT,MAAM,EAAE,OAAO,CAAC;QAChB,EAAE,EAAE,OAAO,CAAC;QACZ,IAAI,EAAE,OAAO,CAAC;QACd,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC;QACd,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,cAAc,EAAE;QACd,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,KAAK,EAAE;QACL,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/update.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAOA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D1F"}
|
package/dist/update.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
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.runUpdate = runUpdate;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const detect_1 = require("./detect");
|
|
40
|
+
const generator_1 = require("./generator");
|
|
41
|
+
const logger = __importStar(require("./logger"));
|
|
42
|
+
async function runUpdate(cwd, force, rescan = false) {
|
|
43
|
+
logger.header('vyuh-dxkit update');
|
|
44
|
+
const manifestPath = path.join(cwd, '.vyuh-dxkit.json');
|
|
45
|
+
if (!fs.existsSync(manifestPath)) {
|
|
46
|
+
logger.fail('.vyuh-dxkit.json not found. Run `vyuh-dxkit init` first.');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
let manifest;
|
|
50
|
+
try {
|
|
51
|
+
manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
logger.fail('Failed to parse .vyuh-dxkit.json');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
logger.info(`Previous init: ${manifest.generatedAt} (mode: ${manifest.mode})`);
|
|
58
|
+
// Re-detect stack
|
|
59
|
+
logger.info('Re-detecting stack...');
|
|
60
|
+
const detected = (0, detect_1.detect)(cwd);
|
|
61
|
+
// Merge: new detection overrides, but preserve mode and thresholds from manifest
|
|
62
|
+
const config = {
|
|
63
|
+
...detected,
|
|
64
|
+
coverageThreshold: manifest.config.coverageThreshold,
|
|
65
|
+
precommit: manifest.config.precommit,
|
|
66
|
+
qualityChecks: manifest.config.qualityChecks,
|
|
67
|
+
aiSessions: manifest.config.aiSessions,
|
|
68
|
+
aiPrompts: manifest.config.aiPrompts,
|
|
69
|
+
claudeCode: manifest.config.claudeCode,
|
|
70
|
+
};
|
|
71
|
+
// Merge languages: keep enabled if previously enabled OR newly detected
|
|
72
|
+
for (const lang of Object.keys(config.languages)) {
|
|
73
|
+
config.languages[lang] = config.languages[lang] || manifest.config.languages[lang];
|
|
74
|
+
}
|
|
75
|
+
// If rescan requested, remove codebase skill so it gets regenerated
|
|
76
|
+
if (rescan) {
|
|
77
|
+
const codebasePath = path.join(cwd, '.claude', 'skills', 'codebase');
|
|
78
|
+
if (fs.existsSync(codebasePath)) {
|
|
79
|
+
fs.rmSync(codebasePath, { recursive: true });
|
|
80
|
+
logger.info('Cleared codebase skill for rescan');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Re-generate (noScan=false so codebase gets regenerated if rescan or first time)
|
|
84
|
+
const result = await (0, generator_1.generate)(cwd, config, manifest.mode, force, false);
|
|
85
|
+
// Summary
|
|
86
|
+
console.log('');
|
|
87
|
+
logger.header('Update Summary');
|
|
88
|
+
if (result.created.length)
|
|
89
|
+
logger.success(`Created: ${result.created.length} new files`);
|
|
90
|
+
if (result.skipped.length)
|
|
91
|
+
logger.warn(`Skipped: ${result.skipped.length} files (preserved)`);
|
|
92
|
+
if (result.overwritten.length)
|
|
93
|
+
logger.info(`Updated: ${result.overwritten.length} files`);
|
|
94
|
+
console.log('');
|
|
95
|
+
logger.success('Update complete. Evolved files (gotchas, conventions) preserved.');
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vyuhlabs/dxkit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-native developer experience toolkit for any repository",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"bin": {
|
|
7
|
+
"vyuh-dxkit": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=18.0.0"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/",
|
|
18
|
+
"templates/",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "node scripts/copy-templates.js && tsc",
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
|
+
"typecheck": "tsc --noEmit"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"typescript": "^5.4.0",
|
|
29
|
+
"@types/node": "^20.0.0"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"vyuh",
|
|
33
|
+
"dxkit",
|
|
34
|
+
"claude",
|
|
35
|
+
"copilot",
|
|
36
|
+
"codex",
|
|
37
|
+
"cursor",
|
|
38
|
+
"dx",
|
|
39
|
+
"developer-experience",
|
|
40
|
+
"ai",
|
|
41
|
+
"skills"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# AI-Assisted Development Sessions
|
|
2
|
+
|
|
3
|
+
This directory contains session checkpoints, templates, and prompts for AI-assisted development.
|
|
4
|
+
|
|
5
|
+
## Directory Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
.ai/
|
|
9
|
+
├── README.md # This file
|
|
10
|
+
├── sessions/ # Session checkpoints by developer
|
|
11
|
+
│ ├── john-doe/
|
|
12
|
+
│ │ ├── 2025-10-05/
|
|
13
|
+
│ │ │ ├── session-1.md
|
|
14
|
+
│ │ │ └── session-2.md
|
|
15
|
+
│ │ └── 2025-10-06/
|
|
16
|
+
│ │ └── session-1.md
|
|
17
|
+
│ └── jane-smith/
|
|
18
|
+
│ └── 2025-10-05/
|
|
19
|
+
│ └── session-1.md
|
|
20
|
+
├── templates/
|
|
21
|
+
│ └── session-checkpoint-template.md # Checkpoint template
|
|
22
|
+
└── prompts/
|
|
23
|
+
├── session-start.md # Starting session prompt
|
|
24
|
+
├── step-by-step.md # Development flow prompt
|
|
25
|
+
└── session-end.md # Ending session prompt
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
### Starting a New Session
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
make ai-start
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This will:
|
|
37
|
+
- Show your last checkpoint (if exists)
|
|
38
|
+
- Display the session start prompt
|
|
39
|
+
- Help you plan the session with AI
|
|
40
|
+
|
|
41
|
+
### During Development
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
make ai-step
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Shows the step-by-step development guide for AI-assisted coding.
|
|
48
|
+
|
|
49
|
+
### Ending a Session
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
make ai-checkpoint
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
This will:
|
|
56
|
+
- Show the session end prompt
|
|
57
|
+
- Tell AI where to create the checkpoint file
|
|
58
|
+
- Provide the template location
|
|
59
|
+
|
|
60
|
+
### View Session History
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
make ai-history
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Shows recent sessions for you and other developers.
|
|
67
|
+
|
|
68
|
+
## Session Workflow
|
|
69
|
+
|
|
70
|
+
1. **Start:** `make ai-start` → Plan with AI
|
|
71
|
+
2. **Develop:** Code step-by-step, use `make ai-step` as reference
|
|
72
|
+
3. **End:** `make ai-checkpoint` → AI creates checkpoint
|
|
73
|
+
4. **Commit:** Include checkpoint in commit message
|
|
74
|
+
|
|
75
|
+
## Session Naming Convention
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
.ai/sessions/{developer-name}/{YYYY-MM-DD}/session-{N}.md
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
- `developer-name`: From `git config user.name` (lowercase, hyphens)
|
|
82
|
+
- `YYYY-MM-DD`: Dated folder for that day's sessions
|
|
83
|
+
- `N`: Session number for that day
|
|
84
|
+
|
|
85
|
+
## What Goes in a Checkpoint?
|
|
86
|
+
|
|
87
|
+
A good checkpoint includes:
|
|
88
|
+
|
|
89
|
+
- **Session goal** - What we set out to accomplish
|
|
90
|
+
- **Accomplishments** - Specific items completed
|
|
91
|
+
- **Files changed** - All created/modified files
|
|
92
|
+
- **Key decisions** - Why we chose this approach
|
|
93
|
+
- **Implementation details** - How it works
|
|
94
|
+
- **Testing status** - What's tested and passing
|
|
95
|
+
- **Next steps** - Clear actions for next session
|
|
96
|
+
- **AI context** - Detailed context for continuing
|
|
97
|
+
|
|
98
|
+
See [session-checkpoint-template.md](templates/session-checkpoint-template.md) for full structure.
|
|
99
|
+
|
|
100
|
+
## Best Practices
|
|
101
|
+
|
|
102
|
+
✅ **Do:**
|
|
103
|
+
- Create checkpoints at end of every session
|
|
104
|
+
- Be specific and detailed
|
|
105
|
+
- Document key decisions and reasoning
|
|
106
|
+
- Provide clear next steps
|
|
107
|
+
- Include enough context for AI to continue
|
|
108
|
+
|
|
109
|
+
❌ **Don't:**
|
|
110
|
+
- Skip checkpoint creation
|
|
111
|
+
- Be vague ("worked on stuff")
|
|
112
|
+
- Forget to list all file changes
|
|
113
|
+
- Leave out decision rationale
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
**Remember:** Good checkpoints enable seamless collaboration between developers and AI agents.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
I want to {YOUR_GOAL_HERE}
|
|
2
|
+
{IF_CONTINUING_FROM_CHECKPOINT}
|
|
3
|
+
I'm continuing from a previous session. Please read:
|
|
4
|
+
{CHECKPOINT_PATH}
|
|
5
|
+
|
|
6
|
+
Summarize what was accomplished and what's left to do.
|
|
7
|
+
{END_IF}
|
|
8
|
+
Before we start coding, let's plan this session:
|
|
9
|
+
|
|
10
|
+
1. What files will we need to create/modify?
|
|
11
|
+
2. What are the key components/functions?
|
|
12
|
+
3. What dependencies or external services do we need?
|
|
13
|
+
4. What tests should we write?
|
|
14
|
+
5. Can we complete this in one session (within context window)?
|
|
15
|
+
6. Does this align with our architecture?
|
|
16
|
+
7. Are there relevant gotchas or conventions in `.claude/skills/` to be aware of?
|
|
17
|
+
|
|
18
|
+
Once we have a solid plan that fits in one session, I'll ask you to proceed.
|