@dharma-ai-labs/agent-fabric 0.2.36 → 0.2.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -15
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +235 -22
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +19 -5
- package/dist/index.test.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,35 +10,39 @@ installs signed Skill releases with receipts and rollback ancestry.
|
|
|
10
10
|
|
|
11
11
|
Requires Node.js 22.20.0 through 24.x.
|
|
12
12
|
|
|
13
|
-
An organization administrator
|
|
14
|
-
Fabric → Instructions
|
|
15
|
-
in the intended source repository.
|
|
16
|
-
|
|
13
|
+
An organization administrator copies the one-shot setup instruction from
|
|
14
|
+
**Portal → Agent Fabric → Instructions** into the coding agent that is already
|
|
15
|
+
open in the intended source repository. The instruction authorizes one pinned
|
|
16
|
+
command. The coding harness may show one native approval for that exact command;
|
|
17
|
+
after approval, no additional terminal steps or provider selection are required.
|
|
17
18
|
|
|
18
19
|
```bash
|
|
19
|
-
dharma bootstrap \
|
|
20
|
+
npm exec --yes --package=@dharma-ai-labs/agent-fabric@<version> -- dharma bootstrap \
|
|
20
21
|
--portal-url https://www.dharma-ai.io \
|
|
21
22
|
--organization-id <organization-id> \
|
|
22
23
|
--grant <single-use-grant> \
|
|
23
24
|
--workspace . \
|
|
24
|
-
--policy-revision <dashboard-policy-revision>
|
|
25
|
+
--policy-revision <dashboard-policy-revision> \
|
|
26
|
+
--provider auto \
|
|
27
|
+
--complete
|
|
25
28
|
```
|
|
26
29
|
|
|
27
30
|
`bootstrap` does not open a browser. It redeems the short-lived grant into an
|
|
28
31
|
Ed25519 device identity and a revocable, device-scoped organization API token,
|
|
29
32
|
stores both in the operating-system credential store, connects only the current
|
|
30
|
-
repository, obtains its signed policy,
|
|
33
|
+
repository, obtains its signed policy, detects the active host, installs and
|
|
34
|
+
verifies its native skill, applies the signed evidence boundary, starts the
|
|
35
|
+
outbound relay, and verifies read-only organization access.
|
|
31
36
|
The grant is usable only until its displayed expiry and is never stored by HQ
|
|
32
37
|
in plaintext. Device revocation also revokes the linked organization token.
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
merges a project-local allowlist for
|
|
37
|
-
into `.claude/settings.local.json`. Existing settings
|
|
38
|
-
preserved. The allowlist does not permit enrollment,
|
|
39
|
-
task dispatch, source writes, paid operations, release, rollout, or
|
|
40
|
-
|
|
41
|
-
`relay start --once`, it never polls or leases work.
|
|
39
|
+
Success is one terminal JSON receipt with `ok: true`, `stage: "complete"`, a
|
|
40
|
+
ready provider skill, a running relay, and ready organization API reads. For
|
|
41
|
+
Claude Code, bootstrap also merges a project-local allowlist for later exact
|
|
42
|
+
read-only status commands into `.claude/settings.local.json`. Existing settings
|
|
43
|
+
and deny rules are preserved. The allowlist does not permit enrollment, evidence
|
|
44
|
+
sync, task dispatch, source writes, paid operations, release, rollout, or
|
|
45
|
+
rollback.
|
|
42
46
|
|
|
43
47
|
Use the separate teammate action in the Instructions tab to send a Clerk
|
|
44
48
|
organization invitation and copy a distinct one-time setup for that teammate.
|
package/dist/index.d.ts
CHANGED
|
@@ -70,6 +70,11 @@ export declare function retryBootstrapOnboarding<T>(operation: () => Promise<T>,
|
|
|
70
70
|
delaysMs?: readonly number[];
|
|
71
71
|
wait?: (delayMs: number) => Promise<void>;
|
|
72
72
|
}): Promise<T>;
|
|
73
|
+
export declare function stableRepositoryLauncherContents(version?: string): {
|
|
74
|
+
shell: string;
|
|
75
|
+
windows: string;
|
|
76
|
+
};
|
|
77
|
+
export declare function providerHintFromEnvironment(env?: NodeJS.ProcessEnv): ProviderId | null;
|
|
73
78
|
export declare function requireExplicitConfirmation(flags: Map<string, string | boolean>, action: string): void;
|
|
74
79
|
export type ControlAgentCliClient = Pick<AgentFabricClient, 'listControlAgentSessions' | 'createControlAgentSession' | 'submitControlAgentMessage' | 'listControlAgentEvents'>;
|
|
75
80
|
type ControlAgentCliClientFactory = () => Promise<ControlAgentCliClient>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { execFile } from 'node:child_process';
|
|
2
|
+
import { execFile, spawn } from 'node:child_process';
|
|
3
3
|
import { createHash, createPrivateKey, createPublicKey, randomUUID } from 'node:crypto';
|
|
4
4
|
import { realpathSync } from 'node:fs';
|
|
5
|
-
import { access, link, mkdir, open, readFile, readdir, realpath, rename, rm, unlink, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { access, chmod, link, mkdir, open, readFile, readdir, realpath, rename, rm, unlink, writeFile } from 'node:fs/promises';
|
|
6
6
|
import { homedir } from 'node:os';
|
|
7
7
|
import { basename, dirname, isAbsolute, relative, resolve } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
@@ -16,7 +16,7 @@ import { AgentFabricClient as AgentFabricApiClient } from '@dharma-ai-labs/agent
|
|
|
16
16
|
import { getActiveSkillBundleAuthorization, getExpiredSkillBundleAuthorizationForReplacement, getLegacySkillBundleIdForUpgrade, installSkillBundle, rollbackUnconfirmedSkillBundle, verifySkillBundle } from '@dharma-ai-labs/agent-fabric-skill-manager';
|
|
17
17
|
import { executeTask, FileActionExecutionJournal, FileTaskReceiptStore, providerInstructionsForTask, } from '@dharma-ai-labs/agent-fabric-task-runner';
|
|
18
18
|
import { CLI_USAGE } from './usage.js';
|
|
19
|
-
const VERSION = '0.2.
|
|
19
|
+
const VERSION = '0.2.37';
|
|
20
20
|
const USAGE = CLI_USAGE;
|
|
21
21
|
const execFileAsync = promisify(execFile);
|
|
22
22
|
const LOCAL_PROVIDER_IDS = ['codex', 'claude', 'agy', 'hermes'];
|
|
@@ -1155,6 +1155,133 @@ export async function retryBootstrapOnboarding(operation, options = {}) {
|
|
|
1155
1155
|
}
|
|
1156
1156
|
}
|
|
1157
1157
|
}
|
|
1158
|
+
async function archiveEnrollmentForAuthorizedRebind(existing) {
|
|
1159
|
+
const pidPath = resolve(dharmaHome(), 'relay', 'relay.pid');
|
|
1160
|
+
let relayPid = 0;
|
|
1161
|
+
try {
|
|
1162
|
+
relayPid = Number((await readFile(pidPath, 'utf8')).trim());
|
|
1163
|
+
}
|
|
1164
|
+
catch { }
|
|
1165
|
+
if (Number.isSafeInteger(relayPid) && relayPid > 0) {
|
|
1166
|
+
try {
|
|
1167
|
+
process.kill(relayPid, 'SIGTERM');
|
|
1168
|
+
}
|
|
1169
|
+
catch (error) {
|
|
1170
|
+
if (error.code !== 'ESRCH')
|
|
1171
|
+
throw error;
|
|
1172
|
+
}
|
|
1173
|
+
for (let attempt = 0; attempt < 20; attempt += 1) {
|
|
1174
|
+
try {
|
|
1175
|
+
process.kill(relayPid, 0);
|
|
1176
|
+
}
|
|
1177
|
+
catch (error) {
|
|
1178
|
+
if (error.code === 'ESRCH')
|
|
1179
|
+
break;
|
|
1180
|
+
}
|
|
1181
|
+
await new Promise((resolveWait) => setTimeout(resolveWait, 100));
|
|
1182
|
+
}
|
|
1183
|
+
try {
|
|
1184
|
+
process.kill(relayPid, 0);
|
|
1185
|
+
throw new Error('The previous organization relay did not stop; enrollment was not changed.');
|
|
1186
|
+
}
|
|
1187
|
+
catch (error) {
|
|
1188
|
+
if (error.code !== 'ESRCH')
|
|
1189
|
+
throw error;
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
const backupId = `${new Date().toISOString().replace(/[:.]/g, '-')}-${createHash('sha256')
|
|
1193
|
+
.update(`${existing.hqUrl}\0${existing.organizationId}`)
|
|
1194
|
+
.digest('hex').slice(0, 12)}`;
|
|
1195
|
+
const backupRoot = resolve(dirname(dharmaHome()), '.dharma-rebind-backups', backupId);
|
|
1196
|
+
await mkdir(backupRoot, { recursive: true, mode: 0o700 });
|
|
1197
|
+
for (const relativePath of ['device.json', 'pending-enrollment.json', 'registry', 'relay', 'vault']) {
|
|
1198
|
+
const source = resolve(dharmaHome(), relativePath);
|
|
1199
|
+
if (!await pathExists(source))
|
|
1200
|
+
continue;
|
|
1201
|
+
await rename(source, resolve(backupRoot, relativePath));
|
|
1202
|
+
}
|
|
1203
|
+
await writeJsonAtomic(resolve(backupRoot, 'RECEIPT.json'), {
|
|
1204
|
+
schema: 'dharma.local-enrollment-rebind-backup/v1',
|
|
1205
|
+
previousOrganizationId: existing.organizationId,
|
|
1206
|
+
previousPortalOrigin: existing.hqUrl,
|
|
1207
|
+
createdAt: new Date().toISOString(),
|
|
1208
|
+
});
|
|
1209
|
+
return { changed: true, backupId, previousOrganizationId: existing.organizationId };
|
|
1210
|
+
}
|
|
1211
|
+
export function stableRepositoryLauncherContents(version = VERSION) {
|
|
1212
|
+
const invocation = `npm exec --yes --package=@dharma-ai-labs/agent-fabric@${version} -- dharma`;
|
|
1213
|
+
return {
|
|
1214
|
+
shell: `#!/bin/sh\nexec ${invocation} "$@"\n`,
|
|
1215
|
+
windows: `@echo off\r\nnpm exec --yes --package=@dharma-ai-labs/agent-fabric@${version} -- dharma %*\r\n`,
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1218
|
+
async function installStableRepositoryLauncher(workspace) {
|
|
1219
|
+
const launcherRoot = resolve(workspace, '.dharma', 'bin');
|
|
1220
|
+
await mkdir(launcherRoot, { recursive: true, mode: 0o700 });
|
|
1221
|
+
const shellPath = resolve(launcherRoot, 'dharma');
|
|
1222
|
+
const cmdPath = resolve(launcherRoot, 'dharma.cmd');
|
|
1223
|
+
const contents = stableRepositoryLauncherContents();
|
|
1224
|
+
await writeFile(shellPath, contents.shell, { mode: 0o700 });
|
|
1225
|
+
await chmod(shellPath, 0o700);
|
|
1226
|
+
await writeFile(cmdPath, contents.windows, { mode: 0o600 });
|
|
1227
|
+
return { shell: '.dharma/bin/dharma', windows: '.dharma/bin/dharma.cmd' };
|
|
1228
|
+
}
|
|
1229
|
+
async function startRelayDaemon(policyPath) {
|
|
1230
|
+
if (await relayProcessState() === 'running')
|
|
1231
|
+
return { started: false, state: 'running' };
|
|
1232
|
+
const child = spawn(process.execPath, [fileURLToPath(import.meta.url), 'relay', 'start', '--policy', policyPath], {
|
|
1233
|
+
cwd: dirname(dirname(policyPath)),
|
|
1234
|
+
detached: true,
|
|
1235
|
+
stdio: 'ignore',
|
|
1236
|
+
env: process.env,
|
|
1237
|
+
});
|
|
1238
|
+
child.unref();
|
|
1239
|
+
for (let attempt = 0; attempt < 30; attempt += 1) {
|
|
1240
|
+
await new Promise((resolveWait) => setTimeout(resolveWait, 100));
|
|
1241
|
+
if (await relayProcessState() === 'running')
|
|
1242
|
+
return { started: true, state: 'running' };
|
|
1243
|
+
}
|
|
1244
|
+
throw new Error('The outbound relay did not reach running state after bootstrap.');
|
|
1245
|
+
}
|
|
1246
|
+
export function providerHintFromEnvironment(env = process.env) {
|
|
1247
|
+
if (env.CLAUDECODE === '1' || env.CLAUDE_CODE === '1')
|
|
1248
|
+
return 'claude';
|
|
1249
|
+
if (env.CODEX_THREAD_ID || env.CODEX_SESSION_ID || env.CODEX_SANDBOX)
|
|
1250
|
+
return 'codex';
|
|
1251
|
+
if (env.AGY_CONFIG_DIR || env.ANTIGRAVITY_CLI === '1')
|
|
1252
|
+
return 'agy';
|
|
1253
|
+
if (env.HERMES_HOME || env.HERMES_AGENT === '1')
|
|
1254
|
+
return 'hermes';
|
|
1255
|
+
return null;
|
|
1256
|
+
}
|
|
1257
|
+
async function detectBootstrapProvider(workspace) {
|
|
1258
|
+
const hinted = providerHintFromEnvironment();
|
|
1259
|
+
if (hinted)
|
|
1260
|
+
return hinted;
|
|
1261
|
+
const candidates = (await Promise.all(providerAdapters.map(async (adapter) => {
|
|
1262
|
+
try {
|
|
1263
|
+
const sessions = await adapter.discover({
|
|
1264
|
+
workspace,
|
|
1265
|
+
maximumSessions: 1,
|
|
1266
|
+
maximumBytesPerSession: 1_000_000,
|
|
1267
|
+
maximumRecordBytes: 250_000,
|
|
1268
|
+
});
|
|
1269
|
+
const latest = sessions
|
|
1270
|
+
.map((session) => Date.parse(session.endedAt))
|
|
1271
|
+
.filter(Number.isFinite)
|
|
1272
|
+
.sort((left, right) => right - left)[0];
|
|
1273
|
+
return latest === undefined ? null : { provider: adapter.providerId, latest };
|
|
1274
|
+
}
|
|
1275
|
+
catch {
|
|
1276
|
+
return null;
|
|
1277
|
+
}
|
|
1278
|
+
}))).filter((candidate) => candidate !== null)
|
|
1279
|
+
.sort((left, right) => right.latest - left.latest);
|
|
1280
|
+
if (!candidates[0]) {
|
|
1281
|
+
throw new Error('Could not detect the active coding harness from this process or a workspace-qualified native session. Run the same command from inside the coding agent.');
|
|
1282
|
+
}
|
|
1283
|
+
return candidates[0].provider;
|
|
1284
|
+
}
|
|
1158
1285
|
async function bootstrap(flags) {
|
|
1159
1286
|
const hqUrl = normalizeHqUrl(portalUrl(flags));
|
|
1160
1287
|
const organizationId = required(flags, 'organization-id');
|
|
@@ -1162,8 +1289,17 @@ async function bootstrap(flags) {
|
|
|
1162
1289
|
const workspace = await realpath(String(flags.get('workspace') || '.'));
|
|
1163
1290
|
const policyRevision = required(flags, 'policy-revision');
|
|
1164
1291
|
await preflightBootstrapWorkspaceIdentity(workspace, typeof flags.get('repository-key') === 'string' ? String(flags.get('repository-key')) : null);
|
|
1165
|
-
const
|
|
1166
|
-
|
|
1292
|
+
const requestedProvider = String(flags.get('provider') || 'auto').trim().toLowerCase();
|
|
1293
|
+
const provider = requestedProvider === 'auto'
|
|
1294
|
+
? await detectBootstrapProvider(workspace)
|
|
1295
|
+
: requestedProvider;
|
|
1296
|
+
if (!isLocalProviderId(provider)) {
|
|
1297
|
+
throw new Error('Bootstrap provider must be auto, codex, claude, agy, or hermes.');
|
|
1298
|
+
}
|
|
1299
|
+
let existing = await readDeviceConfig();
|
|
1300
|
+
const enrollmentMismatch = Boolean(existing
|
|
1301
|
+
&& (existing.organizationId !== organizationId || normalizeHqUrl(existing.hqUrl) !== hqUrl));
|
|
1302
|
+
if (enrollmentMismatch && !flags.has('replace-existing-enrollment')) {
|
|
1167
1303
|
throw new Error('This DHARMA_HOME is enrolled to another organization or portal. Use a separate DHARMA_HOME.');
|
|
1168
1304
|
}
|
|
1169
1305
|
const name = String(flags.get('device-name') || `${process.env.USER || process.env.USERNAME || 'developer'} device`);
|
|
@@ -1177,6 +1313,11 @@ async function bootstrap(flags) {
|
|
|
1177
1313
|
platform: devicePlatform,
|
|
1178
1314
|
publicKeyEd25519: identity.publicKeyEd25519,
|
|
1179
1315
|
});
|
|
1316
|
+
const rebind = enrollmentMismatch && existing
|
|
1317
|
+
? await archiveEnrollmentForAuthorizedRebind(existing)
|
|
1318
|
+
: { changed: false, backupId: null, previousOrganizationId: null };
|
|
1319
|
+
if (rebind.changed)
|
|
1320
|
+
existing = null;
|
|
1180
1321
|
const config = existing || {
|
|
1181
1322
|
schema: 'dharma.device-config/v1',
|
|
1182
1323
|
hqUrl,
|
|
@@ -1209,18 +1350,90 @@ async function bootstrap(flags) {
|
|
|
1209
1350
|
onboardFlags.set('organization-id', organizationId);
|
|
1210
1351
|
onboardFlags.set('workspace', workspace);
|
|
1211
1352
|
onboardFlags.set('policy-revision', policyRevision);
|
|
1353
|
+
onboardFlags.set('provider', provider);
|
|
1212
1354
|
const onboarded = await retryBootstrapOnboarding(async () => await onboard(onboardFlags));
|
|
1355
|
+
const launcher = await installStableRepositoryLauncher(workspace);
|
|
1356
|
+
const completionRequested = flags.has('complete');
|
|
1357
|
+
if (!completionRequested) {
|
|
1358
|
+
return {
|
|
1359
|
+
ok: true,
|
|
1360
|
+
stage: onboarded.stage,
|
|
1361
|
+
enrollment: {
|
|
1362
|
+
organizationId,
|
|
1363
|
+
deviceId: config.deviceId,
|
|
1364
|
+
status: 'approved',
|
|
1365
|
+
organizationApiTokenStored: true,
|
|
1366
|
+
scopes: redeemed.organizationApiTokenScopes,
|
|
1367
|
+
rebind,
|
|
1368
|
+
},
|
|
1369
|
+
repository: onboarded,
|
|
1370
|
+
launcher,
|
|
1371
|
+
};
|
|
1372
|
+
}
|
|
1373
|
+
const skill = await verifyAgentFabricSkillInstallation({ provider, workspace });
|
|
1374
|
+
if (!skill.ready)
|
|
1375
|
+
throw new Error(`Provider skill did not become ready: ${JSON.stringify(skill)}`);
|
|
1376
|
+
const policyPath = resolve(workspace, '.dharma', 'approved-policy.json');
|
|
1377
|
+
const evidenceFlags = new Map([
|
|
1378
|
+
['workspace', workspace], ['provider', provider], ['policy', policyPath], ['maximum-sessions', '20'],
|
|
1379
|
+
]);
|
|
1380
|
+
const preview = await evidencePreview(evidenceFlags);
|
|
1381
|
+
let synchronized = { captured: 0, synced: 0 };
|
|
1382
|
+
if (Number(preview.trajectoryCount || 0) > 0
|
|
1383
|
+
&& preview.automaticDisclosure?.ready === true) {
|
|
1384
|
+
evidenceFlags.set('sync', true);
|
|
1385
|
+
synchronized = await capture(evidenceFlags, true);
|
|
1386
|
+
}
|
|
1387
|
+
const relayProbe = await probeRelayConnection();
|
|
1388
|
+
const relay = flags.has('no-relay-daemon')
|
|
1389
|
+
? { started: false, state: await relayProcessState() }
|
|
1390
|
+
: await startRelayDaemon(policyPath);
|
|
1391
|
+
const apiFlags = new Map([
|
|
1392
|
+
['organization-id', organizationId], ['portal-url', hqUrl],
|
|
1393
|
+
]);
|
|
1394
|
+
const [organization, agents, experiments, failures, remediations, skills, usage] = await Promise.all([
|
|
1395
|
+
runOrganizationCommand('organization', 'status', apiFlags),
|
|
1396
|
+
runOrganizationCommand('agents', 'list', apiFlags),
|
|
1397
|
+
runOrganizationCommand('experiments', 'list', apiFlags),
|
|
1398
|
+
runOrganizationCommand('failures', 'list', apiFlags),
|
|
1399
|
+
runOrganizationCommand('remediations', 'list', apiFlags),
|
|
1400
|
+
runOrganizationCommand('skills', 'list', apiFlags),
|
|
1401
|
+
runOrganizationCommand('usage', 'list', apiFlags),
|
|
1402
|
+
]);
|
|
1213
1403
|
return {
|
|
1214
1404
|
ok: true,
|
|
1215
|
-
stage:
|
|
1405
|
+
stage: 'complete',
|
|
1216
1406
|
enrollment: {
|
|
1217
1407
|
organizationId,
|
|
1218
1408
|
deviceId: config.deviceId,
|
|
1219
1409
|
status: 'approved',
|
|
1220
1410
|
organizationApiTokenStored: true,
|
|
1221
1411
|
scopes: redeemed.organizationApiTokenScopes,
|
|
1412
|
+
rebind,
|
|
1222
1413
|
},
|
|
1223
1414
|
repository: onboarded,
|
|
1415
|
+
launcher,
|
|
1416
|
+
provider,
|
|
1417
|
+
skill,
|
|
1418
|
+
evidence: {
|
|
1419
|
+
discovered: Number(preview.trajectoryCount || 0),
|
|
1420
|
+
synchronized,
|
|
1421
|
+
automaticDisclosure: preview.automaticDisclosure,
|
|
1422
|
+
},
|
|
1423
|
+
relayProbe,
|
|
1424
|
+
relay,
|
|
1425
|
+
organizationApi: {
|
|
1426
|
+
ready: true,
|
|
1427
|
+
organization,
|
|
1428
|
+
counts: {
|
|
1429
|
+
agents: Array.isArray(agents?.agents) ? agents.agents.length : null,
|
|
1430
|
+
experiments: Array.isArray(experiments?.windows) ? experiments.windows.length : null,
|
|
1431
|
+
failures: Array.isArray(failures?.failures) ? failures.failures.length : null,
|
|
1432
|
+
remediations: Array.isArray(remediations?.remediations) ? remediations.remediations.length : null,
|
|
1433
|
+
skills: Array.isArray(skills?.skills) ? skills.skills.length : null,
|
|
1434
|
+
usage: Array.isArray(usage?.events) ? usage.events.length : null,
|
|
1435
|
+
},
|
|
1436
|
+
},
|
|
1224
1437
|
};
|
|
1225
1438
|
}
|
|
1226
1439
|
async function commandJsonBody(flags) {
|
|
@@ -3095,26 +3308,26 @@ export function nativeSkillDirectory(provider, env = process.env, home = homedir
|
|
|
3095
3308
|
return resolve(env.AGY_CONFIG_DIR || resolve(home, '.gemini', 'antigravity-cli'), 'plugins', 'dharma-agent-fabric', 'skills');
|
|
3096
3309
|
}
|
|
3097
3310
|
function claudeReadOnlyCommandRules() {
|
|
3098
|
-
const
|
|
3311
|
+
const launcher = './.dharma/bin/dharma';
|
|
3099
3312
|
return [
|
|
3100
3313
|
'Bash(git rev-parse --is-inside-work-tree)',
|
|
3101
3314
|
'Bash(git remote get-url origin)',
|
|
3102
3315
|
'Bash(node --version)',
|
|
3103
|
-
`Bash(${
|
|
3104
|
-
`Bash(${
|
|
3105
|
-
`Bash(${
|
|
3106
|
-
`Bash(${
|
|
3107
|
-
`Bash(${
|
|
3108
|
-
`Bash(${
|
|
3109
|
-
`Bash(${
|
|
3110
|
-
`Bash(${
|
|
3111
|
-
`Bash(${
|
|
3112
|
-
`Bash(${
|
|
3113
|
-
`Bash(${
|
|
3114
|
-
`Bash(${
|
|
3115
|
-
`Bash(${
|
|
3116
|
-
`Bash(${
|
|
3117
|
-
`Bash(${
|
|
3316
|
+
`Bash(${launcher} --version)`,
|
|
3317
|
+
`Bash(${launcher} --help)`,
|
|
3318
|
+
`Bash(${launcher} status --diagnostic)`,
|
|
3319
|
+
`Bash(${launcher} repositories status --repo . --json)`,
|
|
3320
|
+
`Bash(${launcher} providers list)`,
|
|
3321
|
+
`Bash(${launcher} skills verify --provider claude --workspace .)`,
|
|
3322
|
+
`Bash(${launcher} evidence preview --workspace . --provider claude --policy .dharma/approved-policy.json --maximum-sessions 20)`,
|
|
3323
|
+
`Bash(${launcher} relay probe)`,
|
|
3324
|
+
`Bash(${launcher} organization status --json)`,
|
|
3325
|
+
`Bash(${launcher} agents list --json)`,
|
|
3326
|
+
`Bash(${launcher} experiments list --json)`,
|
|
3327
|
+
`Bash(${launcher} failures list --json)`,
|
|
3328
|
+
`Bash(${launcher} remediations list --json)`,
|
|
3329
|
+
`Bash(${launcher} skills list --json)`,
|
|
3330
|
+
`Bash(${launcher} usage list --json)`,
|
|
3118
3331
|
];
|
|
3119
3332
|
}
|
|
3120
3333
|
export async function installClaudeReadOnlyProjectPermissions(workspaceInput) {
|