deuk-agent-flow 4.0.35 → 4.0.36

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 CHANGED
@@ -12,6 +12,13 @@
12
12
 
13
13
  - **cli:** 티켓 탐색이 상위 워크스페이스를 상속하지 않고 현재 agent-rule 경계에서 멈추도록 수정했습니다.
14
14
 
15
+ ## [4.0.36] - 2026-05-09
16
+
17
+ ### 수정됨 (Fixed)
18
+
19
+ - **init:** 첫 실행 대화형 설정을 workspace 용도 선택 하나로 줄이고, 나머지는 프로젝트 디렉터리 성격으로 추론하며, Deuk AgentContext MCP 선택지를 숨김 처리하고, 선택 후 먹통으로 설정 완료가 실패하던 흐름을 수정했습니다.
20
+ - **rules:** 최초 티켓 생성/사용 후 클릭 가능한 `Ticket start` 줄이 계속 보이도록 강제해, 승인 요청만 남고 활성 티켓이 숨겨지는 응답을 막았습니다.
21
+
15
22
  ## [4.0.35] - 2026-05-09
16
23
 
17
24
  ### 수정됨 (Fixed)
package/CHANGELOG.md CHANGED
@@ -12,6 +12,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
12
12
 
13
13
  - **cli:** stop ticket discovery at the current agent-rule boundary instead of inheriting the parent workspace.
14
14
 
15
+ ## [4.0.36] - 2026-05-09
16
+
17
+ ### Fixed
18
+
19
+ - **init:** reduce first-run interactive setup to the workspace-purpose choice, infer the remaining defaults from the project directory, hide the Deuk AgentContext MCP choice, and avoid the post-choice stall that prevented setup completion.
20
+ - **rules:** require the clickable `Ticket start` line to stay visible after first ticket creation/use, preventing approval-only replies from hiding the active ticket.
21
+
15
22
  ## [4.0.35] - 2026-05-09
16
23
 
17
24
  ### Fixed
package/README.ko.md CHANGED
@@ -2,7 +2,7 @@
2
2
  <br />
3
3
  <img src="docs/assets/architecture-v3.png" width="800" alt="DeukAgentFlow Architecture" />
4
4
  <br />
5
- <h1>Deuk Agent Flow v4.0.34</h1>
5
+ <h1>Deuk Agent Flow v4.0.36</h1>
6
6
  <p>
7
7
  <a href="https://www.npmjs.com/package/deuk-agent-flow"><img src="https://img.shields.io/npm/v/deuk-agent-flow.svg?label=deuk-flow" alt="deuk-flow npm version" /></a>
8
8
  <a href="https://www.npmjs.com/package/deuk-agent-flow"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fjoygram%2FDeukAgentFlow%2Fmaster%2Fdocs%2Fbadges%2Fnpm-downloads.json" alt="deuk-flow combined npm downloads" /></a>
@@ -66,7 +66,7 @@ Deuk Agent Flow
66
66
  | 팀 기억 강화 | 완료된 작업이 검색 가능한 프로젝트 히스토리가 됨 |
67
67
 
68
68
  > **현재 배포 기준:**
69
- > v4.0.0은 에이전트 기반 리포지토리에 배포해 사용할 수 있는 상태입니다. 현재는 **OpenAI Codex**와 **GitHub Copilot** 환경에서 가장 안정적으로 동작합니다. Cursor, Windsurf, Claude Code도 포인터 구조로 지원하지만, 워크스페이스별 검증을 권장합니다. Deuk AgentContext MCP는 선택형 기억 계층이며, MCP 서버 등록은 `init`에 딸려 들어가지 않고 별도로 설정합니다.
69
+ > v4.0.36은 에이전트 기반 리포지토리에 배포해 사용할 수 있는 상태입니다. 대화형 `init`은 이제 workspace 용도만 묻고, 나머지 설정은 프로젝트 디렉터리 성격으로 추론하며, Deuk AgentContext MCP 선택지는 첫 설정에서 숨김 처리하고, 이전의 다중 질문/먹통 완료 실패를 피합니다. 티켓 생성/사용 뒤에도 승인 요청 전에 클릭 가능한 `Ticket start` 줄이 계속 보이도록 했습니다. 현재는 **OpenAI Codex**와 **GitHub Copilot** 환경에서 가장 안정적으로 동작합니다. Cursor, Windsurf, Claude Code도 포인터 구조로 지원하지만, 워크스페이스별 검증을 권장합니다. Deuk AgentContext MCP는 선택형 기억 계층이며, MCP 서버 등록은 `init`에 딸려 들어가지 않고 별도로 설정합니다.
70
70
  > **아키텍처 기반:**
