@dev-guard/cli 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/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/agent-strategies.d.ts +23 -0
- package/dist/agent-strategies.js +130 -0
- package/dist/agent-strategies.js.map +1 -0
- package/dist/ai-context.d.ts +10 -0
- package/dist/ai-context.js +143 -0
- package/dist/ai-context.js.map +1 -0
- package/dist/check.d.ts +6 -0
- package/dist/check.js +89 -0
- package/dist/check.js.map +1 -0
- package/dist/clipboard.d.ts +6 -0
- package/dist/clipboard.js +43 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/codex-notify.d.ts +23 -0
- package/dist/codex-notify.js +146 -0
- package/dist/codex-notify.js.map +1 -0
- package/dist/command-targets.d.ts +10 -0
- package/dist/command-targets.js +124 -0
- package/dist/command-targets.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.js +180 -0
- package/dist/config.js.map +1 -0
- package/dist/configure.d.ts +1 -0
- package/dist/configure.js +79 -0
- package/dist/configure.js.map +1 -0
- package/dist/doctor.d.ts +1 -0
- package/dist/doctor.js +326 -0
- package/dist/doctor.js.map +1 -0
- package/dist/drift-telemetry.d.ts +13 -0
- package/dist/drift-telemetry.js +64 -0
- package/dist/drift-telemetry.js.map +1 -0
- package/dist/effective-task.d.ts +44 -0
- package/dist/effective-task.js +355 -0
- package/dist/effective-task.js.map +1 -0
- package/dist/fs.d.ts +10 -0
- package/dist/fs.js +58 -0
- package/dist/fs.js.map +1 -0
- package/dist/git.d.ts +24 -0
- package/dist/git.js +235 -0
- package/dist/git.js.map +1 -0
- package/dist/hooks.d.ts +39 -0
- package/dist/hooks.js +513 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +555 -0
- package/dist/index.js.map +1 -0
- package/dist/infer-task.d.ts +1 -0
- package/dist/infer-task.js +120 -0
- package/dist/infer-task.js.map +1 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +50 -0
- package/dist/init.js.map +1 -0
- package/dist/install-agent-instructions.d.ts +1 -0
- package/dist/install-agent-instructions.js +113 -0
- package/dist/install-agent-instructions.js.map +1 -0
- package/dist/migration.d.ts +8 -0
- package/dist/migration.js +43 -0
- package/dist/migration.js.map +1 -0
- package/dist/paths.d.ts +38 -0
- package/dist/paths.js +41 -0
- package/dist/paths.js.map +1 -0
- package/dist/project-detection.d.ts +10 -0
- package/dist/project-detection.js +144 -0
- package/dist/project-detection.js.map +1 -0
- package/dist/project-identity.d.ts +7 -0
- package/dist/project-identity.js +93 -0
- package/dist/project-identity.js.map +1 -0
- package/dist/project-memory.d.ts +4 -0
- package/dist/project-memory.js +32 -0
- package/dist/project-memory.js.map +1 -0
- package/dist/prompt.d.ts +13 -0
- package/dist/prompt.js +125 -0
- package/dist/prompt.js.map +1 -0
- package/dist/refresh.d.ts +15 -0
- package/dist/refresh.js +146 -0
- package/dist/refresh.js.map +1 -0
- package/dist/report.d.ts +1 -0
- package/dist/report.js +109 -0
- package/dist/report.js.map +1 -0
- package/dist/review.d.ts +2 -0
- package/dist/review.js +653 -0
- package/dist/review.js.map +1 -0
- package/dist/rule-filter.d.ts +8 -0
- package/dist/rule-filter.js +79 -0
- package/dist/rule-filter.js.map +1 -0
- package/dist/runs.d.ts +21 -0
- package/dist/runs.js +142 -0
- package/dist/runs.js.map +1 -0
- package/dist/runtime-state.d.ts +69 -0
- package/dist/runtime-state.js +1383 -0
- package/dist/runtime-state.js.map +1 -0
- package/dist/scan.d.ts +1 -0
- package/dist/scan.js +55 -0
- package/dist/scan.js.map +1 -0
- package/dist/self.d.ts +3 -0
- package/dist/self.js +235 -0
- package/dist/self.js.map +1 -0
- package/dist/task-ai.d.ts +1 -0
- package/dist/task-ai.js +643 -0
- package/dist/task-ai.js.map +1 -0
- package/dist/telemetry.d.ts +1 -0
- package/dist/telemetry.js +11 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/update.d.ts +6 -0
- package/dist/update.js +154 -0
- package/dist/update.js.map +1 -0
- package/dist/watch.d.ts +1 -0
- package/dist/watch.js +303 -0
- package/dist/watch.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { filterDevGuardContextFiles, filterDiffTextForFiles, formatInferredDiffIntentClusters, inferDiffIntentClusters, inferredIntentToRequirement, isAlwaysIgnoredContextPath, scoreTaskAnchorFreshness } from "@dev-guard/core";
|
|
2
|
+
import { sameProjectIdentity } from "./project-identity.js";
|
|
3
|
+
import { listRunLogs, readLatestRun, readRunById } from "./runs.js";
|
|
4
|
+
const runUseThreshold = 30;
|
|
5
|
+
export async function resolveEffectiveTaskContext(input) {
|
|
6
|
+
const options = input.options ?? {};
|
|
7
|
+
const rawChangeFiles = input.reviewChangeFiles ?? input.gitChanges.changeFiles;
|
|
8
|
+
const changeFiles = filterDevGuardContextFiles(rawChangeFiles, false);
|
|
9
|
+
const changedFileSet = new Set(changeFiles.map((file) => file.path));
|
|
10
|
+
const changedFiles = (input.changedFiles ?? [...changedFileSet])
|
|
11
|
+
.filter((file) => changedFileSet.has(file) && !isAlwaysIgnoredContextPath(file))
|
|
12
|
+
.sort();
|
|
13
|
+
const diffText = filterDiffTextForFiles(input.gitChanges.diffText, changedFiles);
|
|
14
|
+
const freshness = scoreTaskAnchorFreshness({
|
|
15
|
+
taskMarkdown: input.taskMarkdown,
|
|
16
|
+
diffText,
|
|
17
|
+
changedFiles,
|
|
18
|
+
changeFiles
|
|
19
|
+
});
|
|
20
|
+
const diffOnlyInferredTask = inferDiffIntentClusters({
|
|
21
|
+
changedFiles,
|
|
22
|
+
changeFiles,
|
|
23
|
+
diffText,
|
|
24
|
+
codeGraph: input.codeGraph ?? []
|
|
25
|
+
});
|
|
26
|
+
const runSelection = await selectEffectiveRun({
|
|
27
|
+
root: input.root,
|
|
28
|
+
options,
|
|
29
|
+
changedFiles,
|
|
30
|
+
taskMarkdown: input.taskMarkdown,
|
|
31
|
+
currentIdentity: input.currentIdentity
|
|
32
|
+
});
|
|
33
|
+
const runMatchScore = runSelection.score ?? 0;
|
|
34
|
+
const anchorStatus = mapAnchorStatus(freshness.mode);
|
|
35
|
+
const forced = Boolean(options.forceTask);
|
|
36
|
+
const fromDiff = Boolean(options.fromDiff);
|
|
37
|
+
let mode;
|
|
38
|
+
let useTaskMarkdown;
|
|
39
|
+
let useRun = false;
|
|
40
|
+
let reason;
|
|
41
|
+
if (fromDiff) {
|
|
42
|
+
mode = "diff-first";
|
|
43
|
+
useTaskMarkdown = false;
|
|
44
|
+
reason = "forced from current diff";
|
|
45
|
+
}
|
|
46
|
+
else if (forced) {
|
|
47
|
+
mode = freshness.mode === "use_task" ? "task-first" : "task-first_caution";
|
|
48
|
+
useTaskMarkdown = true;
|
|
49
|
+
useRun = Boolean(runSelection.run);
|
|
50
|
+
reason = "--task forced";
|
|
51
|
+
}
|
|
52
|
+
else if (freshness.mode === "anchor_absent") {
|
|
53
|
+
mode = "diff-first";
|
|
54
|
+
useTaskMarkdown = false;
|
|
55
|
+
reason = "task.md absent";
|
|
56
|
+
}
|
|
57
|
+
else if (freshness.mode === "stale") {
|
|
58
|
+
mode = "diff-first";
|
|
59
|
+
useTaskMarkdown = false;
|
|
60
|
+
reason = `task.md stale (match score ${freshness.matchScore})`;
|
|
61
|
+
}
|
|
62
|
+
else if (freshness.mode === "uncertain") {
|
|
63
|
+
if (runMatchScore < runUseThreshold) {
|
|
64
|
+
mode = "diff-first_uncertain";
|
|
65
|
+
useTaskMarkdown = false;
|
|
66
|
+
reason = `task.md uncertain and run score ${runMatchScore} < ${runUseThreshold}`;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
mode = "task-first_caution";
|
|
70
|
+
useTaskMarkdown = true;
|
|
71
|
+
reason = `task.md uncertain but run score ${runMatchScore} >= ${runUseThreshold}`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
mode = "task-first";
|
|
76
|
+
useTaskMarkdown = true;
|
|
77
|
+
useRun = Boolean(runSelection.run && runMatchScore >= runUseThreshold);
|
|
78
|
+
reason = `task.md fresh (match score ${freshness.matchScore})`;
|
|
79
|
+
}
|
|
80
|
+
if (options.noRun || fromDiff || (!forced && (freshness.mode !== "use_task" || runMatchScore < runUseThreshold))) {
|
|
81
|
+
useRun = false;
|
|
82
|
+
}
|
|
83
|
+
if (!forced && !fromDiff && useTaskMarkdown && shouldPreferDiffIntent(input.taskMarkdown, diffOnlyInferredTask)) {
|
|
84
|
+
mode = freshness.mode === "uncertain" ? "diff-first_uncertain" : "diff-first";
|
|
85
|
+
useTaskMarkdown = false;
|
|
86
|
+
useRun = false;
|
|
87
|
+
reason = "task.md topic conflicts with current diff intent";
|
|
88
|
+
}
|
|
89
|
+
const inferredTask = inferDiffIntentClusters({
|
|
90
|
+
changedFiles,
|
|
91
|
+
changeFiles,
|
|
92
|
+
diffText,
|
|
93
|
+
codeGraph: input.codeGraph ?? [],
|
|
94
|
+
taskText: useTaskMarkdown ? input.taskMarkdown : undefined
|
|
95
|
+
});
|
|
96
|
+
const effectiveTaskMarkdown = useTaskMarkdown
|
|
97
|
+
? input.taskMarkdown
|
|
98
|
+
: buildInferredTaskMarkdown(inferredTask, mode);
|
|
99
|
+
return {
|
|
100
|
+
anchorStatus,
|
|
101
|
+
mode,
|
|
102
|
+
taskMatchScore: freshness.matchScore,
|
|
103
|
+
runMatchScore,
|
|
104
|
+
useTaskMarkdown,
|
|
105
|
+
useRun,
|
|
106
|
+
effectiveTaskMarkdown,
|
|
107
|
+
effectiveRunLog: useRun ? runSelection.run : undefined,
|
|
108
|
+
inferredTask,
|
|
109
|
+
reason,
|
|
110
|
+
freshness,
|
|
111
|
+
runSelection
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function shouldPreferDiffIntent(taskMarkdown, inferred) {
|
|
115
|
+
const intent = inferred.primaryIntent;
|
|
116
|
+
const text = taskMarkdown.toLowerCase();
|
|
117
|
+
const subtype = (intent.subtype ?? "").toLowerCase();
|
|
118
|
+
if (intent.type !== "app_feature_refactor") {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const hasArchitectureTaskSignal = /(architecture|refactor|migration|structure|구조|전환|마이그레이션|재구성|리팩터)/i.test(taskMarkdown);
|
|
122
|
+
const hasCopyOnlySignal = /(ui_text_cleanup|copy-only|wording_cleanup|문구|표현|카피|텍스트|wording|copy cleanup)/i.test(taskMarkdown);
|
|
123
|
+
const scopeTokens = [
|
|
124
|
+
subtype,
|
|
125
|
+
...intent.scope.filter((scope) => !/ui|source|changed|document_ui/.test(scope)).map((scope) => scope.toLowerCase())
|
|
126
|
+
].filter((token) => token.length >= 4);
|
|
127
|
+
const hasIntentToken = scopeTokens.some((token) => text.includes(token.replace(/_/g, "-")) || text.includes(token.replace(/_/g, " ")));
|
|
128
|
+
if (subtype === "living_document") {
|
|
129
|
+
const hasLivingDocumentSignal = /(living\s*document|living-document|artifact|아티팩트|문서|document)/i.test(taskMarkdown);
|
|
130
|
+
return !hasLivingDocumentSignal && hasCopyOnlySignal;
|
|
131
|
+
}
|
|
132
|
+
return !hasArchitectureTaskSignal && !hasIntentToken && hasCopyOnlySignal;
|
|
133
|
+
}
|
|
134
|
+
export function formatEffectiveTaskBasis(context) {
|
|
135
|
+
return [
|
|
136
|
+
`review basis: ${basisLabel(context)}`,
|
|
137
|
+
`task summary: ${summarizeTask(context)}`,
|
|
138
|
+
`run: ${context.useRun && context.effectiveRunLog ? `used ${context.effectiveRunLog.id}` : "ignored"}`
|
|
139
|
+
];
|
|
140
|
+
}
|
|
141
|
+
export function formatEffectiveTaskContext(prefix, context) {
|
|
142
|
+
const taskLabel = context.anchorStatus === "absent"
|
|
143
|
+
? "task anchor: absent"
|
|
144
|
+
: `task.md ${context.anchorStatus} (match score ${context.taskMatchScore})`;
|
|
145
|
+
const runScore = context.runMatchScore ?? 0;
|
|
146
|
+
const runLabel = context.useRun && context.effectiveRunLog
|
|
147
|
+
? `using run ${context.effectiveRunLog.id} (match score ${runScore})`
|
|
148
|
+
: `run ignored (match score ${runScore})`;
|
|
149
|
+
const using = context.useTaskMarkdown
|
|
150
|
+
? context.mode === "task-first_caution"
|
|
151
|
+
? "using task.md with caution"
|
|
152
|
+
: "using task.md"
|
|
153
|
+
: "using diff-inferred task";
|
|
154
|
+
return [
|
|
155
|
+
`${prefix}: ${taskLabel}`,
|
|
156
|
+
`${prefix}: ${runLabel}`,
|
|
157
|
+
`${prefix}: ${using} (${context.mode})`
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
export function formatEffectiveTaskBlock(title, context) {
|
|
161
|
+
return [
|
|
162
|
+
title,
|
|
163
|
+
` - task.md: ${context.anchorStatus}${context.anchorStatus === "absent" ? "" : ` (match score ${context.taskMatchScore})`}`,
|
|
164
|
+
` - run: ${context.useRun && context.effectiveRunLog ? `using ${context.effectiveRunLog.id}` : "ignored"} (match score ${context.runMatchScore ?? 0})`,
|
|
165
|
+
` - using: ${context.useTaskMarkdown ? "task.md" : "inferred task from current diff"} (${context.mode})`
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
export function formatEffectiveRunSummary(context) {
|
|
169
|
+
return [
|
|
170
|
+
context.useRun && context.effectiveRunLog ? `- using run: ${context.effectiveRunLog.id}` : "- run: ignored",
|
|
171
|
+
`- run match score: ${context.runMatchScore ?? 0}`,
|
|
172
|
+
`- anchor mode: ${context.mode}`,
|
|
173
|
+
`- primary basis: ${basisLabel(context)}`,
|
|
174
|
+
`- task summary: ${summarizeTask(context)}`
|
|
175
|
+
].join("\n");
|
|
176
|
+
}
|
|
177
|
+
function basisLabel(context) {
|
|
178
|
+
if (context.reason === "--task forced") {
|
|
179
|
+
return "forced task";
|
|
180
|
+
}
|
|
181
|
+
if (context.reason === "forced from current diff") {
|
|
182
|
+
return "forced diff";
|
|
183
|
+
}
|
|
184
|
+
return context.useTaskMarkdown ? "task.md" : "diff-inferred";
|
|
185
|
+
}
|
|
186
|
+
function summarizeTask(context) {
|
|
187
|
+
const intent = context.inferredTask.primaryIntent;
|
|
188
|
+
const source = context.effectiveTaskMarkdown;
|
|
189
|
+
const goal = extractSectionFirstLine(source, "목표") ?? extractSectionFirstLine(source, "Goal");
|
|
190
|
+
const type = source.match(/type:\s*([a-z_]+)/i)?.[1] ??
|
|
191
|
+
intent.type;
|
|
192
|
+
const subtype = source.match(/subtype:\s*([a-z0-9_.+-]+)/i)?.[1] ??
|
|
193
|
+
intent.subtype;
|
|
194
|
+
const summary = goal ?? inferredIntentToRequirement(intent).split(/\r?\n/)[0] ?? "current diff";
|
|
195
|
+
return [summary.replace(/^-\s*/, "").slice(0, 100), type ? `type=${type}` : "", subtype ? `subtype=${subtype}` : ""]
|
|
196
|
+
.filter(Boolean)
|
|
197
|
+
.join(" / ");
|
|
198
|
+
}
|
|
199
|
+
function extractSectionFirstLine(markdown, section) {
|
|
200
|
+
const lines = markdown.split(/\r?\n/);
|
|
201
|
+
const start = lines.findIndex((line) => new RegExp(`^##\\s+${escapeRegExp(section)}\\s*$`, "i").test(line.trim()));
|
|
202
|
+
if (start < 0) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
for (const line of lines.slice(start + 1)) {
|
|
206
|
+
const trimmed = line.trim();
|
|
207
|
+
if (/^##\s+/.test(trimmed)) {
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
if (trimmed && !trimmed.startsWith("#")) {
|
|
211
|
+
return trimmed;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
async function selectEffectiveRun(input) {
|
|
217
|
+
if (input.options.noRun || input.options.fromDiff) {
|
|
218
|
+
return { mode: "none" };
|
|
219
|
+
}
|
|
220
|
+
if (input.options.runId === "latest") {
|
|
221
|
+
const latest = await readLatestRun(input.root);
|
|
222
|
+
if (!latest) {
|
|
223
|
+
return { mode: "latest", warning: "latest run not found" };
|
|
224
|
+
}
|
|
225
|
+
const warning = runIdentityWarning("latest run", latest, input.currentIdentity);
|
|
226
|
+
if (warning) {
|
|
227
|
+
return { mode: "latest", warning };
|
|
228
|
+
}
|
|
229
|
+
return { run: latest, score: scoreRunAgainstDiff(latest, input.changedFiles, input.taskMarkdown), mode: "latest" };
|
|
230
|
+
}
|
|
231
|
+
if (input.options.runId) {
|
|
232
|
+
const run = await readRunById(input.root, input.options.runId);
|
|
233
|
+
if (!run) {
|
|
234
|
+
return { mode: "explicit", warning: `run ${input.options.runId} not found` };
|
|
235
|
+
}
|
|
236
|
+
const warning = runIdentityWarning(`run ${input.options.runId}`, run, input.currentIdentity);
|
|
237
|
+
if (warning) {
|
|
238
|
+
return { mode: "explicit", warning };
|
|
239
|
+
}
|
|
240
|
+
return { run, score: scoreRunAgainstDiff(run, input.changedFiles, input.taskMarkdown), mode: "explicit" };
|
|
241
|
+
}
|
|
242
|
+
const [latest, runs] = await Promise.all([readLatestRun(input.root), listRunLogs(input.root)]);
|
|
243
|
+
const usableRuns = runs.filter((run) => !runIdentityWarning(`run ${run.id}`, run, input.currentIdentity));
|
|
244
|
+
const scoredRuns = usableRuns
|
|
245
|
+
.map((run) => ({ run, score: scoreRunAgainstDiff(run, input.changedFiles, input.taskMarkdown) }))
|
|
246
|
+
.filter((entry) => entry.score > 0)
|
|
247
|
+
.sort((a, b) => b.score - a.score || Date.parse(b.run.createdAt) - Date.parse(a.run.createdAt));
|
|
248
|
+
const selected = scoredRuns[0];
|
|
249
|
+
const latestWarning = latest ? runIdentityWarning("latest run", latest, input.currentIdentity) : undefined;
|
|
250
|
+
const latestScore = latest && !latestWarning ? scoreRunAgainstDiff(latest, input.changedFiles, input.taskMarkdown) : undefined;
|
|
251
|
+
if (selected) {
|
|
252
|
+
return {
|
|
253
|
+
run: selected.run,
|
|
254
|
+
score: selected.score,
|
|
255
|
+
mode: "matched",
|
|
256
|
+
warning: latestWarning ?? (latest && latest.id !== selected.run.id && latestScore === 0 ? "latest run does not match current diff" : undefined)
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
mode: "none",
|
|
261
|
+
score: latestScore,
|
|
262
|
+
warning: latestWarning ?? (latest && latestScore === 0 ? "latest run does not match current diff" : undefined)
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function scoreRunAgainstDiff(run, changedFiles, taskMarkdown) {
|
|
266
|
+
const changed = changedFiles.filter((file) => !isAlwaysIgnoredContextPath(file));
|
|
267
|
+
if (changed.length === 0) {
|
|
268
|
+
return 0;
|
|
269
|
+
}
|
|
270
|
+
const runHints = [
|
|
271
|
+
...(run.relatedFiles ?? []),
|
|
272
|
+
...(run.changedFilesAtCreation ?? []),
|
|
273
|
+
...extractPathHints(run.generatedTaskMarkdown ?? ""),
|
|
274
|
+
...extractPathHints(run.generatedCodexPrompt ?? "")
|
|
275
|
+
].filter((path) => !isAlwaysIgnoredContextPath(path));
|
|
276
|
+
let score = 0;
|
|
277
|
+
for (const file of changed) {
|
|
278
|
+
if (runHints.some((hint) => pathHintMatches(file, hint))) {
|
|
279
|
+
score += 3;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (run.userRequest && taskMarkdown.includes(run.userRequest.slice(0, 30))) {
|
|
283
|
+
score += 1;
|
|
284
|
+
}
|
|
285
|
+
return score;
|
|
286
|
+
}
|
|
287
|
+
function runIdentityWarning(source, run, currentIdentity) {
|
|
288
|
+
if (!currentIdentity) {
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
if (!run.projectIdentity) {
|
|
292
|
+
return `${source} has no project identity`;
|
|
293
|
+
}
|
|
294
|
+
return sameProjectIdentity(currentIdentity, run.projectIdentity) ? undefined : `${source} project identity mismatch`;
|
|
295
|
+
}
|
|
296
|
+
function buildInferredTaskMarkdown(clusters, mode) {
|
|
297
|
+
const intent = clusters.primaryIntent;
|
|
298
|
+
return [
|
|
299
|
+
"# Inferred Current Task",
|
|
300
|
+
"",
|
|
301
|
+
"## 작업 유형",
|
|
302
|
+
`- type: ${intent.type}`,
|
|
303
|
+
intent.subtype ? `- subtype: ${intent.subtype}` : "",
|
|
304
|
+
`- confidence: ${intent.confidence}`,
|
|
305
|
+
`- strategy: diff-inferred`,
|
|
306
|
+
"",
|
|
307
|
+
"## 목표",
|
|
308
|
+
`- ${inferredIntentToRequirement(intent)}`,
|
|
309
|
+
"",
|
|
310
|
+
"## 현재 기준",
|
|
311
|
+
`- source: current git diff`,
|
|
312
|
+
`- mode: ${mode}`,
|
|
313
|
+
`- ${formatInferredDiffIntentClusters(clusters)}`
|
|
314
|
+
].filter((line) => line !== "").join("\n");
|
|
315
|
+
}
|
|
316
|
+
function mapAnchorStatus(mode) {
|
|
317
|
+
if (mode === "anchor_absent")
|
|
318
|
+
return "absent";
|
|
319
|
+
if (mode === "use_task")
|
|
320
|
+
return "fresh";
|
|
321
|
+
return mode;
|
|
322
|
+
}
|
|
323
|
+
function extractPathHints(markdown) {
|
|
324
|
+
const roots = "(?:app|apps|pages|packages|src|lib|components|hooks|utils|supabase|styles|constants|public|docs)";
|
|
325
|
+
const matches = [...markdown.matchAll(new RegExp(`(?:^|[\\s\`])((?:\\./)?${roots}/[^\\s,)\\]\`]+)`, "g"))].map((match) => cleanPathHint(match[1] ?? ""));
|
|
326
|
+
return [...new Set(matches.filter(Boolean))];
|
|
327
|
+
}
|
|
328
|
+
function cleanPathHint(path) {
|
|
329
|
+
return path
|
|
330
|
+
.trim()
|
|
331
|
+
.replace(/^`|`$/g, "")
|
|
332
|
+
.replace(/^\.\//, "")
|
|
333
|
+
.replace(/\s+-\s+.*$/, "")
|
|
334
|
+
.replace(/\s+\([^)]*\)$/, "")
|
|
335
|
+
.replace(/[),.\]]+$/, "");
|
|
336
|
+
}
|
|
337
|
+
function pathHintMatches(file, hint) {
|
|
338
|
+
const normalizedHint = cleanPathHint(hint);
|
|
339
|
+
if (!normalizedHint) {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
if (normalizedHint.endsWith("/**")) {
|
|
343
|
+
const directory = normalizedHint.slice(0, -3);
|
|
344
|
+
return file === directory || file.startsWith(`${directory}/`);
|
|
345
|
+
}
|
|
346
|
+
if (normalizedHint.endsWith("/*")) {
|
|
347
|
+
const directory = normalizedHint.slice(0, -2);
|
|
348
|
+
return file.startsWith(`${directory}/`) && !file.slice(directory.length + 1).includes("/");
|
|
349
|
+
}
|
|
350
|
+
return file === normalizedHint || file.startsWith(`${normalizedHint}/`) || normalizedHint.startsWith(`${file}/`);
|
|
351
|
+
}
|
|
352
|
+
function escapeRegExp(value) {
|
|
353
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=effective-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effective-task.js","sourceRoot":"","sources":["../src/effective-task.ts"],"names":[],"mappings":"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"}
|
package/dist/fs.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function readTextFile(path: string, fallback?: string): Promise<string>;
|
|
2
|
+
export declare function readJsonFile<T>(path: string, fallback: T): Promise<T>;
|
|
3
|
+
export declare function writeFileIfMissing(path: string, content: string): Promise<"created" | "exists">;
|
|
4
|
+
export declare function appendTextFile(path: string, content: string): Promise<void>;
|
|
5
|
+
export declare function writeTextFile(path: string, content: string): Promise<void>;
|
|
6
|
+
export declare function fileMetadata(path: string): Promise<{
|
|
7
|
+
size: number;
|
|
8
|
+
lastModified: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function fromRoot(root: string, path: string): string;
|
package/dist/fs.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
export async function readTextFile(path, fallback = "") {
|
|
4
|
+
try {
|
|
5
|
+
return await readFile(path, "utf8");
|
|
6
|
+
}
|
|
7
|
+
catch (error) {
|
|
8
|
+
if (isMissingFileError(error)) {
|
|
9
|
+
return fallback;
|
|
10
|
+
}
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function readJsonFile(path, fallback) {
|
|
15
|
+
const text = await readTextFile(path);
|
|
16
|
+
if (!text.trim()) {
|
|
17
|
+
return fallback;
|
|
18
|
+
}
|
|
19
|
+
return JSON.parse(text);
|
|
20
|
+
}
|
|
21
|
+
export async function writeFileIfMissing(path, content) {
|
|
22
|
+
await mkdir(dirname(path), { recursive: true });
|
|
23
|
+
try {
|
|
24
|
+
await writeFile(path, content, { flag: "wx" });
|
|
25
|
+
return "created";
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (isAlreadyExistsError(error)) {
|
|
29
|
+
return "exists";
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function appendTextFile(path, content) {
|
|
35
|
+
await mkdir(dirname(path), { recursive: true });
|
|
36
|
+
await appendFile(path, content, "utf8");
|
|
37
|
+
}
|
|
38
|
+
export async function writeTextFile(path, content) {
|
|
39
|
+
await mkdir(dirname(path), { recursive: true });
|
|
40
|
+
await writeFile(path, content, "utf8");
|
|
41
|
+
}
|
|
42
|
+
export async function fileMetadata(path) {
|
|
43
|
+
const metadata = await stat(path);
|
|
44
|
+
return {
|
|
45
|
+
size: metadata.size,
|
|
46
|
+
lastModified: metadata.mtime.toISOString()
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function fromRoot(root, path) {
|
|
50
|
+
return join(root, path);
|
|
51
|
+
}
|
|
52
|
+
function isMissingFileError(error) {
|
|
53
|
+
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
54
|
+
}
|
|
55
|
+
function isAlreadyExistsError(error) {
|
|
56
|
+
return error instanceof Error && "code" in error && error.code === "EEXIST";
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=fs.js.map
|
package/dist/fs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,QAAQ,GAAG,EAAE;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAY,EAAE,QAAW;IAC7D,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAe;IACpE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAChE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IAC/D,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAY;IACjD,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9E,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9E,CAAC"}
|
package/dist/git.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ChangeFile } from "@dev-guard/core";
|
|
2
|
+
export interface GitChanges {
|
|
3
|
+
changedFiles: string[];
|
|
4
|
+
changeFiles: ChangeFile[];
|
|
5
|
+
diffText: string;
|
|
6
|
+
workingTreeDiffText: string;
|
|
7
|
+
stagedDiffText: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getChangedFiles(cwd: string): Promise<string[]>;
|
|
10
|
+
export declare function getDiff(cwd: string): Promise<string>;
|
|
11
|
+
export declare function getProjectFiles(cwd: string): Promise<string[]>;
|
|
12
|
+
export declare function getGitIdentity(cwd: string): Promise<{
|
|
13
|
+
gitHead: string;
|
|
14
|
+
gitBranch: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function getGitRemoteOrigin(cwd: string): Promise<string>;
|
|
17
|
+
export declare function hasGitBaseline(cwd: string): Promise<boolean>;
|
|
18
|
+
export declare function getGitChanges(cwd: string): Promise<GitChanges>;
|
|
19
|
+
export declare function getStagedGitChanges(cwd: string): Promise<GitChanges>;
|
|
20
|
+
export declare function getCommitGitChanges(cwd: string, ref: string): Promise<GitChanges>;
|
|
21
|
+
export declare function getDiffForChangeFiles(cwd: string, changeFiles: ChangeFile[], options?: {
|
|
22
|
+
stagedOnly?: boolean;
|
|
23
|
+
commitRef?: string;
|
|
24
|
+
}): Promise<string>;
|