@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,476 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { appendStatusEvent } from "./status-events.js";
|
|
5
|
+
import { safeRead, safeWrite, WORKSPACE_ROOT, wsPath } from "./helpers.js";
|
|
6
|
+
const CODE_EXTENSIONS = new Set(["ts", "tsx", "js", "mjs", "cjs", "py", "rs", "go"]);
|
|
7
|
+
const EXCLUDE_DIRS = new Set([
|
|
8
|
+
".git",
|
|
9
|
+
"node_modules",
|
|
10
|
+
"dist",
|
|
11
|
+
"target",
|
|
12
|
+
".venv",
|
|
13
|
+
"__pycache__",
|
|
14
|
+
".DS_Store",
|
|
15
|
+
]);
|
|
16
|
+
function normalizeRelPath(path) {
|
|
17
|
+
return path.replace(/\\/g, "/").replace(/^\.?\//, "");
|
|
18
|
+
}
|
|
19
|
+
function isInside(base, target) {
|
|
20
|
+
const rel = relative(base, target);
|
|
21
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
22
|
+
}
|
|
23
|
+
function resolveScope(scope) {
|
|
24
|
+
const rel = normalizeRelPath(scope ?? ".");
|
|
25
|
+
const abs = resolve(WORKSPACE_ROOT, rel || ".");
|
|
26
|
+
if (!isInside(WORKSPACE_ROOT, abs)) {
|
|
27
|
+
throw new Error(`Scope escapes workspace root: ${scope}`);
|
|
28
|
+
}
|
|
29
|
+
return { abs, rel: rel || "." };
|
|
30
|
+
}
|
|
31
|
+
function detectAstgrepCommand() {
|
|
32
|
+
for (const cmd of ["ast-grep", "sg"]) {
|
|
33
|
+
const probe = spawnSync(cmd, ["--version"], { encoding: "utf8" });
|
|
34
|
+
if (probe.status === 0)
|
|
35
|
+
return cmd;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
function safeReadText(path) {
|
|
40
|
+
try {
|
|
41
|
+
return readFileSync(path, "utf8");
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return "";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function collectFiles(rootAbs) {
|
|
48
|
+
const output = [];
|
|
49
|
+
function walk(currentAbs) {
|
|
50
|
+
const entries = readdirSync(currentAbs, { withFileTypes: true });
|
|
51
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
if (EXCLUDE_DIRS.has(entry.name))
|
|
54
|
+
continue;
|
|
55
|
+
const abs = resolve(currentAbs, entry.name);
|
|
56
|
+
if (entry.isDirectory()) {
|
|
57
|
+
walk(abs);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (!entry.isFile())
|
|
61
|
+
continue;
|
|
62
|
+
const ext = entry.name.includes(".")
|
|
63
|
+
? entry.name.slice(entry.name.lastIndexOf(".") + 1).toLowerCase()
|
|
64
|
+
: "";
|
|
65
|
+
if (!CODE_EXTENSIONS.has(ext))
|
|
66
|
+
continue;
|
|
67
|
+
output.push(abs);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
walk(rootAbs);
|
|
71
|
+
return output;
|
|
72
|
+
}
|
|
73
|
+
function normalizeHitPath(path) {
|
|
74
|
+
return normalizeRelPath(path);
|
|
75
|
+
}
|
|
76
|
+
function grepPatternInFiles(files, pattern) {
|
|
77
|
+
const lines = [];
|
|
78
|
+
for (const abs of files) {
|
|
79
|
+
const text = safeReadText(abs);
|
|
80
|
+
if (!text)
|
|
81
|
+
continue;
|
|
82
|
+
const rel = normalizeHitPath(relative(WORKSPACE_ROOT, abs));
|
|
83
|
+
const rows = text.split(/\r?\n/);
|
|
84
|
+
rows.forEach((row, idx) => {
|
|
85
|
+
if (pattern.test(row)) {
|
|
86
|
+
lines.push(`${rel}:${idx + 1}:${row.trim()}`);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return lines;
|
|
91
|
+
}
|
|
92
|
+
function parseAstgrepOutput(stdout) {
|
|
93
|
+
const trimmed = stdout.trim();
|
|
94
|
+
if (!trimmed)
|
|
95
|
+
return [];
|
|
96
|
+
try {
|
|
97
|
+
const parsed = JSON.parse(trimmed);
|
|
98
|
+
if (Array.isArray(parsed))
|
|
99
|
+
return parsed;
|
|
100
|
+
if (parsed &&
|
|
101
|
+
typeof parsed === "object" &&
|
|
102
|
+
"matches" in parsed &&
|
|
103
|
+
Array.isArray(parsed.matches)) {
|
|
104
|
+
return parsed.matches;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Fall through to line-based parse.
|
|
109
|
+
}
|
|
110
|
+
const matches = [];
|
|
111
|
+
for (const line of trimmed.split(/\r?\n/)) {
|
|
112
|
+
const candidate = line.trim();
|
|
113
|
+
if (!candidate.startsWith("{") || !candidate.endsWith("}"))
|
|
114
|
+
continue;
|
|
115
|
+
try {
|
|
116
|
+
matches.push(JSON.parse(candidate));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Ignore malformed lines.
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return matches;
|
|
123
|
+
}
|
|
124
|
+
function runAstgrep(astgrepCmd, pattern, lang, paths) {
|
|
125
|
+
if (!astgrepCmd || paths.length === 0)
|
|
126
|
+
return [];
|
|
127
|
+
const args = ["--pattern", pattern, "--lang", lang, "--json", "--color", "never", ...paths];
|
|
128
|
+
const res = spawnSync(astgrepCmd, args, {
|
|
129
|
+
cwd: WORKSPACE_ROOT,
|
|
130
|
+
encoding: "utf8",
|
|
131
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
132
|
+
});
|
|
133
|
+
if (typeof res.stdout !== "string" || res.stdout.trim().length === 0)
|
|
134
|
+
return [];
|
|
135
|
+
return parseAstgrepOutput(res.stdout);
|
|
136
|
+
}
|
|
137
|
+
function extractMetaVarText(match, key) {
|
|
138
|
+
const raw = match.metaVariables?.[key];
|
|
139
|
+
if (!raw)
|
|
140
|
+
return undefined;
|
|
141
|
+
if (typeof raw === "string")
|
|
142
|
+
return raw;
|
|
143
|
+
if (raw && typeof raw === "object" && "text" in raw && typeof raw.text === "string") {
|
|
144
|
+
return raw.text;
|
|
145
|
+
}
|
|
146
|
+
if (Array.isArray(raw)) {
|
|
147
|
+
const first = raw[0];
|
|
148
|
+
if (typeof first === "string")
|
|
149
|
+
return first;
|
|
150
|
+
if (first && typeof first === "object" && "text" in first) {
|
|
151
|
+
const text = first.text;
|
|
152
|
+
if (typeof text === "string")
|
|
153
|
+
return text;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
function uniqueSorted(values, limit) {
|
|
159
|
+
return [...new Set(values.filter(Boolean))].sort((a, b) => a.localeCompare(b)).slice(0, limit);
|
|
160
|
+
}
|
|
161
|
+
function extensionOf(path) {
|
|
162
|
+
const idx = path.lastIndexOf(".");
|
|
163
|
+
if (idx <= 0 || idx >= path.length - 1)
|
|
164
|
+
return undefined;
|
|
165
|
+
return path.slice(idx + 1).toLowerCase();
|
|
166
|
+
}
|
|
167
|
+
function appendEvidenceLine(timestamp, astgrepCmd, stats) {
|
|
168
|
+
const existing = safeRead("agent-state/EVIDENCE_LOG.md");
|
|
169
|
+
const seed = existing.startsWith("[FILE NOT FOUND]") || existing.startsWith("[ACCESS DENIED]")
|
|
170
|
+
? "# EVIDENCE LOG\n\nAppend-only validation evidence.\n\n## Entries\n"
|
|
171
|
+
: existing.trimEnd();
|
|
172
|
+
const entry = [
|
|
173
|
+
"",
|
|
174
|
+
`[${timestamp}] AST discovery refresh via agent-astgrep`,
|
|
175
|
+
`- ast-grep command: ${astgrepCmd ?? "not found"}`,
|
|
176
|
+
`- language profile entries: ${stats.language_profile_entries}`,
|
|
177
|
+
`- hotspot files: ${stats.hotspot_files}`,
|
|
178
|
+
`- rep_astgrep source paths: ${stats.rep_sources}`,
|
|
179
|
+
"- outputs: agent-state/AST_GREP_INDEX.md, agent-state/AST_GREP_INDEX.json",
|
|
180
|
+
].join("\n");
|
|
181
|
+
safeWrite("agent-state/EVIDENCE_LOG.md", `${seed}${entry}\n`);
|
|
182
|
+
}
|
|
183
|
+
export function refreshAstgrepIndex(input = {}) {
|
|
184
|
+
const generatedAt = new Date().toISOString();
|
|
185
|
+
const scope = resolveScope(input.scope);
|
|
186
|
+
const appendEvidence = input.append_evidence ?? true;
|
|
187
|
+
const includeRepCorpus = input.include_rep_corpus ?? true;
|
|
188
|
+
const emitEvent = input.emit_event ?? true;
|
|
189
|
+
const astgrepCmd = detectAstgrepCommand();
|
|
190
|
+
const preferredRoots = [
|
|
191
|
+
"ace-mcp-server/src",
|
|
192
|
+
"ace-mcp-server/test",
|
|
193
|
+
"engineering-state/src",
|
|
194
|
+
"src",
|
|
195
|
+
"test",
|
|
196
|
+
"tests",
|
|
197
|
+
"__tests__",
|
|
198
|
+
]
|
|
199
|
+
.map((rel) => resolve(WORKSPACE_ROOT, rel))
|
|
200
|
+
.filter((abs) => isInside(scope.abs, abs) && existsSync(abs) && statSync(abs).isDirectory());
|
|
201
|
+
const roots = preferredRoots.length > 0 ? preferredRoots : [scope.abs];
|
|
202
|
+
const codeFiles = roots.flatMap((root) => collectFiles(root));
|
|
203
|
+
const languageProfile = {};
|
|
204
|
+
for (const abs of codeFiles) {
|
|
205
|
+
const ext = extensionOf(abs);
|
|
206
|
+
if (!ext)
|
|
207
|
+
continue;
|
|
208
|
+
languageProfile[ext] = (languageProfile[ext] ?? 0) + 1;
|
|
209
|
+
}
|
|
210
|
+
const entryPointNames = new Set(["index.ts", "main.py", "main.rs", "server.ts", "app.py"]);
|
|
211
|
+
const entryPoints = uniqueSorted(codeFiles
|
|
212
|
+
.filter((abs) => entryPointNames.has(abs.split(/[\\/]/).pop() ?? ""))
|
|
213
|
+
.map((abs) => normalizeHitPath(relative(WORKSPACE_ROOT, abs))), 30);
|
|
214
|
+
const tsRoots = roots.filter((root) => codeFiles.some((file) => file.startsWith(root) && /\.(ts|tsx|js)$/i.test(file)));
|
|
215
|
+
const pyRoots = roots.filter((root) => codeFiles.some((file) => file.startsWith(root) && /\.py$/i.test(file)));
|
|
216
|
+
const exportedFnMatches = runAstgrep(astgrepCmd, "export function $NAME($$$ARGS)", "ts", tsRoots);
|
|
217
|
+
const exportedClassMatches = runAstgrep(astgrepCmd, "export class $NAME", "ts", tsRoots);
|
|
218
|
+
const asyncFnMatches = runAstgrep(astgrepCmd, "async function $NAME($$$ARGS)", "ts", tsRoots);
|
|
219
|
+
const tsItMatches = runAstgrep(astgrepCmd, "it($$$ARGS)", "ts", tsRoots);
|
|
220
|
+
const tsTestMatches = runAstgrep(astgrepCmd, "test($$$ARGS)", "ts", tsRoots);
|
|
221
|
+
const pyTestMatches = runAstgrep(astgrepCmd, "def test_$NAME($$$ARGS):", "python", pyRoots);
|
|
222
|
+
const handoffRefMatches = runAstgrep(astgrepCmd, '$X(\"SWARM_HANDOFF.$Y\")', "ts", tsRoots);
|
|
223
|
+
const exportedFunctions = uniqueSorted(exportedFnMatches
|
|
224
|
+
.map((m) => extractMetaVarText(m, "NAME"))
|
|
225
|
+
.filter((v) => Boolean(v)), 40);
|
|
226
|
+
const exportedClasses = uniqueSorted(exportedClassMatches
|
|
227
|
+
.map((m) => extractMetaVarText(m, "NAME"))
|
|
228
|
+
.filter((v) => Boolean(v)), 30);
|
|
229
|
+
const asyncFunctions = uniqueSorted(asyncFnMatches
|
|
230
|
+
.map((m) => extractMetaVarText(m, "NAME"))
|
|
231
|
+
.filter((v) => Boolean(v)), 40);
|
|
232
|
+
// Fallback symbol extraction when AST match shapes differ across language versions.
|
|
233
|
+
const tsFiles = codeFiles.filter((file) => /\.(ts|tsx|js)$/i.test(file));
|
|
234
|
+
if (exportedFunctions.length === 0 || exportedClasses.length === 0 || asyncFunctions.length === 0) {
|
|
235
|
+
const regexExportFn = /^\s*export\s+function\s+([A-Za-z0-9_]+)/gm;
|
|
236
|
+
const regexExportClass = /^\s*export\s+class\s+([A-Za-z0-9_]+)/gm;
|
|
237
|
+
const regexAsyncFn = /^\s*async\s+function\s+([A-Za-z0-9_]+)/gm;
|
|
238
|
+
const fallbackFns = [];
|
|
239
|
+
const fallbackClasses = [];
|
|
240
|
+
const fallbackAsync = [];
|
|
241
|
+
for (const file of tsFiles) {
|
|
242
|
+
const text = safeReadText(file);
|
|
243
|
+
if (!text)
|
|
244
|
+
continue;
|
|
245
|
+
for (const match of text.matchAll(regexExportFn)) {
|
|
246
|
+
if (match[1])
|
|
247
|
+
fallbackFns.push(match[1]);
|
|
248
|
+
}
|
|
249
|
+
for (const match of text.matchAll(regexExportClass)) {
|
|
250
|
+
if (match[1])
|
|
251
|
+
fallbackClasses.push(match[1]);
|
|
252
|
+
}
|
|
253
|
+
for (const match of text.matchAll(regexAsyncFn)) {
|
|
254
|
+
if (match[1])
|
|
255
|
+
fallbackAsync.push(match[1]);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (exportedFunctions.length === 0) {
|
|
259
|
+
exportedFunctions.push(...uniqueSorted(fallbackFns, 40));
|
|
260
|
+
}
|
|
261
|
+
if (exportedClasses.length === 0) {
|
|
262
|
+
exportedClasses.push(...uniqueSorted(fallbackClasses, 30));
|
|
263
|
+
}
|
|
264
|
+
if (asyncFunctions.length === 0) {
|
|
265
|
+
asyncFunctions.push(...uniqueSorted(fallbackAsync, 40));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const routeHits = grepPatternInFiles(codeFiles.filter((abs) => normalizeHitPath(relative(WORKSPACE_ROOT, abs)).startsWith("ace-mcp-server/src/")), /(route_task|routingMap|ace-orchestrator)/i);
|
|
269
|
+
const indexHits = grepPatternInFiles(codeFiles.filter((abs) => normalizeHitPath(relative(WORKSPACE_ROOT, abs)).startsWith("ace-mcp-server/src/")), /(agent-state\/index\.json|scanWorkspaceDelta)/i);
|
|
270
|
+
// Use comment-anchored patterns to avoid counting identifiers like TodoNodeStatus.
|
|
271
|
+
// Match lines that contain a comment marker followed by TODO/FIXME/HACK/XXX.
|
|
272
|
+
const todoHits = grepPatternInFiles(codeFiles, /(\/\/|\/\*|#|<!--|--|%)\s*.*(TODO|FIXME|HACK|XXX)\b/i);
|
|
273
|
+
const hotspotMap = new Map();
|
|
274
|
+
for (const row of [...routeHits, ...indexHits, ...todoHits]) {
|
|
275
|
+
const file = row.split(":")[0] ?? "";
|
|
276
|
+
if (!file)
|
|
277
|
+
continue;
|
|
278
|
+
hotspotMap.set(file, (hotspotMap.get(file) ?? 0) + 1);
|
|
279
|
+
}
|
|
280
|
+
const hotspots = [...hotspotMap.entries()]
|
|
281
|
+
.sort((a, b) => b[1] - a[1])
|
|
282
|
+
.slice(0, 15)
|
|
283
|
+
.map(([file, hits]) => ({ file, hits }));
|
|
284
|
+
let repSources = [];
|
|
285
|
+
let repTopDirectories = [];
|
|
286
|
+
let repExtensions = [];
|
|
287
|
+
let repKeywordHits = 0;
|
|
288
|
+
const repPath = wsPath("rep_astgrep.cxml");
|
|
289
|
+
if (includeRepCorpus && existsSync(repPath) && statSync(repPath).isFile()) {
|
|
290
|
+
const repText = safeReadText(repPath);
|
|
291
|
+
repSources = [...repText.matchAll(/<source>([^<]+)<\/source>/g)].map((m) => m[1].trim());
|
|
292
|
+
repSources = uniqueSorted(repSources, 5000);
|
|
293
|
+
const directoryCounts = new Map();
|
|
294
|
+
const extensionCounts = new Map();
|
|
295
|
+
for (const source of repSources) {
|
|
296
|
+
const top = source.split("/")[0] ?? source;
|
|
297
|
+
directoryCounts.set(top, (directoryCounts.get(top) ?? 0) + 1);
|
|
298
|
+
const ext = extensionOf(source);
|
|
299
|
+
if (ext)
|
|
300
|
+
extensionCounts.set(ext, (extensionCounts.get(ext) ?? 0) + 1);
|
|
301
|
+
}
|
|
302
|
+
repTopDirectories = [...directoryCounts.entries()]
|
|
303
|
+
.sort((a, b) => b[1] - a[1])
|
|
304
|
+
.slice(0, 12)
|
|
305
|
+
.map(([directory, files]) => ({ directory, files }));
|
|
306
|
+
repExtensions = [...extensionCounts.entries()]
|
|
307
|
+
.sort((a, b) => b[1] - a[1])
|
|
308
|
+
.slice(0, 12)
|
|
309
|
+
.map(([extension, files]) => ({ extension, files }));
|
|
310
|
+
const keywordPattern = /(ast-grep|sg |playground|pattern|rewrite|rule|yaml|napi|pyo3|Cargo\.toml)/i;
|
|
311
|
+
const matchingLines = repText
|
|
312
|
+
.split(/\r?\n/)
|
|
313
|
+
.filter((line) => keywordPattern.test(line));
|
|
314
|
+
// Keep this bounded for token efficiency and stable trend tracking.
|
|
315
|
+
repKeywordHits = Math.min(matchingLines.length, 120);
|
|
316
|
+
}
|
|
317
|
+
const commandsUsed = [
|
|
318
|
+
"filesystem profile scan (language mix + entry points)",
|
|
319
|
+
`${astgrepCmd ?? "ast-grep-unavailable"} structural scans (exports/classes/async/tests/handoff refs)`,
|
|
320
|
+
"targeted source grep scans (routing/index/todo signals)",
|
|
321
|
+
"rep_astgrep.cxml corpus mining",
|
|
322
|
+
];
|
|
323
|
+
const qualitySignals = {
|
|
324
|
+
astgrep_available: Boolean(astgrepCmd),
|
|
325
|
+
astgrep_command: astgrepCmd,
|
|
326
|
+
ts_test_blocks: tsItMatches.length + tsTestMatches.length,
|
|
327
|
+
python_test_defs: pyTestMatches.length,
|
|
328
|
+
todo_fixme_hack_xxx: todoHits.length,
|
|
329
|
+
handoff_schema_refs: handoffRefMatches.length,
|
|
330
|
+
route_logic_refs: routeHits.length,
|
|
331
|
+
index_usage_refs: indexHits.length,
|
|
332
|
+
};
|
|
333
|
+
const notes = [];
|
|
334
|
+
if (!astgrepCmd) {
|
|
335
|
+
notes.push("ast-grep binary not found; AST-level metrics are unavailable.");
|
|
336
|
+
}
|
|
337
|
+
if (repSources.length === 0) {
|
|
338
|
+
notes.push("rep_astgrep.cxml source inventory unavailable or empty.");
|
|
339
|
+
}
|
|
340
|
+
notes.push("index.json remains summary-only; use AST_GREP_INDEX artifacts for structural discovery.");
|
|
341
|
+
const routingHints = [];
|
|
342
|
+
if (hotspots.length > 0) {
|
|
343
|
+
routingHints.push(`Highest-signal hotspot: ${hotspots[0].file}`);
|
|
344
|
+
}
|
|
345
|
+
if (routeHits.length > 0) {
|
|
346
|
+
routingHints.push("Routing logic references are concentrated in ace-mcp-server/src.");
|
|
347
|
+
}
|
|
348
|
+
if (indexHits.length > 0) {
|
|
349
|
+
routingHints.push("Index usage hooks are present; refresh AST index when scope changes.");
|
|
350
|
+
}
|
|
351
|
+
if (repKeywordHits > 0) {
|
|
352
|
+
routingHints.push("rep_astgrep.cxml provides relevant AST-grep reference coverage for discovery tuning.");
|
|
353
|
+
}
|
|
354
|
+
const payload = {
|
|
355
|
+
generated_at: generatedAt,
|
|
356
|
+
scope: scope.rel,
|
|
357
|
+
commands_used: commandsUsed,
|
|
358
|
+
language_profile: languageProfile,
|
|
359
|
+
top_symbols: {
|
|
360
|
+
ts_exported_functions: exportedFunctions,
|
|
361
|
+
ts_exported_classes: exportedClasses,
|
|
362
|
+
ts_async_functions: asyncFunctions,
|
|
363
|
+
entry_points: entryPoints,
|
|
364
|
+
},
|
|
365
|
+
hotspots,
|
|
366
|
+
quality_signals: qualitySignals,
|
|
367
|
+
rep_astgrep_reference: {
|
|
368
|
+
source_paths: repSources.length,
|
|
369
|
+
top_directories: repTopDirectories,
|
|
370
|
+
extensions: repExtensions,
|
|
371
|
+
keyword_hits: repKeywordHits,
|
|
372
|
+
},
|
|
373
|
+
routing_hints: routingHints,
|
|
374
|
+
notes,
|
|
375
|
+
};
|
|
376
|
+
const markdown = [
|
|
377
|
+
"# AST_GREP_INDEX",
|
|
378
|
+
"",
|
|
379
|
+
`Generated: ${generatedAt}`,
|
|
380
|
+
`Scope: ${scope.rel}`,
|
|
381
|
+
"",
|
|
382
|
+
"## Commands Used",
|
|
383
|
+
...commandsUsed.map((row) => `- ${row}`),
|
|
384
|
+
"",
|
|
385
|
+
"## Language Profile",
|
|
386
|
+
...(Object.entries(languageProfile).length > 0
|
|
387
|
+
? Object.entries(languageProfile)
|
|
388
|
+
.sort((a, b) => b[1] - a[1])
|
|
389
|
+
.map(([ext, count]) => `- ${ext}: ${count}`)
|
|
390
|
+
: ["- No source files detected in scope."]),
|
|
391
|
+
"",
|
|
392
|
+
"## Top Symbols",
|
|
393
|
+
`- TS exported functions (${exportedFunctions.length} sampled): ${exportedFunctions.join(", ") || "none"}`,
|
|
394
|
+
`- TS exported classes (${exportedClasses.length} sampled): ${exportedClasses.join(", ") || "none"}`,
|
|
395
|
+
`- TS async functions (${asyncFunctions.length} sampled): ${asyncFunctions.join(", ") || "none"}`,
|
|
396
|
+
`- Entry points (${entryPoints.length}): ${entryPoints.join(", ") || "none"}`,
|
|
397
|
+
"",
|
|
398
|
+
"## Hotspot Files",
|
|
399
|
+
...(hotspots.length > 0
|
|
400
|
+
? hotspots.map((row) => `- ${row.file} (${row.hits} hits)`)
|
|
401
|
+
: ["- No hotspot signals detected."]),
|
|
402
|
+
"",
|
|
403
|
+
"## Quality Signals",
|
|
404
|
+
`- ast-grep available: ${qualitySignals.astgrep_available}`,
|
|
405
|
+
`- TS test blocks: ${qualitySignals.ts_test_blocks}`,
|
|
406
|
+
`- Python test defs: ${qualitySignals.python_test_defs}`,
|
|
407
|
+
`- TODO/FIXME/HACK/XXX matches: ${qualitySignals.todo_fixme_hack_xxx}`,
|
|
408
|
+
`- Handoff schema refs: ${qualitySignals.handoff_schema_refs}`,
|
|
409
|
+
`- Route logic refs: ${qualitySignals.route_logic_refs}`,
|
|
410
|
+
`- Index usage refs: ${qualitySignals.index_usage_refs}`,
|
|
411
|
+
"",
|
|
412
|
+
"## rep_astgrep.cxml Signals",
|
|
413
|
+
`- Source paths discovered: ${repSources.length}`,
|
|
414
|
+
...(repTopDirectories.length > 0
|
|
415
|
+
? repTopDirectories.map((row) => `- Top dir ${row.directory}: ${row.files}`)
|
|
416
|
+
: ["- No top directory data."]),
|
|
417
|
+
...(repExtensions.length > 0
|
|
418
|
+
? repExtensions.map((row) => `- Extension ${row.extension}: ${row.files}`)
|
|
419
|
+
: ["- No extension distribution data."]),
|
|
420
|
+
`- Keyword hits: ${repKeywordHits}`,
|
|
421
|
+
"",
|
|
422
|
+
"## Routing Hints",
|
|
423
|
+
...(routingHints.length > 0 ? routingHints.map((row) => `- ${row}`) : ["- No routing hints derived."]),
|
|
424
|
+
"",
|
|
425
|
+
"## Notes",
|
|
426
|
+
...notes.map((row) => `- ${row}`),
|
|
427
|
+
"",
|
|
428
|
+
].join("\n");
|
|
429
|
+
const outputJsonPath = safeWrite("agent-state/AST_GREP_INDEX.json", JSON.stringify(payload, null, 2));
|
|
430
|
+
const outputMdPath = safeWrite("agent-state/AST_GREP_INDEX.md", markdown);
|
|
431
|
+
if (appendEvidence) {
|
|
432
|
+
appendEvidenceLine(generatedAt, astgrepCmd, {
|
|
433
|
+
language_profile_entries: Object.keys(languageProfile).length,
|
|
434
|
+
hotspot_files: hotspots.length,
|
|
435
|
+
rep_sources: repSources.length,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
let eventPath;
|
|
439
|
+
let eventId;
|
|
440
|
+
if (emitEvent) {
|
|
441
|
+
const status = astgrepCmd ? "pass" : "blocked";
|
|
442
|
+
const eventType = astgrepCmd ? "DISCOVERY_INDEX_READY" : "DISCOVERY_SCOPE_BLOCKED";
|
|
443
|
+
const event = appendStatusEvent({
|
|
444
|
+
source_module: "capability-astgrep",
|
|
445
|
+
event_type: eventType,
|
|
446
|
+
status,
|
|
447
|
+
summary: `AST discovery index refreshed for scope ${scope.rel}`,
|
|
448
|
+
objective_id: "discovery-index",
|
|
449
|
+
payload: {
|
|
450
|
+
astgrep_available: Boolean(astgrepCmd),
|
|
451
|
+
hotspot_files: hotspots.length,
|
|
452
|
+
rep_sources: repSources.length,
|
|
453
|
+
evidence_ref: "agent-state/AST_GREP_INDEX.json",
|
|
454
|
+
},
|
|
455
|
+
});
|
|
456
|
+
eventPath = event.path;
|
|
457
|
+
eventId = event.event.event_id;
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
generated_at: generatedAt,
|
|
461
|
+
scope: scope.rel,
|
|
462
|
+
astgrep_command: astgrepCmd,
|
|
463
|
+
output_md_path: outputMdPath,
|
|
464
|
+
output_json_path: outputJsonPath,
|
|
465
|
+
evidence_appended: appendEvidence,
|
|
466
|
+
event_path: eventPath,
|
|
467
|
+
event_id: eventId,
|
|
468
|
+
stats: {
|
|
469
|
+
language_profile_entries: Object.keys(languageProfile).length,
|
|
470
|
+
hotspot_files: hotspots.length,
|
|
471
|
+
rep_sources: repSources.length,
|
|
472
|
+
todo_signals: todoHits.length,
|
|
473
|
+
},
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=astgrep-index.js.map
|
package/dist/cli.d.ts
ADDED