71
71
  > 거대하고 무거운 레거시 `.cursorrules` 방식을 공식적으로 폐기했습니다. v3.0은 `AGENTS.md`를 단일 진실 공급원으로 사용하는 **Hub-Spoke 모델**을 도입하여, IDE별 규칙은 얇은 진입점 포인터 역할만 수행합니다.
72
72
 
@@ -138,6 +138,8 @@ npm install -g deuk-agent-flow
138
138
  deuk-agent-flow init
139
139
  ```
140
140
 
141
+ 대화형 init의 선택지는 workspace 용도 질문 하나로 끝납니다. 문서 언어, workflow mode, ticket 공유, agent pointer, MCP memory 기본값은 프로젝트 디렉터리 성격으로 추론하거나 private 기본값으로 처리합니다.
142
+
141
143
  이후 일상 작업은 명령을 직접 치기보다 에이전트에게 짧게 말합니다. 예: "진행", "다음", "원인 다시 파악".
142
144
 
143
145
  단일 저장소라면 해당 저장소 루트에서 `deuk-agent-flow init`을 실행합니다. 여러 DeukAgentFlow 프로젝트를 포함한 루트 워크스페이스라면 그 워크스페이스 루트에서 같은 명령을 실행합니다. `init`은 루트 포인터와 자체 `PROJECT_RULE.md` / `.deuk-agent/` 상태를 가진 하위 워크스페이스를 함께 갱신합니다.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  <br />
3
3
  <img src="docs/assets/architecture-v3.png" width="800" alt="DeukAgentFlow Architecture" />
4
4
  <br />
5
- <h1>Deuk Agent Flow v4.0.34</h1>
5
+ <h1>Deuk Agent Flow v4.0.36</h1>
6
6
  <p>
7
7
  <a href="https://www.npmjs.com/package/deuk-agent-flow"><img src="https://img.shields.io/npm/v/deuk-agent-flow.svg?label=deuk-flow" alt="deuk-flow npm version" /></a>
8
8
  <a href="https://www.npmjs.com/package/deuk-agent-flow"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fjoygram%2FDeukAgentFlow%2Fmaster%2Fdocs%2Fbadges%2Fnpm-downloads.json" alt="deuk-flow combined npm downloads" /></a>
@@ -66,7 +66,7 @@ Repo-owned work
66
66
  | Better team memory | Completed work becomes searchable project history |
67
67
 
68
68
  > **Current readiness:**
69
- > v4.0.0 is deployment-ready for agent-driven repositories. It is currently most reliable in **OpenAI Codex** and **GitHub Copilot** workflows. Cursor, Windsurf, and Claude Code remain supported through pointer-style integration, but they should be validated per workspace before rollout. Deuk AgentContext MCP is an optional memory layer; MCP server registration is separate from `init`.
69
+ > v4.0.36 is deployment-ready for agent-driven repositories. Interactive `init` now asks only the workspace purpose, infers the remaining setup from the project directory, hides the Deuk AgentContext MCP choice during first setup, and completes without the earlier multi-prompt stall. Ticket creation/use also keeps the clickable `Ticket start` line visible before approval is requested. It is currently most reliable in **OpenAI Codex** and **GitHub Copilot** workflows. Cursor, Windsurf, and Claude Code remain supported through pointer-style integration, but they should be validated per workspace before rollout. Deuk AgentContext MCP is an optional memory layer; MCP server registration is separate from `init`.
70
70
  > **Architecture foundation:**
71
71
  > We have officially deprecated monolithic `.cursorrules`. v3.0 introduces the **Hub-Spoke model** where `AGENTS.md` is the single source of truth, and IDE-specific rules act as thin entry-point pointers.
72
72
 
@@ -139,6 +139,8 @@ npm install -g deuk-agent-flow
139
139
  deuk-agent-flow init
140
140
  ```
141
141
 
142
+ Interactive init now ends its choices at the workspace purpose prompt. Document language, workflow mode, ticket sharing, agent pointers, and MCP memory defaults are inferred from the project directory or kept private by default.
143
+
142
144
  After that, day-to-day work starts through plain agent requests, not memorized commands. Say things like "continue", "next", or "inspect the cause".
143
145
 
