@dharma-ai-labs/agent-fabric-skill-manager 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.
@@ -0,0 +1,73 @@
1
+ import { type KeyObject } from 'node:crypto';
2
+ import { type ProviderId } from '@dharma-ai-labs/agent-fabric-contracts';
3
+ import { type OrganizationPolicy } from '@dharma-ai-labs/agent-fabric-policy';
4
+ export interface SkillBundle {
5
+ schema: 'dharma.skill-bundle/v1';
6
+ bundleId: string;
7
+ organizationId: string;
8
+ version: string;
9
+ operation: 'install' | 'clear';
10
+ skills: Array<{
11
+ skillId: string;
12
+ version: string;
13
+ repository: string;
14
+ commit: string;
15
+ contentHash: string;
16
+ path: string;
17
+ files?: Array<{
18
+ path: string;
19
+ contentBase64: string;
20
+ sha256: string;
21
+ }>;
22
+ }>;
23
+ riskClass: 'R0' | 'R1' | 'R2' | 'R3' | 'R4';
24
+ targetSelectors: Record<string, unknown>;
25
+ activationPolicy: 'next_task' | 'next_session' | 'host_restart' | 'immediate_safe_reload';
26
+ rollbackBundleId: string | null;
27
+ evaluationReceiptId: string;
28
+ bundleHash: string;
29
+ createdAt: string;
30
+ expiresAt?: string | null;
31
+ signature: string;
32
+ }
33
+ export interface InstallReceipt {
34
+ schema: 'dharma.install-receipt/v1';
35
+ installationId: string;
36
+ organizationId: string;
37
+ deviceId: string;
38
+ workspaceId: string;
39
+ provider: string;
40
+ bundleId: string;
41
+ previousBundleId: string | null;
42
+ status: 'active' | 'failed' | 'rolled_back';
43
+ activationMode: string;
44
+ checks: Array<{
45
+ name: string;
46
+ status: 'pass' | 'fail' | 'unavailable';
47
+ details: string | null;
48
+ }>;
49
+ startedAt: string;
50
+ completedAt: string;
51
+ rollbackReceiptId: string | null;
52
+ receiptHash: string;
53
+ signature: string;
54
+ }
55
+ declare function contentHash(path: string): Promise<string>;
56
+ export declare function calculateBundleHash(bundle: Omit<SkillBundle, 'signature' | 'bundleHash'>): string;
57
+ export declare function verifySkillBundle(bundle: SkillBundle, serverPublicKey: KeyObject, now?: Date): void;
58
+ export declare function getActiveSkillBundleId(nativeSkillDirectory: string): Promise<string | null>;
59
+ export declare function installSkillBundle(input: {
60
+ bundle: SkillBundle;
61
+ sourceDirectory: string;
62
+ nativeSkillDirectory: string;
63
+ policy: OrganizationPolicy;
64
+ serverPublicKey: KeyObject;
65
+ devicePrivateKey: KeyObject;
66
+ deviceId: string;
67
+ workspaceId: string;
68
+ provider: ProviderId;
69
+ smokeCommandId?: string;
70
+ organizationApprovalId?: string;
71
+ }): Promise<InstallReceipt>;
72
+ export { contentHash };
73
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,261 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomUUID, createHash } from 'node:crypto';
3
+ import { cp, lstat, mkdir, readdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
4
+ import { basename, isAbsolute, relative, resolve } from 'node:path';
5
+ import { canonicalize, sha256, signCanonicalObject, verifyCanonicalObject } from '@dharma-ai-labs/agent-fabric-contracts';
6
+ import { resolveRegisteredCommand } from '@dharma-ai-labs/agent-fabric-policy';
7
+ function assertContained(root, candidate) {
8
+ const route = relative(resolve(root), resolve(candidate));
9
+ if (route === '..' || route.startsWith('../') || route.startsWith('..\\') || isAbsolute(route)) {
10
+ throw new Error('Skill path escapes its bundle root.');
11
+ }
12
+ return resolve(candidate);
13
+ }
14
+ async function contentHash(path) {
15
+ const hash = createHash('sha256');
16
+ const visit = async (entryPath, prefix = '') => {
17
+ const metadata = await lstat(entryPath);
18
+ if (metadata.isSymbolicLink())
19
+ throw new Error('Skill bundles cannot contain symbolic links.');
20
+ if (metadata.isDirectory()) {
21
+ for (const name of (await readdir(entryPath)).sort())
22
+ await visit(resolve(entryPath, name), `${prefix}${name}/`);
23
+ return;
24
+ }
25
+ if (!metadata.isFile())
26
+ throw new Error('Skill bundles may contain only files and directories.');
27
+ hash.update(prefix.slice(0, -1));
28
+ hash.update('\0');
29
+ hash.update(await readFile(entryPath));
30
+ hash.update('\0');
31
+ };
32
+ await visit(path, basename(path) + '/');
33
+ return `sha256:${hash.digest('hex')}`;
34
+ }
35
+ export function calculateBundleHash(bundle) {
36
+ return sha256(canonicalize(bundle));
37
+ }
38
+ export function verifySkillBundle(bundle, serverPublicKey, now = new Date()) {
39
+ if (bundle.expiresAt && Date.parse(bundle.expiresAt) <= now.getTime())
40
+ throw new Error('Skill bundle has expired.');
41
+ const { signature, ...unsigned } = bundle;
42
+ if (!verifyCanonicalObject(unsigned, signature, serverPublicKey))
43
+ throw new Error('Skill bundle signature is invalid.');
44
+ const { bundleHash, ...hashInput } = unsigned;
45
+ if (bundleHash !== calculateBundleHash(hashInput))
46
+ throw new Error('Skill bundle hash is invalid.');
47
+ }
48
+ async function runSmoke(commandId, policy, cwd) {
49
+ const command = resolveRegisteredCommand(policy, commandId);
50
+ const [executable, ...argv] = command.argv;
51
+ return new Promise((accept, reject) => {
52
+ const child = spawn(executable, argv, { cwd, shell: false, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] });
53
+ const stderr = [];
54
+ child.stderr.on('data', (chunk) => stderr.push(chunk));
55
+ const timeout = setTimeout(() => child.kill('SIGKILL'), command.timeoutSeconds * 1_000);
56
+ child.once('error', reject);
57
+ child.once('close', (code) => {
58
+ clearTimeout(timeout);
59
+ accept({ status: code === 0 ? 'pass' : 'fail', details: code === 0 ? null : Buffer.concat(stderr).toString('utf8').slice(0, 500) });
60
+ });
61
+ });
62
+ }
63
+ async function readActiveBundleId(root) {
64
+ try {
65
+ return (await readFile(resolve(root, 'ACTIVE_BUNDLE'), 'utf8')).trim() || null;
66
+ }
67
+ catch (error) {
68
+ if (error.code === 'ENOENT')
69
+ return null;
70
+ throw error;
71
+ }
72
+ }
73
+ async function pathExists(path) {
74
+ try {
75
+ await lstat(path);
76
+ return true;
77
+ }
78
+ catch (error) {
79
+ if (error.code === 'ENOENT')
80
+ return false;
81
+ throw error;
82
+ }
83
+ }
84
+ async function releaseSkillIds(release) {
85
+ try {
86
+ const manifest = JSON.parse(await readFile(resolve(release, 'BUNDLE.json'), 'utf8'));
87
+ return Array.isArray(manifest.skillIds) && manifest.skillIds.every((item) => typeof item === 'string') ? manifest.skillIds : [];
88
+ }
89
+ catch (error) {
90
+ if (error.code === 'ENOENT')
91
+ return [];
92
+ throw error;
93
+ }
94
+ }
95
+ async function activateNativeSkills(input) {
96
+ const affectedSkillIds = [...new Set([...input.removeSkillIds, ...input.skillIds])];
97
+ await mkdir(input.nativeSkillDirectory, { recursive: true, mode: 0o700 });
98
+ for (const skillId of affectedSkillIds) {
99
+ const target = assertContained(input.nativeSkillDirectory, resolve(input.nativeSkillDirectory, skillId));
100
+ if (await pathExists(target)) {
101
+ const marker = resolve(target, '.dharma-agent-fabric.json');
102
+ if (!await pathExists(marker))
103
+ throw new Error(`Refusing to replace unmanaged provider skill: ${skillId}`);
104
+ }
105
+ }
106
+ const transactionRoot = assertContained(input.nativeSkillDirectory, resolve(input.nativeSkillDirectory, `.dharma-activation-${randomUUID()}`));
107
+ const stagedRoot = resolve(transactionRoot, 'staged');
108
+ const backupRoot = resolve(transactionRoot, 'backup');
109
+ const backedUp = [];
110
+ const activated = [];
111
+ await mkdir(stagedRoot, { recursive: true, mode: 0o700 });
112
+ await mkdir(backupRoot, { recursive: true, mode: 0o700 });
113
+ try {
114
+ for (const skillId of input.skillIds) {
115
+ const source = assertContained(input.release, resolve(input.release, skillId));
116
+ const staged = assertContained(stagedRoot, resolve(stagedRoot, skillId));
117
+ await cp(source, staged, { recursive: true, errorOnExist: true, force: false });
118
+ await writeFile(resolve(staged, '.dharma-agent-fabric.json'), `${JSON.stringify({ bundleId: input.bundleId, skillId })}\n`, { mode: 0o600 });
119
+ }
120
+ for (const skillId of affectedSkillIds) {
121
+ const target = assertContained(input.nativeSkillDirectory, resolve(input.nativeSkillDirectory, skillId));
122
+ if (!await pathExists(target))
123
+ continue;
124
+ await rename(target, assertContained(backupRoot, resolve(backupRoot, skillId)));
125
+ backedUp.push(skillId);
126
+ }
127
+ for (const skillId of input.skillIds) {
128
+ const target = assertContained(input.nativeSkillDirectory, resolve(input.nativeSkillDirectory, skillId));
129
+ await rename(assertContained(stagedRoot, resolve(stagedRoot, skillId)), target);
130
+ activated.push(skillId);
131
+ }
132
+ }
133
+ catch (error) {
134
+ for (const skillId of activated.reverse()) {
135
+ await rm(assertContained(input.nativeSkillDirectory, resolve(input.nativeSkillDirectory, skillId)), {
136
+ recursive: true,
137
+ force: true,
138
+ });
139
+ }
140
+ for (const skillId of backedUp.reverse()) {
141
+ await rename(assertContained(backupRoot, resolve(backupRoot, skillId)), assertContained(input.nativeSkillDirectory, resolve(input.nativeSkillDirectory, skillId)));
142
+ }
143
+ throw error;
144
+ }
145
+ finally {
146
+ await rm(transactionRoot, { recursive: true, force: true });
147
+ }
148
+ }
149
+ export async function getActiveSkillBundleId(nativeSkillDirectory) {
150
+ return readActiveBundleId(resolve(nativeSkillDirectory, '.dharma-managed'));
151
+ }
152
+ export async function installSkillBundle(input) {
153
+ const startedAt = new Date().toISOString();
154
+ verifySkillBundle(input.bundle, input.serverPublicKey);
155
+ if (input.bundle.organizationId !== input.policy.organizationId)
156
+ throw new Error('Bundle organization does not match policy.');
157
+ if (input.bundle.operation === 'clear' && input.bundle.skills.length !== 0)
158
+ throw new Error('Clear bundles cannot contain skills.');
159
+ if (input.bundle.operation === 'install' && input.bundle.skills.length === 0)
160
+ throw new Error('Install bundles must contain at least one skill.');
161
+ if ((input.bundle.riskClass === 'R3' || input.bundle.riskClass === 'R4') && !input.organizationApprovalId) {
162
+ throw new Error(`${input.bundle.riskClass} skill bundles require organization approval.`);
163
+ }
164
+ if (!input.policy.skills.automaticInstall)
165
+ throw new Error('Automatic skill installation is disabled by policy.');
166
+ const managedRoot = resolve(input.nativeSkillDirectory, '.dharma-managed');
167
+ const releases = resolve(managedRoot, 'releases');
168
+ const release = assertContained(releases, resolve(releases, input.bundle.bundleId));
169
+ const active = resolve(managedRoot, 'active');
170
+ const rollback = resolve(managedRoot, 'rollback');
171
+ const previousBundleId = await readActiveBundleId(managedRoot);
172
+ await mkdir(releases, { recursive: true, mode: 0o700 });
173
+ await rm(release, { recursive: true, force: true });
174
+ await mkdir(release, { recursive: true, mode: 0o700 });
175
+ const checks = [];
176
+ for (const skill of input.bundle.skills) {
177
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(skill.skillId))
178
+ throw new Error(`Invalid provider skill identifier: ${skill.skillId}`);
179
+ const source = assertContained(input.sourceDirectory, resolve(input.sourceDirectory, skill.path));
180
+ const actualHash = await contentHash(source);
181
+ if (actualHash !== skill.contentHash)
182
+ throw new Error(`Skill content hash mismatch: ${skill.skillId}`);
183
+ await cp(source, resolve(release, skill.skillId), { recursive: true, errorOnExist: true, force: false });
184
+ checks.push({ name: `content:${skill.skillId}`, status: 'pass', details: actualHash });
185
+ }
186
+ const skillIds = input.bundle.skills.map((skill) => skill.skillId);
187
+ await writeFile(resolve(release, 'BUNDLE.json'), `${JSON.stringify({ bundleId: input.bundle.bundleId, skillIds })}\n`, { mode: 0o600 });
188
+ const previousRelease = previousBundleId ? resolve(releases, previousBundleId) : null;
189
+ const previousSkillIds = previousRelease ? await releaseSkillIds(previousRelease) : [];
190
+ await rm(rollback, { recursive: true, force: true });
191
+ try {
192
+ await rename(active, rollback);
193
+ }
194
+ catch (error) {
195
+ if (error.code !== 'ENOENT')
196
+ throw error;
197
+ }
198
+ await cp(release, active, { recursive: true, errorOnExist: true, force: false });
199
+ await activateNativeSkills({
200
+ nativeSkillDirectory: input.nativeSkillDirectory,
201
+ release,
202
+ bundleId: input.bundle.bundleId,
203
+ skillIds,
204
+ removeSkillIds: previousSkillIds,
205
+ });
206
+ let status = 'active';
207
+ if (input.smokeCommandId) {
208
+ const check = await runSmoke(input.smokeCommandId, input.policy, active);
209
+ checks.push({ name: `smoke:${input.smokeCommandId}`, ...check });
210
+ if (check.status === 'fail') {
211
+ await rm(active, { recursive: true, force: true });
212
+ try {
213
+ await rename(rollback, active);
214
+ status = 'rolled_back';
215
+ }
216
+ catch (error) {
217
+ if (error.code !== 'ENOENT')
218
+ throw error;
219
+ status = 'failed';
220
+ }
221
+ await activateNativeSkills({
222
+ nativeSkillDirectory: input.nativeSkillDirectory,
223
+ release: previousRelease || release,
224
+ bundleId: previousBundleId || input.bundle.bundleId,
225
+ skillIds: previousBundleId ? previousSkillIds : [],
226
+ removeSkillIds: skillIds,
227
+ });
228
+ }
229
+ }
230
+ if (status === 'active') {
231
+ await rm(rollback, { recursive: true, force: true });
232
+ await writeFile(resolve(managedRoot, 'ACTIVE_BUNDLE'), `${input.bundle.bundleId}\n`, { mode: 0o600 });
233
+ }
234
+ else if (previousBundleId) {
235
+ await writeFile(resolve(managedRoot, 'ACTIVE_BUNDLE'), `${previousBundleId}\n`, { mode: 0o600 });
236
+ }
237
+ else {
238
+ await rm(resolve(managedRoot, 'ACTIVE_BUNDLE'), { force: true });
239
+ }
240
+ const receiptBase = {
241
+ schema: 'dharma.install-receipt/v1',
242
+ installationId: randomUUID(),
243
+ organizationId: input.bundle.organizationId,
244
+ deviceId: input.deviceId,
245
+ workspaceId: input.workspaceId,
246
+ provider: input.provider,
247
+ bundleId: input.bundle.bundleId,
248
+ previousBundleId,
249
+ status,
250
+ activationMode: input.bundle.activationPolicy,
251
+ checks,
252
+ startedAt,
253
+ completedAt: new Date().toISOString(),
254
+ rollbackReceiptId: null,
255
+ };
256
+ const receiptHash = sha256(canonicalize(receiptBase));
257
+ const signature = signCanonicalObject({ ...receiptBase, receiptHash }, input.devicePrivateKey);
258
+ return { ...receiptBase, receiptHash, signature };
259
+ }
260
+ export { contentHash };
261
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from 'node:test';
3
+ import { generateKeyPairSync, randomUUID } from 'node:crypto';
4
+ import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises';
5
+ import { tmpdir } from 'node:os';
6
+ import { resolve } from 'node:path';
7
+ import { signCanonicalObject } from '@dharma-ai-labs/agent-fabric-contracts';
8
+ import { calculateBundleHash, contentHash, installSkillBundle } from './index.js';
9
+ const policy = {
10
+ schema: 'dharma.organization-policy/v1', organizationId: 'org_test', revision: '1',
11
+ evidence: { defaultMode: 'deep', registeredWorkspaceOnly: true, excludePaths: [], maximumCapsuleBytes: 1, maximumDailyUploadBytes: 1, maximumExpansionBytes: 1 },
12
+ tasks: {
13
+ defaultNetwork: 'deny', defaultGit: 'task_branch', writePaths: [], requireLocalConfirmationFor: [],
14
+ allowedCommands: {
15
+ smokePass: { argv: [process.execPath, '-e', 'process.exit(0)'], timeoutSeconds: 5 },
16
+ smokeFail: { argv: [process.execPath, '-e', 'process.exit(9)'], timeoutSeconds: 5 },
17
+ },
18
+ },
19
+ skills: { automaticInstall: true, automaticPromotionMaxRisk: 'R2', canaryPercent: 10 }, retention: {}, budgets: {},
20
+ };
21
+ async function signedBundle(source, bundleId, privateKey) {
22
+ const skill = { skillId: 'dharma-boundary', version: '1.0.0', repository: 'https://github.com/customer/agent-control.git', commit: 'abc123', contentHash: await contentHash(source), path: 'skill' };
23
+ const base = {
24
+ schema: 'dharma.skill-bundle/v1', bundleId, organizationId: 'org_test', version: '1.0.0', operation: 'install', skills: [skill],
25
+ riskClass: 'R2', targetSelectors: { providers: ['codex'] }, activationPolicy: 'next_session',
26
+ rollbackBundleId: null, evaluationReceiptId: 'eval-1', createdAt: new Date().toISOString(), expiresAt: null,
27
+ };
28
+ const bundleHash = calculateBundleHash(base);
29
+ return { ...base, bundleHash, signature: signCanonicalObject({ ...base, bundleHash }, privateKey) };
30
+ }
31
+ test('verified skill activates and a failed canary restores the prior bundle', async () => {
32
+ const root = await mkdtemp(resolve(tmpdir(), 'dharma-skill-'));
33
+ const source = resolve(root, 'source', 'skill');
34
+ const native = resolve(root, 'native');
35
+ await mkdir(source, { recursive: true });
36
+ await writeFile(resolve(source, 'SKILL.md'), '# Enforce evidence boundary\n');
37
+ const server = generateKeyPairSync('ed25519');
38
+ const device = generateKeyPairSync('ed25519');
39
+ const deviceId = randomUUID();
40
+ const workspaceId = randomUUID();
41
+ const firstBundleId = randomUUID();
42
+ const secondBundleId = randomUUID();
43
+ const first = await signedBundle(source, firstBundleId, server.privateKey);
44
+ const receipt = await installSkillBundle({ bundle: first, sourceDirectory: resolve(root, 'source'), nativeSkillDirectory: native, policy, serverPublicKey: server.publicKey, devicePrivateKey: device.privateKey, deviceId, workspaceId, provider: 'codex', smokeCommandId: 'smokePass' });
45
+ assert.equal(receipt.status, 'active');
46
+ assert.match(await readFile(resolve(native, '.dharma-managed/active/dharma-boundary/SKILL.md'), 'utf8'), /evidence boundary/);
47
+ assert.match(await readFile(resolve(native, 'dharma-boundary/SKILL.md'), 'utf8'), /evidence boundary/);
48
+ await writeFile(resolve(source, 'SKILL.md'), '# Broken candidate\n');
49
+ const second = await signedBundle(source, secondBundleId, server.privateKey);
50
+ const rollback = await installSkillBundle({ bundle: second, sourceDirectory: resolve(root, 'source'), nativeSkillDirectory: native, policy, serverPublicKey: server.publicKey, devicePrivateKey: device.privateKey, deviceId, workspaceId, provider: 'codex', smokeCommandId: 'smokeFail' });
51
+ assert.equal(rollback.status, 'rolled_back');
52
+ assert.match(await readFile(resolve(native, '.dharma-managed/active/dharma-boundary/SKILL.md'), 'utf8'), /evidence boundary/);
53
+ assert.match(await readFile(resolve(native, 'dharma-boundary/SKILL.md'), 'utf8'), /evidence boundary/);
54
+ assert.equal((await readFile(resolve(native, '.dharma-managed/ACTIVE_BUNDLE'), 'utf8')).trim(), firstBundleId);
55
+ });
56
+ test('R3 bundles cannot install without explicit organization approval', async () => {
57
+ const root = await mkdtemp(resolve(tmpdir(), 'dharma-skill-r3-'));
58
+ const source = resolve(root, 'source', 'skill');
59
+ await mkdir(source, { recursive: true });
60
+ await writeFile(resolve(source, 'SKILL.md'), '# Elevated\n');
61
+ const server = generateKeyPairSync('ed25519');
62
+ const device = generateKeyPairSync('ed25519');
63
+ const bundle = { ...(await signedBundle(source, randomUUID(), server.privateKey)), riskClass: 'R3' };
64
+ const { signature: _old, bundleHash: _oldHash, ...unsigned } = bundle;
65
+ const bundleHash = calculateBundleHash(unsigned);
66
+ const signed = { ...unsigned, bundleHash, signature: signCanonicalObject({ ...unsigned, bundleHash }, server.privateKey) };
67
+ await assert.rejects(() => installSkillBundle({ bundle: signed, sourceDirectory: resolve(root, 'source'), nativeSkillDirectory: resolve(root, 'native'), policy, serverPublicKey: server.publicKey, devicePrivateKey: device.privateKey, deviceId: randomUUID(), workspaceId: randomUUID(), provider: 'codex' }), /require organization approval/);
68
+ });
69
+ test('signed clear baseline removes managed skills and preserves unmanaged provider skills', async () => {
70
+ const root = await mkdtemp(resolve(tmpdir(), 'dharma-skill-clear-'));
71
+ const source = resolve(root, 'source', 'skill');
72
+ const native = resolve(root, 'native');
73
+ await mkdir(source, { recursive: true });
74
+ await mkdir(resolve(native, 'customer-skill'), { recursive: true });
75
+ await writeFile(resolve(source, 'SKILL.md'), '# Managed boundary\n');
76
+ await writeFile(resolve(native, 'customer-skill', 'SKILL.md'), '# Customer owned\n');
77
+ const server = generateKeyPairSync('ed25519');
78
+ const device = generateKeyPairSync('ed25519');
79
+ const deviceId = randomUUID();
80
+ const workspaceId = randomUUID();
81
+ const installed = await signedBundle(source, randomUUID(), server.privateKey);
82
+ await installSkillBundle({ bundle: installed, sourceDirectory: resolve(root, 'source'), nativeSkillDirectory: native, policy, serverPublicKey: server.publicKey, devicePrivateKey: device.privateKey, deviceId, workspaceId, provider: 'codex' });
83
+ const clearBase = {
84
+ schema: 'dharma.skill-bundle/v1', bundleId: randomUUID(), organizationId: 'org_test', version: '0.0.0',
85
+ operation: 'clear', skills: [], riskClass: 'R0', targetSelectors: { providers: ['codex'] },
86
+ activationPolicy: 'immediate_safe_reload', rollbackBundleId: null, evaluationReceiptId: 'baseline:no-managed-skills',
87
+ createdAt: new Date().toISOString(), expiresAt: null,
88
+ };
89
+ const bundleHash = calculateBundleHash(clearBase);
90
+ const clear = { ...clearBase, bundleHash, signature: signCanonicalObject({ ...clearBase, bundleHash }, server.privateKey) };
91
+ const receipt = await installSkillBundle({ bundle: clear, sourceDirectory: resolve(root, 'empty'), nativeSkillDirectory: native, policy, serverPublicKey: server.publicKey, devicePrivateKey: device.privateKey, deviceId, workspaceId, provider: 'codex' });
92
+ assert.equal(receipt.status, 'active');
93
+ assert.equal(receipt.previousBundleId, installed.bundleId);
94
+ await assert.rejects(readFile(resolve(native, 'dharma-boundary', 'SKILL.md')), /ENOENT/);
95
+ assert.match(await readFile(resolve(native, 'customer-skill', 'SKILL.md'), 'utf8'), /Customer owned/);
96
+ assert.equal((await readFile(resolve(native, '.dharma-managed/ACTIVE_BUNDLE'), 'utf8')).trim(), clear.bundleId);
97
+ });
98
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "@dharma-ai-labs/agent-fabric-skill-manager",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "repository": { "type": "git", "url": "git+https://github.com/dharma-ai-labs/dharma-agent-fabric.git", "directory": "packages/skill-manager" },
8
+ "exports": { ".": "./dist/index.js" },
9
+ "files": ["dist"],
10
+ "publishConfig": { "access": "public", "provenance": true },
11
+ "scripts": { "test": "node --test dist/*.test.js" },
12
+ "dependencies": {
13
+ "@dharma-ai-labs/agent-fabric-contracts": "0.1.0",
14
+ "@dharma-ai-labs/agent-fabric-policy": "0.1.0"
15
+ }
16
+ }