@cogineai/clawpacker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +373 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +22 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/export.d.ts +11 -0
  7. package/dist/commands/export.js +48 -0
  8. package/dist/commands/export.js.map +1 -0
  9. package/dist/commands/import.d.ts +10 -0
  10. package/dist/commands/import.js +51 -0
  11. package/dist/commands/import.js.map +1 -0
  12. package/dist/commands/inspect.d.ts +10 -0
  13. package/dist/commands/inspect.js +80 -0
  14. package/dist/commands/inspect.js.map +1 -0
  15. package/dist/commands/validate.d.ts +9 -0
  16. package/dist/commands/validate.js +29 -0
  17. package/dist/commands/validate.js.map +1 -0
  18. package/dist/core/agent-extract.d.ts +5 -0
  19. package/dist/core/agent-extract.js +51 -0
  20. package/dist/core/agent-extract.js.map +1 -0
  21. package/dist/core/checksums.d.ts +2 -0
  22. package/dist/core/checksums.js +14 -0
  23. package/dist/core/checksums.js.map +1 -0
  24. package/dist/core/constants.d.ts +9 -0
  25. package/dist/core/constants.js +27 -0
  26. package/dist/core/constants.js.map +1 -0
  27. package/dist/core/import-exec.d.ts +5 -0
  28. package/dist/core/import-exec.js +56 -0
  29. package/dist/core/import-exec.js.map +1 -0
  30. package/dist/core/import-plan.d.ts +8 -0
  31. package/dist/core/import-plan.js +91 -0
  32. package/dist/core/import-plan.js.map +1 -0
  33. package/dist/core/manifest.d.ts +24 -0
  34. package/dist/core/manifest.js +59 -0
  35. package/dist/core/manifest.js.map +1 -0
  36. package/dist/core/openclaw-config.d.ts +46 -0
  37. package/dist/core/openclaw-config.js +127 -0
  38. package/dist/core/openclaw-config.js.map +1 -0
  39. package/dist/core/package-read.d.ts +2 -0
  40. package/dist/core/package-read.js +64 -0
  41. package/dist/core/package-read.js.map +1 -0
  42. package/dist/core/package-write.d.ts +8 -0
  43. package/dist/core/package-write.js +59 -0
  44. package/dist/core/package-write.js.map +1 -0
  45. package/dist/core/skills-detect.d.ts +2 -0
  46. package/dist/core/skills-detect.js +43 -0
  47. package/dist/core/skills-detect.js.map +1 -0
  48. package/dist/core/types.d.ts +151 -0
  49. package/dist/core/types.js +3 -0
  50. package/dist/core/types.js.map +1 -0
  51. package/dist/core/validate.d.ts +6 -0
  52. package/dist/core/validate.js +89 -0
  53. package/dist/core/validate.js.map +1 -0
  54. package/dist/core/workspace-scan.d.ts +2 -0
  55. package/dist/core/workspace-scan.js +57 -0
  56. package/dist/core/workspace-scan.js.map +1 -0
  57. package/dist/utils/json.d.ts +2 -0
  58. package/dist/utils/json.js +12 -0
  59. package/dist/utils/json.js.map +1 -0
  60. package/package.json +33 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runValidate = runValidate;
