@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,64 @@
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.readPackageDirectory = readPackageDirectory;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const constants_1 = require("./constants");
10
+ const checksums_1 = require("./checksums");
11
+ const json_1 = require("../utils/json");
12
+ async function readPackageDirectory(packageRoot) {
13
+ const resolvedRoot = node_path_1.default.resolve(packageRoot);
14
+ const requiredPaths = [
15
+ 'manifest.json',
16
+ 'config/agent.json',
17
+ 'config/skills-manifest.json',
18
+ 'config/import-hints.json',
19
+ 'meta/checksums.json',
20
+ 'meta/export-report.json',
21
+ 'workspace',
22
+ ];
23
+ for (const relativePath of requiredPaths) {
24
+ try {
25
+ await (0, promises_1.access)(node_path_1.default.join(resolvedRoot, relativePath));
26
+ }
27
+ catch {
28
+ throw new Error(`Invalid package structure: missing ${relativePath}`);
29
+ }
30
+ }
31
+ const manifest = await (0, json_1.readJsonFile)(node_path_1.default.join(resolvedRoot, 'manifest.json'));
32
+ if (manifest.packageType !== constants_1.PACKAGE_TYPE) {
33
+ throw new Error(`Unsupported package type: ${manifest.packageType}`);
34
+ }
35
+ if (manifest.formatVersion !== constants_1.PACKAGE_FORMAT_VERSION) {
36
+ throw new Error(`Unsupported format version: ${manifest.formatVersion}`);
37
+ }
38
+ const agentDefinition = await (0, json_1.readJsonFile)(node_path_1.default.join(resolvedRoot, 'config', 'agent.json'));
39
+ const skillsManifest = await (0, json_1.readJsonFile)(node_path_1.default.join(resolvedRoot, 'config', 'skills-manifest.json'));
40
+ const importHints = await (0, json_1.readJsonFile)(node_path_1.default.join(resolvedRoot, 'config', 'import-hints.json'));
41
+ const checksums = await (0, json_1.readJsonFile)(node_path_1.default.join(resolvedRoot, 'meta', 'checksums.json'));
42
+ const exportReport = await (0, json_1.readJsonFile)(node_path_1.default.join(resolvedRoot, 'meta', 'export-report.json'));
43
+ for (const [relativePath, expectedChecksum] of Object.entries(checksums)) {
44
+ const actualChecksum = await (0, checksums_1.checksumFile)(node_path_1.default.join(resolvedRoot, relativePath));
45
+ if (actualChecksum !== expectedChecksum) {
46
+ throw new Error(`Checksum mismatch for ${relativePath}`);
47
+ }
48
+ }
49
+ const workspaceFiles = manifest.includes.workspaceFiles.map((relativePath) => ({
50
+ relativePath,
51
+ absolutePath: node_path_1.default.join(resolvedRoot, 'workspace', relativePath),
52
+ }));
53
+ return {
54
+ packageRoot: resolvedRoot,
55
+ manifest,
56
+ agentDefinition,
57
+ skillsManifest,
58
+ importHints,
59
+ checksums,
60
+ exportReport,
61
+ workspaceFiles,
62
+ };
63
+ }
64
+ //# sourceMappingURL=package-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-read.js","sourceRoot":"","sources":["../../src/core/package-read.ts"],"names":[],"mappings":";;;;;AAOA,oDAwDC;AA/DD,+CAA0C;AAC1C,0DAA6B;AAC7B,2CAAmE;AACnE,2CAA2C;AAE3C,wCAA6C;AAEtC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,YAAY,GAAG,mBAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG;QACpB,eAAe;QACf,mBAAmB;QACnB,6BAA6B;QAC7B,0BAA0B;QAC1B,qBAAqB;QACrB,yBAAyB;QACzB,WAAW;KACZ,CAAC;IAEF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAA,iBAAM,EAAC,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAY,EAAkB,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;IAC/F,IAAI,QAAQ,CAAC,WAAW,KAAK,wBAAY,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,QAAQ,CAAC,aAAa,KAAK,kCAAsB,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,IAAA,mBAAY,EAAkB,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAC7G,MAAM,cAAc,GAAG,MAAM,IAAA,mBAAY,EAAiB,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACrH,MAAM,WAAW,GAAG,MAAM,IAAA,mBAAY,EAAc,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC5G,MAAM,SAAS,GAAG,MAAM,IAAA,mBAAY,EAAyB,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAChH,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAY,EAAe,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE7G,KAAK,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACzE,MAAM,cAAc,GAAG,MAAM,IAAA,wBAAY,EAAC,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;QACjF,IAAI,cAAc,KAAK,gBAAgB,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC7E,YAAY;QACZ,YAAY,EAAE,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC;KACjE,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,WAAW,EAAE,YAAY;QACzB,QAAQ;QACR,eAAe;QACf,cAAc;QACd,WAAW;QACX,SAAS;QACT,YAAY;QACZ,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AgentDefinition, ExportPackageResult, SkillsManifest, WorkspaceScanResult } from './types';
2
+ export declare function writePackageDirectory(params: {
3
+ outputPath: string;
4
+ packageName: string;
5
+ scan: WorkspaceScanResult;
6
+ skills: SkillsManifest;
7
+ agentDefinition: AgentDefinition;
8
+ }): Promise<ExportPackageResult>;
@@ -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.writePackageDirectory = writePackageDirectory;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const checksums_1 = require("./checksums");
10
+ const manifest_1 = require("./manifest");
11
+ async function writePackageDirectory(params) {
12
+ await (0, promises_1.rm)(params.outputPath, { recursive: true, force: true });
13
+ await (0, promises_1.mkdir)(node_path_1.default.join(params.outputPath, 'workspace'), { recursive: true });
14
+ await (0, promises_1.mkdir)(node_path_1.default.join(params.outputPath, 'config'), { recursive: true });
15
+ await (0, promises_1.mkdir)(node_path_1.default.join(params.outputPath, 'meta'), { recursive: true });
16
+ const checksums = {};
17
+ for (const file of params.scan.includedFiles) {
18
+ const targetPath = node_path_1.default.join(params.outputPath, 'workspace', file.relativePath);
19
+ await (0, promises_1.cp)(file.absolutePath, targetPath);
20
+ checksums[node_path_1.default.posix.join('workspace', file.relativePath)] = await (0, checksums_1.checksumFile)(targetPath);
21
+ }
22
+ const importHints = {
23
+ requiredInputs: [{ key: 'agentId', reason: 'Target instance may already contain the source agent id.' }],
24
+ warnings: [
25
+ 'Channel bindings are not included in v1 packages.',
26
+ 'Skills are manifest-only and may require manual installation.',
27
+ ],
28
+ };
29
+ const skillsJson = JSON.stringify(params.skills, null, 2);
30
+ const agentJson = JSON.stringify(params.agentDefinition, null, 2);
31
+ const importHintsJson = JSON.stringify(importHints, null, 2);
32
+ await (0, promises_1.writeFile)(node_path_1.default.join(params.outputPath, 'config', 'skills-manifest.json'), `${skillsJson}\n`, 'utf8');
33
+ await (0, promises_1.writeFile)(node_path_1.default.join(params.outputPath, 'config', 'agent.json'), `${agentJson}\n`, 'utf8');
34
+ await (0, promises_1.writeFile)(node_path_1.default.join(params.outputPath, 'config', 'import-hints.json'), `${importHintsJson}\n`, 'utf8');
35
+ checksums['config/skills-manifest.json'] = (0, checksums_1.checksumText)(`${skillsJson}\n`);
36
+ checksums['config/agent.json'] = (0, checksums_1.checksumText)(`${agentJson}\n`);
37
+ checksums['config/import-hints.json'] = (0, checksums_1.checksumText)(`${importHintsJson}\n`);
38
+ const artifacts = (0, manifest_1.buildExportArtifacts)({
39
+ packageName: params.packageName,
40
+ workspacePath: params.scan.workspacePath,
41
+ scan: params.scan,
42
+ skills: params.skills,
43
+ agentDefinition: params.agentDefinition,
44
+ checksums,
45
+ warnings: importHints.warnings,
46
+ });
47
+ const manifestJson = JSON.stringify(artifacts.manifest, null, 2);
48
+ const checksumsJson = JSON.stringify(artifacts.checksums, null, 2);
49
+ const reportJson = JSON.stringify(artifacts.exportReport, null, 2);
50
+ await (0, promises_1.writeFile)(node_path_1.default.join(params.outputPath, 'manifest.json'), `${manifestJson}\n`, 'utf8');
51
+ await (0, promises_1.writeFile)(node_path_1.default.join(params.outputPath, 'meta', 'checksums.json'), `${checksumsJson}\n`, 'utf8');
52
+ await (0, promises_1.writeFile)(node_path_1.default.join(params.outputPath, 'meta', 'export-report.json'), `${reportJson}\n`, 'utf8');
53
+ return {
54
+ packageRoot: params.outputPath,
55
+ manifestPath: node_path_1.default.join(params.outputPath, 'manifest.json'),
56
+ fileCount: Object.keys(checksums).length + 3,
57
+ };
58
+ }
59
+ //# sourceMappingURL=package-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-write.js","sourceRoot":"","sources":["../../src/core/package-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { SkillsManifest, WorkspaceScanResult } from './types';
2
+ export declare function detectSkills(scan: WorkspaceScanResult): Promise<SkillsManifest>;
@@ -0,0 +1,43 @@
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.detectSkills = detectSkills;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const constants_1 = require("./constants");
10
+ async function detectSkills(scan) {
11
+ const workspaceSkills = await detectWorkspaceSkills(scan.workspacePath);
12
+ const referencedSkills = new Set();
13
+ for (const file of scan.includedFiles) {
14
+ if (!file.relativePath.endsWith('.md'))
15
+ continue;
16
+ const content = await (0, promises_1.readFile)(file.absolutePath, 'utf8');
17
+ for (const pattern of constants_1.SKILL_REFERENCE_PATTERNS) {
18
+ for (const match of content.matchAll(pattern)) {
19
+ const candidate = match[1]?.trim();
20
+ if (candidate) {
21
+ referencedSkills.add(candidate);
22
+ }
23
+ }
24
+ }
25
+ }
26
+ return {
27
+ mode: constants_1.SKILLS_MODE,
28
+ workspaceSkills,
29
+ referencedSkills: [...referencedSkills].sort(),
30
+ notes: ['Install or verify referenced skills on the target OpenClaw instance.'],
31
+ };
32
+ }
33
+ async function detectWorkspaceSkills(workspacePath) {
34
+ const skillsPath = node_path_1.default.join(workspacePath, 'skills');
35
+ try {
36
+ await (0, promises_1.access)(skillsPath);
37
+ return ['skills/'];
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ }
43
+ //# sourceMappingURL=skills-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-detect.js","sourceRoot":"","sources":["../../src/core/skills-detect.ts"],"names":[],"mappings":";;;;;AAKA,oCAuBC;AA5BD,+CAAoD;AACpD,0DAA6B;AAC7B,2CAAoE;AAG7D,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,eAAe,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACjD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC1D,KAAK,MAAM,OAAO,IAAI,oCAAwB,EAAE,CAAC;YAC/C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBACnC,IAAI,SAAS,EAAE,CAAC;oBACd,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,uBAAW;QACjB,eAAe;QACf,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,EAAE;QAC9C,KAAK,EAAE,CAAC,sEAAsE,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,aAAqB;IACxD,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,IAAA,iBAAM,EAAC,UAAU,CAAC,CAAC;QACzB,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,151 @@
1
+ export interface IncludedWorkspaceFile {
2
+ relativePath: string;
3
+ absolutePath: string;
4
+ required: boolean;
5
+ }
6
+ export interface ExcludedWorkspaceFile {
7
+ relativePath: string;
8
+ reason: string;
9
+ }
10
+ export interface WorkspaceScanResult {
11
+ workspacePath: string;
12
+ includedFiles: IncludedWorkspaceFile[];
13
+ excludedFiles: ExcludedWorkspaceFile[];
14
+ missingOptionalFiles: string[];
15
+ ignoredFiles: string[];
16
+ }
17
+ export interface SkillsManifest {
18
+ mode: 'manifest-only';
19
+ workspaceSkills: string[];
20
+ referencedSkills: string[];
21
+ notes: string[];
22
+ }
23
+ export interface AgentDefinition {
24
+ agent: {
25
+ suggestedId: string;
26
+ suggestedName: string;
27
+ workspace: {
28
+ suggestedBasename: string;
29
+ };
30
+ identity: {
31
+ name: string;
32
+ };
33
+ model?: {
34
+ default: string;
35
+ };
36
+ };
37
+ fieldClassification: Record<string, 'portable' | 'requiresInputOnImport' | 'excluded'>;
38
+ notes: string[];
39
+ }
40
+ export interface ImportHints {
41
+ requiredInputs: Array<{
42
+ key: 'agentId' | 'targetWorkspacePath';
43
+ reason: string;
44
+ }>;
45
+ warnings: string[];
46
+ }
47
+ export interface PackageManifest {
48
+ formatVersion: number;
49
+ packageType: string;
50
+ name: string;
51
+ exportMode: string;
52
+ source: {
53
+ agentId: string;
54
+ workspaceName: string;
55
+ openclawVersion: string;
56
+ };
57
+ includes: {
58
+ workspaceFiles: string[];
59
+ dailyMemory: boolean;
60
+ skills: 'manifest-only';
61
+ agentDefinition: boolean;
62
+ };
63
+ excludes: {
64
+ secrets: boolean;
65
+ sessionState: boolean;
66
+ channelBindings: boolean;
67
+ globalExtensions: boolean;
68
+ };
69
+ compatibility: {
70
+ minFormatVersion: number;
71
+ notes: string[];
72
+ };
73
+ }
74
+ export interface ExportReport {
75
+ packageName: string;
76
+ workspacePath: string;
77
+ includedFiles: string[];
78
+ excludedFiles: ExcludedWorkspaceFile[];
79
+ ignoredFiles: string[];
80
+ warnings: string[];
81
+ skills: SkillsManifest;
82
+ }
83
+ export interface ExportArtifacts {
84
+ manifest: PackageManifest;
85
+ checksums: Record<string, string>;
86
+ exportReport: ExportReport;
87
+ }
88
+ export interface ExportPackageInput {
89
+ sourceWorkspacePath: string;
90
+ outputPath: string;
91
+ packageName?: string;
92
+ }
93
+ export interface ExportPackageResult {
94
+ packageRoot: string;
95
+ manifestPath: string;
96
+ fileCount: number;
97
+ }
98
+ export interface ReadPackageResult {
99
+ packageRoot: string;
100
+ manifest: PackageManifest;
101
+ agentDefinition: AgentDefinition;
102
+ skillsManifest: SkillsManifest;
103
+ importHints: ImportHints;
104
+ checksums: Record<string, string>;
105
+ exportReport: ExportReport;
106
+ workspaceFiles: Array<{
107
+ relativePath: string;
108
+ absolutePath: string;
109
+ }>;
110
+ }
111
+ export interface ImportWritePlan {
112
+ workspaceFiles: Array<{
113
+ sourcePath: string;
114
+ targetPath: string;
115
+ relativePath: string;
116
+ }>;
117
+ overwriteExisting: boolean;
118
+ targetWorkspacePath: string;
119
+ targetAgentId: string;
120
+ metadataDirectory: string;
121
+ targetConfigPath?: string;
122
+ summary: {
123
+ fileCount: number;
124
+ existingWorkspaceDetected: boolean;
125
+ targetConfigDetected: boolean;
126
+ configAgentCollision: boolean;
127
+ };
128
+ }
129
+ export interface ImportPlan {
130
+ canProceed: boolean;
131
+ requiredInputs: ImportHints['requiredInputs'];
132
+ warnings: string[];
133
+ failed: string[];
134
+ nextSteps: string[];
135
+ writePlan: ImportWritePlan;
136
+ }
137
+ export interface ImportResult {
138
+ status: 'ok';
139
+ importedFiles: string[];
140
+ metadataFiles: string[];
141
+ warnings: string[];
142
+ nextSteps: string[];
143
+ targetWorkspacePath: string;
144
+ agentId: string;
145
+ }
146
+ export interface ValidationReport {
147
+ passed: string[];
148
+ warnings: string[];
149
+ failed: string[];
150
+ nextSteps: string[];
151
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { ValidationReport } from './types';
2
+ export declare function validateImportedWorkspace(params: {
3
+ targetWorkspacePath: string;
4
+ agentId?: string;
5
+ targetConfigPath?: string;
6
+ }): Promise<ValidationReport>;
@@ -0,0 +1,89 @@
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.validateImportedWorkspace = validateImportedWorkspace;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const constants_1 = require("./constants");
10
+ const json_1 = require("../utils/json");
11
+ const openclaw_config_1 = require("./openclaw-config");
12
+ async function validateImportedWorkspace(params) {
13
+ const targetWorkspacePath = node_path_1.default.resolve(params.targetWorkspacePath);
14
+ const report = {
15
+ passed: [],
16
+ warnings: [],
17
+ failed: [],
18
+ nextSteps: [],
19
+ };
20
+ if (await pathExists(targetWorkspacePath)) {
21
+ report.passed.push(`Workspace exists: ${targetWorkspacePath}`);
22
+ }
23
+ else {
24
+ report.failed.push(`Workspace is missing: ${targetWorkspacePath}`);
25
+ return report;
26
+ }
27
+ for (const file of constants_1.REQUIRED_WORKSPACE_FILES) {
28
+ if (await pathExists(node_path_1.default.join(targetWorkspacePath, file))) {
29
+ report.passed.push(`Workspace file present: ${file}`);
30
+ }
31
+ else {
32
+ report.failed.push(`Missing required workspace file: ${file}`);
33
+ }
34
+ }
35
+ const metadataDirectory = node_path_1.default.join(targetWorkspacePath, '.openclaw-agent-package');
36
+ const agentRecordPath = node_path_1.default.join(metadataDirectory, 'agent-definition.json');
37
+ if (await pathExists(agentRecordPath)) {
38
+ const agentRecord = await (0, json_1.readJsonFile)(agentRecordPath);
39
+ if (!params.agentId || agentRecord.agentId === params.agentId) {
40
+ report.passed.push(`Portable agent definition record present: ${agentRecordPath}`);
41
+ }
42
+ else {
43
+ report.failed.push(`Imported agent record id mismatch: expected ${params.agentId}, got ${agentRecord.agentId ?? 'unknown'}`);
44
+ }
45
+ }
46
+ else {
47
+ report.failed.push(`Missing imported agent definition record: ${agentRecordPath}`);
48
+ }
49
+ if (params.targetConfigPath) {
50
+ const { configPath, config } = await (0, openclaw_config_1.loadOpenClawConfig)({ configPath: params.targetConfigPath });
51
+ if (!params.agentId) {
52
+ report.warnings.push(`OpenClaw config consistency check skipped for ${configPath} because --agent-id was not provided.`);
53
+ }
54
+ else {
55
+ const configAgent = config.agents?.[params.agentId];
56
+ if (!configAgent) {
57
+ report.failed.push(`OpenClaw config agent missing: ${params.agentId} (${configPath})`);
58
+ report.nextSteps.push('Re-run import with --config or add the target agent entry manually to the OpenClaw config.');
59
+ }
60
+ else {
61
+ report.passed.push(`OpenClaw config agent present: ${params.agentId} (${configPath})`);
62
+ const resolvedConfigWorkspace = configAgent.workspace ? node_path_1.default.resolve(configAgent.workspace) : undefined;
63
+ if (!resolvedConfigWorkspace) {
64
+ report.failed.push(`OpenClaw config agent workspace missing: ${params.agentId} (${configPath})`);
65
+ }
66
+ else if (resolvedConfigWorkspace === targetWorkspacePath) {
67
+ report.passed.push(`OpenClaw config workspace matches imported workspace: ${resolvedConfigWorkspace}`);
68
+ }
69
+ else {
70
+ report.failed.push(`OpenClaw config workspace mismatch for ${params.agentId}: expected ${targetWorkspacePath}, got ${resolvedConfigWorkspace}`);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ report.warnings.push('Skills are manifest-only and may require manual installation.');
76
+ report.nextSteps.push('Channel bindings must be configured manually on the target instance.');
77
+ report.nextSteps.push('Review imported USER.md, TOOLS.md, and MEMORY.md for target-specific adjustments.');
78
+ return report;
79
+ }
80
+ async function pathExists(targetPath) {
81
+ try {
82
+ await (0, promises_1.access)(targetPath);
83
+ return true;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { WorkspaceScanResult } from './types';
2
+ export declare function scanWorkspace(workspacePath: string): Promise<WorkspaceScanResult>;
@@ -0,0 +1,57 @@
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.scanWorkspace = scanWorkspace;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const constants_1 = require("./constants");
10
+ async function scanWorkspace(workspacePath) {
11
+ const entries = await (0, promises_1.readdir)(workspacePath, { withFileTypes: true });
12
+ const includedFiles = [];
13
+ const excludedFiles = [];
14
+ const missingOptionalFiles = [];
15
+ const ignoredFiles = [];
16
+ for (const file of constants_1.ALLOWED_WORKSPACE_FILES) {
17
+ const absolutePath = node_path_1.default.join(workspacePath, file);
18
+ try {
19
+ await (0, promises_1.access)(absolutePath);
20
+ includedFiles.push({
21
+ relativePath: file,
22
+ absolutePath,
23
+ required: !constants_1.OPTIONAL_WORKSPACE_FILES.includes(file),
24
+ });
25
+ }
26
+ catch {
27
+ if (constants_1.OPTIONAL_WORKSPACE_FILES.includes(file)) {
28
+ missingOptionalFiles.push(file);
29
+ }
30
+ }
31
+ }
32
+ for (const entry of entries) {
33
+ if (entry.name === 'memory' && entry.isDirectory()) {
34
+ const memoryEntries = await (0, promises_1.readdir)(node_path_1.default.join(workspacePath, 'memory'), { withFileTypes: true });
35
+ for (const memoryEntry of memoryEntries) {
36
+ if (memoryEntry.isFile() && memoryEntry.name.endsWith('.md')) {
37
+ excludedFiles.push({
38
+ relativePath: node_path_1.default.posix.join('memory', memoryEntry.name),
39
+ reason: 'Excluded by default daily memory policy',
40
+ });
41
+ }
42
+ }
43
+ continue;
44
+ }
45
+ if (!constants_1.ALLOWED_WORKSPACE_FILES.includes(entry.name)) {
46
+ ignoredFiles.push(entry.name);
47
+ }
48
+ }
49
+ return {
50
+ workspacePath,
51
+ includedFiles: includedFiles.sort((a, b) => a.relativePath.localeCompare(b.relativePath)),
52
+ excludedFiles: excludedFiles.sort((a, b) => a.relativePath.localeCompare(b.relativePath)),
53
+ missingOptionalFiles: missingOptionalFiles.sort(),
54
+ ignoredFiles: ignoredFiles.sort(),
55
+ };
56
+ }
57
+ //# sourceMappingURL=workspace-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-scan.js","sourceRoot":"","sources":["../../src/core/workspace-scan.ts"],"names":[],"mappings":";;;;;AAKA,sCAiDC;AAtDD,+CAAmD;AACnD,0DAA6B;AAC7B,2CAAgF;AAGzE,KAAK,UAAU,aAAa,CAAC,aAAqB;IACvD,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,EAA0C,CAAC;IACjE,MAAM,aAAa,GAAG,EAA0C,CAAC;IACjE,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,mCAAuB,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,IAAA,iBAAM,EAAC,YAAY,CAAC,CAAC;YAC3B,aAAa,CAAC,IAAI,CAAC;gBACjB,YAAY,EAAE,IAAI;gBAClB,YAAY;gBACZ,QAAQ,EAAE,CAAC,oCAAwB,CAAC,QAAQ,CAAC,IAAiD,CAAC;aAChG,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,oCAAwB,CAAC,QAAQ,CAAC,IAAiD,CAAC,EAAE,CAAC;gBACzF,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACnD,MAAM,aAAa,GAAG,MAAM,IAAA,kBAAO,EAAC,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACjG,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;gBACxC,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7D,aAAa,CAAC,IAAI,CAAC;wBACjB,YAAY,EAAE,mBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC;wBACzD,MAAM,EAAE,yCAAyC;qBAClD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,mCAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAgD,CAAC,EAAE,CAAC;YAC9F,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa;QACb,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACzF,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACzF,oBAAoB,EAAE,oBAAoB,CAAC,IAAI,EAAE;QACjD,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function readJsonFile<T>(filePath: string): Promise<T>;
2
+ export declare function writeJsonFile(filePath: string, value: unknown): Promise<void>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readJsonFile = readJsonFile;
4
+ exports.writeJsonFile = writeJsonFile;
5
+ const promises_1 = require("node:fs/promises");
6
+ async function readJsonFile(filePath) {
7
+ return JSON.parse(await (0, promises_1.readFile)(filePath, 'utf8'));
8
+ }
9
+ async function writeJsonFile(filePath, value) {
10
+ await (0, promises_1.writeFile)(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
11
+ }
12
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":";;AAEA,oCAEC;AAED,sCAEC;AARD,+CAAuD;AAEhD,KAAK,UAAU,YAAY,CAAI,QAAgB;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAM,CAAC;AAC3D,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAc;IAClE,MAAM,IAAA,oBAAS,EAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3E,CAAC"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@cogineai/clawpacker",
3
+ "version": "0.1.0",
4
+ "description": "Portable OpenClaw agent/workspace template CLI for inspect/export/import/validate workflows.",
5
+ "bin": {
6
+ "clawpacker": "dist/cli.js"
7
+ },
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "LICENSE"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.json",
15
+ "dev": "tsx src/cli.ts",
16
+ "test": "node --test"
17
+ },
18
+ "engines": {
19
+ "node": ">=20"
20
+ },
21
+ "dependencies": {
22
+ "commander": "^13.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^22.13.10",
26
+ "tsx": "^4.19.3",
27
+ "typescript": "^5.8.2"
28
+ },
29
+ "repository": "https://github.com/cogine-ai/clawpack",
30
+ "homepage": "https://github.com/cogine-ai/clawpack",
31
+ "bugs": "https://github.com/cogine-ai/clawpack/issues",
32
+ "license": "MIT"
33
+ }