@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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/agent-strategies.d.ts +23 -0
  4. package/dist/agent-strategies.js +130 -0
  5. package/dist/agent-strategies.js.map +1 -0
  6. package/dist/ai-context.d.ts +10 -0
  7. package/dist/ai-context.js +143 -0
  8. package/dist/ai-context.js.map +1 -0
  9. package/dist/check.d.ts +6 -0
  10. package/dist/check.js +89 -0
  11. package/dist/check.js.map +1 -0
  12. package/dist/clipboard.d.ts +6 -0
  13. package/dist/clipboard.js +43 -0
  14. package/dist/clipboard.js.map +1 -0
  15. package/dist/codex-notify.d.ts +23 -0
  16. package/dist/codex-notify.js +146 -0
  17. package/dist/codex-notify.js.map +1 -0
  18. package/dist/command-targets.d.ts +10 -0
  19. package/dist/command-targets.js +124 -0
  20. package/dist/command-targets.js.map +1 -0
  21. package/dist/config.d.ts +22 -0
  22. package/dist/config.js +180 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/configure.d.ts +1 -0
  25. package/dist/configure.js +79 -0
  26. package/dist/configure.js.map +1 -0
  27. package/dist/doctor.d.ts +1 -0
  28. package/dist/doctor.js +326 -0
  29. package/dist/doctor.js.map +1 -0
  30. package/dist/drift-telemetry.d.ts +13 -0
  31. package/dist/drift-telemetry.js +64 -0
  32. package/dist/drift-telemetry.js.map +1 -0
  33. package/dist/effective-task.d.ts +44 -0
  34. package/dist/effective-task.js +355 -0
  35. package/dist/effective-task.js.map +1 -0
  36. package/dist/fs.d.ts +10 -0
  37. package/dist/fs.js +58 -0
  38. package/dist/fs.js.map +1 -0
  39. package/dist/git.d.ts +24 -0
  40. package/dist/git.js +235 -0
  41. package/dist/git.js.map +1 -0
  42. package/dist/hooks.d.ts +39 -0
  43. package/dist/hooks.js +513 -0
  44. package/dist/hooks.js.map +1 -0
  45. package/dist/index.d.ts +2 -0
  46. package/dist/index.js +555 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/infer-task.d.ts +1 -0
  49. package/dist/infer-task.js +120 -0
  50. package/dist/infer-task.js.map +1 -0
  51. package/dist/init.d.ts +1 -0
  52. package/dist/init.js +50 -0
  53. package/dist/init.js.map +1 -0
  54. package/dist/install-agent-instructions.d.ts +1 -0
  55. package/dist/install-agent-instructions.js +113 -0
  56. package/dist/install-agent-instructions.js.map +1 -0
  57. package/dist/migration.d.ts +8 -0
  58. package/dist/migration.js +43 -0
  59. package/dist/migration.js.map +1 -0
  60. package/dist/paths.d.ts +38 -0
  61. package/dist/paths.js +41 -0
  62. package/dist/paths.js.map +1 -0
  63. package/dist/project-detection.d.ts +10 -0
  64. package/dist/project-detection.js +144 -0
  65. package/dist/project-detection.js.map +1 -0
  66. package/dist/project-identity.d.ts +7 -0
  67. package/dist/project-identity.js +93 -0
  68. package/dist/project-identity.js.map +1 -0
  69. package/dist/project-memory.d.ts +4 -0
  70. package/dist/project-memory.js +32 -0
  71. package/dist/project-memory.js.map +1 -0
  72. package/dist/prompt.d.ts +13 -0
  73. package/dist/prompt.js +125 -0
  74. package/dist/prompt.js.map +1 -0
  75. package/dist/refresh.d.ts +15 -0
  76. package/dist/refresh.js +146 -0
  77. package/dist/refresh.js.map +1 -0
  78. package/dist/report.d.ts +1 -0
  79. package/dist/report.js +109 -0
  80. package/dist/report.js.map +1 -0
  81. package/dist/review.d.ts +2 -0
  82. package/dist/review.js +653 -0
  83. package/dist/review.js.map +1 -0
  84. package/dist/rule-filter.d.ts +8 -0
  85. package/dist/rule-filter.js +79 -0
  86. package/dist/rule-filter.js.map +1 -0
  87. package/dist/runs.d.ts +21 -0
  88. package/dist/runs.js +142 -0
  89. package/dist/runs.js.map +1 -0
  90. package/dist/runtime-state.d.ts +69 -0
  91. package/dist/runtime-state.js +1383 -0
  92. package/dist/runtime-state.js.map +1 -0
  93. package/dist/scan.d.ts +1 -0
  94. package/dist/scan.js +55 -0
  95. package/dist/scan.js.map +1 -0
  96. package/dist/self.d.ts +3 -0
  97. package/dist/self.js +235 -0
  98. package/dist/self.js.map +1 -0
  99. package/dist/task-ai.d.ts +1 -0
  100. package/dist/task-ai.js +643 -0
  101. package/dist/task-ai.js.map +1 -0
  102. package/dist/telemetry.d.ts +1 -0
  103. package/dist/telemetry.js +11 -0
  104. package/dist/telemetry.js.map +1 -0
  105. package/dist/update.d.ts +6 -0
  106. package/dist/update.js +154 -0
  107. package/dist/update.js.map +1 -0
  108. package/dist/watch.d.ts +1 -0
  109. package/dist/watch.js +303 -0
  110. package/dist/watch.js.map +1 -0
  111. package/package.json +31 -0
