@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.
- package/README.md +534 -0
- package/dist/cli/compare.d.ts +6 -0
- package/dist/cli/compare.d.ts.map +1 -0
- package/dist/cli/compare.js +34 -0
- package/dist/cli/compare.js.map +1 -0
- package/dist/cli/context.d.ts +8 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +37 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/diff.d.ts +6 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +46 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/hooks.d.ts +5 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +35 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +163 -84
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/learn.d.ts +11 -0
- package/dist/cli/learn.d.ts.map +1 -0
- package/dist/cli/learn.js +50 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/main.js +56 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/watch.d.ts +5 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +60 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +8 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/context/learner.d.ts +31 -6
- package/dist/context/learner.d.ts.map +1 -1
- package/dist/context/learner.js +328 -29
- package/dist/context/learner.js.map +1 -1
- package/dist/context/project-template.d.ts +21 -0
- package/dist/context/project-template.d.ts.map +1 -0
- package/dist/context/project-template.js +81 -0
- package/dist/context/project-template.js.map +1 -0
- package/dist/context/rules-generator.d.ts +7 -0
- package/dist/context/rules-generator.d.ts.map +1 -0
- package/dist/context/rules-generator.js +158 -0
- package/dist/context/rules-generator.js.map +1 -0
- package/dist/templates/engine.d.ts.map +1 -1
- package/dist/templates/engine.js +159 -10
- package/dist/templates/engine.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/diff.js
ADDED
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAOvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,OAAoB;IACzE,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9C,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAEpE,MAAM,OAAO,GAAG,GAAG,CAAC,8BAA8B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,IAAI,CAAC;QACH,IAAI,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC7B,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAkC,EAAE,CAAC;QAC/E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACzF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7D,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;wBAClC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;wBACnB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;4BACpB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;4BACjB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;gBAC9B,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;oBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -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';
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -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';
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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"}
|
package/dist/cli/init.d.ts
CHANGED
|
@@ -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
|
package/dist/cli/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
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
|
-
|
|
35
|
-
|
|
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
|
-
...
|
|
48
|
-
|
|
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(
|
|
135
|
+
const configPath = join(phantomDir, 'config.yaml');
|
|
57
136
|
if (!existsSync(configPath)) {
|
|
58
|
-
await writeFile(configPath,
|
|
59
|
-
spinner.succeed('Created phantomind
|
|
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
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
137
|
-
console.log(
|
|
138
|
-
console.log(
|
|
139
|
-
console.log(
|
|
140
|
-
console.log(
|
|
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
|
|
151
|
-
|
|
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';
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
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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"}
|