ai-devkit 0.3.2 → 0.4.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 (88) hide show
  1. package/README.md +15 -165
  2. package/dist/__tests__/lib/Config.test.d.ts +2 -0
  3. package/dist/__tests__/lib/Config.test.d.ts.map +1 -0
  4. package/dist/__tests__/lib/Config.test.js +281 -0
  5. package/dist/__tests__/lib/Config.test.js.map +1 -0
  6. package/dist/__tests__/lib/EnvironmentSelector.test.d.ts +2 -0
  7. package/dist/__tests__/lib/EnvironmentSelector.test.d.ts.map +1 -0
  8. package/dist/__tests__/lib/EnvironmentSelector.test.js +117 -0
  9. package/dist/__tests__/lib/EnvironmentSelector.test.js.map +1 -0
  10. package/dist/__tests__/lib/PhaseSelector.test.d.ts +2 -0
  11. package/dist/__tests__/lib/PhaseSelector.test.d.ts.map +1 -0
  12. package/dist/__tests__/lib/PhaseSelector.test.js +77 -0
  13. package/dist/__tests__/lib/PhaseSelector.test.js.map +1 -0
  14. package/dist/__tests__/util/env.test.d.ts +2 -0
  15. package/dist/__tests__/util/env.test.d.ts.map +1 -0
  16. package/dist/__tests__/util/env.test.js +166 -0
  17. package/dist/__tests__/util/env.test.js.map +1 -0
  18. package/dist/cli.js +0 -0
  19. package/dist/commands/init.d.ts +2 -2
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +54 -67
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/phase.js +1 -1
  24. package/dist/commands/phase.js.map +1 -1
  25. package/dist/lib/Config.d.ts +5 -2
  26. package/dist/lib/Config.d.ts.map +1 -1
  27. package/dist/lib/Config.js +18 -3
  28. package/dist/lib/Config.js.map +1 -1
  29. package/dist/lib/EnvironmentSelector.d.ts +7 -0
  30. package/dist/lib/EnvironmentSelector.d.ts.map +1 -0
  31. package/dist/lib/EnvironmentSelector.js +62 -0
  32. package/dist/lib/EnvironmentSelector.js.map +1 -0
  33. package/dist/lib/PhaseSelector.d.ts +8 -0
  34. package/dist/lib/PhaseSelector.d.ts.map +1 -0
  35. package/dist/lib/PhaseSelector.js +58 -0
  36. package/dist/lib/PhaseSelector.js.map +1 -0
  37. package/dist/lib/TemplateManager.d.ts +5 -5
  38. package/dist/lib/TemplateManager.d.ts.map +1 -1
  39. package/dist/lib/TemplateManager.js +73 -60
  40. package/dist/lib/TemplateManager.js.map +1 -1
  41. package/dist/types.d.ts +9 -2
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js.map +1 -1
  44. package/dist/util/env.d.ts +11 -0
  45. package/dist/util/env.d.ts.map +1 -0
  46. package/dist/util/env.js +109 -0
  47. package/dist/util/env.js.map +1 -0
  48. package/jest.config.js +22 -0
  49. package/package.json +16 -10
  50. package/web/.nojekyll +2 -0
  51. package/web/CNAME +1 -0
  52. package/web/README.md +100 -0
  53. package/web/app/favicon.ico +0 -0
  54. package/web/app/globals.css +122 -0
  55. package/web/app/layout.tsx +106 -0
  56. package/web/app/page.tsx +119 -0
  57. package/web/app/roadmap/page.tsx +150 -0
  58. package/web/app/robots.ts +16 -0
  59. package/web/app/sitemap.ts +46 -0
  60. package/web/app/vision/page.tsx +49 -0
  61. package/web/components/Footer.tsx +81 -0
  62. package/web/components/GitHubButton.tsx +49 -0
  63. package/web/components/GitHubStars.tsx +27 -0
  64. package/web/components/Header.tsx +108 -0
  65. package/web/components/MarkdownContent.tsx +35 -0
  66. package/web/components/SkipToContent.tsx +11 -0
  67. package/web/content/pages/vision.md +42 -0
  68. package/web/content/roadmap/1-web.md +9 -0
  69. package/web/content/roadmap/2-integrations.md +7 -0
  70. package/web/content/roadmap/3-cli-enhancements.md +8 -0
  71. package/web/content/roadmap/4-local-memory.md +8 -0
  72. package/web/eslint.config.mjs +18 -0
  73. package/web/lib/GitHubContext.tsx +57 -0
  74. package/web/lib/content/loader.ts +152 -0
  75. package/web/lib/content/types.ts +37 -0
  76. package/web/lib/utils.ts +12 -0
  77. package/web/next.config.ts +11 -0
  78. package/web/package-lock.json +8837 -0
  79. package/web/package.json +34 -0
  80. package/web/postcss.config.mjs +7 -0
  81. package/web/public/file.svg +1 -0
  82. package/web/public/globe.svg +1 -0
  83. package/web/public/next.svg +1 -0
  84. package/web/public/vercel.svg +1 -0
  85. package/web/public/window.svg +1 -0
  86. package/templates/env/claude/CLAUDE.md +0 -52
  87. package/templates/env/cursor/AGENTS.md +0 -51
  88. package/templates/env/cursor/rules/base.md +0 -1
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EnvironmentSelector = void 0;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const env_1 = require("../util/env");
9
+ class EnvironmentSelector {
10
+ async selectEnvironments() {
11
+ const environments = (0, env_1.getAllEnvironments)();
12
+ const choices = environments.map(env => ({
13
+ name: env.name,
14
+ value: env.code,
15
+ short: env.name
16
+ }));
17
+ const answers = await inquirer_1.default.prompt([
18
+ {
19
+ type: 'checkbox',
20
+ name: 'environments',
21
+ message: 'Select AI environments to set up (use space to select, enter to confirm):',
22
+ choices,
23
+ pageSize: 10,
24
+ validate: (input) => {
25
+ if (input.length === 0) {
26
+ return 'Please select at least one environment.';
27
+ }
28
+ return true;
29
+ }
30
+ }
31
+ ]);
32
+ return answers.environments;
33
+ }
34
+ async confirmOverride(conflicts) {
35
+ if (conflicts.length === 0) {
36
+ return true;
37
+ }
38
+ const conflictNames = conflicts.map(id => (0, env_1.getEnvironmentDisplayName)(id));
39
+ const answers = await inquirer_1.default.prompt([
40
+ {
41
+ type: 'confirm',
42
+ name: 'proceed',
43
+ message: `The following environments are already set up and will be overwritten:\n ${conflictNames.join(', ')}\n\nDo you want to continue?`,
44
+ default: false
45
+ }
46
+ ]);
47
+ return answers.proceed;
48
+ }
49
+ displaySelectionSummary(selected) {
50
+ if (selected.length === 0) {
51
+ console.log('No environments selected.');
52
+ return;
53
+ }
54
+ console.log('\nSelected environments:');
55
+ selected.forEach(envId => {
56
+ console.log(` [OK] ${(0, env_1.getEnvironmentDisplayName)(envId)}`);
57
+ });
58
+ console.log('');
59
+ }
60
+ }
61
+ exports.EnvironmentSelector = EnvironmentSelector;
62
+ //# sourceMappingURL=EnvironmentSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnvironmentSelector.js","sourceRoot":"","sources":["../../src/lib/EnvironmentSelector.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAgC;AAEhC,qCAAoG;AAEpG,MAAa,mBAAmB;IAC9B,KAAK,CAAC,kBAAkB;QACtB,MAAM,YAAY,GAAG,IAAA,wBAAkB,GAAE,CAAC;QAE1C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,IAAuB;YAClC,KAAK,EAAE,GAAG,CAAC,IAAI;SAChB,CAAC,CAAC,CAAC;QAEJ,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACpC;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,2EAA2E;gBACpF,OAAO;gBACP,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,CAAC,KAAwB,EAAE,EAAE;oBACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACvB,OAAO,yCAAyC,CAAC;oBACnD,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,YAAY,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAA4B;QAChD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAA,+BAAyB,EAAC,EAAE,CAAC,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACpC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,6EAA6E,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B;gBAC5I,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,uBAAuB,CAAC,QAA2B;QACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,UAAU,IAAA,+BAAyB,EAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF;AA5DD,kDA4DC"}
@@ -0,0 +1,8 @@
1
+ import { Phase } from '../types';
2
+ export declare class PhaseSelector {
3
+ selectPhases(all?: boolean, phases?: string): Promise<Phase[]>;
4
+ private promptPhaseSelection;
5
+ private parsePhaseString;
6
+ displaySelectionSummary(selected: Phase[]): void;
7
+ }
8
+ //# sourceMappingURL=PhaseSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseSelector.d.ts","sourceRoot":"","sources":["../../src/lib/PhaseSelector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAyC,MAAM,UAAU,CAAC;AAExE,qBAAa,aAAa;IAClB,YAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAmBtD,oBAAoB;IAiBlC,OAAO,CAAC,gBAAgB;IAGxB,uBAAuB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI;CAYjD"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PhaseSelector = void 0;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const types_1 = require("../types");
9
+ class PhaseSelector {
10
+ async selectPhases(all, phases) {
11
+ let selectedPhases = [];
12
+ if (all) {
13
+ selectedPhases = [...types_1.AVAILABLE_PHASES];
14
+ }
15
+ else if (phases) {
16
+ selectedPhases = this.parsePhaseString(phases);
17
+ }
18
+ else {
19
+ selectedPhases = await this.promptPhaseSelection();
20
+ }
21
+ if (selectedPhases.length === 0) {
22
+ console.log('No phases selected.');
23
+ return [];
24
+ }
25
+ return selectedPhases;
26
+ }
27
+ async promptPhaseSelection() {
28
+ const answers = await inquirer_1.default.prompt([
29
+ {
30
+ type: 'checkbox',
31
+ name: 'phases',
32
+ message: 'Which phases do you want to initialize? (or use --all flag)',
33
+ choices: types_1.AVAILABLE_PHASES.map(phase => ({
34
+ name: types_1.PHASE_DISPLAY_NAMES[phase],
35
+ value: phase,
36
+ checked: true
37
+ }))
38
+ }
39
+ ]);
40
+ return answers.phases;
41
+ }
42
+ parsePhaseString(phases) {
43
+ return phases.split(',').map(p => p.trim());
44
+ }
45
+ displaySelectionSummary(selected) {
46
+ if (selected.length === 0) {
47
+ console.log('No phases selected.');
48
+ return;
49
+ }
50
+ console.log('\nSelected phases:');
51
+ selected.forEach(phase => {
52
+ console.log(` [OK] ${types_1.PHASE_DISPLAY_NAMES[phase]}`);
53
+ });
54
+ console.log('');
55
+ }
56
+ }
57
+ exports.PhaseSelector = PhaseSelector;
58
+ //# sourceMappingURL=PhaseSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseSelector.js","sourceRoot":"","sources":["../../src/lib/PhaseSelector.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAgC;AAChC,oCAAwE;AAExE,MAAa,aAAa;IACxB,KAAK,CAAC,YAAY,CAAC,GAAa,EAAE,MAAe;QAC/C,IAAI,cAAc,GAAY,EAAE,CAAC;QAEjC,IAAI,GAAG,EAAE,CAAC;YACR,cAAc,GAAG,CAAC,GAAG,wBAAgB,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACpC;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,6DAA6D;gBACtE,OAAO,EAAE,wBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACtC,IAAI,EAAE,2BAAmB,CAAC,KAAK,CAAC;oBAChC,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;aACJ;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAEO,gBAAgB,CAAC,MAAc;QACrC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAY,CAAC;IACzD,CAAC;IACD,uBAAuB,CAAC,QAAiB;QACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,UAAU,2BAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF;AApDD,sCAoDC"}
@@ -1,13 +1,13 @@
1
- import { Phase, Environment } from '../types';
1
+ import { Phase, EnvironmentCode } from '../types';
2
2
  export declare class TemplateManager {
3
3
  private templatesDir;
4
4
  private targetDir;
5
5
  constructor(targetDir?: string);
6
6
  copyPhaseTemplate(phase: Phase): Promise<string>;
7
- copyEnvironmentTemplates(environment: Environment): Promise<string[]>;
8
- private copyCursorTemplates;
9
- private copyClaudeTemplates;
10
7
  fileExists(phase: Phase): Promise<boolean>;
11
- environmentFilesExist(environment: Environment): Promise<boolean>;
8
+ setupMultipleEnvironments(environmentIds: EnvironmentCode[]): Promise<string[]>;
9
+ checkEnvironmentExists(envId: EnvironmentCode): Promise<boolean>;
10
+ private setupSingleEnvironment;
11
+ private copyCursorSpecificFiles;
12
12
  }