@@ -0,0 +1,93 @@
1
+ import { createHash } from "node:crypto";
2
+ import { resolve } from "node:path";
3
+ import { fromRoot, readJsonFile, writeTextFile } from "./fs.js";
4
+ import { getGitRemoteOrigin } from "./git.js";
5
+ const identityPath = ".devguard/project-identity.json";
6
+ export async function buildProjectIdentity(root, projectFiles = []) {
7
+ const absoluteRoot = resolve(root);
8
+ const [origin, packageJson] = await Promise.all([
9
+ getGitRemoteOrigin(root).catch(() => ""),
10
+ readJsonFile(fromRoot(root, "package.json"), {})
11
+ ]);
12
+ const frameworkKeywords = inferFrameworkKeywords(packageJson, projectFiles);
13
+ const fingerprint = createHash("sha256")
14
+ .update(JSON.stringify({
15
+ root: absoluteRoot,
16
+ origin,
17
+ packageName: packageJson.name ?? "",
18
+ frameworkKeywords
19
+ }))
20
+ .digest("hex")
21
+ .slice(0, 16);
22
+ return {
23
+ root: absoluteRoot,
24
+ gitRemoteOrigin: origin || undefined,
25
+ packageName: packageJson.name,
26
+ frameworkKeywords,
27
+ fingerprint
28
+ };
29
+ }
30
+ export async function writeProjectIdentity(root, identity) {
31
+ await writeTextFile(fromRoot(root, identityPath), `${JSON.stringify(identity, null, 2)}\n`);
32
+ }
33
+ export async function readStoredProjectIdentity(root) {
34
+ const identity = await readJsonFile(fromRoot(root, identityPath), undefined);
35
+ return identity?.fingerprint ? identity : undefined;
36
+ }
37
+ export async function loadCurrentProjectIdentity(root, projectFiles = []) {
38
+ return buildProjectIdentity(root, projectFiles);
39
+ }
40
+ export function sameProjectIdentity(current, stored) {
41
+ if (!stored) {
42
+ return false;
43
+ }
44
+ return current.fingerprint === stored.fingerprint && resolve(current.root) === resolve(stored.root);
45
+ }
46
+ export function formatProjectIdentityWarning(source, current, stored) {
47
+ if (!stored) {
48
+ return `${source} has no project identity; run dev-guard scan to refresh project memory.`;
49
+ }
50
+ return `${source} project identity mismatch; ignoring cached context (current=${current.fingerprint}, cached=${stored.fingerprint}).`;
51
+ }
52
+ function inferFrameworkKeywords(packageJson, projectFiles) {
53
+ const dependencyNames = new Set([
54
+ ...Object.keys(packageJson.dependencies ?? {}),
55
+ ...Object.keys(packageJson.devDependencies ?? {})
56
+ ]);
57
+ const keywords = new Set();
58
+ const dependencyKeywordMap = [
59
+ ["next", "next"],
60
+ ["react", "react"],
61
+ ["vite", "vite"],
62
+ ["vue", "vue"],
63
+ ["nuxt", "nuxt"],
64
+ ["svelte", "svelte"],
65
+ ["astro", "astro"],
66
+ ["@remix-run/react", "remix"],
67
+ ["tailwindcss", "tailwind"],
68
+ ["@supabase/supabase-js", "supabase"],
69
+ ["typescript", "typescript"]
70
+ ];
71
+ for (const [dependency, keyword] of dependencyKeywordMap) {
72
+ if (dependencyNames.has(dependency)) {
73
+ keywords.add(keyword);
74
+ }
75
+ }
76
+ const fileHints = [
77
+ [/^app\//, "app-router"],
78
+ [/^pages\//, "pages-router"],
79
+ [/^supabase\//, "supabase"],
80
+ [/tailwind\.config/i, "tailwind"],
81
+ [/vite\.config/i, "vite"],
82
+ [/next\.config/i, "next"]
83
+ ];
84
+ for (const file of projectFiles) {
85
+ for (const [pattern, keyword] of fileHints) {
86
+ if (pattern.test(file)) {
87
+ keywords.add(keyword);
88
+ }
89
+ }
90
+ }
91
+ return [...keywords].sort();
92
+ }
93
+ //# sourceMappingURL=project-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-identity.js","sourceRoot":"","sources":["../src/project-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ProjectScanInputFile } from "@dev-guard/core";
2
+ export declare function readScanInputFile(root: string, path: string): Promise<ProjectScanInputFile>;
3
+ export declare function fileExists(root: string, path: string): Promise<boolean>;
4
+ export declare function readFileHash(root: string, path: string): Promise<string>;
@@ -0,0 +1,32 @@
1
+ import { createHash } from "node:crypto";
2
+ import { access } from "node:fs/promises";
3
+ import { fileMetadata, fromRoot, readTextFile } from "./fs.js";
4
+ const maxScanFileCharacters = 20000;
5
+ export async function readScanInputFile(root, path) {
6
+ const fullPath = fromRoot(root, path);
7
+ const [metadata, fullContent] = await Promise.all([fileMetadata(fullPath), readTextFile(fullPath)]);
8
+ const content = fullContent.slice(0, maxScanFileCharacters);
9
+ return {
10
+ path,
11
+ content,
12
+ size: metadata.size,
13
+ lastModified: metadata.lastModified,
14
+ hash: hashText(fullContent)
15
+ };
16
+ }
17
+ export async function fileExists(root, path) {
18
+ try {
19
+ await access(fromRoot(root, path));
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ export async function readFileHash(root, path) {
27
+ return hashText(await readTextFile(fromRoot(root, path)));
28
+ }
29
+ function hashText(text) {
30
+ return createHash("sha256").update(text).digest("hex");
31
+ }
32
+ //# sourceMappingURL=project-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-memory.js","sourceRoot":"","sources":["../src/project-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAY;IAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpG,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAE5D,OAAO;QACL,IAAI;QACJ,OAAO;QACP,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY;IACzD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY;IAC3D,OAAO,QAAQ,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,13 @@
1
+ interface PromptOptions {
2
+ copy: boolean;
3
+ compact: boolean;
4
+ ultraCompact: boolean;
5
+ density?: "ultra" | "compact" | "verbose";
6
+ includeContextFiles: boolean;
7
+ saveRun: boolean;
8
+ maxPromptTokens?: number;
9
+ output?: string;
10
+ }
11
+ export declare function runPrompt(root: string, options: PromptOptions): Promise<void>;
12
+ export declare function parsePromptOptions(args: string[]): PromptOptions;
13
+ export {};
package/dist/prompt.js ADDED
@@ -0,0 +1,125 @@
1
+ import { buildImpactHints, filterDevGuardContextFiles, generateCodexPrompt } from "@dev-guard/core";
2
+ import { copyTextToClipboard } from "./clipboard.js";
3
+ import { fromRoot, readJsonFile, readTextFile, writeTextFile } from "./fs.js";
4
+ import { getGitChanges } from "./git.js";
5
+ import { loadCurrentProjectIdentity } from "./project-identity.js";
6
+ import { filterRelevantMarkdown } from "./rule-filter.js";
7
+ import { createRunLog, logRunSaved, upsertLatestRun } from "./runs.js";
8
+ export async function runPrompt(root, options) {
9
+ const [gitChanges, task, rules, mistakes, projectState, decisions, identity, codeGraph] = await Promise.all([
10
+ getGitChanges(root),
11
+ readMarkdown(root, ".devguard/task.md"),
12
+ readMarkdown(root, ".devguard/rules.md"),
13
+ readMarkdown(root, ".devguard/mistakes.md"),
14
+ readMarkdown(root, "docs/PROJECT_STATE.md"),
15
+ readMarkdown(root, "docs/DECISIONS.md"),
16
+ loadCurrentProjectIdentity(root).catch(() => undefined),
17
+ readJsonFile(fromRoot(root, ".devguard/code-graph.json"), [])
18
+ ]);
19
+ const impactHints = buildImpactHints(gitChanges.changedFiles, codeGraph);
20
+ const missingFiles = [task, rules, mistakes, projectState, decisions].filter((result) => result.missing);
21
+ for (const file of missingFiles) {
22
+ console.error(`dev-guard warning: ${file.path} not found; using empty content.`);
23
+ }
24
+ const relevanceText = [task.content, gitChanges.changedFiles.join("\n"), projectState.content, decisions.content].join("\n");
25
+ const filteredRules = filterRelevantMarkdown(rules.content, relevanceText, identity);
26
+ const filteredMistakes = filterRelevantMarkdown(mistakes.content, relevanceText, identity);
27
+ const prompt = generateCodexPrompt({
28
+ taskMarkdown: task.content,
29
+ rulesMarkdown: filteredRules.filteredMarkdown,
30
+ mistakesMarkdown: filteredMistakes.filteredMarkdown,
31
+ projectStateMarkdown: projectState.content,
32
+ decisionsMarkdown: decisions.content,
33
+ changedFiles: gitChanges.changedFiles,
34
+ changeFiles: gitChanges.changeFiles,
35
+ diffText: gitChanges.diffText,
36
+ compact: options.compact,
37
+ ultraCompact: options.ultraCompact,
38
+ density: options.density,
39
+ maxPromptTokens: options.maxPromptTokens,
40
+ includeContextFiles: options.includeContextFiles,
41
+ impactHints
42
+ });
43
+ if (options.output) {
44
+ await writeTextFile(fromRoot(root, options.output), prompt.promptText);
45
+ console.error(`dev-guard prompt: wrote ${options.output}`);
46
+ }
47
+ if (options.copy) {
48
+ const result = await copyTextToClipboard(prompt.promptText);
49
+ if (result.ok) {
50
+ console.error("dev-guard prompt: copied to clipboard.");
51
+ }
52
+ else {
53
+ console.error(`dev-guard prompt: clipboard copy failed (${result.reason}). Printing prompt to stdout instead.`);
54
+ }
55
+ }
56
+ if (options.saveRun || options.copy || options.output) {
57
+ const save = options.saveRun ? createRunLog : upsertLatestRun;
58
+ const relatedChangeFiles = filterDevGuardContextFiles(gitChanges.changeFiles, options.includeContextFiles);
59
+ const relatedFiles = [...new Set(relatedChangeFiles.map((file) => file.path))].sort();
60
+ const run = await save(root, {
61
+ command: "prompt",
62
+ userRequest: options.saveRun ? "Generated Codex prompt from current dev-guard context." : undefined,
63
+ generatedTaskMarkdown: task.content,
64
+ generatedCodexPrompt: prompt.promptText,
65
+ relatedFiles,
66
+ changedFilesAtCreation: relatedFiles,
67
+ projectIdentity: identity,
68
+ status: "created"
69
+ });
70
+ logRunSaved(run);
71
+ }
72
+ console.log(prompt.promptText);
73
+ }
74
+ export function parsePromptOptions(args) {
75
+ const options = {
76
+ copy: args.includes("--copy"),
77
+ compact: true,
78
+ ultraCompact: args.includes("--ultra-compact"),
79
+ density: parseDensityOption(args),
80
+ includeContextFiles: args.includes("--include-context-files"),
81
+ saveRun: args.includes("--save-run"),
82
+ maxPromptTokens: parseNumberOption(args, "--max-prompt-tokens")
83
+ };
84
+ const outputIndex = args.indexOf("--output");
85
+ if (outputIndex >= 0) {
86
+ const output = args[outputIndex + 1];
87
+ if (!output || output.startsWith("--")) {
88
+ throw new Error("dev-guard prompt --output 옵션에는 파일 경로가 필요합니다.");
89
+ }
90
+ options.output = output;
91
+ }
92
+ return options;
93
+ }
94
+ function parseDensityOption(args) {
95
+ const index = args.indexOf("--density");
96
+ if (index < 0) {
97
+ return undefined;
98
+ }
99
+ const value = args[index + 1];
100
+ if (value !== "ultra" && value !== "compact" && value !== "verbose") {
101
+ throw new Error("dev-guard prompt --density 옵션은 ultra, compact, verbose 중 하나여야 합니다.");
102
+ }
103
+ return value;
104
+ }
105
+ function parseNumberOption(args, flag) {
106
+ const index = args.indexOf(flag);
107
+ if (index < 0) {
108
+ return undefined;
109
+ }
110
+ const value = Number(args[index + 1]);
111
+ if (!Number.isFinite(value) || value <= 0) {
112
+ throw new Error(`dev-guard prompt ${flag} 옵션에는 양수 값이 필요합니다.`);
113
+ }
114
+ return value;
115
+ }
116
+ async function readMarkdown(root, path) {
117
+ const sentinel = "\0__DEV_GUARD_MISSING__\0";
118
+ const content = await readTextFile(fromRoot(root, path), sentinel);
119
+ return {
120
+ path,
121
+ content: content === sentinel ? "" : content,
122
+ missing: content === sentinel
123
+ };
124
+ }
125
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface RefreshOptions {
2
+ full: boolean;
3
+ ai: boolean;
4
+ dryRun: boolean;
5
+ }
6
+ export interface RefreshResult {
7
+ mode: "incremental" | "full";
8
+ ai: boolean;
9
+ dryRun: boolean;
10
+ updatedPaths: string[];
11
+ removedPaths: string[];
12
+ unchangedCount: number;
13
+ }
14
+ export declare function runRefresh(root: string, args: string[]): Promise<void>;
15
+ export declare function refreshProjectMemory(root: string, options: RefreshOptions): Promise<RefreshResult>;
@@ -0,0 +1,146 @@
1
+ import { buildProjectScan, refreshProjectScan } from "@dev-guard/core";
2
+ import { writeAIContext } from "./ai-context.js";
3
+ import { loadConfig } from "./config.js";
4
+ import { fileMetadata, fromRoot, readJsonFile, writeTextFile } from "./fs.js";
5
+ import { getGitChanges, getProjectFiles } from "./git.js";
6
+ import { fileExists, readFileHash, readScanInputFile } from "./project-memory.js";
7
+ import { loadCurrentProjectIdentity, writeProjectIdentity } from "./project-identity.js";
8
+ export async function runRefresh(root, args) {
9
+ const options = parseRefreshOptions(args);
10
+ const result = await refreshProjectMemory(root, options);
11
+ printRefreshPlan(result);
12
+ }
13
+ export async function refreshProjectMemory(root, options) {
14
+ const resolvedConfig = await loadConfig(root);
15
+ const config = resolvedConfig.config;
16
+ for (const warning of resolvedConfig.warnings) {
17
+ console.error(`dev-guard refresh: warning: ${warning}`);
18
+ }
19
+ const [existingIndex, existingSummaries, existingCodeGraph] = await Promise.all([
20
+ readJsonFile(fromRoot(root, ".devguard/project-index.json"), []),
21
+ readJsonFile(fromRoot(root, ".devguard/file-summaries.json"), []),
22
+ readJsonFile(fromRoot(root, ".devguard/code-graph.json"), [])
23
+ ]);
24
+ if (options.full || existingIndex.length === 0 || existingCodeGraph.length === 0) {
25
+ return runFullRefresh(root, options, config);
26
+ }
27
+ const [gitChanges, projectFiles] = await Promise.all([getGitChanges(root), getProjectFiles(root)]);
28
+ const projectFileSet = new Set(projectFiles);
29
+ const changedPaths = new Set();
30
+ const removedPaths = new Set();
31
+ for (const change of gitChanges.changeFiles) {
32
+ if (change.oldPath) {
33
+ removedPaths.add(change.oldPath);
34
+ }
35
+ if (change.status === "deleted") {
36
+ removedPaths.add(change.path);
37
+ continue;
38
+ }
39
+ if (projectFileSet.has(change.path)) {
40
+ changedPaths.add(change.path);
41
+ }
42
+ }
43
+ let unchangedCount = 0;
44
+ for (const entry of existingIndex) {
45
+ if (removedPaths.has(entry.path)) {
46
+ continue;
47
+ }
48
+ if (!(await fileExists(root, entry.path))) {
49
+ removedPaths.add(entry.path);
50
+ continue;
51
+ }
52
+ if (changedPaths.has(entry.path)) {
53
+ continue;
54
+ }
55
+ const metadata = await fileMetadata(fromRoot(root, entry.path));
56
+ const hash = await readFileHash(root, entry.path);
57
+ if (entry.lastModified !== metadata.lastModified || entry.hash !== hash) {
58
+ changedPaths.add(entry.path);
59
+ }
60
+ else {
61
+ unchangedCount += 1;
62
+ }
63
+ }
64
+ const updatedPaths = [...changedPaths].filter((path) => projectFileSet.has(path)).sort();
65
+ const removed = [...removedPaths].sort();
66
+ const result = {
67
+ mode: "incremental",
68
+ ai: options.ai && config.ai?.provider !== "none",
69
+ dryRun: options.dryRun,
70
+ updatedPaths,
71
+ removedPaths: removed,
72
+ unchangedCount
73
+ };
74
+ if (options.dryRun) {
75
+ return result;
76
+ }
77
+ const updatedFiles = await Promise.all(updatedPaths.map((path) => readScanInputFile(root, path)));
78
+ const refreshed = refreshProjectScan({
79
+ existingIndex,
80
+ existingSummaries,
81
+ existingCodeGraph,
82
+ updatedFiles,
83
+ removedPaths: removed
84
+ });
85
+ await writeMemoryFiles(root, refreshed.index, refreshed.summaries, refreshed.projectMapMarkdown, refreshed.codeGraph);
86
+ await writeAIContext(root).catch(() => undefined);
87
+ return result;
88
+ }
89
+ function parseRefreshOptions(args) {
90
+ return {
91
+ full: args.includes("--full"),
92
+ ai: args.includes("--ai"),
93
+ dryRun: args.includes("--dry-run")
94
+ };
95
+ }
96
+ async function runFullRefresh(root, options, config) {
97
+ const projectFiles = await getProjectFiles(root);
98
+ const inputFiles = await Promise.all(projectFiles.map((path) => readScanInputFile(root, path)));
99
+ const scan = buildProjectScan(inputFiles);
100
+ const result = {
101
+ mode: "full",
102
+ ai: options.ai && config.ai?.provider !== "none",
103
+ dryRun: options.dryRun,
104
+ updatedPaths: scan.index.map((entry) => entry.path),
105
+ removedPaths: [],
106
+ unchangedCount: 0
107
+ };
108
+ if (options.dryRun) {
109
+ return result;
110
+ }
111
+ await writeMemoryFiles(root, scan.index, scan.summaries, scan.projectMapMarkdown, scan.codeGraph);
112
+ await writeAIContext(root).catch(() => undefined);
113
+ return result;
114
+ }
115
+ async function writeMemoryFiles(root, index, summaries, projectMapMarkdown, codeGraph) {
116
+ const identity = await loadCurrentProjectIdentity(root, index.map((entry) => entry.path));
117
+ await Promise.all([
118
+ writeTextFile(fromRoot(root, ".devguard/project-index.json"), `${JSON.stringify(index, null, 2)}\n`),
119
+ writeTextFile(fromRoot(root, ".devguard/file-summaries.json"), `${JSON.stringify(summaries, null, 2)}\n`),
120
+ writeTextFile(fromRoot(root, ".devguard/code-graph.json"), `${JSON.stringify(codeGraph, null, 2)}\n`),
121
+ writeTextFile(fromRoot(root, ".devguard/project-map.md"), projectMapMarkdown),
122
+ writeProjectIdentity(root, identity)
123
+ ]);
124
+ }
125
+ function printRefreshPlan(plan) {
126
+ console.log("dev-guard refresh");
127
+ console.log(`- mode: ${plan.mode}`);
128
+ console.log(`- dry-run: ${plan.dryRun ? "yes" : "no"}`);
129
+ console.log(`- summaries: ${plan.ai ? "rule-based (AI summary hook reserved)" : "rule-based"}`);
130
+ console.log(`- updated summaries: ${plan.updatedPaths.length}`);
131
+ console.log(`- removed summaries: ${plan.removedPaths.length}`);
132
+ console.log(`- unchanged files skipped: ${plan.unchangedCount}`);
133
+ console.log("- writes: .devguard/project-index.json, .devguard/file-summaries.json, .devguard/code-graph.json, .devguard/project-map.md, .devguard/project-identity.json, .devguard/AI_CONTEXT.md");
134
+ console.log("- reason: keep project memory current for task-ai/review/report");
135
+ if (plan.updatedPaths.length > 0) {
136
+ console.log(`- updated files: ${plan.updatedPaths.join(", ")}`);
137
+ }
138
+ if (plan.removedPaths.length > 0) {
139
+ console.log(`- removed files: ${plan.removedPaths.join(", ")}`);
140
+ }
141
+ if (plan.updatedPaths.length === 0 && plan.removedPaths.length === 0) {
142
+ console.log("- skipped: no changed project files detected");
143
+ }
144
+ console.log("- next: run dev-guard check or dev-guard report");
145
+ }
146
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runReport(root: string, args: string[]): Promise<void>;
package/dist/report.js ADDED
@@ -0,0 +1,109 @@
1
+ import { analyzeDiff, defaultConfig, filterDevGuardContextFiles, generateCompactReport } from "@dev-guard/core";
2
+ import { copyTextToClipboard } from "./clipboard.js";
3
+ import { fromRoot, readJsonFile, readTextFile } from "./fs.js";
4
+ import { getCommitGitChanges, getGitChanges } from "./git.js";
5
+ import { loadCurrentProjectIdentity } from "./project-identity.js";
6
+ import { formatEffectiveTaskContext, resolveEffectiveTaskContext } from "./effective-task.js";
7
+ export async function runReport(root, args) {
8
+ const options = parseReportOptions(args);
9
+ const [gitChanges, taskText, rulesText, config, codeGraph, currentIdentity] = await Promise.all([
10
+ options.since ? getCommitGitChanges(root, options.since) : getGitChanges(root),
11
+ readTextFile(fromRoot(root, ".devguard/task.md")),
12
+ readTextFile(fromRoot(root, ".devguard/rules.md")),
13
+ readJsonFile(fromRoot(root, ".devguard/config.json"), defaultConfig),
14
+ readJsonFile(fromRoot(root, ".devguard/code-graph.json"), []),
15
+ loadCurrentProjectIdentity(root).catch(() => undefined)
16
+ ]);
17
+ const reportChangeFiles = filterDevGuardContextFiles(gitChanges.changeFiles, false);
18
+ const changedFiles = [...new Set(reportChangeFiles.map((file) => file.path))].sort();
19
+ const effective = await resolveEffectiveTaskContext({
20
+ root,
21
+ taskMarkdown: taskText,
22
+ gitChanges: { diffText: gitChanges.diffText, changedFiles, changeFiles: reportChangeFiles },
23
+ changedFiles,
24
+ reviewChangeFiles: reportChangeFiles,
25
+ codeGraph,
26
+ currentIdentity
27
+ });
28
+ const effectiveTaskText = effective.effectiveTaskMarkdown;
29
+ const anchorMode = effective.useTaskMarkdown ? "task-first" : "diff-first";
30
+ const checkReport = analyzeDiff({
31
+ changedFiles: gitChanges.changedFiles,
32
+ changeFiles: gitChanges.changeFiles,
33
+ diffText: gitChanges.diffText,
34
+ taskText: effectiveTaskText,
35
+ rulesText,
36
+ config,
37
+ includeContextFiles: false
38
+ });
39
+ const report = generateCompactReport({
40
+ taskMarkdown: effectiveTaskText,
41
+ changedFiles,
42
+ checkReport,
43
+ runLog: effective.effectiveRunLog,
44
+ scanStale: false,
45
+ anchorMode
46
+ });
47
+ if (changedFiles.length > 0) {
48
+ for (const line of formatEffectiveTaskContext("dev-guard report", effective)) {
49
+ console.error(line);
50
+ }
51
+ if (effective.runSelection.warning) {
52
+ console.error(`dev-guard report: warning: ${effective.runSelection.warning}`);
53
+ }
54
+ }
55
+ const output = options.json ? `${JSON.stringify(report, null, 2)}\n` : options.compact ? formatCompactReport(report) : formatReport(report);
56
+ if (options.copy) {
57
+ const result = await copyTextToClipboard(output);
58
+ if (result.ok) {
59
+ console.error("dev-guard report: copied to clipboard.");
60
+ }
61
+ else {
62
+ console.error(`dev-guard report: clipboard copy failed (${result.reason}).`);
63
+ }
64
+ }
65
+ console.log(output.trimEnd());
66
+ }
67
+ function parseReportOptions(args) {
68
+ const sinceIndex = args.indexOf("--since");
69
+ const since = sinceIndex >= 0 ? args[sinceIndex + 1] : undefined;
70
+ if (sinceIndex >= 0 && (!since || since.startsWith("--"))) {
71
+ throw new Error("dev-guard report --since 옵션에는 기준 ref가 필요합니다.");
72
+ }
73
+ return {
74
+ compact: args.includes("--compact"),
75
+ copy: args.includes("--copy"),
76
+ json: args.includes("--json"),
77
+ since
78
+ };
79
+ }
80
+ function formatCompactReport(report) {
81
+ const changed = report.changedFiles.length > 0 ? report.changedFiles.slice(0, 5).join(", ") : "none";
82
+ const more = report.changedFiles.length > 5 ? ` (+${report.changedFiles.length - 5})` : "";
83
+ return [
84
+ `Task: ${report.task}`,
85
+ `Request: ${report.userRequest}`,
86
+ `Changed: ${changed}${more}`,
87
+ `Check: ${report.check}`,
88
+ `Review: ${report.review}`,
89
+ `Run: ${report.runId}`,
90
+ `Next: ${report.nextAction}`
91
+ ].join("\n");
92
+ }
93
+ function formatReport(report) {
94
+ return [
95
+ "dev-guard report",
96
+ "",
97
+ `Current task: ${report.task}`,
98
+ `User request: ${report.userRequest}`,
99
+ `Run id: ${report.runId}`,
100
+ "",
101
+ "Changed files:",
102
+ ...(report.changedFiles.length > 0 ? report.changedFiles.map((file) => `- ${file}`) : ["- none"]),
103
+ "",
104
+ `Check: ${report.check}`,
105
+ `Latest review: ${report.review}`,
106
+ `Suggested next action: ${report.nextAction}`
107
+ ].join("\n");
108
+ }
109
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReview(root: string, args: string[]): Promise<void>;
2
+ export declare function runFixPrompt(root: string, args: string[]): Promise<void>;