@phantomind/core 0.1.0 โ†’ 0.1.2

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 (54) hide show
  1. package/README.md +534 -0
  2. package/dist/cli/compare.d.ts +6 -0
  3. package/dist/cli/compare.d.ts.map +1 -0
  4. package/dist/cli/compare.js +34 -0
  5. package/dist/cli/compare.js.map +1 -0
  6. package/dist/cli/context.d.ts +8 -0
  7. package/dist/cli/context.d.ts.map +1 -0
  8. package/dist/cli/context.js +37 -0
  9. package/dist/cli/context.js.map +1 -0
  10. package/dist/cli/diff.d.ts +6 -0
  11. package/dist/cli/diff.d.ts.map +1 -0
  12. package/dist/cli/diff.js +46 -0
  13. package/dist/cli/diff.js.map +1 -0
  14. package/dist/cli/hooks.d.ts +5 -0
  15. package/dist/cli/hooks.d.ts.map +1 -0
  16. package/dist/cli/hooks.js +35 -0
  17. package/dist/cli/hooks.js.map +1 -0
  18. package/dist/cli/index.d.ts +5 -0
  19. package/dist/cli/index.d.ts.map +1 -1
  20. package/dist/cli/index.js +5 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/init.d.ts +2 -2
  23. package/dist/cli/init.d.ts.map +1 -1
  24. package/dist/cli/init.js +163 -84
  25. package/dist/cli/init.js.map +1 -1
  26. package/dist/cli/learn.d.ts +11 -0
  27. package/dist/cli/learn.d.ts.map +1 -0
  28. package/dist/cli/learn.js +50 -0
  29. package/dist/cli/learn.js.map +1 -0
  30. package/dist/cli/main.js +56 -0
  31. package/dist/cli/main.js.map +1 -1
  32. package/dist/cli/watch.d.ts +5 -0
  33. package/dist/cli/watch.d.ts.map +1 -0
  34. package/dist/cli/watch.js +60 -0
  35. package/dist/cli/watch.js.map +1 -0
  36. package/dist/config/loader.d.ts.map +1 -1
  37. package/dist/config/loader.js +8 -2
  38. package/dist/config/loader.js.map +1 -1
  39. package/dist/context/learner.d.ts +31 -6
  40. package/dist/context/learner.d.ts.map +1 -1
  41. package/dist/context/learner.js +328 -29
  42. package/dist/context/learner.js.map +1 -1
  43. package/dist/context/project-template.d.ts +21 -0
  44. package/dist/context/project-template.d.ts.map +1 -0
  45. package/dist/context/project-template.js +81 -0
  46. package/dist/context/project-template.js.map +1 -0
  47. package/dist/context/rules-generator.d.ts +7 -0
  48. package/dist/context/rules-generator.d.ts.map +1 -0
  49. package/dist/context/rules-generator.js +158 -0
  50. package/dist/context/rules-generator.js.map +1 -0
  51. package/dist/templates/engine.d.ts.map +1 -1
  52. package/dist/templates/engine.js +159 -10
  53. package/dist/templates/engine.js.map +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,46 @@
