homegraph 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +305 -305
- package/dist/bin/command-supervision.d.ts.map +1 -1
- package/dist/bin/command-supervision.js +7 -4
- package/dist/bin/command-supervision.js.map +1 -1
- package/dist/bin/homegraph.js +9 -9
- package/dist/db/index.js +36 -36
- package/dist/db/migrations.js +37 -37
- package/dist/db/queries.js +156 -156
- package/dist/db/schema.sql +203 -203
- package/dist/directory.js +5 -5
- package/dist/extraction/languages/arkts-viewtree.d.ts +2 -4
- package/dist/extraction/languages/arkts-viewtree.d.ts.map +1 -1
- package/dist/extraction/languages/arkts-viewtree.js +6 -21
- package/dist/extraction/languages/arkts-viewtree.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +16 -6
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +174 -21
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
- package/dist/installer/instructions-template.js +9 -9
- package/dist/mcp/liveness-watchdog.d.ts +18 -0
- package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
- package/dist/mcp/liveness-watchdog.js +185 -73
- package/dist/mcp/liveness-watchdog.js.map +1 -1
- package/dist/mcp/server-instructions.js +47 -47
- package/dist/reasoning/reasoner.js +32 -32
- package/dist/spec/db/commit-node.js +4 -4
- package/dist/spec/db/fragment-node.js +10 -10
- package/dist/spec/db/fts.js +8 -8
- package/dist/spec/db/relations.js +88 -88
- package/dist/spec/db/schema.js +6 -6
- package/dist/spec/db/schema.sql +121 -121
- package/dist/spec/db/spec-node.js +4 -4
- package/dist/spec/llm/prompts.js +53 -53
- package/dist/spec/utils.d.ts +16 -4
- package/dist/spec/utils.d.ts.map +1 -1
- package/dist/spec/utils.js +58 -6
- package/dist/spec/utils.js.map +1 -1
- package/package.json +62 -62
- package/scripts/_tmp-cfwk-resolve.log +0 -0
- package/scripts/_tmp-cfwk-sig.log +0 -0
- package/scripts/_tmp-cfwk-vt.log +0 -0
- package/scripts/add-lang/bench.sh +60 -60
- package/scripts/add-lang/check-grammar.mjs +75 -75
- package/scripts/add-lang/dump-ast.mjs +103 -103
- package/scripts/add-lang/verify-extraction.mjs +70 -70
- package/scripts/agent-eval/ab-adoption.sh +91 -91
- package/scripts/agent-eval/ab-hook.sh +86 -86
- package/scripts/agent-eval/ab-impl.sh +78 -78
- package/scripts/agent-eval/ab-new-vs-baseline.sh +102 -102
- package/scripts/agent-eval/ab-sufficiency.sh +78 -78
- package/scripts/agent-eval/arms-F.sh +21 -21
- package/scripts/agent-eval/arms-matrix.sh +37 -37
- package/scripts/agent-eval/audit.sh +68 -68
- package/scripts/agent-eval/bench-readme.sh +28 -28
- package/scripts/agent-eval/bench-why-repo.sh +22 -22
- package/scripts/agent-eval/block-read-hook.sh +19 -19
- package/scripts/agent-eval/hook-settings.json +15 -15
- package/scripts/agent-eval/itrun.sh +120 -120
- package/scripts/agent-eval/offload-eval-3arm.sh +72 -72
- package/scripts/agent-eval/offload-eval-cost.mjs +133 -133
- package/scripts/agent-eval/offload-eval-effort.mjs +108 -108
- package/scripts/agent-eval/offload-eval-frontload-matrix.sh +25 -25
- package/scripts/agent-eval/offload-eval-frontload.sh +47 -47
- package/scripts/agent-eval/offload-eval-ground-truth.json +18 -18
- package/scripts/agent-eval/offload-eval-hook.mjs +84 -84
- package/scripts/agent-eval/offload-eval-judge.mjs +103 -103
- package/scripts/agent-eval/offload-eval-matrix.sh +20 -20
- package/scripts/agent-eval/offload-eval-metrics.mjs +94 -94
- package/scripts/agent-eval/offload-eval-refs1.sh +50 -50
- package/scripts/agent-eval/offload-eval-setup.sh +24 -24
- package/scripts/agent-eval/offload-eval-styles.sh +71 -71
- package/scripts/agent-eval/offload-eval-summarize.mjs +68 -68
- package/scripts/agent-eval/offload-eval.md +76 -76
- package/scripts/agent-eval/parse-arms.mjs +116 -116
- package/scripts/agent-eval/parse-bench-readme.mjs +84 -84
- package/scripts/agent-eval/parse-run.mjs +45 -45
- package/scripts/agent-eval/parse-session.mjs +93 -93
- package/scripts/agent-eval/probe-context.mjs +21 -21
- package/scripts/agent-eval/probe-explore.mjs +40 -40
- package/scripts/agent-eval/probe-node.mjs +20 -20
- package/scripts/agent-eval/probe-sweep.mjs +119 -119
- package/scripts/agent-eval/probe-trace.mjs +20 -20
- package/scripts/agent-eval/redirect-read-hook.sh +38 -38
- package/scripts/agent-eval/repro-concurrent-explore.mjs +119 -119
- package/scripts/agent-eval/repro-daemon-clients.mjs +125 -125
- package/scripts/agent-eval/run-agent.sh +34 -34
- package/scripts/agent-eval/run-all.sh +75 -75
- package/scripts/agent-eval/run-arms.sh +56 -56
- package/scripts/agent-eval/seq-matrix.mjs +137 -137
- package/scripts/bench-arkts-init-rss.log +0 -0
- package/scripts/build-bundle.sh +123 -123
- package/scripts/exp_boundary_eval/README.md +247 -247
- package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_all.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_all.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/setup.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/win_mcp_launcher.cpython-38.pyc +0 -0
- package/scripts/exp_boundary_eval/_test_mcp_chain.py +78 -78
- package/scripts/exp_boundary_eval/_test_stdin.py +8 -8
- package/scripts/exp_boundary_eval/_utils.py +1116 -1116
- package/scripts/exp_boundary_eval/analyze.py +1313 -1313
- package/scripts/exp_boundary_eval/deveco_arm.py +519 -519
- package/scripts/exp_boundary_eval/run_all.py +378 -378
- package/scripts/exp_boundary_eval/run_one.py +165 -165
- package/scripts/exp_boundary_eval/run_session.py +158 -158
- package/scripts/exp_boundary_eval/setup.py +120 -120
- package/scripts/exp_boundary_eval/win_mcp_launcher.py +73 -73
- package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +36 -36
- package/scripts/exp_boundary_eval/win_node_launcher.py +24 -24
- package/scripts/extract-release-notes.mjs +130 -130
- package/scripts/local-install.sh +41 -41
- package/scripts/npm-sdk.js +75 -75
- package/scripts/npm-shim.js +275 -275
- package/scripts/ohos-sdk-publish.mjs +133 -133
- package/scripts/pack-npm.sh +119 -119
- package/scripts/prepare-release.mjs +270 -270
- package/scripts/probe-arkts-mem-why-run.log +0 -0
- package/scripts/probe-banner-livecard-ir.log +0 -0
- package/scripts/probe-cfwk-ast.stderr.log +0 -0
- package/scripts/probe-cfwk-ast.stdout.log +0 -0
- package/scripts/probe-cfwk-attr-shape.log +0 -0
- package/scripts/probe-cfwk-cfgdump.stderr.log +0 -0
- package/scripts/probe-cfwk-cfgdump.stdout.log +0 -0
- package/scripts/probe-cfwk-cvc.stderr.log +0 -0
- package/scripts/probe-cfwk-cvc.stdout.log +0 -0
- package/scripts/probe-cfwk-diag2.log +0 -0
- package/scripts/probe-cfwk-diag3.log +0 -0
- package/scripts/probe-cfwk-fedbg.stderr.log +0 -0
- package/scripts/probe-cfwk-fedbg.stdout.log +0 -0
- package/scripts/probe-cfwk-fileresult.log +0 -0
- package/scripts/probe-cfwk-fix.stderr.log +0 -0
- package/scripts/probe-cfwk-fix.stdout.log +0 -0
- package/scripts/probe-cfwk-fix2.stderr.log +0 -0
- package/scripts/probe-cfwk-fix2.stdout.log +0 -0
- package/scripts/probe-cfwk-fix3.stderr.log +0 -0
- package/scripts/probe-cfwk-fix3.stdout.log +0 -0
- package/scripts/probe-cfwk-foreach.log +0 -0
- package/scripts/probe-cfwk-getmethod-throw.log +0 -0
- package/scripts/probe-cfwk-hg-extract.log +0 -0
- package/scripts/probe-cfwk-pr1003-noprior.stderr.log +0 -0
- package/scripts/probe-cfwk-pr1003-noprior.stdout.log +0 -0
- package/scripts/probe-cfwk-pr1003.stderr.log +0 -0
- package/scripts/probe-cfwk-pr1003.stdout.log +0 -0
- package/scripts/probe-cfwk-preroot-noprior.stderr.log +0 -0
- package/scripts/probe-cfwk-preroot-noprior.stdout.log +0 -0
- package/scripts/probe-cfwk-preroot-prior.stderr.log +0 -0
- package/scripts/probe-cfwk-preroot-prior.stdout.log +0 -0
- package/scripts/probe-cfwk-preroot-skipstate.stderr.log +0 -0
- package/scripts/probe-cfwk-preroot-skipstate.stdout.log +0 -0
- package/scripts/probe-cfwk-resolve-sim.log +0 -0
- package/scripts/probe-cfwk-tree-shape.log +0 -0
- package/scripts/probe-cfwk-walk-abort.log +0 -0
- package/scripts/probe-cfwk.log +0 -0
- package/scripts/probe-force-index.log +0 -0
- package/scripts/probe-no-force-index.log +0 -0
- package/scripts/probe-samefile-ir.stderr.log +0 -0
- package/scripts/probe-samefile-ir.stdout.log +224 -0
- package/scripts/probe-sdk-vs-project.log +0 -0
- package/scripts/probe-viewtree-downgrade.log +0 -0
- package/dist/arkts/ohos-api-index.d.ts +0 -15
- package/dist/arkts/ohos-api-index.d.ts.map +0 -1
- package/dist/arkts/ohos-api-index.js +0 -190
- package/dist/arkts/ohos-api-index.js.map +0 -1
- package/dist/arkts/ohos-sdk-input.d.ts +0 -36
- package/dist/arkts/ohos-sdk-input.d.ts.map +0 -1
- package/dist/arkts/ohos-sdk-input.js +0 -214
- package/dist/arkts/ohos-sdk-input.js.map +0 -1
- package/dist/extraction/languages/arkts-state-decorators.d.ts +0 -13
- package/dist/extraction/languages/arkts-state-decorators.d.ts.map +0 -1
- package/dist/extraction/languages/arkts-state-decorators.js +0 -26
- package/dist/extraction/languages/arkts-state-decorators.js.map +0 -1
- package/dist/extraction/languages/ohos-api-consumer.d.ts +0 -34
- package/dist/extraction/languages/ohos-api-consumer.d.ts.map +0 -1
- package/dist/extraction/languages/ohos-api-consumer.js +0 -283
- package/dist/extraction/languages/ohos-api-consumer.js.map +0 -1
- package/dist/spec/build/git-scanner.d.ts +0 -93
- package/dist/spec/build/git-scanner.d.ts.map +0 -1
- package/dist/spec/build/git-scanner.js +0 -254
- package/dist/spec/build/git-scanner.js.map +0 -1
- package/dist/spec/git-utils.d.ts +0 -8
- package/dist/spec/git-utils.d.ts.map +0 -1
- package/dist/spec/git-utils.js +0 -14
- package/dist/spec/git-utils.js.map +0 -1
- package/dist/spec/mine/clusterer.d.ts +0 -63
- package/dist/spec/mine/clusterer.d.ts.map +0 -1
- package/dist/spec/mine/clusterer.js +0 -904
- package/dist/spec/mine/clusterer.js.map +0 -1
- package/dist/spec/mine/progress-handler.d.ts +0 -22
- package/dist/spec/mine/progress-handler.d.ts.map +0 -1
- package/dist/spec/mine/progress-handler.js +0 -108
- package/dist/spec/mine/progress-handler.js.map +0 -1
- package/dist/spec/mine/progress.d.ts +0 -23
- package/dist/spec/mine/progress.d.ts.map +0 -1
- package/dist/spec/mine/progress.js +0 -12
- package/dist/spec/mine/progress.js.map +0 -1
package/dist/spec/llm/prompts.js
CHANGED
|
@@ -13,43 +13,43 @@ const utils_1 = require("../utils");
|
|
|
13
13
|
// Spec generation prompt + template (mine pipeline)
|
|
14
14
|
// =============================================================================
|
|
15
15
|
/** Default markdown template for generated spec documents. */
|
|
16
|
-
exports.DEFAULT_SPEC_TEMPLATE = `# Spec: {{title}}
|
|
17
|
-
|
|
18
|
-
## Summary
|
|
19
|
-
{{summary}}
|
|
20
|
-
|
|
21
|
-
## Motivation
|
|
22
|
-
{{motivation}}
|
|
23
|
-
|
|
24
|
-
## Specification
|
|
25
|
-
|
|
26
|
-
### Functional Requirements
|
|
27
|
-
{{functional_requirements}}
|
|
28
|
-
|
|
29
|
-
### Acceptance Criteria (EARS format)
|
|
30
|
-
{{acceptance_criteria}}
|
|
31
|
-
|
|
32
|
-
## Implementation Notes
|
|
33
|
-
|
|
34
|
-
### Related Commits
|
|
35
|
-
{{commit_list}}
|
|
36
|
-
|
|
37
|
-
### Affected Files
|
|
38
|
-
{{file_list}}
|
|
39
|
-
|
|
40
|
-
### Key Symbols
|
|
41
|
-
{{symbol_list}}
|
|
16
|
+
exports.DEFAULT_SPEC_TEMPLATE = `# Spec: {{title}}
|
|
17
|
+
|
|
18
|
+
## Summary
|
|
19
|
+
{{summary}}
|
|
20
|
+
|
|
21
|
+
## Motivation
|
|
22
|
+
{{motivation}}
|
|
23
|
+
|
|
24
|
+
## Specification
|
|
25
|
+
|
|
26
|
+
### Functional Requirements
|
|
27
|
+
{{functional_requirements}}
|
|
28
|
+
|
|
29
|
+
### Acceptance Criteria (EARS format)
|
|
30
|
+
{{acceptance_criteria}}
|
|
31
|
+
|
|
32
|
+
## Implementation Notes
|
|
33
|
+
|
|
34
|
+
### Related Commits
|
|
35
|
+
{{commit_list}}
|
|
36
|
+
|
|
37
|
+
### Affected Files
|
|
38
|
+
{{file_list}}
|
|
39
|
+
|
|
40
|
+
### Key Symbols
|
|
41
|
+
{{symbol_list}}
|
|
42
42
|
`;
|
|
43
43
|
/** System prompt for LLM spec generation from a commit cluster. */
|
|
44
|
-
exports.SPEC_GENERATION_SYSTEM_PROMPT = `You are a technical documentation writer specializing in software design specifications. Given a cluster of related Git commits, generate a design specification in markdown format.
|
|
45
|
-
|
|
46
|
-
Guidelines:
|
|
47
|
-
- Focus on WHAT was built, not HOW it was implemented
|
|
48
|
-
- Use EARS (Easy Approach to Requirements Syntax) for acceptance criteria
|
|
49
|
-
- Be specific — reference real symbols, files, and commit messages
|
|
50
|
-
- Keep the spec concise but complete
|
|
51
|
-
- Output ONLY the spec document, no preamble or commentary
|
|
52
|
-
|
|
44
|
+
exports.SPEC_GENERATION_SYSTEM_PROMPT = `You are a technical documentation writer specializing in software design specifications. Given a cluster of related Git commits, generate a design specification in markdown format.
|
|
45
|
+
|
|
46
|
+
Guidelines:
|
|
47
|
+
- Focus on WHAT was built, not HOW it was implemented
|
|
48
|
+
- Use EARS (Easy Approach to Requirements Syntax) for acceptance criteria
|
|
49
|
+
- Be specific — reference real symbols, files, and commit messages
|
|
50
|
+
- Keep the spec concise but complete
|
|
51
|
+
- Output ONLY the spec document, no preamble or commentary
|
|
52
|
+
|
|
53
53
|
Output format — fill in the template exactly. Replace {{placeholders}} with real content. Do NOT include the placeholder braces in your output.`;
|
|
54
54
|
// =============================================================================
|
|
55
55
|
// Cluster spec evaluation prompt
|
|
@@ -58,24 +58,24 @@ Output format — fill in the template exactly. Replace {{placeholders}} with re
|
|
|
58
58
|
* (~16K tokens @ ~0.25 token/char). Exceedingly large spec documents are
|
|
59
59
|
* truncated to prevent context-window overflow. */
|
|
60
60
|
const MAX_SPEC_CONTENT_CHARS = 64000;
|
|
61
|
-
exports.SPEC_EVALUATION_CLUSTER_SYSTEM_PROMPT = `You are a technical documentation maintainer. Your task is to evaluate whether a GROUP of related git commits requires updating a software design specification.
|
|
62
|
-
|
|
63
|
-
Given the current content and a summary of multiple commits that affect this spec, determine:
|
|
64
|
-
1. Whether the spec needs to be updated (UPDATE), deprecated (DEPRECATE), or left unchanged (UNCHANGED).
|
|
65
|
-
2. If UPDATE: provide the new title, subtitles (as an array of heading-preview strings), and full rewritten spec_content that incorporates the changes from all commits.
|
|
66
|
-
3. If DEPRECATE: provide a brief explanation in the spec_content field.
|
|
67
|
-
|
|
68
|
-
Key considerations for batch evaluation:
|
|
69
|
-
- Multiple commits may partially overlap in their changes — synthesize the combined impact.
|
|
70
|
-
- Some commits may be bug fixes that revert earlier changes — look for the net effect.
|
|
71
|
-
- If the combined changes fundamentally alter the spec's scope, prefer DEPRECATE over UPDATE.
|
|
72
|
-
|
|
73
|
-
Response format (JSON):
|
|
74
|
-
{
|
|
75
|
-
"action": "UPDATE" | "DEPRECATE" | "UNCHANGED",
|
|
76
|
-
"title": "New spec title (for UPDATE)",
|
|
77
|
-
"subtitles": ["heading1 → heading2 - preview", ...],
|
|
78
|
-
"spec_content": "Full rewritten markdown content (for UPDATE) or deprecation reason (for DEPRECATE)"
|
|
61
|
+
exports.SPEC_EVALUATION_CLUSTER_SYSTEM_PROMPT = `You are a technical documentation maintainer. Your task is to evaluate whether a GROUP of related git commits requires updating a software design specification.
|
|
62
|
+
|
|
63
|
+
Given the current content and a summary of multiple commits that affect this spec, determine:
|
|
64
|
+
1. Whether the spec needs to be updated (UPDATE), deprecated (DEPRECATE), or left unchanged (UNCHANGED).
|
|
65
|
+
2. If UPDATE: provide the new title, subtitles (as an array of heading-preview strings), and full rewritten spec_content that incorporates the changes from all commits.
|
|
66
|
+
3. If DEPRECATE: provide a brief explanation in the spec_content field.
|
|
67
|
+
|
|
68
|
+
Key considerations for batch evaluation:
|
|
69
|
+
- Multiple commits may partially overlap in their changes — synthesize the combined impact.
|
|
70
|
+
- Some commits may be bug fixes that revert earlier changes — look for the net effect.
|
|
71
|
+
- If the combined changes fundamentally alter the spec's scope, prefer DEPRECATE over UPDATE.
|
|
72
|
+
|
|
73
|
+
Response format (JSON):
|
|
74
|
+
{
|
|
75
|
+
"action": "UPDATE" | "DEPRECATE" | "UNCHANGED",
|
|
76
|
+
"title": "New spec title (for UPDATE)",
|
|
77
|
+
"subtitles": ["heading1 → heading2 - preview", ...],
|
|
78
|
+
"spec_content": "Full rewritten markdown content (for UPDATE) or deprecation reason (for DEPRECATE)"
|
|
79
79
|
}`;
|
|
80
80
|
/**
|
|
81
81
|
* Build the user prompt for cluster-based spec evaluation.
|
package/dist/spec/utils.d.ts
CHANGED
|
@@ -41,6 +41,19 @@ export declare function readFileContent(filePath: string): string | null;
|
|
|
41
41
|
* If the parent exists but is not a directory the underlying error propagates.
|
|
42
42
|
*/
|
|
43
43
|
export declare function writeFileContent(filePath: string, content: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Parse commit-info.md content for a commit hash.
|
|
46
|
+
*
|
|
47
|
+
* Searches line by line for one of:
|
|
48
|
+
* - `commit: HASH`
|
|
49
|
+
* - `commit-id: HASH`
|
|
50
|
+
* - `commit_id: HASH`
|
|
51
|
+
* - a bare 40-char hex hash on its own line
|
|
52
|
+
*
|
|
53
|
+
* Returns the first matched hash (7–40 hex chars), or `null` if no hash is
|
|
54
|
+
* found. Empty or whitespace-only input returns `null`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseCommitInfoMd(content: string): string | null;
|
|
44
57
|
/**
|
|
45
58
|
* Discover specs in a storage directory.
|
|
46
59
|
*
|
|
@@ -72,10 +85,9 @@ export declare function readMeta(repoPath: string): SpecMeta | null;
|
|
|
72
85
|
/**
|
|
73
86
|
* Write `${SPEC_DATA_DIR}/meta.json` to `repoPath`.
|
|
74
87
|
*
|
|
75
|
-
* If existing meta has a `createdAt` field it is preserved; otherwise
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* not exist.
|
|
88
|
+
* If existing meta has a `createdAt` field it is preserved; otherwise a new
|
|
89
|
+
* ISO-8601 timestamp is generated. `updatedAt` is always set to the current
|
|
90
|
+
* time. The `${SPEC_DATA_DIR}` directory is created if it does not exist.
|
|
79
91
|
*
|
|
80
92
|
* Returns the full `SpecMeta` that was written.
|
|
81
93
|
*/
|
package/dist/spec/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/spec/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,GAAG,MAAM,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD,qEAAqE;AACrE,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAStD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS/D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMxE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,EAAE,CA6BlE;AAMD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAiChF;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CA8C1D;AAED
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/spec/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,GAAG,MAAM,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD,qEAAqE;AACrE,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAStD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS/D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMxE;AAmBD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuBhE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,EAAE,CA6BlE;AAMD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAiChF;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CA8C1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,QAAQ,CAyBV;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAa,GAAG,MAAM,CA6C9E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBnE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAMV;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,MAAM,GACtB,aAAa,CAcf"}
|
package/dist/spec/utils.js
CHANGED
|
@@ -45,6 +45,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
45
45
|
exports.SPEC_DATA_DIR = void 0;
|
|
46
46
|
exports.readFileContent = readFileContent;
|
|
47
47
|
exports.writeFileContent = writeFileContent;
|
|
48
|
+
exports.parseCommitInfoMd = parseCommitInfoMd;
|
|
48
49
|
exports.discoverSpecs = discoverSpecs;
|
|
49
50
|
exports.resolveDbPath = resolveDbPath;
|
|
50
51
|
exports.readMeta = readMeta;
|
|
@@ -97,6 +98,55 @@ function writeFileContent(filePath, content) {
|
|
|
97
98
|
fs.writeFileSync(filePath, content, 'utf-8');
|
|
98
99
|
}
|
|
99
100
|
// =============================================================================
|
|
101
|
+
// Commit-info.md parsing
|
|
102
|
+
// =============================================================================
|
|
103
|
+
/**
|
|
104
|
+
* Regex matching commit-hash annotations in commit-info.md content.
|
|
105
|
+
*
|
|
106
|
+
* Matches lines like:
|
|
107
|
+
* commit: abc123def456...
|
|
108
|
+
* commit-id: abc123def456...
|
|
109
|
+
* commit_id: abc123def456...
|
|
110
|
+
* commit-id=abc123def456...
|
|
111
|
+
* abc123def456789... (bare 40-char hex on its own line)
|
|
112
|
+
*/
|
|
113
|
+
const COMMIT_HASH_RE = /^commit[-_ ]?(?:id)?[:= ]\s*([a-f0-9]{7,40})\s*$/i;
|
|
114
|
+
const BARE_HASH_RE = /^([a-f0-9]{40})\s*$/i;
|
|
115
|
+
/**
|
|
116
|
+
* Parse commit-info.md content for a commit hash.
|
|
117
|
+
*
|
|
118
|
+
* Searches line by line for one of:
|
|
119
|
+
* - `commit: HASH`
|
|
120
|
+
* - `commit-id: HASH`
|
|
121
|
+
* - `commit_id: HASH`
|
|
122
|
+
* - a bare 40-char hex hash on its own line
|
|
123
|
+
*
|
|
124
|
+
* Returns the first matched hash (7–40 hex chars), or `null` if no hash is
|
|
125
|
+
* found. Empty or whitespace-only input returns `null`.
|
|
126
|
+
*/
|
|
127
|
+
function parseCommitInfoMd(content) {
|
|
128
|
+
if (!content)
|
|
129
|
+
return null;
|
|
130
|
+
for (const line of content.split('\n')) {
|
|
131
|
+
const trimmed = line.trim();
|
|
132
|
+
if (!trimmed)
|
|
133
|
+
continue;
|
|
134
|
+
// Try annotated hash first
|
|
135
|
+
const match = COMMIT_HASH_RE.exec(trimmed);
|
|
136
|
+
if (match) {
|
|
137
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
138
|
+
return match[1].toLowerCase();
|
|
139
|
+
}
|
|
140
|
+
// Try bare 40-char hex
|
|
141
|
+
const bareMatch = BARE_HASH_RE.exec(trimmed);
|
|
142
|
+
if (bareMatch) {
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
144
|
+
return bareMatch[1].toLowerCase();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
// =============================================================================
|
|
100
150
|
// Spec discovery
|
|
101
151
|
// =============================================================================
|
|
102
152
|
/**
|
|
@@ -230,10 +280,9 @@ function readMeta(repoPath) {
|
|
|
230
280
|
/**
|
|
231
281
|
* Write `${SPEC_DATA_DIR}/meta.json` to `repoPath`.
|
|
232
282
|
*
|
|
233
|
-
* If existing meta has a `createdAt` field it is preserved; otherwise
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* not exist.
|
|
283
|
+
* If existing meta has a `createdAt` field it is preserved; otherwise a new
|
|
284
|
+
* ISO-8601 timestamp is generated. `updatedAt` is always set to the current
|
|
285
|
+
* time. The `${SPEC_DATA_DIR}` directory is created if it does not exist.
|
|
237
286
|
*
|
|
238
287
|
* Returns the full `SpecMeta` that was written.
|
|
239
288
|
*/
|
|
@@ -241,9 +290,12 @@ function writeMeta(repoPath, specStoragePath, currentCommitID) {
|
|
|
241
290
|
const metaDir = path.join(repoPath, exports.SPEC_DATA_DIR);
|
|
242
291
|
const metaPath = path.join(metaDir, 'meta.json');
|
|
243
292
|
const now = new Date().toISOString();
|
|
244
|
-
// Preserve createdAt from existing meta
|
|
293
|
+
// Preserve createdAt from existing meta if available
|
|
294
|
+
let createdAt;
|
|
245
295
|
const existing = readMeta(repoPath);
|
|
246
|
-
|
|
296
|
+
if (existing && existing.createdAt) {
|
|
297
|
+
createdAt = existing.createdAt;
|
|
298
|
+
}
|
|
247
299
|
const meta = {
|
|
248
300
|
repoPath,
|
|
249
301
|
specStoragePath,
|
package/dist/spec/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/spec/utils.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDH,0CASC;AAQD,4CAMC;AAgBD,sCA6BC;AAeD,sCAiCC;AAYD,4BA8CC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/spec/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "homegraph",
|
|
3
|
-
"version": "1.5.
|
|
4
|
-
"description": "Supercharge AI coding agents with semantic code intelligence — surgical context, fewer tool calls, faster answers. 100% local.",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"types": "dist/index.d.ts",
|
|
7
|
-
"bin": {
|
|
8
|
-
"homegraph": "./dist/bin/homegraph.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"dist",
|
|
12
|
-
"scripts",
|
|
13
|
-
"README.md"
|
|
14
|
-
],
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "tsc && npm run copy-assets && node -e \"require('fs').chmodSync('dist/bin/homegraph.js', 0o755)\"",
|
|
17
|
-
"preuninstall": "node dist/bin/uninstall.js",
|
|
18
|
-
"copy-assets": "node -e \"const fs=require('fs');fs.mkdirSync('dist/db',{recursive:true});fs.copyFileSync('src/db/schema.sql','dist/db/schema.sql');fs.mkdirSync('dist/spec/db',{recursive:true});fs.copyFileSync('src/spec/db/schema.sql','dist/spec/db/schema.sql');fs.mkdirSync('dist/extraction/wasm',{recursive:true});fs.readdirSync('src/extraction/wasm').filter(f=>f.endsWith('.wasm')).forEach(f=>fs.copyFileSync('src/extraction/wasm/'+f,'dist/extraction/wasm/'+f))\"",
|
|
19
|
-
"dev": "tsc --watch",
|
|
20
|
-
"cli": "npm run build && node dist/bin/homegraph.js",
|
|
21
|
-
"test": "vitest run",
|
|
22
|
-
"test:watch": "vitest",
|
|
23
|
-
"test:eval": "vitest run __tests__/evaluation/",
|
|
24
|
-
"eval": "npm run build && npx tsx __tests__/evaluation/runner.ts",
|
|
25
|
-
"clean": "node -e \"const fs=require('fs');fs.rmSync('dist',{recursive:true,force:true})\""
|
|
26
|
-
},
|
|
27
|
-
"keywords": [
|
|
28
|
-
"code-intelligence",
|
|
29
|
-
"knowledge-graph",
|
|
30
|
-
"static-analysis"
|
|
31
|
-
],
|
|
32
|
-
"author": "",
|
|
33
|
-
"license": "MIT",
|
|
34
|
-
"dependencies": {
|
|
35
|
-
"@clack/prompts": "^1.3.0",
|
|
36
|
-
"commander": "^14.0.2",
|
|
37
|
-
"fast-string-width": "^3.0.2",
|
|
38
|
-
"fast-wrap-ansi": "^0.2.0",
|
|
39
|
-
"ignore": "^7.0.5",
|
|
40
|
-
"jsonc-parser": "^3.3.1",
|
|
41
|
-
"openai": "^4.104.0",
|
|
42
|
-
"picomatch": "^4.0.3",
|
|
43
|
-
"sisteransi": "^1.0.5",
|
|
44
|
-
"node-sqlite3-wasm": "^0.8.30",
|
|
45
|
-
"tree-sitter-wasms": "^0.1.11",
|
|
46
|
-
"web-tree-sitter": "^0.25.3",
|
|
47
|
-
"arkanalyzer": "^1.0.91"
|
|
48
|
-
},
|
|
49
|
-
"devDependencies": {
|
|
50
|
-
"@types/better-sqlite3": "^7.6.0",
|
|
51
|
-
"@types/node": "^20.19.30",
|
|
52
|
-
"@types/picomatch": "^4.0.2",
|
|
53
|
-
"typescript": "^5.0.0",
|
|
54
|
-
"vitest": "^2.1.9"
|
|
55
|
-
},
|
|
56
|
-
"optionalDependencies": {
|
|
57
|
-
"better-sqlite3": "^12.4.1"
|
|
58
|
-
},
|
|
59
|
-
"engines": {
|
|
60
|
-
"node": ">=20.0.0 <25.0.0"
|
|
61
|
-
}
|
|
62
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "homegraph",
|
|
3
|
+
"version": "1.5.1",
|
|
4
|
+
"description": "Supercharge AI coding agents with semantic code intelligence — surgical context, fewer tool calls, faster answers. 100% local.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"homegraph": "./dist/bin/homegraph.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"scripts",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc && npm run copy-assets && node -e \"require('fs').chmodSync('dist/bin/homegraph.js', 0o755)\"",
|
|
17
|
+
"preuninstall": "node dist/bin/uninstall.js",
|
|
18
|
+
"copy-assets": "node -e \"const fs=require('fs');fs.mkdirSync('dist/db',{recursive:true});fs.copyFileSync('src/db/schema.sql','dist/db/schema.sql');fs.mkdirSync('dist/spec/db',{recursive:true});fs.copyFileSync('src/spec/db/schema.sql','dist/spec/db/schema.sql');fs.mkdirSync('dist/extraction/wasm',{recursive:true});fs.readdirSync('src/extraction/wasm').filter(f=>f.endsWith('.wasm')).forEach(f=>fs.copyFileSync('src/extraction/wasm/'+f,'dist/extraction/wasm/'+f))\"",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"cli": "npm run build && node dist/bin/homegraph.js",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"test:eval": "vitest run __tests__/evaluation/",
|
|
24
|
+
"eval": "npm run build && npx tsx __tests__/evaluation/runner.ts",
|
|
25
|
+
"clean": "node -e \"const fs=require('fs');fs.rmSync('dist',{recursive:true,force:true})\""
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"code-intelligence",
|
|
29
|
+
"knowledge-graph",
|
|
30
|
+
"static-analysis"
|
|
31
|
+
],
|
|
32
|
+
"author": "",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@clack/prompts": "^1.3.0",
|
|
36
|
+
"commander": "^14.0.2",
|
|
37
|
+
"fast-string-width": "^3.0.2",
|
|
38
|
+
"fast-wrap-ansi": "^0.2.0",
|
|
39
|
+
"ignore": "^7.0.5",
|
|
40
|
+
"jsonc-parser": "^3.3.1",
|
|
41
|
+
"openai": "^4.104.0",
|
|
42
|
+
"picomatch": "^4.0.3",
|
|
43
|
+
"sisteransi": "^1.0.5",
|
|
44
|
+
"node-sqlite3-wasm": "^0.8.30",
|
|
45
|
+
"tree-sitter-wasms": "^0.1.11",
|
|
46
|
+
"web-tree-sitter": "^0.25.3",
|
|
47
|
+
"arkanalyzer": "^1.0.91"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/better-sqlite3": "^7.6.0",
|
|
51
|
+
"@types/node": "^20.19.30",
|
|
52
|
+
"@types/picomatch": "^4.0.2",
|
|
53
|
+
"typescript": "^5.0.0",
|
|
54
|
+
"vitest": "^2.1.9"
|
|
55
|
+
},
|
|
56
|
+
"optionalDependencies": {
|
|
57
|
+
"better-sqlite3": "^12.4.1"
|
|
58
|
+
},
|
|
59
|
+
"engines": {
|
|
60
|
+
"node": ">=20.0.0 <25.0.0"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Add-lang benchmark for ONE repo:
|
|
3
|
-
# clone -> wipe+index (with the homegraph on PATH) -> verify extraction ->
|
|
4
|
-
# with/without retrieval A/B (reuses scripts/agent-eval/run-all.sh).
|
|
5
|
-
#
|
|
6
|
-
# Assumes the homegraph dev build is already built + linked on PATH — the skill
|
|
7
|
-
# runs `npm run build && ./scripts/local-install.sh` ONCE before looping repos.
|
|
8
|
-
# The A/B is skipped if extraction fails its critical checks (don't burn $ on a
|
|
9
|
-
# broken extractor); set FORCE_AB=1 to run it anyway.
|
|
10
|
-
#
|
|
11
|
-
# Usage: bench.sh <lang> <repo-name> <repo-url> "<question>" [headless|tmux|all]
|
|
12
|
-
# Env: CORPUS corpus dir (default /tmp/homegraph-corpus, shared with agent-eval)
|
|
13
|
-
set -uo pipefail
|
|
14
|
-
|
|
15
|
-
LANG_TOKEN="${1:?usage: bench.sh <lang> <repo-name> <repo-url> \"<question>\" [mode]}"
|
|
16
|
-
NAME="${2:?repo-name required}"
|
|
17
|
-
URL="${3:?repo-url required}"
|
|
18
|
-
Q="${4:?question required}"
|
|
19
|
-
MODE="${5:-headless}"
|
|
20
|
-
|
|
21
|
-
HARNESS="$(cd "$(dirname "$0")" && pwd)"
|
|
22
|
-
AGENT_EVAL="$(cd "$HARNESS/../agent-eval" && pwd)"
|
|
23
|
-
CORPUS="${CORPUS:-/tmp/homegraph-corpus}"
|
|
24
|
-
REPO="$CORPUS/$NAME"
|
|
25
|
-
|
|
26
|
-
command -v homegraph >/dev/null || { echo "no homegraph on PATH (build + ./scripts/local-install.sh first)"; exit 1; }
|
|
27
|
-
|
|
28
|
-
echo "==================== add-lang bench: $NAME ($LANG_TOKEN) ===================="
|
|
29
|
-
echo "homegraph: $(command -v homegraph) -> $(homegraph --version 2>/dev/null || echo '?')"
|
|
30
|
-
|
|
31
|
-
# 1. Ensure the repo (shallow clone, reuse if present).
|
|
32
|
-
mkdir -p "$CORPUS"
|
|
33
|
-
if [ -d "$REPO/.git" ]; then
|
|
34
|
-
echo "→ reusing checkout: $REPO"
|
|
35
|
-
else
|
|
36
|
-
echo "→ cloning $URL"
|
|
37
|
-
git clone --depth 1 "$URL" "$REPO" || { echo "git clone failed"; exit 1; }
|
|
38
|
-
fi
|
|
39
|
-
|
|
40
|
-
# 2. Wipe + index with the binary under test.
|
|
41
|
-
echo "→ wiping .homegraph and indexing"
|
|
42
|
-
rm -rf "$REPO/.homegraph"
|
|
43
|
-
( cd "$REPO" && homegraph init -i ) || { echo "indexing failed"; exit 1; }
|
|
44
|
-
|
|
45
|
-
# 3. Verify extraction (cheap guard before the paid A/B).
|
|
46
|
-
echo "→ verifying extraction"
|
|
47
|
-
node "$HARNESS/verify-extraction.mjs" "$REPO" "$LANG_TOKEN"
|
|
48
|
-
VERIFY=$?
|
|
49
|
-
|
|
50
|
-
# 4. Retrieval A/B (skipped if extraction is broken, unless FORCE_AB=1).
|
|
51
|
-
if [ "$VERIFY" -ne 0 ] && [ "${FORCE_AB:-0}" != "1" ]; then
|
|
52
|
-
echo "→ SKIPPING A/B — extraction failed critical checks (set FORCE_AB=1 to override)"
|
|
53
|
-
else
|
|
54
|
-
echo "→ retrieval A/B (mode=$MODE)"
|
|
55
|
-
bash "$AGENT_EVAL/run-all.sh" "$REPO" "$Q" "$MODE"
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
echo "==================== bench complete: $NAME (verify exit=$VERIFY) ===================="
|
|
59
|
-
# Exit reflects extraction: 0 = pass/warn, 1 = critical fail, 2 = couldn't read status.
|
|
60
|
-
exit "$VERIFY"
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Add-lang benchmark for ONE repo:
|
|
3
|
+
# clone -> wipe+index (with the homegraph on PATH) -> verify extraction ->
|
|
4
|
+
# with/without retrieval A/B (reuses scripts/agent-eval/run-all.sh).
|
|
5
|
+
#
|
|
6
|
+
# Assumes the homegraph dev build is already built + linked on PATH — the skill
|
|
7
|
+
# runs `npm run build && ./scripts/local-install.sh` ONCE before looping repos.
|
|
8
|
+
# The A/B is skipped if extraction fails its critical checks (don't burn $ on a
|
|
9
|
+
# broken extractor); set FORCE_AB=1 to run it anyway.
|
|
10
|
+
#
|
|
11
|
+
# Usage: bench.sh <lang> <repo-name> <repo-url> "<question>" [headless|tmux|all]
|
|
12
|
+
# Env: CORPUS corpus dir (default /tmp/homegraph-corpus, shared with agent-eval)
|
|
13
|
+
set -uo pipefail
|
|
14
|
+
|
|
15
|
+
LANG_TOKEN="${1:?usage: bench.sh <lang> <repo-name> <repo-url> \"<question>\" [mode]}"
|
|
16
|
+
NAME="${2:?repo-name required}"
|
|
17
|
+
URL="${3:?repo-url required}"
|
|
18
|
+
Q="${4:?question required}"
|
|
19
|
+
MODE="${5:-headless}"
|
|
20
|
+
|
|
21
|
+
HARNESS="$(cd "$(dirname "$0")" && pwd)"
|
|
22
|
+
AGENT_EVAL="$(cd "$HARNESS/../agent-eval" && pwd)"
|
|
23
|
+
CORPUS="${CORPUS:-/tmp/homegraph-corpus}"
|
|
24
|
+
REPO="$CORPUS/$NAME"
|
|
25
|
+
|
|
26
|
+
command -v homegraph >/dev/null || { echo "no homegraph on PATH (build + ./scripts/local-install.sh first)"; exit 1; }
|
|
27
|
+
|
|
28
|
+
echo "==================== add-lang bench: $NAME ($LANG_TOKEN) ===================="
|
|
29
|
+
echo "homegraph: $(command -v homegraph) -> $(homegraph --version 2>/dev/null || echo '?')"
|
|
30
|
+
|
|
31
|
+
# 1. Ensure the repo (shallow clone, reuse if present).
|
|
32
|
+
mkdir -p "$CORPUS"
|
|
33
|
+
if [ -d "$REPO/.git" ]; then
|
|
34
|
+
echo "→ reusing checkout: $REPO"
|
|
35
|
+
else
|
|
36
|
+
echo "→ cloning $URL"
|
|
37
|
+
git clone --depth 1 "$URL" "$REPO" || { echo "git clone failed"; exit 1; }
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# 2. Wipe + index with the binary under test.
|
|
41
|
+
echo "→ wiping .homegraph and indexing"
|
|
42
|
+
rm -rf "$REPO/.homegraph"
|
|
43
|
+
( cd "$REPO" && homegraph init -i ) || { echo "indexing failed"; exit 1; }
|
|
44
|
+
|
|
45
|
+
# 3. Verify extraction (cheap guard before the paid A/B).
|
|
46
|
+
echo "→ verifying extraction"
|
|
47
|
+
node "$HARNESS/verify-extraction.mjs" "$REPO" "$LANG_TOKEN"
|
|
48
|
+
VERIFY=$?
|
|
49
|
+
|
|
50
|
+
# 4. Retrieval A/B (skipped if extraction is broken, unless FORCE_AB=1).
|
|
51
|
+
if [ "$VERIFY" -ne 0 ] && [ "${FORCE_AB:-0}" != "1" ]; then
|
|
52
|
+
echo "→ SKIPPING A/B — extraction failed critical checks (set FORCE_AB=1 to override)"
|
|
53
|
+
else
|
|
54
|
+
echo "→ retrieval A/B (mode=$MODE)"
|
|
55
|
+
bash "$AGENT_EVAL/run-all.sh" "$REPO" "$Q" "$MODE"
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
echo "==================== bench complete: $NAME (verify exit=$VERIFY) ===================="
|
|
59
|
+
# Exit reflects extraction: 0 = pass/warn, 1 = critical fail, 2 = couldn't read status.
|
|
60
|
+
exit "$VERIFY"
|