deuk-agent-flow 5.0.2 → 5.0.7
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 +45 -0
- package/CHANGELOG.md +48 -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-args.ts +46 -1
- package/scripts/cli-context-commands.ts +35 -0
- package/scripts/cli-init-claude.ts +179 -0
- package/scripts/cli-init-commands.ts +21 -8
- 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 +68 -2
- 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-index.ts +8 -0
- package/scripts/cli-ticket-scan.ts +102 -0
- package/scripts/cli-ticket-surface.ts +56 -0
- package/scripts/cli.ts +10 -1
- 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 +411 -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 +98 -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 +3538 -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 +280 -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 +705 -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,176 @@
|
|
|
1
|
+
import { dirname } from "path";
|
|
2
|
+
import { writeFileSync, mkdirSync } from "fs";
|
|
3
|
+
import { createHash } from "crypto";
|
|
4
|
+
import { makePath, resolveUserHome } from "./cli-utils.js";
|
|
5
|
+
import { CLAUDE_SETTINGS_PATH, CLAUDE_USERPROMPT_SUBMIT_COMMAND, CLAUDE_USERPROMPT_SUBMIT_MATCHER, safeReadText } from "./cli-init-core.js";
|
|
6
|
+
function isManagedClaudePromptHookCommand(value) {
|
|
7
|
+
const command = String(value || "").trim();
|
|
8
|
+
if (!/\bdeuk-agent-flow\b/.test(command))
|
|
9
|
+
return false;
|
|
10
|
+
// 현재 정식 커맨드이거나, rules를 포함하는 관리형 커맨드(구버전 포함)
|
|
11
|
+
if (command === CLAUDE_USERPROMPT_SUBMIT_COMMAND)
|
|
12
|
+
return true;
|
|
13
|
+
if (/\brules\b/.test(command))
|
|
14
|
+
return true;
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
function isCommandHookItem(item) {
|
|
18
|
+
return Boolean(item && typeof item === "object" && item.type === "command" && typeof item.command === "string");
|
|
19
|
+
}
|
|
20
|
+
function readClaudeSettings(homeDir = resolveUserHome()) {
|
|
21
|
+
const settingsPath = makePath(homeDir, CLAUDE_SETTINGS_PATH);
|
|
22
|
+
const raw = safeReadText(settingsPath);
|
|
23
|
+
if (!raw.trim())
|
|
24
|
+
return { ok: false };
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse(raw);
|
|
27
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
28
|
+
return { ok: false };
|
|
29
|
+
return { ok: true, path: settingsPath, parsed };
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return { ok: false };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function writeClaudeSettings(settingsPath, next, dryRun) {
|
|
36
|
+
if (dryRun)
|
|
37
|
+
return;
|
|
38
|
+
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
39
|
+
writeFileSync(settingsPath, `${JSON.stringify(next, null, 2)}\n`, "utf8");
|
|
40
|
+
}
|
|
41
|
+
function hashClaudeSettingsState(settings) {
|
|
42
|
+
return createHash("sha256").update(JSON.stringify(settings, null, 2), "utf8").digest("hex");
|
|
43
|
+
}
|
|
44
|
+
export function upsertClaudeUserPromptSubmitHook({ homeDir = resolveUserHome(), dryRun = false } = {}) {
|
|
45
|
+
const state = readClaudeSettings(homeDir);
|
|
46
|
+
if (!state.ok)
|
|
47
|
+
return { changed: false };
|
|
48
|
+
const settings = state.parsed;
|
|
49
|
+
const hooksRoot = (settings.hooks && typeof settings.hooks === "object" && !Array.isArray(settings.hooks))
|
|
50
|
+
? { ...settings.hooks }
|
|
51
|
+
: {};
|
|
52
|
+
const rawEntries = Array.isArray(hooksRoot.UserPromptSubmit) ? [...hooksRoot.UserPromptSubmit] : [];
|
|
53
|
+
const nextEntries = [];
|
|
54
|
+
let changed = false;
|
|
55
|
+
let hadManagedPromptSubmitHook = false;
|
|
56
|
+
let inserted = false;
|
|
57
|
+
let matcherIndex = -1;
|
|
58
|
+
for (const rawEntry of rawEntries) {
|
|
59
|
+
if (!rawEntry || typeof rawEntry !== "object") {
|
|
60
|
+
nextEntries.push(rawEntry);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const entry = { ...rawEntry };
|
|
64
|
+
const hooks = Array.isArray(entry.hooks) ? entry.hooks : [];
|
|
65
|
+
const keptHooks = [];
|
|
66
|
+
for (const hook of hooks) {
|
|
67
|
+
if (isCommandHookItem(hook) && isManagedClaudePromptHookCommand(hook.command)) {
|
|
68
|
+
hadManagedPromptSubmitHook = true;
|
|
69
|
+
changed = true;
|
|
70
|
+
if (!inserted) {
|
|
71
|
+
keptHooks.push({ type: "command", command: CLAUDE_USERPROMPT_SUBMIT_COMMAND });
|
|
72
|
+
inserted = true;
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
keptHooks.push(hook);
|
|
77
|
+
}
|
|
78
|
+
entry.hooks = keptHooks;
|
|
79
|
+
if (entry.matcher === CLAUDE_USERPROMPT_SUBMIT_MATCHER && matcherIndex === -1) {
|
|
80
|
+
matcherIndex = nextEntries.length;
|
|
81
|
+
}
|
|
82
|
+
nextEntries.push(entry);
|
|
83
|
+
}
|
|
84
|
+
const hasCanonicalNow = nextEntries.some((entry) => {
|
|
85
|
+
if (!entry || typeof entry !== "object" || !Array.isArray(entry.hooks))
|
|
86
|
+
return false;
|
|
87
|
+
return entry.hooks.some((hook) => isCommandHookItem(hook) && hook.command === CLAUDE_USERPROMPT_SUBMIT_COMMAND);
|
|
88
|
+
});
|
|
89
|
+
if (!hasCanonicalNow) {
|
|
90
|
+
if (nextEntries.length === 0) {
|
|
91
|
+
nextEntries.push({
|
|
92
|
+
matcher: CLAUDE_USERPROMPT_SUBMIT_MATCHER,
|
|
93
|
+
hooks: [{ type: "command", command: CLAUDE_USERPROMPT_SUBMIT_COMMAND }]
|
|
94
|
+
});
|
|
95
|
+
changed = true;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const targetIndex = matcherIndex >= 0 ? matcherIndex : 0;
|
|
99
|
+
const target = nextEntries[targetIndex];
|
|
100
|
+
const targetHooks = Array.isArray(target.hooks) ? target.hooks : [];
|
|
101
|
+
target.hooks = [...targetHooks, { type: "command", command: CLAUDE_USERPROMPT_SUBMIT_COMMAND }];
|
|
102
|
+
if (typeof target.matcher !== "string")
|
|
103
|
+
target.matcher = CLAUDE_USERPROMPT_SUBMIT_MATCHER;
|
|
104
|
+
changed = true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const filteredEntries = nextEntries.filter((entry) => {
|
|
108
|
+
if (!entry || typeof entry !== "object")
|
|
109
|
+
return true;
|
|
110
|
+
if (!Array.isArray(entry.hooks))
|
|
111
|
+
return true;
|
|
112
|
+
return entry.hooks.length > 0;
|
|
113
|
+
});
|
|
114
|
+
const finalEntries = filteredEntries.length > 0 ? filteredEntries : nextEntries;
|
|
115
|
+
const nextSettings = {
|
|
116
|
+
...settings,
|
|
117
|
+
hooks: {
|
|
118
|
+
...(hooksRoot),
|
|
119
|
+
UserPromptSubmit: finalEntries
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const beforeHash = hashClaudeSettingsState(settings);
|
|
123
|
+
const afterHash = hashClaudeSettingsState(nextSettings);
|
|
124
|
+
if (beforeHash === afterHash)
|
|
125
|
+
return { changed: false, hash: beforeHash };
|
|
126
|
+
writeClaudeSettings(state.path, nextSettings, dryRun);
|
|
127
|
+
return { changed: true, hash: afterHash };
|
|
128
|
+
}
|
|
129
|
+
export function removeClaudeUserPromptSubmitHook({ homeDir = resolveUserHome(), dryRun = false } = {}) {
|
|
130
|
+
const state = readClaudeSettings(homeDir);
|
|
131
|
+
if (!state.ok)
|
|
132
|
+
return { changed: false };
|
|
133
|
+
const settings = state.parsed;
|
|
134
|
+
const hooksRoot = settings.hooks;
|
|
135
|
+
if (!hooksRoot || typeof hooksRoot !== "object" || Array.isArray(hooksRoot))
|
|
136
|
+
return { changed: false };
|
|
137
|
+
const current = Array.isArray(hooksRoot.UserPromptSubmit) ? hooksRoot.UserPromptSubmit : [];
|
|
138
|
+
const next = [];
|
|
139
|
+
let changed = false;
|
|
140
|
+
for (const entry of current) {
|
|
141
|
+
if (!entry || typeof entry !== "object") {
|
|
142
|
+
next.push(entry);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const hooks = Array.isArray(entry.hooks) ? entry.hooks : [];
|
|
146
|
+
const nextHooks = hooks.filter((hook) => !(isCommandHookItem(hook) && isManagedClaudePromptHookCommand(hook.command)));
|
|
147
|
+
if (nextHooks.length !== hooks.length)
|
|
148
|
+
changed = true;
|
|
149
|
+
if (nextHooks.length > 0) {
|
|
150
|
+
next.push({ ...entry, hooks: nextHooks });
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
changed = true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (!changed)
|
|
157
|
+
return { changed: false };
|
|
158
|
+
const nextHooksRoot = { ...hooksRoot };
|
|
159
|
+
if (next.length > 0) {
|
|
160
|
+
nextHooksRoot.UserPromptSubmit = next;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
delete nextHooksRoot.UserPromptSubmit;
|
|
164
|
+
}
|
|
165
|
+
const nextSettings = {
|
|
166
|
+
...settings,
|
|
167
|
+
hooks: nextHooksRoot
|
|
168
|
+
};
|
|
169
|
+
const beforeHash = hashClaudeSettingsState(settings);
|
|
170
|
+
const afterHash = hashClaudeSettingsState(nextSettings);
|
|
171
|
+
if (beforeHash === afterHash)
|
|
172
|
+
return { changed: false, hash: beforeHash };
|
|
173
|
+
writeClaudeSettings(state.path, nextSettings, dryRun);
|
|
174
|
+
return { changed: true, hash: afterHash };
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=cli-init-claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-init-claude.js","sourceRoot":"","sources":["../../cli-init-claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { upsertClaudeUserPromptSubmitHook } from "./cli-init-claude.js";
|
|
2
|
+
// #638: updateSiblingWorkspaceRegistry (B / ~/.agent-flow) retired — no longer called.
|
|
3
|
+
import { basename } from "path";
|
|
4
|
+
import { existsSync } from "fs";
|
|
5
|
+
import { ensureWorkspaceMigrated } from "./cli-ticket-home.js";
|
|
6
|
+
import { syncExposedNativeSkills } from "./cli-skill-commands.js";
|
|
7
|
+
// #623/#622-D: init-time migration of a workspace's tickets to ~/.deuk-agent/tickets/
|
|
8
|
+
// and sync of native skills from the SSOT. Idempotent and best-effort — a failure
|
|
9
|
+
// here must not abort workspace setup.
|
|
10
|
+
// #776: 워크스페이스 마커(.deuk-agent + workspace.json) 민팅. 이건 ticket dir 해석의
|
|
11
|
+
// 전제(findWorkspaceRoot가 마커를 찾아야 함)이므로 runSingleWorkspaceMaintenance의
|
|
12
|
+
// writeTicketIndexJson보다 *먼저* 실행돼야 한다. 과거엔 이 호출이 maintenance 뒤에
|
|
13
|
+
// 있어서, 신규 워크스페이스는 마커 부재 → detectConsumerTicketDir=null → mkdirSync(null)
|
|
14
|
+
// throw → 이 함수 자체에 도달도 못 하고 영구 미등록되는 순서 결함이 있었다.
|
|
15
|
+
function ensureWorkspaceMarkerOnInit(cwd, dryRun) {
|
|
16
|
+
// #645: init is the ONLY entry point allowed to mint a brand-new workspace
|
|
17
|
+
// (marker + workspace.json). allowCreate gates that — without it, reconcile
|
|
18
|
+
// self-heals an already-registered workspace but never registers a new one.
|
|
19
|
+
ensureWorkspaceMigrated(cwd, { dryRun, allowCreate: true });
|
|
20
|
+
}
|
|
21
|
+
function ensureTicketsMigratedOnInit(cwd, dryRun) {
|
|
22
|
+
try {
|
|
23
|
+
syncExposedNativeSkills(cwd, { dryRun });
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
console.warn(`[INIT] skill sync skipped for ${basename(cwd)}: ${err.message}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
import { discoverAllWorkspaces, loadInitConfig, resolvePackageRoot, resolveUserHome } from "./cli-utils.js";
|
|
30
|
+
import { removeFragmentedLocalAgentSurfaces, removeLocalSkillCopies, removeNestedLegacyWorkspaceConfigs, removeRuntimeTemplateCopies } from "./cli-init-migrate.js";
|
|
31
|
+
import { canonicalizeGeneratedCommandReferences, removeDuplicateRuleCopies, runGlobalAgentInstructionSync, runSingleWorkspaceMaintenance, syncCodexMcpEndpointFromWorkspace } from "./cli-init-instructions.js";
|
|
32
|
+
export function runWorkspaceMaintenance(cwd = process.cwd(), dryRun = false, bundleRoot = resolvePackageRoot({ fromUrl: import.meta.url }), opts = {}) {
|
|
33
|
+
dryRun = Boolean(dryRun);
|
|
34
|
+
if (!cwd || !existsSync(cwd))
|
|
35
|
+
return { removed: 0 };
|
|
36
|
+
if (opts.silent) {
|
|
37
|
+
const originalLog = console.log;
|
|
38
|
+
console.log = () => { };
|
|
39
|
+
try {
|
|
40
|
+
return runWorkspaceMaintenance(cwd, dryRun, bundleRoot, { ...opts, silent: false });
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
console.log = originalLog;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const ignoreDirs = [];
|
|
47
|
+
const recursive = Boolean(opts.recursive);
|
|
48
|
+
const homeDir = resolveUserHome(opts);
|
|
49
|
+
const saved = loadInitConfig(cwd, { ...opts, homeDir }) || {};
|
|
50
|
+
const maintenanceOptions = { ...saved, ...opts };
|
|
51
|
+
runGlobalAgentInstructionSync(dryRun, bundleRoot, homeDir);
|
|
52
|
+
const codexMcpResult = syncCodexMcpEndpointFromWorkspace(cwd, { dryRun, homeDir });
|
|
53
|
+
const claudeSettingsResult = upsertClaudeUserPromptSubmitHook({ dryRun, homeDir });
|
|
54
|
+
// #638: the ~/.agent-flow sibling registry (B) is retired. Workspace candidates now
|
|
55
|
+
// come solely from ~/.deuk-agent/tickets/{uuid}/workspace.json (written by reconcile),
|
|
56
|
+
// so we no longer write B here — it only went stale and spawned ambiguous ghosts.
|
|
57
|
+
removeNestedLegacyWorkspaceConfigs(cwd, dryRun, ignoreDirs);
|
|
58
|
+
removeRuntimeTemplateCopies(cwd, dryRun);
|
|
59
|
+
removeLocalSkillCopies(cwd, dryRun);
|
|
60
|
+
removeDuplicateRuleCopies(cwd, dryRun);
|
|
61
|
+
canonicalizeGeneratedCommandReferences(cwd, bundleRoot, dryRun);
|
|
62
|
+
const removed = removeFragmentedLocalAgentSurfaces(cwd, dryRun);
|
|
63
|
+
const submodules = recursive ? discoverAllWorkspaces(cwd, ignoreDirs) : [cwd];
|
|
64
|
+
if (recursive && !submodules.includes(cwd))
|
|
65
|
+
submodules.push(cwd);
|
|
66
|
+
const failures = [];
|
|
67
|
+
for (const subCwd of submodules) {
|
|
68
|
+
try {
|
|
69
|
+
// #776: 마커/registry 민팅을 *먼저*. ticket dir 작업(writeTicketIndexJson)이
|
|
70
|
+
// 마커 존재를 전제하므로, 신규 워크스페이스는 이 단계가 선행돼야 한다.
|
|
71
|
+
ensureWorkspaceMarkerOnInit(subCwd, dryRun);
|
|
72
|
+
runSingleWorkspaceMaintenance(subCwd, dryRun, bundleRoot, maintenanceOptions);
|
|
73
|
+
// #623: init is one of the two migration entry points (the other is ticket
|
|
74
|
+
// command entry). Move this workspace's tickets to home as part of setup.
|
|
75
|
+
ensureTicketsMigratedOnInit(subCwd, dryRun);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
// #776: 치명적 실패를 catch가 삼키고 EXIT0+[DONE]로 위장하던 것을 막는다.
|
|
79
|
+
// 실패를 집계해 호출부(cli.ts)가 [DONE] 출력을 억제하고 종료코드를 세우게 한다.
|
|
80
|
+
console.error(`[ERROR] Failed to initialize workspace ${basename(subCwd)}: ${err.message}`);
|
|
81
|
+
failures.push({ workspace: basename(subCwd), message: err.message });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
removed,
|
|
86
|
+
failures,
|
|
87
|
+
initFailed: failures.length > 0,
|
|
88
|
+
codexMcpChanged: Boolean(codexMcpResult?.changed),
|
|
89
|
+
codexMcpUrl: codexMcpResult?.url || null,
|
|
90
|
+
claudeSettingsChanged: Boolean(claudeSettingsResult?.changed),
|
|
91
|
+
claudeSettingsHash: claudeSettingsResult?.hash || null
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function formatInitCompletionMessage(cwd, dryRun = false) {
|
|
95
|
+
const label = dryRun ? "Dry-run complete" : "Init complete";
|
|
96
|
+
return `[DONE] ${label} for ${basename(cwd)}. Rules and pointers are ready. \`이슈분석 티켓\`이라고 해보세요.`;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=cli-init-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-init-commands.js","sourceRoot":"","sources":["../../cli-init-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
import { createHash } from "crypto";
|
|
3
|
+
import { LEGACY_DEUK, DEUK_ROOT_DIR, makePath } from "./cli-utils.js";
|
|
4
|
+
export function safeReadText(absPath, fallback = "") {
|
|
5
|
+
try {
|
|
6
|
+
return readFileSync(absPath, "utf8");
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return fallback;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export const MANAGED_BLOCK_BEGIN = "<!-- deuk-agent-managed:begin -->";
|
|
13
|
+
export const MANAGED_BLOCK_END = "<!-- deuk-agent-managed:end -->";
|
|
14
|
+
export const GLOBAL_POINTER_BEGIN_PREFIX = "--- DEUK_AGENT_FLOW_BEGIN :";
|
|
15
|
+
export const GLOBAL_POINTER_END = "--- DEUK_AGENT_FLOW_END";
|
|
16
|
+
export const CLAUDE_SETTINGS_PATH = makePath(".claude", "settings.json");
|
|
17
|
+
export const CLAUDE_USERPROMPT_SUBMIT_MATCHER = "";
|
|
18
|
+
// #871-followup: drop `ticket use --latest` — it stole focus to the cwd index's
|
|
19
|
+
// newest ticket every turn, ignoring the per-session workspace cookie (this is the
|
|
20
|
+
// "지멋대로 아무 워크스페이스를 잡는" bug). `rules` already derives the active
|
|
21
|
+
// ticket from the session cookie when given --session-id, so just forward the
|
|
22
|
+
// session id and let rules resolve the last-used workspace. Claude exposes the
|
|
23
|
+
// turn's session id as $CLAUDE_SESSION_ID to UserPromptSubmit hooks.
|
|
24
|
+
export const CLAUDE_USERPROMPT_SUBMIT_COMMAND = "deuk-agent-flow rules --session-id \"$CLAUDE_SESSION_ID\" 2>/dev/null || deuk-agent-flow rules";
|
|
25
|
+
export const CANONICAL_INIT_CLEANUP_PATHS = {
|
|
26
|
+
runtimeTemplateCopies: [makePath(DEUK_ROOT_DIR, "templates"), LEGACY_DEUK.templateDir],
|
|
27
|
+
localSkillCopies: [
|
|
28
|
+
makePath(DEUK_ROOT_DIR, "skill-templates"),
|
|
29
|
+
makePath(".claude", "skills"),
|
|
30
|
+
makePath(".cursor", "rules", "deuk-agent-skills.mdc")
|
|
31
|
+
],
|
|
32
|
+
duplicateRuleCopies: [makePath(DEUK_ROOT_DIR, "rules"), makePath(".cursor", "rules", "deuk-agent-rule-multi-ai-workflow.mdc")],
|
|
33
|
+
// Per-workspace agent surfaces are removed to keep repos clean — the rule lives
|
|
34
|
+
// once in the agent-flow-designated home, not duplicated into every workspace.
|
|
35
|
+
// deuk-EXCLUSIVE files (filename identifies deuk) — safe to delete the whole file.
|
|
36
|
+
localAgentSurfaces: [
|
|
37
|
+
makePath(".cursor", "rules", "deuk-agent.mdc"),
|
|
38
|
+
makePath(".claude", "rules", "deuk-agent.md"),
|
|
39
|
+
makePath(".windsurf", "rules", "deuk-agent.md"),
|
|
40
|
+
makePath(".aiassistant", "rules", "deuk-agent.md"),
|
|
41
|
+
".cursorrules",
|
|
42
|
+
".windsurfrules"
|
|
43
|
+
],
|
|
44
|
+
// SHARED-name files that may also carry the user's own content — strip only the
|
|
45
|
+
// deuk-managed block (preserve user settings); delete only if nothing else remains.
|
|
46
|
+
sharedAgentSurfaces: [
|
|
47
|
+
makePath(".codex", "AGENTS.md"),
|
|
48
|
+
makePath(".github", "copilot-instructions.md"),
|
|
49
|
+
"CLAUDE.md",
|
|
50
|
+
"GEMINI.md"
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
// ─── Managed Block 헬퍼 ──────────────────────────────────────────────────────
|
|
54
|
+
export function wrapManagedBlock(content) {
|
|
55
|
+
return `${MANAGED_BLOCK_BEGIN}\n${String(content || "").trimEnd()}\n${MANAGED_BLOCK_END}`;
|
|
56
|
+
}
|
|
57
|
+
export function hashManagedContent(content) {
|
|
58
|
+
return createHash("sha256").update(String(content || ""), "utf8").digest("hex");
|
|
59
|
+
}
|
|
60
|
+
export function splitManagedBlock(content) {
|
|
61
|
+
const current = String(content || "");
|
|
62
|
+
if (!current.includes(MANAGED_BLOCK_BEGIN) || !current.includes(MANAGED_BLOCK_END))
|
|
63
|
+
return null;
|
|
64
|
+
const beginIdx = current.indexOf(MANAGED_BLOCK_BEGIN);
|
|
65
|
+
const endIdx = current.indexOf(MANAGED_BLOCK_END, beginIdx);
|
|
66
|
+
if (beginIdx === -1 || endIdx === -1)
|
|
67
|
+
return null;
|
|
68
|
+
return {
|
|
69
|
+
before: current.slice(0, beginIdx).trimEnd(),
|
|
70
|
+
managed: current.slice(beginIdx + MANAGED_BLOCK_BEGIN.length, endIdx).trim(),
|
|
71
|
+
after: current.slice(endIdx + MANAGED_BLOCK_END.length).trimStart(),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function mergeManagedBlock(existing, managedContent) {
|
|
75
|
+
const current = String(existing || "");
|
|
76
|
+
const nextBlock = wrapManagedBlock(managedContent);
|
|
77
|
+
if (!current.trim())
|
|
78
|
+
return `${nextBlock}\n`;
|
|
79
|
+
const currentBlock = splitManagedBlock(current);
|
|
80
|
+
if (currentBlock) {
|
|
81
|
+
return [currentBlock.before, nextBlock, currentBlock.after].filter(Boolean).join("\n\n").trimEnd() + "\n";
|
|
82
|
+
}
|
|
83
|
+
const cleaned = current.trimEnd();
|
|
84
|
+
const managedBody = String(managedContent || "").trim();
|
|
85
|
+
if (managedBody && cleaned.includes(managedBody))
|
|
86
|
+
return cleaned + "\n";
|
|
87
|
+
return `${cleaned}\n\n${nextBlock}\n`;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=cli-init-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-init-core.js","sourceRoot":"","sources":["../../cli-init-core.ts"],"names":[],"mappings":"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"}
|