1
+ import { loadConfig } from '../config/loader.js';
2
+ import { syncAllAdapters } from '../adapters/index.js';
3
+ export async function diffCommand(projectRoot, options) {
4
+ const chalk = (await import('chalk')).default;
5
+ const ora = (await import('ora')).default;
6
+ console.log(chalk.bold.cyan('\n๐Ÿงพ PhantomMindAI โ€” Adapter Diff\n'));
7
+ const spinner = ora('Calculating adapter diffs...').start();
8
+ try {
9
+ let config = await loadConfig(projectRoot);
10
+ if (options.adapters?.length) {
11
+ config = { ...config, adapters: options.adapters };
12
+ }
13
+ const results = await syncAllAdapters(projectRoot, config, true);
14
+ spinner.stop();
15
+ const changed = results.filter(result => result.changed);
16
+ if (changed.length === 0) {
17
+ console.log(chalk.green('No adapter changes detected.'));
18
+ console.log('');
19
+ return;
20
+ }
21
+ for (const result of changed) {
22
+ console.log(`${chalk.yellow('โ€ข')} ${chalk.bold(result.adapter)} โ†’ ${result.outputPath}`);
23
+ if (result.diff) {
24
+ const lines = result.diff.split('\n');
25
+ const preview = options.verbose ? lines : lines.slice(0, 20);
26
+ for (const line of preview) {
27
+ const colored = line.startsWith('+')
28
+ ? chalk.green(line)
29
+ : line.startsWith('-')
30
+ ? chalk.red(line)
31
+ : chalk.dim(line);
32
+ console.log(` ${colored}`);
33
+ }
34
+ if (!options.verbose && lines.length > preview.length) {
35
+ console.log(chalk.dim(` ... ${lines.length - preview.length} more changed lines`));
36
+ }
37
+ }
38
+ console.log('');
39
+ }
40
+ }
41
+ catch (error) {
42
+ spinner.fail('Diff failed');
43
+ throw error;
44
+ }
45
+ }
46
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/cli/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface HooksOptions {
2
+ force?: boolean;
3
+ }
4
+ export declare function hooksCommand(projectRoot: string, options: HooksOptions): Promise<void>;
5
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/cli/hooks.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAcD,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB5F"}
@@ -0,0 +1,35 @@
1
+ import { mkdir, writeFile, chmod } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ const HOOK_FILES = ['post-merge', 'post-checkout'];
5
+ function getHookScript() {
6
+ return [
7
+ '#!/bin/sh',
8
+ 'if command -v phantomind >/dev/null 2>&1; then',
9
+ ' phantomind learn --sync >/dev/null 2>&1 || true',
10
+ 'fi',
11
+ '',
12
+ ].join('\n');
13
+ }
14
+ export async function hooksCommand(projectRoot, options) {
15
+ const chalk = (await import('chalk')).default;
16
+ const hooksDir = join(projectRoot, '.git', 'hooks');
17
+ if (!existsSync(join(projectRoot, '.git'))) {
18
+ throw new Error('Git repository not found. Initialize git before installing hooks.');
19
+ }
20
+ await mkdir(hooksDir, { recursive: true });
21
+ const script = getHookScript();
22
+ console.log(chalk.bold.cyan('\n๐Ÿช PhantomMindAI โ€” Git Hooks\n'));
23
+ for (const hookName of HOOK_FILES) {
24
+ const hookPath = join(hooksDir, hookName);
25
+ if (existsSync(hookPath) && !options.force) {
26
+ console.log(chalk.yellow(`Skipped ${hookName} (already exists). Use --force to overwrite.`));
27
+ continue;
28
+ }
29
+ await writeFile(hookPath, script, 'utf-8');
30
+ await chmod(hookPath, 0o755);
31
+ console.log(chalk.green(`Installed ${hookName}`));
32
+ }
33
+ console.log('');
34
+ }
35
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/cli/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAMjC,MAAM,UAAU,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAEnD,SAAS,aAAa;IACpB,OAAO;QACL,WAAW;QACX,gDAAgD;QAChD,mDAAmD;QACnD,IAAI;QACJ,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,OAAqB;IAC3E,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAEjE,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,QAAQ,8CAA8C,CAAC,CAAC,CAAC;YAC7F,SAAS;QACX,CAAC;QACD,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -1,4 +1,9 @@
1
1
  export { initCommand, type InitOptions } from './init.js';
2
+ export { diffCommand, type DiffOptions } from './diff.js';
3
+ export { contextCommand, type ContextCommandOptions } from './context.js';
4
+ export { compareCommand, type CompareOptions } from './compare.js';
5
+ export { watchCommand, type WatchOptions } from './watch.js';
6
+ export { hooksCommand, type HooksOptions } from './hooks.js';
2
7
  export { syncCommand, type SyncOptions } from './sync.js';
3
8
  export { serveCommand, type ServeOptions } from './serve.js';
4
9
  export { evalCommand, type EvalOptions } from './eval.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC"}
package/dist/cli/index.js CHANGED
@@ -1,4 +1,9 @@
1
1
  export { initCommand } from './init.js';
2
+ export { diffCommand } from './diff.js';
3
+ export { contextCommand } from './context.js';
4
+ export { compareCommand } from './compare.js';
5
+ export { watchCommand } from './watch.js';
6
+ export { hooksCommand } from './hooks.js';
2
7
  export { syncCommand } from './sync.js';
3
8
  export { serveCommand } from './serve.js';
4
9
  export { evalCommand } from './eval.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAoB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAoB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAwB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAoB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,cAAc,EAA8B,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAuB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAoB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAoB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAwB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC"}
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * PhantomMindAI โ€” CLI Init Command
3
- * Interactive project initialization.
3
+ * Interactive project initialization with adapter selection and optional provider setup.
4
4
  */
