@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.
Files changed (149) hide show
  1. package/dist/cli.d.ts +2 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +173 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/codebase-scanner.d.ts +33 -0
  6. package/dist/codebase-scanner.d.ts.map +1 -0
  7. package/dist/codebase-scanner.js +497 -0
  8. package/dist/codebase-scanner.js.map +1 -0
  9. package/dist/constants.d.ts +17 -0
  10. package/dist/constants.d.ts.map +1 -0
  11. package/dist/constants.js +80 -0
  12. package/dist/constants.js.map +1 -0
  13. package/dist/detect.d.ts +3 -0
  14. package/dist/detect.d.ts.map +1 -0
  15. package/dist/detect.js +264 -0
  16. package/dist/detect.js.map +1 -0
  17. package/dist/doctor.d.ts +2 -0
  18. package/dist/doctor.d.ts.map +1 -0
  19. package/dist/doctor.js +157 -0
  20. package/dist/doctor.js.map +1 -0
  21. package/dist/files.d.ts +17 -0
  22. package/dist/files.d.ts.map +1 -0
  23. package/dist/files.js +99 -0
  24. package/dist/files.js.map +1 -0
  25. package/dist/generator.d.ts +10 -0
  26. package/dist/generator.d.ts.map +1 -0
  27. package/dist/generator.js +405 -0
  28. package/dist/generator.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +9 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/logger.d.ts +9 -0
  34. package/dist/logger.d.ts.map +1 -0
  35. package/dist/logger.js +51 -0
  36. package/dist/logger.js.map +1 -0
  37. package/dist/prompts.d.ts +10 -0
  38. package/dist/prompts.d.ts.map +1 -0
  39. package/dist/prompts.js +125 -0
  40. package/dist/prompts.js.map +1 -0
  41. package/dist/template-engine.d.ts +22 -0
  42. package/dist/template-engine.d.ts.map +1 -0
  43. package/dist/template-engine.js +63 -0
  44. package/dist/template-engine.js.map +1 -0
  45. package/dist/types.d.ts +68 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +3 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/update.d.ts +2 -0
  50. package/dist/update.d.ts.map +1 -0
  51. package/dist/update.js +97 -0
  52. package/dist/update.js.map +1 -0
  53. package/package.json +43 -0
  54. package/templates/.ai/README.md +117 -0
  55. package/templates/.ai/prompts/execution-prompt.md +9 -0
  56. package/templates/.ai/prompts/planning-prompt.md +18 -0
  57. package/templates/.ai/prompts/session-end-template.md +182 -0
  58. package/templates/.ai/prompts/session-end.md +132 -0
  59. package/templates/.ai/prompts/session-start.md +109 -0
  60. package/templates/.ai/prompts/step-by-step.md +113 -0
  61. package/templates/.ai/sessions/.gitkeep +0 -0
  62. package/templates/.ai/templates/session-checkpoint-template.md +97 -0
  63. package/templates/.claude/agents/knowledge-bot.md +62 -0
  64. package/templates/.claude/agents/onboarding.md +61 -0
  65. package/templates/.claude/agents/quality-reviewer.md +85 -0
  66. package/templates/.claude/agents-available/code-reviewer.md +29 -0
  67. package/templates/.claude/agents-available/codebase-explorer.md +99 -0
  68. package/templates/.claude/agents-available/debugger.md +29 -0
  69. package/templates/.claude/agents-available/knowledge-bot.md +62 -0
  70. package/templates/.claude/agents-available/test-writer.md +34 -0
  71. package/templates/.claude/commands/ask.md +7 -0
  72. package/templates/.claude/commands/check.md.template +55 -0
  73. package/templates/.claude/commands/doctor.md +21 -0
  74. package/templates/.claude/commands/enable-agent.md +12 -0
  75. package/templates/.claude/commands/explore-codebase.md +12 -0
  76. package/templates/.claude/commands/fix-issue.md +12 -0
  77. package/templates/.claude/commands/fix.md.template +32 -0
  78. package/templates/.claude/commands/help.md +36 -0
  79. package/templates/.claude/commands/learn.md +48 -0
  80. package/templates/.claude/commands/onboarding.md +21 -0
  81. package/templates/.claude/commands/quality.md.template +42 -0
  82. package/templates/.claude/commands/session-end.md +40 -0
  83. package/templates/.claude/commands/session-start.md +30 -0
  84. package/templates/.claude/commands/setup-hooks.md +60 -0
  85. package/templates/.claude/commands/test.md.template +49 -0
  86. package/templates/.claude/rules/csharp.md +18 -0
  87. package/templates/.claude/rules/go.md +16 -0
  88. package/templates/.claude/rules/nextjs.md +17 -0
  89. package/templates/.claude/rules/python.md +19 -0
  90. package/templates/.claude/rules/rust.md +14 -0
  91. package/templates/.claude/skills/build/SKILL.md.template +98 -0
  92. package/templates/.claude/skills/deploy/SKILL.md.template +131 -0
  93. package/templates/.claude/skills/deploy/references/gotchas.md +5 -0
  94. package/templates/.claude/skills/doctor/SKILL.md +54 -0
  95. package/templates/.claude/skills/gcloud/SKILL.md +61 -0
  96. package/templates/.claude/skills/gcloud/references/gotchas.md +5 -0
  97. package/templates/.claude/skills/learned/SKILL.md +55 -0
  98. package/templates/.claude/skills/learned/references/conventions.md +11 -0
  99. package/templates/.claude/skills/learned/references/deny-recommendations.md +18 -0
  100. package/templates/.claude/skills/learned/references/gotchas.md +11 -0
  101. package/templates/.claude/skills/pulumi/SKILL.md +67 -0
  102. package/templates/.claude/skills/quality/SKILL.md.template +108 -0
  103. package/templates/.claude/skills/quality/references/gotchas.md +5 -0
  104. package/templates/.claude/skills/review/SKILL.md.template +73 -0
  105. package/templates/.claude/skills/scaffold/SKILL.md.template +123 -0
  106. package/templates/.claude/skills/secrets/SKILL.md +45 -0
  107. package/templates/.claude/skills/session/SKILL.md +43 -0
  108. package/templates/.claude/skills/test/SKILL.md.template +109 -0
  109. package/templates/.claude/skills/test/references/gotchas.md +5 -0
  110. package/templates/.devcontainer/Dockerfile.dev.template +89 -0
  111. package/templates/.devcontainer/devcontainer.json.template +184 -0
  112. package/templates/.devcontainer/docker-compose.yml.template +105 -0
  113. package/templates/.devcontainer/init-scripts/01-init.sql.template +12 -0
  114. package/templates/.devcontainer/post-create.sh.template +298 -0
  115. package/templates/.github/workflows/ci.yml.template +399 -0
  116. package/templates/.github/workflows/quality.yml.template +376 -0
  117. package/templates/.pre-commit-config.yaml.template +106 -0
  118. package/templates/.project/config/edit_config.py +275 -0
  119. package/templates/.project/config/project_config.py +894 -0
  120. package/templates/.project/scripts/codegen/generate-all.sh +20 -0
  121. package/templates/.project/scripts/codegen/validate-all.sh +17 -0
  122. package/templates/.project/scripts/docs/generate-all.sh +30 -0
  123. package/templates/.project/scripts/docs/serve.sh +20 -0
  124. package/templates/.project/scripts/quality/fix-all.sh +138 -0
  125. package/templates/.project/scripts/quality/lint-go.sh +34 -0
  126. package/templates/.project/scripts/quality/lint-python.sh +54 -0
  127. package/templates/.project/scripts/quality/run-all.sh +497 -0
  128. package/templates/.project/scripts/session/commit.sh +70 -0
  129. package/templates/.project/scripts/session/create-pr.sh +165 -0
  130. package/templates/.project/scripts/session/end.sh +207 -0
  131. package/templates/.project/scripts/session/start.sh +233 -0
  132. package/templates/.project/scripts/setup/doctor.sh +404 -0
  133. package/templates/.project/scripts/setup/interactive-setup.sh +581 -0
  134. package/templates/.project/scripts/sync/sync-template.sh +328 -0
  135. package/templates/.project/scripts/test/run-all.sh +179 -0
  136. package/templates/.project/scripts/test/run-quick.sh +25 -0
  137. package/templates/CLAUDE.md.template +228 -0
  138. package/templates/Makefile +514 -0
  139. package/templates/config/versions.yaml +57 -0
  140. package/templates/configs/go/.golangci.yml.template +172 -0
  141. package/templates/configs/go/go.mod.template +15 -0
  142. package/templates/configs/node/package.json.template +67 -0
  143. package/templates/configs/node/tsconfig.json.template +53 -0
  144. package/templates/configs/python/pyproject.toml.template +92 -0
  145. package/templates/configs/python/pytest.ini.template +64 -0
  146. package/templates/configs/python/ruff.toml.template +79 -0
  147. package/templates/configs/rust/Cargo.toml.template +51 -0
  148. package/templates/configs/shared/.editorconfig +67 -0
  149. package/templates/scripts/validate-templates.sh +449 -0
@@ -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"}
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function runUpdate(cwd: string, force: boolean, rescan?: boolean): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -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,9 @@
1
+ Great plan! Let's proceed step by step.
2
+
3
+ Before implementing each component:
4
+ 1. Tell me what you're about to do
5
+ 2. Explain WHY we're doing it this way
6
+ 3. Explain HOW it will work
7
+ 4. Then implement it
8
+
9
+ Let's start with {FIRST_COMPONENT_FROM_PLAN}.
@@ -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.