@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
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery tool registrations: AST indexing and workspace delta scanning.
|
|
3
|
+
*/
|
|
4
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
export declare function registerDiscoveryTools(server: McpServer): void;
|
|
6
|
+
//# sourceMappingURL=tools-discovery.d.ts.map
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery tool registrations: AST indexing and workspace delta scanning.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { normalizePathForValidation } from "./helpers.js";
|
|
6
|
+
import { refreshAstgrepIndex } from "./astgrep-index.js";
|
|
7
|
+
import { scanWorkspaceDelta } from "./index-store.js";
|
|
8
|
+
import { appendRunLedgerEntrySafe } from "./run-ledger.js";
|
|
9
|
+
export function registerDiscoveryTools(server) {
|
|
10
|
+
server.tool("refresh_astgrep_index", "Run deterministic AST discovery indexing and persist AST_GREP_INDEX artifacts", {
|
|
11
|
+
scope: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Workspace-relative scope for discovery scan (default: .)"),
|
|
15
|
+
append_evidence: z
|
|
16
|
+
.boolean()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Append summary evidence entry to agent-state/EVIDENCE_LOG.md (default: true)"),
|
|
19
|
+
emit_event: z
|
|
20
|
+
.boolean()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Emit STATUS_EVENT entry for discovery result (default: true)"),
|
|
23
|
+
include_rep_corpus: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Include rep_astgrep.cxml corpus mining when available (default: true)"),
|
|
27
|
+
}, async ({ scope, append_evidence, emit_event, include_rep_corpus }) => {
|
|
28
|
+
const result = refreshAstgrepIndex({
|
|
29
|
+
scope,
|
|
30
|
+
append_evidence,
|
|
31
|
+
emit_event,
|
|
32
|
+
include_rep_corpus,
|
|
33
|
+
});
|
|
34
|
+
const runLedger = await appendRunLedgerEntrySafe({
|
|
35
|
+
tool: "refresh_astgrep_index",
|
|
36
|
+
category: "info",
|
|
37
|
+
message: `AST discovery index refreshed for scope ${result.scope}`,
|
|
38
|
+
artifacts: [
|
|
39
|
+
normalizePathForValidation(result.output_md_path),
|
|
40
|
+
normalizePathForValidation(result.output_json_path),
|
|
41
|
+
],
|
|
42
|
+
metadata: {
|
|
43
|
+
scope: result.scope,
|
|
44
|
+
astgrep_command: result.astgrep_command,
|
|
45
|
+
hotspots: result.stats.hotspot_files,
|
|
46
|
+
rep_sources: result.stats.rep_sources,
|
|
47
|
+
todo_signals: result.stats.todo_signals,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: "text",
|
|
54
|
+
text: [
|
|
55
|
+
"# AST Discovery Refresh",
|
|
56
|
+
"",
|
|
57
|
+
`Generated at: ${result.generated_at}`,
|
|
58
|
+
`Scope: ${result.scope}`,
|
|
59
|
+
`ast-grep command: ${result.astgrep_command ?? "not found"}`,
|
|
60
|
+
`AST index markdown: ${result.output_md_path}`,
|
|
61
|
+
`AST index json: ${result.output_json_path}`,
|
|
62
|
+
`Evidence appended: ${result.evidence_appended ? "yes" : "no"}`,
|
|
63
|
+
result.event_id
|
|
64
|
+
? `Status event: ${result.event_id} (${result.event_path})`
|
|
65
|
+
: "Status event: skipped",
|
|
66
|
+
`Run ledger: ${runLedger.path} (${runLedger.entry.id})`,
|
|
67
|
+
"",
|
|
68
|
+
"## Stats",
|
|
69
|
+
`- language profile entries: ${result.stats.language_profile_entries}`,
|
|
70
|
+
`- hotspot files: ${result.stats.hotspot_files}`,
|
|
71
|
+
`- rep sources: ${result.stats.rep_sources}`,
|
|
72
|
+
`- todo signals: ${result.stats.todo_signals}`,
|
|
73
|
+
].join("\n"),
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
server.tool("scan_workspace_delta", "Compute changed/unchanged/deleted file deltas and persist an index snapshot", {
|
|
79
|
+
path: z
|
|
80
|
+
.string()
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("Workspace-relative scan root (default: .)"),
|
|
83
|
+
depth: z
|
|
84
|
+
.number()
|
|
85
|
+
.int()
|
|
86
|
+
.min(0)
|
|
87
|
+
.max(20)
|
|
88
|
+
.optional()
|
|
89
|
+
.describe("Maximum directory depth (default: 6)"),
|
|
90
|
+
max_files: z
|
|
91
|
+
.number()
|
|
92
|
+
.int()
|
|
93
|
+
.min(1)
|
|
94
|
+
.max(50000)
|
|
95
|
+
.optional()
|
|
96
|
+
.describe("Maximum files to scan before truncation"),
|
|
97
|
+
include_hidden: z
|
|
98
|
+
.boolean()
|
|
99
|
+
.optional()
|
|
100
|
+
.describe("Include hidden files/directories"),
|
|
101
|
+
exclude: z
|
|
102
|
+
.array(z.string())
|
|
103
|
+
.optional()
|
|
104
|
+
.describe("Directory/file names to skip"),
|
|
105
|
+
file_entry_cap: z
|
|
106
|
+
.number()
|
|
107
|
+
.int()
|
|
108
|
+
.min(0)
|
|
109
|
+
.max(5000)
|
|
110
|
+
.optional()
|
|
111
|
+
.describe("Maximum file entries persisted into index.json (default: 0)"),
|
|
112
|
+
index_path: z
|
|
113
|
+
.string()
|
|
114
|
+
.optional()
|
|
115
|
+
.describe("Relative path for index snapshot JSON (default: agent-state/index.json)"),
|
|
116
|
+
}, async ({ path, depth, max_files, include_hidden, exclude, file_entry_cap, index_path, }) => {
|
|
117
|
+
const delta = scanWorkspaceDelta({
|
|
118
|
+
path,
|
|
119
|
+
depth,
|
|
120
|
+
max_files,
|
|
121
|
+
include_hidden,
|
|
122
|
+
exclude,
|
|
123
|
+
file_entry_cap,
|
|
124
|
+
index_path,
|
|
125
|
+
});
|
|
126
|
+
const runLedger = await appendRunLedgerEntrySafe({
|
|
127
|
+
tool: "scan_workspace_delta",
|
|
128
|
+
category: "info",
|
|
129
|
+
message: `Delta scan completed for root ${delta.snapshot.root}`,
|
|
130
|
+
artifacts: [
|
|
131
|
+
normalizePathForValidation(delta.index_path),
|
|
132
|
+
normalizePathForValidation(delta.fingerprint_path),
|
|
133
|
+
],
|
|
134
|
+
metadata: {
|
|
135
|
+
root: delta.snapshot.root,
|
|
136
|
+
changed: delta.changed.length,
|
|
137
|
+
unchanged: delta.unchanged.length,
|
|
138
|
+
deleted: delta.deleted.length,
|
|
139
|
+
truncated: delta.truncated,
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
const changedPreview = delta.changed.slice(0, 20);
|
|
143
|
+
const deletedPreview = delta.deleted.slice(0, 20);
|
|
144
|
+
return {
|
|
145
|
+
content: [
|
|
146
|
+
{
|
|
147
|
+
type: "text",
|
|
148
|
+
text: [
|
|
149
|
+
"# Workspace Delta Scan",
|
|
150
|
+
"",
|
|
151
|
+
`Index path: ${delta.index_path}`,
|
|
152
|
+
`Fingerprint path: ${delta.fingerprint_path}`,
|
|
153
|
+
`Root: ${delta.snapshot.root}`,
|
|
154
|
+
`Scanned files: ${delta.scanned_count}`,
|
|
155
|
+
`Stored file entries: ${delta.snapshot.stored_file_count}`,
|
|
156
|
+
`File entry cap: ${delta.snapshot.options.file_entry_cap}`,
|
|
157
|
+
`Changed: ${delta.changed.length}`,
|
|
158
|
+
`Unchanged: ${delta.unchanged.length}`,
|
|
159
|
+
`Deleted: ${delta.deleted.length}`,
|
|
160
|
+
`Truncated: ${delta.truncated ? "yes" : "no"}`,
|
|
161
|
+
`Run ledger: ${runLedger.path} (${runLedger.entry.id})`,
|
|
162
|
+
"",
|
|
163
|
+
"## Changed (sample)",
|
|
164
|
+
...(changedPreview.length > 0
|
|
165
|
+
? changedPreview.map((file) => `- ${file}`)
|
|
166
|
+
: ["- (none)"]),
|
|
167
|
+
"",
|
|
168
|
+
"## Deleted (sample)",
|
|
169
|
+
...(deletedPreview.length > 0
|
|
170
|
+
? deletedPreview.map((file) => `- ${file}`)
|
|
171
|
+
: ["- (none)"]),
|
|
172
|
+
].join("\n"),
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=tools-discovery.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tools for semantic drift detection and state snapshot management.
|
|
3
|
+
*
|
|
4
|
+
* Tools:
|
|
5
|
+
* • snapshot_state — Take a semantic snapshot of tracked directories
|
|
6
|
+
* • semantic_diff — Compare two snapshots for semantic delta
|
|
7
|
+
* • drift_report — Full drift analysis with budget gates
|
|
8
|
+
* • list_snapshots — List available cached snapshots
|
|
9
|
+
* • rewrite_targets — Extract targeted rewrite locations from a delta
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
12
|
+
export declare function registerDriftTools(server: McpServer): void;
|
|
13
|
+
//# sourceMappingURL=tools-drift.d.ts.map
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tools for semantic drift detection and state snapshot management.
|
|
3
|
+
*
|
|
4
|
+
* Tools:
|
|
5
|
+
* • snapshot_state — Take a semantic snapshot of tracked directories
|
|
6
|
+
* • semantic_diff — Compare two snapshots for semantic delta
|
|
7
|
+
* • drift_report — Full drift analysis with budget gates
|
|
8
|
+
* • list_snapshots — List available cached snapshots
|
|
9
|
+
* • rewrite_targets — Extract targeted rewrite locations from a delta
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { takeSnapshot, listSnapshots, computeSemanticDelta, postCycleSnapshot, extractRewriteTargets, } from "./semantic-cache.js";
|
|
13
|
+
import { appendRunLedgerEntrySafe } from "./run-ledger.js";
|
|
14
|
+
export function registerDriftTools(server) {
|
|
15
|
+
// ──────────────────────────────────────────────────────────────────
|
|
16
|
+
// snapshot_state
|
|
17
|
+
// ──────────────────────────────────────────────────────────────────
|
|
18
|
+
server.tool("snapshot_state", "Take a semantic snapshot of agent-state documents (MinHash signatures + section hashes). " +
|
|
19
|
+
"Use before and after each cycle for drift detection.", {
|
|
20
|
+
snapshot_id: z
|
|
21
|
+
.string()
|
|
22
|
+
.min(1)
|
|
23
|
+
.describe("Unique ID for this snapshot (e.g. 'cycle_003_pre', 'cycle_003_post')"),
|
|
24
|
+
tracked_dirs: z
|
|
25
|
+
.array(z.string())
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Workspace-relative directories to scan (default: agent-state, global-state, engineering-state, venture-state)"),
|
|
28
|
+
files: z
|
|
29
|
+
.array(z.string())
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Specific files to snapshot (overrides tracked_dirs scan)"),
|
|
32
|
+
}, async ({ snapshot_id, tracked_dirs, files }) => {
|
|
33
|
+
const snapshot = takeSnapshot({
|
|
34
|
+
snapshot_id,
|
|
35
|
+
tracked_dirs,
|
|
36
|
+
files,
|
|
37
|
+
});
|
|
38
|
+
const ledger = await appendRunLedgerEntrySafe({
|
|
39
|
+
tool: "snapshot_state",
|
|
40
|
+
category: "info",
|
|
41
|
+
message: `Semantic snapshot '${snapshot_id}' created`,
|
|
42
|
+
artifacts: [],
|
|
43
|
+
metadata: {
|
|
44
|
+
snapshot_id,
|
|
45
|
+
file_count: snapshot.file_count,
|
|
46
|
+
total_size: snapshot.total_size,
|
|
47
|
+
minhash_params: snapshot.minhash_params,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: "text",
|
|
54
|
+
text: [
|
|
55
|
+
"# Semantic Snapshot",
|
|
56
|
+
"",
|
|
57
|
+
`Snapshot ID: ${snapshot.snapshot_id}`,
|
|
58
|
+
`Timestamp: ${snapshot.timestamp}`,
|
|
59
|
+
`Files tracked: ${snapshot.file_count}`,
|
|
60
|
+
`Total size: ${(snapshot.total_size / 1024).toFixed(1)} KB`,
|
|
61
|
+
`MinHash: ${snapshot.minhash_params.num_permutations} perms, k=${snapshot.minhash_params.shingle_size}, seed=${snapshot.minhash_params.seed}`,
|
|
62
|
+
`Run ledger: ${ledger.path} (${ledger.entry.id})`,
|
|
63
|
+
"",
|
|
64
|
+
"## Files",
|
|
65
|
+
...Object.entries(snapshot.files)
|
|
66
|
+
.slice(0, 30)
|
|
67
|
+
.map(([path, sig]) => `- ${path} (${sig.size}B, ${sig.sections.length} sections)`),
|
|
68
|
+
...(snapshot.file_count > 30
|
|
69
|
+
? [`... and ${snapshot.file_count - 30} more`]
|
|
70
|
+
: []),
|
|
71
|
+
].join("\n"),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
// ──────────────────────────────────────────────────────────────────
|
|
77
|
+
// semantic_diff
|
|
78
|
+
// ──────────────────────────────────────────────────────────────────
|
|
79
|
+
server.tool("semantic_diff", "Compare two semantic snapshots and produce a delta map showing " +
|
|
80
|
+
"unchanged/modified/added/deleted files and sections with similarity scores.", {
|
|
81
|
+
before: z
|
|
82
|
+
.string()
|
|
83
|
+
.min(1)
|
|
84
|
+
.describe("Snapshot ID of the 'before' state"),
|
|
85
|
+
after: z
|
|
86
|
+
.string()
|
|
87
|
+
.min(1)
|
|
88
|
+
.describe("Snapshot ID of the 'after' state"),
|
|
89
|
+
include_diffs: z
|
|
90
|
+
.boolean()
|
|
91
|
+
.optional()
|
|
92
|
+
.describe("Include surgical token-level diffs for modified sections (more expensive)"),
|
|
93
|
+
}, async ({ before, after, include_diffs }) => {
|
|
94
|
+
let delta;
|
|
95
|
+
try {
|
|
96
|
+
delta = computeSemanticDelta({
|
|
97
|
+
before,
|
|
98
|
+
after,
|
|
99
|
+
include_diffs,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: "text",
|
|
107
|
+
text: `Error computing semantic diff: ${String(err)}`,
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const ledger = await appendRunLedgerEntrySafe({
|
|
113
|
+
tool: "semantic_diff",
|
|
114
|
+
category: "info",
|
|
115
|
+
message: `Semantic diff: ${before} → ${after}`,
|
|
116
|
+
artifacts: [],
|
|
117
|
+
metadata: {
|
|
118
|
+
before,
|
|
119
|
+
after,
|
|
120
|
+
summary: delta.summary,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
type: "text",
|
|
127
|
+
text: formatDeltaReport(delta, ledger.path, ledger.entry.id),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
// ──────────────────────────────────────────────────────────────────
|
|
133
|
+
// drift_report
|
|
134
|
+
// ──────────────────────────────────────────────────────────────────
|
|
135
|
+
server.tool("drift_report", "Full drift analysis with budget gates. Takes a post-cycle snapshot, " +
|
|
136
|
+
"compares against the pre-cycle snapshot, and evaluates drift budget constraints. " +
|
|
137
|
+
"Use after completing a cycle to verify document state hasn't drifted excessively.", {
|
|
138
|
+
cycle_id: z
|
|
139
|
+
.string()
|
|
140
|
+
.min(1)
|
|
141
|
+
.describe("Cycle identifier — expects a '{cycle_id}_pre' snapshot to already exist"),
|
|
142
|
+
tracked_dirs: z
|
|
143
|
+
.array(z.string())
|
|
144
|
+
.optional()
|
|
145
|
+
.describe("Directories to track"),
|
|
146
|
+
max_growth_pct: z
|
|
147
|
+
.number()
|
|
148
|
+
.optional()
|
|
149
|
+
.describe("Max allowed total size growth percentage (default: 25)"),
|
|
150
|
+
max_churn_pct: z
|
|
151
|
+
.number()
|
|
152
|
+
.optional()
|
|
153
|
+
.describe("Max allowed file churn percentage (default: 40)"),
|
|
154
|
+
max_new_files: z
|
|
155
|
+
.number()
|
|
156
|
+
.int()
|
|
157
|
+
.optional()
|
|
158
|
+
.describe("Max allowed new files per cycle (default: 10)"),
|
|
159
|
+
max_deleted_files: z
|
|
160
|
+
.number()
|
|
161
|
+
.int()
|
|
162
|
+
.optional()
|
|
163
|
+
.describe("Max allowed deleted files per cycle (default: 5)"),
|
|
164
|
+
include_diffs: z
|
|
165
|
+
.boolean()
|
|
166
|
+
.optional()
|
|
167
|
+
.describe("Include surgical diffs in report"),
|
|
168
|
+
}, async ({ cycle_id, tracked_dirs, max_growth_pct, max_churn_pct, max_new_files, max_deleted_files, include_diffs, }) => {
|
|
169
|
+
const budget = {
|
|
170
|
+
max_growth_pct: max_growth_pct ?? 25,
|
|
171
|
+
max_churn_pct: max_churn_pct ?? 40,
|
|
172
|
+
max_new_files: max_new_files ?? 10,
|
|
173
|
+
max_deleted_files: max_deleted_files ?? 5,
|
|
174
|
+
};
|
|
175
|
+
let result;
|
|
176
|
+
try {
|
|
177
|
+
result = postCycleSnapshot(cycle_id, tracked_dirs, budget, include_diffs);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
return {
|
|
181
|
+
content: [
|
|
182
|
+
{
|
|
183
|
+
type: "text",
|
|
184
|
+
text: `Error generating drift report: ${String(err)}. Did you run snapshot_state with '${cycle_id}_pre' first?`,
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const { delta } = result;
|
|
190
|
+
const passStatus = delta.drift_budget?.passed ? "PASS" : "FAIL";
|
|
191
|
+
const ledger = await appendRunLedgerEntrySafe({
|
|
192
|
+
tool: "drift_report",
|
|
193
|
+
category: delta.drift_budget?.passed ? "info" : "regression",
|
|
194
|
+
message: `Drift report for cycle '${cycle_id}': ${passStatus}`,
|
|
195
|
+
artifacts: [],
|
|
196
|
+
metadata: {
|
|
197
|
+
cycle_id,
|
|
198
|
+
summary: delta.summary,
|
|
199
|
+
drift_budget: delta.drift_budget,
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
return {
|
|
203
|
+
content: [
|
|
204
|
+
{
|
|
205
|
+
type: "text",
|
|
206
|
+
text: [
|
|
207
|
+
`# Drift Report — Cycle: ${cycle_id}`,
|
|
208
|
+
"",
|
|
209
|
+
`## Gate: ${passStatus}`,
|
|
210
|
+
"",
|
|
211
|
+
...(delta.drift_budget
|
|
212
|
+
? [
|
|
213
|
+
`Growth: ${delta.drift_budget.actual_growth_pct.toFixed(1)}% (limit: ±${budget.max_growth_pct}%)`,
|
|
214
|
+
`Churn: ${delta.drift_budget.actual_churn_pct.toFixed(1)}% (limit: ${budget.max_churn_pct}%)`,
|
|
215
|
+
`New files: ${delta.drift_budget.new_files} (limit: ${budget.max_new_files})`,
|
|
216
|
+
`Deleted files: ${delta.drift_budget.deleted_files} (limit: ${budget.max_deleted_files})`,
|
|
217
|
+
...(delta.drift_budget.violations.length > 0
|
|
218
|
+
? [
|
|
219
|
+
"",
|
|
220
|
+
"### Violations",
|
|
221
|
+
...delta.drift_budget.violations.map((v) => `- ⚠ ${v}`),
|
|
222
|
+
]
|
|
223
|
+
: []),
|
|
224
|
+
]
|
|
225
|
+
: []),
|
|
226
|
+
"",
|
|
227
|
+
formatDeltaReport(delta, ledger.path, ledger.entry.id),
|
|
228
|
+
].join("\n"),
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
// ──────────────────────────────────────────────────────────────────
|
|
234
|
+
// list_snapshots
|
|
235
|
+
// ──────────────────────────────────────────────────────────────────
|
|
236
|
+
server.tool("list_snapshots", "List all cached semantic snapshots in .tmp/cache/semantic/", {}, async () => {
|
|
237
|
+
const snapshots = listSnapshots();
|
|
238
|
+
return {
|
|
239
|
+
content: [
|
|
240
|
+
{
|
|
241
|
+
type: "text",
|
|
242
|
+
text: snapshots.length > 0
|
|
243
|
+
? [
|
|
244
|
+
"# Cached Snapshots",
|
|
245
|
+
"",
|
|
246
|
+
...snapshots.map((s) => `- ${s}`),
|
|
247
|
+
].join("\n")
|
|
248
|
+
: "No snapshots cached. Use `snapshot_state` to create one.",
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
// ──────────────────────────────────────────────────────────────────
|
|
254
|
+
// rewrite_targets
|
|
255
|
+
// ──────────────────────────────────────────────────────────────────
|
|
256
|
+
server.tool("rewrite_targets", "Extract targeted rewrite locations from a semantic delta. " +
|
|
257
|
+
"Returns file paths and section headings/line-ranges that changed, " +
|
|
258
|
+
"for use with ast-grep node targeting (code) or heading search (markdown).", {
|
|
259
|
+
before: z.string().min(1).describe("Before snapshot ID"),
|
|
260
|
+
after: z.string().min(1).describe("After snapshot ID"),
|
|
261
|
+
}, async ({ before, after }) => {
|
|
262
|
+
let delta;
|
|
263
|
+
try {
|
|
264
|
+
delta = computeSemanticDelta({ before, after });
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
return {
|
|
268
|
+
content: [
|
|
269
|
+
{ type: "text", text: `Error: ${String(err)}` },
|
|
270
|
+
],
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const targets = extractRewriteTargets(delta);
|
|
274
|
+
const ledger = await appendRunLedgerEntrySafe({
|
|
275
|
+
tool: "rewrite_targets",
|
|
276
|
+
category: "info",
|
|
277
|
+
message: `Extracted ${targets.length} rewrite targets from ${before} → ${after}`,
|
|
278
|
+
artifacts: [],
|
|
279
|
+
metadata: { target_count: targets.length },
|
|
280
|
+
});
|
|
281
|
+
return {
|
|
282
|
+
content: [
|
|
283
|
+
{
|
|
284
|
+
type: "text",
|
|
285
|
+
text: [
|
|
286
|
+
"# Rewrite Targets",
|
|
287
|
+
"",
|
|
288
|
+
`Total targets: ${targets.length}`,
|
|
289
|
+
`Run ledger: ${ledger.path} (${ledger.entry.id})`,
|
|
290
|
+
"",
|
|
291
|
+
...targets.map((t) => {
|
|
292
|
+
if (t.type === "full") {
|
|
293
|
+
return `- **${t.file}** (full file, sim: ${(t.similarity * 100).toFixed(0)}%)`;
|
|
294
|
+
}
|
|
295
|
+
return `- ${t.file} → \`${t.heading}\` (section, sim: ${(t.similarity * 100).toFixed(0)}%)`;
|
|
296
|
+
}),
|
|
297
|
+
].join("\n"),
|
|
298
|
+
},
|
|
299
|
+
],
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
// ────────────────────────────────────────────────────────────────────
|
|
304
|
+
// Report formatting
|
|
305
|
+
// ────────────────────────────────────────────────────────────────────
|
|
306
|
+
function formatDeltaReport(delta, ledgerPath, ledgerId) {
|
|
307
|
+
const lines = [
|
|
308
|
+
`## Summary (${delta.before_snapshot} → ${delta.after_snapshot})`,
|
|
309
|
+
"",
|
|
310
|
+
`| Metric | Count |`,
|
|
311
|
+
`|--------|-------|`,
|
|
312
|
+
`| Unchanged | ${delta.summary.unchanged_files} |`,
|
|
313
|
+
`| Modified | ${delta.summary.modified_files} |`,
|
|
314
|
+
`| Added | ${delta.summary.added_files} |`,
|
|
315
|
+
`| Deleted | ${delta.summary.deleted_files} |`,
|
|
316
|
+
`| Section changes | ${delta.summary.total_section_changes} |`,
|
|
317
|
+
"",
|
|
318
|
+
];
|
|
319
|
+
// Show modified files with section detail
|
|
320
|
+
const modifiedFiles = Object.entries(delta.files).filter(([, d]) => d.status === "modified");
|
|
321
|
+
if (modifiedFiles.length > 0) {
|
|
322
|
+
lines.push("## Modified Files", "");
|
|
323
|
+
for (const [path, fileDelta] of modifiedFiles.slice(0, 20)) {
|
|
324
|
+
lines.push(`### ${path}`, `Similarity: ${(fileDelta.file_similarity * 100).toFixed(0)}% | ` +
|
|
325
|
+
`Size: ${fileDelta.size_before}B → ${fileDelta.size_after}B (${fileDelta.growth_pct > 0 ? "+" : ""}${fileDelta.growth_pct.toFixed(1)}%)`);
|
|
326
|
+
if (fileDelta.section_changes.length > 0) {
|
|
327
|
+
for (const sec of fileDelta.section_changes) {
|
|
328
|
+
const icon = sec.status === "unchanged"
|
|
329
|
+
? "✓"
|
|
330
|
+
: sec.status === "modified"
|
|
331
|
+
? "~"
|
|
332
|
+
: sec.status === "added"
|
|
333
|
+
? "+"
|
|
334
|
+
: "-";
|
|
335
|
+
lines.push(` ${icon} ${sec.heading} (${sec.status}, ${(sec.similarity * 100).toFixed(0)}%)`);
|
|
336
|
+
if (sec.diff_summary) {
|
|
337
|
+
lines.push(" ```", ...sec.diff_summary.split("\n").map((l) => ` ${l}`), " ```");
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
lines.push("");
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Show added files
|
|
345
|
+
const addedFiles = Object.entries(delta.files).filter(([, d]) => d.status === "added");
|
|
346
|
+
if (addedFiles.length > 0) {
|
|
347
|
+
lines.push("## Added Files", "", ...addedFiles.slice(0, 20).map(([path, d]) => `- ${path} (${d.size_after}B)`), "");
|
|
348
|
+
}
|
|
349
|
+
// Show deleted files
|
|
350
|
+
const deletedFiles = Object.entries(delta.files).filter(([, d]) => d.status === "deleted");
|
|
351
|
+
if (deletedFiles.length > 0) {
|
|
352
|
+
lines.push("## Deleted Files", "", ...deletedFiles.slice(0, 20).map(([path, d]) => `- ${path} (was ${d.size_before}B)`), "");
|
|
353
|
+
}
|
|
354
|
+
lines.push(`Run ledger: ${ledgerPath} (${ledgerId})`);
|
|
355
|
+
return lines.join("\n");
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=tools-drift.js.map
|