5
5
  export interface InitOptions {
6
6
  adapters?: string[];
7
7
  provider?: string;
8
8
  model?: string;
9
+ template?: string;
9
10
  yes?: boolean;
10
- interactive?: boolean;
11
11
  }
12
12
  export declare function initCommand(projectRoot: string, options: InitOptions): Promise<void>;
13
13
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAsJf"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmCH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAuLf"}
package/dist/cli/init.js CHANGED
@@ -1,15 +1,106 @@
1
1
  /**
2
2
  * PhantomMindAI โ€” CLI Init Command
3
- * Interactive project initialization.
3
+ * Interactive project initialization with adapter selection and optional provider setup.
4
4
  */
5
5
  import { writeFile, mkdir } from 'node:fs/promises';
6
- import { existsSync } from 'node:fs';
6
+ import { existsSync, readFileSync } from 'node:fs';
7
7
  import { join } from 'node:path';
8
+ import yaml from 'js-yaml';
8
9
  import { getDefaultConfig } from '../config/loader.js';
10
+ import { ContextLearner } from '../context/learner.js';
11
+ import { writeRulesContent } from '../context/rules-generator.js';
12
+ import { PROJECT_TEMPLATES, detectProjectTemplate } from '../context/project-template.js';
13
+ const ADAPTER_CHOICES = [
14
+ { value: 'copilot', name: 'GitHub Copilot', description: '.github/copilot-instructions.md' },
15
+ { value: 'cursor', name: 'Cursor', description: '.cursorrules' },
16
+ { value: 'cline', name: 'Cline', description: '.clinerules' },
17
+ { value: 'continue', name: 'Continue', description: '.continue/config.json' },
18
+ { value: 'windsurf', name: 'Windsurf', description: '.windsurfrules' },
19
+ { value: 'zed', name: 'Zed', description: '.zed/settings.json' },
20
+ { value: 'aider', name: 'Aider', description: '.aider.conf.yml' },
21
+ { value: 'claude-code', name: 'Claude Code CLI', description: '.claude/CLAUDE.md' },
22
+ { value: 'codex', name: 'OpenAI Codex CLI', description: 'AGENTS.md' },
23
+ ];
24
+ const PROVIDER_CHOICES = [
25
+ { value: 'anthropic', name: 'Anthropic (Claude)' },
26
+ { value: 'openai', name: 'OpenAI (GPT)' },
27
+ { value: 'gemini', name: 'Google Gemini' },
28
+ { value: 'groq', name: 'Groq' },
29
+ { value: 'mistral', name: 'Mistral' },
30
+ { value: 'ollama', name: 'Ollama (local)' },
31
+ { value: 'deepseek', name: 'DeepSeek' },
32
+ { value: 'openrouter', name: 'OpenRouter' },
33
+ ];
9
34
  export async function initCommand(projectRoot, options) {
10
35
  const chalk = (await import('chalk')).default;
11
36
  const ora = (await import('ora')).default;
12
37
  console.log(chalk.bold.cyan('\n๐Ÿ”ฎ PhantomMindAI โ€” Project Initialization\n'));
38
+ // Interactive wizard unless --yes or all flags provided
39
+ const skipWizard = options.yes || !!options.adapters;
40
+ let selectedAdapters = options.adapters ?? [];
41
+ let selectedProvider = options.provider ?? 'anthropic';
42
+ let selectedTemplate = options.template ?? 'auto';
43
+ let providerConfigured = Boolean(options.provider);
44
+ if (!skipWizard) {
45
+ const inquirer = (await import('inquirer')).default;
46
+ // Step 1: Select AI tools
47
+ if (!options.adapters) {
48
+ const detected = detectAdapters(projectRoot);
49
+ const { adapters } = await inquirer.prompt([{
50
+ type: 'checkbox',
51
+ name: 'adapters',
52
+ message: 'Which AI tools do you use? (space to select, enter to confirm)',
53
+ choices: ADAPTER_CHOICES.map(a => ({
54
+ value: a.value,
55
+ name: `${a.name} ${chalk.dim(a.description)}`,
56
+ checked: detected.includes(a.value),
57
+ })),
58
+ validate: (input) => input.length > 0 || 'Select at least one AI tool',
59
+ }]);
60
+ selectedAdapters = adapters;
61
+ }
62
+ // Step 2: Select template strategy
63
+ if (!options.template) {
64
+ const { template } = await inquirer.prompt([{
65
+ type: 'list',
66
+ name: 'template',
67
+ message: `Project template ${chalk.dim('(used for RULES.md defaults)')}:`,
68
+ choices: [
69
+ { value: 'auto', name: `Auto detect ${chalk.dim('(recommended)')}` },
70
+ ...Object.values(PROJECT_TEMPLATES).map(templateOption => ({
71
+ value: templateOption.name,
72
+ name: templateOption.displayName,
73
+ })),
74
+ ],
75
+ default: 'auto',
76
+ }]);
77
+ selectedTemplate = template;
78
+ }
79
+ // Step 3: Optionally configure LLM provider (only needed for agent/eval)
80
+ if (!options.provider) {
81
+ const { wantProvider } = await inquirer.prompt([{
82
+ type: 'confirm',
83
+ name: 'wantProvider',
84
+ message: `Configure LLM provider? ${chalk.dim('(only needed for agent/eval commands, not for sync)')}`,
85
+ default: false,
86
+ }]);
87
+ if (wantProvider) {
88
+ const { provider } = await inquirer.prompt([{
89
+ type: 'list',
90
+ name: 'provider',
91
+ message: 'Primary LLM provider:',
92
+ choices: PROVIDER_CHOICES,
93
+ default: 'anthropic',
94
+ }]);
95
+ selectedProvider = provider;
96
+ providerConfigured = true;
97
+ }
98
+ }
99
+ console.log('');
100
+ }
101
+ if (selectedAdapters.length === 0) {
102
+ selectedAdapters = getDefaultConfig().adapters;
103
+ }
13
104
  const spinner = ora('Setting up PhantomMindAI...').start();
14
105
  try {
15
106
  // Create .phantomind directory
@@ -27,93 +118,49 @@ export async function initCommand(projectRoot, options) {
27
118
  }
28
119
  }
29
120
  spinner.text = 'Generating configuration...';
30
- // Build config
121
+ // Build config with user selections
31
122
  const config = {
32
123
  ...getDefaultConfig(),
33
- };
34
- if (options.provider) {
35
- config.providers = {
36
- ...config.providers,
37
- primary: {
38
- ...config.providers.primary,
39
- name: options.provider,
40
- },
41
- };
42
- }
43
- if (options.model) {
44
- config.providers = {
45
- ...config.providers,
124
+ adapters: selectedAdapters,
125
+ providers: {
126
+ ...getDefaultConfig().providers,
46
127
  primary: {
47
- ...config.providers.primary,
48
- model: options.model,
128
+ ...getDefaultConfig().providers.primary,
129
+ name: selectedProvider,
130
+ ...(options.model ? { model: options.model } : {}),
49
131
  },
50
- };
51
- }
52
- if (options.adapters) {
53
- config.adapters = options.adapters;
54
- }
132
+ },
133
+ };
55
134
  // Write config file
