@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,120 @@
|
|
|
1
|
+
import { formatInferredDiffIntentClusters, inferredIntentToRequirement } from "@dev-guard/core";
|
|
2
|
+
import { writeAIContext } from "./ai-context.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 { formatEffectiveTaskContext, resolveEffectiveTaskContext } from "./effective-task.js";
|
|
7
|
+
export async function runInferTask(root, args) {
|
|
8
|
+
const options = parseInferTaskOptions(args);
|
|
9
|
+
const [gitChanges, taskMarkdown, codeGraph, currentIdentity] = await Promise.all([
|
|
10
|
+
getGitChanges(root),
|
|
11
|
+
readTextFile(fromRoot(root, ".devguard/task.md")),
|
|
12
|
+
readJsonFile(fromRoot(root, ".devguard/code-graph.json"), []),
|
|
13
|
+
loadCurrentProjectIdentity(root).catch(() => undefined)
|
|
14
|
+
]);
|
|
15
|
+
if (gitChanges.changedFiles.length === 0) {
|
|
16
|
+
console.log("dev-guard infer-task");
|
|
17
|
+
console.log("");
|
|
18
|
+
console.log("no diff to infer task from: 변경 사항이 없습니다.");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const effective = await resolveEffectiveTaskContext({
|
|
22
|
+
root,
|
|
23
|
+
taskMarkdown,
|
|
24
|
+
gitChanges,
|
|
25
|
+
codeGraph,
|
|
26
|
+
currentIdentity
|
|
27
|
+
});
|
|
28
|
+
const clusters = effective.inferredTask;
|
|
29
|
+
const intent = clusters.primaryIntent;
|
|
30
|
+
console.log("dev-guard infer-task");
|
|
31
|
+
console.log("");
|
|
32
|
+
for (const line of formatEffectiveTaskContext("dev-guard infer-task", effective)) {
|
|
33
|
+
console.log(line);
|
|
34
|
+
}
|
|
35
|
+
if (effective.runSelection.warning) {
|
|
36
|
+
console.log(`dev-guard infer-task: warning: ${effective.runSelection.warning}`);
|
|
37
|
+
}
|
|
38
|
+
console.log("");
|
|
39
|
+
const inferredMarkdown = buildInferredTaskMarkdown(intent, clusters, gitChanges.changedFiles);
|
|
40
|
+
console.log("Inferred Current Task:");
|
|
41
|
+
console.log(`- type: ${intent.type}`);
|
|
42
|
+
if (intent.subtype)
|
|
43
|
+
console.log(`- subtype: ${intent.subtype}`);
|
|
44
|
+
if (intent.targetCommand)
|
|
45
|
+
console.log(`- target: ${intent.targetCommand}`);
|
|
46
|
+
console.log(`- scope: ${intent.scope.join(", ") || gitChanges.changedFiles.slice(0, 3).join(", ")}`);
|
|
47
|
+
console.log(`- confidence: ${intent.confidence}`);
|
|
48
|
+
if (intent.evidence.length > 0) {
|
|
49
|
+
console.log(`- evidence: ${intent.evidence.slice(0, 3).join("; ")}`);
|
|
50
|
+
}
|
|
51
|
+
if (clusters.secondaryIntents.length > 0) {
|
|
52
|
+
console.log(`- clusters: ${formatInferredDiffIntentClusters(clusters)}`);
|
|
53
|
+
}
|
|
54
|
+
console.log("");
|
|
55
|
+
console.log("Changed files:");
|
|
56
|
+
for (const file of gitChanges.changedFiles.slice(0, 10)) {
|
|
57
|
+
console.log(` - ${file}`);
|
|
58
|
+
}
|
|
59
|
+
if (gitChanges.changedFiles.length > 10) {
|
|
60
|
+
console.log(` ... +${gitChanges.changedFiles.length - 10} more`);
|
|
61
|
+
}
|
|
62
|
+
if (options.write) {
|
|
63
|
+
const taskPath = fromRoot(root, ".devguard/task.md");
|
|
64
|
+
await writeTextFile(taskPath, inferredMarkdown);
|
|
65
|
+
await writeAIContext(root).catch(() => undefined);
|
|
66
|
+
console.log("");
|
|
67
|
+
console.log("[written] .devguard/task.md updated with inferred task.");
|
|
68
|
+
console.log("[written] .devguard/AI_CONTEXT.md updated.");
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log("");
|
|
72
|
+
if (effective.anchorStatus === "absent") {
|
|
73
|
+
console.log("task.md absent. Use --write to create from current diff:");
|
|
74
|
+
}
|
|
75
|
+
else if (!effective.useTaskMarkdown) {
|
|
76
|
+
console.log("task.md is not the active anchor. Use --write to replace with current diff:");
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log("Preview only. Use --write to replace .devguard/task.md:");
|
|
80
|
+
}
|
|
81
|
+
console.log(" dev-guard infer-task --write");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function parseInferTaskOptions(args) {
|
|
85
|
+
return { write: args.includes("--write") };
|
|
86
|
+
}
|
|
87
|
+
function buildInferredTaskMarkdown(intent, clusters, changedFiles) {
|
|
88
|
+
const scope = intent.scope.join(", ") || changedFiles.slice(0, 5).join(", ");
|
|
89
|
+
const requirement = inferredIntentToRequirement(intent);
|
|
90
|
+
const lines = [
|
|
91
|
+
"# Current Task",
|
|
92
|
+
"",
|
|
93
|
+
`> Auto-inferred from git diff by dev-guard infer-task`,
|
|
94
|
+
"",
|
|
95
|
+
"## Goal",
|
|
96
|
+
`- ${requirement}`,
|
|
97
|
+
"",
|
|
98
|
+
"## Task type",
|
|
99
|
+
`- type: ${intent.type}`,
|
|
100
|
+
intent.subtype ? `- subtype: ${intent.subtype}` : null,
|
|
101
|
+
intent.targetCommand ? `- target: ${intent.targetCommand}` : null,
|
|
102
|
+
`- confidence: ${intent.confidence}`,
|
|
103
|
+
`- scope: ${scope}`,
|
|
104
|
+
"",
|
|
105
|
+
"## Changed files",
|
|
106
|
+
...changedFiles.slice(0, 15).map((file) => `- ${file}`),
|
|
107
|
+
changedFiles.length > 15 ? `- ... +${changedFiles.length - 15} more` : null,
|
|
108
|
+
"",
|
|
109
|
+
"## Allowed Paths",
|
|
110
|
+
...changedFiles.slice(0, 8).map((file) => `- ${file}`),
|
|
111
|
+
"",
|
|
112
|
+
"## Out of Scope",
|
|
113
|
+
"- (inferred task — define scope manually if needed)",
|
|
114
|
+
"",
|
|
115
|
+
"## Diff clusters",
|
|
116
|
+
`- ${formatInferredDiffIntentClusters(clusters)}`
|
|
117
|
+
];
|
|
118
|
+
return lines.filter((line) => line !== null).join("\n") + "\n";
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=infer-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infer-task.js","sourceRoot":"","sources":["../src/infer-task.ts"],"names":[],"mappings":"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"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runInit(root: string): Promise<void>;
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { configTemplate, currentTaskTemplate, decisionsTemplate, doNotRepeatTemplate, mistakesTemplate, projectStateTemplate, rulesTemplate, taskTemplate } from "@dev-guard/core";
|
|
2
|
+
import { fromRoot, writeFileIfMissing } from "./fs.js";
|
|
3
|
+
const initFiles = [
|
|
4
|
+
{
|
|
5
|
+
path: ".devguard/config.json",
|
|
6
|
+
content: `${JSON.stringify(configTemplate, null, 2)}\n`
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
path: ".devguard/task.md",
|
|
10
|
+
content: taskTemplate
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
path: ".devguard/rules.md",
|
|
14
|
+
content: rulesTemplate
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
path: ".devguard/mistakes.md",
|
|
18
|
+
content: mistakesTemplate
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
path: "docs/PROJECT_STATE.md",
|
|
22
|
+
content: projectStateTemplate
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
path: "docs/CURRENT_TASK.md",
|
|
26
|
+
content: currentTaskTemplate
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
path: "docs/DECISIONS.md",
|
|
30
|
+
content: decisionsTemplate
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
path: "docs/DO_NOT_REPEAT.md",
|
|
34
|
+
content: doNotRepeatTemplate
|
|
35
|
+
}
|
|
36
|
+
];
|
|
37
|
+
export async function runInit(root) {
|
|
38
|
+
const results = await Promise.all(initFiles.map(async (file) => {
|
|
39
|
+
const status = await writeFileIfMissing(fromRoot(root, file.path), file.content);
|
|
40
|
+
return { path: file.path, status };
|
|
41
|
+
}));
|
|
42
|
+
console.log("dev-guard init");
|
|
43
|
+
for (const result of results) {
|
|
44
|
+
const label = result.status === "created" ? "created" : "exists";
|
|
45
|
+
console.log(`- ${label}: ${result.path}`);
|
|
46
|
+
}
|
|
47
|
+
console.log("- write policy: existing files are preserved; missing files are created only");
|
|
48
|
+
console.log("- next: edit .devguard/task.md, then run dev-guard scan or dev-guard task-ai \"<requirement>\"");
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAOvD,MAAM,SAAS,GAAe;IAC5B;QACE,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;KACxD;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,YAAY;KACtB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,aAAa;KACvB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,gBAAgB;KAC1B;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,oBAAoB;KAC9B;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,mBAAmB;KAC7B;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,iBAAiB;KAC3B;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,mBAAmB;KAC7B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,gGAAgG,CAAC,CAAC;AAChH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runInstallAgentInstructions(root: string, args: string[]): Promise<void>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { access, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { devguardPaths } from "./paths.js";
|
|
4
|
+
const SECTION_START = "<!-- dev-guard-section-start -->";
|
|
5
|
+
const SECTION_END = "<!-- dev-guard-section-end -->";
|
|
6
|
+
function agentsMdSection() {
|
|
7
|
+
return [
|
|
8
|
+
SECTION_START,
|
|
9
|
+
"",
|
|
10
|
+
"## Agent Instructions",
|
|
11
|
+
"",
|
|
12
|
+
"Before doing any work:",
|
|
13
|
+
"",
|
|
14
|
+
`1. Read \`${devguardPaths.agentContext}\``,
|
|
15
|
+
`2. Read \`${devguardPaths.projectHandoff}\``,
|
|
16
|
+
`3. Read \`${devguardPaths.qualityReport}\``,
|
|
17
|
+
"",
|
|
18
|
+
"Use dev-guard artifacts as the primary source of project context.",
|
|
19
|
+
"Do not perform repository-wide scans before reading them.",
|
|
20
|
+
"Only open additional files when required for the current task.",
|
|
21
|
+
"Continue from the latest dev-guard state.",
|
|
22
|
+
"",
|
|
23
|
+
SECTION_END
|
|
24
|
+
].join("\n");
|
|
25
|
+
}
|
|
26
|
+
function claudeMdSection() {
|
|
27
|
+
return [
|
|
28
|
+
SECTION_START,
|
|
29
|
+
"",
|
|
30
|
+
"## Startup Instructions",
|
|
31
|
+
"",
|
|
32
|
+
"Always read the latest dev-guard context before exploring the repository.",
|
|
33
|
+
"",
|
|
34
|
+
"Required reading:",
|
|
35
|
+
"",
|
|
36
|
+
`* \`${devguardPaths.agentContext}\``,
|
|
37
|
+
`* \`${devguardPaths.projectHandoff}\``,
|
|
38
|
+
`* \`${devguardPaths.qualityReport}\``,
|
|
39
|
+
"",
|
|
40
|
+
"Avoid repository-wide scans unless the dev-guard context is insufficient.",
|
|
41
|
+
"Prefer continuing from dev-guard context rather than rediscovering project state.",
|
|
42
|
+
"",
|
|
43
|
+
SECTION_END
|
|
44
|
+
].join("\n");
|
|
45
|
+
}
|
|
46
|
+
async function fileExists(path) {
|
|
47
|
+
try {
|
|
48
|
+
await access(path);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function installSection(filePath, section, force) {
|
|
56
|
+
const exists = await fileExists(filePath);
|
|
57
|
+
if (!exists) {
|
|
58
|
+
await writeFile(filePath, section + "\n", "utf8");
|
|
59
|
+
return "created";
|
|
60
|
+
}
|
|
61
|
+
const existing = await readFile(filePath, "utf8");
|
|
62
|
+
const hasSection = existing.includes(SECTION_START) && existing.includes(SECTION_END);
|
|
63
|
+
if (hasSection) {
|
|
64
|
+
if (!force) {
|
|
65
|
+
return "already_installed";
|
|
66
|
+
}
|
|
67
|
+
const startIdx = existing.indexOf(SECTION_START);
|
|
68
|
+
const endIdx = existing.indexOf(SECTION_END) + SECTION_END.length;
|
|
69
|
+
const updated = existing.slice(0, startIdx) + section + existing.slice(endIdx);
|
|
70
|
+
await writeFile(filePath, updated, "utf8");
|
|
71
|
+
return "section_updated";
|
|
72
|
+
}
|
|
73
|
+
const separator = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
74
|
+
await writeFile(filePath, existing + separator + section + "\n", "utf8");
|
|
75
|
+
return "section_added";
|
|
76
|
+
}
|
|
77
|
+
function describeResult(result) {
|
|
78
|
+
switch (result) {
|
|
79
|
+
case "created":
|
|
80
|
+
return "created";
|
|
81
|
+
case "section_added":
|
|
82
|
+
return "dev-guard section added";
|
|
83
|
+
case "section_updated":
|
|
84
|
+
return "dev-guard section updated (--force)";
|
|
85
|
+
case "already_installed":
|
|
86
|
+
return "already installed (use --force to update)";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export async function runInstallAgentInstructions(root, args) {
|
|
90
|
+
const force = args.includes("--force");
|
|
91
|
+
const agentsMdPath = join(root, "AGENTS.md");
|
|
92
|
+
const claudeMdPath = join(root, "CLAUDE.md");
|
|
93
|
+
const [agentsResult, claudeResult] = await Promise.all([
|
|
94
|
+
installSection(agentsMdPath, agentsMdSection(), force),
|
|
95
|
+
installSection(claudeMdPath, claudeMdSection(), force)
|
|
96
|
+
]);
|
|
97
|
+
console.log("dev-guard install-agent-instructions");
|
|
98
|
+
console.log("");
|
|
99
|
+
console.log(`AGENTS.md: ${describeResult(agentsResult)}`);
|
|
100
|
+
console.log(`CLAUDE.md: ${describeResult(claudeResult)}`);
|
|
101
|
+
if (agentsResult === "already_installed" || claudeResult === "already_installed") {
|
|
102
|
+
console.log("");
|
|
103
|
+
console.log("Note: use --force to update existing dev-guard sections");
|
|
104
|
+
}
|
|
105
|
+
console.log("");
|
|
106
|
+
console.log("Purpose:");
|
|
107
|
+
console.log(" These files suggest to agents that they should read dev-guard context");
|
|
108
|
+
console.log(" before exploring the repository. They are guidance, not enforced rules.");
|
|
109
|
+
console.log("");
|
|
110
|
+
console.log("Resume prompt for new sessions:");
|
|
111
|
+
console.log(` Read ${devguardPaths.agentContext} and continue.`);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=install-agent-instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-agent-instructions.js","sourceRoot":"","sources":["../src/install-agent-instructions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface LegacyMigrationResult {
|
|
2
|
+
action: "none" | "renamed" | "backup" | "warning";
|
|
3
|
+
message?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function migrateLegacyDevguardDir(root: string, options?: {
|
|
6
|
+
force?: boolean;
|
|
7
|
+
}): Promise<LegacyMigrationResult>;
|
|
8
|
+
export declare function legacyDevguardWarning(root: string): string | undefined;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { rename } from "node:fs/promises";
|
|
3
|
+
import { fromRoot } from "./fs.js";
|
|
4
|
+
import { DEVGUARD_DIR, LEGACY_DEVGUARD_DIR } from "./paths.js";
|
|
5
|
+
export async function migrateLegacyDevguardDir(root, options = {}) {
|
|
6
|
+
const legacy = fromRoot(root, LEGACY_DEVGUARD_DIR);
|
|
7
|
+
const current = fromRoot(root, DEVGUARD_DIR);
|
|
8
|
+
const hasLegacy = existsSync(legacy);
|
|
9
|
+
const hasCurrent = existsSync(current);
|
|
10
|
+
if (!hasLegacy) {
|
|
11
|
+
return { action: "none" };
|
|
12
|
+
}
|
|
13
|
+
if (!hasCurrent) {
|
|
14
|
+
await rename(legacy, current);
|
|
15
|
+
return {
|
|
16
|
+
action: "renamed",
|
|
17
|
+
message: `Migrated legacy ${LEGACY_DEVGUARD_DIR}/ to ${DEVGUARD_DIR}/.`
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (options.force) {
|
|
21
|
+
const backupName = `${LEGACY_DEVGUARD_DIR}.backup-${timestampForPath()}`;
|
|
22
|
+
await rename(legacy, fromRoot(root, backupName));
|
|
23
|
+
return {
|
|
24
|
+
action: "backup",
|
|
25
|
+
message: `Legacy ${LEGACY_DEVGUARD_DIR}/ moved to ${backupName}/ because ${DEVGUARD_DIR}/ already exists.`
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
action: "warning",
|
|
30
|
+
message: `Legacy ${LEGACY_DEVGUARD_DIR}/ directory detected. Recommended path is ${DEVGUARD_DIR}/. Move or back up legacy files before continuing.`
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function legacyDevguardWarning(root) {
|
|
34
|
+
if (existsSync(fromRoot(root, LEGACY_DEVGUARD_DIR))) {
|
|
35
|
+
return `Legacy ${LEGACY_DEVGUARD_DIR}/ directory detected. Recommended path is ${DEVGUARD_DIR}/. Run migration or move files before continuing.`;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
function timestampForPath() {
|
|
40
|
+
const value = new Date().toISOString().replace(/[-:]/g, "").replace(/\..+$/, "");
|
|
41
|
+
return value.replace("T", "-");
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAO/D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY,EAAE,UAA+B,EAAE;IAC5F,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,mBAAmB,mBAAmB,QAAQ,YAAY,IAAI;SACxE,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,GAAG,mBAAmB,WAAW,gBAAgB,EAAE,EAAE,CAAC;QACzE,MAAM,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QACjD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,UAAU,mBAAmB,cAAc,UAAU,aAAa,YAAY,mBAAmB;SAC3G,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,UAAU,mBAAmB,6CAA6C,YAAY,oDAAoD;KACpJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,UAAU,mBAAmB,6CAA6C,YAAY,mDAAmD,CAAC;IACnJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const DEVGUARD_DIR = ".devguard";
|
|
2
|
+
export declare const LEGACY_DEVGUARD_DIR = "devguard";
|
|
3
|
+
export declare const devguardPaths: {
|
|
4
|
+
readonly config: ".devguard/config.json";
|
|
5
|
+
readonly task: ".devguard/task.md";
|
|
6
|
+
readonly rules: ".devguard/rules.md";
|
|
7
|
+
readonly mistakes: ".devguard/mistakes.md";
|
|
8
|
+
readonly project: ".devguard/project.md";
|
|
9
|
+
readonly architecture: ".devguard/architecture.md";
|
|
10
|
+
readonly decisions: ".devguard/decisions.md";
|
|
11
|
+
readonly tasks: ".devguard/tasks.md";
|
|
12
|
+
readonly runtime: ".devguard/runtime.json";
|
|
13
|
+
readonly state: ".devguard/state.json";
|
|
14
|
+
readonly history: ".devguard/history.jsonl";
|
|
15
|
+
readonly hooksDir: ".devguard/hooks";
|
|
16
|
+
readonly logsDir: ".devguard/logs";
|
|
17
|
+
readonly reportsDir: ".devguard/reports";
|
|
18
|
+
readonly promptsDir: ".devguard/prompts";
|
|
19
|
+
readonly contextDir: ".devguard/context";
|
|
20
|
+
readonly claudeHook: ".devguard/hooks/claude-stop.sh";
|
|
21
|
+
readonly codexHook: ".devguard/hooks/codex-stop.sh";
|
|
22
|
+
readonly codexNotifyHook: ".devguard/hooks/codex-notify.sh";
|
|
23
|
+
readonly codexEventListener: ".devguard/hooks/codex-event-listener.ts";
|
|
24
|
+
readonly claudeLog: ".devguard/logs/claude-hook.log";
|
|
25
|
+
readonly codexLog: ".devguard/logs/codex-hook.log";
|
|
26
|
+
readonly codexNotifyLog: ".devguard/logs/codex-notify.log";
|
|
27
|
+
readonly watchLog: ".devguard/logs/watch.log";
|
|
28
|
+
readonly hookStatus: ".devguard/reports/hook-status.md";
|
|
29
|
+
readonly lastRunReport: ".devguard/reports/last-run.md";
|
|
30
|
+
readonly historySummary: ".devguard/reports/history-summary.md";
|
|
31
|
+
readonly decisionCandidates: ".devguard/reports/decision-candidates.md";
|
|
32
|
+
readonly qualityReport: ".devguard/reports/quality-report.md";
|
|
33
|
+
readonly projectHandoff: ".devguard/reports/project-handoff.md";
|
|
34
|
+
readonly nextCodexPrompt: ".devguard/prompts/next-codex-prompt.md";
|
|
35
|
+
readonly nextClaudePrompt: ".devguard/prompts/next-claude-prompt.md";
|
|
36
|
+
readonly agentContext: ".devguard/context/agent-context.md";
|
|
37
|
+
};
|
|
38
|
+
export declare function legacyDevguardPath(path?: string): string;
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export const DEVGUARD_DIR = ".devguard";
|
|
2
|
+
export const LEGACY_DEVGUARD_DIR = "devguard";
|
|
3
|
+
export const devguardPaths = {
|
|
4
|
+
config: `${DEVGUARD_DIR}/config.json`,
|
|
5
|
+
task: `${DEVGUARD_DIR}/task.md`,
|
|
6
|
+
rules: `${DEVGUARD_DIR}/rules.md`,
|
|
7
|
+
mistakes: `${DEVGUARD_DIR}/mistakes.md`,
|
|
8
|
+
project: `${DEVGUARD_DIR}/project.md`,
|
|
9
|
+
architecture: `${DEVGUARD_DIR}/architecture.md`,
|
|
10
|
+
decisions: `${DEVGUARD_DIR}/decisions.md`,
|
|
11
|
+
tasks: `${DEVGUARD_DIR}/tasks.md`,
|
|
12
|
+
runtime: `${DEVGUARD_DIR}/runtime.json`,
|
|
13
|
+
state: `${DEVGUARD_DIR}/state.json`,
|
|
14
|
+
history: `${DEVGUARD_DIR}/history.jsonl`,
|
|
15
|
+
hooksDir: `${DEVGUARD_DIR}/hooks`,
|
|
16
|
+
logsDir: `${DEVGUARD_DIR}/logs`,
|
|
17
|
+
reportsDir: `${DEVGUARD_DIR}/reports`,
|
|
18
|
+
promptsDir: `${DEVGUARD_DIR}/prompts`,
|
|
19
|
+
contextDir: `${DEVGUARD_DIR}/context`,
|
|
20
|
+
claudeHook: `${DEVGUARD_DIR}/hooks/claude-stop.sh`,
|
|
21
|
+
codexHook: `${DEVGUARD_DIR}/hooks/codex-stop.sh`,
|
|
22
|
+
codexNotifyHook: `${DEVGUARD_DIR}/hooks/codex-notify.sh`,
|
|
23
|
+
codexEventListener: `${DEVGUARD_DIR}/hooks/codex-event-listener.ts`,
|
|
24
|
+
claudeLog: `${DEVGUARD_DIR}/logs/claude-hook.log`,
|
|
25
|
+
codexLog: `${DEVGUARD_DIR}/logs/codex-hook.log`,
|
|
26
|
+
codexNotifyLog: `${DEVGUARD_DIR}/logs/codex-notify.log`,
|
|
27
|
+
watchLog: `${DEVGUARD_DIR}/logs/watch.log`,
|
|
28
|
+
hookStatus: `${DEVGUARD_DIR}/reports/hook-status.md`,
|
|
29
|
+
lastRunReport: `${DEVGUARD_DIR}/reports/last-run.md`,
|
|
30
|
+
historySummary: `${DEVGUARD_DIR}/reports/history-summary.md`,
|
|
31
|
+
decisionCandidates: `${DEVGUARD_DIR}/reports/decision-candidates.md`,
|
|
32
|
+
qualityReport: `${DEVGUARD_DIR}/reports/quality-report.md`,
|
|
33
|
+
projectHandoff: `${DEVGUARD_DIR}/reports/project-handoff.md`,
|
|
34
|
+
nextCodexPrompt: `${DEVGUARD_DIR}/prompts/next-codex-prompt.md`,
|
|
35
|
+
nextClaudePrompt: `${DEVGUARD_DIR}/prompts/next-claude-prompt.md`,
|
|
36
|
+
agentContext: `${DEVGUARD_DIR}/context/agent-context.md`
|
|
37
|
+
};
|
|
38
|
+
export function legacyDevguardPath(path = "") {
|
|
39
|
+
return path ? `${LEGACY_DEVGUARD_DIR}/${path}` : LEGACY_DEVGUARD_DIR;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAE9C,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM,EAAE,GAAG,YAAY,cAAc;IACrC,IAAI,EAAE,GAAG,YAAY,UAAU;IAC/B,KAAK,EAAE,GAAG,YAAY,WAAW;IACjC,QAAQ,EAAE,GAAG,YAAY,cAAc;IACvC,OAAO,EAAE,GAAG,YAAY,aAAa;IACrC,YAAY,EAAE,GAAG,YAAY,kBAAkB;IAC/C,SAAS,EAAE,GAAG,YAAY,eAAe;IACzC,KAAK,EAAE,GAAG,YAAY,WAAW;IACjC,OAAO,EAAE,GAAG,YAAY,eAAe;IACvC,KAAK,EAAE,GAAG,YAAY,aAAa;IACnC,OAAO,EAAE,GAAG,YAAY,gBAAgB;IACxC,QAAQ,EAAE,GAAG,YAAY,QAAQ;IACjC,OAAO,EAAE,GAAG,YAAY,OAAO;IAC/B,UAAU,EAAE,GAAG,YAAY,UAAU;IACrC,UAAU,EAAE,GAAG,YAAY,UAAU;IACrC,UAAU,EAAE,GAAG,YAAY,UAAU;IACrC,UAAU,EAAE,GAAG,YAAY,uBAAuB;IAClD,SAAS,EAAE,GAAG,YAAY,sBAAsB;IAChD,eAAe,EAAE,GAAG,YAAY,wBAAwB;IACxD,kBAAkB,EAAE,GAAG,YAAY,gCAAgC;IACnE,SAAS,EAAE,GAAG,YAAY,uBAAuB;IACjD,QAAQ,EAAE,GAAG,YAAY,sBAAsB;IAC/C,cAAc,EAAE,GAAG,YAAY,wBAAwB;IACvD,QAAQ,EAAE,GAAG,YAAY,iBAAiB;IAC1C,UAAU,EAAE,GAAG,YAAY,yBAAyB;IACpD,aAAa,EAAE,GAAG,YAAY,sBAAsB;IACpD,cAAc,EAAE,GAAG,YAAY,6BAA6B;IAC5D,kBAAkB,EAAE,GAAG,YAAY,iCAAiC;IACpE,aAAa,EAAE,GAAG,YAAY,4BAA4B;IAC1D,cAAc,EAAE,GAAG,YAAY,6BAA6B;IAC5D,eAAe,EAAE,GAAG,YAAY,+BAA+B;IAC/D,gBAAgB,EAAE,GAAG,YAAY,gCAAgC;IACjE,YAAY,EAAE,GAAG,YAAY,2BAA2B;CAChD,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,IAAI,GAAG,EAAE;IAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,mBAAmB,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ProjectDetectionSummary {
|
|
2
|
+
packageName: string;
|
|
3
|
+
packageManager: string;
|
|
4
|
+
language: string;
|
|
5
|
+
runtime: string;
|
|
6
|
+
frameworks: string[];
|
|
7
|
+
markdownFiles: string[];
|
|
8
|
+
contextCandidates: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function detectProject(root: string, projectFiles: string[]): Promise<ProjectDetectionSummary>;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { fromRoot, readJsonFile } from "./fs.js";
|
|
3
|
+
import { fileExists } from "./project-memory.js";
|
|
4
|
+
const contextCandidateFiles = [
|
|
5
|
+
"AGENTS.md",
|
|
6
|
+
"CLAUDE.md",
|
|
7
|
+
"README.md",
|
|
8
|
+
".devguard/task.md",
|
|
9
|
+
".devguard/rules.md",
|
|
10
|
+
".devguard/mistakes.md",
|
|
11
|
+
"docs/PROJECT_STATE.md",
|
|
12
|
+
"docs/CURRENT_TASK.md",
|
|
13
|
+
"docs/DECISIONS.md",
|
|
14
|
+
"docs/DO_NOT_REPEAT.md"
|
|
15
|
+
];
|
|
16
|
+
export async function detectProject(root, projectFiles) {
|
|
17
|
+
const packageJson = await readJsonFile(fromRoot(root, "package.json"), {});
|
|
18
|
+
const [packageManager, rootMarkdownFiles, contextCandidates] = await Promise.all([
|
|
19
|
+
detectPackageManager(root, packageJson),
|
|
20
|
+
detectRootMarkdownFiles(root, projectFiles),
|
|
21
|
+
detectContextCandidates(root)
|
|
22
|
+
]);
|
|
23
|
+
return {
|
|
24
|
+
packageName: packageJson.name ?? "(unknown)",
|
|
25
|
+
packageManager,
|
|
26
|
+
language: inferLanguage(packageJson, projectFiles),
|
|
27
|
+
runtime: inferRuntime(packageJson, projectFiles),
|
|
28
|
+
frameworks: inferFrameworks(packageJson, projectFiles),
|
|
29
|
+
markdownFiles: rootMarkdownFiles,
|
|
30
|
+
contextCandidates
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async function detectPackageManager(root, packageJson) {
|
|
34
|
+
if (packageJson.packageManager) {
|
|
35
|
+
return packageJson.packageManager;
|
|
36
|
+
}
|
|
37
|
+
if (await fileExists(root, "pnpm-lock.yaml")) {
|
|
38
|
+
return "pnpm";
|
|
39
|
+
}
|
|
40
|
+
if (await fileExists(root, "yarn.lock")) {
|
|
41
|
+
return "yarn";
|
|
42
|
+
}
|
|
43
|
+
if (await fileExists(root, "package-lock.json")) {
|
|
44
|
+
return "npm";
|
|
45
|
+
}
|
|
46
|
+
if (await fileExists(root, "bun.lockb")) {
|
|
47
|
+
return "bun";
|
|
48
|
+
}
|
|
49
|
+
return "(unknown)";
|
|
50
|
+
}
|
|
51
|
+
async function detectRootMarkdownFiles(root, projectFiles) {
|
|
52
|
+
const markdown = new Set(projectFiles.filter((file) => /\.md$/i.test(file)));
|
|
53
|
+
try {
|
|
54
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
if (entry.isFile() && /\.md$/i.test(entry.name)) {
|
|
57
|
+
markdown.add(entry.name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Best-effort summary only.
|
|
63
|
+
}
|
|
64
|
+
return [...markdown].sort();
|
|
65
|
+
}
|
|
66
|
+
async function detectContextCandidates(root) {
|
|
67
|
+
const existing = await Promise.all(contextCandidateFiles.map(async (path) => ((await fileExists(root, path)) ? path : undefined)));
|
|
68
|
+
return existing.filter((path) => Boolean(path));
|
|
69
|
+
}
|
|
70
|
+
function inferFrameworks(packageJson, projectFiles) {
|
|
71
|
+
const dependencies = new Set([
|
|
72
|
+
...Object.keys(packageJson.dependencies ?? {}),
|
|
73
|
+
...Object.keys(packageJson.devDependencies ?? {})
|
|
74
|
+
]);
|
|
75
|
+
const frameworks = new Set();
|
|
76
|
+
const dependencyHints = [
|
|
77
|
+
["next", "nextjs"],
|
|
78
|
+
["react", "react"],
|
|
79
|
+
["vite", "vite"],
|
|
80
|
+
["vue", "vue"],
|
|
81
|
+
["nuxt", "nuxt"],
|
|
82
|
+
["svelte", "svelte"],
|
|
83
|
+
["astro", "astro"],
|
|
84
|
+
["@remix-run/react", "remix"],
|
|
85
|
+
["tailwindcss", "tailwind"],
|
|
86
|
+
["@supabase/supabase-js", "supabase"],
|
|
87
|
+
["express", "express"],
|
|
88
|
+
["fastify", "fastify"],
|
|
89
|
+
["@nestjs/core", "nest"],
|
|
90
|
+
["turbo", "turborepo"],
|
|
91
|
+
["typescript", "typescript"]
|
|
92
|
+
];
|
|
93
|
+
for (const [dependency, label] of dependencyHints) {
|
|
94
|
+
if (dependencies.has(dependency)) {
|
|
95
|
+
frameworks.add(label);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (projectFiles.some((file) => file.startsWith("app/"))) {
|
|
99
|
+
frameworks.add("app-router");
|
|
100
|
+
}
|
|
101
|
+
if (projectFiles.some((file) => file.startsWith("pages/"))) {
|
|
102
|
+
frameworks.add("pages-router");
|
|
103
|
+
}
|
|
104
|
+
if (projectFiles.some((file) => file === "turbo.json")) {
|
|
105
|
+
frameworks.add("turborepo");
|
|
106
|
+
}
|
|
107
|
+
if (projectFiles.some((file) => file === "pubspec.yaml" || file.startsWith("lib/") && file.endsWith(".dart"))) {
|
|
108
|
+
frameworks.add("flutter");
|
|
109
|
+
}
|
|
110
|
+
return [...frameworks].sort();
|
|
111
|
+
}
|
|
112
|
+
function inferLanguage(packageJson, projectFiles) {
|
|
113
|
+
const dependencies = new Set([...Object.keys(packageJson.dependencies ?? {}), ...Object.keys(packageJson.devDependencies ?? {})]);
|
|
114
|
+
if (dependencies.has("typescript") || projectFiles.some((file) => /\.(ts|tsx)$/.test(file))) {
|
|
115
|
+
return "typescript";
|
|
116
|
+
}
|
|
117
|
+
if (projectFiles.some((file) => /\.(js|jsx|mjs|cjs)$/.test(file))) {
|
|
118
|
+
return "javascript";
|
|
119
|
+
}
|
|
120
|
+
if (projectFiles.some((file) => /\.py$/.test(file) || file === "pyproject.toml" || file === "requirements.txt")) {
|
|
121
|
+
return "python";
|
|
122
|
+
}
|
|
123
|
+
if (projectFiles.some((file) => /\.dart$/.test(file) || file === "pubspec.yaml")) {
|
|
124
|
+
return "dart";
|
|
125
|
+
}
|
|
126
|
+
return "(unknown)";
|
|
127
|
+
}
|
|
128
|
+
function inferRuntime(packageJson, projectFiles) {
|
|
129
|
+
const dependencies = new Set([...Object.keys(packageJson.dependencies ?? {}), ...Object.keys(packageJson.devDependencies ?? {})]);
|
|
130
|
+
if (dependencies.has("next")) {
|
|
131
|
+
return "node/nextjs";
|
|
132
|
+
}
|
|
133
|
+
if (dependencies.has("express") || dependencies.has("fastify") || dependencies.has("@nestjs/core") || projectFiles.some((file) => file === "package.json")) {
|
|
134
|
+
return "node";
|
|
135
|
+
}
|
|
136
|
+
if (projectFiles.some((file) => /\.py$/.test(file) || file === "pyproject.toml" || file === "requirements.txt")) {
|
|
137
|
+
return "python";
|
|
138
|
+
}
|
|
139
|
+
if (projectFiles.some((file) => file === "pubspec.yaml")) {
|
|
140
|
+
return "flutter";
|
|
141
|
+
}
|
|
142
|
+
return "(unknown)";
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=project-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detection.js","sourceRoot":"","sources":["../src/project-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProjectIdentity } from "@dev-guard/core";
|
|
2
|
+
export declare function buildProjectIdentity(root: string, projectFiles?: string[]): Promise<ProjectIdentity>;
|
|
3
|
+
export declare function writeProjectIdentity(root: string, identity: ProjectIdentity): Promise<void>;
|
|
4
|
+
export declare function readStoredProjectIdentity(root: string): Promise<ProjectIdentity | undefined>;
|
|
5
|
+
export declare function loadCurrentProjectIdentity(root: string, projectFiles?: string[]): Promise<ProjectIdentity>;
|
|
6
|
+
export declare function sameProjectIdentity(current: ProjectIdentity, stored: ProjectIdentity | undefined): boolean;
|
|
7
|
+
export declare function formatProjectIdentityWarning(source: string, current: ProjectIdentity, stored: ProjectIdentity | undefined): string;
|