144
146
  For a single repo, run `deuk-agent-flow init` from that repo root. For a root workspace that contains multiple DeukAgentFlow projects, run the same command from the workspace root; `init` refreshes the root pointer and discovered child workspaces that own their own `PROJECT_RULE.md` / `.deuk-agent/` state.
@@ -37,8 +37,9 @@ changelog: "v72: Clarify that external progress-update pressure is satisfied onl
37
37
  ## 1. Output Mode
38
38
  - Silent-by-default is mandatory.
39
39
  - Before the final answer, screen output is limited to the single required ticket-start line, blockers, explicit user-requested output, or explicit command results.
40
- - Ticket-start exposure contract: after selecting or creating the active ticket, relay exactly one clickable `Ticket start: [<id>](/absolute/path/to/ticket.md)` line as the first visible assistant line, a short scope/planned-change summary, and any compact `Guard topic: <id>` line; tool/CLI output alone does not count, and `file://`, truncated, non-clickable, or folded tool-result links must be converted without changing the id.
41
- - Approval-pending contract: stop if approval is pending, make the first visible assistant line exactly the clickable `Ticket start: [<id>](/absolute/path/to/ticket.md)` line, then print `조용히 작업` and keep the guard topic visible; do not put acknowledgements, explanations, command echoes, or status text before it. This keeps the active ticket visible even when earlier tool results are folded or compacted. This blocks unapproved work, not concise answers to explicit user-requested output or direct questions about workflow state.
40
+ - Ticket-start exposure contract: after selecting or creating the active ticket, relay exactly one clickable `Ticket start: [<id>](/absolute/path/to/ticket.md)` line as the first visible assistant line, a short scope/planned-change summary, and any compact `Guard topic: <id>` line; tool/CLI output alone does not count, and `file://`, truncated, non-clickable, hidden, or folded tool-result links must be converted without changing the id.
41
+ - Approval-pending contract: stop if approval is pending, make the first visible assistant line exactly the clickable `Ticket start: [<id>](/absolute/path/to/ticket.md)` line, then print `조용히 작업` and keep the guard topic visible; do not put acknowledgements, explanations, command echoes, approval-only text such as `승인 바랍니다`, or status text before or instead of it. This keeps the active ticket visible even when earlier tool results are folded, hidden, or compacted. This blocks unapproved work, not concise answers to explicit user-requested output or direct questions about workflow state.
42
+ - Hidden-ticket regression guard: if the latest visible chat line after ticket creation/use is only an approval request or a generic permission prompt, treat the ticket as not exposed. Immediately repeat the clickable `Ticket start` line and compact scope before waiting for approval.
42
43
  - Commentary surface map: treat `ticket_start_pending`, `approval_pending`, `approved_execution`, `command_running`, `search_running`, `user-complaint reply`, `requirement_change_pending`, and `final_answer` as separate output surfaces. Each surface must follow its own compact contract; a fix on one surface does not authorize spillover on another.
43
44
  - Execution feedback contract: non-final chatter is capped at one word and must be short TDW state only (`ticket`, `approval`, `guard`, `context`, `verify`); do not repeat the same state or narrate routine reads, edits, formatting, lint retries, validation progress, or "almost done" status.
44
45
  - Running-surface contract: `approved_execution`, `command_running`, and `search_running` all use the same low-token rule. Unless the user explicitly requested live narration or a blocker must be surfaced, output must stay empty or one-word TDW state only; command/search progress does not create a separate narration allowance.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deuk-agent-flow",
3
- "version": "4.0.35",
3
+ "version": "4.0.36",
4
4
  "description": "Keep AI coding work from vanishing between chats: repo-owned tickets, scope, verification, and memory for AGENTS.md-powered agents.",