56
- const configPath = join(projectRoot, 'phantomind.config.json');
135
+ const configPath = join(phantomDir, 'config.yaml');
57
136
  if (!existsSync(configPath)) {
58
- await writeFile(configPath, JSON.stringify(config, null, 2));
59
- spinner.succeed('Created phantomind.config.json');
137
+ await writeFile(configPath, yaml.dump(config, { noRefs: true, lineWidth: 120 }), 'utf-8');
138
+ spinner.succeed('Created .phantomind/config.yaml');
60
139
  }
61
140
  else {
62
- spinner.info('phantomind.config.json already exists, skipping');
63
- }
64
- // Create SKILLS.md
65
- const skillsPath = join(phantomDir, 'SKILLS.md');
66
- if (!existsSync(skillsPath)) {
67
- const skillsContent = [
68
- `# ${detectProjectName(projectRoot)} โ€” AI Skills & Context`,
69
- '',
70
- '> Auto-generated by PhantomMindAI. Customize to improve AI assistance.',
71
- '',
72
- '## Project Overview',
73
- `- **Root**: ${projectRoot}`,
74
- `- **Initialized**: ${new Date().toISOString()}`,
75
- '',
76
- '## Tech Stack',
77
- '<!-- Add your tech stack here -->',
78
- '',
79
- '## Coding Conventions',
80
- '<!-- Add your conventions here -->',
81
- '',
82
- '## Key Files',
83
- '<!-- Add important files here -->',
84
- '',
85
- ].join('\n');
86
- await writeFile(skillsPath, skillsContent);
141
+ spinner.info('.phantomind/config.yaml already exists, skipping');
87
142
  }
143
+ // Auto-learn project context and write SKILLS.md
144
+ spinner.text = 'Learning project context...';
145
+ const learner = new ContextLearner(projectRoot);
146
+ await learner.learn();
147
+ await learner.writeSkills(detectProjectName(projectRoot));
88
148
  // Create RULES.md
