@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
package/dist/git.js ADDED
@@ -0,0 +1,235 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ export async function getChangedFiles(cwd) {
5
+ const changes = await getGitChanges(cwd);
6
+ return changes.changedFiles;
7
+ }
8
+ export async function getDiff(cwd) {
9
+ const changes = await getGitChanges(cwd);
10
+ return changes.diffText;
11
+ }
12
+ export async function getProjectFiles(cwd) {
13
+ await assertGitRepo(cwd);
14
+ const output = await git(cwd, ["ls-files", "--cached", "--others", "--exclude-standard"]);
15
+ return [...new Set(output.split("\n").map((line) => line.trim()).filter(Boolean))]
16
+ .filter(isProjectFile)
17
+ .sort()
18
+ .slice(0, 500);
19
+ }
20
+ export async function getGitIdentity(cwd) {
21
+ await assertGitRepo(cwd);
22
+ const [gitHead, gitBranch] = await Promise.all([
23
+ git(cwd, ["rev-parse", "--short", "HEAD"]).catch(() => ""),
24
+ git(cwd, ["branch", "--show-current"]).catch(() => "")
25
+ ]);
26
+ return {
27
+ gitHead: gitHead.trim(),
28
+ gitBranch: gitBranch.trim()
29
+ };
30
+ }
31
+ export async function getGitRemoteOrigin(cwd) {
32
+ await assertGitRepo(cwd);
33
+ return (await git(cwd, ["config", "--get", "remote.origin.url"]).catch(() => "")).trim();
34
+ }
35
+ export async function hasGitBaseline(cwd) {
36
+ await assertGitRepo(cwd);
37
+ return git(cwd, ["rev-parse", "--verify", "HEAD"]).then(() => true).catch(() => false);
38
+ }
39
+ export async function getGitChanges(cwd) {
40
+ await assertGitRepo(cwd);
41
+ const [workingTreeNameOnly, workingTreeNameStatus, stagedNameOnly, stagedNameStatus, untrackedOutput, workingTreeDiffText, stagedDiffText] = await Promise.all([
42
+ git(cwd, ["diff", "--name-only"]),
43
+ git(cwd, ["diff", "--name-status", "-M"]),
44
+ git(cwd, ["diff", "--cached", "--name-only"]),
45
+ git(cwd, ["diff", "--cached", "--name-status", "-M"]),
46
+ git(cwd, ["ls-files", "--others", "--exclude-standard"]),
47
+ git(cwd, ["diff"]),
48
+ git(cwd, ["diff", "--cached"])
49
+ ]);
50
+ const changeFiles = [
51
+ ...mergeNameOnlyFallback(parseNameStatus(workingTreeNameStatus, "workingTree"), workingTreeNameOnly, "workingTree"),
52
+ ...mergeNameOnlyFallback(parseNameStatus(stagedNameStatus, "staged"), stagedNameOnly, "staged"),
53
+ ...parseUntracked(untrackedOutput)
54
+ ];
55
+ const changedFiles = [...new Set(changeFiles.map((file) => file.path))].sort();
56
+ const untrackedSummary = parseUntracked(untrackedOutput)
57
+ .map((file) => `Untracked file: ${file.path} - 새 파일 생성됨`)
58
+ .join("\n");
59
+ const diffText = [workingTreeDiffText, stagedDiffText, untrackedSummary].filter((text) => text.trim().length > 0).join("\n\n");
60
+ return {
61
+ changedFiles,
62
+ changeFiles,
63
+ diffText,
64
+ workingTreeDiffText,
65
+ stagedDiffText
66
+ };
67
+ }
68
+ export async function getStagedGitChanges(cwd) {
69
+ await assertGitRepo(cwd);
70
+ const [stagedNameOnly, stagedNameStatus, stagedDiffText] = await Promise.all([
71
+ git(cwd, ["diff", "--cached", "--name-only"]),
72
+ git(cwd, ["diff", "--cached", "--name-status", "-M"]),
73
+ git(cwd, ["diff", "--cached"])
74
+ ]);
75
+ const changeFiles = mergeNameOnlyFallback(parseNameStatus(stagedNameStatus, "staged"), stagedNameOnly, "staged");
76
+ const changedFiles = [...new Set(changeFiles.map((file) => file.path))].sort();
77
+ return {
78
+ changedFiles,
79
+ changeFiles,
80
+ diffText: stagedDiffText,
81
+ workingTreeDiffText: "",
82
+ stagedDiffText
83
+ };
84
+ }
85
+ export async function getCommitGitChanges(cwd, ref) {
86
+ await assertGitRepo(cwd);
87
+ const range = `${ref}..HEAD`;
88
+ const [nameOnly, nameStatus, diffText] = await Promise.all([
89
+ git(cwd, ["diff", "--name-only", range]),
90
+ git(cwd, ["diff", "--name-status", "-M", range]),
91
+ git(cwd, ["diff", range])
92
+ ]);
93
+ const changeFiles = mergeNameOnlyFallback(parseNameStatus(nameStatus, "workingTree"), nameOnly, "workingTree");
94
+ const changedFiles = [...new Set(changeFiles.map((file) => file.path))].sort();
95
+ return {
96
+ changedFiles,
97
+ changeFiles,
98
+ diffText,
99
+ workingTreeDiffText: diffText,
100
+ stagedDiffText: ""
101
+ };
102
+ }
103
+ export async function getDiffForChangeFiles(cwd, changeFiles, options = {}) {
104
+ await assertGitRepo(cwd);
105
+ const paths = [...new Set(changeFiles.flatMap((file) => [file.path, file.oldPath].filter((path) => Boolean(path))))].sort();
106
+ if (paths.length === 0) {
107
+ return "";
108
+ }
109
+ if (options.commitRef) {
110
+ return git(cwd, ["diff", `${options.commitRef}..HEAD`, "--", ...paths]);
111
+ }
112
+ if (options.stagedOnly) {
113
+ return git(cwd, ["diff", "--cached", "--", ...paths]);
114
+ }
115
+ const workingTreePaths = changeFiles.filter((file) => file.source === "workingTree").map((file) => file.path);
116
+ const stagedPaths = changeFiles.filter((file) => file.source === "staged").map((file) => file.path);
117
+ const untrackedSummary = changeFiles
118
+ .filter((file) => file.source === "untracked")
119
+ .map((file) => `Untracked file: ${file.path} - 새 파일 생성됨`)
120
+ .join("\n");
121
+ const [workingTreeDiff, stagedDiff] = await Promise.all([
122
+ workingTreePaths.length > 0 ? git(cwd, ["diff", "--", ...workingTreePaths]) : Promise.resolve(""),
123
+ stagedPaths.length > 0 ? git(cwd, ["diff", "--cached", "--", ...stagedPaths]) : Promise.resolve("")
124
+ ]);
125
+ return [workingTreeDiff, stagedDiff, untrackedSummary].filter((text) => text.trim().length > 0).join("\n\n");
126
+ }
127
+ function isProjectFile(path) {
128
+ if (path.startsWith("node_modules/") ||
129
+ path.startsWith(".next/") ||
130
+ path.startsWith("dist/") ||
131
+ path.startsWith("build/") ||
132
+ path.startsWith("coverage/")) {
133
+ return false;
134
+ }
135
+ if (/^(package-lock|pnpm-lock|yarn)\.json$/.test(path) || path === "pnpm-lock.yaml" || path === "yarn.lock") {
136
+ return false;
137
+ }
138
+ if (/\.(png|jpe?g|gif|webp|avif|ico|svg|ttf|otf|woff2?|mp4|mov|mp3|wav|pdf)$/i.test(path)) {
139
+ return false;
140
+ }
141
+ const allowedRoots = /^(app|apps|components|lib|hooks|utils|supabase|styles|constants|public|src|packages)\//;
142
+ const allowedRootFile = /^(next\.config|vite\.config|tsconfig|tailwind\.config|postcss\.config|eslint\.config|biome\.json|package\.json|README\.md)/;
143
+ const allowedExtension = /\.(ts|tsx|js|jsx|mjs|cjs|json|md|css|scss|sass|sql|toml|ya?ml)$/i;
144
+ return (allowedRoots.test(path) || allowedRootFile.test(path)) && allowedExtension.test(path);
145
+ }
146
+ function mergeNameOnlyFallback(parsed, nameOnlyOutput, source) {
147
+ const knownPaths = new Set(parsed.map((file) => file.path));
148
+ const fallbackFiles = nameOnlyOutput
149
+ .split("\n")
150
+ .map((line) => line.trim())
151
+ .filter(Boolean)
152
+ .filter((path) => !knownPaths.has(path))
153
+ .map((path) => ({
154
+ path,
155
+ status: "modified",
156
+ source
157
+ }));
158
+ return [...parsed, ...fallbackFiles];
159
+ }
160
+ async function assertGitRepo(cwd) {
161
+ try {
162
+ await git(cwd, ["rev-parse", "--is-inside-work-tree"]);
163
+ }
164
+ catch {
165
+ throw new Error("현재 디렉터리는 git 저장소가 아닙니다. git 저장소 안에서 dev-guard를 실행해 주세요.");
166
+ }
167
+ }
168
+ function parseNameStatus(output, source) {
169
+ return output
170
+ .split("\n")
171
+ .map((line) => line.trim())
172
+ .filter(Boolean)
173
+ .map((line) => {
174
+ const parts = line.split(/\s+/);
175
+ const rawStatus = parts[0] ?? "M";
176
+ const status = parseStatus(rawStatus);
177
+ if (status === "renamed") {
178
+ return {
179
+ path: parts[2] ?? parts[1] ?? "",
180
+ oldPath: parts[1],
181
+ status,
182
+ source
183
+ };
184
+ }
185
+ return {
186
+ path: parts[1] ?? "",
187
+ status,
188
+ source
189
+ };
190
+ })
191
+ .filter((file) => file.path.length > 0);
192
+ }
193
+ function parseUntracked(output) {
194
+ return output
195
+ .split("\n")
196
+ .map((line) => line.trim())
197
+ .filter(Boolean)
198
+ .map((path) => ({
199
+ path,
200
+ status: "untracked",
201
+ source: "untracked"
202
+ }));
203
+ }
204
+ function parseStatus(rawStatus) {
205
+ const status = rawStatus[0];
206
+ if (status === "A") {
207
+ return "added";
208
+ }
209
+ if (status === "D") {
210
+ return "deleted";
211
+ }
212
+ if (status === "R") {
213
+ return "renamed";
214
+ }
215
+ if (status === "C") {
216
+ return "added";
217
+ }
218
+ return "modified";
219
+ }
220
+ async function git(cwd, args) {
221
+ try {
222
+ const { stdout } = await execFileAsync("git", ["-c", "core.quotePath=false", ...args], { cwd, maxBuffer: 20 * 1024 * 1024 });
223
+ return stdout;
224
+ }
225
+ catch (error) {
226
+ if (isGitFailure(error)) {
227
+ throw new Error(`git ${args.join(" ")} failed: ${error.stderr || error.message}`);
228
+ }
229
+ throw error;
230
+ }
231
+ }
232
+ function isGitFailure(error) {
233
+ return error instanceof Error;
234
+ }
235
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ interface InstallHooksResult {
2
+ created: string[];
3
+ skipped: string[];
4
+ reportPath: string;
5
+ }
6
+ type InstallAgent = "claude" | "codex" | "codex-notify" | "all" | "auto";
7
+ export interface HookStatus {
8
+ claudeInstalled: boolean;
9
+ codexInstalled: boolean;
10
+ claudeHookFile: boolean;
11
+ codexHookFile: boolean;
12
+ lastTrigger?: string;
13
+ lastSuccess?: boolean;
14
+ claudeLastTrigger?: string;
15
+ claudeLastSuccess?: boolean;
16
+ codexLastTrigger?: string;
17
+ codexLastSuccess?: boolean;
18
+ }
19
+ export declare const claudeHookCommand = "${CLAUDE_PROJECT_DIR}/.devguard/hooks/claude-stop.sh";
20
+ export declare const codexHookCommand = "\"$(git rev-parse --show-toplevel)/.devguard/hooks/codex-stop.sh\"";
21
+ export declare const hookConfigPaths: {
22
+ readonly claudeSettingsPath: ".claude/settings.json";
23
+ readonly codexHooksPath: ".codex/hooks.json";
24
+ readonly claudeHookPath: ".devguard/hooks/claude-stop.sh";
25
+ readonly codexHookPath: ".devguard/hooks/codex-stop.sh";
26
+ readonly codexNotifyHookPath: ".devguard/hooks/codex-notify.sh";
27
+ readonly claudeLogPath: ".devguard/logs/claude-hook.log";
28
+ readonly codexLogPath: ".devguard/logs/codex-hook.log";
29
+ readonly codexNotifyLogPath: ".devguard/logs/codex-notify.log";
30
+ };
31
+ export declare function runInstallHooks(root: string, args: string[]): Promise<void>;
32
+ export declare function installHooks(root: string, options?: {
33
+ force?: boolean;
34
+ agent?: InstallAgent;
35
+ installDispatcher?: boolean;
36
+ }): Promise<InstallHooksResult>;
37
+ export declare function getHookStatus(root: string): Promise<HookStatus>;
38
+ export declare function writeHookStatusReport(root: string): Promise<string>;
39
+ export {};