@cluesmith/codev 3.0.0-rc.0 → 3.0.0-rc.10
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/LICENSE +201 -0
- package/bin/af.js +2 -2
- package/bin/afx.js +8 -0
- package/bin/consult.js +2 -1
- package/bin/team.js +8 -0
- package/{dashboard/dist/assets/index-nr0cXxtf.css → dashboard-dist/assets/index-Bs8I7N2s.css} +1 -1
- package/dashboard-dist/assets/index-CkNo2z6t.js +195 -0
- package/dashboard-dist/assets/index-CkNo2z6t.js.map +1 -0
- package/dashboard-dist/dist/assets/index-Bs8I7N2s.css +32 -0
- package/dashboard-dist/dist/assets/index-CkNo2z6t.js +195 -0
- package/dashboard-dist/dist/assets/index-CkNo2z6t.js.map +1 -0
- package/{dashboard → dashboard-dist}/dist/index.html +2 -2
- package/dashboard-dist/index.html +14 -0
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +21 -13
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/architect.d.ts +4 -4
- package/dist/agent-farm/commands/architect.d.ts.map +1 -1
- package/dist/agent-farm/commands/architect.js +23 -12
- package/dist/agent-farm/commands/architect.js.map +1 -1
- package/dist/agent-farm/commands/attach.js +8 -8
- package/dist/agent-farm/commands/attach.js.map +1 -1
- package/dist/agent-farm/commands/bench.d.ts +1 -1
- package/dist/agent-farm/commands/bench.js +1 -1
- package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
- package/dist/agent-farm/commands/cleanup.js +10 -5
- package/dist/agent-farm/commands/cleanup.js.map +1 -1
- package/dist/agent-farm/commands/cron.js +1 -1
- package/dist/agent-farm/commands/cron.js.map +1 -1
- package/dist/agent-farm/commands/db.d.ts +3 -3
- package/dist/agent-farm/commands/db.js +4 -4
- package/dist/agent-farm/commands/db.js.map +1 -1
- package/dist/agent-farm/commands/open.js +2 -2
- package/dist/agent-farm/commands/open.js.map +1 -1
- package/dist/agent-farm/commands/rename.js +1 -1
- package/dist/agent-farm/commands/rename.js.map +1 -1
- package/dist/agent-farm/commands/send.d.ts +4 -1
- package/dist/agent-farm/commands/send.d.ts.map +1 -1
- package/dist/agent-farm/commands/send.js +8 -5
- package/dist/agent-farm/commands/send.js.map +1 -1
- package/dist/agent-farm/commands/shell.js +3 -3
- package/dist/agent-farm/commands/shell.js.map +1 -1
- package/dist/agent-farm/commands/spawn-roles.d.ts +2 -1
- package/dist/agent-farm/commands/spawn-roles.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn-roles.js +1 -1
- package/dist/agent-farm/commands/spawn-roles.js.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.d.ts +49 -10
- package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.js +357 -49
- package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
- package/dist/agent-farm/commands/spawn.d.ts +6 -6
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +182 -74
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/status.d.ts.map +1 -1
- package/dist/agent-farm/commands/status.js +48 -3
- package/dist/agent-farm/commands/status.js.map +1 -1
- package/dist/agent-farm/commands/team-update.d.ts +1 -1
- package/dist/agent-farm/commands/team-update.d.ts.map +1 -1
- package/dist/agent-farm/commands/team-update.js +8 -5
- package/dist/agent-farm/commands/team-update.js.map +1 -1
- package/dist/agent-farm/commands/team.d.ts +7 -1
- package/dist/agent-farm/commands/team.d.ts.map +1 -1
- package/dist/agent-farm/commands/team.js +36 -4
- package/dist/agent-farm/commands/team.js.map +1 -1
- package/dist/agent-farm/commands/tower-cloud.d.ts +2 -2
- package/dist/agent-farm/commands/tower-cloud.js +3 -3
- package/dist/agent-farm/commands/tower-cloud.js.map +1 -1
- package/dist/agent-farm/commands/tower.d.ts +1 -0
- package/dist/agent-farm/commands/tower.d.ts.map +1 -1
- package/dist/agent-farm/commands/tower.js +54 -3
- package/dist/agent-farm/commands/tower.js.map +1 -1
- package/dist/agent-farm/lib/cloud-config.js +2 -2
- package/dist/agent-farm/lib/cloud-config.js.map +1 -1
- package/dist/agent-farm/lib/tower-client.d.ts +6 -230
- package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
- package/dist/agent-farm/lib/tower-client.js +6 -293
- package/dist/agent-farm/lib/tower-client.js.map +1 -1
- package/dist/agent-farm/lib/tunnel-client.js +1 -1
- package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
- package/dist/agent-farm/servers/message-write.d.ts +24 -0
- package/dist/agent-farm/servers/message-write.d.ts.map +1 -0
- package/dist/agent-farm/servers/message-write.js +63 -0
- package/dist/agent-farm/servers/message-write.js.map +1 -0
- package/dist/agent-farm/servers/overview.d.ts +10 -8
- package/dist/agent-farm/servers/overview.d.ts.map +1 -1
- package/dist/agent-farm/servers/overview.js +78 -38
- package/dist/agent-farm/servers/overview.js.map +1 -1
- package/dist/agent-farm/servers/send-buffer.d.ts +4 -3
- package/dist/agent-farm/servers/send-buffer.d.ts.map +1 -1
- package/dist/agent-farm/servers/send-buffer.js +7 -4
- package/dist/agent-farm/servers/send-buffer.js.map +1 -1
- package/dist/agent-farm/servers/tower-cron-parser.js +1 -1
- package/dist/agent-farm/servers/tower-cron-parser.js.map +1 -1
- package/dist/agent-farm/servers/tower-cron.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-cron.js +4 -5
- package/dist/agent-farm/servers/tower-cron.js.map +1 -1
- package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-instances.js +24 -15
- package/dist/agent-farm/servers/tower-instances.js.map +1 -1
- package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-routes.js +9 -16
- package/dist/agent-farm/servers/tower-routes.js.map +1 -1
- package/dist/agent-farm/servers/tower-server.js +15 -1
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.d.ts +2 -2
- package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.js +64 -36
- package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
- package/dist/agent-farm/servers/tower-tunnel.js +2 -2
- package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
- package/dist/agent-farm/servers/tower-utils.d.ts +9 -6
- package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-utils.js +13 -7
- package/dist/agent-farm/servers/tower-utils.js.map +1 -1
- package/dist/agent-farm/types.d.ts +13 -0
- package/dist/agent-farm/types.d.ts.map +1 -1
- package/dist/agent-farm/utils/config.d.ts +11 -0
- package/dist/agent-farm/utils/config.d.ts.map +1 -1
- package/dist/agent-farm/utils/config.js +39 -17
- package/dist/agent-farm/utils/config.js.map +1 -1
- package/dist/agent-farm/utils/harness.d.ts +85 -0
- package/dist/agent-farm/utils/harness.d.ts.map +1 -0
- package/dist/agent-farm/utils/harness.js +212 -0
- package/dist/agent-farm/utils/harness.js.map +1 -0
- package/dist/agent-farm/utils/roles.d.ts +11 -4
- package/dist/agent-farm/utils/roles.d.ts.map +1 -1
- package/dist/agent-farm/utils/roles.js +21 -6
- package/dist/agent-farm/utils/roles.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +118 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +16 -45
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/consult/index.d.ts +6 -2
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +231 -183
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +121 -31
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +13 -43
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/porch/artifacts.d.ts +69 -0
- package/dist/commands/porch/artifacts.d.ts.map +1 -0
- package/dist/commands/porch/artifacts.js +368 -0
- package/dist/commands/porch/artifacts.js.map +1 -0
- package/dist/commands/porch/checks.d.ts +14 -3
- package/dist/commands/porch/checks.d.ts.map +1 -1
- package/dist/commands/porch/checks.js +150 -4
- package/dist/commands/porch/checks.js.map +1 -1
- package/dist/commands/porch/config.d.ts +6 -9
- package/dist/commands/porch/config.d.ts.map +1 -1
- package/dist/commands/porch/config.js +12 -37
- package/dist/commands/porch/config.js.map +1 -1
- package/dist/commands/porch/index.d.ts +12 -7
- package/dist/commands/porch/index.d.ts.map +1 -1
- package/dist/commands/porch/index.js +273 -82
- package/dist/commands/porch/index.js.map +1 -1
- package/dist/commands/porch/next.d.ts.map +1 -1
- package/dist/commands/porch/next.js +142 -75
- package/dist/commands/porch/next.js.map +1 -1
- package/dist/commands/porch/notify.d.ts +2 -2
- package/dist/commands/porch/notify.js +5 -5
- package/dist/commands/porch/notify.js.map +1 -1
- package/dist/commands/porch/prompts.d.ts +2 -1
- package/dist/commands/porch/prompts.d.ts.map +1 -1
- package/dist/commands/porch/prompts.js +34 -38
- package/dist/commands/porch/prompts.js.map +1 -1
- package/dist/commands/porch/protocol.d.ts +4 -3
- package/dist/commands/porch/protocol.d.ts.map +1 -1
- package/dist/commands/porch/protocol.js +21 -21
- package/dist/commands/porch/protocol.js.map +1 -1
- package/dist/commands/porch/state.d.ts +27 -2
- package/dist/commands/porch/state.d.ts.map +1 -1
- package/dist/commands/porch/state.js +100 -9
- package/dist/commands/porch/state.js.map +1 -1
- package/dist/commands/porch/types.d.ts +10 -2
- package/dist/commands/porch/types.d.ts.map +1 -1
- package/dist/commands/sync.d.ts +26 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +207 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +15 -2
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +159 -202
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/config.d.ts +96 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +165 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/forge-contracts.d.ts +100 -0
- package/dist/lib/forge-contracts.d.ts.map +1 -0
- package/dist/lib/forge-contracts.js +35 -0
- package/dist/lib/forge-contracts.js.map +1 -0
- package/dist/lib/forge.d.ts +102 -0
- package/dist/lib/forge.d.ts.map +1 -0
- package/dist/lib/forge.js +376 -0
- package/dist/lib/forge.js.map +1 -0
- package/dist/lib/github.d.ts +68 -60
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/github.js +160 -169
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/skeleton.d.ts +15 -5
- package/dist/lib/skeleton.d.ts.map +1 -1
- package/dist/lib/skeleton.js +82 -7
- package/dist/lib/skeleton.js.map +1 -1
- package/dist/lib/team-github.d.ts +7 -3
- package/dist/lib/team-github.d.ts.map +1 -1
- package/dist/lib/team-github.js +29 -19
- package/dist/lib/team-github.js.map +1 -1
- package/dist/lib/team.d.ts.map +1 -1
- package/dist/lib/team.js +4 -1
- package/dist/lib/team.js.map +1 -1
- package/dist/terminal/pty-manager.d.ts.map +1 -1
- package/dist/terminal/pty-manager.js +2 -0
- package/dist/terminal/pty-manager.js.map +1 -1
- package/dist/terminal/ws-protocol.d.ts +10 -8
- package/dist/terminal/ws-protocol.d.ts.map +1 -1
- package/dist/terminal/ws-protocol.js +3 -0
- package/dist/terminal/ws-protocol.js.map +1 -1
- package/package.json +28 -24
- package/scripts/forge/gitea/auth-status.sh +3 -0
- package/scripts/forge/gitea/issue-comment.sh +3 -0
- package/scripts/forge/gitea/issue-list.sh +3 -0
- package/scripts/forge/gitea/issue-view.sh +3 -0
- package/scripts/forge/gitea/pr-exists.sh +6 -0
- package/scripts/forge/gitea/pr-list.sh +3 -0
- package/scripts/forge/gitea/pr-merge.sh +3 -0
- package/scripts/forge/gitea/pr-view.sh +3 -0
- package/scripts/forge/gitea/recently-closed.sh +3 -0
- package/scripts/forge/gitea/recently-merged.sh +3 -0
- package/scripts/forge/gitea/repo-archive.sh +11 -0
- package/scripts/forge/gitea/user-identity.sh +3 -0
- package/scripts/forge/github/auth-status.sh +4 -0
- package/scripts/forge/github/issue-comment.sh +5 -0
- package/scripts/forge/github/issue-list.sh +4 -0
- package/scripts/forge/github/issue-view.sh +5 -0
- package/scripts/forge/github/on-it-timestamps.sh +8 -0
- package/scripts/forge/github/pr-diff.sh +10 -0
- package/scripts/forge/github/pr-exists.sh +7 -0
- package/scripts/forge/github/pr-list.sh +4 -0
- package/scripts/forge/github/pr-merge.sh +5 -0
- package/scripts/forge/github/pr-search.sh +5 -0
- package/scripts/forge/github/pr-view.sh +11 -0
- package/scripts/forge/github/recently-closed.sh +15 -0
- package/scripts/forge/github/recently-merged.sh +15 -0
- package/scripts/forge/github/repo-archive.sh +10 -0
- package/scripts/forge/github/team-activity.sh +5 -0
- package/scripts/forge/github/user-identity.sh +4 -0
- package/scripts/forge/gitlab/auth-status.sh +3 -0
- package/scripts/forge/gitlab/issue-comment.sh +3 -0
- package/scripts/forge/gitlab/issue-list.sh +3 -0
- package/scripts/forge/gitlab/issue-view.sh +3 -0
- package/scripts/forge/gitlab/pr-diff.sh +3 -0
- package/scripts/forge/gitlab/pr-exists.sh +5 -0
- package/scripts/forge/gitlab/pr-list.sh +3 -0
- package/scripts/forge/gitlab/pr-merge.sh +3 -0
- package/scripts/forge/gitlab/pr-search.sh +3 -0
- package/scripts/forge/gitlab/pr-view.sh +3 -0
- package/scripts/forge/gitlab/recently-closed.sh +3 -0
- package/scripts/forge/gitlab/recently-merged.sh +3 -0
- package/scripts/forge/gitlab/repo-archive.sh +12 -0
- package/scripts/forge/gitlab/user-identity.sh +3 -0
- package/skeleton/.claude/skills/afx/SKILL.md +144 -0
- package/skeleton/.claude/skills/codev/SKILL.md +3 -3
- package/skeleton/.claude/skills/consult/SKILL.md +1 -1
- package/skeleton/.claude/skills/porch/SKILL.md +2 -2
- package/skeleton/DEPENDENCIES.md +1 -1
- package/skeleton/builders.md +4 -4
- package/skeleton/protocol-schema.json +2 -2
- package/skeleton/protocols/air/builder-prompt.md +6 -6
- package/skeleton/protocols/air/prompts/pr.md +2 -2
- package/skeleton/protocols/air/protocol.md +1 -2
- package/skeleton/protocols/aspir/builder-prompt.md +28 -6
- package/skeleton/protocols/aspir/protocol.json +9 -1
- package/skeleton/protocols/aspir/protocol.md +1 -1
- package/skeleton/protocols/aspir/templates/plan.md +0 -20
- package/skeleton/protocols/aspir/templates/spec.md +0 -28
- package/skeleton/protocols/bugfix/builder-prompt.md +6 -6
- package/skeleton/protocols/bugfix/prompts/pr.md +1 -1
- package/skeleton/protocols/experiment/protocol.md +1 -6
- package/skeleton/protocols/maintain/builder-prompt.md +12 -11
- package/skeleton/protocols/maintain/prompts/maintain.md +88 -0
- package/skeleton/protocols/maintain/prompts/review.md +72 -0
- package/skeleton/protocols/maintain/protocol.json +14 -68
- package/skeleton/protocols/maintain/protocol.md +111 -409
- package/skeleton/protocols/maintain/templates/maintenance-run.md +18 -49
- package/skeleton/protocols/protocol-schema.json +1 -1
- package/skeleton/protocols/spike/builder-prompt.md +1 -1
- package/skeleton/protocols/spike/protocol.md +4 -4
- package/skeleton/protocols/spir/builder-prompt.md +28 -5
- package/skeleton/protocols/spir/protocol.json +9 -1
- package/skeleton/protocols/spir/protocol.md +2 -2
- package/skeleton/protocols/spir/templates/plan.md +0 -20
- package/skeleton/protocols/spir/templates/spec.md +0 -28
- package/skeleton/resources/commands/agent-farm.md +84 -84
- package/skeleton/resources/commands/codev.md +1 -1
- package/skeleton/resources/commands/consult.md +16 -7
- package/skeleton/resources/commands/overview.md +14 -15
- package/skeleton/resources/risk-triage.md +1 -1
- package/skeleton/resources/workflow-reference.md +14 -14
- package/skeleton/roles/architect.md +55 -43
- package/skeleton/roles/builder.md +22 -14
- package/skeleton/templates/AGENTS.md +4 -3
- package/skeleton/templates/CLAUDE.md +4 -3
- package/skeleton/templates/cheatsheet.md +11 -12
- package/templates/3d-viewer.html +16 -18
- package/templates/tower.html +1 -1
- package/dashboard/dist/assets/index-CiIBsixF.js +0 -194
- package/dashboard/dist/assets/index-CiIBsixF.js.map +0 -1
- package/skeleton/.claude/skills/af/SKILL.md +0 -146
- package/skeleton/porch/prompts/understand.md +0 -61
- package/skeleton/porch/prompts/verify.md +0 -58
- package/skeleton/protocols/maintain/prompts/audit.md +0 -111
- package/skeleton/protocols/maintain/prompts/clean.md +0 -91
- package/skeleton/protocols/maintain/prompts/sync.md +0 -113
- package/skeleton/protocols/maintain/prompts/verify.md +0 -110
- package/skeleton/protocols/tick/builder-prompt.md +0 -65
- package/skeleton/protocols/tick/consult-types/impl-review.md +0 -72
- package/skeleton/protocols/tick/consult-types/plan-review.md +0 -59
- package/skeleton/protocols/tick/consult-types/pr-review.md +0 -72
- package/skeleton/protocols/tick/consult-types/spec-review.md +0 -55
- package/skeleton/protocols/tick/protocol.json +0 -151
- package/skeleton/protocols/tick/protocol.md +0 -277
- package/skeleton/protocols/tick/templates/plan.md +0 -67
- package/skeleton/protocols/tick/templates/review.md +0 -89
- package/skeleton/protocols/tick/templates/spec.md +0 -61
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Configuration management for Agent Farm
|
|
3
3
|
*/
|
|
4
|
-
import { existsSync
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
5
|
import { resolve, dirname } from 'node:path';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
import { execSync } from 'node:child_process';
|
|
8
8
|
import { getSkeletonDir } from '../../lib/skeleton.js';
|
|
9
|
+
import { loadConfig } from '../../lib/config.js';
|
|
10
|
+
import { resolveHarness } from './harness.js';
|
|
9
11
|
const __filename = fileURLToPath(import.meta.url);
|
|
10
12
|
const __dirname = dirname(__filename);
|
|
11
13
|
// Default commands
|
|
@@ -121,7 +123,8 @@ function getServersDir() {
|
|
|
121
123
|
return resolve(__dirname, './servers');
|
|
122
124
|
}
|
|
123
125
|
/**
|
|
124
|
-
* Get the roles directory
|
|
126
|
+
* Get the roles directory using the unified resolution chain.
|
|
127
|
+
* Priority: config override → .codev/roles/ → codev/roles/ → skeleton/roles/
|
|
125
128
|
*/
|
|
126
129
|
function getRolesDir(workspaceRoot, userConfig) {
|
|
127
130
|
// Check config.json override
|
|
@@ -131,34 +134,33 @@ function getRolesDir(workspaceRoot, userConfig) {
|
|
|
131
134
|
return configPath;
|
|
132
135
|
}
|
|
133
136
|
}
|
|
134
|
-
//
|
|
137
|
+
// Check .codev/roles/ (user customization)
|
|
138
|
+
const overridePath = resolve(workspaceRoot, '.codev/roles');
|
|
139
|
+
if (existsSync(overridePath)) {
|
|
140
|
+
return overridePath;
|
|
141
|
+
}
|
|
142
|
+
// Try local codev/roles/ (legacy local copies)
|
|
135
143
|
const rolesPath = resolve(workspaceRoot, 'codev/roles');
|
|
136
144
|
if (existsSync(rolesPath)) {
|
|
137
145
|
return rolesPath;
|
|
138
146
|
}
|
|
139
|
-
// Fall back to embedded skeleton
|
|
147
|
+
// Fall back to embedded skeleton (package defaults)
|
|
140
148
|
const skeletonRolesPath = resolve(getSkeletonDir(), 'roles');
|
|
141
149
|
if (existsSync(skeletonRolesPath)) {
|
|
142
150
|
return skeletonRolesPath;
|
|
143
151
|
}
|
|
144
152
|
// This should not happen if the package is installed correctly
|
|
145
|
-
throw new Error(`Roles directory not found in
|
|
153
|
+
throw new Error(`Roles directory not found in .codev/roles/, codev/roles/, or embedded skeleton`);
|
|
146
154
|
}
|
|
147
155
|
/**
|
|
148
|
-
* Load
|
|
156
|
+
* Load config from unified config loader (.codev/config.json).
|
|
157
|
+
* Returns as UserConfig for backward compatibility with existing callers.
|
|
149
158
|
*/
|
|
150
159
|
function loadUserConfig(workspaceRoot) {
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
return JSON.parse(content);
|
|
156
|
-
}
|
|
157
|
-
catch (error) {
|
|
158
|
-
throw new Error(`Failed to parse af-config.json: ${error}`);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return null;
|
|
160
|
+
const config = loadConfig(workspaceRoot);
|
|
161
|
+
// The unified loader always returns a config (with defaults merged in).
|
|
162
|
+
// Convert to UserConfig shape for backward compat.
|
|
163
|
+
return config;
|
|
162
164
|
}
|
|
163
165
|
/**
|
|
164
166
|
* Expand environment variables in a string
|
|
@@ -205,6 +207,26 @@ export function getResolvedCommands(workspaceRoot) {
|
|
|
205
207
|
resolveCommand(userConfig?.shell?.shell, DEFAULT_COMMANDS.shell),
|
|
206
208
|
};
|
|
207
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* Get the resolved harness provider for the architect shell.
|
|
212
|
+
* Resolution: explicit architectHarness → auto-detect from architect command → default claude.
|
|
213
|
+
*/
|
|
214
|
+
export function getArchitectHarness(workspaceRoot) {
|
|
215
|
+
const root = workspaceRoot || findWorkspaceRoot();
|
|
216
|
+
const userConfig = loadUserConfig(root);
|
|
217
|
+
const architectCmd = resolveCommand(userConfig?.shell?.architect, DEFAULT_COMMANDS.architect);
|
|
218
|
+
return resolveHarness(userConfig?.shell?.architectHarness, userConfig?.harness, architectCmd);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get the resolved harness provider for the builder shell.
|
|
222
|
+
* Resolution: explicit builderHarness → auto-detect from builder command → default claude.
|
|
223
|
+
*/
|
|
224
|
+
export function getBuilderHarness(workspaceRoot) {
|
|
225
|
+
const root = workspaceRoot || findWorkspaceRoot();
|
|
226
|
+
const userConfig = loadUserConfig(root);
|
|
227
|
+
const builderCmd = resolveCommand(userConfig?.shell?.builder, DEFAULT_COMMANDS.builder);
|
|
228
|
+
return resolveHarness(userConfig?.shell?.builderHarness, userConfig?.harness, builderCmd);
|
|
229
|
+
}
|
|
208
230
|
/**
|
|
209
231
|
* Build configuration for the current project
|
|
210
232
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAkD,MAAM,cAAc,CAAC;AAE9F,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,mBAAmB;AACnB,MAAM,gBAAgB,GAAG;IACvB,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,0CAA0C;AAC1C,IAAI,YAAY,GAA8B,EAAE,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC;QACH,kEAAkE;QAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,gCAAgC,EAAE;YAC9D,GAAG,EAAE,GAAG;YACR,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,8CAA8C;QAC9C,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0EAA0E;QAC1E,yEAAyE;QACzE,sCAAsC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,iBAAiB,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IACzD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAEnD,IAAI,QAAQ,EAAE,CAAC;QACb,mEAAmE;QACnE,+DAA+D;QAC/D,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,OAAO,GAAG,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBACrC,4DAA4D;gBAC5D,yCAAyC;gBACzC,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;oBACtC,OAAO,GAAG,CAAC;gBACb,CAAC;gBACD,MAAM;YACR,CAAC;YACD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAED,wDAAwD;QACxD,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAC3C,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,OAAO,GAAG,KAAK,GAAG,EAAE,CAAC;QACnB,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,+BAA+B;IAC/B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe;IACtB,iEAAiE;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uDAAuD;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,wFAAwF;IACxF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,wCAAwC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yDAAyD;IACzD,OAAO,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,aAAqB,EAAE,UAA6B;IACvE,6BAA6B;IAC7B,IAAI,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,+CAA+C;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oDAAoD;IACpD,MAAM,iBAAiB,GAAG,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAC/D,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;AACpG,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,aAAqB;IAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IACzC,wEAAwE;IACxE,mDAAmD;IACnD,OAAO,MAAoB,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,OAAO,CAAC,2CAA2C,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAC1F,MAAM,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAkC,EAAE,UAAkB;IAC5E,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,yCAAyC;QACzC,OAAO,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAoC;IAClE,YAAY,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAsB;IACxD,MAAM,IAAI,GAAG,aAAa,IAAI,iBAAiB,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAExC,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,SAAS;YACtB,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,SAAS,CAAC;QACnF,OAAO,EAAE,YAAY,CAAC,OAAO;YACpB,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;QAC7E,KAAK,EAAE,YAAY,CAAC,KAAK;YAClB,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;KACxE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAsB;IACxD,MAAM,IAAI,GAAG,aAAa,IAAI,iBAAiB,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9F,OAAO,cAAc,CACnB,UAAU,EAAE,KAAK,EAAE,gBAAgB,EACnC,UAAU,EAAE,OAA0D,EACtE,YAAY,CACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAsB;IACtD,MAAM,IAAI,GAAG,aAAa,IAAI,iBAAiB,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxF,OAAO,cAAc,CACnB,UAAU,EAAE,KAAK,EAAE,cAAc,EACjC,UAAU,EAAE,OAA0D,EACtE,UAAU,CACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAEjD,OAAO;QACL,aAAa;QACb,QAAQ;QACR,WAAW,EAAE,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC;QAChD,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC;QAC/C,YAAY,EAAE,eAAe,EAAE;QAC/B,UAAU,EAAE,aAAa,EAAE;QAC3B,eAAe,EAAE,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC;QACvD,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,IAAI,UAAU;KAC7D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG;QACX,MAAM,CAAC,WAAW;QAClB,MAAM,CAAC,QAAQ;KAChB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent harness abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates how different agent CLI tools (Claude, Codex, Gemini, etc.)
|
|
5
|
+
* handle role/system prompt injection. Built-in providers cover Claude, Codex,
|
|
6
|
+
* and Gemini. Custom providers can be defined in .codev/config.json.
|
|
7
|
+
*
|
|
8
|
+
* Two integration patterns exist:
|
|
9
|
+
* - Node spawn() call sites: use buildRoleInjection() → returns args + env
|
|
10
|
+
* - Bash script generation: use buildScriptRoleInjection() → returns fragment + env
|
|
11
|
+
*
|
|
12
|
+
* @see codev/specs/591-af-workspace-failure-with-code.md
|
|
13
|
+
*/
|
|
14
|
+
export interface HarnessProvider {
|
|
15
|
+
/**
|
|
16
|
+
* For Node spawn() call sites (architect.ts, tower-utils.ts).
|
|
17
|
+
* Returns CLI args and env vars to inject the role.
|
|
18
|
+
*/
|
|
19
|
+
buildRoleInjection(roleContent: string, roleFilePath: string): {
|
|
20
|
+
args: string[];
|
|
21
|
+
env: Record<string, string>;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* For bash script generation (spawn-worktree.ts).
|
|
25
|
+
* Returns a shell fragment to append after the base command,
|
|
26
|
+
* and env vars the caller should export before the command.
|
|
27
|
+
*/
|
|
28
|
+
buildScriptRoleInjection(roleContent: string, roleFilePath: string): {
|
|
29
|
+
fragment: string;
|
|
30
|
+
env: Record<string, string>;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Optional: files to write in the worktree before launching the agent.
|
|
34
|
+
* Used by harnesses that rely on file-based configuration (e.g., OpenCode
|
|
35
|
+
* uses opencode.json's instructions field for role injection).
|
|
36
|
+
*/
|
|
37
|
+
getWorktreeFiles?(roleContent: string, roleFilePath: string): Array<{
|
|
38
|
+
relativePath: string;
|
|
39
|
+
content: string;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
42
|
+
/** Custom harness definition from .codev/config.json */
|
|
43
|
+
export interface CustomHarnessConfig {
|
|
44
|
+
roleArgs: string[];
|
|
45
|
+
roleEnv?: Record<string, string>;
|
|
46
|
+
roleScriptFragment: string;
|
|
47
|
+
roleScriptEnv?: Record<string, string>;
|
|
48
|
+
}
|
|
49
|
+
export declare const CLAUDE_HARNESS: HarnessProvider;
|
|
50
|
+
export declare const CODEX_HARNESS: HarnessProvider;
|
|
51
|
+
export declare const GEMINI_HARNESS: HarnessProvider;
|
|
52
|
+
export declare const OPENCODE_HARNESS: HarnessProvider;
|
|
53
|
+
/**
|
|
54
|
+
* Escape a string for safe inclusion inside single quotes in bash.
|
|
55
|
+
* Replaces ' with '\'' (end quote, escaped quote, start quote).
|
|
56
|
+
*/
|
|
57
|
+
export declare function shellEscapeSingleQuote(value: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Build a HarnessProvider from a custom config definition.
|
|
60
|
+
* Template variables (${ROLE_FILE}, ${ROLE_CONTENT}) are expanded at call time.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildCustomHarnessProvider(config: CustomHarnessConfig): HarnessProvider;
|
|
63
|
+
/**
|
|
64
|
+
* Validate a custom harness config entry.
|
|
65
|
+
* Throws a descriptive error if required fields are missing or wrong type.
|
|
66
|
+
*/
|
|
67
|
+
export declare function validateCustomHarnessConfig(name: string, config: unknown): CustomHarnessConfig;
|
|
68
|
+
/**
|
|
69
|
+
* Detect harness type from a command string by extracting the basename of the
|
|
70
|
+
* first token and matching against known CLI names.
|
|
71
|
+
* Returns undefined if no match (caller decides what to do).
|
|
72
|
+
*/
|
|
73
|
+
export declare function detectHarnessFromCommand(command: string): string | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a harness name to a HarnessProvider.
|
|
76
|
+
*
|
|
77
|
+
* Resolution order:
|
|
78
|
+
* 1. Explicit harnessName → built-in or custom provider
|
|
79
|
+
* 2. Auto-detect from command string basename (if command provided)
|
|
80
|
+
* 3. Default to claude (backward compatible)
|
|
81
|
+
*
|
|
82
|
+
* Throws if harnessName is set but doesn't match any known provider.
|
|
83
|
+
*/
|
|
84
|
+
export declare function resolveHarness(harnessName: string | undefined, customHarnesses?: Record<string, CustomHarnessConfig>, command?: string): HarnessProvider;
|
|
85
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/utils/harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG;QAC7D,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC7B,CAAC;IAEF;;;;OAIG;IACH,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG;QACnE,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC7B,CAAC;IAEF;;;;OAIG;IACH,gBAAgB,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,KAAK,CAAC;QAClE,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAMD,eAAO,MAAM,cAAc,EAAE,eAS5B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAS3B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAS5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAc9B,CAAC;AAyBF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAMD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,mBAAmB,GAAG,eAAe,CAmBvF;AAMD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,mBAAmB,CAyC9F;AAMD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAa5E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACrD,OAAO,CAAC,EAAE,MAAM,GACf,eAAe,CA+BjB"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent harness abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates how different agent CLI tools (Claude, Codex, Gemini, etc.)
|
|
5
|
+
* handle role/system prompt injection. Built-in providers cover Claude, Codex,
|
|
6
|
+
* and Gemini. Custom providers can be defined in .codev/config.json.
|
|
7
|
+
*
|
|
8
|
+
* Two integration patterns exist:
|
|
9
|
+
* - Node spawn() call sites: use buildRoleInjection() → returns args + env
|
|
10
|
+
* - Bash script generation: use buildScriptRoleInjection() → returns fragment + env
|
|
11
|
+
*
|
|
12
|
+
* @see codev/specs/591-af-workspace-failure-with-code.md
|
|
13
|
+
*/
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Built-in providers
|
|
16
|
+
// =============================================================================
|
|
17
|
+
export const CLAUDE_HARNESS = {
|
|
18
|
+
buildRoleInjection: (content, _filePath) => ({
|
|
19
|
+
args: ['--append-system-prompt', content],
|
|
20
|
+
env: {},
|
|
21
|
+
}),
|
|
22
|
+
buildScriptRoleInjection: (_content, filePath) => ({
|
|
23
|
+
fragment: `--append-system-prompt "$(cat '${shellEscapeSingleQuote(filePath)}')"`,
|
|
24
|
+
env: {},
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
export const CODEX_HARNESS = {
|
|
28
|
+
buildRoleInjection: (_content, filePath) => ({
|
|
29
|
+
args: ['-c', `model_instructions_file=${filePath}`],
|
|
30
|
+
env: {},
|
|
31
|
+
}),
|
|
32
|
+
buildScriptRoleInjection: (_content, filePath) => ({
|
|
33
|
+
fragment: `-c model_instructions_file='${shellEscapeSingleQuote(filePath)}'`,
|
|
34
|
+
env: {},
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
export const GEMINI_HARNESS = {
|
|
38
|
+
buildRoleInjection: (_content, filePath) => ({
|
|
39
|
+
args: [],
|
|
40
|
+
env: { GEMINI_SYSTEM_MD: filePath },
|
|
41
|
+
}),
|
|
42
|
+
buildScriptRoleInjection: (_content, filePath) => ({
|
|
43
|
+
fragment: '',
|
|
44
|
+
env: { GEMINI_SYSTEM_MD: filePath },
|
|
45
|
+
}),
|
|
46
|
+
};
|
|
47
|
+
export const OPENCODE_HARNESS = {
|
|
48
|
+
buildRoleInjection: () => {
|
|
49
|
+
throw new Error('OpenCode is only supported as a builder shell, not as an architect shell. ' +
|
|
50
|
+
'OpenCode uses file-based role injection (opencode.json instructions field) ' +
|
|
51
|
+
'which requires an ephemeral worktree. Configure a different shell for ' +
|
|
52
|
+
'the architect (e.g., "claude --dangerously-skip-permissions").');
|
|
53
|
+
},
|
|
54
|
+
buildScriptRoleInjection: () => ({ fragment: '', env: {} }),
|
|
55
|
+
getWorktreeFiles: () => ([{
|
|
56
|
+
relativePath: 'opencode.json',
|
|
57
|
+
content: JSON.stringify({ instructions: ['.builder-role.md'] }, null, 2) + '\n',
|
|
58
|
+
}]),
|
|
59
|
+
};
|
|
60
|
+
const BUILTIN_HARNESSES = {
|
|
61
|
+
claude: CLAUDE_HARNESS,
|
|
62
|
+
codex: CODEX_HARNESS,
|
|
63
|
+
gemini: GEMINI_HARNESS,
|
|
64
|
+
opencode: OPENCODE_HARNESS,
|
|
65
|
+
};
|
|
66
|
+
// =============================================================================
|
|
67
|
+
// Template expansion
|
|
68
|
+
// =============================================================================
|
|
69
|
+
/**
|
|
70
|
+
* Expand template variables in a string.
|
|
71
|
+
* ${ROLE_FILE} → roleFilePath, ${ROLE_CONTENT} → roleContent.
|
|
72
|
+
* Unknown ${...} variables are left unexpanded (makes typos visible).
|
|
73
|
+
*/
|
|
74
|
+
function expandTemplateVars(template, roleContent, roleFilePath) {
|
|
75
|
+
// Use replacer functions to avoid $& / $' / $` interpretation in replacement strings
|
|
76
|
+
return template
|
|
77
|
+
.replace(/\$\{ROLE_FILE\}/g, () => roleFilePath)
|
|
78
|
+
.replace(/\$\{ROLE_CONTENT\}/g, () => roleContent);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Escape a string for safe inclusion inside single quotes in bash.
|
|
82
|
+
* Replaces ' with '\'' (end quote, escaped quote, start quote).
|
|
83
|
+
*/
|
|
84
|
+
export function shellEscapeSingleQuote(value) {
|
|
85
|
+
return value.replace(/'/g, "'\\''");
|
|
86
|
+
}
|
|
87
|
+
// =============================================================================
|
|
88
|
+
// Custom harness provider
|
|
89
|
+
// =============================================================================
|
|
90
|
+
/**
|
|
91
|
+
* Build a HarnessProvider from a custom config definition.
|
|
92
|
+
* Template variables (${ROLE_FILE}, ${ROLE_CONTENT}) are expanded at call time.
|
|
93
|
+
*/
|
|
94
|
+
export function buildCustomHarnessProvider(config) {
|
|
95
|
+
return {
|
|
96
|
+
buildRoleInjection: (content, filePath) => ({
|
|
97
|
+
args: config.roleArgs.map(arg => expandTemplateVars(arg, content, filePath)),
|
|
98
|
+
env: Object.fromEntries(Object.entries(config.roleEnv ?? {}).map(([k, v]) => [k, expandTemplateVars(v, content, filePath)])),
|
|
99
|
+
}),
|
|
100
|
+
buildScriptRoleInjection: (content, filePath) => ({
|
|
101
|
+
fragment: expandTemplateVars(config.roleScriptFragment, content, filePath),
|
|
102
|
+
env: Object.fromEntries(Object.entries(config.roleScriptEnv ?? {}).map(([k, v]) => [k, expandTemplateVars(v, content, filePath)])),
|
|
103
|
+
}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// =============================================================================
|
|
107
|
+
// Validation
|
|
108
|
+
// =============================================================================
|
|
109
|
+
/**
|
|
110
|
+
* Validate a custom harness config entry.
|
|
111
|
+
* Throws a descriptive error if required fields are missing or wrong type.
|
|
112
|
+
*/
|
|
113
|
+
export function validateCustomHarnessConfig(name, config) {
|
|
114
|
+
if (typeof config !== 'object' || config === null) {
|
|
115
|
+
throw new Error(`Harness "${name}": expected an object, got ${typeof config}`);
|
|
116
|
+
}
|
|
117
|
+
const obj = config;
|
|
118
|
+
if (!Array.isArray(obj.roleArgs)) {
|
|
119
|
+
throw new Error(`Harness "${name}": missing required field "roleArgs" (must be a string array)`);
|
|
120
|
+
}
|
|
121
|
+
if (!obj.roleArgs.every((a) => typeof a === 'string')) {
|
|
122
|
+
throw new Error(`Harness "${name}": "roleArgs" must contain only strings`);
|
|
123
|
+
}
|
|
124
|
+
if (typeof obj.roleScriptFragment !== 'string') {
|
|
125
|
+
throw new Error(`Harness "${name}": missing required field "roleScriptFragment" (must be a string)`);
|
|
126
|
+
}
|
|
127
|
+
if (obj.roleEnv !== undefined) {
|
|
128
|
+
if (typeof obj.roleEnv !== 'object' || obj.roleEnv === null) {
|
|
129
|
+
throw new Error(`Harness "${name}": "roleEnv" must be an object if provided`);
|
|
130
|
+
}
|
|
131
|
+
for (const [k, v] of Object.entries(obj.roleEnv)) {
|
|
132
|
+
if (typeof v !== 'string') {
|
|
133
|
+
throw new Error(`Harness "${name}": "roleEnv.${k}" must be a string, got ${typeof v}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (obj.roleScriptEnv !== undefined) {
|
|
138
|
+
if (typeof obj.roleScriptEnv !== 'object' || obj.roleScriptEnv === null) {
|
|
139
|
+
throw new Error(`Harness "${name}": "roleScriptEnv" must be an object if provided`);
|
|
140
|
+
}
|
|
141
|
+
for (const [k, v] of Object.entries(obj.roleScriptEnv)) {
|
|
142
|
+
if (typeof v !== 'string') {
|
|
143
|
+
throw new Error(`Harness "${name}": "roleScriptEnv.${k}" must be a string, got ${typeof v}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return obj;
|
|
148
|
+
}
|
|
149
|
+
// =============================================================================
|
|
150
|
+
// Auto-detection
|
|
151
|
+
// =============================================================================
|
|
152
|
+
/**
|
|
153
|
+
* Detect harness type from a command string by extracting the basename of the
|
|
154
|
+
* first token and matching against known CLI names.
|
|
155
|
+
* Returns undefined if no match (caller decides what to do).
|
|
156
|
+
*/
|
|
157
|
+
export function detectHarnessFromCommand(command) {
|
|
158
|
+
const firstToken = command.trim().split(/\s+/)[0];
|
|
159
|
+
if (!firstToken)
|
|
160
|
+
return undefined;
|
|
161
|
+
// Extract basename (handles full paths like /opt/homebrew/bin/codex)
|
|
162
|
+
const basename = firstToken.split('/').pop() || firstToken;
|
|
163
|
+
if (basename.includes('claude'))
|
|
164
|
+
return 'claude';
|
|
165
|
+
if (basename.includes('codex'))
|
|
166
|
+
return 'codex';
|
|
167
|
+
if (basename.includes('gemini'))
|
|
168
|
+
return 'gemini';
|
|
169
|
+
if (basename.includes('opencode'))
|
|
170
|
+
return 'opencode';
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
// =============================================================================
|
|
174
|
+
// Resolution
|
|
175
|
+
// =============================================================================
|
|
176
|
+
/**
|
|
177
|
+
* Resolve a harness name to a HarnessProvider.
|
|
178
|
+
*
|
|
179
|
+
* Resolution order:
|
|
180
|
+
* 1. Explicit harnessName → built-in or custom provider
|
|
181
|
+
* 2. Auto-detect from command string basename (if command provided)
|
|
182
|
+
* 3. Default to claude (backward compatible)
|
|
183
|
+
*
|
|
184
|
+
* Throws if harnessName is set but doesn't match any known provider.
|
|
185
|
+
*/
|
|
186
|
+
export function resolveHarness(harnessName, customHarnesses, command) {
|
|
187
|
+
// Explicit harness name takes priority
|
|
188
|
+
if (harnessName) {
|
|
189
|
+
const builtin = BUILTIN_HARNESSES[harnessName];
|
|
190
|
+
if (builtin)
|
|
191
|
+
return builtin;
|
|
192
|
+
if (customHarnesses && harnessName in customHarnesses) {
|
|
193
|
+
return buildCustomHarnessProvider(customHarnesses[harnessName]);
|
|
194
|
+
}
|
|
195
|
+
const knownNames = Object.keys(BUILTIN_HARNESSES);
|
|
196
|
+
const customNames = customHarnesses ? Object.keys(customHarnesses) : [];
|
|
197
|
+
const allNames = [...knownNames, ...customNames];
|
|
198
|
+
throw new Error(`Unknown harness "${harnessName}". ` +
|
|
199
|
+
`Available harnesses: ${allNames.join(', ') || '(none)'}. ` +
|
|
200
|
+
`Configure a custom harness in .codev/config.json under the "harness" section.`);
|
|
201
|
+
}
|
|
202
|
+
// Auto-detect from command basename
|
|
203
|
+
if (command) {
|
|
204
|
+
const detected = detectHarnessFromCommand(command);
|
|
205
|
+
if (detected) {
|
|
206
|
+
return BUILTIN_HARNESSES[detected];
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Default to claude
|
|
210
|
+
return CLAUDE_HARNESS;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
* Role prompt utilities
|
|
3
3
|
* Extracted from start.ts, spawn.ts, architect.ts to eliminate duplication
|
|
4
4
|
* (Maintenance Run 0004)
|
|
5
|
+
*
|
|
6
|
+
* Uses the unified file resolver for per-file resolution:
|
|
7
|
+
* .codev/roles/<name>.md → codev/roles/<name>.md → skeleton/roles/<name>.md
|
|
5
8
|
*/
|
|
6
9
|
export interface RoleConfig {
|
|
7
10
|
codevDir: string;
|
|
8
11
|
bundledRolesDir: string;
|
|
12
|
+
/** Workspace root for unified file resolution. Falls back to bundledRolesDir if not set. */
|
|
13
|
+
workspaceRoot?: string;
|
|
9
14
|
}
|
|
10
15
|
export interface RolePromptPath {
|
|
11
16
|
path: string;
|
|
@@ -16,15 +21,17 @@ export interface RolePromptContent {
|
|
|
16
21
|
source: 'local' | 'bundled';
|
|
17
22
|
}
|
|
18
23
|
/**
|
|
19
|
-
* Find role prompt file path
|
|
20
|
-
*
|
|
24
|
+
* Find role prompt file path using unified per-file resolution.
|
|
25
|
+
* Each role file is resolved independently so partial overrides work correctly.
|
|
26
|
+
*
|
|
27
|
+
* @param config - Configuration with codevDir, bundledRolesDir, and optionally workspaceRoot
|
|
21
28
|
* @param roleName - Name of the role (e.g., 'architect', 'builder')
|
|
22
29
|
* @returns Path info or null if not found
|
|
23
30
|
*/
|
|
24
31
|
export declare function findRolePromptPath(config: RoleConfig, roleName: string): RolePromptPath | null;
|
|
25
32
|
/**
|
|
26
|
-
* Load role prompt content
|
|
27
|
-
* @param config - Configuration with codevDir and
|
|
33
|
+
* Load role prompt content using unified per-file resolution.
|
|
34
|
+
* @param config - Configuration with codevDir, bundledRolesDir, and optionally workspaceRoot
|
|
28
35
|
* @param roleName - Name of the role (e.g., 'architect', 'builder')
|
|
29
36
|
* @returns Content and source or null if not found
|
|
30
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/utils/roles.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/utils/roles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAwB9F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAS7F"}
|
|
@@ -2,22 +2,37 @@
|
|
|
2
2
|
* Role prompt utilities
|
|
3
3
|
* Extracted from start.ts, spawn.ts, architect.ts to eliminate duplication
|
|
4
4
|
* (Maintenance Run 0004)
|
|
5
|
+
*
|
|
6
|
+
* Uses the unified file resolver for per-file resolution:
|
|
7
|
+
* .codev/roles/<name>.md → codev/roles/<name>.md → skeleton/roles/<name>.md
|
|
5
8
|
*/
|
|
6
9
|
import { existsSync, readFileSync } from 'node:fs';
|
|
7
10
|
import { resolve } from 'node:path';
|
|
11
|
+
import { resolveCodevFile } from '../../lib/skeleton.js';
|
|
8
12
|
/**
|
|
9
|
-
* Find role prompt file path
|
|
10
|
-
*
|
|
13
|
+
* Find role prompt file path using unified per-file resolution.
|
|
14
|
+
* Each role file is resolved independently so partial overrides work correctly.
|
|
15
|
+
*
|
|
16
|
+
* @param config - Configuration with codevDir, bundledRolesDir, and optionally workspaceRoot
|
|
11
17
|
* @param roleName - Name of the role (e.g., 'architect', 'builder')
|
|
12
18
|
* @returns Path info or null if not found
|
|
13
19
|
*/
|
|
14
20
|
export function findRolePromptPath(config, roleName) {
|
|
15
|
-
//
|
|
21
|
+
// Use unified resolver when workspaceRoot is available
|
|
22
|
+
if (config.workspaceRoot) {
|
|
23
|
+
const resolved = resolveCodevFile(`roles/${roleName}.md`, config.workspaceRoot);
|
|
24
|
+
if (resolved) {
|
|
25
|
+
// Determine source based on path
|
|
26
|
+
const isLocal = resolved.includes('.codev/') || resolved.includes('codev/roles/');
|
|
27
|
+
return { path: resolved, source: isLocal ? 'local' : 'bundled' };
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// Legacy fallback for callers that don't provide workspaceRoot
|
|
16
32
|
const localPath = resolve(config.codevDir, 'roles', `${roleName}.md`);
|
|
17
33
|
if (existsSync(localPath)) {
|
|
18
34
|
return { path: localPath, source: 'local' };
|
|
19
35
|
}
|
|
20
|
-
// Fall back to bundled
|
|
21
36
|
const bundledPath = resolve(config.bundledRolesDir, `${roleName}.md`);
|
|
22
37
|
if (existsSync(bundledPath)) {
|
|
23
38
|
return { path: bundledPath, source: 'bundled' };
|
|
@@ -25,8 +40,8 @@ export function findRolePromptPath(config, roleName) {
|
|
|
25
40
|
return null;
|
|
26
41
|
}
|
|
27
42
|
/**
|
|
28
|
-
* Load role prompt content
|
|
29
|
-
* @param config - Configuration with codevDir and
|
|
43
|
+
* Load role prompt content using unified per-file resolution.
|
|
44
|
+
* @param config - Configuration with codevDir, bundledRolesDir, and optionally workspaceRoot
|
|
30
45
|
* @param roleName - Name of the role (e.g., 'architect', 'builder')
|
|
31
46
|
* @returns Content and source or null if not found
|
|
32
47
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/roles.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/agent-farm/utils/roles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAmBzD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAkB,EAAE,QAAgB;IACrE,uDAAuD;IACvD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,QAAQ,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAChF,IAAI,QAAQ,EAAE,CAAC;YACb,iCAAiC;YACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAClF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+DAA+D;IAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;IACtE,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;IACtE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB,EAAE,QAAgB;IACjE,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;QAC3C,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* Run the CLI with given arguments
|
|
7
|
-
* Used by bin shims (
|
|
7
|
+
* Used by bin shims (afx.js, consult.js) to inject commands
|
|
8
8
|
*/
|
|
9
9
|
export declare function run(args: string[]): Promise<void>;
|
|
10
10
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG;AAiXH;;;GAGG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUvD"}
|