homegraph 1.5.0 → 1.5.2
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/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/extraction/index.d.ts +1 -1
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +54 -43
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +69 -12
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +739 -86
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/diff-impact.d.ts +131 -0
- package/dist/mcp/diff-impact.d.ts.map +1 -0
- package/dist/mcp/diff-impact.js +385 -0
- package/dist/mcp/diff-impact.js.map +1 -0
- 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 +134 -22
- package/dist/mcp/liveness-watchdog.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +2 -0
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/tools.d.ts +21 -5
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +305 -55
- package/dist/mcp/tools.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +2 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +153 -53
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.d.ts.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.js +20 -9
- package/dist/resolution/frameworks/arkts-entry.js.map +1 -1
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +1 -1
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/memory-budget.d.ts +33 -0
- package/dist/resolution/memory-budget.d.ts.map +1 -1
- package/dist/resolution/memory-budget.js +58 -0
- package/dist/resolution/memory-budget.js.map +1 -1
- package/dist/resolution/resolver-pool.d.ts +2 -0
- package/dist/resolution/resolver-pool.d.ts.map +1 -1
- package/dist/resolution/resolver-pool.js +4 -0
- package/dist/resolution/resolver-pool.js.map +1 -1
- package/dist/ui/shimmer-progress.d.ts.map +1 -1
- package/dist/ui/shimmer-progress.js +4 -1
- package/dist/ui/shimmer-progress.js.map +1 -1
- package/package.json +4 -5
- 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/arkts-viewtree.d.ts +0 -24
- package/dist/extraction/languages/arkts-viewtree.d.ts.map +0 -1
- package/dist/extraction/languages/arkts-viewtree.js +0 -148
- package/dist/extraction/languages/arkts-viewtree.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/reasoning/config.d.ts +0 -45
- package/dist/reasoning/config.d.ts.map +0 -1
- package/dist/reasoning/config.js +0 -171
- package/dist/reasoning/config.js.map +0 -1
- package/dist/reasoning/credentials.d.ts +0 -5
- package/dist/reasoning/credentials.d.ts.map +0 -1
- package/dist/reasoning/credentials.js +0 -83
- package/dist/reasoning/credentials.js.map +0 -1
- package/dist/reasoning/login.d.ts +0 -21
- package/dist/reasoning/login.d.ts.map +0 -1
- package/dist/reasoning/login.js +0 -85
- package/dist/reasoning/login.js.map +0 -1
- package/dist/reasoning/reasoner.d.ts +0 -43
- package/dist/reasoning/reasoner.d.ts.map +0 -1
- package/dist/reasoning/reasoner.js +0 -308
- package/dist/reasoning/reasoner.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/evolve/llm-client.d.ts +0 -50
- package/dist/spec/evolve/llm-client.d.ts.map +0 -1
- package/dist/spec/evolve/llm-client.js +0 -176
- package/dist/spec/evolve/llm-client.js.map +0 -1
- package/dist/spec/evolve/logic-checker.d.ts +0 -12
- package/dist/spec/evolve/logic-checker.d.ts.map +0 -1
- package/dist/spec/evolve/logic-checker.js +0 -24
- package/dist/spec/evolve/logic-checker.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/llm/index.d.ts +0 -3
- package/dist/spec/llm/index.d.ts.map +0 -1
- package/dist/spec/llm/index.js +0 -11
- package/dist/spec/llm/index.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/mining/diff-parser.d.ts +0 -33
- package/dist/spec/mining/diff-parser.d.ts.map +0 -1
- package/dist/spec/mining/diff-parser.js +0 -166
- package/dist/spec/mining/diff-parser.js.map +0 -1
- package/dist/spec/mining/git-scanner.d.ts +0 -103
- package/dist/spec/mining/git-scanner.d.ts.map +0 -1
- package/dist/spec/mining/git-scanner.js +0 -307
- package/dist/spec/mining/git-scanner.js.map +0 -1
- package/dist/spec/mining/pipeline.d.ts +0 -53
- package/dist/spec/mining/pipeline.d.ts.map +0 -1
- package/dist/spec/mining/pipeline.js +0 -178
- package/dist/spec/mining/pipeline.js.map +0 -1
- package/dist/spec/mining/scope-resolver.d.ts +0 -45
- package/dist/spec/mining/scope-resolver.d.ts.map +0 -1
- package/dist/spec/mining/scope-resolver.js +0 -103
- package/dist/spec/mining/scope-resolver.js.map +0 -1
- package/dist/spec/mining/spec-extractor.d.ts +0 -69
- package/dist/spec/mining/spec-extractor.d.ts.map +0 -1
- package/dist/spec/mining/spec-extractor.js +0 -369
- package/dist/spec/mining/spec-extractor.js.map +0 -1
- package/dist/spec/utils.d.ts +0 -155
- package/dist/spec/utils.d.ts.map +0 -1
- package/dist/spec/utils.js +0 -411
- package/dist/spec/utils.js.map +0 -1
- package/scripts/add-lang/bench.sh +0 -60
- package/scripts/add-lang/check-grammar.mjs +0 -75
- package/scripts/add-lang/dump-ast.mjs +0 -103
- package/scripts/add-lang/verify-extraction.mjs +0 -70
- package/scripts/agent-eval/ab-adoption.sh +0 -91
- package/scripts/agent-eval/ab-hook.sh +0 -86
- package/scripts/agent-eval/ab-impl.sh +0 -78
- package/scripts/agent-eval/ab-new-vs-baseline.sh +0 -102
- package/scripts/agent-eval/ab-sufficiency.sh +0 -78
- package/scripts/agent-eval/arms-F.sh +0 -21
- package/scripts/agent-eval/arms-matrix.sh +0 -37
- package/scripts/agent-eval/audit.sh +0 -68
- package/scripts/agent-eval/bench-readme.sh +0 -28
- package/scripts/agent-eval/bench-why-repo.sh +0 -22
- package/scripts/agent-eval/block-read-hook.sh +0 -19
- package/scripts/agent-eval/hook-settings.json +0 -15
- package/scripts/agent-eval/itrun.sh +0 -120
- package/scripts/agent-eval/offload-eval-3arm.sh +0 -72
- package/scripts/agent-eval/offload-eval-cost.mjs +0 -133
- package/scripts/agent-eval/offload-eval-effort.mjs +0 -108
- package/scripts/agent-eval/offload-eval-frontload-matrix.sh +0 -25
- package/scripts/agent-eval/offload-eval-frontload.sh +0 -47
- package/scripts/agent-eval/offload-eval-ground-truth.json +0 -18
- package/scripts/agent-eval/offload-eval-hook.mjs +0 -84
- package/scripts/agent-eval/offload-eval-judge.mjs +0 -103
- package/scripts/agent-eval/offload-eval-matrix.sh +0 -20
- package/scripts/agent-eval/offload-eval-metrics.mjs +0 -94
- package/scripts/agent-eval/offload-eval-refs1.sh +0 -50
- package/scripts/agent-eval/offload-eval-setup.sh +0 -24
- package/scripts/agent-eval/offload-eval-styles.sh +0 -72
- package/scripts/agent-eval/offload-eval-summarize.mjs +0 -68
- package/scripts/agent-eval/offload-eval.md +0 -76
- package/scripts/agent-eval/parse-arms.mjs +0 -116
- package/scripts/agent-eval/parse-bench-readme.mjs +0 -84
- package/scripts/agent-eval/parse-run.mjs +0 -45
- package/scripts/agent-eval/parse-session.mjs +0 -93
- package/scripts/agent-eval/probe-context.mjs +0 -21
- package/scripts/agent-eval/probe-explore.mjs +0 -40
- package/scripts/agent-eval/probe-node.mjs +0 -20
- package/scripts/agent-eval/probe-sweep.mjs +0 -119
- package/scripts/agent-eval/probe-trace.mjs +0 -20
- package/scripts/agent-eval/redirect-read-hook.sh +0 -38
- package/scripts/agent-eval/repro-concurrent-explore.mjs +0 -119
- package/scripts/agent-eval/repro-daemon-clients.mjs +0 -125
- package/scripts/agent-eval/run-agent.sh +0 -34
- package/scripts/agent-eval/run-all.sh +0 -75
- package/scripts/agent-eval/run-arms.sh +0 -56
- package/scripts/agent-eval/seq-matrix.mjs +0 -137
- package/scripts/build-bundle.sh +0 -123
- package/scripts/exp_boundary_eval/README.md +0 -247
- package/scripts/exp_boundary_eval/_test_mcp_chain.py +0 -78
- package/scripts/exp_boundary_eval/_test_stdin.py +0 -8
- package/scripts/exp_boundary_eval/_utils.py +0 -1116
- package/scripts/exp_boundary_eval/analyze.py +0 -1313
- package/scripts/exp_boundary_eval/deveco_arm.py +0 -519
- package/scripts/exp_boundary_eval/run_all.py +0 -378
- package/scripts/exp_boundary_eval/run_one.py +0 -165
- package/scripts/exp_boundary_eval/run_session.py +0 -158
- package/scripts/exp_boundary_eval/setup.py +0 -120
- package/scripts/exp_boundary_eval/win_mcp_launcher.py +0 -73
- package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +0 -36
- package/scripts/exp_boundary_eval/win_node_launcher.py +0 -24
- package/scripts/extract-release-notes.mjs +0 -130
- package/scripts/local-install.sh +0 -41
- package/scripts/npm-sdk.js +0 -75
- package/scripts/npm-shim.js +0 -275
- package/scripts/ohos-sdk-publish.mjs +0 -133
- package/scripts/pack-npm.sh +0 -119
- package/scripts/prepare-release.mjs +0 -270
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Git commit history scanning and spec↔commit pairing.
|
|
4
|
-
*
|
|
5
|
-
* Replaces `commit4spec/reverse_engineer/git_scanner.py` and
|
|
6
|
-
* `commit4spec/reverse_engineer/git_utils.py`. Discovers spec↔commit pairs via
|
|
7
|
-
* conventional-commit scope extraction: extracts scopes from commit messages
|
|
8
|
-
* and resolves them to spec IDs on disk.
|
|
9
|
-
*
|
|
10
|
-
* All Git operations use `execFileSync` with an args array (never template
|
|
11
|
-
* strings) to avoid shell injection risks — matching the HomeGraph convention
|
|
12
|
-
* in `src/sync/git-hooks.ts` and `src/sync/worktree.ts`.
|
|
13
|
-
*
|
|
14
|
-
* @module spec/build/git-scanner
|
|
15
|
-
*/
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.isGitRepo = isGitRepo;
|
|
18
|
-
exports.getAllCommits = getAllCommits;
|
|
19
|
-
exports.getCommitInfo = getCommitInfo;
|
|
20
|
-
exports.getCommitDiff = getCommitDiff;
|
|
21
|
-
exports.getCommitRange = getCommitRange;
|
|
22
|
-
exports.scan = scan;
|
|
23
|
-
const child_process_1 = require("child_process");
|
|
24
|
-
const scope_resolver_1 = require("./scope-resolver");
|
|
25
|
-
const spec_extractor_1 = require("./spec-extractor");
|
|
26
|
-
const errors_1 = require("../../errors");
|
|
27
|
-
const git_utils_1 = require("../git-utils");
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
|
-
// Helpers
|
|
30
|
-
// ---------------------------------------------------------------------------
|
|
31
|
-
/**
|
|
32
|
-
* Convert an ISO-8601 string to Unix epoch milliseconds.
|
|
33
|
-
* Returns 0 for invalid or unparseable strings.
|
|
34
|
-
*/
|
|
35
|
-
function parseISOTimestamp(isoString) {
|
|
36
|
-
const ts = new Date(isoString).getTime();
|
|
37
|
-
return isNaN(ts) ? 0 : ts;
|
|
38
|
-
}
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
// isGitRepo
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
/**
|
|
43
|
-
* Check whether `repoPath` is a git repository.
|
|
44
|
-
*
|
|
45
|
-
* Runs `git rev-parse --git-dir` and returns `true` on success, `false`
|
|
46
|
-
* when the command fails (not a repo, git not installed, etc.).
|
|
47
|
-
*/
|
|
48
|
-
function isGitRepo(repoPath) {
|
|
49
|
-
try {
|
|
50
|
-
(0, child_process_1.execFileSync)('git', ['rev-parse', '--git-dir'], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
// ---------------------------------------------------------------------------
|
|
58
|
-
// getAllCommits
|
|
59
|
-
// ---------------------------------------------------------------------------
|
|
60
|
-
/**
|
|
61
|
-
* Return every commit in `repoPath` as `CommitInfo` objects.
|
|
62
|
-
*
|
|
63
|
-
* Runs `git log --format='%H%n%aI%n%an%n%s%n---END---'` and parses the
|
|
64
|
-
* output one five-line block per commit. Commits are returned in reverse
|
|
65
|
-
* chronological order (most recent first), matching Git's default.
|
|
66
|
-
*
|
|
67
|
-
* An empty repo yields an empty array.
|
|
68
|
-
*/
|
|
69
|
-
function getAllCommits(repoPath) {
|
|
70
|
-
let stdout;
|
|
71
|
-
try {
|
|
72
|
-
stdout = (0, child_process_1.execFileSync)('git', ['log', "--format=%H%x00%aI%x00%an%x00%s%x00"], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
const parts = stdout.replace(/\0+$/, '').trim().split('\0');
|
|
78
|
-
const commits = [];
|
|
79
|
-
// Each commit occupies 4 NUL-separated fields: hash, timestamp, author, message
|
|
80
|
-
for (let i = 0; i + 3 < parts.length; i += 4) {
|
|
81
|
-
const hash = parts[i].trim();
|
|
82
|
-
const isoString = parts[i + 1].trim();
|
|
83
|
-
const author = parts[i + 2].trim();
|
|
84
|
-
const message = parts[i + 3].trim();
|
|
85
|
-
if (!hash)
|
|
86
|
-
continue;
|
|
87
|
-
commits.push({
|
|
88
|
-
hash,
|
|
89
|
-
message,
|
|
90
|
-
author,
|
|
91
|
-
timestamp: parseISOTimestamp(isoString),
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
return commits;
|
|
95
|
-
}
|
|
96
|
-
// ---------------------------------------------------------------------------
|
|
97
|
-
// getCommitInfo
|
|
98
|
-
// ---------------------------------------------------------------------------
|
|
99
|
-
/**
|
|
100
|
-
* Retrieve metadata for a single commit.
|
|
101
|
-
*
|
|
102
|
-
* Runs `git show -s --format='%H%n%aI%n%an%n%s' <commitHash>`. Returns
|
|
103
|
-
* `null` when the command fails (hash not found, invalid repo, etc.).
|
|
104
|
-
*/
|
|
105
|
-
function getCommitInfo(repoPath, commitHash) {
|
|
106
|
-
let stdout;
|
|
107
|
-
try {
|
|
108
|
-
stdout = (0, child_process_1.execFileSync)('git', ['show', '-s', "--format=%H%n%aI%n%an%n%s", commitHash], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
const lines = stdout.trim().split('\n');
|
|
114
|
-
if (lines.length < 4)
|
|
115
|
-
return null;
|
|
116
|
-
const hash = lines[0].trim();
|
|
117
|
-
const isoString = lines[1].trim();
|
|
118
|
-
const author = lines[2].trim();
|
|
119
|
-
const message = lines[3].trim();
|
|
120
|
-
if (!hash)
|
|
121
|
-
return null;
|
|
122
|
-
return {
|
|
123
|
-
hash,
|
|
124
|
-
message,
|
|
125
|
-
author,
|
|
126
|
-
timestamp: parseISOTimestamp(isoString),
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
// ---------------------------------------------------------------------------
|
|
130
|
-
// getCommitDiff
|
|
131
|
-
// ---------------------------------------------------------------------------
|
|
132
|
-
/**
|
|
133
|
-
* Return the full unified diff introduced by `commitHash`.
|
|
134
|
-
*
|
|
135
|
-
* Strategy:
|
|
136
|
-
* 1. Query the parent hash(es) via `git log --pretty=%P -n 1 <commitHash>`.
|
|
137
|
-
* 2. If a parent exists, diff it against the commit: `git diff <parent> <commitHash>`.
|
|
138
|
-
* 3. For an initial (root) commit with no parent, use `git diff <commitHash>`
|
|
139
|
-
* which shows all files added in that commit.
|
|
140
|
-
*
|
|
141
|
-
* Returns an empty string when any Git command fails.
|
|
142
|
-
*/
|
|
143
|
-
function getCommitDiff(repoPath, commitHash) {
|
|
144
|
-
// Step 1 — get parent hashes.
|
|
145
|
-
let parentStdout;
|
|
146
|
-
try {
|
|
147
|
-
parentStdout = (0, child_process_1.execFileSync)('git', ['log', '--pretty=%P', '-n', '1', commitHash], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
return '';
|
|
151
|
-
}
|
|
152
|
-
const parents = parentStdout.trim().split(/\s+/).filter(Boolean);
|
|
153
|
-
// Step 2 & 3 — run the appropriate diff.
|
|
154
|
-
try {
|
|
155
|
-
if (parents.length > 0) {
|
|
156
|
-
const diffs = [];
|
|
157
|
-
for (const parent of parents) {
|
|
158
|
-
try {
|
|
159
|
-
diffs.push((0, child_process_1.execFileSync)('git', ['diff', parent, commitHash], (0, git_utils_1.gitExecOptions)(repoPath)));
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
// Skip diffs that fail for an individual parent
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return diffs.join('\n');
|
|
166
|
-
}
|
|
167
|
-
// Initial commit — no parent.
|
|
168
|
-
return (0, child_process_1.execFileSync)('git', ['diff', commitHash], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
169
|
-
}
|
|
170
|
-
catch {
|
|
171
|
-
return '';
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// ---------------------------------------------------------------------------
|
|
175
|
-
// getCommitRange
|
|
176
|
-
// ---------------------------------------------------------------------------
|
|
177
|
-
/**
|
|
178
|
-
* Return every commit between `fromHash` (exclusive) and `toHash`
|
|
179
|
-
* (inclusive) in chronological order (oldest first).
|
|
180
|
-
*
|
|
181
|
-
* Runs `git log --reverse --format="..." fromHash..toHash`. Returns an empty
|
|
182
|
-
* array when either hash is not found or the range is empty.
|
|
183
|
-
*
|
|
184
|
-
* Callers should validate that `fromHash` is an ancestor of `toHash` before
|
|
185
|
-
* calling this function (use `git merge-base --is-ancestor`). Results are
|
|
186
|
-
* undefined when the two hashes are on unrelated branches.
|
|
187
|
-
*/
|
|
188
|
-
function getCommitRange(repoPath, fromHash, toHash) {
|
|
189
|
-
let stdout;
|
|
190
|
-
try {
|
|
191
|
-
stdout = (0, child_process_1.execFileSync)('git', ['log', '--no-merges', '--reverse', `--format=%H%x00%aI%x00%an%x00%s%x00`, `${fromHash}..${toHash}`], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
return [];
|
|
195
|
-
}
|
|
196
|
-
const parts = stdout.replace(/\0+$/, '').trim().split('\0');
|
|
197
|
-
const commits = [];
|
|
198
|
-
// Each commit occupies 4 NUL-separated fields: hash, timestamp, author, message
|
|
199
|
-
for (let i = 0; i + 3 < parts.length; i += 4) {
|
|
200
|
-
const hash = parts[i].trim();
|
|
201
|
-
const isoString = parts[i + 1].trim();
|
|
202
|
-
const author = parts[i + 2].trim();
|
|
203
|
-
const message = parts[i + 3].trim();
|
|
204
|
-
if (!hash)
|
|
205
|
-
continue;
|
|
206
|
-
commits.push({
|
|
207
|
-
hash,
|
|
208
|
-
message,
|
|
209
|
-
author,
|
|
210
|
-
timestamp: parseISOTimestamp(isoString),
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
return commits;
|
|
214
|
-
}
|
|
215
|
-
// ---------------------------------------------------------------------------
|
|
216
|
-
// scan
|
|
217
|
-
// ---------------------------------------------------------------------------
|
|
218
|
-
/**
|
|
219
|
-
* Main scanning function — discovers spec↔commit pairs from commit history.
|
|
220
|
-
*
|
|
221
|
-
* Iterates every commit in the repo, extracts a conventional-commit scope from
|
|
222
|
-
* its message, normalizes it, and checks whether the resulting spec ID exists
|
|
223
|
-
* on disk. When a match is found the pair is recorded with full spec and
|
|
224
|
-
* commit metadata.
|
|
225
|
-
*
|
|
226
|
-
* Duplicates (identical specId + commitHash) are de-duplicated via a
|
|
227
|
-
* `Map` keyed on `"${specId}|${commitHash}"`.
|
|
228
|
-
*/
|
|
229
|
-
function scan(repoPath, specStoragePath, config) {
|
|
230
|
-
const pairs = new Map();
|
|
231
|
-
const commits = getAllCommits(repoPath);
|
|
232
|
-
for (const commit of commits) {
|
|
233
|
-
const specId = (0, scope_resolver_1.resolveScopeToSpec)(commit.message, specStoragePath, config);
|
|
234
|
-
if (!specId) {
|
|
235
|
-
(0, errors_1.logDebug)('scan: no scope match', {
|
|
236
|
-
commitHash: commit.hash.slice(0, 7),
|
|
237
|
-
message: commit.message,
|
|
238
|
-
});
|
|
239
|
-
continue;
|
|
240
|
-
}
|
|
241
|
-
const specMetadata = (0, spec_extractor_1.extractSpecMetadata)(specStoragePath, specId, config);
|
|
242
|
-
const key = `${specId}|${commit.hash}`;
|
|
243
|
-
if (!pairs.has(key)) {
|
|
244
|
-
pairs.set(key, {
|
|
245
|
-
specId,
|
|
246
|
-
commitHash: commit.hash,
|
|
247
|
-
specMetadata,
|
|
248
|
-
commitMetadata: commit,
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return Array.from(pairs.values());
|
|
253
|
-
}
|
|
254
|
-
//# sourceMappingURL=git-scanner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-scanner.js","sourceRoot":"","sources":["../../../src/spec/build/git-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { LLMConfig } from '../config';
|
|
2
|
-
export interface ChatResult {
|
|
3
|
-
content: string;
|
|
4
|
-
json: Record<string, unknown> | null;
|
|
5
|
-
}
|
|
6
|
-
export declare class LLMClient {
|
|
7
|
-
private config;
|
|
8
|
-
private mockResponses;
|
|
9
|
-
constructor(config: LLMConfig);
|
|
10
|
-
/**
|
|
11
|
-
* Append a mock response to the FIFO queue.
|
|
12
|
-
*
|
|
13
|
-
* When provider is `"mock"`, `chat()` dequeues the first response.
|
|
14
|
-
* Responses are consumed in insertion order; each call to `chat()` removes
|
|
15
|
-
* and returns the front element.
|
|
16
|
-
*/
|
|
17
|
-
setMockResponse(_key: string, response: string): void;
|
|
18
|
-
/**
|
|
19
|
-
* Clear all mock responses.
|
|
20
|
-
*/
|
|
21
|
-
clearMockResponses(): void;
|
|
22
|
-
/**
|
|
23
|
-
* Send a chat completion request and return the message content string.
|
|
24
|
-
*
|
|
25
|
-
* **Mock mode** (`provider === "mock"`):
|
|
26
|
-
* 1. If mockResponses has entries, consumes the first one (FIFO).
|
|
27
|
-
* 2. Otherwise matches `userPrompt` against known patterns (case-insensitive):
|
|
28
|
-
* - `"logic change"` or `"logic_change"` → no-op JSON.
|
|
29
|
-
* - `"spec evolution"` or `"evolve"` → UNCHANGED JSON.
|
|
30
|
-
* - Default → UNCHANGED JSON.
|
|
31
|
-
*
|
|
32
|
-
* **OpenAI / Anthropic mode**:
|
|
33
|
-
* Calls the OpenAI-compatible chat completions API and returns
|
|
34
|
-
* `choices[0].message.content`. On any error, returns an empty string.
|
|
35
|
-
*/
|
|
36
|
-
chat(systemPrompt: string, userPrompt: string): Promise<string>;
|
|
37
|
-
/**
|
|
38
|
-
* Same as `chat()`, but parses the response as JSON.
|
|
39
|
-
*
|
|
40
|
-
* Parsing strategy (tried in order):
|
|
41
|
-
* 1. Direct `JSON.parse(content)`.
|
|
42
|
-
* 2. Extract from `` ```json ... ``` `` fenced block.
|
|
43
|
-
* 3. Extract from `` ``` ... ``` `` fenced block.
|
|
44
|
-
* 4. Fallback: log a debug warning and return `{}`.
|
|
45
|
-
*
|
|
46
|
-
* Empty or null content from `chat()` also returns `{}`.
|
|
47
|
-
*/
|
|
48
|
-
chatJson(systemPrompt: string, userPrompt: string): Promise<Record<string, unknown>>;
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=llm-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../../src/spec/evolve/llm-client.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOtC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtC;AAMD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,aAAa,CAAW;gBAEpB,MAAM,EAAE,SAAS;IAK7B;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAQ1B;;;;;;;;;;;;;OAaG;IACG,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+DrE;;;;;;;;;;OAUG;IACG,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CA+CpC"}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.LLMClient = void 0;
|
|
7
|
-
/**
|
|
8
|
-
* Provider-agnostic LLM client for spec self-evolution.
|
|
9
|
-
*
|
|
10
|
-
* Replaces `commit4spec/utils/llm_client.py`. Supports OpenAI-compatible chat
|
|
11
|
-
* completions API with mock mode for testing. Mock responses are consumed
|
|
12
|
-
* FIFO: each `setMockResponse` call adds one response, each `chat` call
|
|
13
|
-
* consumes one. When the mock queue is empty, pattern-based fallback responses
|
|
14
|
-
* are returned.
|
|
15
|
-
*
|
|
16
|
-
* @module spec/evolve/llm-client
|
|
17
|
-
*/
|
|
18
|
-
const openai_1 = __importDefault(require("openai"));
|
|
19
|
-
const errors_1 = require("../../errors");
|
|
20
|
-
// =============================================================================
|
|
21
|
-
// LLMClient
|
|
22
|
-
// =============================================================================
|
|
23
|
-
class LLMClient {
|
|
24
|
-
config;
|
|
25
|
-
mockResponses;
|
|
26
|
-
constructor(config) {
|
|
27
|
-
this.config = config;
|
|
28
|
-
this.mockResponses = [];
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Append a mock response to the FIFO queue.
|
|
32
|
-
*
|
|
33
|
-
* When provider is `"mock"`, `chat()` dequeues the first response.
|
|
34
|
-
* Responses are consumed in insertion order; each call to `chat()` removes
|
|
35
|
-
* and returns the front element.
|
|
36
|
-
*/
|
|
37
|
-
setMockResponse(_key, response) {
|
|
38
|
-
this.mockResponses.push(response);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Clear all mock responses.
|
|
42
|
-
*/
|
|
43
|
-
clearMockResponses() {
|
|
44
|
-
this.mockResponses = [];
|
|
45
|
-
}
|
|
46
|
-
// ===========================================================================
|
|
47
|
-
// chat
|
|
48
|
-
// ===========================================================================
|
|
49
|
-
/**
|
|
50
|
-
* Send a chat completion request and return the message content string.
|
|
51
|
-
*
|
|
52
|
-
* **Mock mode** (`provider === "mock"`):
|
|
53
|
-
* 1. If mockResponses has entries, consumes the first one (FIFO).
|
|
54
|
-
* 2. Otherwise matches `userPrompt` against known patterns (case-insensitive):
|
|
55
|
-
* - `"logic change"` or `"logic_change"` → no-op JSON.
|
|
56
|
-
* - `"spec evolution"` or `"evolve"` → UNCHANGED JSON.
|
|
57
|
-
* - Default → UNCHANGED JSON.
|
|
58
|
-
*
|
|
59
|
-
* **OpenAI / Anthropic mode**:
|
|
60
|
-
* Calls the OpenAI-compatible chat completions API and returns
|
|
61
|
-
* `choices[0].message.content`. On any error, returns an empty string.
|
|
62
|
-
*/
|
|
63
|
-
async chat(systemPrompt, userPrompt) {
|
|
64
|
-
// --- Mock mode -------------------------------------------------------
|
|
65
|
-
if (this.config.provider === 'mock') {
|
|
66
|
-
if (this.mockResponses.length > 0) {
|
|
67
|
-
return this.mockResponses.shift();
|
|
68
|
-
}
|
|
69
|
-
const lower = userPrompt.toLowerCase();
|
|
70
|
-
if (lower.includes('logic change') || lower.includes('logic_change')) {
|
|
71
|
-
return JSON.stringify({
|
|
72
|
-
is_logic_change: false,
|
|
73
|
-
reason: 'Mock: no logic change detected',
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
if (lower.includes('spec evolution') || lower.includes('evolve')) {
|
|
77
|
-
return JSON.stringify({
|
|
78
|
-
action: 'UNCHANGED',
|
|
79
|
-
reason: 'Mock: no changes needed',
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
return JSON.stringify({
|
|
83
|
-
action: 'UNCHANGED',
|
|
84
|
-
reason: 'Mock: default no-op response',
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
// --- OpenAI / Anthropic mode -----------------------------------------
|
|
88
|
-
const baseURL = this.config.baseUrl
|
|
89
|
-
? this.config.baseUrl
|
|
90
|
-
: this.config.provider === 'anthropic'
|
|
91
|
-
? 'https://api.anthropic.com/v1'
|
|
92
|
-
: undefined;
|
|
93
|
-
const client = new openai_1.default({
|
|
94
|
-
apiKey: this.config.apiKey || 'sk-placeholder',
|
|
95
|
-
baseURL,
|
|
96
|
-
});
|
|
97
|
-
try {
|
|
98
|
-
const completion = await client.chat.completions.create({
|
|
99
|
-
model: this.config.model,
|
|
100
|
-
temperature: this.config.temperature,
|
|
101
|
-
max_tokens: this.config.maxTokens,
|
|
102
|
-
messages: [
|
|
103
|
-
{ role: 'system', content: systemPrompt },
|
|
104
|
-
{ role: 'user', content: userPrompt },
|
|
105
|
-
],
|
|
106
|
-
});
|
|
107
|
-
const content = completion.choices[0]?.message?.content;
|
|
108
|
-
return content ?? '';
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return '';
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// ===========================================================================
|
|
115
|
-
// chatJson
|
|
116
|
-
// ===========================================================================
|
|
117
|
-
/**
|
|
118
|
-
* Same as `chat()`, but parses the response as JSON.
|
|
119
|
-
*
|
|
120
|
-
* Parsing strategy (tried in order):
|
|
121
|
-
* 1. Direct `JSON.parse(content)`.
|
|
122
|
-
* 2. Extract from `` ```json ... ``` `` fenced block.
|
|
123
|
-
* 3. Extract from `` ``` ... ``` `` fenced block.
|
|
124
|
-
* 4. Fallback: log a debug warning and return `{}`.
|
|
125
|
-
*
|
|
126
|
-
* Empty or null content from `chat()` also returns `{}`.
|
|
127
|
-
*/
|
|
128
|
-
async chatJson(systemPrompt, userPrompt) {
|
|
129
|
-
const raw = await this.chat(systemPrompt, userPrompt);
|
|
130
|
-
if (!raw)
|
|
131
|
-
return {};
|
|
132
|
-
// 1. Direct parse
|
|
133
|
-
try {
|
|
134
|
-
const parsed = JSON.parse(raw);
|
|
135
|
-
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
136
|
-
return parsed;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
// Fall through to fence extraction
|
|
141
|
-
}
|
|
142
|
-
// 2. ```json ... ``` fence
|
|
143
|
-
const jsonFenceMatch = /```json\s*([\s\S]*?)```/.exec(raw);
|
|
144
|
-
if (jsonFenceMatch) {
|
|
145
|
-
try {
|
|
146
|
-
const parsed = JSON.parse(jsonFenceMatch[1].trim());
|
|
147
|
-
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
148
|
-
return parsed;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
// Fall through
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
// 3. ``` ... ``` fence
|
|
156
|
-
const fenceMatch = /```\s*([\s\S]*?)```/.exec(raw);
|
|
157
|
-
if (fenceMatch) {
|
|
158
|
-
try {
|
|
159
|
-
const parsed = JSON.parse(fenceMatch[1].trim());
|
|
160
|
-
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
161
|
-
return parsed;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
// Fall through
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
// 4. Fallback
|
|
169
|
-
(0, errors_1.logDebug)('chatJson: could not parse response as JSON', {
|
|
170
|
-
raw: raw.length > 200 ? raw.slice(0, 200) + '…' : raw,
|
|
171
|
-
});
|
|
172
|
-
return {};
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
exports.LLMClient = LLMClient;
|
|
176
|
-
//# sourceMappingURL=llm-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../../src/spec/evolve/llm-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { LlmClient } from '../llm/client';
|
|
2
|
-
export interface LogicCheckResult {
|
|
3
|
-
isLogic: boolean;
|
|
4
|
-
reason: string;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Determine if a commit represents a business-logic change.
|
|
8
|
-
* Uses LLM to analyze the commit message and diff.
|
|
9
|
-
* If no LLM client is available, returns false.
|
|
10
|
-
*/
|
|
11
|
-
export declare function isLogicChange(commitMessage: string, commitDiff: string, client?: LlmClient): Promise<LogicCheckResult>;
|
|
12
|
-
//# sourceMappingURL=logic-checker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logic-checker.d.ts","sourceRoot":"","sources":["../../../src/spec/evolve/logic-checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAgB3B"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isLogicChange = isLogicChange;
|
|
4
|
-
const prompts_1 = require("../llm/prompts");
|
|
5
|
-
const utils_1 = require("../utils");
|
|
6
|
-
/**
|
|
7
|
-
* Determine if a commit represents a business-logic change.
|
|
8
|
-
* Uses LLM to analyze the commit message and diff.
|
|
9
|
-
* If no LLM client is available, returns false.
|
|
10
|
-
*/
|
|
11
|
-
async function isLogicChange(commitMessage, commitDiff, client) {
|
|
12
|
-
if (!client) {
|
|
13
|
-
return { isLogic: false, reason: 'LLM unavailable' };
|
|
14
|
-
}
|
|
15
|
-
// Truncate diff to 6000 chars for prompt budget
|
|
16
|
-
const truncatedDiff = (0, utils_1.truncateText)(commitDiff, 6000);
|
|
17
|
-
const userPrompt = (0, prompts_1.buildLogicCheckUserPrompt)(commitMessage, truncatedDiff);
|
|
18
|
-
const result = await client.chatJson(prompts_1.LOGIC_CHECK_SYSTEM_PROMPT, userPrompt);
|
|
19
|
-
return {
|
|
20
|
-
isLogic: result.is_logic_change === true,
|
|
21
|
-
reason: typeof result.reason === 'string' ? result.reason : '',
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=logic-checker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logic-checker.js","sourceRoot":"","sources":["../../../src/spec/evolve/logic-checker.ts"],"names":[],"mappings":";;AAcA,sCAoBC;AAjCD,4CAAsF;AACtF,oCAAwC;AAOxC;;;;GAIG;AACI,KAAK,UAAU,aAAa,CACjC,aAAqB,EACrB,UAAkB,EAClB,MAAkB;IAElB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACvD,CAAC;IAED,gDAAgD;IAChD,MAAM,aAAa,GAAG,IAAA,oBAAY,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,UAAU,GAAG,IAAA,mCAAyB,EAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,mCAAyB,EAAE,UAAU,CAAC,CAAC;IAE5E,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,eAAe,KAAK,IAAI;QACxC,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;KAC/D,CAAC;AACJ,CAAC"}
|
package/dist/spec/git-utils.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/** Shared options for all `execFileSync` Git calls across the spec module. */
|
|
2
|
-
export declare function gitExecOptions(repoPath: string): {
|
|
3
|
-
cwd: string;
|
|
4
|
-
encoding: "utf8";
|
|
5
|
-
stdio: (number | import("stream") | import("child_process").IOType | "ipc" | null | undefined)[];
|
|
6
|
-
windowsHide: boolean;
|
|
7
|
-
};
|
|
8
|
-
//# sourceMappingURL=git-utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/spec/git-utils.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM;;;;;EAQ9C"}
|
package/dist/spec/git-utils.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.gitExecOptions = gitExecOptions;
|
|
4
|
-
/** Shared options for all `execFileSync` Git calls across the spec module. */
|
|
5
|
-
function gitExecOptions(repoPath) {
|
|
6
|
-
const stdio = ['ignore', 'pipe', 'ignore'];
|
|
7
|
-
return {
|
|
8
|
-
cwd: repoPath,
|
|
9
|
-
encoding: 'utf8',
|
|
10
|
-
stdio,
|
|
11
|
-
windowsHide: true,
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=git-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/spec/git-utils.ts"],"names":[],"mappings":";;AAGA,wCAQC;AATD,8EAA8E;AAC9E,SAAgB,cAAc,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzD,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,MAAe;QACzB,KAAK;QACL,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
|
package/dist/spec/llm/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spec/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,WAAW,CAAC"}
|
package/dist/spec/llm/index.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildSpecEvaluationUserPrompt = exports.SPEC_EVALUATION_SYSTEM_PROMPT = exports.buildLogicCheckUserPrompt = exports.LOGIC_CHECK_SYSTEM_PROMPT = exports.OpenAiLlmClient = void 0;
|
|
4
|
-
var client_1 = require("./client");
|
|
5
|
-
Object.defineProperty(exports, "OpenAiLlmClient", { enumerable: true, get: function () { return client_1.OpenAiLlmClient; } });
|
|
6
|
-
var prompts_1 = require("./prompts");
|
|
7
|
-
Object.defineProperty(exports, "LOGIC_CHECK_SYSTEM_PROMPT", { enumerable: true, get: function () { return prompts_1.LOGIC_CHECK_SYSTEM_PROMPT; } });
|
|
8
|
-
Object.defineProperty(exports, "buildLogicCheckUserPrompt", { enumerable: true, get: function () { return prompts_1.buildLogicCheckUserPrompt; } });
|
|
9
|
-
Object.defineProperty(exports, "SPEC_EVALUATION_SYSTEM_PROMPT", { enumerable: true, get: function () { return prompts_1.SPEC_EVALUATION_SYSTEM_PROMPT; } });
|
|
10
|
-
Object.defineProperty(exports, "buildSpecEvaluationUserPrompt", { enumerable: true, get: function () { return prompts_1.buildSpecEvaluationUserPrompt; } });
|
|
11
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/spec/llm/index.ts"],"names":[],"mappings":";;;AAAA,mCAAsD;AAAlC,yGAAA,eAAe,OAAA;AACnC,qCAKmB;AAJjB,oHAAA,yBAAyB,OAAA;AACzB,oHAAA,yBAAyB,OAAA;AACzB,wHAAA,6BAA6B,OAAA;AAC7B,wHAAA,6BAA6B,OAAA"}
|