@voybio/ace-swarm 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.
- package/CHANGELOG.md +109 -0
- package/LICENSE +186 -0
- package/README.md +229 -0
- package/assets/.agents/ACE/ACE-Init/AGENTS.md +210 -0
- package/assets/.agents/ACE/ACE-Init/instructions.md +118 -0
- package/assets/.agents/ACE/ACE_coders/AGENTS.md +154 -0
- package/assets/.agents/ACE/ACE_coders/INSTRUCTIONS.md +216 -0
- package/assets/.agents/ACE/AGENT_REGISTRY.md +70 -0
- package/assets/.agents/ACE/AGENT_REGISTRY_7.md +9 -0
- package/assets/.agents/ACE/DIRECTIVE_KERNEL.md +234 -0
- package/assets/.agents/ACE/UI/AGENTS.md +115 -0
- package/assets/.agents/ACE/UI/instructions.md +178 -0
- package/assets/.agents/ACE/VOS/ACE_VOS_MISSING_INFO_MATRIX.md +42 -0
- package/assets/.agents/ACE/VOS/AGENTS.md +72 -0
- package/assets/.agents/ACE/VOS/instructions.md +211 -0
- package/assets/.agents/ACE/agent-astgrep/AGENTS.md +123 -0
- package/assets/.agents/ACE/agent-astgrep/instructions.md +91 -0
- package/assets/.agents/ACE/agent-builder/AGENTS.md +172 -0
- package/assets/.agents/ACE/agent-builder/instructions.md +137 -0
- package/assets/.agents/ACE/agent-docs/AGENTS.md +159 -0
- package/assets/.agents/ACE/agent-docs/instructions.md +133 -0
- package/assets/.agents/ACE/agent-eval/AGENTS.md +46 -0
- package/assets/.agents/ACE/agent-eval/instructions.md +56 -0
- package/assets/.agents/ACE/agent-memory/AGENTS.md +49 -0
- package/assets/.agents/ACE/agent-memory/instructions.md +50 -0
- package/assets/.agents/ACE/agent-observability/AGENTS.md +46 -0
- package/assets/.agents/ACE/agent-observability/instructions.md +50 -0
- package/assets/.agents/ACE/agent-ops/AGENTS.md +201 -0
- package/assets/.agents/ACE/agent-ops/instructions.md +136 -0
- package/assets/.agents/ACE/agent-qa/AGENTS.md +189 -0
- package/assets/.agents/ACE/agent-qa/instructions.md +121 -0
- package/assets/.agents/ACE/agent-release/AGENTS.md +48 -0
- package/assets/.agents/ACE/agent-release/instructions.md +49 -0
- package/assets/.agents/ACE/agent-research/AGENTS.md +160 -0
- package/assets/.agents/ACE/agent-research/instructions.md +118 -0
- package/assets/.agents/ACE/agent-security/AGENTS.md +48 -0
- package/assets/.agents/ACE/agent-security/instructions.md +50 -0
- package/assets/.agents/ACE/agent-skeptic/AGENTS.md +178 -0
- package/assets/.agents/ACE/agent-skeptic/instructions.md +196 -0
- package/assets/.agents/ACE/agent-spec/AGENTS.md +169 -0
- package/assets/.agents/ACE/agent-spec/instructions.md +116 -0
- package/assets/.agents/ACE/orchestrator/AGENTS.md +365 -0
- package/assets/.agents/ACE/orchestrator/instructions.md +231 -0
- package/assets/.agents/skills/ace-orchestrator/SKILL.md +63 -0
- package/assets/.agents/skills/ace-orchestrator/references/engineering-bootstrap-playbook.md +360 -0
- package/assets/.agents/skills/astgrep-index/SKILL.md +58 -0
- package/assets/.agents/skills/codemunch/SKILL.md +65 -0
- package/assets/.agents/skills/codemunch/references/ast-driven-protocol.md +543 -0
- package/assets/.agents/skills/codesnipe/SKILL.md +64 -0
- package/assets/.agents/skills/codesnipe/references/dual-codebase-playbook.md +671 -0
- package/assets/.agents/skills/eval-harness/SKILL.md +203 -0
- package/assets/.agents/skills/handoff-lint/SKILL.md +164 -0
- package/assets/.agents/skills/incident-commander/SKILL.md +174 -0
- package/assets/.agents/skills/landing-review-watcher/SKILL.md +68 -0
- package/assets/.agents/skills/memory-curator/SKILL.md +179 -0
- package/assets/.agents/skills/problem-triage/SKILL.md +57 -0
- package/assets/.agents/skills/problem-triage/agents/openai.yaml +3 -0
- package/assets/.agents/skills/release-sentry/SKILL.md +189 -0
- package/assets/.agents/skills/risk-quant/SKILL.md +190 -0
- package/assets/.agents/skills/schema-forge/SKILL.md +174 -0
- package/assets/.agents/skills/skill-auditor/SKILL.md +52 -0
- package/assets/.agents/skills/state-auditor/SKILL.md +182 -0
- package/assets/.github/hooks/ace-copilot.json +68 -0
- package/assets/agent-state/ACE_WORKFLOW.md +131 -0
- package/assets/agent-state/ARTIFACT_MANIFEST.json +5 -0
- package/assets/agent-state/AST_GREP_COMMANDS.md +121 -0
- package/assets/agent-state/AST_GREP_INDEX.json +13 -0
- package/assets/agent-state/AST_GREP_INDEX.md +15 -0
- package/assets/agent-state/DECISIONS.md +7 -0
- package/assets/agent-state/EVIDENCE_LOG.md +7 -0
- package/assets/agent-state/HANDOFF.json +24 -0
- package/assets/agent-state/INTERFACE_REGISTRY.md +75 -0
- package/assets/agent-state/MODULES/gates/gate-autonomy.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-completeness.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-correctness.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-evaluation.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-operability.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-security.json +7 -0
- package/assets/agent-state/MODULES/gates/gate-typescript-public-surface.json +7 -0
- package/assets/agent-state/MODULES/registry.json +41 -0
- package/assets/agent-state/MODULES/roles/capability-astgrep.json +49 -0
- package/assets/agent-state/MODULES/roles/capability-build.json +39 -0
- package/assets/agent-state/MODULES/roles/capability-docs.json +38 -0
- package/assets/agent-state/MODULES/roles/capability-eval.json +20 -0
- package/assets/agent-state/MODULES/roles/capability-memory.json +20 -0
- package/assets/agent-state/MODULES/roles/capability-observability.json +20 -0
- package/assets/agent-state/MODULES/roles/capability-ops.json +45 -0
- package/assets/agent-state/MODULES/roles/capability-qa.json +40 -0
- package/assets/agent-state/MODULES/roles/capability-release.json +21 -0
- package/assets/agent-state/MODULES/roles/capability-research.json +44 -0
- package/assets/agent-state/MODULES/roles/capability-security.json +21 -0
- package/assets/agent-state/MODULES/roles/capability-skeptic.json +48 -0
- package/assets/agent-state/MODULES/roles/capability-spec.json +42 -0
- package/assets/agent-state/MODULES/schemas/ACE_RUNTIME_PROFILE.schema.json +289 -0
- package/assets/agent-state/MODULES/schemas/ARTIFACT_MANIFEST.schema.json +185 -0
- package/assets/agent-state/MODULES/schemas/HANDOFF.agent-state.schema.json +124 -0
- package/assets/agent-state/MODULES/schemas/HANDOFF.schema.json +55 -0
- package/assets/agent-state/MODULES/schemas/RUNTIME_EXECUTOR_SESSION_REGISTRY.schema.json +290 -0
- package/assets/agent-state/MODULES/schemas/RUNTIME_TOOL_SPEC_REGISTRY.schema.json +144 -0
- package/assets/agent-state/MODULES/schemas/STATUS_EVENT.schema.json +84 -0
- package/assets/agent-state/MODULES/schemas/SWARM_HANDOFF.schema.json +138 -0
- package/assets/agent-state/MODULES/schemas/TRACKER_SNAPSHOT.schema.json +134 -0
- package/assets/agent-state/MODULES/schemas/VERICIFY_BRIDGE_SNAPSHOT.schema.json +157 -0
- package/assets/agent-state/MODULES/schemas/VERICIFY_PROCESS_POST_LOG.schema.json +93 -0
- package/assets/agent-state/MODULES/schemas/WORKSPACE_SESSION_REGISTRY.schema.json +133 -0
- package/assets/agent-state/PROVENANCE_LOG.md +28 -0
- package/assets/agent-state/QUALITY_GATES.md +15 -0
- package/assets/agent-state/RISKS.md +8 -0
- package/assets/agent-state/SCOPE.md +20 -0
- package/assets/agent-state/SKILL_CATALOG.md +48 -0
- package/assets/agent-state/STATUS.md +8 -0
- package/assets/agent-state/STATUS_EVENTS.ndjson +1 -0
- package/assets/agent-state/TASK.md +18 -0
- package/assets/agent-state/TEAL_CONFIG.md +117 -0
- package/assets/agent-state/handoff-registry.json +5 -0
- package/assets/agent-state/index-fingerprints.json +7 -0
- package/assets/agent-state/index.json +32 -0
- package/assets/agent-state/run-ledger.json +5 -0
- package/assets/agent-state/runtime-executor-sessions.json +5 -0
- package/assets/agent-state/runtime-tool-specs.json +5 -0
- package/assets/agent-state/runtime-workspaces.json +5 -0
- package/assets/agent-state/todo-state.json +7 -0
- package/assets/agent-state/tracker-snapshot.json +7 -0
- package/assets/agent-state/vericify/ace-bridge.json +60 -0
- package/assets/agent-state/vericify/process-posts.json +5 -0
- package/assets/instructions/ACE.instructions.md +187 -0
- package/assets/instructions/ACE_Coder.instructions.md +146 -0
- package/assets/instructions/ACE_UI.instructions.md +178 -0
- package/assets/instructions/ACE_VOS.instructions.md +211 -0
- package/assets/scripts/ace-hook-dispatch.mjs +538 -0
- package/assets/scripts/bootstrap-workspace.sh +27 -0
- package/assets/scripts/copilot-hook-dispatch.mjs +3 -0
- package/assets/scripts/eval-harness.sh +68 -0
- package/assets/scripts/render-mcp-configs.sh +396 -0
- package/assets/tasks/README.md +48 -0
- package/assets/tasks/SWARM_HANDOFF.example.json +53 -0
- package/assets/tasks/SWARM_HANDOFF.example_ui_to_coders.json +55 -0
- package/assets/tasks/SWARM_HANDOFF.example_vos_to_ui.json +55 -0
- package/assets/tasks/SWARM_HANDOFF.template.json +52 -0
- package/assets/tasks/cli_work_split.md +22 -0
- package/assets/tasks/lessons.md +17 -0
- package/assets/tasks/role_tasks.md +206 -0
- package/assets/tasks/todo.md +23 -0
- package/dist/ace-autonomy.d.ts +137 -0
- package/dist/ace-autonomy.js +472 -0
- package/dist/ace-context.d.ts +29 -0
- package/dist/ace-context.js +240 -0
- package/dist/ace-internal-tools.d.ts +8 -0
- package/dist/ace-internal-tools.js +76 -0
- package/dist/ace-server-instructions.d.ts +12 -0
- package/dist/ace-server-instructions.js +324 -0
- package/dist/agent-runtime/role-adapters.d.ts +29 -0
- package/dist/agent-runtime/role-adapters.js +573 -0
- package/dist/astgrep-index.d.ts +24 -0
- package/dist/astgrep-index.js +476 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +591 -0
- package/dist/git-ops.d.ts +53 -0
- package/dist/git-ops.js +238 -0
- package/dist/handoff-registry.d.ts +71 -0
- package/dist/handoff-registry.js +422 -0
- package/dist/helpers.d.ts +126 -0
- package/dist/helpers.js +1687 -0
- package/dist/index-store.d.ts +51 -0
- package/dist/index-store.js +328 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +7 -0
- package/dist/internal-tool-runtime.d.ts +21 -0
- package/dist/internal-tool-runtime.js +136 -0
- package/dist/job-scheduler.d.ts +175 -0
- package/dist/job-scheduler.js +1217 -0
- package/dist/kanban.d.ts +27 -0
- package/dist/kanban.js +339 -0
- package/dist/local-model-runtime.d.ts +40 -0
- package/dist/local-model-runtime.js +174 -0
- package/dist/model-bridge.d.ts +54 -0
- package/dist/model-bridge.js +587 -0
- package/dist/orchestrator-supervisor.d.ts +100 -0
- package/dist/orchestrator-supervisor.js +399 -0
- package/dist/problem-triage.d.ts +23 -0
- package/dist/problem-triage.js +448 -0
- package/dist/prompts.d.ts +7 -0
- package/dist/prompts.js +628 -0
- package/dist/public-surface.d.ts +30 -0
- package/dist/public-surface.js +316 -0
- package/dist/resources.d.ts +7 -0
- package/dist/resources.js +545 -0
- package/dist/run-ledger.d.ts +36 -0
- package/dist/run-ledger.js +257 -0
- package/dist/runtime-command.d.ts +18 -0
- package/dist/runtime-command.js +76 -0
- package/dist/runtime-executor.d.ts +104 -0
- package/dist/runtime-executor.js +985 -0
- package/dist/runtime-profile.d.ts +116 -0
- package/dist/runtime-profile.js +532 -0
- package/dist/runtime-tool-specs.d.ts +68 -0
- package/dist/runtime-tool-specs.js +527 -0
- package/dist/safe-edit.d.ts +52 -0
- package/dist/safe-edit.js +255 -0
- package/dist/schemas.d.ts +44 -0
- package/dist/schemas.js +830 -0
- package/dist/semantic-cache.d.ts +147 -0
- package/dist/semantic-cache.js +552 -0
- package/dist/semantic-hash.d.ts +83 -0
- package/dist/semantic-hash.js +346 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.js +46 -0
- package/dist/shared.d.ts +136 -0
- package/dist/shared.js +269 -0
- package/dist/skill-auditor.d.ts +26 -0
- package/dist/skill-auditor.js +184 -0
- package/dist/skill-catalog.d.ts +60 -0
- package/dist/skill-catalog.js +305 -0
- package/dist/status-events.d.ts +40 -0
- package/dist/status-events.js +269 -0
- package/dist/store/ace-packed-store.d.ts +69 -0
- package/dist/store/ace-packed-store.js +434 -0
- package/dist/store/bootstrap-store.d.ts +46 -0
- package/dist/store/bootstrap-store.js +242 -0
- package/dist/store/catalog-builder.d.ts +21 -0
- package/dist/store/catalog-builder.js +68 -0
- package/dist/store/importer.d.ts +19 -0
- package/dist/store/importer.js +157 -0
- package/dist/store/knowledge-bake.d.ts +59 -0
- package/dist/store/knowledge-bake.js +339 -0
- package/dist/store/materializers/hook-context-materializer.d.ts +25 -0
- package/dist/store/materializers/hook-context-materializer.js +100 -0
- package/dist/store/materializers/host-file-materializer.d.ts +37 -0
- package/dist/store/materializers/host-file-materializer.js +271 -0
- package/dist/store/materializers/todo-syncer.d.ts +30 -0
- package/dist/store/materializers/todo-syncer.js +140 -0
- package/dist/store/materializers/vericify-projector.d.ts +38 -0
- package/dist/store/materializers/vericify-projector.js +239 -0
- package/dist/store/repositories/discovery-repository.d.ts +24 -0
- package/dist/store/repositories/discovery-repository.js +58 -0
- package/dist/store/repositories/handoff-repository.d.ts +31 -0
- package/dist/store/repositories/handoff-repository.js +67 -0
- package/dist/store/repositories/ledger-repository.d.ts +26 -0
- package/dist/store/repositories/ledger-repository.js +49 -0
- package/dist/store/repositories/runtime-kv-repository.d.ts +16 -0
- package/dist/store/repositories/runtime-kv-repository.js +36 -0
- package/dist/store/repositories/scheduler-repository.d.ts +50 -0
- package/dist/store/repositories/scheduler-repository.js +123 -0
- package/dist/store/repositories/session-repository.d.ts +33 -0
- package/dist/store/repositories/session-repository.js +82 -0
- package/dist/store/repositories/todo-repository.d.ts +31 -0
- package/dist/store/repositories/todo-repository.js +77 -0
- package/dist/store/repositories/tracker-repository.d.ts +25 -0
- package/dist/store/repositories/tracker-repository.js +43 -0
- package/dist/store/repositories/vericify-repository.d.ts +32 -0
- package/dist/store/repositories/vericify-repository.js +58 -0
- package/dist/store/skills-install.d.ts +28 -0
- package/dist/store/skills-install.js +86 -0
- package/dist/store/state-reader.d.ts +49 -0
- package/dist/store/state-reader.js +111 -0
- package/dist/store/store-artifacts.d.ts +12 -0
- package/dist/store/store-artifacts.js +138 -0
- package/dist/store/store-snapshot.d.ts +19 -0
- package/dist/store/store-snapshot.js +140 -0
- package/dist/store/topology-bake.d.ts +15 -0
- package/dist/store/topology-bake.js +215 -0
- package/dist/store/types.d.ts +155 -0
- package/dist/store/types.js +35 -0
- package/dist/store/workspace-snapshot.d.ts +26 -0
- package/dist/store/workspace-snapshot.js +107 -0
- package/dist/store/write-queue.d.ts +7 -0
- package/dist/store/write-queue.js +26 -0
- package/dist/todo-state.d.ts +41 -0
- package/dist/todo-state.js +399 -0
- package/dist/tools-agent.d.ts +7 -0
- package/dist/tools-agent.js +1542 -0
- package/dist/tools-discovery.d.ts +6 -0
- package/dist/tools-discovery.js +178 -0
- package/dist/tools-drift.d.ts +13 -0
- package/dist/tools-drift.js +357 -0
- package/dist/tools-files.d.ts +6 -0
- package/dist/tools-files.js +679 -0
- package/dist/tools-framework.d.ts +7 -0
- package/dist/tools-framework.js +1414 -0
- package/dist/tools-git.d.ts +6 -0
- package/dist/tools-git.js +183 -0
- package/dist/tools-handoff.d.ts +32 -0
- package/dist/tools-handoff.js +489 -0
- package/dist/tools-lifecycle.d.ts +6 -0
- package/dist/tools-lifecycle.js +205 -0
- package/dist/tools-memory.d.ts +6 -0
- package/dist/tools-memory.js +260 -0
- package/dist/tools-scheduler.d.ts +6 -0
- package/dist/tools-scheduler.js +228 -0
- package/dist/tools-skills.d.ts +3 -0
- package/dist/tools-skills.js +104 -0
- package/dist/tools-todo.d.ts +6 -0
- package/dist/tools-todo.js +154 -0
- package/dist/tools.d.ts +9 -0
- package/dist/tools.js +33 -0
- package/dist/tracker-adapters.d.ts +74 -0
- package/dist/tracker-adapters.js +776 -0
- package/dist/tracker-sync.d.ts +10 -0
- package/dist/tracker-sync.js +84 -0
- package/dist/tui/agent-runner.d.ts +137 -0
- package/dist/tui/agent-runner.js +466 -0
- package/dist/tui/agent-worker.d.ts +10 -0
- package/dist/tui/agent-worker.js +347 -0
- package/dist/tui/chat.d.ts +84 -0
- package/dist/tui/chat.js +368 -0
- package/dist/tui/commands.d.ts +57 -0
- package/dist/tui/commands.js +432 -0
- package/dist/tui/dashboard.d.ts +24 -0
- package/dist/tui/dashboard.js +110 -0
- package/dist/tui/index.d.ts +114 -0
- package/dist/tui/index.js +1059 -0
- package/dist/tui/input.d.ts +49 -0
- package/dist/tui/input.js +336 -0
- package/dist/tui/layout.d.ts +116 -0
- package/dist/tui/layout.js +367 -0
- package/dist/tui/ollama.d.ts +116 -0
- package/dist/tui/ollama.js +192 -0
- package/dist/tui/openai-compatible.d.ts +63 -0
- package/dist/tui/openai-compatible.js +370 -0
- package/dist/tui/provider-discovery.d.ts +59 -0
- package/dist/tui/provider-discovery.js +530 -0
- package/dist/tui/renderer.d.ts +166 -0
- package/dist/tui/renderer.js +304 -0
- package/dist/tui/tabs.d.ts +70 -0
- package/dist/tui/tabs.js +208 -0
- package/dist/tui/telemetry.d.ts +56 -0
- package/dist/tui/telemetry.js +106 -0
- package/dist/vericify-bridge.d.ts +146 -0
- package/dist/vericify-bridge.js +571 -0
- package/dist/vericify-context.d.ts +10 -0
- package/dist/vericify-context.js +72 -0
- package/dist/workspace-manager.d.ts +107 -0
- package/dist/workspace-manager.js +636 -0
- package/package.json +83 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { ACE_ROOT_REL, ACE_TASKS_ROOT_REL, ALL_MCP_CLIENTS, ALL_LLM_PROVIDERS, DEFAULTS_ROOT, PACKAGE_ROOT, WORKSPACE_ROOT, fileExists, getAllMcpServerConfigSnippets, getMcpClientInstallHint, getMcpServerConfigSnippet, wsPath, } from "./helpers.js";
|
|
3
|
+
import { refreshAstgrepIndex } from "./astgrep-index.js";
|
|
4
|
+
import { scanWorkspaceDelta } from "./index-store.js";
|
|
5
|
+
import { startStdioServer } from "./server.js";
|
|
6
|
+
import { appendRunLedgerEntrySafe } from "./run-ledger.js";
|
|
7
|
+
import { waitForPendingStatusEventMirrors } from "./status-events.js";
|
|
8
|
+
import { bootstrapStoreWorkspace } from "./store/bootstrap-store.js";
|
|
9
|
+
import { openStore } from "./store/ace-packed-store.js";
|
|
10
|
+
import { withStoreWriteQueue } from "./store/write-queue.js";
|
|
11
|
+
import { getWorkspaceStorePath, readStoreBlobSync, readStoreJsonSync, } from "./store/store-snapshot.js";
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { runTui } from "./tui/index.js";
|
|
14
|
+
import { buildOpenAiCompatibleBaseUrl, DEFAULT_LLAMA_CPP_MODEL, DEFAULT_OLLAMA_MODEL, discoverProviderContext, normalizeLocalBaseUrl, scanLocalModelRuntimes, } from "./tui/provider-discovery.js";
|
|
15
|
+
function printHelp() {
|
|
16
|
+
console.log(`ACE Swarm CLI
|
|
17
|
+
|
|
18
|
+
Usage:
|
|
19
|
+
ace mcp Start MCP server over stdio
|
|
20
|
+
ace serve Alias for mcp
|
|
21
|
+
ace tui [options] Launch interactive TUI dashboard
|
|
22
|
+
ace init [options] Bootstrap the ACE store into current workspace
|
|
23
|
+
ace turnkey [options] Project minimal workspace bootstrap stubs from the ACE store
|
|
24
|
+
ace doctor [options] Validate local LLM + MCP readiness
|
|
25
|
+
ace mcp-config [options] Print global/client MCP config snippet(s) from store
|
|
26
|
+
ace paths Show resolved package/workspace paths
|
|
27
|
+
ace help Show help
|
|
28
|
+
|
|
29
|
+
Options for tui:
|
|
30
|
+
--provider <name> Provider override (ollama|llama.cpp|codex|gemini|claude|copilot|...)
|
|
31
|
+
--model <name> Model name override (defaults from profile/settings discovery)
|
|
32
|
+
--base-url <url> Local runtime base URL override
|
|
33
|
+
--ollama-url <url> Legacy alias for --base-url
|
|
34
|
+
|
|
35
|
+
Options for init:
|
|
36
|
+
--project <name> Project name stored in ${ACE_ROOT_REL}/ace-state.zarr metadata
|
|
37
|
+
--force Overwrite scaffolded files if they already exist
|
|
38
|
+
--mcp-config Also write .vscode/mcp.json workspace bridge
|
|
39
|
+
--client-config-bundle Also write minimal workspace host stubs (AGENTS.md, CLAUDE.md, .cursorrules, .github/copilot-instructions.md)
|
|
40
|
+
--llm <provider> ollama|llama.cpp
|
|
41
|
+
--model <name> Model name for local provider
|
|
42
|
+
--base-url <url> Local runtime base URL override
|
|
43
|
+
--ollama-url <url> Legacy alias for --base-url
|
|
44
|
+
|
|
45
|
+
Options for doctor:
|
|
46
|
+
--llm <provider> ollama|llama.cpp (default: auto from ${ACE_ROOT_REL}/ace-state.zarr)
|
|
47
|
+
--model <name> Model name override
|
|
48
|
+
--base-url <url> Local runtime base URL override
|
|
49
|
+
--ollama-url <url> Legacy alias for --base-url
|
|
50
|
+
--scan Probe common local Ollama + llama.cpp endpoints when URL is unset
|
|
51
|
+
|
|
52
|
+
Options for mcp-config:
|
|
53
|
+
--client <name> codex|vscode|claude|cursor|antigravity
|
|
54
|
+
--all Print all client snippets for optional global install
|
|
55
|
+
`);
|
|
56
|
+
}
|
|
57
|
+
function readFlagValue(args, flag) {
|
|
58
|
+
const exact = args.find((arg) => arg.startsWith(`${flag}=`));
|
|
59
|
+
if (exact)
|
|
60
|
+
return exact.slice(flag.length + 1);
|
|
61
|
+
const index = args.indexOf(flag);
|
|
62
|
+
if (index === -1)
|
|
63
|
+
return undefined;
|
|
64
|
+
return args[index + 1];
|
|
65
|
+
}
|
|
66
|
+
function readLlmProfile() {
|
|
67
|
+
const storeProfile = readStoreJsonSync(WORKSPACE_ROOT, "state/runtime/llm_profile") ??
|
|
68
|
+
readStoreJsonSync(WORKSPACE_ROOT, "state/runtime/llm-profile");
|
|
69
|
+
if (storeProfile && typeof storeProfile === "object") {
|
|
70
|
+
return storeProfile;
|
|
71
|
+
}
|
|
72
|
+
const profilePath = wsPath(".ace", "llm-profile.json");
|
|
73
|
+
if (!fileExists(profilePath))
|
|
74
|
+
return undefined;
|
|
75
|
+
try {
|
|
76
|
+
const raw = readFileSync(profilePath, "utf-8");
|
|
77
|
+
const parsed = JSON.parse(raw);
|
|
78
|
+
return parsed && typeof parsed === "object" ? parsed : undefined;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function readBaseUrlFlag(args) {
|
|
85
|
+
return normalizeLocalBaseUrl(readFlagValue(args, "--base-url") ?? readFlagValue(args, "--ollama-url"));
|
|
86
|
+
}
|
|
87
|
+
function parseLlmOptions(args) {
|
|
88
|
+
const profile = readLlmProfile();
|
|
89
|
+
const selected = readFlagValue(args, "--llm")?.trim().toLowerCase() ?? profile?.provider?.trim().toLowerCase();
|
|
90
|
+
if (!selected)
|
|
91
|
+
return {};
|
|
92
|
+
if (!ALL_LLM_PROVIDERS.includes(selected)) {
|
|
93
|
+
throw new Error(`Unsupported LLM provider: ${selected}`);
|
|
94
|
+
}
|
|
95
|
+
const provider = selected;
|
|
96
|
+
const defaultModel = provider === "llama.cpp" ? DEFAULT_LLAMA_CPP_MODEL : DEFAULT_OLLAMA_MODEL;
|
|
97
|
+
const llmModel = readFlagValue(args, "--model")?.trim() || profile?.model || defaultModel;
|
|
98
|
+
const llmBaseUrl = readBaseUrlFlag(args) ?? normalizeLocalBaseUrl(profile?.base_url);
|
|
99
|
+
return {
|
|
100
|
+
llmProvider: provider,
|
|
101
|
+
llmModel,
|
|
102
|
+
llmBaseUrl,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async function writeLlmProfile(profile) {
|
|
106
|
+
const storePath = getWorkspaceStorePath(WORKSPACE_ROOT);
|
|
107
|
+
await withStoreWriteQueue(storePath, async () => {
|
|
108
|
+
const payload = {
|
|
109
|
+
provider: profile.provider,
|
|
110
|
+
model: profile.model,
|
|
111
|
+
generated_at: new Date().toISOString(),
|
|
112
|
+
};
|
|
113
|
+
if (profile.baseUrl) {
|
|
114
|
+
payload.base_url = profile.baseUrl;
|
|
115
|
+
if (profile.provider === "ollama") {
|
|
116
|
+
payload.api_compat_base_url = buildOpenAiCompatibleBaseUrl(profile.baseUrl);
|
|
117
|
+
payload.default_api_key = "ollama";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const doctorCommands = profile.provider === "ollama"
|
|
121
|
+
? [
|
|
122
|
+
"ollama serve",
|
|
123
|
+
`ollama pull ${profile.model}`,
|
|
124
|
+
...(profile.baseUrl ? [`curl -s ${profile.baseUrl}/api/tags`] : []),
|
|
125
|
+
]
|
|
126
|
+
: [
|
|
127
|
+
"# Start llama-server separately, for example:",
|
|
128
|
+
"# llama-server -m /path/to/model.gguf --port 8080",
|
|
129
|
+
...(profile.baseUrl ? [`curl -s ${buildOpenAiCompatibleBaseUrl(profile.baseUrl)}/models`] : []),
|
|
130
|
+
];
|
|
131
|
+
const store = await openStore(storePath);
|
|
132
|
+
try {
|
|
133
|
+
await store.setJSON("state/runtime/llm_profile", payload);
|
|
134
|
+
await store.setBlob("state/runtime/doctor_checks.md", [
|
|
135
|
+
`# ACE + ${profile.provider} Doctor Checks`,
|
|
136
|
+
"",
|
|
137
|
+
"Run these commands to verify local-model readiness:",
|
|
138
|
+
"",
|
|
139
|
+
"```bash",
|
|
140
|
+
...doctorCommands,
|
|
141
|
+
profile.baseUrl
|
|
142
|
+
? `ace doctor --llm ${profile.provider} --model ${profile.model} --base-url ${profile.baseUrl}`
|
|
143
|
+
: `ace doctor --llm ${profile.provider} --model ${profile.model} --scan`,
|
|
144
|
+
"```",
|
|
145
|
+
"",
|
|
146
|
+
].join("\n"));
|
|
147
|
+
await store.commit();
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await store.close();
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return `${storePath}#state/runtime/llm_profile`;
|
|
154
|
+
}
|
|
155
|
+
async function runInit(args, mode = "init") {
|
|
156
|
+
const projectName = readFlagValue(args, "--project");
|
|
157
|
+
const force = args.includes("--force");
|
|
158
|
+
const includeMcpConfig = args.includes("--mcp-config");
|
|
159
|
+
const includeClientConfigBundle = mode === "turnkey"
|
|
160
|
+
? !args.includes("--no-client-config-bundle")
|
|
161
|
+
: args.includes("--client-config-bundle");
|
|
162
|
+
const llm = parseLlmOptions(args);
|
|
163
|
+
// Store-first bootstrap — init stays minimal, turnkey adds host-facing shims.
|
|
164
|
+
const storeResult = await bootstrapStoreWorkspace({
|
|
165
|
+
workspaceRoot: WORKSPACE_ROOT,
|
|
166
|
+
projectName: projectName ?? undefined,
|
|
167
|
+
force,
|
|
168
|
+
includeMcpConfig,
|
|
169
|
+
includeClientConfigBundle,
|
|
170
|
+
llm: llm.llmProvider ?? undefined,
|
|
171
|
+
model: llm.llmModel ?? undefined,
|
|
172
|
+
ollamaUrl: llm.llmBaseUrl ?? undefined,
|
|
173
|
+
});
|
|
174
|
+
const astIndex = refreshAstgrepIndex({
|
|
175
|
+
scope: ".",
|
|
176
|
+
append_evidence: true,
|
|
177
|
+
emit_event: true,
|
|
178
|
+
include_rep_corpus: true,
|
|
179
|
+
});
|
|
180
|
+
const delta = scanWorkspaceDelta({
|
|
181
|
+
path: ".",
|
|
182
|
+
depth: 8,
|
|
183
|
+
max_files: 25000,
|
|
184
|
+
include_hidden: false,
|
|
185
|
+
exclude: [".git", "node_modules", "dist", "target", ".venv", "__pycache__", ".DS_Store"],
|
|
186
|
+
file_entry_cap: 0,
|
|
187
|
+
});
|
|
188
|
+
if (storeResult.warnings.length) {
|
|
189
|
+
for (const w of storeResult.warnings)
|
|
190
|
+
console.warn(` [store] ${w}`);
|
|
191
|
+
}
|
|
192
|
+
console.log("ACE bootstrap complete");
|
|
193
|
+
console.log(`Workspace: ${WORKSPACE_ROOT}`);
|
|
194
|
+
console.log(`Store: ${storeResult.storePath}`);
|
|
195
|
+
console.log(`Agents baked: ${storeResult.agents}`);
|
|
196
|
+
console.log(`Materialized files: ${storeResult.materialized.length}`);
|
|
197
|
+
console.log(`Indexed files: ${delta.snapshot.file_count}`);
|
|
198
|
+
console.log(`Stored index entries: ${delta.snapshot.stored_file_count}`);
|
|
199
|
+
console.log(`Index entry cap: ${delta.snapshot.options.file_entry_cap}`);
|
|
200
|
+
console.log(`Index path: ${delta.index_path}`);
|
|
201
|
+
console.log(`Fingerprint path: ${delta.fingerprint_path}`);
|
|
202
|
+
console.log(`AST index path: ${astIndex.output_json_path}`);
|
|
203
|
+
console.log(`AST index generated: ${astIndex.generated_at}`);
|
|
204
|
+
if (llm.llmProvider) {
|
|
205
|
+
console.log(`LLM provider: ${llm.llmProvider}`);
|
|
206
|
+
console.log(`Model: ${llm.llmModel}`);
|
|
207
|
+
console.log(`Base URL: ${llm.llmBaseUrl ?? "(not set; run ace doctor --scan or pass --base-url)"}`);
|
|
208
|
+
console.log(`LLM profile path: ${storeResult.storePath}#state/runtime/llm_profile`);
|
|
209
|
+
}
|
|
210
|
+
if (storeResult.materialized.length > 0) {
|
|
211
|
+
console.log("\nMaterialized files:");
|
|
212
|
+
for (const path of storeResult.materialized)
|
|
213
|
+
console.log(`- ${path}`);
|
|
214
|
+
}
|
|
215
|
+
// refreshAstgrepIndex() emits a status event via a background store mirror.
|
|
216
|
+
// Drain that queue before appending the init run-ledger entry so init/turnkey
|
|
217
|
+
// never race two packed-store writers in the same process.
|
|
218
|
+
await waitForPendingStatusEventMirrors();
|
|
219
|
+
// Record CLI execution in run-ledger for observability
|
|
220
|
+
try {
|
|
221
|
+
await appendRunLedgerEntrySafe({
|
|
222
|
+
tool: "cli:init",
|
|
223
|
+
category: "major_update",
|
|
224
|
+
message: `ace ${mode} completed: ${storeResult.materialized.length} bootstrap files materialized`,
|
|
225
|
+
artifacts: [
|
|
226
|
+
`${ACE_TASKS_ROOT_REL}/`,
|
|
227
|
+
`${ACE_ROOT_REL}/ace-state.zarr`,
|
|
228
|
+
delta.index_path,
|
|
229
|
+
astIndex.output_json_path,
|
|
230
|
+
],
|
|
231
|
+
metadata: {
|
|
232
|
+
materialized_count: storeResult.materialized.length,
|
|
233
|
+
indexed_files: delta.snapshot.file_count,
|
|
234
|
+
force,
|
|
235
|
+
mode,
|
|
236
|
+
llm_provider: llm.llmProvider ?? null,
|
|
237
|
+
llm_model: llm.llmModel ?? null,
|
|
238
|
+
llm_base_url: llm.llmBaseUrl ?? null,
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Run-ledger write may fail on first bootstrap before dirs exist
|
|
244
|
+
}
|
|
245
|
+
await waitForPendingStatusEventMirrors();
|
|
246
|
+
}
|
|
247
|
+
function getStoredMcpConfigKey(client) {
|
|
248
|
+
if (client === "codex")
|
|
249
|
+
return "knowledge/host/.mcp-config/codex.config.toml";
|
|
250
|
+
if (client === "vscode")
|
|
251
|
+
return "knowledge/host/.vscode/mcp.json";
|
|
252
|
+
if (client === "claude")
|
|
253
|
+
return "knowledge/host/.mcp-config/claude_desktop_config.json";
|
|
254
|
+
if (client === "cursor")
|
|
255
|
+
return "knowledge/host/.mcp-config/cursor.mcp.json";
|
|
256
|
+
return "knowledge/host/.mcp-config/antigravity.mcp.json";
|
|
257
|
+
}
|
|
258
|
+
function readStoredMcpSnippet(client) {
|
|
259
|
+
return readStoreBlobSync(WORKSPACE_ROOT, getStoredMcpConfigKey(client));
|
|
260
|
+
}
|
|
261
|
+
async function listLocalRuntimeModels(provider, baseUrl) {
|
|
262
|
+
if (provider === "ollama") {
|
|
263
|
+
const response = await fetch(`${baseUrl}/api/tags`, {
|
|
264
|
+
method: "GET",
|
|
265
|
+
headers: { Accept: "application/json" },
|
|
266
|
+
});
|
|
267
|
+
if (!response.ok) {
|
|
268
|
+
throw new Error(`${response.status} ${response.statusText}`);
|
|
269
|
+
}
|
|
270
|
+
const payload = (await response.json().catch(() => ({})));
|
|
271
|
+
return Array.isArray(payload.models)
|
|
272
|
+
? payload.models
|
|
273
|
+
.map((item) => item?.name?.trim())
|
|
274
|
+
.filter((name) => Boolean(name))
|
|
275
|
+
: [];
|
|
276
|
+
}
|
|
277
|
+
const response = await fetch(`${buildOpenAiCompatibleBaseUrl(baseUrl)}/models`, {
|
|
278
|
+
method: "GET",
|
|
279
|
+
headers: { Accept: "application/json" },
|
|
280
|
+
});
|
|
281
|
+
if (!response.ok) {
|
|
282
|
+
throw new Error(`${response.status} ${response.statusText}`);
|
|
283
|
+
}
|
|
284
|
+
const payload = (await response.json().catch(() => ({})));
|
|
285
|
+
return Array.isArray(payload.data)
|
|
286
|
+
? payload.data
|
|
287
|
+
.map((item) => item?.id?.trim())
|
|
288
|
+
.filter((name) => Boolean(name))
|
|
289
|
+
: [];
|
|
290
|
+
}
|
|
291
|
+
async function runDoctor(args) {
|
|
292
|
+
const llm = parseLlmOptions(args);
|
|
293
|
+
const checks = [];
|
|
294
|
+
const shouldScan = args.includes("--scan") || !llm.llmBaseUrl;
|
|
295
|
+
const mcpConfigPaths = [wsPath(".vscode", "mcp.json")];
|
|
296
|
+
const hasWorkspaceMcpConfig = mcpConfigPaths.some((path) => fileExists(path));
|
|
297
|
+
const hasStoredMcpConfig = ALL_MCP_CLIENTS.some((client) => typeof readStoredMcpSnippet(client) === "string");
|
|
298
|
+
const hasMcpConfig = hasWorkspaceMcpConfig || hasStoredMcpConfig;
|
|
299
|
+
checks.push({
|
|
300
|
+
name: "MCP config present",
|
|
301
|
+
ok: hasMcpConfig,
|
|
302
|
+
detail: hasMcpConfig
|
|
303
|
+
? hasWorkspaceMcpConfig
|
|
304
|
+
? "Found one or more workspace MCP bridge files."
|
|
305
|
+
: "Store-backed MCP snippets are baked into ace-state.zarr. Run `ace mcp-config --all` for global install."
|
|
306
|
+
: "No MCP bridge or baked snippets found. Run `ace init` first.",
|
|
307
|
+
});
|
|
308
|
+
const profilePath = `${getWorkspaceStorePath(WORKSPACE_ROOT)}#state/runtime/llm_profile`;
|
|
309
|
+
const hasProfile = Boolean(readLlmProfile());
|
|
310
|
+
checks.push({
|
|
311
|
+
name: "LLM profile present",
|
|
312
|
+
ok: hasProfile,
|
|
313
|
+
detail: hasProfile
|
|
314
|
+
? profilePath
|
|
315
|
+
: `Missing ${ACE_ROOT_REL}/ace-state.zarr#state/runtime/llm_profile. Run \`ace init --llm ollama\` or \`ace doctor --scan\`.`,
|
|
316
|
+
});
|
|
317
|
+
let provider = llm.llmProvider;
|
|
318
|
+
let model = llm.llmModel;
|
|
319
|
+
let baseUrl = llm.llmBaseUrl;
|
|
320
|
+
if (shouldScan) {
|
|
321
|
+
const scanned = await scanLocalModelRuntimes({
|
|
322
|
+
workspaceRoot: WORKSPACE_ROOT,
|
|
323
|
+
preferredProvider: provider,
|
|
324
|
+
explicitBaseUrl: baseUrl,
|
|
325
|
+
});
|
|
326
|
+
const chosen = scanned.candidates.find((candidate) => !provider || candidate.provider === provider) ??
|
|
327
|
+
scanned.candidates[0];
|
|
328
|
+
if (chosen) {
|
|
329
|
+
provider = chosen.provider ?? provider;
|
|
330
|
+
baseUrl = baseUrl ?? chosen.baseUrl;
|
|
331
|
+
model = model || chosen.models[0] || (provider === "llama.cpp" ? DEFAULT_LLAMA_CPP_MODEL : DEFAULT_OLLAMA_MODEL);
|
|
332
|
+
checks.push({
|
|
333
|
+
name: "Runtime endpoint discovered",
|
|
334
|
+
ok: true,
|
|
335
|
+
detail: `Picked ${chosen.provider} at ${chosen.baseUrl} (${chosen.source})`,
|
|
336
|
+
});
|
|
337
|
+
const writtenProfilePath = await writeLlmProfile({
|
|
338
|
+
provider: provider ?? chosen.provider,
|
|
339
|
+
model: model ?? (provider === "llama.cpp" ? DEFAULT_LLAMA_CPP_MODEL : DEFAULT_OLLAMA_MODEL),
|
|
340
|
+
baseUrl,
|
|
341
|
+
});
|
|
342
|
+
checks.push({
|
|
343
|
+
name: "LLM profile refreshed",
|
|
344
|
+
ok: true,
|
|
345
|
+
detail: `Updated ${writtenProfilePath} from discovered runtime settings.`,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
checks.push({
|
|
350
|
+
name: "Runtime endpoint discovered",
|
|
351
|
+
ok: false,
|
|
352
|
+
detail: "No reachable local Ollama or llama.cpp runtime was found. Provide --base-url or start one before rerunning doctor.",
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (!provider) {
|
|
357
|
+
throw new Error(`No local runtime provider configured. Use --llm <provider>, bootstrap one into ${ACE_ROOT_REL}/ace-state.zarr#state/runtime/llm_profile, or run \`ace doctor --scan\`.`);
|
|
358
|
+
}
|
|
359
|
+
if (!model) {
|
|
360
|
+
model = provider === "llama.cpp" ? DEFAULT_LLAMA_CPP_MODEL : DEFAULT_OLLAMA_MODEL;
|
|
361
|
+
}
|
|
362
|
+
if (!baseUrl) {
|
|
363
|
+
checks.push({
|
|
364
|
+
name: "Base URL configured",
|
|
365
|
+
ok: false,
|
|
366
|
+
detail: "No local runtime base URL is configured. Pass --base-url or run `ace doctor --scan` to discover one.",
|
|
367
|
+
});
|
|
368
|
+
const failed = checks.filter((check) => !check.ok);
|
|
369
|
+
console.log("ACE Doctor Report (local runtime)");
|
|
370
|
+
console.log(`Workspace: ${WORKSPACE_ROOT}`);
|
|
371
|
+
console.log(`Provider: ${provider}`);
|
|
372
|
+
console.log(`Model: ${model}`);
|
|
373
|
+
console.log(`Base URL: (not set)`);
|
|
374
|
+
console.log("");
|
|
375
|
+
for (const check of checks) {
|
|
376
|
+
const status = check.ok ? "PASS" : "FAIL";
|
|
377
|
+
console.log(`- [${status}] ${check.name}: ${check.detail}`);
|
|
378
|
+
}
|
|
379
|
+
if (failed.length > 0) {
|
|
380
|
+
process.exitCode = 1;
|
|
381
|
+
}
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
let modelNames = [];
|
|
385
|
+
try {
|
|
386
|
+
modelNames = await listLocalRuntimeModels(provider, baseUrl);
|
|
387
|
+
checks.push({
|
|
388
|
+
name: "Runtime endpoint reachable",
|
|
389
|
+
ok: true,
|
|
390
|
+
detail: provider === "ollama"
|
|
391
|
+
? `${baseUrl}/api/tags responded with ${modelNames.length} models`
|
|
392
|
+
: `${buildOpenAiCompatibleBaseUrl(baseUrl)}/models responded with ${modelNames.length} models`,
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
checks.push({
|
|
397
|
+
name: "Runtime endpoint reachable",
|
|
398
|
+
ok: false,
|
|
399
|
+
detail: `${baseUrl} request failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
const hasModel = modelNames.includes(model);
|
|
403
|
+
checks.push({
|
|
404
|
+
name: provider === "ollama" ? "Requested model installed" : "Requested model served",
|
|
405
|
+
ok: hasModel,
|
|
406
|
+
detail: provider === "ollama"
|
|
407
|
+
? hasModel
|
|
408
|
+
? `${model} found`
|
|
409
|
+
: `${model} missing (run: ollama pull ${model})`
|
|
410
|
+
: hasModel
|
|
411
|
+
? `${model} found`
|
|
412
|
+
: `${model} not reported by llama.cpp (available: ${modelNames.join(", ") || "none"})`,
|
|
413
|
+
});
|
|
414
|
+
const failed = checks.filter((check) => !check.ok);
|
|
415
|
+
console.log("ACE Doctor Report (local runtime)");
|
|
416
|
+
console.log(`Workspace: ${WORKSPACE_ROOT}`);
|
|
417
|
+
console.log(`Provider: ${provider}`);
|
|
418
|
+
console.log(`Model: ${model}`);
|
|
419
|
+
console.log(`Base URL: ${baseUrl}`);
|
|
420
|
+
console.log("");
|
|
421
|
+
for (const check of checks) {
|
|
422
|
+
const status = check.ok ? "PASS" : "FAIL";
|
|
423
|
+
console.log(`- [${status}] ${check.name}: ${check.detail}`);
|
|
424
|
+
}
|
|
425
|
+
if (failed.length > 0) {
|
|
426
|
+
process.exitCode = 1;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
function parseClientFlag(args) {
|
|
430
|
+
const client = readFlagValue(args, "--client");
|
|
431
|
+
if (!client)
|
|
432
|
+
return undefined;
|
|
433
|
+
const normalized = client.trim().toLowerCase();
|
|
434
|
+
const match = ALL_MCP_CLIENTS.find((candidate) => candidate === normalized);
|
|
435
|
+
if (!match) {
|
|
436
|
+
throw new Error(`Unsupported MCP client: ${client}`);
|
|
437
|
+
}
|
|
438
|
+
return match;
|
|
439
|
+
}
|
|
440
|
+
async function runMcpConfig(args) {
|
|
441
|
+
const all = args.includes("--all");
|
|
442
|
+
const explicitClient = parseClientFlag(args);
|
|
443
|
+
if (all) {
|
|
444
|
+
for (const client of ALL_MCP_CLIENTS) {
|
|
445
|
+
const body = readStoredMcpSnippet(client) ?? getAllMcpServerConfigSnippets()[client];
|
|
446
|
+
const fence = client === "codex" ? "toml" : "json";
|
|
447
|
+
console.log(`# ${client}`);
|
|
448
|
+
console.log(`\`\`\`${fence}`);
|
|
449
|
+
console.log(body);
|
|
450
|
+
console.log("```");
|
|
451
|
+
console.log(`Install hint: ${getMcpClientInstallHint(client)}`);
|
|
452
|
+
console.log("");
|
|
453
|
+
}
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
const client = explicitClient ?? "vscode";
|
|
457
|
+
const body = readStoredMcpSnippet(client) ?? getMcpServerConfigSnippet(client);
|
|
458
|
+
console.log(body);
|
|
459
|
+
}
|
|
460
|
+
async function main() {
|
|
461
|
+
const args = process.argv.slice(2);
|
|
462
|
+
const command = (args[0] ?? "mcp").toLowerCase();
|
|
463
|
+
if (command === "mcp" || command === "serve") {
|
|
464
|
+
await startStdioServer();
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
if (command === "tui") {
|
|
468
|
+
const tuiArgs = args.slice(1);
|
|
469
|
+
const cliProvider = readFlagValue(tuiArgs, "--provider")?.trim() ||
|
|
470
|
+
readFlagValue(tuiArgs, "--llm")?.trim();
|
|
471
|
+
const cliModel = readFlagValue(tuiArgs, "--model")?.trim();
|
|
472
|
+
const cliBaseUrl = readBaseUrlFlag(tuiArgs);
|
|
473
|
+
const discovered = discoverProviderContext({
|
|
474
|
+
workspaceRoot: WORKSPACE_ROOT,
|
|
475
|
+
cliProvider,
|
|
476
|
+
cliModel,
|
|
477
|
+
cliBaseUrl,
|
|
478
|
+
});
|
|
479
|
+
await runTui({
|
|
480
|
+
provider: discovered.provider,
|
|
481
|
+
model: discovered.model,
|
|
482
|
+
providers: discovered.providers,
|
|
483
|
+
modelsByProvider: discovered.modelsByProvider,
|
|
484
|
+
baseUrl: discovered.baseUrl,
|
|
485
|
+
ollamaUrl: discovered.ollamaUrl,
|
|
486
|
+
providerBaseUrls: discovered.providerBaseUrls,
|
|
487
|
+
workspaceRoot: WORKSPACE_ROOT,
|
|
488
|
+
});
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
if (command === "init") {
|
|
492
|
+
await runInit(args.slice(1), "init");
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (command === "turnkey") {
|
|
496
|
+
await runInit(args.slice(1), "turnkey");
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
if (command === "doctor") {
|
|
500
|
+
await runDoctor(args.slice(1));
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
if (command === "mcp-config") {
|
|
504
|
+
await runMcpConfig(args.slice(1));
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
if (command === "paths") {
|
|
508
|
+
console.log(`PACKAGE_ROOT=${PACKAGE_ROOT}`);
|
|
509
|
+
console.log(`DEFAULTS_ROOT=${DEFAULTS_ROOT}`);
|
|
510
|
+
console.log(`WORKSPACE_ROOT=${WORKSPACE_ROOT}`);
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
if (command === "add") {
|
|
514
|
+
const subcommand = args[1]?.toLowerCase();
|
|
515
|
+
if (subcommand === "skills") {
|
|
516
|
+
const { installSkillPack, installAllSkills, listAvailableSkillPacks } = await import("./store/skills-install.js");
|
|
517
|
+
const skillName = args[2];
|
|
518
|
+
if (!skillName || skillName === "all") {
|
|
519
|
+
const packs = await listAvailableSkillPacks(WORKSPACE_ROOT);
|
|
520
|
+
if (!packs.available.length) {
|
|
521
|
+
console.log("No skill packs available in assets/.");
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
console.log(`Installing all ${packs.available.length} available skill packs...`);
|
|
525
|
+
const results = await installAllSkills(WORKSPACE_ROOT);
|
|
526
|
+
for (const r of results) {
|
|
527
|
+
console.log(` ✓ ${r.skill} (${r.files} files${r.compacted ? ", compacted" : ""})`);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
else {
|
|
531
|
+
console.log(`Installing skill pack: ${skillName}`);
|
|
532
|
+
const result = await installSkillPack(WORKSPACE_ROOT, skillName);
|
|
533
|
+
console.log(` ✓ ${result.skill} (${result.files} files${result.compacted ? ", compacted" : ""})`);
|
|
534
|
+
}
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
console.error(`Unknown subcommand: ace add ${subcommand ?? "(missing)"}`);
|
|
538
|
+
console.error("Usage: ace add skills [skill-name|all]");
|
|
539
|
+
process.exit(1);
|
|
540
|
+
}
|
|
541
|
+
if (command === "migrate") {
|
|
542
|
+
const { importFromFileWorkspace } = await import("./store/importer.js");
|
|
543
|
+
const storePath = args[1] ?? `${WORKSPACE_ROOT}/.agents/ACE/ace-state.zarr`;
|
|
544
|
+
console.log(`Migrating file workspace at ${WORKSPACE_ROOT} to store at ${storePath}...`);
|
|
545
|
+
const result = await importFromFileWorkspace(WORKSPACE_ROOT, storePath);
|
|
546
|
+
console.log(`Migration complete:`);
|
|
547
|
+
console.log(` handoffs: ${result.handoffs}`);
|
|
548
|
+
console.log(` todos: ${result.todos}`);
|
|
549
|
+
console.log(` ledger events: ${result.ledger_events}`);
|
|
550
|
+
console.log(` status events: ${result.status_events}`);
|
|
551
|
+
console.log(` vericify posts: ${result.vericify_posts}`);
|
|
552
|
+
if (result.warnings.length) {
|
|
553
|
+
console.warn(`Warnings (${result.warnings.length}):`);
|
|
554
|
+
for (const w of result.warnings)
|
|
555
|
+
console.warn(` ! ${w}`);
|
|
556
|
+
}
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
if (command === "repair") {
|
|
560
|
+
const { repairWorkspace } = await import("./store/bootstrap-store.js");
|
|
561
|
+
console.log(`Repairing workspace at ${WORKSPACE_ROOT}...`);
|
|
562
|
+
const warnings = await repairWorkspace(WORKSPACE_ROOT);
|
|
563
|
+
if (warnings.length) {
|
|
564
|
+
for (const w of warnings)
|
|
565
|
+
console.warn(` ! ${w}`);
|
|
566
|
+
}
|
|
567
|
+
else {
|
|
568
|
+
console.log(" ✓ All host files re-materialized.");
|
|
569
|
+
}
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
if (command === "compact") {
|
|
573
|
+
const { compactWorkspace } = await import("./store/bootstrap-store.js");
|
|
574
|
+
const result = await compactWorkspace(WORKSPACE_ROOT);
|
|
575
|
+
const savedKb = Math.round((result.before - result.after) / 1024);
|
|
576
|
+
console.log(`Store compacted: ${result.before} → ${result.after} bytes (saved ${savedKb}KB)`);
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
if (command === "help" || command === "--help" || command === "-h") {
|
|
580
|
+
printHelp();
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
console.error(`Unknown command: ${command}`);
|
|
584
|
+
printHelp();
|
|
585
|
+
process.exit(1);
|
|
586
|
+
}
|
|
587
|
+
main().catch((err) => {
|
|
588
|
+
console.error("Fatal error:", err);
|
|
589
|
+
process.exit(1);
|
|
590
|
+
});
|
|
591
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git operations module – wraps git CLI for rollback, audit trail,
|
|
3
|
+
* and workspace state management.
|
|
4
|
+
*/
|
|
5
|
+
export interface GitStatusResult {
|
|
6
|
+
ok: boolean;
|
|
7
|
+
is_repo: boolean;
|
|
8
|
+
clean: boolean;
|
|
9
|
+
staged: string[];
|
|
10
|
+
unstaged: string[];
|
|
11
|
+
untracked: string[];
|
|
12
|
+
branch: string;
|
|
13
|
+
output: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface GitCommitResult {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
hash?: string;
|
|
19
|
+
message: string;
|
|
20
|
+
files_committed: number;
|
|
21
|
+
output: string;
|
|
22
|
+
error?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface GitDiffResult {
|
|
25
|
+
ok: boolean;
|
|
26
|
+
diff: string;
|
|
27
|
+
files_changed: number;
|
|
28
|
+
insertions: number;
|
|
29
|
+
deletions: number;
|
|
30
|
+
stat: string;
|
|
31
|
+
error?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface GitLogEntry {
|
|
34
|
+
hash: string;
|
|
35
|
+
date: string;
|
|
36
|
+
message: string;
|
|
37
|
+
}
|
|
38
|
+
export interface GitLogResult {
|
|
39
|
+
ok: boolean;
|
|
40
|
+
entries: GitLogEntry[];
|
|
41
|
+
error?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function isGitRepo(): boolean;
|
|
44
|
+
export declare function gitStatus(): GitStatusResult;
|
|
45
|
+
export declare function gitCommit(message: string, paths?: string[]): GitCommitResult;
|
|
46
|
+
export declare function gitDiff(path?: string, staged?: boolean): GitDiffResult;
|
|
47
|
+
export declare function gitLog(limit?: number): GitLogResult;
|
|
48
|
+
export declare function gitInitIfNeeded(): {
|
|
49
|
+
ok: boolean;
|
|
50
|
+
initialized: boolean;
|
|
51
|
+
error?: string;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=git-ops.d.ts.map
|