auq-mcp-server 1.3.1 β†’ 1.3.2

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/README.md CHANGED
@@ -200,9 +200,7 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
200
200
 
201
201
  ### Option B: Official OpenCode Plugin
202
202
 
203
- We now have **official OpenCode plugin support**! We support OpenCode because OpenCode's MCP server seems to have some limitations (timeout), so we created an OpenCode-specific plugin that works perfectly together with OpenCode.
204
-
205
- The OpenCode plugin allows OpenCode to call `auq ask` directly (without MCP), providing seamless integration with OpenCode's workflow.
203
+ **Direct integration** for OpenCode users. Bypasses MCP limitations by calling `auq ask` directly.
206
204
 
207
205
  #### Configuration
208
206
 
@@ -236,6 +234,53 @@ auq --version # Show version
236
234
  auq --help # Show help
237
235
  ```
238
236
 
237
+ <details>
238
+ <summary><strong>πŸ” auq ask λͺ…λ Ήμ–΄ 상세 μ„€λͺ… (ν΄λ¦­ν•˜μ—¬ 펼치기)</strong></summary>
239
+
240
+ <br>
241
+
242
+ `auq ask`λŠ” AI μ½”λ”© μ—μ΄μ „νŠΈκ°€ μ‚¬μš©μžμ—κ²Œ μ§ˆλ¬Έμ„ ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 핡심 λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.
243
+
244
+ #### κΈ°λ³Έ μ‚¬μš©λ²•
245
+
246
+ ```bash
247
+ auq ask
248
+ ```
249
+
250
+ 이 λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ λŒ€ν™”ν˜• 터미널 μΈν„°νŽ˜μ΄μŠ€κ°€ μ‹œμž‘λ˜μ–΄ AI μ—μ΄μ „νŠΈμ˜ 질문 μ„ΈνŠΈλ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€.
251
+
252
+ #### μž‘λ™ 방식
253
+
254
+ 1. **질문 μˆ˜μ‹  λŒ€κΈ°**: AI μ—μ΄μ „νŠΈ(MCP ν΄λΌμ΄μ–ΈνŠΈ)κ°€ μ§ˆλ¬Έμ„ 보내면 μžλ™μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€
255
+ 2. **질문 μ„ΈνŠΈ 처리**: μ—¬λŸ¬ 개의 μ—°κ΄€λœ μ§ˆλ¬Έμ„ ν•˜λ‚˜μ˜ μ„ΈνŠΈλ‘œ λ¬Άμ–΄μ„œ 처리
256
+ 3. **μ‚¬μš©μž 응닡**: 각 μ§ˆλ¬Έμ— λŒ€ν•΄ 닡변을 μž…λ ₯ν•˜κ±°λ‚˜ κ±΄λ„ˆλ›Έ 수 있음
257
+ 4. **응닡 전솑**: λͺ¨λ“  닡변을 μ™„λ£Œν•˜λ©΄ AI μ—μ΄μ „νŠΈλ‘œ κ²°κ³Όκ°€ μ „μ†‘λ©λ‹ˆλ‹€
258
+
259
+ #### μ£Όμš” νŠΉμ§•
260
+
261
+ - **비차단 방식**: AIκ°€ μ§ˆλ¬Έμ„ λ³΄λ‚΄λŠ” λ™μ•ˆμ—λ„ 계속 μž‘μ—…ν•  수 있음
262
+ - **닀쀑 μ—μ΄μ „νŠΈ 지원**: μ—¬λŸ¬ AI μ—μ΄μ „νŠΈμ˜ μ§ˆλ¬Έμ„ λ™μ‹œμ— 처리
263
+ - **μ„Έμ…˜ 관리**: 각 질문 μ„ΈνŠΈλŠ” 독립적인 μ„Έμ…˜μœΌλ‘œ 관리됨
264
+ - **νƒ€μž„μ•„μ›ƒ 처리**: 일정 μ‹œκ°„ λ™μ•ˆ 응닡이 μ—†μœΌλ©΄ μ„Έμ…˜μ΄ μžλ™ μ’…λ£Œ
265
+
266
+ #### μ˜ˆμ‹œ μ›Œν¬ν”Œλ‘œμš°
267
+
268
+ ```
269
+ 1. AI μ—μ΄μ „νŠΈκ°€ λ³΅μž‘ν•œ μ½”λ“œλ₯Ό μž‘μ„± 쀑
270
+ 2. AIκ°€ "이 ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μ„ μ–΄λ–»κ²Œ ν• κΉŒμš”?"라고 질문
271
+ 3. auq askκ°€ μ‹€ν–‰λ˜μ–΄ 질문이 터미널에 ν‘œμ‹œ
272
+ 4. μ‚¬μš©μžκ°€ λ‹΅λ³€ μž…λ ₯
273
+ 5. AIκ°€ 닡변을 λ°›μ•„μ„œ μ½”λ“œ μž‘μ„± 계속 μ§„ν–‰
274
+ ```
275
+
276
+ #### 문제 ν•΄κ²°
277
+
278
+ - **질문이 ν‘œμ‹œλ˜μ§€ μ•ŠμŒ**: MCP μ„œλ²„κ°€ μ œλŒ€λ‘œ μ‹€ν–‰λ˜κ³  μžˆλŠ”μ§€ 확인
279
+ - **응닡이 μ „μ†‘λ˜μ§€ μ•ŠμŒ**: λ„€νŠΈμ›Œν¬ μ—°κ²°κ³Ό μ„Έμ…˜ μƒνƒœ 확인
280
+ - **μ„Έμ…˜μ΄ 쀑단됨**: νƒ€μž„μ•„μ›ƒ μ„€μ •μ΄λ‚˜ μ„Έμ…˜ 관리 확인
281
+
282
+ </details>
283
+
239
284
  ---
240
285
 
241
286
  ### Manual session cleanup
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auq-mcp-server",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "main": "dist/index.js",
5
5
  "bin": {
6
6
  "auq": "dist/bin/auq.js"
@@ -19,7 +19,8 @@
19
19
  "prepare": "npm run build",
20
20
  "postinstall": "node scripts/postinstall.cjs",
21
21
  "deploy": "node scripts/deploy.mjs",
22
- "semantic-release": "semantic-release",
22
+ "release": "semantic-release",
23
+ "release:dry-run": "semantic-release --dry-run",
23
24
  "server": "node dist/src/server.js",
24
25
  "start": "tsx src/server.ts",
25
26
  "dev": "fastmcp dev src/server.ts",
@@ -59,17 +60,25 @@
59
60
  },
60
61
  "release": {
61
62
  "branches": [
62
- "main"
63
+ "main",
64
+ "master"
63
65
  ],
64
66
  "plugins": [
65
67
  "@semantic-release/commit-analyzer",
66
68
  "@semantic-release/release-notes-generator",
69
+ [
70
+ "@semantic-release/changelog",
71
+ {
72
+ "changelogFile": "CHANGELOG.md"
73
+ }
74
+ ],
67
75
  "@semantic-release/npm",
68
76
  "@semantic-release/github"
69
77
  ]
70
78
  },
71
79
  "devDependencies": {
72
80
  "@eslint/js": "^9.26.0",
81
+ "@semantic-release/changelog": "^6.0.3",
73
82
  "@tsconfig/node22": "^22.0.1",
74
83
  "@types/node": "^22.13.0",
75
84
  "@types/react": "^19.2.2",
@@ -4,16 +4,8 @@ import { AskUserQuestionsParametersSchema, createAskUserQuestionsCore, } from ".
4
4
  const askUserQuestionsCore = createAskUserQuestionsCore();
5
5
  const server = new FastMCP({
6
6
  name: "AskUserQuestions",
7
- instructions: "This MCP server provides a tool to ask structured questions to the user. " +
8
- "Use the ask_user_questions tool when you need to:\n" +
9
- "- Gather user preferences or requirements during execution\n" +
10
- "- Clarify ambiguous instructions or implementation choices\n" +
11
- "- Get decisions on what direction to take\n" +
12
- "- Offer choices to the user about multiple valid approaches\n\n" +
13
- "The tool allows AI models to pause execution and gather direct user input through an interactive TUI, " +
14
- "returning formatted responses for continued reasoning. " +
15
- "Each question supports 2-4 multiple-choice options with descriptions, and users can always provide custom text input. " +
16
- "Both single-select and multi-select modes are supported.",
7
+ instructions: "MCP server for asking users structured questions during AI execution. " +
8
+ "Use ask_user_questions tool to gather preferences, clarify requirements, or make implementation decisions without blocking AI workflow.",
17
9
  version: "0.1.17",
18
10
  });
19
11
  // Add the ask_user_questions tool
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { EventEmitter } from "events";
8
8
  import { watch } from "fs";
9
- import { join } from "path";
9
+ import { basename, join } from "path";
10
10
  import { fileExists } from "./utils.js";
11
11
  import { resolveSessionDirectory } from "./utils.js";
12
12
  /**
@@ -171,7 +171,7 @@ export class PromiseFileWatcher extends EventEmitter {
171
171
  if (!stats.isDirectory())
172
172
  return;
173
173
  // Extract session ID from directory name
174
- const sessionId = sessionPath.split("/").pop() ?? "";
174
+ const sessionId = basename(sessionPath);
175
175
  if (!sessionId)
176
176
  return;
177
177
  // Verify it's a valid session (has request.json)
@@ -41,24 +41,10 @@ export const AskUserQuestionsParametersSchema = z.object({
41
41
  "options (2-4 choices with labels and descriptions), and multiSelect (boolean). " +
42
42
  "Mark one choice as recommended if possible."),
43
43
  });
44
- export const TOOL_DESCRIPTION = "Use this tool when you need to ask the user questions during execution. " +
45
- "This allows you to:\n" +
46
- "1. Gather user preferences or requirements\n" +
47
- "2. Clarify ambiguous instructions\n" +
48
- "3. Get decisions on implementation choices as you work\n" +
49
- "4. Offer choices to the user about what direction to take\n\n" +
44
+ export const TOOL_DESCRIPTION = "Ask users structured questions during execution to gather preferences, clarify requirements, or make implementation decisions.\n\n" +
50
45
  "FEATURES:\n" +
51
- "- Ask 1-4 structured questions via an interactive terminal interface\n" +
52
- "- Each question includes 2-4 multiple-choice options with explanatory descriptions\n" +
53
- "- Users can always provide custom free-text input as an alternative to predefined options\n" +
54
- "- Single-select mode (default): User picks ONE option or provides custom text\n" +
55
- "- Multi-select mode (multiSelect: true): User can select MULTIPLE options\n\n" +
56
- "USAGE NOTES:\n" +
57
- "- Always provide a descriptive 'title' field (max 12 chars) for each question\n" +
58
- "- Use multiSelect: true when choices are not mutually exclusive\n" +
59
- "- Option labels should be concise (1-5 words)\n" +
60
- "- Questions should end with a question mark\n" +
61
- "- Don't include an 'Other' option - it's provided automatically\n" +
62
- "- Mark one choice as recommended if possible.\n\n" +
63
- "- If user seems not aware how to answer the question, inform them that they need to install the 'auq' cli tool.\n\n" +
64
- "Returns a formatted summary of all questions and answers.";
46
+ "- Non-blocking: doesn't halt AI workflow\n" +
47
+ "- 1-4 questions with 2-4 options each\n" +
48
+ "- Single/multi-select modes\n" +
49
+ "- Custom text input always available\n\n" +
50
+ "Returns formatted responses for continued reasoning.";
@@ -68,12 +68,7 @@ export const OptionsList = ({ isFocused, onSelect, options, selectedOption, show
68
68
  onAdvance();
69
69
  }
70
70
  }
71
- if (key.tab) {
72
- // Tab: Just advance (don't select)
73
- if (onAdvance) {
74
- onAdvance();
75
- }
76
- }
71
+ // Tab is handled globally in StepperView for question navigation
77
72
  }
78
73
  }, { isActive: isFocused });
79
74
  return (React.createElement(Box, { flexDirection: "column" },
@@ -19,7 +19,8 @@ export const StepperView = ({ onComplete, sessionId, sessionRequest, }) => {
19
19
  const [showRejectionConfirm, setShowRejectionConfirm] = useState(false);
20
20
  const [elapsedSeconds, setElapsedSeconds] = useState(0);
21
21
  const [focusContext, setFocusContext] = useState("option");
22
- const currentQuestion = sessionRequest.questions[currentQuestionIndex];
22
+ const safeIndex = Math.min(currentQuestionIndex, sessionRequest.questions.length - 1);
23
+ const currentQuestion = sessionRequest.questions[safeIndex];
23
24
  const sessionCreatedAt = useMemo(() => {
24
25
  const parsed = Date.parse(sessionRequest.timestamp);
25
26
  return Number.isNaN(parsed) ? Date.now() : parsed;
@@ -165,14 +166,12 @@ export const StepperView = ({ onComplete, sessionId, sessionRequest, }) => {
165
166
  return;
166
167
  }
167
168
  // Tab/Shift+Tab: Global question navigation (works in all contexts)
168
- if (key.tab && key.shift && currentQuestionIndex > 0) {
169
- setCurrentQuestionIndex((prev) => prev - 1);
169
+ if (key.tab && key.shift) {
170
+ setCurrentQuestionIndex((prev) => Math.max(0, prev - 1));
170
171
  return;
171
172
  }
172
- if (key.tab &&
173
- !key.shift &&
174
- currentQuestionIndex < sessionRequest.questions.length - 1) {
175
- setCurrentQuestionIndex((prev) => prev + 1);
173
+ if (key.tab && !key.shift) {
174
+ setCurrentQuestionIndex((prev) => Math.min(sessionRequest.questions.length - 1, prev + 1));
176
175
  return;
177
176
  }
178
177
  const shouldNavigate = focusContext !== "custom-input";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auq-mcp-server",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "main": "dist/index.js",
5
5
  "bin": {
6
6
  "auq": "dist/bin/auq.js"
@@ -19,7 +19,8 @@
19
19
  "prepare": "npm run build",
20
20
  "postinstall": "node scripts/postinstall.cjs",
21
21
  "deploy": "node scripts/deploy.mjs",
22
- "semantic-release": "semantic-release",
22
+ "release": "semantic-release",
23
+ "release:dry-run": "semantic-release --dry-run",
23
24
  "server": "node dist/src/server.js",
24
25
  "start": "tsx src/server.ts",
25
26
  "dev": "fastmcp dev src/server.ts",
@@ -59,17 +60,25 @@
59
60
  },
60
61
  "release": {
61
62
  "branches": [
62
- "main"
63
+ "main",
64
+ "master"
63
65
  ],
64
66
  "plugins": [
65
67
  "@semantic-release/commit-analyzer",
66
68
  "@semantic-release/release-notes-generator",
69
+ [
70
+ "@semantic-release/changelog",
71
+ {
72
+ "changelogFile": "CHANGELOG.md"
73
+ }
74
+ ],
67
75
  "@semantic-release/npm",
68
76
  "@semantic-release/github"
69
77
  ]
70
78
  },
71
79
  "devDependencies": {
72
80
  "@eslint/js": "^9.26.0",
81
+ "@semantic-release/changelog": "^6.0.3",
73
82
  "@tsconfig/node22": "^22.0.1",
74
83
  "@types/node": "^22.13.0",
75
84
  "@types/react": "^19.2.2",