@dev-guard/core 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.
Files changed (54) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ai.d.ts +30 -0
  3. package/dist/ai.js +2050 -0
  4. package/dist/ai.js.map +1 -0
  5. package/dist/analyze.d.ts +2 -0
  6. package/dist/analyze.js +303 -0
  7. package/dist/analyze.js.map +1 -0
  8. package/dist/completion.d.ts +8 -0
  9. package/dist/completion.js +272 -0
  10. package/dist/completion.js.map +1 -0
  11. package/dist/context-files.d.ts +5 -0
  12. package/dist/context-files.js +44 -0
  13. package/dist/context-files.js.map +1 -0
  14. package/dist/defaults.d.ts +3 -0
  15. package/dist/defaults.js +46 -0
  16. package/dist/defaults.js.map +1 -0
  17. package/dist/diff-intent.d.ts +19 -0
  18. package/dist/diff-intent.js +517 -0
  19. package/dist/diff-intent.js.map +1 -0
  20. package/dist/drift.d.ts +19 -0
  21. package/dist/drift.js +264 -0
  22. package/dist/drift.js.map +1 -0
  23. package/dist/index-check.mjs +13 -0
  24. package/dist/index.d.ts +18 -0
  25. package/dist/index.js +16 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/prompt.d.ts +2 -0
  28. package/dist/prompt.js +633 -0
  29. package/dist/prompt.js.map +1 -0
  30. package/dist/report.d.ts +2 -0
  31. package/dist/report.js +90 -0
  32. package/dist/report.js.map +1 -0
  33. package/dist/review.d.ts +4 -0
  34. package/dist/review.js +350 -0
  35. package/dist/review.js.map +1 -0
  36. package/dist/scan.d.ts +9 -0
  37. package/dist/scan.js +322 -0
  38. package/dist/scan.js.map +1 -0
  39. package/dist/task-anchor.d.ts +21 -0
  40. package/dist/task-anchor.js +126 -0
  41. package/dist/task-anchor.js.map +1 -0
  42. package/dist/task-router.d.ts +3 -0
  43. package/dist/task-router.js +340 -0
  44. package/dist/task-router.js.map +1 -0
  45. package/dist/templates.d.ts +20 -0
  46. package/dist/templates.js +56 -0
  47. package/dist/templates.js.map +1 -0
  48. package/dist/types.d.ts +366 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/update.d.ts +2 -0
  52. package/dist/update.js +250 -0
  53. package/dist/update.js.map +1 -0
  54. package/package.json +30 -0