7
+ exports.registerValidateCommand = registerValidateCommand;
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const validate_1 = require("../core/validate");
10
+ async function runValidate(options) {
11
+ if (!options.targetWorkspace) {
12
+ throw new Error('validate requires --target-workspace <path>');
13
+ }
14
+ const report = await (0, validate_1.validateImportedWorkspace)({
15
+ targetWorkspacePath: node_path_1.default.resolve(options.targetWorkspace),
16
+ agentId: options.agentId,
17
+ targetConfigPath: options.config ? node_path_1.default.resolve(options.config) : undefined,
18
+ });
19
+ console.log(JSON.stringify(report, null, 2));
20
+ }
21
+ function registerValidateCommand(command) {
22
+ command
23
+ .description('Validate an imported workspace and optional config wiring.')
24
+ .requiredOption('--target-workspace <path>', 'Imported target workspace path')
25
+ .option('--agent-id <id>', 'Expected target agent id')
26
+ .option('--config <path>', 'Target OpenClaw config path for consistency checks')
27
+ .action(runValidate);
28
+ }
29
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";;;;;AAUA,kCAYC;AAED,0DAOC;AA/BD,0DAA6B;AAE7B,+CAA6D;AAQtD,KAAK,UAAU,WAAW,CAAC,OAAwB;IACxD,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAyB,EAAC;QAC7C,mBAAmB,EAAE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;QAC1D,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5E,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,WAAW,CAAC,4DAA4D,CAAC;SACzE,cAAc,CAAC,2BAA2B,EAAE,gCAAgC,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,CAAC;SACrD,MAAM,CAAC,iBAAiB,EAAE,oDAAoD,CAAC;SAC/E,MAAM,CAAC,WAAW,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AgentDefinition } from './types';
2
+ export declare function extractAgentDefinition(workspacePath: string, options?: {
3
+ configPath?: string;
4
+ agentId?: string;
5
+ }): Promise<AgentDefinition>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.extractAgentDefinition = extractAgentDefinition;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const openclaw_config_1 = require("./openclaw-config");
9
+ async function extractAgentDefinition(workspacePath, options = {}) {
10
+ try {
11
+ const loaded = await (0, openclaw_config_1.loadOpenClawConfig)({ configPath: options.configPath, cwd: workspacePath });
12
+ return (0, openclaw_config_1.extractPortableAgentDefinition)({
13
+ config: loaded.config,
14
+ configPath: loaded.configPath,
15
+ workspacePath,
16
+ agentId: options.agentId,
17
+ });
18
+ }
19
+ catch {
20
+ const basename = node_path_1.default.basename(workspacePath);
21
+ const suggestedId = basename.replace(/^workspace-/, '');
22
+ const suggestedName = toTitleCase(suggestedId.replace(/-/g, ' '));
23
+ return {
24
+ agent: {
25
+ suggestedId,
26
+ suggestedName,
27
+ workspace: {
28
+ suggestedBasename: basename,
29
+ },
30
+ identity: {
31
+ name: suggestedName,
32
+ },
33
+ },
34
+ fieldClassification: {
35
+ 'agent.suggestedId': 'requiresInputOnImport',
36
+ 'agent.suggestedName': 'portable',
37
+ 'agent.workspace.suggestedBasename': 'requiresInputOnImport',
38
+ 'agent.identity.name': 'portable',
39
+ },
40
+ notes: ['Conservative placeholder agent definition generated from workspace basename.'],
41
+ };
42
+ }
43
+ }
44
+ function toTitleCase(value) {
45
+ return value
46
+ .split(/\s+/)
47
+ .filter(Boolean)
48
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
49
+ .join(' ');
50
+ }
51
+ //# sourceMappingURL=agent-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-extract.js","sourceRoot":"","sources":["../../src/core/agent-extract.ts"],"names":[],"mappings":";;;;;AAIA,wDAkCC;AAtCD,0DAA6B;AAE7B,uDAAuF;AAEhF,KAAK,UAAU,sBAAsB,CAAC,aAAqB,EAAE,UAAqD,EAAE;IACzH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAkB,EAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;QAChG,OAAO,IAAA,gDAA8B,EAAC;YACpC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,aAAa;YACb,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,QAAQ,GAAG,mBAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAElE,OAAO;YACL,KAAK,EAAE;gBACL,WAAW;gBACX,aAAa;gBACb,SAAS,EAAE;oBACT,iBAAiB,EAAE,QAAQ;iBAC5B;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,aAAa;iBACpB;aACF;YACD,mBAAmB,EAAE;gBACnB,mBAAmB,EAAE,uBAAuB;gBAC5C,qBAAqB,EAAE,UAAU;gBACjC,mCAAmC,EAAE,uBAAuB;gBAC5D,qBAAqB,EAAE,UAAU;aAClC;YACD,KAAK,EAAE,CAAC,8EAA8E,CAAC;SACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function checksumFile(filePath: string): Promise<string>;
2
+ export declare function checksumText(content: string): string;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checksumFile = checksumFile;
4
+ exports.checksumText = checksumText;
5
+ const node_crypto_1 = require("node:crypto");
6
+ const promises_1 = require("node:fs/promises");
7
+ async function checksumFile(filePath) {
8
+ const content = await (0, promises_1.readFile)(filePath);
9
+ return (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
10
+ }
11
+ function checksumText(content) {
12
+ return (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
13
+ }
14
+ //# sourceMappingURL=checksums.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksums.js","sourceRoot":"","sources":["../../src/core/checksums.ts"],"names":[],"mappings":";;AAGA,oCAGC;AAED,oCAEC;AAVD,6CAAyC;AACzC,+CAA4C;AAErC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe;IAC1C,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const PACKAGE_FORMAT_VERSION = 1;
2
+ export declare const PACKAGE_TYPE = "openclaw-agent-template";
3
+ export declare const EXPORT_MODE = "template";
4
+ export declare const REQUIRED_WORKSPACE_FILES: readonly ["AGENTS.md", "SOUL.md", "IDENTITY.md", "USER.md", "TOOLS.md", "MEMORY.md"];
5
+ export declare const OPTIONAL_WORKSPACE_FILES: readonly ["HEARTBEAT.md"];
6
+ export declare const ALLOWED_WORKSPACE_FILES: readonly ["AGENTS.md", "SOUL.md", "IDENTITY.md", "USER.md", "TOOLS.md", "MEMORY.md", "HEARTBEAT.md"];
7
+ export declare const DEFAULT_EXCLUDED_GLOBS: string[];
8
+ export declare const SKILLS_MODE: "manifest-only";
9
+ export declare const SKILL_REFERENCE_PATTERNS: RegExp[];
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SKILL_REFERENCE_PATTERNS = exports.SKILLS_MODE = exports.DEFAULT_EXCLUDED_GLOBS = exports.ALLOWED_WORKSPACE_FILES = exports.OPTIONAL_WORKSPACE_FILES = exports.REQUIRED_WORKSPACE_FILES = exports.EXPORT_MODE = exports.PACKAGE_TYPE = exports.PACKAGE_FORMAT_VERSION = void 0;
4
+ exports.PACKAGE_FORMAT_VERSION = 1;
5
+ exports.PACKAGE_TYPE = 'openclaw-agent-template';
6
+ exports.EXPORT_MODE = 'template';
7
+ exports.REQUIRED_WORKSPACE_FILES = [
8
+ 'AGENTS.md',
9
+ 'SOUL.md',
10
+ 'IDENTITY.md',
11
+ 'USER.md',
12
+ 'TOOLS.md',
13
+ 'MEMORY.md',
14
+ ];
15
+ exports.OPTIONAL_WORKSPACE_FILES = ['HEARTBEAT.md'];
16
+ exports.ALLOWED_WORKSPACE_FILES = [
17
+ ...exports.REQUIRED_WORKSPACE_FILES,
18
+ ...exports.OPTIONAL_WORKSPACE_FILES,
19
+ ];
20
+ exports.DEFAULT_EXCLUDED_GLOBS = ['memory/*.md'];
21
+ exports.SKILLS_MODE = 'manifest-only';
22
+ exports.SKILL_REFERENCE_PATTERNS = [
23
+ /\b(?:use|using|install|activate|invok(?:e|ing)|requires?)\s+(?:the\s+)?(?:skill\s+)?`?([a-z0-9][a-z0-9-]*)`?/gi,
24
+ /skills?\/[A-Za-z0-9._-]+\/([a-z0-9][a-z0-9-]*)\b/gi,
25
+ /<name>([a-z0-9][a-z0-9-]*)<\/name>/gi,
26
+ ];
27
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,YAAY,GAAG,yBAAyB,CAAC;AACzC,QAAA,WAAW,GAAG,UAAU,CAAC;AAEzB,QAAA,wBAAwB,GAAG;IACtC,WAAW;IACX,SAAS;IACT,aAAa;IACb,SAAS;IACT,UAAU;IACV,WAAW;CACH,CAAC;AAEE,QAAA,wBAAwB,GAAG,CAAC,cAAc,CAAU,CAAC;AAErD,QAAA,uBAAuB,GAAG;IACrC,GAAG,gCAAwB;IAC3B,GAAG,gCAAwB;CACnB,CAAC;AAEE,QAAA,sBAAsB,GAAG,CAAC,aAAa,CAAC,CAAC;AAEzC,QAAA,WAAW,GAAG,eAAwB,CAAC;AAEvC,QAAA,wBAAwB,GAAG;IACtC,gHAAgH;IAChH,oDAAoD;IACpD,sCAAsC;CACvC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ImportPlan, ImportResult, ReadPackageResult } from './types';
2
+ export declare function executeImport(params: {
3
+ pkg: ReadPackageResult;
4
+ plan: ImportPlan;
5
+ }): Promise<ImportResult>;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.executeImport = executeImport;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const json_1 = require("../utils/json");
10
+ const openclaw_config_1 = require("./openclaw-config");
11
+ async function executeImport(params) {
12
+ if (!params.plan.canProceed) {
13
+ throw new Error(`Import plan cannot proceed: ${params.plan.failed.concat(params.plan.requiredInputs.map((item) => item.key)).join(', ')}`);
14
+ }
15
+ if (params.plan.writePlan.overwriteExisting) {
16
+ await (0, promises_1.rm)(params.plan.writePlan.targetWorkspacePath, { recursive: true, force: true });
17
+ }
18
+ await (0, promises_1.mkdir)(params.plan.writePlan.targetWorkspacePath, { recursive: true });
19
+ for (const file of params.plan.writePlan.workspaceFiles) {
20
+ await (0, promises_1.mkdir)(node_path_1.default.dirname(file.targetPath), { recursive: true });
21
+ await (0, promises_1.cp)(file.sourcePath, file.targetPath);
22
+ }
23
+ await (0, promises_1.mkdir)(params.plan.writePlan.metadataDirectory, { recursive: true });
24
+ const agentRecordPath = node_path_1.default.join(params.plan.writePlan.metadataDirectory, 'agent-definition.json');
25
+ const importRecordPath = node_path_1.default.join(params.plan.writePlan.metadataDirectory, 'import-result.json');
26
+ const configFiles = [];
27
+ if (params.plan.writePlan.targetConfigPath) {
28
+ await (0, openclaw_config_1.upsertPortableAgentDefinition)({
29
+ configPath: params.plan.writePlan.targetConfigPath,
30
+ portableAgentDefinition: params.pkg.agentDefinition,
31
+ targetAgentId: params.plan.writePlan.targetAgentId,
32
+ targetWorkspacePath: params.plan.writePlan.targetWorkspacePath,
33
+ force: params.plan.writePlan.overwriteExisting,
34
+ });
35
+ configFiles.push(params.plan.writePlan.targetConfigPath);
36
+ }
37
+ await (0, json_1.writeJsonFile)(agentRecordPath, {
38
+ agentId: params.plan.writePlan.targetAgentId,
39
+ importedFromPackage: params.pkg.manifest.name,
40
+ packageType: params.pkg.manifest.packageType,
41
+ portableAgentDefinition: params.pkg.agentDefinition,
42
+ persistedToConfig: params.plan.writePlan.targetConfigPath ?? null,
43
+ });
44
+ const result = {
45
+ status: 'ok',
46
+ importedFiles: params.plan.writePlan.workspaceFiles.map((file) => file.relativePath),
47
+ metadataFiles: [agentRecordPath, importRecordPath, ...configFiles],
48
+ warnings: params.plan.warnings,
49
+ nextSteps: params.plan.nextSteps,
50
+ targetWorkspacePath: params.plan.writePlan.targetWorkspacePath,
51
+ agentId: params.plan.writePlan.targetAgentId,
52
+ };
53
+ await (0, json_1.writeJsonFile)(importRecordPath, result);
54
+ return result;
55
+ }
56
+ //# sourceMappingURL=import-exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-exec.js","sourceRoot":"","sources":["../../src/core/import-exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ImportPlan, ReadPackageResult } from './types';
2
+ export declare function planImport(params: {
3
+ pkg: ReadPackageResult;
4
+ targetWorkspacePath?: string;
5
+ targetAgentId?: string;
6
+ targetConfigPath?: string;
7
+ force?: boolean;
8
+ }): Promise<ImportPlan>;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.planImport = planImport;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const openclaw_config_1 = require("./openclaw-config");
10
+ async function planImport(params) {
11
+ const requiredInputs = [];
12
+ const failed = [];
13
+ const warnings = [...params.pkg.importHints.warnings];
14
+ const nextSteps = [
15
+ 'Channel bindings are not restored automatically in v1.',
16
+ 'Review the imported identity and memory files before using the agent.',
17
+ ];
18
+ if (!params.targetWorkspacePath) {
19
+ requiredInputs.push({ key: 'targetWorkspacePath', reason: 'A target workspace path is required for import.' });
20
+ }
21
+ if (!params.targetAgentId) {
22
+ requiredInputs.push({ key: 'agentId', reason: 'Choose a target agent id for the imported definition.' });
23
+ }
24
+ const targetWorkspacePath = node_path_1.default.resolve(params.targetWorkspacePath ?? params.pkg.agentDefinition.agent.workspace.suggestedBasename);
25
+ const targetAgentId = params.targetAgentId ?? params.pkg.agentDefinition.agent.suggestedId;
26
+ const workspaceExists = await pathExists(targetWorkspacePath);
27
+ if (workspaceExists && !params.force) {
28
+ failed.push(`Target workspace already exists: ${targetWorkspacePath}`);
29
+ nextSteps.push('Choose a different --target-workspace path or re-run with --force to overwrite the existing workspace.');
30
+ }
31
+ else if (workspaceExists) {
32
+ warnings.push(`Target workspace exists and will be overwritten because --force was provided: ${targetWorkspacePath}`);
33
+ }
34
+ let configAgentCollision = false;
35
+ if (!params.targetConfigPath) {
36
+ warnings.push('OpenClaw config not found; agent definition will only be recorded in local import metadata.');
37
+ }
38
+ else if (await pathExists(params.targetConfigPath)) {
39
+ const { config } = await (0, openclaw_config_1.loadOpenClawConfig)({ configPath: params.targetConfigPath });
40
+ if (config.agents?.[targetAgentId]) {
41
+ configAgentCollision = true;
42
+ if (!params.force) {
43
+ failed.push(`Target agent already exists in OpenClaw config: ${targetAgentId}`);
44
+ nextSteps.push('Choose a different --agent-id or re-run with --force to update the existing OpenClaw config entry.');
45
+ }
46
+ else {
47
+ warnings.push(`OpenClaw config already contains agent ${targetAgentId}; it will be overwritten because --force was provided.`);
48
+ }
49
+ }
50
+ }
51
+ else {
52
+ warnings.push(`Target OpenClaw config does not exist yet and will be created during import: ${params.targetConfigPath}`);
53
+ }
54
+ const metadataDirectory = node_path_1.default.join(targetWorkspacePath, '.openclaw-agent-package');
55
+ const writePlan = {
56
+ workspaceFiles: params.pkg.workspaceFiles.map((file) => ({
57
+ sourcePath: file.absolutePath,
58
+ targetPath: node_path_1.default.join(targetWorkspacePath, file.relativePath),
59
+ relativePath: file.relativePath,
60
+ })),
61
+ overwriteExisting: Boolean(params.force),
62
+ targetWorkspacePath,
63
+ targetAgentId,
64
+ metadataDirectory,
65
+ targetConfigPath: params.targetConfigPath,
66
+ summary: {
67
+ fileCount: params.pkg.workspaceFiles.length,
68
+ existingWorkspaceDetected: workspaceExists,
69
+ targetConfigDetected: Boolean(params.targetConfigPath),
70
+ configAgentCollision,
71
+ },
72
+ };
73
+ return {
74
+ canProceed: requiredInputs.length === 0 && failed.length === 0,
75
+ requiredInputs,
76
+ warnings,
77
+ failed,
78
+ nextSteps,
79
+ writePlan,
80
+ };
81
+ }
82
+ async function pathExists(targetPath) {
83
+ try {
84
+ await (0, promises_1.access)(targetPath);
85
+ return true;
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ //# sourceMappingURL=import-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-plan.js","sourceRoot":"","sources":["../../src/core/import-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { AgentDefinition, ExportArtifacts, ExportReport, PackageManifest, SkillsManifest, WorkspaceScanResult } from './types';
2
+ export declare function buildManifest(params: {
3
+ packageName: string;
4
+ workspacePath: string;
5
+ scan: WorkspaceScanResult;
6
+ skills: SkillsManifest;
7
+ agentDefinition: AgentDefinition;
8
+ }): PackageManifest;
9
+ export declare function buildExportReport(params: {
10
+ packageName: string;
11
+ workspacePath: string;
12
+ scan: WorkspaceScanResult;
13
+ skills: SkillsManifest;
14
+ warnings?: string[];
15
+ }): ExportReport;
16
+ export declare function buildExportArtifacts(params: {
17
+ packageName: string;
18
+ workspacePath: string;
19
+ scan: WorkspaceScanResult;
20
+ skills: SkillsManifest;
21
+ agentDefinition: AgentDefinition;
22
+ checksums: Record<string, string>;
23
+ warnings?: string[];
24
+ }): ExportArtifacts;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildManifest = buildManifest;
7
+ exports.buildExportReport = buildExportReport;
8
+ exports.buildExportArtifacts = buildExportArtifacts;
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const constants_1 = require("./constants");
11
+ function buildManifest(params) {
12
+ const workspaceName = node_path_1.default.basename(params.workspacePath);
13
+ return {
14
+ formatVersion: constants_1.PACKAGE_FORMAT_VERSION,
15
+ packageType: constants_1.PACKAGE_TYPE,
16
+ name: params.packageName,
17
+ exportMode: constants_1.EXPORT_MODE,
18
+ source: {
19
+ agentId: params.agentDefinition.agent.suggestedId,
20
+ workspaceName,
21
+ openclawVersion: 'unknown',
22
+ },
23
+ includes: {
24
+ workspaceFiles: params.scan.includedFiles.map((file) => file.relativePath),
25
+ dailyMemory: false,
26
+ skills: constants_1.SKILLS_MODE,
27
+ agentDefinition: true,
28
+ },
29
+ excludes: {
30
+ secrets: true,
31
+ sessionState: true,
32
+ channelBindings: true,
33
+ globalExtensions: true,
34
+ },
35
+ compatibility: {
36
+ minFormatVersion: constants_1.PACKAGE_FORMAT_VERSION,
37
+ notes: params.skills.notes,
38
+ },
39
+ };
40
+ }
41
+ function buildExportReport(params) {
42
+ return {
43
+ packageName: params.packageName,
44
+ workspacePath: params.workspacePath,
45
+ includedFiles: params.scan.includedFiles.map((file) => file.relativePath),
46
+ excludedFiles: params.scan.excludedFiles,
47
+ ignoredFiles: params.scan.ignoredFiles,
48
+ warnings: params.warnings ?? [],
49
+ skills: params.skills,
50
+ };
51
+ }
52
+ function buildExportArtifacts(params) {
53
+ return {
54
+ manifest: buildManifest(params),
55
+ checksums: params.checksums,
56
+ exportReport: buildExportReport(params),
57
+ };
58
+ }
59
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":";;;;;AAIA,sCAmCC;AAED,8CAgBC;AAED,oDAcC;AAzED,0DAA6B;AAC7B,2CAA6F;AAG7F,SAAgB,aAAa,CAAC,MAM7B;IACC,MAAM,aAAa,GAAG,mBAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1D,OAAO;QACL,aAAa,EAAE,kCAAsB;QACrC,WAAW,EAAE,wBAAY;QACzB,IAAI,EAAE,MAAM,CAAC,WAAW;QACxB,UAAU,EAAE,uBAAW;QACvB,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW;YACjD,aAAa;YACb,eAAe,EAAE,SAAS;SAC3B;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC;YAC1E,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,uBAAW;YACnB,eAAe,EAAE,IAAI;SACtB;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,IAAI;YACrB,gBAAgB,EAAE,IAAI;SACvB;QACD,aAAa,EAAE;YACb,gBAAgB,EAAE,kCAAsB;YACxC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAMjC;IACC,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC;QACzE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa;QACxC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;QACtC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAQpC;IACC,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,iBAAiB,CAAC,MAAM,CAAC;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { AgentDefinition } from './types';
2
+ export interface MinimalOpenClawConfig {
3
+ agents?: Record<string, {
4
+ id?: string;
5
+ name?: string;
6
+ workspace?: string;
7
+ identity?: {
8
+ name?: string;
9
+ };
10
+ model?: {
11
+ default?: string;
12
+ };
13
+ [key: string]: unknown;
14
+ }>;
15
+ [key: string]: unknown;
16
+ }
17
+ export declare function discoverOpenClawConfig(params?: {
18
+ configPath?: string;
19
+ cwd?: string;
20
+ }): Promise<{
21
+ configPath: string;
22
+ }>;
23
+ export declare function loadOpenClawConfig(params: {
24
+ configPath?: string;
25
+ cwd?: string;
26
+ }): Promise<{
27
+ configPath: string;
28
+ config: MinimalOpenClawConfig;
29
+ }>;
30
+ export declare function extractPortableAgentDefinition(params: {
31
+ config: MinimalOpenClawConfig;
32
+ configPath: string;
33
+ workspacePath: string;
34
+ agentId?: string;
35
+ }): AgentDefinition;
36
+ export declare function upsertPortableAgentDefinition(params: {
37
+ configPath: string;
38
+ portableAgentDefinition: AgentDefinition;
39
+ targetAgentId: string;
40
+ targetWorkspacePath: string;
41
+ force?: boolean;
42
+ }): Promise<{
43
+ configPath: string;
44
+ created: boolean;
45
+ updated: boolean;
46
+ }>;
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.discoverOpenClawConfig = discoverOpenClawConfig;
7
+ exports.loadOpenClawConfig = loadOpenClawConfig;
8
+ exports.extractPortableAgentDefinition = extractPortableAgentDefinition;
9
+ exports.upsertPortableAgentDefinition = upsertPortableAgentDefinition;
10
+ const promises_1 = require("node:fs/promises");
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const promises_2 = require("node:fs/promises");
13
+ async function discoverOpenClawConfig(params = {}) {
14
+ const candidates = params.configPath
15
+ ? [node_path_1.default.resolve(params.configPath)]
16
+ : [
17
+ node_path_1.default.resolve(params.cwd ?? process.cwd(), 'openclaw-config.json'),
18
+ node_path_1.default.resolve(params.cwd ?? process.cwd(), 'openclaw-config.jsonc'),
19
+ node_path_1.default.resolve(process.env.HOME ?? '~', '.openclaw', 'config.json'),
20
+ node_path_1.default.resolve(process.env.HOME ?? '~', '.openclaw', 'config.jsonc'),
21
+ ];
22
+ for (const candidate of candidates) {
23
+ try {
24
+ await (0, promises_1.access)(candidate);
25
+ return { configPath: candidate };
26
+ }
27
+ catch { }
28
+ }
29
+ throw new Error(`OpenClaw config not found. Checked: ${candidates.join(', ')}`);
30
+ }
31
+ async function loadOpenClawConfig(params) {
32
+ const discovered = await discoverOpenClawConfig(params);
33
+ const raw = await (0, promises_2.readFile)(discovered.configPath, 'utf8');
34
+ return {
35
+ configPath: discovered.configPath,
36
+ config: parseJsonc(raw),
37
+ };
38
+ }
39
+ function extractPortableAgentDefinition(params) {
40
+ const workspaceBasename = node_path_1.default.basename(params.workspacePath);
41
+ const fallbackId = workspaceBasename.replace(/^workspace-/, '');
42
+ const selectedAgentId = params.agentId ?? findAgentIdByWorkspace(params.config, params.workspacePath) ?? fallbackId;
43
+ const sourceAgent = params.config.agents?.[selectedAgentId];
44
+ if (!sourceAgent) {
45
+ throw new Error(`Agent not found in OpenClaw config: ${selectedAgentId}`);
46
+ }
47
+ const suggestedName = sourceAgent.name ?? sourceAgent.identity?.name ?? toTitleCase(selectedAgentId.replace(/-/g, ' '));
48
+ const identityName = sourceAgent.identity?.name ?? suggestedName;
49
+ return {
50
+ agent: {
51
+ suggestedId: selectedAgentId,
52
+ suggestedName,
53
+ workspace: {
54
+ suggestedBasename: workspaceBasename,
55
+ },
56
+ identity: {
57
+ name: identityName,
58
+ },
59
+ model: sourceAgent.model?.default ? { default: sourceAgent.model.default } : undefined,
60
+ },
61
+ fieldClassification: {
62
+ 'agent.suggestedId': 'requiresInputOnImport',
63
+ 'agent.suggestedName': 'portable',
64
+ 'agent.workspace.suggestedBasename': 'requiresInputOnImport',
65
+ 'agent.identity.name': 'portable',
66
+ ...(sourceAgent.model?.default ? { 'agent.model.default': 'portable' } : {}),
67
+ 'agent.channelBindings': 'excluded',
68
+ 'agent.secrets': 'excluded',
69
+ },
70
+ notes: [`Portable agent definition derived from OpenClaw config at ${params.configPath}.`],
71
+ };
72
+ }
73
+ async function upsertPortableAgentDefinition(params) {
74
+ const resolvedPath = node_path_1.default.resolve(params.configPath);
75
+ let config = {};
76
+ let existed = false;
77
+ try {
78
+ const raw = await (0, promises_2.readFile)(resolvedPath, 'utf8');
79
+ config = parseJsonc(raw);
80
+ existed = true;
81
+ }
82
+ catch { }
83
+ config.agents ??= {};
84
+ if (config.agents[params.targetAgentId] && !params.force) {
85
+ throw new Error(`Target agent already exists in OpenClaw config: ${params.targetAgentId}`);
86
+ }
87
+ config.agents[params.targetAgentId] = {
88
+ id: params.targetAgentId,
89
+ name: params.portableAgentDefinition.agent.suggestedName,
90
+ workspace: params.targetWorkspacePath,
91
+ identity: {
92
+ name: params.portableAgentDefinition.agent.identity.name,
93
+ },
94
+ ...(params.portableAgentDefinition.agent.model?.default
95
+ ? {
96
+ model: {
97
+ default: params.portableAgentDefinition.agent.model.default,
98
+ },
99
+ }
100
+ : {}),
101
+ };
102
+ await (0, promises_1.mkdir)(node_path_1.default.dirname(resolvedPath), { recursive: true });
103
+ await (0, promises_2.writeFile)(resolvedPath, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
104
+ return { configPath: resolvedPath, created: !existed, updated: existed };
105
+ }
106
+ function parseJsonc(value) {
107
+ const withoutComments = value
108
+ .replace(/^\s*\/\/.*$/gm, '')
109
+ .replace(/\/\*[\s\S]*?\*\//g, '');
110
+ return JSON.parse(withoutComments);
111
+ }
112
+ function findAgentIdByWorkspace(config, workspacePath) {
113
+ for (const [agentId, agent] of Object.entries(config.agents ?? {})) {
114
+ if (agent.workspace && node_path_1.default.basename(agent.workspace) === node_path_1.default.basename(workspacePath)) {
115
+ return agentId;
116
+ }
117
+ }
118
+ return undefined;
119
+ }
120
+ function toTitleCase(value) {
121
+ return value
122
+ .split(/\s+/)
123
+ .filter(Boolean)
124
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
125
+ .join(' ');
126
+ }
127
+ //# sourceMappingURL=openclaw-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-config.js","sourceRoot":"","sources":["../../src/core/openclaw-config.ts"],"names":[],"mappings":";;;;;AAqBA,wDAkBC;AAED,gDAOC;AAED,wEAyCC;AAED,sEA0CC;AAvID,+CAAiD;AACjD,0DAA6B;AAE7B,+CAAuD;AAkBhD,KAAK,UAAU,sBAAsB,CAAC,SAAgD,EAAE;IAC7F,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU;QAClC,CAAC,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC,CAAC;YACE,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC;YACjE,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC;YAClE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC;YACjE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,EAAE,cAAc,CAAC;SACnE,CAAC;IAEN,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,IAAA,iBAAM,EAAC,SAAS,CAAC,CAAC;YACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClF,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,MAA6C;IACpF,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,MAAM,EAAE,UAAU,CAAC,GAAG,CAA0B;KACjD,CAAC;AACJ,CAAC;AAED,SAAgB,8BAA8B,CAAC,MAK9C;IACC,MAAM,iBAAiB,GAAG,mBAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC;IACpH,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,CAAC;IAE5D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,eAAe,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,IAAI,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACxH,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,IAAI,aAAa,CAAC;IAEjE,OAAO;QACL,KAAK,EAAE;YACL,WAAW,EAAE,eAAe;YAC5B,aAAa;YACb,SAAS,EAAE;gBACT,iBAAiB,EAAE,iBAAiB;aACrC;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,YAAY;aACnB;YACD,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;SACvF;QACD,mBAAmB,EAAE;YACnB,mBAAmB,EAAE,uBAAuB;YAC5C,qBAAqB,EAAE,UAAU;YACjC,mCAAmC,EAAE,uBAAuB;YAC5D,qBAAqB,EAAE,UAAU;YACjC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,uBAAuB,EAAE,UAAU;YACnC,eAAe,EAAE,UAAU;SAC5B;QACD,KAAK,EAAE,CAAC,6DAA6D,MAAM,CAAC,UAAU,GAAG,CAAC;KAC3F,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,6BAA6B,CAAC,MAMnD;IACC,MAAM,YAAY,GAAG,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,MAAM,GAA0B,EAAE,CAAC;IACvC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,GAAG,UAAU,CAAC,GAAG,CAA0B,CAAC;QAClD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC;IACrB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,mDAAmD,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;QACpC,EAAE,EAAE,MAAM,CAAC,aAAa;QACxB,IAAI,EAAE,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,aAAa;QACxD,SAAS,EAAE,MAAM,CAAC,mBAAmB;QACrC,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;SACzD;QACD,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO;YACrD,CAAC,CAAC;gBACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO;iBAC5D;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,IAAA,gBAAK,EAAC,mBAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAA,oBAAS,EAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE9E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,eAAe,GAAG,KAAK;SAC1B,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA6B,EAAE,aAAqB;IAClF,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,IAAI,KAAK,CAAC,SAAS,IAAI,mBAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,mBAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACvF,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ReadPackageResult } from './types';
2
+ export declare function readPackageDirectory(packageRoot: string): Promise<ReadPackageResult>;