89
- const rulesPath = join(phantomDir, 'RULES.md');
90
- if (!existsSync(rulesPath)) {
91
- const rulesContent = [
92
- `# ${detectProjectName(projectRoot)} โ€” AI Rules`,
93
- '',
94
- '> Auto-generated by PhantomMindAI. Customize to set boundaries.',
95
- '',
96
- '## General Rules',
97
- '1. Follow the existing code style',
98
- '2. Never hardcode secrets or credentials',
99
- '3. Always handle errors appropriately',
100
- '4. Write self-documenting code',
101
- '5. Keep functions focused and small',
102
- '',
103
- '## Forbidden Patterns',
104
- '- Do not use `any` type in TypeScript',
105
- '- Do not use `console.log` for production logging',
106
- '- Do not commit commented-out code',
107
- '',
108
- ].join('\n');
109
- await writeFile(rulesPath, rulesContent);
110
- }
149
+ spinner.text = 'Generating project rules...';
150
+ const resolvedTemplate = selectedTemplate === 'auto'
151
+ ? detectProjectTemplate({
152
+ frameworks: learner.getTechStack().frameworks,
153
+ entryPoints: learner.getTechStack().entryPoints,
154
+ projectType: learner.getTechStack().projectType,
155
+ })
156
+ : selectedTemplate;
157
+ await writeRulesContent(projectRoot, { template: resolvedTemplate });
111
158
  // Create .env.example
