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 +48 -3
- package/dist/package.json +12 -3
- package/dist/src/server.js +2 -10
- package/dist/src/session/file-watcher.js +2 -2
- package/dist/src/shared/schemas.js +6 -20
- package/dist/src/tui/components/OptionsList.js +1 -6
- package/dist/src/tui/components/StepperView.js +6 -7
- package/package.json +12 -3
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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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",
|
package/dist/src/server.js
CHANGED
|
@@ -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: "
|
|
8
|
-
"Use
|
|
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
|
|
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 = "
|
|
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
|
-
"-
|
|
52
|
-
"-
|
|
53
|
-
"-
|
|
54
|
-
"-
|
|
55
|
-
"
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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",
|