@dot-ai/core 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +6 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -5
- package/dist/config.js.map +1 -1
- package/dist/extension-loader.d.ts +8 -1
- package/dist/extension-loader.d.ts.map +1 -1
- package/dist/extension-loader.js +159 -48
- package/dist/extension-loader.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/package-manager.d.ts +28 -5
- package/dist/package-manager.d.ts.map +1 -1
- package/dist/package-manager.js +126 -20
- package/dist/package-manager.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +19 -1
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/config.test.ts +107 -1
- package/src/__tests__/extension-loader.test.ts +154 -11
- package/src/__tests__/package-manager.test.ts +237 -0
- package/src/config.ts +43 -4
- package/src/extension-loader.ts +168 -47
- package/src/index.ts +2 -2
- package/src/package-manager.ts +146 -23
- package/src/runtime.ts +23 -1
- package/tsconfig.tsbuildinfo +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { DotAiConfig } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Load config from workspace root.
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
|
+
* Loads from two sources and merges them:
|
|
6
|
+
* 1. Global: ~/.ai/settings.json (user-level defaults)
|
|
7
|
+
* 2. Project: {workspaceRoot}/.ai/settings.json (project-level overrides)
|
|
8
|
+
*
|
|
9
|
+
* Arrays (packages, extensions) are merged. Scalar values from project win.
|
|
5
10
|
*/
|
|
6
11
|
export declare function loadConfig(workspaceRoot: string): Promise<DotAiConfig>;
|
|
7
12
|
/**
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AA8FhE;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAI5E;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBjF"}
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
3
4
|
/**
|
|
4
5
|
* Load settings.json (Pi-compatible format).
|
|
5
6
|
*
|
|
@@ -55,15 +56,52 @@ function settingsJsonToConfig(json) {
|
|
|
55
56
|
}
|
|
56
57
|
return config;
|
|
57
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Merge two configs: global (base) + project (override).
|
|
61
|
+
* Arrays (paths, packages) are concatenated and deduplicated.
|
|
62
|
+
* Scalar values from project take precedence.
|
|
63
|
+
*/
|
|
64
|
+
function mergeConfigs(global, project) {
|
|
65
|
+
const merged = { ...global, ...project };
|
|
66
|
+
// Merge extensions arrays (global + project, deduplicated)
|
|
67
|
+
if (global.extensions || project.extensions) {
|
|
68
|
+
const globalExt = global.extensions ?? {};
|
|
69
|
+
const projectExt = project.extensions ?? {};
|
|
70
|
+
merged.extensions = {
|
|
71
|
+
paths: dedup([...(globalExt.paths ?? []), ...(projectExt.paths ?? [])]),
|
|
72
|
+
packages: dedup([...(globalExt.packages ?? []), ...(projectExt.packages ?? [])]),
|
|
73
|
+
};
|
|
74
|
+
// Clean up empty arrays
|
|
75
|
+
if (merged.extensions.paths.length === 0)
|
|
76
|
+
delete merged.extensions.paths;
|
|
77
|
+
if (merged.extensions.packages.length === 0)
|
|
78
|
+
delete merged.extensions.packages;
|
|
79
|
+
if (!merged.extensions.paths && !merged.extensions.packages)
|
|
80
|
+
delete merged.extensions;
|
|
81
|
+
}
|
|
82
|
+
// Project debug/workspace override global
|
|
83
|
+
if (project.debug)
|
|
84
|
+
merged.debug = project.debug;
|
|
85
|
+
if (project.workspace)
|
|
86
|
+
merged.workspace = project.workspace;
|
|
87
|
+
return merged;
|
|
88
|
+
}
|
|
89
|
+
function dedup(arr) {
|
|
90
|
+
return [...new Set(arr)];
|
|
91
|
+
}
|
|
58
92
|
/**
|
|
59
93
|
* Load config from workspace root.
|
|
60
|
-
*
|
|
94
|
+
*
|
|
95
|
+
* Loads from two sources and merges them:
|
|
96
|
+
* 1. Global: ~/.ai/settings.json (user-level defaults)
|
|
97
|
+
* 2. Project: {workspaceRoot}/.ai/settings.json (project-level overrides)
|
|
98
|
+
*
|
|
99
|
+
* Arrays (packages, extensions) are merged. Scalar values from project win.
|
|
61
100
|
*/
|
|
62
101
|
export async function loadConfig(workspaceRoot) {
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return {};
|
|
102
|
+
const globalConfig = await loadSettingsJson(homedir()) ?? {};
|
|
103
|
+
const projectConfig = await loadSettingsJson(workspaceRoot) ?? {};
|
|
104
|
+
return mergeConfigs(globalConfig, projectConfig);
|
|
67
105
|
}
|
|
68
106
|
/**
|
|
69
107
|
* Migrate dot-ai.yml to settings.json.
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC;;;;;;;;;;GAUG;AACH,KAAK,UAAU,gBAAgB,CAAC,aAAqB;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAA6B;IACzD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,sCAAsC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAElC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;QACvB,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAA4B,CAAC;QACvD,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAClB,IAAI,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACpF,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC/D,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAA4B,CAAC;QACxD,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;QACtB,IAAI,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,QAAQ;YAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,MAAmB,EAAE,OAAoB;IAC7D,MAAM,MAAM,GAAgB,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;IAEtD,2DAA2D;IAC3D,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,UAAU,GAAG;YAClB,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YACvE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;SACjF,CAAC;QACF,wBAAwB;QACxB,IAAI,MAAM,CAAC,UAAU,CAAC,KAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;QAC1E,IAAI,MAAM,CAAC,UAAU,CAAC,QAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC,UAAU,CAAC;IACxF,CAAC;IAED,0CAA0C;IAC1C,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAE5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,KAAK,CAAC,GAAa;IAC1B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAAqB;IACpD,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7D,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClE,OAAO,YAAY,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,aAAqB;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,4BAA4B;IAC3C,CAAC;IAED,kDAAkD;IAClD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IACjE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1E,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,MAAmB;IAC/C,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,IAAI,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACrC,QAAQ,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;IACnD,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,KAAK;QAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IACnD,IAAI,MAAM,CAAC,SAAS;QAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;IAE/D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,GAAW;IAC1C,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,UAAU,GAAgC,IAAI,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YACvE,MAAM;QACR,CAAC;QACD,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChE,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAyB,CAAC;YACxD,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC;iBAC9B,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;iBAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7B,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACxB,UAAU,GAAG,IAAI,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAyB,CAAC;YACjD,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACpD,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;YACzD,UAAU,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC5D,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -2,7 +2,14 @@ import type { ExtensionAPI } from './extension-api.js';
|
|
|
2
2
|
import type { LoadedExtension } from './extension-types.js';
|
|
3
3
|
import type { ExtensionsConfig } from './types.js';
|
|
4
4
|
/**
|
|
5
|
-
* Discover extension file paths from
|
|
5
|
+
* Discover extension file paths from all sources.
|
|
6
|
+
*
|
|
7
|
+
* Sources (in order):
|
|
8
|
+
* 1. Auto-discovery: .ai/extensions/ (project-local)
|
|
9
|
+
* 2. Auto-discovery: ~/.ai/extensions/ (global)
|
|
10
|
+
* 3. Installed packages: .ai/packages/node_modules/ (installed via dot-ai install)
|
|
11
|
+
* 4. Configured paths: settings.json "extensions" array (explicit paths/dirs)
|
|
12
|
+
* 5. Configured packages: settings.json "packages" array (npm package names resolved from workspace node_modules)
|
|
6
13
|
*/
|
|
7
14
|
export declare function discoverExtensions(workspaceRoot: string, config?: ExtensionsConfig): Promise<string[]>;
|
|
8
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-loader.d.ts","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,sBAAsB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"extension-loader.d.ts","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,sBAAsB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAmHpE;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAkEnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,CAAC,EAAE;IAAE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CAAE,EACpI,aAAa,CAAC,EAAE,MAAM,GACrB;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,eAAe,CAAA;CAAE,CA8CnD"}
|
package/dist/extension-loader.js
CHANGED
|
@@ -1,75 +1,186 @@
|
|
|
1
1
|
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
2
|
import { join, resolve } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
|
+
function isExtensionFile(name) {
|
|
5
|
+
return name.endsWith('.ts') || name.endsWith('.js');
|
|
6
|
+
}
|
|
4
7
|
/**
|
|
5
|
-
*
|
|
8
|
+
* Resolve extension entry points from a directory.
|
|
9
|
+
*
|
|
10
|
+
* Checks for:
|
|
11
|
+
* 1. package.json with "dot-ai.extensions" field -> returns declared paths
|
|
12
|
+
* 2. index.ts or index.js -> returns the index file
|
|
13
|
+
*
|
|
14
|
+
* Returns resolved paths or null if no entry points found.
|
|
6
15
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
async function resolveExtensionEntries(dir) {
|
|
17
|
+
// Check for package.json with "dot-ai" field first
|
|
18
|
+
try {
|
|
19
|
+
const pkgPath = join(dir, 'package.json');
|
|
20
|
+
const pkgRaw = await readFile(pkgPath, 'utf-8');
|
|
21
|
+
const pkg = JSON.parse(pkgRaw);
|
|
22
|
+
const dotAi = pkg['dot-ai'];
|
|
23
|
+
if (dotAi?.extensions && Array.isArray(dotAi.extensions)) {
|
|
24
|
+
const entries = [];
|
|
25
|
+
for (const ext of dotAi.extensions) {
|
|
26
|
+
const resolvedPath = resolve(dir, ext);
|
|
27
|
+
try {
|
|
28
|
+
await stat(resolvedPath);
|
|
29
|
+
entries.push(resolvedPath);
|
|
30
|
+
}
|
|
31
|
+
catch { /* entry doesn't exist */ }
|
|
32
|
+
}
|
|
33
|
+
if (entries.length > 0)
|
|
34
|
+
return entries;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch { /* no package.json or invalid */ }
|
|
38
|
+
// Check for index.ts or index.js
|
|
39
|
+
for (const indexName of ['index.ts', 'index.js']) {
|
|
40
|
+
const indexPath = join(dir, indexName);
|
|
16
41
|
try {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
42
|
+
await stat(indexPath);
|
|
43
|
+
return [indexPath];
|
|
44
|
+
}
|
|
45
|
+
catch { /* not found */ }
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Scan a directory for extensions.
|
|
51
|
+
*
|
|
52
|
+
* Discovery rules:
|
|
53
|
+
* 1. Direct files: `dir/*.ts` or `*.js` -> load
|
|
54
|
+
* 2. Subdirectory with package.json: `dir/sub/package.json` with "dot-ai" field -> load what it declares
|
|
55
|
+
* 3. Subdirectory with index: `dir/sub/index.ts` or `index.js` -> load
|
|
56
|
+
*
|
|
57
|
+
* No recursion beyond one level. Complex packages must use package.json manifest.
|
|
58
|
+
*/
|
|
59
|
+
async function discoverExtensionsInDir(dir) {
|
|
60
|
+
const discovered = [];
|
|
61
|
+
try {
|
|
62
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
const entryPath = join(dir, entry.name);
|
|
65
|
+
// 1. Direct files: *.ts or *.js
|
|
66
|
+
if (entry.isFile() && isExtensionFile(entry.name)) {
|
|
67
|
+
discovered.push(entryPath);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// 2 & 3. Subdirectories: package.json or index file
|
|
71
|
+
if (entry.isDirectory()) {
|
|
72
|
+
const resolved = await resolveExtensionEntries(entryPath);
|
|
73
|
+
if (resolved) {
|
|
74
|
+
discovered.push(...resolved);
|
|
22
75
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch { /* directory doesn't exist — skip */ }
|
|
80
|
+
return discovered;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolve extensions from installed packages in .ai/packages/.
|
|
84
|
+
*
|
|
85
|
+
* Reads the package.json created by `npm --prefix .ai/packages/` and resolves
|
|
86
|
+
* extension entry points from each installed package's "dot-ai.extensions" field.
|
|
87
|
+
*/
|
|
88
|
+
async function resolveInstalledPackages(workspaceRoot) {
|
|
89
|
+
const packagesDir = join(workspaceRoot, '.ai', 'packages');
|
|
90
|
+
const pkgJsonPath = join(packagesDir, 'package.json');
|
|
91
|
+
try {
|
|
92
|
+
const raw = await readFile(pkgJsonPath, 'utf-8');
|
|
93
|
+
const pkg = JSON.parse(raw);
|
|
94
|
+
const deps = pkg.dependencies;
|
|
95
|
+
if (!deps)
|
|
96
|
+
return [];
|
|
97
|
+
const paths = [];
|
|
98
|
+
for (const name of Object.keys(deps)) {
|
|
99
|
+
const pkgDir = join(packagesDir, 'node_modules', name);
|
|
100
|
+
const entries = await resolveExtensionEntries(pkgDir);
|
|
101
|
+
if (entries) {
|
|
102
|
+
paths.push(...entries);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return paths;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Discover extension file paths from all sources.
|
|
113
|
+
*
|
|
114
|
+
* Sources (in order):
|
|
115
|
+
* 1. Auto-discovery: .ai/extensions/ (project-local)
|
|
116
|
+
* 2. Auto-discovery: ~/.ai/extensions/ (global)
|
|
117
|
+
* 3. Installed packages: .ai/packages/node_modules/ (installed via dot-ai install)
|
|
118
|
+
* 4. Configured paths: settings.json "extensions" array (explicit paths/dirs)
|
|
119
|
+
* 5. Configured packages: settings.json "packages" array (npm package names resolved from workspace node_modules)
|
|
120
|
+
*/
|
|
121
|
+
export async function discoverExtensions(workspaceRoot, config) {
|
|
122
|
+
const seen = new Set();
|
|
123
|
+
const allPaths = [];
|
|
124
|
+
const addPaths = (paths) => {
|
|
125
|
+
for (const p of paths) {
|
|
126
|
+
const resolved = resolve(p);
|
|
127
|
+
if (!seen.has(resolved)) {
|
|
128
|
+
seen.add(resolved);
|
|
129
|
+
allPaths.push(resolved);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
// 1. Project-local extensions: .ai/extensions/
|
|
134
|
+
addPaths(await discoverExtensionsInDir(join(workspaceRoot, '.ai', 'extensions')));
|
|
135
|
+
// 2. Global extensions: ~/.ai/extensions/
|
|
136
|
+
addPaths(await discoverExtensionsInDir(join(homedir(), '.ai', 'extensions')));
|
|
137
|
+
// 3. Installed packages: .ai/packages/node_modules/
|
|
138
|
+
addPaths(await resolveInstalledPackages(workspaceRoot));
|
|
139
|
+
// 4. Explicitly configured paths from settings.json "extensions" array
|
|
140
|
+
if (config?.paths) {
|
|
141
|
+
for (const p of config.paths) {
|
|
142
|
+
const resolved = resolve(workspaceRoot, p);
|
|
143
|
+
try {
|
|
144
|
+
const s = await stat(resolved);
|
|
145
|
+
if (s.isDirectory()) {
|
|
146
|
+
// Check for package.json or index file first
|
|
147
|
+
const entries = await resolveExtensionEntries(resolved);
|
|
148
|
+
if (entries) {
|
|
149
|
+
addPaths(entries);
|
|
33
150
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const pkgRaw = await readFile(pkgPath, 'utf-8');
|
|
38
|
-
const pkg = JSON.parse(pkgRaw);
|
|
39
|
-
const dotAi = pkg['dot-ai'];
|
|
40
|
-
if (dotAi?.extensions && Array.isArray(dotAi.extensions)) {
|
|
41
|
-
for (const ext of dotAi.extensions) {
|
|
42
|
-
paths.add(resolve(fullPath, ext));
|
|
43
|
-
}
|
|
44
|
-
}
|
|
151
|
+
else {
|
|
152
|
+
// Discover individual files in directory
|
|
153
|
+
addPaths(await discoverExtensionsInDir(resolved));
|
|
45
154
|
}
|
|
46
|
-
|
|
155
|
+
}
|
|
156
|
+
else if (s.isFile()) {
|
|
157
|
+
addPaths([resolved]);
|
|
47
158
|
}
|
|
48
159
|
}
|
|
160
|
+
catch {
|
|
161
|
+
// Path doesn't exist — add anyway (will fail at load time with clear error)
|
|
162
|
+
addPaths([resolved]);
|
|
163
|
+
}
|
|
49
164
|
}
|
|
50
|
-
catch { /* directory doesn't exist — skip */ }
|
|
51
165
|
}
|
|
52
|
-
//
|
|
166
|
+
// 5. Configured npm packages from settings.json "packages" array
|
|
167
|
+
// These are resolved from the workspace's own node_modules
|
|
53
168
|
if (config?.packages) {
|
|
54
169
|
for (const pkg of config.packages) {
|
|
55
170
|
try {
|
|
56
171
|
const { createRequire } = await import('node:module');
|
|
57
172
|
const require = createRequire(join(workspaceRoot, 'package.json'));
|
|
58
173
|
const pkgJsonPath = require.resolve(`${pkg}/package.json`);
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const pkgDir = join(pkgJsonPath, '..');
|
|
64
|
-
for (const ext of dotAi.extensions) {
|
|
65
|
-
paths.add(resolve(pkgDir, ext));
|
|
66
|
-
}
|
|
174
|
+
const pkgDir = join(pkgJsonPath, '..');
|
|
175
|
+
const entries = await resolveExtensionEntries(pkgDir);
|
|
176
|
+
if (entries) {
|
|
177
|
+
addPaths(entries);
|
|
67
178
|
}
|
|
68
179
|
}
|
|
69
180
|
catch { /* package not found */ }
|
|
70
181
|
}
|
|
71
182
|
}
|
|
72
|
-
return
|
|
183
|
+
return allPaths;
|
|
73
184
|
}
|
|
74
185
|
/**
|
|
75
186
|
* Create an ExtensionAPI instance that collects registrations into a LoadedExtension.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-loader.js","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAKlC
|
|
1
|
+
{"version":3,"file":"extension-loader.js","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,8 +20,8 @@ export type { Capability, CapabilityResult } from './capabilities.js';
|
|
|
20
20
|
export type { LogLevel, LogEntry, Logger } from './logger.js';
|
|
21
21
|
export { NoopLogger, JsonFileLogger, StderrLogger } from './logger.js';
|
|
22
22
|
export { loadConfig, migrateConfig } from './config.js';
|
|
23
|
-
export { install, remove, listPackages, resolvePackages } from './package-manager.js';
|
|
24
|
-
export type { PackageInfo } from './package-manager.js';
|
|
23
|
+
export { install, remove, listPackages, resolvePackages, ensurePackagesInstalled } from './package-manager.js';
|
|
24
|
+
export type { PackageInfo, MissingPackageAction } from './package-manager.js';
|
|
25
25
|
export { computeChecksum, loadBootCache, writeBootCache, clearBootCache } from './boot-cache.js';
|
|
26
26
|
export type { BootCacheData } from './boot-cache.js';
|
|
27
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,KAAK,EACL,IAAI,EACJ,WAAW,EACX,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,eAAe,EACf,UAAU,EACV,WAAW,EACX,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,OAAO,EACP,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,aAAa,EAAE,cAAc,EAC7B,eAAe,EACf,aAAa,GACd,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGlE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7G,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGtE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGvE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,KAAK,EACL,IAAI,EACJ,WAAW,EACX,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,eAAe,EACf,UAAU,EACV,WAAW,EACX,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,OAAO,EACP,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,aAAa,EAAE,cAAc,EAC7B,eAAe,EACf,aAAa,GACd,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGlE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7G,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGtE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGvE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/G,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG9E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjG,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -22,7 +22,7 @@ export { NoopLogger, JsonFileLogger, StderrLogger } from './logger.js';
|
|
|
22
22
|
// ── Config ──
|
|
23
23
|
export { loadConfig, migrateConfig } from './config.js';
|
|
24
24
|
// ── Package Manager ──
|
|
25
|
-
export { install, remove, listPackages, resolvePackages } from './package-manager.js';
|
|
25
|
+
export { install, remove, listPackages, resolvePackages, ensurePackagesInstalled } from './package-manager.js';
|
|
26
26
|
// ── Boot Cache ──
|
|
27
27
|
export { computeChecksum, loadBootCache, writeBootCache, clearBootCache } from './boot-cache.js';
|
|
28
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+CH,yBAAyB;AACzB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAKlE,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7G,qBAAqB;AACrB,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAK/D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvE,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,wBAAwB;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+CH,yBAAyB;AACzB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAKlE,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7G,qBAAqB;AACrB,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAK/D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvE,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,wBAAwB;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/G,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -7,24 +7,47 @@ export interface PackageInfo {
|
|
|
7
7
|
providers?: string[];
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
+
export type MissingPackageAction = 'install' | 'skip' | 'error';
|
|
10
11
|
/**
|
|
11
|
-
* Install a dot-ai package from npm
|
|
12
|
+
* Install a dot-ai package from npm.
|
|
13
|
+
*
|
|
14
|
+
* Installs into `.ai/packages/node_modules/`.
|
|
12
15
|
*/
|
|
13
|
-
export declare function install(source: string,
|
|
16
|
+
export declare function install(source: string, workspaceRoot: string): Promise<PackageInfo>;
|
|
14
17
|
/**
|
|
15
18
|
* Remove an installed package.
|
|
16
19
|
*/
|
|
17
|
-
export declare function remove(name: string,
|
|
20
|
+
export declare function remove(name: string, workspaceRoot: string): Promise<void>;
|
|
18
21
|
/**
|
|
19
22
|
* List installed dot-ai packages.
|
|
20
23
|
*/
|
|
21
|
-
export declare function listPackages(
|
|
24
|
+
export declare function listPackages(workspaceRoot: string): Promise<PackageInfo[]>;
|
|
22
25
|
/**
|
|
23
26
|
* Resolve dot-ai manifest from installed packages.
|
|
24
27
|
*/
|
|
25
|
-
export declare function resolvePackages(
|
|
28
|
+
export declare function resolvePackages(workspaceRoot: string): Promise<{
|
|
26
29
|
extensions: string[];
|
|
27
30
|
skills: string[];
|
|
28
31
|
providers: string[];
|
|
29
32
|
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Ensure all packages from settings.json are installed.
|
|
35
|
+
*
|
|
36
|
+
* Like Pi's `resolvePackageSources()` with auto-install:
|
|
37
|
+
* - Reads the `packages` array from settings.json config
|
|
38
|
+
* - For each package, checks if it's already installed in `.ai/packages/`
|
|
39
|
+
* - If not installed, auto-installs it via npm
|
|
40
|
+
* - The `onMissing` callback allows callers to control behavior (install/skip/error)
|
|
41
|
+
*
|
|
42
|
+
* This should be called BEFORE `discoverExtensions()` in the boot flow,
|
|
43
|
+
* so that installed packages are available for extension discovery.
|
|
44
|
+
*/
|
|
45
|
+
export declare function ensurePackagesInstalled(workspaceRoot: string, packages: string[], onMissing?: (source: string) => Promise<MissingPackageAction>): Promise<{
|
|
46
|
+
installed: string[];
|
|
47
|
+
skipped: string[];
|
|
48
|
+
errors: Array<{
|
|
49
|
+
source: string;
|
|
50
|
+
error: string;
|
|
51
|
+
}>;
|
|
52
|
+
}>;
|
|
30
53
|
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACH;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAgEhE;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC,CAMtB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,EAAE,CAAC,CAuBxB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqB1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,GAC5D,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA8CvG"}
|