112
- const envExamplePath = join(projectRoot, '.env.phantomind.example');
113
- if (!existsSync(envExamplePath)) {
159
+ const envExamplePath = join(phantomDir, '.env.example');
160
+ if (providerConfigured && !existsSync(envExamplePath)) {
114
161
  const envContent = [
115
162
  '# PhantomMindAI Environment Variables',
116
- '# Copy to .env.phantomind and fill in your values',
163
+ '# Copy to .phantomind/.env and fill in your values',
117
164
  '',
118
165
  '# Provider API Keys (set the ones you need)',
119
166
  'ANTHROPIC_API_KEY=',
@@ -130,14 +177,19 @@ export async function initCommand(projectRoot, options) {
130
177
  ].join('\n');
131
178
  await writeFile(envExamplePath, envContent);
132
179
  }
180
+ const chalk2 = chalk;
181
+ console.log('');
182
+ console.log(chalk2.green('โœ… PhantomMindAI initialized successfully!'));
133
183
  console.log('');
134
- console.log(chalk.green('โœ… PhantomMindAI initialized successfully!'));
184
+ console.log(chalk2.dim(' Adapters: ') + selectedAdapters.map(a => chalk2.white(a)).join(', '));
185
+ console.log(chalk2.dim(' Provider: ') + chalk2.white(providerConfigured ? selectedProvider : 'not configured'));
186
+ console.log(chalk2.dim(' Template: ') + chalk2.white(resolvedTemplate));
135
187
  console.log('');
136
- console.log(chalk.dim('Next steps:'));
137
- console.log(chalk.dim(` 1. Copy ${chalk.white('.env.phantomind.example')} to ${chalk.white('.env.phantomind')} and add your API keys`));
138
- console.log(chalk.dim(` 2. Customize ${chalk.white('.phantomind/SKILLS.md')} with your project context`));
139
- console.log(chalk.dim(` 3. Run ${chalk.white('phantomind sync')} to generate adapter configs`));
140
- console.log(chalk.dim(` 4. Run ${chalk.white('phantomind serve')} to start the MCP server`));
188
+ console.log(chalk2.dim('Next steps:'));
189
+ console.log(chalk2.dim(` 1. Review ${chalk2.white('.phantomind/SKILLS.md')} โ€” auto-detected project context`));
190
+ console.log(chalk2.dim(` 2. Run ${chalk2.white('phantomind sync')} to generate adapter configs`));
191
+ console.log(chalk2.dim(` 3. Run ${chalk2.white('phantomind learn --sync')} anytime to re-scan & sync`));
192
+ console.log(chalk2.dim(` 4. ${chalk2.dim('(Optional)')} Configure provider + ${chalk2.white('.phantomind/.env')} only if you use ${chalk2.white('agent')} or ${chalk2.white('eval')}`));
141
193
  console.log('');
142
194
  }
143
195
  catch (error) {
@@ -145,10 +197,37 @@ export async function initCommand(projectRoot, options) {
145
197
  throw error;
146
198
  }
147
199
  }
200
+ /**
201
+ * Auto-detect which AI tools the user likely uses based on existing config files.
202
+ */
203
+ function detectAdapters(projectRoot) {
204
+ const detected = [];
205
+ const checks = [
206
+ ['.github/copilot-instructions.md', 'copilot'],
207
+ ['.cursorrules', 'cursor'],
208
+ ['.clinerules', 'cline'],
209
+ ['.continue', 'continue'],
210
+ ['.windsurfrules', 'windsurf'],
211
+ ['.zed/settings.json', 'zed'],
212
+ ['.aider.conf.yml', 'aider'],
213
+ ['.claude/CLAUDE.md', 'claude-code'],
214
+ ['AGENTS.md', 'codex'],
215
+ ];
216
+ for (const [path, adapter] of checks) {
217
+ if (existsSync(join(projectRoot, path))) {
218
+ detected.push(adapter);
219
+ }
220
+ }
221
+ return detected;
222
+ }
148
223
  function detectProjectName(root) {
149
224
  try {
150
- const pkg = require(join(root, 'package.json'));
151
- return pkg.name ?? root.split('/').pop() ?? 'project';
225
+ const pkgPath = join(root, 'package.json');
226
+ if (existsSync(pkgPath)) {
227
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
228
+ return pkg.name ?? root.split('/').pop() ?? 'project';
229
+ }
230
+ return root.split('/').pop() ?? 'project';
152
231
  }
153
232
  catch {
154
233
  return root.split('/').pop() ?? 'project';
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * PhantomMindAI โ€” CLI Learn Command
3
+ * Scans codebase, detects tech stack & patterns, writes SKILLS.md,
4
+ * and optionally runs sync to update adapter files.
5
+ */
6
+ export interface LearnOptions {
7
+ sync?: boolean;
8
+ verbose?: boolean;
9
+ }
10
+ export declare function learnCommand(projectRoot: string, options: LearnOptions): Promise<void>;
11
+ //# sourceMappingURL=learn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/cli/learn.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAmDf"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * PhantomMindAI โ€” CLI Learn Command
3
+ * Scans codebase, detects tech stack & patterns, writes SKILLS.md,
4
+ * and optionally runs sync to update adapter files.
5
+ */
6
+ import { ContextLearner } from '../context/learner.js';
7
+ export async function learnCommand(projectRoot, options) {
8
+ const chalk = (await import('chalk')).default;
9
+ const ora = (await import('ora')).default;
10
+ console.log(chalk.bold.cyan('\n๐Ÿง  PhantomMindAI โ€” Learn Project Context\n'));
11
+ const spinner = ora('Scanning codebase...').start();
12
+ try {
13
+ const learner = new ContextLearner(projectRoot);
14
+ spinner.text = 'Detecting tech stack...';
15
+ const patterns = await learner.learn();
16
+ spinner.text = 'Writing SKILLS.md...';
17
+ const content = await learner.writeSkills();
18
+ spinner.succeed('Project context learned!');
19
+ // Show summary
20
+ const lines = content.split('\n');
21
+ const techLines = lines.filter(l => l.startsWith('- **'));
22
+ const patternCount = patterns.length;
23
+ console.log('');
24
+ console.log(chalk.bold(' Detected:'));
25
+ for (const line of techLines.slice(0, 8)) {
26
+ console.log(` ${chalk.green('โœ“')} ${line.replace('- **', '').replace('**:', ':').replace('**', '')}`);
27
+ }
28
+ if (patternCount > 0) {
29
+ console.log(` ${chalk.green('โœ“')} ${patternCount} code patterns detected`);
30
+ }
31
+ console.log('');
32
+ console.log(chalk.dim(` Written to: .phantomind/SKILLS.md (${lines.length} lines)`));
33
+ // Auto-sync if requested
34
+ if (options.sync) {
35
+ console.log('');
36
+ const { syncCommand } = await import('./sync.js');
37
+ await syncCommand(projectRoot, { verbose: options.verbose });
38
+ }
39
+ else {
40
+ console.log('');
41
+ console.log(chalk.dim(` Run ${chalk.white('phantomind sync')} to push this context to your AI tools.`));
42
+ }
43
+ console.log('');
44
+ }
45
+ catch (error) {
46
+ spinner.fail('Learning failed');
47
+ throw error;
48
+ }
49
+ }
50
+ //# sourceMappingURL=learn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.js","sourceRoot":"","sources":["../../src/cli/learn.ts"],"names":[],"mappings":"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"}