deuk-agent-flow 5.0.2 → 5.0.4
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/CHANGELOG.ko.md +18 -0
- package/CHANGELOG.md +25 -0
- package/bundled/deuk-agent-flow.vsix +0 -0
- package/core-rules/AGENTS.md +5 -5
- package/package.json +20 -2
- package/scripts/bundle-vscode-vsix.ts +1 -1
- package/scripts/cli-context-commands.ts +35 -0
- package/scripts/cli-init-claude.ts +179 -0
- package/scripts/cli-init-core.ts +89 -0
- package/scripts/cli-init-instructions.ts +489 -0
- package/scripts/cli-init-migrate.ts +504 -0
- package/scripts/cli-init-workspace.ts +63 -0
- package/scripts/cli-locales.ts +85 -0
- package/scripts/cli-skill-commands.ts +3 -1
- package/scripts/cli-ticket-commands.ts +58 -0
- package/scripts/cli-ticket-docmeta.ts +103 -0
- package/scripts/cli-ticket-document.ts +153 -0
- package/scripts/cli-ticket-evidence.ts +312 -0
- package/scripts/cli-ticket-home.ts +449 -0
- package/scripts/cli-ticket-scan.ts +102 -0
- package/scripts/cli-ticket-surface.ts +56 -0
- package/scripts/oss-prepack.js +32 -0
- package/scripts/out/scripts/bundle-vscode-vsix.js +68 -0
- package/scripts/out/scripts/bundle-vscode-vsix.js.map +1 -0
- package/scripts/out/scripts/cli-args.js +374 -0
- package/scripts/out/scripts/cli-args.js.map +1 -0
- package/scripts/out/scripts/cli-context-commands.js +31 -0
- package/scripts/out/scripts/cli-context-commands.js.map +1 -0
- package/scripts/out/scripts/cli-init-claude.js +176 -0
- package/scripts/out/scripts/cli-init-claude.js.map +1 -0
- package/scripts/out/scripts/cli-init-commands.js +87 -0
- package/scripts/out/scripts/cli-init-commands.js.map +1 -0
- package/scripts/out/scripts/cli-init-core.js +89 -0
- package/scripts/out/scripts/cli-init-core.js.map +1 -0
- package/scripts/out/scripts/cli-init-instructions.js +460 -0
- package/scripts/out/scripts/cli-init-instructions.js.map +1 -0
- package/scripts/out/scripts/cli-init-logic.js +41 -0
- package/scripts/out/scripts/cli-init-logic.js.map +1 -0
- package/scripts/out/scripts/cli-init-migrate.js +497 -0
- package/scripts/out/scripts/cli-init-migrate.js.map +1 -0
- package/scripts/out/scripts/cli-init-workspace.js +57 -0
- package/scripts/out/scripts/cli-init-workspace.js.map +1 -0
- package/scripts/out/scripts/cli-locales.js +83 -0
- package/scripts/out/scripts/cli-locales.js.map +1 -0
- package/scripts/out/scripts/cli-prompts.js +101 -0
- package/scripts/out/scripts/cli-prompts.js.map +1 -0
- package/scripts/out/scripts/cli-rule-compiler.js +121 -0
- package/scripts/out/scripts/cli-rule-compiler.js.map +1 -0
- package/scripts/out/scripts/cli-skill-commands.js +708 -0
- package/scripts/out/scripts/cli-skill-commands.js.map +1 -0
- package/scripts/out/scripts/cli-telemetry-commands.js +604 -0
- package/scripts/out/scripts/cli-telemetry-commands.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-command-shared.js +2 -0
- package/scripts/out/scripts/cli-ticket-command-shared.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-commands.js +3530 -0
- package/scripts/out/scripts/cli-ticket-commands.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-docmeta.js +90 -0
- package/scripts/out/scripts/cli-ticket-docmeta.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-document.js +121 -0
- package/scripts/out/scripts/cli-ticket-document.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-evidence.js +286 -0
- package/scripts/out/scripts/cli-ticket-evidence.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-home.js +440 -0
- package/scripts/out/scripts/cli-ticket-home.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-index.js +272 -0
- package/scripts/out/scripts/cli-ticket-index.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-migration.js +261 -0
- package/scripts/out/scripts/cli-ticket-migration.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-parser.js +90 -0
- package/scripts/out/scripts/cli-ticket-parser.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-scan.js +93 -0
- package/scripts/out/scripts/cli-ticket-scan.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-surface.js +53 -0
- package/scripts/out/scripts/cli-ticket-surface.js.map +1 -0
- package/scripts/out/scripts/cli-usage-commands.js +310 -0
- package/scripts/out/scripts/cli-usage-commands.js.map +1 -0
- package/scripts/out/scripts/cli-utils.js +1544 -0
- package/scripts/out/scripts/cli-utils.js.map +1 -0
- package/scripts/out/scripts/cli.js +696 -0
- package/scripts/out/scripts/cli.js.map +1 -0
- package/scripts/out/scripts/lint-md.js +238 -0
- package/scripts/out/scripts/lint-md.js.map +1 -0
- package/scripts/out/scripts/lint-rules.js +193 -0
- package/scripts/out/scripts/lint-rules.js.map +1 -0
- package/scripts/out/scripts/merge-logic.js +38 -0
- package/scripts/out/scripts/merge-logic.js.map +1 -0
- package/scripts/out/scripts/plan-parser.js +52 -0
- package/scripts/out/scripts/plan-parser.js.map +1 -0
- package/scripts/out/scripts/ticket-machine.js +94 -0
- package/scripts/out/scripts/ticket-machine.js.map +1 -0
- package/scripts/out/scripts/ticket-workflow.js +498 -0
- package/scripts/out/scripts/ticket-workflow.js.map +1 -0
- package/scripts/ticket-machine.ts +99 -0
- package/scripts/ticket-workflow.ts +544 -0
- package/templates/skills/role-closer/SKILL.md +27 -0
- package/templates/skills/role-implementer/SKILL.md +30 -0
- package/templates/skills/role-planner/SKILL.md +29 -0
- package/templates/skills/role-qa-verifier/SKILL.md +30 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { basename } from "path";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, readdirSync, unlinkSync, rmSync, renameSync, statSync, copyFileSync, cpSync } from "fs";
|
|
3
|
+
import { randomUUID } from "crypto";
|
|
4
|
+
import { LEGACY_DEUK, DEUK_ROOT_DIR, WORKSPACE_MARKER_FILE, getWorkspaceInitConfigPath, makePath, resolveDocsLanguage, resolveUserHome, toRepoRelativePath } from "./cli-utils.js";
|
|
5
|
+
import { CANONICAL_INIT_CLEANUP_PATHS, safeReadText, splitManagedBlock } from "./cli-init-core.js";
|
|
6
|
+
import { isGeneratedDeukPointer, splitProjectDoc } from "./cli-init-instructions.js";
|
|
7
|
+
import { cliText, resolveCliLocale } from "./cli-locales.js";
|
|
8
|
+
function resolveInitLocale(docsLanguage = "auto") {
|
|
9
|
+
return resolveCliLocale(resolveDocsLanguage(docsLanguage));
|
|
10
|
+
}
|
|
11
|
+
// #713: home root directory migration ~/.deuk-agent → ~/.deuk. The literal legacy name is
|
|
12
|
+
// fixed here (DEUK_ROOT_DIR now resolves to ".deuk", so it can't name the OLD dir). Runs on
|
|
13
|
+
// every init entry and is self-healing/idempotent:
|
|
14
|
+
// (A) legacy exists && new absent → try rename (fast); on failure (another agent holds
|
|
15
|
+
// .deuk-agent, EBUSY/EPERM) fall back to recursive copy, preserving the original so
|
|
16
|
+
// the older agent keeps working.
|
|
17
|
+
// (B) BOTH exist (copy left a leftover) → keep retrying rmSync(.deuk-agent) each init;
|
|
18
|
+
// once the other agent releases it, it gets removed. Safety guard: never delete the
|
|
19
|
+
// legacy dir while the new ~/.deuk is empty (would risk data loss).
|
|
20
|
+
function dirHasEntries(dirAbs) {
|
|
21
|
+
try {
|
|
22
|
+
return readdirSync(dirAbs).length > 0;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function migrateDeukRootDir(opts = {}) {
|
|
29
|
+
const home = resolveUserHome(opts);
|
|
30
|
+
const dryRun = Boolean(opts.dryRun);
|
|
31
|
+
const legacyAbs = makePath(home, LEGACY_DEUK.rootDir);
|
|
32
|
+
const nextAbs = makePath(home, DEUK_ROOT_DIR); // ~/.deuk
|
|
33
|
+
const legacyExists = existsSync(legacyAbs);
|
|
34
|
+
const nextExists = existsSync(nextAbs);
|
|
35
|
+
// (A) move legacy → new when only legacy is present.
|
|
36
|
+
if (legacyExists && !nextExists) {
|
|
37
|
+
if (dryRun) {
|
|
38
|
+
console.log(`[MIGRATE] Would migrate ${legacyAbs} -> ${nextAbs} (rename, copy fallback)`);
|
|
39
|
+
return { migrated: false, mode: "dry-run" };
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
renameSync(legacyAbs, nextAbs);
|
|
43
|
+
console.log(`[MIGRATE] Moved ${LEGACY_DEUK.rootDir} -> ${DEUK_ROOT_DIR}`);
|
|
44
|
+
return { migrated: true, mode: "rename" };
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Another agent likely holds the legacy dir — copy instead, keep the original intact.
|
|
48
|
+
cpSync(legacyAbs, nextAbs, { recursive: true });
|
|
49
|
+
console.log(`[MIGRATE] Copied ${LEGACY_DEUK.rootDir} -> ${DEUK_ROOT_DIR} (legacy kept for compatibility)`);
|
|
50
|
+
return { migrated: true, mode: "copy" };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// (B) both present (copy leftover) → persistently try to remove the legacy dir, but only
|
|
54
|
+
// once the new dir actually holds data, so a half-finished copy never deletes the source.
|
|
55
|
+
if (legacyExists && nextExists) {
|
|
56
|
+
if (!dirHasEntries(nextAbs)) {
|
|
57
|
+
return { migrated: false, mode: "guard-new-empty" };
|
|
58
|
+
}
|
|
59
|
+
if (dryRun) {
|
|
60
|
+
console.log(`[MIGRATE] Would remove leftover ${legacyAbs} (new ${DEUK_ROOT_DIR} populated)`);
|
|
61
|
+
return { migrated: false, mode: "dry-run" };
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
rmSync(legacyAbs, { recursive: true, force: true });
|
|
65
|
+
console.log(`[MIGRATE] Removed leftover ${LEGACY_DEUK.rootDir} (migration complete)`);
|
|
66
|
+
return { migrated: true, mode: "cleanup" };
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Still held by another agent — leave it; the next init retries.
|
|
70
|
+
return { migrated: false, mode: "cleanup-deferred" };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return { migrated: false, mode: "noop" };
|
|
74
|
+
}
|
|
75
|
+
export function removeLegacyPaths(cwd, dryRun, paths, label) {
|
|
76
|
+
let removed = 0;
|
|
77
|
+
for (const relPath of paths) {
|
|
78
|
+
const target = makePath(cwd, relPath);
|
|
79
|
+
if (!existsSync(target))
|
|
80
|
+
continue;
|
|
81
|
+
if (!dryRun)
|
|
82
|
+
rmSync(target, { recursive: true, force: true });
|
|
83
|
+
console.log(`[CLEANUP] removed ${label}: ${toRepoRelativePath(cwd, target)}`);
|
|
84
|
+
removed += 1;
|
|
85
|
+
}
|
|
86
|
+
return removed;
|
|
87
|
+
}
|
|
88
|
+
export function ensureWritableDirectory(dirAbs, cwd, dryRun, label) {
|
|
89
|
+
if (!existsSync(dirAbs))
|
|
90
|
+
return;
|
|
91
|
+
try {
|
|
92
|
+
if (statSync(dirAbs).isDirectory())
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
if (process.env.DEBUG)
|
|
97
|
+
console.warn(`[DEBUG] Failed to inspect ${dirAbs}:`, err);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const backupBase = `${dirAbs}.bak`;
|
|
101
|
+
let backupAbs = backupBase;
|
|
102
|
+
let index = 1;
|
|
103
|
+
while (existsSync(backupAbs)) {
|
|
104
|
+
backupAbs = `${backupBase}.${index}`;
|
|
105
|
+
index += 1;
|
|
106
|
+
}
|
|
107
|
+
const relDir = toRepoRelativePath(cwd, dirAbs);
|
|
108
|
+
const relBackup = toRepoRelativePath(cwd, backupAbs);
|
|
109
|
+
if (!dryRun) {
|
|
110
|
+
renameSync(dirAbs, backupAbs);
|
|
111
|
+
}
|
|
112
|
+
console.log(`[MIGRATE] ${label}: ${relDir} -> ${relBackup}`);
|
|
113
|
+
}
|
|
114
|
+
function removeEmptyDirsBottomUp(dir, cwd, dryRun) {
|
|
115
|
+
if (!existsSync(dir))
|
|
116
|
+
return;
|
|
117
|
+
for (const entry of sortedDirEntries(dir, { withFileTypes: true })) {
|
|
118
|
+
if (entry.isDirectory())
|
|
119
|
+
removeEmptyDirsBottomUp(makePath(dir, entry.name), cwd, dryRun);
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
if (sortedDirEntries(dir).length > 0)
|
|
123
|
+
return;
|
|
124
|
+
if (!dryRun)
|
|
125
|
+
rmSync(dir, { recursive: true, force: true });
|
|
126
|
+
console.log(`[CLEANUP] removed empty directory: ${toRepoRelativePath(cwd, dir)}`);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (process.env.DEBUG)
|
|
130
|
+
console.warn(`[DEBUG] Failed to prune ${dir}:`, err);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function migrateLegacyStructure(cwd, dryRun) {
|
|
134
|
+
const legacyTemplates = makePath(cwd, LEGACY_DEUK.templateDir);
|
|
135
|
+
if (existsSync(legacyTemplates)) {
|
|
136
|
+
console.log(`[CLEANUP] removing legacy runtime templates: ${LEGACY_DEUK.templateDir}`);
|
|
137
|
+
if (!dryRun && existsSync(legacyTemplates))
|
|
138
|
+
rmSync(legacyTemplates, { recursive: true, force: true });
|
|
139
|
+
}
|
|
140
|
+
const legacyConfig = makePath(cwd, LEGACY_DEUK.configFile);
|
|
141
|
+
if (existsSync(legacyConfig)) {
|
|
142
|
+
console.log(`[MIGRATE] Removing legacy config: ${LEGACY_DEUK.configFile}`);
|
|
143
|
+
if (!dryRun)
|
|
144
|
+
unlinkSync(legacyConfig);
|
|
145
|
+
}
|
|
146
|
+
removeLegacyWorkspaceConfig(cwd, dryRun);
|
|
147
|
+
// Purge workspace .deuk-agent/ — only .deuk-workspace-id marker should remain.
|
|
148
|
+
migrateWorkspaceMarker(cwd, dryRun);
|
|
149
|
+
}
|
|
150
|
+
// Migrates the workspace marker from the old .deuk-agent/workspace-id scheme to
|
|
151
|
+
// the new .deuk-workspace-id single-file scheme. 4 cases:
|
|
152
|
+
// A: .deuk-workspace-id already exists → skip (already migrated)
|
|
153
|
+
// B: .deuk-agent/workspace-id exists → copy UUID, delete .deuk-agent dir
|
|
154
|
+
// C: .deuk-agent/ exists but no workspace-id → mint new UUID, write file, delete .deuk-agent dir
|
|
155
|
+
// D: neither exists → skip (not a workspace)
|
|
156
|
+
export function migrateWorkspaceMarker(cwd, dryRun) {
|
|
157
|
+
const newMarker = makePath(cwd, WORKSPACE_MARKER_FILE);
|
|
158
|
+
const legacyDir = makePath(cwd, LEGACY_DEUK.rootDir);
|
|
159
|
+
const legacyIdFile = makePath(legacyDir, "workspace-id");
|
|
160
|
+
// Case A: marker already exists — still purge any leftover .deuk-agent/ dir
|
|
161
|
+
if (existsSync(newMarker)) {
|
|
162
|
+
if (existsSync(legacyDir)) {
|
|
163
|
+
if (!dryRun)
|
|
164
|
+
rmSync(legacyDir, { recursive: true, force: true });
|
|
165
|
+
console.log(`[MIGRATE] ${dryRun ? "Would remove" : "Removed"} leftover ${LEGACY_DEUK.rootDir}/ directory`);
|
|
166
|
+
}
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Case D: no .deuk-agent dir at all → not a managed workspace
|
|
170
|
+
if (!existsSync(legacyDir))
|
|
171
|
+
return;
|
|
172
|
+
let uuid;
|
|
173
|
+
if (existsSync(legacyIdFile)) {
|
|
174
|
+
// Case B: read existing UUID
|
|
175
|
+
uuid = String(readFileSync(legacyIdFile, "utf8") || "").trim();
|
|
176
|
+
if (!uuid)
|
|
177
|
+
uuid = randomUUID();
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// Case C: .deuk-agent exists but no workspace-id → mint new UUID
|
|
181
|
+
uuid = randomUUID();
|
|
182
|
+
}
|
|
183
|
+
if (!dryRun) {
|
|
184
|
+
writeFileSync(newMarker, uuid + "\n", "utf8");
|
|
185
|
+
rmSync(legacyDir, { recursive: true, force: true });
|
|
186
|
+
}
|
|
187
|
+
console.log(`[MIGRATE] ${dryRun ? "Would migrate" : "Migrated"} workspace marker → ${WORKSPACE_MARKER_FILE} (uuid: ${uuid})`);
|
|
188
|
+
}
|
|
189
|
+
export function removeLegacyWorkspaceConfig(cwd, dryRun) {
|
|
190
|
+
const workspaceConfig = getWorkspaceInitConfigPath(cwd);
|
|
191
|
+
if (!existsSync(workspaceConfig))
|
|
192
|
+
return false;
|
|
193
|
+
if (!dryRun)
|
|
194
|
+
unlinkSync(workspaceConfig);
|
|
195
|
+
console.log(`[CLEANUP] ${dryRun ? "Would remove" : "Removed"} legacy workspace config: ${toRepoRelativePath(cwd, workspaceConfig)}`);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
export function removeNestedLegacyWorkspaceConfigs(cwd, dryRun, ignoreDirs = []) {
|
|
199
|
+
const ignored = new Set([...(ignoreDirs || []), ".git", "node_modules", ".cache"]);
|
|
200
|
+
const roots = [];
|
|
201
|
+
function visit(dir) {
|
|
202
|
+
let entries = [];
|
|
203
|
+
try {
|
|
204
|
+
entries = sortedDirEntries(dir, { withFileTypes: true });
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (existsSync(getWorkspaceInitConfigPath(dir)))
|
|
210
|
+
roots.push(dir);
|
|
211
|
+
for (const entry of entries) {
|
|
212
|
+
if (!entry.isDirectory())
|
|
213
|
+
continue;
|
|
214
|
+
if (ignored.has(entry.name))
|
|
215
|
+
continue;
|
|
216
|
+
if (entry.name === DEUK_ROOT_DIR || LEGACY_DEUK.dirs.includes(entry.name))
|
|
217
|
+
continue;
|
|
218
|
+
visit(makePath(dir, entry.name));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
visit(cwd);
|
|
222
|
+
let migrated = 0;
|
|
223
|
+
for (const root of roots) {
|
|
224
|
+
if (removeLegacyWorkspaceConfig(root, dryRun))
|
|
225
|
+
migrated += 1;
|
|
226
|
+
}
|
|
227
|
+
return migrated;
|
|
228
|
+
}
|
|
229
|
+
function sortedDirEntries(dir, options = {}) {
|
|
230
|
+
const entries = readdirSync(dir, options);
|
|
231
|
+
return entries.sort((a, b) => {
|
|
232
|
+
const aName = typeof a === "string" ? a : a.name;
|
|
233
|
+
const bName = typeof b === "string" ? b : b.name;
|
|
234
|
+
return String(aName).localeCompare(String(bName));
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
export function sameFileContent(leftPath, rightPath) {
|
|
238
|
+
return safeReadText(leftPath) === safeReadText(rightPath);
|
|
239
|
+
}
|
|
240
|
+
export function walkMdFiles(dir, callback) {
|
|
241
|
+
if (!existsSync(dir))
|
|
242
|
+
return;
|
|
243
|
+
for (const entry of sortedDirEntries(dir, { withFileTypes: true })) {
|
|
244
|
+
const p = makePath(dir, entry.name);
|
|
245
|
+
if (entry.isDirectory()) {
|
|
246
|
+
walkMdFiles(p, callback);
|
|
247
|
+
}
|
|
248
|
+
else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
249
|
+
callback(p);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function escapeRegExp(value) {
|
|
254
|
+
return String(value || "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
255
|
+
}
|
|
256
|
+
export function migrateHtmlMarkersToHeadings(cwd, dryRun) {
|
|
257
|
+
const locale = resolveInitLocale();
|
|
258
|
+
const agentsPath = makePath(cwd, "AGENTS.md");
|
|
259
|
+
if (!existsSync(agentsPath))
|
|
260
|
+
return;
|
|
261
|
+
const content = readFileSync(agentsPath, "utf8");
|
|
262
|
+
const oldBegin = "<!-- deuk-agent-rule:begin -->";
|
|
263
|
+
const oldEnd = "<!-- deuk-agent-rule:end -->";
|
|
264
|
+
if (!content.includes(oldBegin))
|
|
265
|
+
return;
|
|
266
|
+
const beginIdx = content.indexOf(oldBegin);
|
|
267
|
+
const endIdx = content.lastIndexOf(oldEnd);
|
|
268
|
+
if (endIdx <= beginIdx)
|
|
269
|
+
return;
|
|
270
|
+
const managedContent = content.slice(beginIdx + oldBegin.length, endIdx).trim();
|
|
271
|
+
const userContent = content.slice(0, beginIdx).trim();
|
|
272
|
+
const afterContent = content.slice(endIdx + oldEnd.length).trim();
|
|
273
|
+
let newContent = "";
|
|
274
|
+
if (userContent)
|
|
275
|
+
newContent += userContent + "\n\n";
|
|
276
|
+
if (afterContent)
|
|
277
|
+
newContent += afterContent + "\n\n";
|
|
278
|
+
newContent += "---\n\n";
|
|
279
|
+
newContent += "## DeukAgentFlow\n\n";
|
|
280
|
+
newContent += "> Managed by DeukAgentFlow. Remove this section if not installed.\n\n";
|
|
281
|
+
newContent += managedContent + "\n";
|
|
282
|
+
if (!dryRun) {
|
|
283
|
+
copyFileSync(agentsPath, agentsPath + ".pre-v2.bak");
|
|
284
|
+
writeFileSync(agentsPath, newContent, "utf8");
|
|
285
|
+
console.log(cliText("init.migrate.convertedMarkers", { locale }));
|
|
286
|
+
console.log(cliText("init.migrate.backupSaved", { locale, vars: { path: "AGENTS.md.pre-v2.bak" } }));
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
console.log(cliText("init.migrate.dryRunConvertedMarkers", { locale }));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const INIT_SURFACE_IGNORE_DIRS = new Set([
|
|
293
|
+
".git",
|
|
294
|
+
".hg",
|
|
295
|
+
".svn",
|
|
296
|
+
DEUK_ROOT_DIR,
|
|
297
|
+
...LEGACY_DEUK.dirs,
|
|
298
|
+
"node_modules",
|
|
299
|
+
"dist",
|
|
300
|
+
"build",
|
|
301
|
+
".next",
|
|
302
|
+
".nuxt",
|
|
303
|
+
"coverage"
|
|
304
|
+
]);
|
|
305
|
+
function walkInitTextSurfaces(dir, callback) {
|
|
306
|
+
if (!existsSync(dir))
|
|
307
|
+
return;
|
|
308
|
+
for (const entry of sortedDirEntries(dir, { withFileTypes: true })) {
|
|
309
|
+
const absPath = makePath(dir, entry.name);
|
|
310
|
+
if (entry.isDirectory()) {
|
|
311
|
+
if (INIT_SURFACE_IGNORE_DIRS.has(entry.name))
|
|
312
|
+
continue;
|
|
313
|
+
walkInitTextSurfaces(absPath, callback);
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (!entry.isFile())
|
|
317
|
+
continue;
|
|
318
|
+
if (entry.name === "AGENTS.md" || entry.name === "PROJECT_RULE.md")
|
|
319
|
+
callback(absPath);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function removeLegacyHtmlManagedBlock(content) {
|
|
323
|
+
const oldBegin = "<!-- deuk-agent-rule:begin -->";
|
|
324
|
+
const oldEnd = "<!-- deuk-agent-rule:end -->";
|
|
325
|
+
const src = String(content || "");
|
|
326
|
+
const beginIdx = src.indexOf(oldBegin);
|
|
327
|
+
const endIdx = src.lastIndexOf(oldEnd);
|
|
328
|
+
if (beginIdx === -1 || endIdx <= beginIdx)
|
|
329
|
+
return null;
|
|
330
|
+
return [
|
|
331
|
+
src.slice(0, beginIdx).trim(),
|
|
332
|
+
src.slice(endIdx + oldEnd.length).trim()
|
|
333
|
+
].filter(Boolean).join("\n\n");
|
|
334
|
+
}
|
|
335
|
+
export function cleanupGeneratedAgentPointerSurface(absPath, cwd, dryRun) {
|
|
336
|
+
const locale = resolveInitLocale();
|
|
337
|
+
if (!existsSync(absPath))
|
|
338
|
+
return false;
|
|
339
|
+
if (basename(absPath) !== "AGENTS.md")
|
|
340
|
+
return false;
|
|
341
|
+
const before = readFileSync(absPath, "utf8");
|
|
342
|
+
if (!/DeukAgentRules|DeukAgentFlow|deuk-agent-rule/.test(before))
|
|
343
|
+
return false;
|
|
344
|
+
const unmanagedContent = removeLegacyHtmlManagedBlock(before);
|
|
345
|
+
if (unmanagedContent !== null) {
|
|
346
|
+
const next = unmanagedContent.trim();
|
|
347
|
+
if (!dryRun) {
|
|
348
|
+
if (next)
|
|
349
|
+
writeFileSync(absPath, `${next}\n`, "utf8");
|
|
350
|
+
else
|
|
351
|
+
unlinkSync(absPath);
|
|
352
|
+
}
|
|
353
|
+
const action = dryRun
|
|
354
|
+
? `would ${cliText(next ? "init.cleanup.strippedBlock" : "init.cleanup.removedPointer", { locale })}`
|
|
355
|
+
: cliText(next ? "init.cleanup.strippedBlock" : "init.cleanup.removedPointer", { locale });
|
|
356
|
+
console.log(cliText("init.cleanup.message", { locale, vars: { action, path: toRepoRelativePath(cwd, absPath) } }));
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
const { pointer, projectDoc } = splitProjectDoc(before);
|
|
360
|
+
if (!isGeneratedDeukPointer(pointer))
|
|
361
|
+
return false;
|
|
362
|
+
const next = projectDoc.trim();
|
|
363
|
+
if (!dryRun) {
|
|
364
|
+
if (next)
|
|
365
|
+
writeFileSync(absPath, `${next}\n`, "utf8");
|
|
366
|
+
else
|
|
367
|
+
unlinkSync(absPath);
|
|
368
|
+
}
|
|
369
|
+
const action = dryRun
|
|
370
|
+
? `would ${cliText(next ? "init.cleanup.strippedPointer" : "init.cleanup.removedPointer", { locale })}`
|
|
371
|
+
: cliText(next ? "init.cleanup.strippedPointer" : "init.cleanup.removedPointer", { locale });
|
|
372
|
+
console.log(cliText("init.cleanup.message", { locale, vars: { action, path: toRepoRelativePath(cwd, absPath) } }));
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
export function cleanupNestedGeneratedAgentPointers(cwd, dryRun) {
|
|
376
|
+
const locale = resolveInitLocale();
|
|
377
|
+
if (!existsSync(makePath(cwd, ".git")))
|
|
378
|
+
return 0;
|
|
379
|
+
let count = 0;
|
|
380
|
+
walkInitTextSurfaces(cwd, (absPath) => {
|
|
381
|
+
if (cleanupGeneratedAgentPointerSurface(absPath, cwd, dryRun))
|
|
382
|
+
count += 1;
|
|
383
|
+
});
|
|
384
|
+
if (count > 0) {
|
|
385
|
+
console.log(cliText("init.cleanup.summary", { locale, vars: { action: dryRun ? "would remove/strip" : "removed/stripped", count, workspace: basename(cwd) } }));
|
|
386
|
+
}
|
|
387
|
+
return count;
|
|
388
|
+
}
|
|
389
|
+
export function removeRuntimeTemplateCopies(cwd, dryRun) {
|
|
390
|
+
removeLegacyPaths(cwd, dryRun, CANONICAL_INIT_CLEANUP_PATHS.runtimeTemplateCopies, "runtime template copy");
|
|
391
|
+
}
|
|
392
|
+
export function removeLocalSkillCopies(cwd, dryRun) {
|
|
393
|
+
removeLegacyPaths(cwd, dryRun, CANONICAL_INIT_CLEANUP_PATHS.localSkillCopies, "local skill copy");
|
|
394
|
+
}
|
|
395
|
+
// Surgically remove the deuk-managed block from a shared-name surface (CLAUDE.md,
|
|
396
|
+
// AGENTS.md, copilot-instructions.md, …), preserving any user content. Deletes the
|
|
397
|
+
// file only when nothing of the user's remains. Never blunt-deletes a file that may
|
|
398
|
+
// hold the user's own Claude/agent settings.
|
|
399
|
+
function stripDeukManagedSurface(absPath, cwd, dryRun) {
|
|
400
|
+
if (!existsSync(absPath))
|
|
401
|
+
return;
|
|
402
|
+
const before = readFileSync(absPath, "utf8");
|
|
403
|
+
if (!/deuk-agent-managed|DeukAgentFlow|deuk-agent-rule/.test(before))
|
|
404
|
+
return; // not ours — leave untouched
|
|
405
|
+
let rest = null;
|
|
406
|
+
const block = splitManagedBlock(before); // current HTML-marked form
|
|
407
|
+
if (block) {
|
|
408
|
+
rest = [block.before, block.after].map(s => String(s || "").trim()).filter(Boolean).join("\n\n");
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
const legacy = removeLegacyHtmlManagedBlock(before); // older deuk-agent-rule markers
|
|
412
|
+
if (legacy !== null) {
|
|
413
|
+
rest = legacy.trim();
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
const { pointer, projectDoc } = splitProjectDoc(before); // bare "## DeukAgentFlow" section form
|
|
417
|
+
if (!isGeneratedDeukPointer(pointer))
|
|
418
|
+
return; // can't isolate deuk content safely — leave
|
|
419
|
+
rest = String(projectDoc || "").trim();
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
if (dryRun) {
|
|
423
|
+
console.log(`[CLEANUP] would ${rest ? "strip deuk block from" : "remove deuk surface"}: ${toRepoRelativePath(cwd, absPath)}`);
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
if (rest) {
|
|
427
|
+
writeFileSync(absPath, `${rest}\n`, "utf8");
|
|
428
|
+
console.log(`[CLEANUP] stripped deuk block, kept user content: ${toRepoRelativePath(cwd, absPath)}`);
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
rmSync(absPath, { force: true });
|
|
432
|
+
console.log(`[CLEANUP] removed deuk-managed surface: ${toRepoRelativePath(cwd, absPath)}`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
export function removeLocalAgentSurfaces(cwd, dryRun) {
|
|
436
|
+
removeLegacyPaths(cwd, dryRun, CANONICAL_INIT_CLEANUP_PATHS.localAgentSurfaces, "local agent surface");
|
|
437
|
+
for (const rel of CANONICAL_INIT_CLEANUP_PATHS.sharedAgentSurfaces) {
|
|
438
|
+
stripDeukManagedSurface(makePath(cwd, rel), cwd, dryRun);
|
|
439
|
+
}
|
|
440
|
+
for (const relDir of [".cursor", ".claude", ".codex", ".windsurf", ".aiassistant"]) {
|
|
441
|
+
removeEmptyDirsBottomUp(makePath(cwd, relDir), cwd, dryRun);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
const AUTO_MIGRATION_SKIP_DIRS = new Set([
|
|
445
|
+
".git",
|
|
446
|
+
".hg",
|
|
447
|
+
".svn",
|
|
448
|
+
DEUK_ROOT_DIR,
|
|
449
|
+
...LEGACY_DEUK.dirs,
|
|
450
|
+
"node_modules",
|
|
451
|
+
"dist",
|
|
452
|
+
"build",
|
|
453
|
+
"coverage",
|
|
454
|
+
".next",
|
|
455
|
+
".turbo",
|
|
456
|
+
".venv",
|
|
457
|
+
"__pycache__"
|
|
458
|
+
]);
|
|
459
|
+
export function removeFragmentedLocalAgentSurfaces(cwd, dryRun) {
|
|
460
|
+
let removed = removeLegacyPaths(cwd, dryRun, CANONICAL_INIT_CLEANUP_PATHS.localAgentSurfaces, "local agent surface");
|
|
461
|
+
const stack = [cwd];
|
|
462
|
+
const visited = new Set();
|
|
463
|
+
while (stack.length > 0) {
|
|
464
|
+
const current = stack.pop();
|
|
465
|
+
if (!current || visited.has(current) || !existsSync(current))
|
|
466
|
+
continue;
|
|
467
|
+
visited.add(current);
|
|
468
|
+
let entries = [];
|
|
469
|
+
try {
|
|
470
|
+
entries = sortedDirEntries(current, { withFileTypes: true });
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
for (const relPath of CANONICAL_INIT_CLEANUP_PATHS.localAgentSurfaces) {
|
|
476
|
+
const target = makePath(current, relPath);
|
|
477
|
+
if (!existsSync(target))
|
|
478
|
+
continue;
|
|
479
|
+
if (!dryRun)
|
|
480
|
+
rmSync(target, { recursive: true, force: true });
|
|
481
|
+
console.log(`[CLEANUP] removed fragmented local agent surface: ${toRepoRelativePath(cwd, target)}`);
|
|
482
|
+
removed += 1;
|
|
483
|
+
}
|
|
484
|
+
for (const entry of entries) {
|
|
485
|
+
if (!entry.isDirectory())
|
|
486
|
+
continue;
|
|
487
|
+
if (AUTO_MIGRATION_SKIP_DIRS.has(entry.name))
|
|
488
|
+
continue;
|
|
489
|
+
stack.push(makePath(current, entry.name));
|
|
490
|
+
}
|
|
491
|
+
for (const relDir of [".cursor", ".claude", ".codex", ".windsurf", ".aiassistant"]) {
|
|
492
|
+
removeEmptyDirsBottomUp(makePath(current, relDir), cwd, dryRun);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
return removed;
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=cli-init-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-init-migrate.js","sourceRoot":"","sources":["../../cli-init-migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { dirname, basename } from "path";
|
|
2
|
+
import { mkdirSync } from "fs";
|
|
3
|
+
import { createHash } from "crypto";
|
|
4
|
+
import { DEUK_ROOT_DIR, buildWorkspaceAliases, hasWorkspaceMarker, makePath, normalizeRegistryPath, resolveUserHome, writeFileLF } from "./cli-utils.js";
|
|
5
|
+
// ─── 내부 헬퍼: 워크스페이스 레지스트리 ─────────────────────────────────
|
|
6
|
+
function hashPath(value) {
|
|
7
|
+
return createHash("sha256").update(normalizeRegistryPath(String(value || "")), "utf8").digest("hex");
|
|
8
|
+
}
|
|
9
|
+
function workspaceRegistryRoot(homeDir = resolveUserHome()) {
|
|
10
|
+
return makePath(homeDir, ".agent-flow", "workspace");
|
|
11
|
+
}
|
|
12
|
+
function safeRegistryFileName(name) {
|
|
13
|
+
const cleaned = String(name || "workspace")
|
|
14
|
+
.replace(/[^A-Za-z0-9._-]+/g, "-")
|
|
15
|
+
.replace(/^-+|-+$/g, "");
|
|
16
|
+
return `${cleaned || "workspace"}.json`;
|
|
17
|
+
}
|
|
18
|
+
// ─── 공개 API ─────────────────────────────────────────────────────────────
|
|
19
|
+
export function updateSiblingWorkspaceRegistry(cwd, opts = {}) {
|
|
20
|
+
const workspacePath = normalizeRegistryPath(cwd || "");
|
|
21
|
+
if (!hasWorkspaceMarker(workspacePath))
|
|
22
|
+
return false;
|
|
23
|
+
const homeDir = resolveUserHome(opts);
|
|
24
|
+
// #623: never register the user home or anything under ~/.deuk-agent as a
|
|
25
|
+
// workspace — that store holds relocated tickets, not a sibling workspace, and
|
|
26
|
+
// registering it makes ticket ids look ambiguous across "workspaces".
|
|
27
|
+
const homeNorm = normalizeRegistryPath(homeDir);
|
|
28
|
+
const storeNorm = normalizeRegistryPath(makePath(homeDir, DEUK_ROOT_DIR));
|
|
29
|
+
if (workspacePath === homeNorm
|
|
30
|
+
|| workspacePath === storeNorm
|
|
31
|
+
|| workspacePath.startsWith(storeNorm + "/")) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const dryRun = Boolean(opts.dryRun);
|
|
35
|
+
const parentRoot = dirname(workspacePath);
|
|
36
|
+
const workspaceName = basename(workspacePath);
|
|
37
|
+
const parentRootHash = hashPath(parentRoot);
|
|
38
|
+
const pathHash = hashPath(workspacePath);
|
|
39
|
+
const registryDir = makePath(workspaceRegistryRoot(homeDir), parentRootHash);
|
|
40
|
+
const registryPath = makePath(registryDir, safeRegistryFileName(workspaceName));
|
|
41
|
+
const payload = {
|
|
42
|
+
version: 1,
|
|
43
|
+
name: workspaceName,
|
|
44
|
+
path: workspacePath,
|
|
45
|
+
aliases: buildWorkspaceAliases(workspaceName, workspacePath),
|
|
46
|
+
parentRoot,
|
|
47
|
+
parentRootHash,
|
|
48
|
+
pathHash,
|
|
49
|
+
updatedAt: new Date().toISOString(),
|
|
50
|
+
};
|
|
51
|
+
if (!dryRun) {
|
|
52
|
+
mkdirSync(registryDir, { recursive: true });
|
|
53
|
+
writeFileLF(registryPath, JSON.stringify(payload, null, 2) + "\n");
|
|
54
|
+
}
|
|
55
|
+
return { registryPath, payload };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=cli-init-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-init-workspace.js","sourceRoot":"","sources":["../../cli-init-workspace.ts"],"names":[],"mappings":"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"}
|