@@ -0,0 +1,272 @@
1
+ export function buildTaskCompletionCriteria(taskType) {
2
+ const criteria = criteriaByType[taskType.type];
3
+ if (taskType.subtype === "cli_output_polish") {
4
+ return {
5
+ requiredChecks: [
6
+ "대상 CLI 명령의 출력에서 핵심 요약이 먼저 보인다.",
7
+ "preview/write 정책이 출력에서 명확히 구분된다.",
8
+ "기존 명령 동작과 자동 write 정책은 유지된다."
9
+ ],
10
+ forbiddenPatterns: ["새 기능 추가로 범위 확대", "update --write 자동 실행", "긴 로그를 기본 출력에 추가"],
11
+ reviewHints: ["대상 command handler와 관련 preview 출력만 확인한다.", "기본 출력이 compact한지 확인한다."],
12
+ blockingFailures: ["대상 명령 출력 개선 누락", "preview 명령이 파일을 수정함", "기존 command flow 훼손"]
13
+ };
14
+ }
15
+ return {
16
+ requiredChecks: criteria.requiredChecks,
17
+ forbiddenPatterns: criteria.forbiddenPatterns,
18
+ reviewHints: criteria.reviewHints,
19
+ blockingFailures: criteria.blockingFailures
20
+ };
21
+ }
22
+ export function formatCompletionCriteria(criteria) {
23
+ return [
24
+ "required checks:",
25
+ ...criteria.requiredChecks.map((item) => `- ${item}`),
26
+ criteria.forbiddenPatterns?.length ? "\nforbidden patterns:" : "",
27
+ ...(criteria.forbiddenPatterns ?? []).map((item) => `- ${item}`),
28
+ criteria.reviewHints?.length ? "\nreview hints:" : "",
29
+ ...(criteria.reviewHints ?? []).map((item) => `- ${item}`),
30
+ criteria.blockingFailures?.length ? "\nblocking failures:" : "",
31
+ ...(criteria.blockingFailures ?? []).map((item) => `- ${item}`)
32
+ ]
33
+ .filter(Boolean)
34
+ .join("\n");
35
+ }
36
+ export function analyzeCompletionPostChecks(input) {
37
+ if (!isI18nTaskMarkdown(input.taskMarkdown)) {
38
+ return [];
39
+ }
40
+ return analyzeI18nPostChecks(input.changedFiles, input.diffText);
41
+ }
42
+ const criteriaByType = {
43
+ ui_text_cleanup: {
44
+ requiredChecks: [
45
+ "사용자 노출 문구가 요청 의도에 맞게 쉬운 표현으로 정리된다.",
46
+ "같은 의미의 중복 문구가 남지 않는다.",
47
+ "CTA, 제목, 빈 상태, 에러 문구의 톤이 한 화면 안에서 일관된다."
48
+ ],
49
+ forbiddenPatterns: ["로직/상태/데이터 변경", "문구 작업을 기능 추가로 확대"],
50
+ reviewHints: ["변경된 문자열을 직접 비교한다.", "문구 길이와 의미 중복을 확인한다."],
51
+ blockingFailures: ["요청한 화면의 핵심 문구가 그대로 남음", "문구 수정 중 기능 로직 변경"]
52
+ },
53
+ ui_polish: {
54
+ requiredChecks: [
55
+ "기존 UI 흐름 안에서 자연스럽게 통합된다.",
56
+ "새 섹션/카드/버튼이 불필요하게 추가되지 않는다.",
57
+ "기존 동작은 유지된다."
58
+ ],
59
+ forbiddenPatterns: ["새 기능 추가", "상태/데이터 로직 변경", "레이아웃 전면 재구성"],
60
+ reviewHints: ["변경된 UI surface와 기존 흐름의 연결만 확인한다."],
61
+ blockingFailures: ["기존 기능 동작 훼손", "요청과 무관한 UI 구조 추가"]
62
+ },
63
+ ui_feature_polish: {
64
+ requiredChecks: [
65
+ "실제 렌더 경로를 확인한 뒤 사용 중인 UI 컴포넌트만 수정한다.",
66
+ "요청된 문구 정리와 scoped UI interaction이 모두 동작한다.",
67
+ "PC/mobile에서 추가 view가 기존 흐름을 깨지 않고 열린다.",
68
+ "기존 데이터 저장/조회/인증/API 흐름은 유지된다."
69
+ ],
70
+ forbiddenPatterns: ["copy-only로 필요한 UI interaction 금지", "전체 화면 재설계", "데이터 모델/API/storage 변경", "사용 여부 확인 없는 old component 수정"],
71
+ reviewHints: ["local UI state, click handler, modal/sheet/inline expand는 허용된 변경으로 본다.", "데이터 구조, persistence, API, auth 변경은 별도 위험으로 본다."],
72
+ blockingFailures: ["문구만 바꾸고 필요한 전체 보기 interaction 누락", "old/unused 파일만 수정", "데이터 저장 구조 또는 API 변경"]
73
+ },
74
+ bugfix: {
75
+ requiredChecks: ["재현 조건이 설명된다.", "원인 후보와 수정 근거가 연결된다.", "회귀 검증 방법이 포함된다."],
76
+ forbiddenPatterns: ["원인 불명 상태의 광범위 수정", "정상 동작하던 경로 훼손"],
77
+ reviewHints: ["실제 diff가 재현 조건을 해결하는지 확인한다."],
78
+ blockingFailures: ["버그 재현 조건 미해결", "관련 없는 기능 변경"]
79
+ },
80
+ feature_add: {
81
+ requiredChecks: ["새 기능 범위가 명확하다.", "UI/상태/데이터 영향이 구분된다.", "기존 동작 보호 대상이 명시된다."],
82
+ forbiddenPatterns: ["요청 범위 밖 기능 추가", "검증 없는 데이터 구조 변경"],
83
+ reviewHints: ["새 기능 진입점과 기존 흐름 영향을 확인한다."],
84
+ blockingFailures: ["핵심 기능 미구현", "보호 대상 변경"]
85
+ },
86
+ product_strategy: {
87
+ requiredChecks: [
88
+ "사용자가 이 서비스를 굳이 써야 하는 한 문장 이유가 정의된다.",
89
+ "공유하고 싶거나 다시 써보고 싶은 이유가 코드 수정 전에 설명된다.",
90
+ "구현이 필요하면 최소 변경 범위와 검증 기준을 먼저 제안한다."
91
+ ],
92
+ forbiddenPatterns: ["바로 코드 수정 착수", "검증 없는 새 UI 섹션 추가", "결과 계산/저장/인증 로직 변경"],
93
+ reviewHints: ["product brief와 implementation proposal이 먼저 있는지 확인한다.", "reference 파일을 primary edit target으로 오해하지 않았는지 확인한다."],
94
+ blockingFailures: ["핵심 가치/후킹 정의 없이 UI만 추가", "승인 없는 코드 수정 범위 확정", "보호 로직 변경"]
95
+ },
96
+ architecture: {
97
+ requiredChecks: ["영향 범위가 단계별로 분해된다.", "dependency direction이 유지된다.", "마이그레이션 위험이 명시된다."],
98
+ forbiddenPatterns: ["전체 구조 일괄 교체", "layer violation", "unrelated file modification"],
99
+ reviewHints: ["변경 파일이 이번 단계 경계 안에 있는지 확인한다."],
100
+ blockingFailures: ["layer violation", "rollback 어려운 전역 구조 변경"]
101
+ },
102
+ i18n: {
103
+ requiredChecks: [
104
+ "사용자 노출 문자열 inventory가 먼저 정리된다.",
105
+ "대상 화면에서 locale=en일 때 한국어 UI가 섞이지 않는다.",
106
+ "사용자 노출 문자열은 locale resource로 이동한다.",
107
+ "aria-label/title/placeholder/metadata 문자열도 locale resource 기준으로 처리한다.",
108
+ "locale resource key가 ko/en 사이에서 대응된다."
109
+ ],
110
+ forbiddenPatterns: [
111
+ "한국어 원본 덮어쓰기",
112
+ "전체 페이지 텍스트 직접 치환",
113
+ "hardcoded user-facing strings remain",
114
+ "locale mixed rendering",
115
+ "missing translation keys",
116
+ "metadata locale mismatch"
117
+ ],
118
+ reviewHints: [
119
+ "JSX/text hardcoded string detection",
120
+ "locale resource parity",
121
+ "untranslated key detection",
122
+ "metadata/json-ld locale consistency",
123
+ "aria-label/title/placeholder untranslated check",
124
+ "mixed locale rendering detection"
125
+ ],
126
+ blockingFailures: [
127
+ "고유명사 외 하드코딩 사용자 노출 문자열 잔존",
128
+ "locale=en 화면에 한국어 문구 혼입",
129
+ "ko/en resource key 불일치",
130
+ "metadata/aria-label/title/placeholder 미처리"
131
+ ]
132
+ },
133
+ refactor: {
134
+ requiredChecks: ["동작 변경이 없다.", "public API/props가 유지된다.", "빌드와 관련 테스트가 통과한다."],
135
+ forbiddenPatterns: ["기능 변경", "public API breaking change"],
136
+ reviewHints: ["삭제/이동된 export와 props 변경을 확인한다."],
137
+ blockingFailures: ["동작 변경", "호환성 깨짐"]
138
+ },
139
+ migration: {
140
+ requiredChecks: ["단계별 전환 계획이 있다.", "backward compatibility가 유지된다.", "rollback point가 명시된다."],
141
+ forbiddenPatterns: ["일괄 전환", "호환성 없는 삭제"],
142
+ reviewHints: ["old/new 경로가 공존 가능한지 확인한다."],
143
+ blockingFailures: ["rollback 불가", "호환성 깨짐"]
144
+ },
145
+ performance: {
146
+ requiredChecks: ["측정 기준과 대상이 명시된다.", "기능 동작은 유지된다.", "과한 리팩터링 없이 병목만 다룬다."],
147
+ forbiddenPatterns: ["측정 없는 최적화", "기능 변경", "광범위 리팩터링"],
148
+ reviewHints: ["성능 관련 변경이 병목 지점에 연결되는지 확인한다."],
149
+ blockingFailures: ["기능 회귀", "측정/검증 기준 없음"]
150
+ },
151
+ styling: {
152
+ requiredChecks: ["스타일/UI 표현만 바뀐다.", "디자인 시스템 토큰을 우선한다.", "로직은 유지된다."],
153
+ forbiddenPatterns: ["로직 변경", "토큰 우회 하드코딩 남발"],
154
+ reviewHints: ["class/style 변경 범위를 확인한다."],
155
+ blockingFailures: ["스타일 작업 중 동작 로직 변경"]
156
+ },
157
+ docs: {
158
+ requiredChecks: ["문서만 수정된다.", "명령/예시가 현재 동작과 맞다.", "코드 변경이 없다."],
159
+ forbiddenPatterns: ["코드 변경", "검증되지 않은 사용법 추가"],
160
+ reviewHints: ["README/docs diff만 확인한다."],
161
+ blockingFailures: ["문서 작업 중 코드 변경"]
162
+ },
163
+ infra_config: {
164
+ requiredChecks: ["config/env/build/deploy 영향이 명시된다.", "secret이 저장되지 않는다.", "검증 명령 또는 공식 문서 확인 필요가 남는다."],
165
+ forbiddenPatterns: ["API key/secret 저장", "환경별 영향 누락"],
166
+ reviewHints: ["env/config 파일 diff와 secret 포함 여부를 확인한다."],
167
+ blockingFailures: ["secret commit 위험", "배포/빌드 설정 회귀"]
168
+ }
169
+ };
170
+ function extractTaskType(taskMarkdown) {
171
+ const section = extractSection(taskMarkdown, "작업 유형") || taskMarkdown;
172
+ const match = section.match(/type:\s*([a-z_]+)/i);
173
+ return match?.[1];
174
+ }
175
+ function isI18nTaskMarkdown(taskMarkdown) {
176
+ return extractTaskType(taskMarkdown) === "i18n" || /type:\s*i18n/i.test(taskMarkdown) || /##\s*완료 기준[\s\S]*locale=en/i.test(taskMarkdown);
177
+ }
178
+ function analyzeI18nPostChecks(changedFiles, diffText) {
179
+ const findings = [];
180
+ const hasEnglishResource = changedFiles.some((file) => /(^|\/)(en|en-US)\.(json|ts|tsx|js|yaml|yml)$/i.test(file) || /(^|\/)(messages|locales|translations|dictionaries)\/.*en/i.test(file));
181
+ const hasKoreanResource = changedFiles.some((file) => /(^|\/)(ko|ko-KR)\.(json|ts|tsx|js|yaml|yml)$/i.test(file) || /(^|\/)(messages|locales|translations|dictionaries)\/.*ko/i.test(file));
182
+ const migration = analyzeI18nMigration(diffText, hasKoreanResource, hasEnglishResource);
183
+ const hardcodedKoreanAdditions = extractAddedLines(diffText).filter((line) => containsKorean(line) && !looksLikeLocaleResourceLine(line));
184
+ const ariaMetadataAdditions = hardcodedKoreanAdditions.filter((line) => /aria-label|title=|placeholder=|metadata|json-ld|description|openGraph/i.test(line));
185
+ if (!hasEnglishResource || !hasKoreanResource) {
186
+ findings.push({
187
+ severity: "warning",
188
+ code: "i18n_resource_parity_missing",
189
+ title: "i18n resource parity needs review",
190
+ message: "i18n task changed files do not clearly include both Korean and English locale resources."
191
+ });
192
+ }
193
+ if (hardcodedKoreanAdditions.length > 0) {
194
+ findings.push({
195
+ severity: "warning",
196
+ code: "i18n_possible_hardcoded_strings",
197
+ title: "Possible hardcoded user-facing strings",
198
+ message: "Korean user-facing additions remain outside obvious locale resource files. Confirm they are not hardcoded UI strings."
199
+ });
200
+ }
201
+ if (ariaMetadataAdditions.length > 0) {
202
+ findings.push({
203
+ severity: "warning",
204
+ code: "i18n_metadata_accessibility_strings",
205
+ title: "Metadata or accessibility strings may be untranslated",
206
+ message: "Added aria/title/placeholder/metadata strings include Korean text. Confirm they are locale-resource driven."
207
+ });
208
+ }
209
+ if (migration.normal) {
210
+ findings.push({
211
+ severity: "info",
212
+ code: "i18n_locale_resource_migration",
213
+ title: "i18n locale resource migration detected",
214
+ message: "Korean copy moved to locale resource; default locale preserved."
215
+ });
216
+ }
217
+ return findings;
218
+ }
219
+ function analyzeI18nMigration(diffText, hasKoreanResource, hasEnglishResource) {
220
+ const addedLines = extractAddedLines(diffText);
221
+ const removedLines = extractRemovedLines(diffText);
222
+ const removedKoreanCopy = removedLines.some((line) => containsKorean(line) && looksLikeUserFacingStringLine(line));
223
+ const koResourceCopy = addedLines.some((line) => containsKorean(line) && looksLikeLocaleResourceLine(line));
224
+ const tCallAdded = addedLines.some((line) => /\bt\(\s*["'][\w.-]+["']\s*\)|useTranslations|useI18n|getMessage|translate\(/i.test(line));
225
+ const defaultKo = /defaultLocale\s*[:=]\s*["']ko(?:-KR)?["']|fallbackLocale\s*[:=]\s*["']ko(?:-KR)?["']|locale\s*\?\?\s*["']ko(?:-KR)?["']/i.test(diffText);
226
+ const defaultEnAdded = addedLines.some((line) => /defaultLocale\s*[:=]\s*["']en(?:-US)?["']|fallbackLocale\s*[:=]\s*["']en(?:-US)?["']|locale\s*\?\?\s*["']en(?:-US)?["']/i.test(line));
227
+ return {
228
+ normal: hasKoreanResource && hasEnglishResource && removedKoreanCopy && koResourceCopy && tCallAdded && (defaultKo || !defaultEnAdded)
229
+ };
230
+ }
231
+ function extractAddedLines(diffText) {
232
+ return diffText
233
+ .split("\n")
234
+ .filter((line) => line.startsWith("+") && !line.startsWith("+++"))
235
+ .map((line) => line.slice(1).trim())
236
+ .filter(Boolean);
237
+ }
238
+ function extractRemovedLines(diffText) {
239
+ return diffText
240
+ .split("\n")
241
+ .filter((line) => line.startsWith("-") && !line.startsWith("---"))
242
+ .map((line) => line.slice(1).trim())
243
+ .filter(Boolean);
244
+ }
245
+ function containsKorean(value) {
246
+ return /[가-힣]/.test(value);
247
+ }
248
+ function looksLikeLocaleResourceLine(value) {
249
+ return /messages|locales|translation|dictionary|ko\.|ko:|["']ko["']|한국어\s*원본|existing Korean copy|["'][\w.-]+["']\s*:\s*["'][^"']*[가-힣]/i.test(value);
250
+ }
251
+ function looksLikeUserFacingStringLine(value) {
252
+ return /["'`][^"'`]*[가-힣][^"'`]*["'`]/.test(value);
253
+ }
254
+ function extractSection(markdown, title) {
255
+ const lines = markdown.split("\n");
256
+ const start = lines.findIndex((line) => new RegExp(`^##\\s+${escapeRegExp(title)}\\s*$`).test(line.trim()));
257
+ if (start < 0) {
258
+ return "";
259
+ }
260
+ const body = [];
261
+ for (const line of lines.slice(start + 1)) {
262
+ if (/^##\s+/.test(line.trim())) {
263
+ break;
264
+ }
265
+ body.push(line);
266
+ }
267
+ return body.join("\n").trim();
268
+ }
269
+ function escapeRegExp(value) {
270
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
271
+ }
272
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ChangeFile } from "./types.js";
2
+ export declare function isDevGuardContextFile(path: string): boolean;
3
+ export declare function isAlwaysIgnoredContextPath(path: string): boolean;
4
+ export declare function filterDevGuardContextFiles(changeFiles: ChangeFile[], includeContextFiles?: boolean): ChangeFile[];
5
+ export declare function normalizeContextPath(path: string): string;
@@ -0,0 +1,44 @@
1
+ const devGuardDocPaths = new Set([
2
+ "docs/PROJECT_STATE.md",
3
+ "docs/CURRENT_TASK.md",
4
+ "docs/DECISIONS.md",
5
+ "docs/DO_NOT_REPEAT.md"
6
+ ]);
7
+ const devGuardCachePaths = new Set([
8
+ ".devguard/project-index.json",
9
+ ".devguard/file-summaries.json",
10
+ ".devguard/code-graph.json",
11
+ ".devguard/project-map.md"
12
+ ]);
13
+ export function isDevGuardContextFile(path) {
14
+ const normalized = normalizePath(path);
15
+ return normalized.startsWith(".devguard/") || devGuardDocPaths.has(normalized);
16
+ }
17
+ export function isAlwaysIgnoredContextPath(path) {
18
+ const normalized = normalizePath(path);
19
+ const segments = normalized.split("/");
20
+ const fileName = segments.at(-1) ?? "";
21
+ return (normalized.startsWith(".next/") ||
22
+ normalized.startsWith(".git/") ||
23
+ normalized.startsWith("node_modules/") ||
24
+ normalized.startsWith("dist/") ||
25
+ normalized.startsWith("build/") ||
26
+ normalized.startsWith("coverage/") ||
27
+ normalized.startsWith(".devguard/runs/") ||
28
+ /^\.devguard\/[^/]+\.json$/i.test(normalized) ||
29
+ devGuardCachePaths.has(normalized) ||
30
+ fileName === "pnpm-lock.yaml" ||
31
+ fileName === "package-lock.json" ||
32
+ fileName === "yarn.lock" ||
33
+ /turbopack|\/cache\//i.test(normalized));
34
+ }
35
+ export function filterDevGuardContextFiles(changeFiles, includeContextFiles) {
36
+ return changeFiles.filter((file) => !isAlwaysIgnoredContextPath(file.path) && (includeContextFiles || !isDevGuardContextFile(file.path)));
37
+ }
38
+ export function normalizeContextPath(path) {
39
+ return normalizePath(path);
40
+ }
41
+ function normalizePath(path) {
42
+ return path.trim().replace(/^\.\//, "");
43
+ }
44
+ //# sourceMappingURL=context-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-files.js","sourceRoot":"","sources":["../src/context-files.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,uBAAuB;IACvB,sBAAsB;IACtB,mBAAmB;IACnB,uBAAuB;CACxB,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,8BAA8B;IAC9B,+BAA+B;IAC/B,2BAA2B;IAC3B,0BAA0B;CAC3B,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvC,OAAO,CACL,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/B,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;QAC9B,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC;QACtC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;QAC9B,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/B,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC;QAClC,UAAU,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACxC,4BAA4B,CAAC,IAAI,CAAC,UAAU,CAAC;QAC7C,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;QAClC,QAAQ,KAAK,gBAAgB;QAC7B,QAAQ,KAAK,mBAAmB;QAChC,QAAQ,KAAK,WAAW;QACxB,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAyB,EAAE,mBAA6B;IACjG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5I,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DevGuardConfig } from "./types.js";
2
+ export declare const defaultConfig: Required<DevGuardConfig>;
3
+ export declare function mergeConfig(config?: DevGuardConfig): Required<DevGuardConfig>;
@@ -0,0 +1,46 @@
1
+ export const defaultConfig = {
2
+ allowedPaths: [],
3
+ protectedPaths: [
4
+ "package-lock.json",
5
+ "yarn.lock",
6
+ "pnpm-lock.yaml",
7
+ ".github/",
8
+ "infra/",
9
+ "scripts/deploy"
10
+ ],
11
+ docPaths: [
12
+ "README.md",
13
+ "docs/PROJECT_STATE.md",
14
+ "docs/CURRENT_TASK.md",
15
+ "docs/DECISIONS.md",
16
+ "docs/DO_NOT_REPEAT.md"
17
+ ],
18
+ sourcePaths: ["src/", "packages/", "apps/", "lib/", "components/"],
19
+ docsRequiredFor: ["package.json", "pnpm-workspace.yaml", "tsconfig", "src/", "packages/", "apps/"],
20
+ riskIgnoredPaths: ["node_modules/", "dist/", ".next/", "coverage/", ".gitignore", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
21
+ ai: {
22
+ provider: "none",
23
+ model: "gpt-4o-mini",
24
+ temperature: 0.2,
25
+ maxTokens: 4000
26
+ }
27
+ };
28
+ export function mergeConfig(config) {
29
+ return {
30
+ allowedPaths: config?.allowedPaths ?? defaultConfig.allowedPaths,
31
+ protectedPaths: config?.protectedPaths ?? defaultConfig.protectedPaths,
32
+ docPaths: config?.docPaths ?? defaultConfig.docPaths,
33
+ sourcePaths: config?.sourcePaths ?? defaultConfig.sourcePaths,
34
+ docsRequiredFor: config?.docsRequiredFor ?? defaultConfig.docsRequiredFor,
35
+ riskIgnoredPaths: config?.riskIgnoredPaths ?? defaultConfig.riskIgnoredPaths,
36
+ ai: {
37
+ provider: config?.ai?.provider ?? defaultConfig.ai.provider,
38
+ model: config?.ai?.model ?? defaultConfig.ai.model,
39
+ temperature: config?.ai?.temperature ?? defaultConfig.ai.temperature,
40
+ maxTokens: config?.ai?.maxTokens ?? defaultConfig.ai.maxTokens,
41
+ reasoningEffort: config?.ai?.reasoningEffort ?? defaultConfig.ai.reasoningEffort,
42
+ baseURL: config?.ai?.baseURL ?? defaultConfig.ai.baseURL
43
+ }
44
+ };
45
+ }
46
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,YAAY,EAAE,EAAE;IAChB,cAAc,EAAE;QACd,mBAAmB;QACnB,WAAW;QACX,gBAAgB;QAChB,UAAU;QACV,QAAQ;QACR,gBAAgB;KACjB;IACD,QAAQ,EAAE;QACR,WAAW;QACX,uBAAuB;QACvB,sBAAsB;QACtB,mBAAmB;QACnB,uBAAuB;KACxB;IACD,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC;IAClE,eAAe,EAAE,CAAC,cAAc,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC;IAClG,gBAAgB,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,gBAAgB,CAAC;IACrI,EAAE,EAAE;QACF,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,IAAI;KAChB;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,OAAO;QACL,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,aAAa,CAAC,YAAY;QAChE,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,aAAa,CAAC,cAAc;QACtE,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,aAAa,CAAC,QAAQ;QACpD,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,aAAa,CAAC,WAAW;QAC7D,eAAe,EAAE,MAAM,EAAE,eAAe,IAAI,aAAa,CAAC,eAAe;QACzE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,aAAa,CAAC,gBAAgB;QAC5E,EAAE,EAAE;YACF,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,IAAI,aAAa,CAAC,EAAE,CAAC,QAAQ;YAC3D,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,aAAa,CAAC,EAAE,CAAC,KAAK;YAClD,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,IAAI,aAAa,CAAC,EAAE,CAAC,WAAW;YACpE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,IAAI,aAAa,CAAC,EAAE,CAAC,SAAS;YAC9D,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,IAAI,aAAa,CAAC,EAAE,CAAC,eAAe;YAChF,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,OAAO;SACzD;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ChangeFile, CodeGraphEntry, InferredDiffIntent, InferredDiffIntentClusters, TaskTypeResult } from "./types.js";
2
+ export declare function inferDiffIntent(input: {
3
+ changedFiles: string[];
4
+ changeFiles?: ChangeFile[];
5
+ diffText: string;
6
+ codeGraph?: CodeGraphEntry[];
7
+ }): InferredDiffIntent;
8
+ export declare function inferDiffIntentClusters(input: {
9
+ changedFiles: string[];
10
+ changeFiles?: ChangeFile[];
11
+ diffText: string;
12
+ codeGraph?: CodeGraphEntry[];
13
+ taskText?: string;
14
+ }): InferredDiffIntentClusters;
15
+ export declare function inferredIntentToRequirement(intent: InferredDiffIntent): string;
16
+ export declare function inferredIntentToTaskType(intent: InferredDiffIntent): TaskTypeResult;
17
+ export declare function formatInferredDiffIntent(intent: InferredDiffIntent): string;
18
+ export declare function formatInferredDiffIntentClusters(clusters: InferredDiffIntentClusters): string;
19
+ export declare function filterDiffTextForFiles(diffText: string, files: string[]): string;