5
5
  "keywords": [
6
6
  "agents-md",
@@ -1563,7 +1563,7 @@ This pointer is a thin bootstrap, not a second workflow contract.
1563
1563
  2. Then read local \`PROJECT_RULE.md\` and internally identify applicable DC-* rules.
1564
1564
  3. After the core hub is loaded, \`core-rules/AGENTS.md\` is the DeukAgentFlow SSoT for TDW, RAG, silence, scope, and verification.
1565
1565
 
1566
- Do not print pointer/core metadata, version, DC-* lists, progress commentary, or interim summaries. When approval is pending, make the first visible assistant line exactly the clickable \`Ticket start: [<id>](/absolute/path/to/ticket.md)\` line. Before the final answer, only the single required ticket-start line, blockers, explicit user-requested output, or explicit command results may appear. During approved_execution, command_running, or search_running, stay silent unless the user explicitly asks for live narration or a blocker/user decision must be surfaced.
1566
+ Do not print pointer/core metadata, version, DC-* lists, progress commentary, or interim summaries. When approval is pending, make the first visible assistant line exactly the clickable \`Ticket start: [<id>](/absolute/path/to/ticket.md)\` line; never leave only an approval request such as \`승인 바랍니다\` visible after ticket creation/use. Before the final answer, only the single required ticket-start line, blockers, explicit user-requested output, or explicit command results may appear. During approved_execution, command_running, or search_running, stay silent unless the user explicitly asks for live narration or a blocker/user decision must be surfaced.
1567
1567
  `;
1568
1568
 
1569
1569
  if (spoke.format === "mdc") {
@@ -1,7 +1,7 @@
1
1
  import { createInterface } from "readline";
2
2
  import { existsSync, readFileSync } from "fs";
3
3
  import { join } from "path";
4
- import { WORKSPACE_KINDS, STACKS, AGENT_TOOLS, DOC_LANGUAGE_CHOICES, resolveDocsLanguage, normalizeWorkflowMode, WORKFLOW_MODE_EXECUTE, WORKFLOW_MODE_PLAN } from "./cli-utils.mjs";
4
+ import { WORKSPACE_KINDS, AGENT_TOOLS, resolveDocsLanguage, normalizeWorkflowMode, WORKFLOW_MODE_EXECUTE } from "./cli-utils.mjs";
5
5
 
6
6
  export async function ask(rl, question) {
7
7
  return new Promise((resolve) => rl.question(question, resolve));
@@ -39,7 +39,37 @@ export async function selectMany(rl, prompt, choices) {
39
39
  }
40
40
  }
41
41
 
42
+ function hasAny(cwd, names) {
43
+ return names.some((name) => existsSync(join(cwd, name)));
44
+ }
45
+
46
+ export function inferInitDefaults(cwd, opts = {}) {
47
+ const packageJsonPath = join(cwd, "package.json");
48
+ const packageJson = existsSync(packageJsonPath)
49
+ ? readFileSync(packageJsonPath, "utf8")
50
+ : "";
42
51
 
52
+ const stack = opts.stack
53
+ || (hasAny(cwd, ["pyproject.toml", "requirements.txt", "notebooks"]) ? "data" : null)
54
+ || (hasAny(cwd, ["Dockerfile", "docker-compose.yml", "docker-compose.yaml", "k8s", "terraform"]) ? "infra" : null)
55
+ || (hasAny(cwd, ["Cargo.toml", "go.mod", "pom.xml", "build.gradle"]) ? "backend" : null)
56
+ || (packageJson && /"(@vitejs\/|vite|next|react|vue|svelte|astro)"/i.test(packageJson) ? "web" : null)
57
+ || (packageJson ? "backend" : null)
58
+ || "none";
59
+
60
+ const tools = AGENT_TOOLS.map((tool) => tool.value);
61
+
62
+ return {
63
+ stack,
64
+ agentTools: opts.agentTools ?? tools,
65
+ docsLanguage: resolveDocsLanguage(opts.docsLanguage ?? "auto"),
66
+ workflowMode: normalizeWorkflowMode(opts.workflowMode ?? opts.workflow ?? opts.approval ?? WORKFLOW_MODE_EXECUTE),
67
+ shareTickets: opts.shareTickets ?? false,
68
+ contextMcp: opts.contextMcp ?? "skip",
69
+ remoteSync: opts.remoteSync ?? false,
70
+ pipelineUrl: opts.pipelineUrl || ""
71
+ };
72
+ }
43
73
 
44
74
  export async function runInteractive(opts) {
45
75
  const rl = createInterface({ input: process.stdin, output: process.stdout });
@@ -47,20 +77,7 @@ export async function runInteractive(opts) {
47
77
  console.log("\nDeukAgentFlow init — let's configure your workspace.\n");
48
78
 
49
79
  const workspaceKind = await selectOne(rl, "What kind of workspace is this?", WORKSPACE_KINDS);
50
- const stack = await selectOne(rl, "What technical surface should tickets assume?", STACKS);
51
- const tools = await selectMany(
52
- rl,
53
- "Which AI clients should receive thin workflow pointers? You can rerun init later to add more.",
54
- AGENT_TOOLS
55
- );
56
- const docsLanguage = await selectOne(rl, "What document language should generated tickets/plans use?", DOC_LANGUAGE_CHOICES);
57
- const workflowMode = opts.workflowMode
58
- ? normalizeWorkflowMode(opts.workflowMode)
59
- : await selectOne(rl, "What workflow mode should be saved?", [
60
- { label: "Plan mode (prepare only)", value: WORKFLOW_MODE_PLAN },
61
- { label: "Execute mode (apply changes)", value: WORKFLOW_MODE_EXECUTE },
62
- ]);
63
- const shareTickets = await askYesNo("Do you want to share (git-track) tickets for this repository?", false);
80
+ const defaults = inferInitDefaults(opts.cwd, opts);
64
81
 
65
82
  const targetAgents = join(opts.cwd, "AGENTS.md");
66
83
  let agentsDefault = "inject";
@@ -71,47 +88,30 @@ export async function runInteractive(opts) {
71
88
  const content = readFileSync(targetAgents, "utf8");
72
89
  const hasMarkers = content.includes("deuk-agent-rule:begin") || content.includes("## DeukAgentFlow");
73
90
  if (!hasMarkers) {
74
- const choice = await selectOne(rl, "AGENTS.md exists but has no markers. How to apply?", [
75
- { label: "Append managed block at the end (safe)", value: "inject" },
76
- { label: "Overwrite entire AGENTS.md", value: "overwrite" },
77
- { label: "Skip AGENTS.md", value: "skip" },
78
- ]);
79
- agentsDefault = choice;
91
+ agentsDefault = "inject";
92
+ console.log("\n AGENTS.md exists without managed markers will append a managed block.");
80
93
  }
81
94
  }
82
95
 
83
- const contextMcp = opts.contextMcp || await selectOne(rl, "Deuk AgentContext memory MCP connection?", [
84
- { label: "Skip for now (Flow works without memory MCP)", value: "skip" },
85
- { label: "Already configured in this client/workspace", value: "configured" },
86
- { label: "Plan to configure later", value: "later" },
87
- ]);
88
- const remoteSync = opts.remoteSync !== undefined
89
- ? opts.remoteSync
90
- : (await askYesNo("Configure an external workflow sync endpoint? (Experimental; not Deuk AgentContext MCP)", false));
91
- let pipelineUrl = opts.pipelineUrl || "";
92
- if (remoteSync && !pipelineUrl) {
93
- pipelineUrl = (await ask(rl, "Enter external workflow sync endpoint URL: ")).trim();
94
- }
95
-
96
96
  opts.agents = opts.agents ?? agentsDefault;
97
97
  opts.workspaceKind = workspaceKind;
98
98
  opts.kind = workspaceKind;
99
- opts.stack = stack;
100
- opts.agentTools = tools;
101
- opts.docsLanguage = resolveDocsLanguage(docsLanguage);
102
- opts.workflowMode = normalizeWorkflowMode(opts.workflowMode || workflowMode);
103
- opts.shareTickets = shareTickets;
104
- opts.contextMcp = contextMcp;
105
- opts.remoteSync = remoteSync;
106
- opts.pipelineUrl = pipelineUrl;
99
+ opts.stack = defaults.stack;
100
+ opts.agentTools = defaults.agentTools;
101
+ opts.docsLanguage = defaults.docsLanguage;
102
+ opts.workflowMode = defaults.workflowMode;
103
+ opts.shareTickets = defaults.shareTickets;
104
+ opts.contextMcp = defaults.contextMcp;
105
+ opts.remoteSync = defaults.remoteSync;
106
+ opts.pipelineUrl = defaults.pipelineUrl;
107
107
 
108
108
  console.log("\n Workspace Kind: " + workspaceKind);
109
- console.log(" Technical Surface: " + stack);
110
- console.log(" AI Clients: " + (tools.join(", ") || "none"));
109
+ console.log(" Technical Surface: " + opts.stack);
110
+ console.log(" AI Clients: " + (opts.agentTools.join(", ") || "all supported clients"));
111
111
  console.log(" Docs Language: " + opts.docsLanguage);
112
112
  console.log(" Workflow Mode: " + opts.workflowMode);
113
113
  console.log(" Share Tickets: " + (opts.shareTickets ? "Yes (Shared)" : "No (Private)"));
114
- console.log(" Deuk AgentContext MCP: " + opts.contextMcp);
114
+ console.log(" Deuk AgentContext MCP: hidden during init");
115
115
  console.log(" External Sync: " + (opts.remoteSync ? "Enabled" : "Disabled"));
116
116
  if (opts.remoteSync) console.log(" Sync URL: " + opts.pipelineUrl);
117
117
  console.log(" AGENTS: " + opts.agents + "\n");