13
13
  //# sourceMappingURL=TemplateManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateManager.d.ts","sourceRoot":"","sources":["../../src/lib/TemplateManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE9C,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,GAAE,MAAsB;IAKvC,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAWhD,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAgB7D,mBAAmB;YA+BnB,mBAAmB;IAqB3B,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C,qBAAqB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;CAaxE"}
1
+ {"version":3,"file":"TemplateManager.d.ts","sourceRoot":"","sources":["../../src/lib/TemplateManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAyB,MAAM,UAAU,CAAC;AAGzE,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,GAAE,MAAsB;IAKvC,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAYhD,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C,yBAAyB,CAAC,cAAc,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsB/E,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;YAgBxD,sBAAsB;YAyCtB,uBAAuB;CActC"}
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.TemplateManager = void 0;
37
37
  const fs = __importStar(require("fs-extra"));
38
38
  const path = __importStar(require("path"));
39
+ const env_1 = require("../util/env");
39
40
  class TemplateManager {
40
41
  constructor(targetDir = process.cwd()) {
41
42
  this.templatesDir = path.join(__dirname, '../../templates');
@@ -49,74 +50,86 @@ class TemplateManager {
49
50
  await fs.copy(sourceFile, targetFile);
50
51
  return targetFile;
51
52
  }
52
- async copyEnvironmentTemplates(environment) {
53
+ async fileExists(phase) {
54
+ const targetFile = path.join(this.targetDir, 'docs', 'ai', phase, 'README.md');
55
+ return fs.pathExists(targetFile);
56
+ }
57
+ async setupMultipleEnvironments(environmentIds) {
53
58
  const copiedFiles = [];
54
- if (environment === 'cursor' || environment === 'both') {
55
- const cursorFiles = await this.copyCursorTemplates();
56
- copiedFiles.push(...cursorFiles);
59
+ for (const envId of environmentIds) {
60
+ const env = (0, env_1.getEnvironment)(envId);
61
+ if (!env) {
62
+ console.warn(`Warning: Environment '${envId}' not found, skipping`);
63
+ continue;
64
+ }
65
+ try {
66
+ const envFiles = await this.setupSingleEnvironment(env);
67
+ copiedFiles.push(...envFiles);
68
+ }
69
+ catch (error) {
70
+ console.error(`Error setting up environment '${env.name}':`, error);
71
+ throw error; // Re-throw to stop the entire process on failure
72
+ }
57
73
  }
58
- if (environment === 'claude' || environment === 'both') {
59
- const claudeFiles = await this.copyClaudeTemplates();
60
- copiedFiles.push(...claudeFiles);
74
+ return copiedFiles;
75
+ }
76
+ async checkEnvironmentExists(envId) {
77
+ const env = (0, env_1.getEnvironment)(envId);
78
+ if (!env) {
79
+ return false;
80
+ }
81
+ const contextFilePath = path.join(this.targetDir, env.contextFileName);
82
+ const contextFileExists = await fs.pathExists(contextFilePath);
83
+ const commandDirPath = path.join(this.targetDir, env.commandPath);
84
+ const commandDirExists = await fs.pathExists(commandDirPath);
85
+ return contextFileExists || commandDirExists;
86
+ }
87
+ async setupSingleEnvironment(env) {
88
+ const copiedFiles = [];
89
+ try {
90
+ const contextSource = path.join(this.templatesDir, 'env', 'AGENTS.md');
91
+ const contextTarget = path.join(this.targetDir, env.contextFileName);
92
+ if (await fs.pathExists(contextSource)) {
93
+ await fs.copy(contextSource, contextTarget);
94
+ copiedFiles.push(contextTarget);
95
+ }
96
+ else {
97
+ console.warn(`Warning: Context file not found: ${contextSource}`);
98
+ }
99
+ const commandsSourceDir = path.join(this.templatesDir, 'commands');
100
+ const commandsTargetDir = path.join(this.targetDir, env.commandPath);
101
+ if (await fs.pathExists(commandsSourceDir)) {
102
+ await fs.ensureDir(commandsTargetDir);
103
+ await fs.copy(commandsSourceDir, commandsTargetDir);
104
+ const commandFiles = await fs.readdir(commandsTargetDir);
105
+ commandFiles.forEach(file => {
106
+ copiedFiles.push(path.join(commandsTargetDir, file));
107
+ });
108
+ }
109
+ else {
110
+ console.warn(`Warning: Commands directory not found: ${commandsSourceDir}`);
111
+ }
112
+ if (env.code === 'cursor') {
113
+ await this.copyCursorSpecificFiles(copiedFiles);
114
+ }
115
+ }
116
+ catch (error) {
117
+ console.error(`Error setting up environment ${env.name}:`, error);
118
+ throw error;
61
119
  }
62
120
  return copiedFiles;
63
121
  }
64
- async copyCursorTemplates() {
65
- const files = [];
66
- const workspaceSource = path.join(this.templatesDir, 'env', 'cursor', 'AGENTS.md');
67
- const workspaceTarget = path.join(this.targetDir, 'AGENTS.md');
68
- await fs.copy(workspaceSource, workspaceTarget);
69
- files.push(workspaceTarget);
122
+ async copyCursorSpecificFiles(copiedFiles) {
70
123
  const rulesSourceDir = path.join(this.templatesDir, 'env', 'cursor', 'rules');
71
124
  const rulesTargetDir = path.join(this.targetDir, '.cursor', 'rules');
72
- await fs.ensureDir(rulesTargetDir);
73
- await fs.copy(rulesSourceDir, rulesTargetDir);
74
- const ruleFiles = await fs.readdir(rulesSourceDir);
75
- ruleFiles.forEach(file => {
76
- files.push(path.join(rulesTargetDir, file));
77
- });
78
- const commandsSourceDir = path.join(this.templatesDir, 'commands');
79
- const commandsTargetDir = path.join(this.targetDir, '.cursor', 'commands');
80
- await fs.ensureDir(commandsTargetDir);
81
- await fs.copy(commandsSourceDir, commandsTargetDir);
82
- const commandFiles = await fs.readdir(commandsSourceDir);
83
- commandFiles.forEach(file => {
84
- files.push(path.join(commandsTargetDir, file));
85
- });
86
- return files;
87
- }
88
- async copyClaudeTemplates() {
89
- const files = [];
90
- const workspaceSource = path.join(this.templatesDir, 'env', 'claude', 'CLAUDE.md');
91
- const workspaceTarget = path.join(this.targetDir, 'CLAUDE.md');
92
- await fs.copy(workspaceSource, workspaceTarget);
93
- files.push(workspaceTarget);
94
- const commandsSourceDir = path.join(this.templatesDir, 'commands');
95
- const commandsTargetDir = path.join(this.targetDir, '.claude', 'commands');
96
- await fs.ensureDir(commandsTargetDir);
97
- await fs.copy(commandsSourceDir, commandsTargetDir);
98
- const commandFiles = await fs.readdir(commandsSourceDir);
99
- commandFiles.forEach(file => {
100
- files.push(path.join(commandsTargetDir, file));
101
- });
102
- return files;
103
- }
104
- async fileExists(phase) {
105
- const targetFile = path.join(this.targetDir, 'docs', 'ai', phase, 'README.md');
106
- return fs.pathExists(targetFile);
107
- }
108
- async environmentFilesExist(environment) {
109
- if (environment === 'cursor' || environment === 'both') {
110
- const rulesExists = await fs.pathExists(path.join(this.targetDir, '.cursor', 'rules'));
111
- if (rulesExists)
112
- return true;
113
- }
114
- if (environment === 'claude' || environment === 'both') {
115
- const workspaceExists = await fs.pathExists(path.join(this.targetDir, '.claude', 'CLAUDE.md'));
116
- if (workspaceExists)
117
- return true;
125
+ if (await fs.pathExists(rulesSourceDir)) {
126
+ await fs.ensureDir(rulesTargetDir);
127
+ await fs.copy(rulesSourceDir, rulesTargetDir);
128
+ const ruleFiles = await fs.readdir(rulesSourceDir);
129
+ ruleFiles.forEach(file => {
130
+ copiedFiles.push(path.join(rulesTargetDir, file));
131
+ });
118
132
  }
119
- return false;
120
133
  }
121
134
  }
122
135
  exports.TemplateManager = TemplateManager;
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateManager.js","sourceRoot":"","sources":["../../src/lib/TemplateManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateManager.js","sourceRoot":"","sources":["../../src/lib/TemplateManager.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,8 +1,15 @@
1
1
  export type Phase = 'requirements' | 'design' | 'planning' | 'implementation' | 'testing' | 'deployment' | 'monitoring';
2
- export type Environment = 'cursor' | 'claude' | 'both';
2
+ export interface EnvironmentDefinition {
3
+ code: string;
4
+ name: string;
5
+ contextFileName: string;
6
+ commandPath: string;
7
+ description?: string;
8
+ }
9
+ export type EnvironmentCode = 'cursor' | 'claude' | 'github' | 'gemini' | 'codex' | 'windsurf' | 'kilocode' | 'amp' | 'opencode' | 'roo';
3
10
  export interface DevKitConfig {
4
11
  version: string;
5
- environment?: Environment;
12
+ environments: EnvironmentCode[];
6
13
  initializedPhases: Phase[];
7
14
  createdAt: string;
8
15
  updatedAt: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GACb,cAAc,GACd,QAAQ,GACR,UAAU,GACV,gBAAgB,GAChB,SAAS,GACT,YAAY,GACZ,YAAY,CAAC;AAEjB,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,EAAE,KAAK,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,EAQnC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAQrD,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GACb,cAAc,GACd,QAAQ,GACR,UAAU,GACV,gBAAgB,GAChB,SAAS,GACT,YAAY,GACZ,YAAY,CAAC;AAEjB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,CAAC;AAEzI,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,iBAAiB,EAAE,KAAK,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,EAQnC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAQrD,CAAC"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAyBa,QAAA,gBAAgB,GAAY;IACvC,cAAc;IACd,QAAQ;IACR,UAAU;IACV,gBAAgB;IAChB,SAAS;IACT,YAAY;IACZ,YAAY;CACb,CAAC;AAEW,QAAA,mBAAmB,GAA0B;IACxD,YAAY,EAAE,sCAAsC;IACpD,MAAM,EAAE,8BAA8B;IACtC,QAAQ,EAAE,mCAAmC;IAC7C,cAAc,EAAE,sBAAsB;IACtC,OAAO,EAAE,kBAAkB;IAC3B,UAAU,EAAE,qBAAqB;IACjC,UAAU,EAAE,4BAA4B;CACzC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAiCa,QAAA,gBAAgB,GAAY;IACvC,cAAc;IACd,QAAQ;IACR,UAAU;IACV,gBAAgB;IAChB,SAAS;IACT,YAAY;IACZ,YAAY;CACb,CAAC;AAEW,QAAA,mBAAmB,GAA0B;IACxD,YAAY,EAAE,sCAAsC;IACpD,MAAM,EAAE,8BAA8B;IACtC,QAAQ,EAAE,mCAAmC;IAC7C,cAAc,EAAE,sBAAsB;IACtC,OAAO,EAAE,kBAAkB;IAC3B,UAAU,EAAE,qBAAqB;IACjC,UAAU,EAAE,4BAA4B;CACzC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { EnvironmentDefinition, EnvironmentCode } from '../types.js';
2
+ export declare const ENVIRONMENT_DEFINITIONS: Record<EnvironmentCode, EnvironmentDefinition>;
3
+ export declare const ALL_ENVIRONMENT_CODES: EnvironmentCode[];
4
+ export declare function getAllEnvironments(): EnvironmentDefinition[];
5
+ export declare function getEnvironment(envCode: EnvironmentCode): EnvironmentDefinition | undefined;
6
+ export declare function getAllEnvironmentCodes(): EnvironmentCode[];
7
+ export declare function getEnvironmentsByCodes(codes: EnvironmentCode[]): EnvironmentDefinition[];
8
+ export declare function isValidEnvironmentCode(value: string): value is EnvironmentCode;
9
+ export declare function getEnvironmentDisplayName(envCode: EnvironmentCode): string;
10
+ export declare function validateEnvironmentCodes(envCodes: string[]): EnvironmentCode[];
11
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAErE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,eAAe,EAAE,qBAAqB,CA6DlF,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAAe,EAA8D,CAAC;AAElH,wBAAgB,kBAAkB,IAAI,qBAAqB,EAAE,CAE5D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,qBAAqB,GAAG,SAAS,CAE1F;AAED,wBAAgB,sBAAsB,IAAI,eAAe,EAAE,CAE1D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,qBAAqB,EAAE,CAExF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,eAAe,CAE9E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAG1E;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAiB9E"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ALL_ENVIRONMENT_CODES = exports.ENVIRONMENT_DEFINITIONS = void 0;
4
+ exports.getAllEnvironments = getAllEnvironments;
5
+ exports.getEnvironment = getEnvironment;
6
+ exports.getAllEnvironmentCodes = getAllEnvironmentCodes;
7
+ exports.getEnvironmentsByCodes = getEnvironmentsByCodes;
8
+ exports.isValidEnvironmentCode = isValidEnvironmentCode;
9
+ exports.getEnvironmentDisplayName = getEnvironmentDisplayName;
10
+ exports.validateEnvironmentCodes = validateEnvironmentCodes;
11
+ exports.ENVIRONMENT_DEFINITIONS = {
12
+ cursor: {
13
+ code: 'cursor',
14
+ name: 'Cursor',
15
+ contextFileName: 'AGENTS.md',
16
+ commandPath: '.cursor/commands',
17
+ },
18
+ claude: {
19
+ code: 'claude',
20
+ name: 'Claude Code',
21
+ contextFileName: 'CLAUDE.md',
22
+ commandPath: '.claude/commands',
23
+ },
24
+ github: {
25
+ code: 'github',
26
+ name: 'GitHub Copilot',
27
+ contextFileName: 'AGENTS.md',
28
+ commandPath: '.github/commands',
29
+ },
30
+ gemini: {
31
+ code: 'gemini',
32
+ name: 'Google Gemini',
33
+ contextFileName: 'AGENTS.md',
34
+ commandPath: '.gemini/commands',
35
+ },
36
+ codex: {
37
+ code: 'codex',
38
+ name: 'OpenAI Codex',
39
+ contextFileName: 'AGENTS.md',
40
+ commandPath: '.codex/commands',
41
+ },
42
+ windsurf: {
43
+ code: 'windsurf',
44
+ name: 'Windsurf',
45
+ contextFileName: 'AGENTS.md',
46
+ commandPath: '.windsurf/commands',
47
+ },
48
+ kilocode: {
49
+ code: 'kilocode',
50
+ name: 'KiloCode',
51
+ contextFileName: 'AGENTS.md',
52
+ commandPath: '.kilocode/commands',
53
+ },
54
+ amp: {
55
+ code: 'amp',
56
+ name: 'AMP',
57
+ contextFileName: 'AGENTS.md',
58
+ commandPath: '.agents/commands',
59
+ },
60
+ opencode: {
61
+ code: 'opencode',
62
+ name: 'OpenCode',
63
+ contextFileName: 'AGENTS.md',
64
+ commandPath: '.opencode/commands',
65
+ },
66
+ roo: {
67
+ code: 'roo',
68
+ name: 'Roo Code',
69
+ contextFileName: 'AGENTS.md',
70
+ commandPath: '.roo/commands',
71
+ }
72
+ };
73
+ exports.ALL_ENVIRONMENT_CODES = Object.keys(exports.ENVIRONMENT_DEFINITIONS);
74
+ function getAllEnvironments() {
75
+ return Object.values(exports.ENVIRONMENT_DEFINITIONS);
76
+ }
77
+ function getEnvironment(envCode) {
78
+ return exports.ENVIRONMENT_DEFINITIONS[envCode];
79
+ }
80
+ function getAllEnvironmentCodes() {
81
+ return [...exports.ALL_ENVIRONMENT_CODES];
82
+ }
83
+ function getEnvironmentsByCodes(codes) {
84
+ return codes.map(code => getEnvironment(code)).filter((env) => env !== undefined);
85
+ }
86
+ function isValidEnvironmentCode(value) {
87
+ return exports.ALL_ENVIRONMENT_CODES.includes(value);
88
+ }
89
+ function getEnvironmentDisplayName(envCode) {
90
+ const env = getEnvironment(envCode);
91
+ return env ? env.name : envCode;
92
+ }
93
+ function validateEnvironmentCodes(envCodes) {
94
+ const validCodes = [];
95
+ const invalidCodes = [];
96
+ for (const code of envCodes) {
97
+ if (isValidEnvironmentCode(code)) {
98
+ validCodes.push(code);
99
+ }
100
+ else {
101
+ invalidCodes.push(code);
102
+ }
103
+ }
104
+ if (invalidCodes.length > 0) {
105
+ throw new Error(`Invalid environment codes: ${invalidCodes.join(', ')}`);
106
+ }
107
+ return validCodes;
108
+ }
109
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":"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"}
package/jest.config.js ADDED
@@ -0,0 +1,22 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ roots: ['<rootDir>/src'],
5
+ testMatch: ['**/__tests__/**/*.test.ts', '**/?(*.)+(spec|test).ts'],
6
+ collectCoverageFrom: [
7
+ 'src/**/*.{ts,js}',
8
+ '!src/**/*.d.ts',
9
+ '!src/cli.ts',
10
+ '!src/index.ts'
11
+ ],
12
+ coverageDirectory: 'coverage',
13
+ coverageReporters: ['text', 'lcov', 'html'],
14
+ coverageThreshold: {
15
+ global: {
16
+ branches: 80,
17
+ functions: 80,
18
+ lines: 80,
19
+ statements: 80
20
+ }
21
+ }
22
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-devkit",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "A CLI toolkit for AI-assisted software development with phase templates and environment setup",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -10,6 +10,9 @@
10
10
  "build": "tsc",
11
11
  "dev": "ts-node src/cli.ts",
12
12
  "lint": "eslint src --ext .ts",
13
+ "test": "jest",
14
+ "test:watch": "jest --watch",
15
+ "test:coverage": "jest --coverage",
13
16
  "prepublishOnly": "npm run build"
14
17
  },
15
18
  "keywords": [
@@ -23,21 +26,24 @@
23
26
  "author": "",
24
27
  "license": "MIT",
25
28
  "dependencies": {
29
+ "chalk": "^4.1.2",
26
30
  "commander": "^11.1.0",
27
- "inquirer": "^8.2.6",
28
31
  "fs-extra": "^11.2.0",
29
- "yaml": "^2.3.4",
30
- "chalk": "^4.1.2"
32
+ "inquirer": "^8.2.6",
33
+ "yaml": "^2.3.4"
31
34
  },
32
35
  "devDependencies": {
33
- "@types/node": "^20.11.5",
34
- "@types/inquirer": "^8.2.10",
35
36
  "@types/fs-extra": "^11.0.4",
36
- "ts-node": "^10.9.2",
37
- "typescript": "^5.3.3",
38
- "eslint": "^8.56.0",
37
+ "@types/inquirer": "^8.2.10",
38
+ "@types/jest": "^30.0.0",
39
+ "@types/node": "^20.11.5",
39
40
  "@typescript-eslint/eslint-plugin": "^6.19.1",
40
- "@typescript-eslint/parser": "^6.19.1"
41
+ "@typescript-eslint/parser": "^6.19.1",
42
+ "eslint": "^8.56.0",
43
+ "jest": "^29.7.0",
44
+ "ts-jest": "^29.4.5",
45
+ "ts-node": "^10.9.2",
46
+ "typescript": "^5.3.3"
41
47
  },
42
48
  "engines": {
43
49
  "node": ">=16.0.0"
package/web/.nojekyll ADDED
@@ -0,0 +1,2 @@
1
+ # This file tells GitHub Pages not to process the site with Jekyll
2
+
package/web/CNAME ADDED
@@ -0,0 +1 @@
1
+ ai-devkit.com