aidflow 1.1.1 → 1.2.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/dist/context/service.d.ts +48 -0
- package/dist/context/service.d.ts.map +1 -0
- package/dist/context/service.js +113 -0
- package/dist/context/service.js.map +1 -0
- package/dist/index.js +23 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/guide/description.d.ts +1 -1
- package/dist/tools/guide/description.d.ts.map +1 -1
- package/dist/tools/guide/description.js +3 -2
- package/dist/tools/guide/description.js.map +1 -1
- package/dist/tools/guide/handler.d.ts +16 -0
- package/dist/tools/guide/handler.d.ts.map +1 -1
- package/dist/tools/guide/handler.js +54 -10
- package/dist/tools/guide/handler.js.map +1 -1
- package/dist/tools/guide/schema.d.ts +3 -0
- package/dist/tools/guide/schema.d.ts.map +1 -1
- package/dist/tools/guide/schema.js +4 -0
- package/dist/tools/guide/schema.js.map +1 -1
- package/dist/tools/plan/handler.d.ts.map +1 -1
- package/dist/tools/plan/handler.js +7 -0
- package/dist/tools/plan/handler.js.map +1 -1
- package/dist/tools/select_service/description.d.ts +2 -0
- package/dist/tools/select_service/description.d.ts.map +1 -0
- package/dist/tools/select_service/description.js +9 -0
- package/dist/tools/select_service/description.js.map +1 -0
- package/dist/tools/select_service/handler.d.ts +3 -0
- package/dist/tools/select_service/handler.d.ts.map +1 -0
- package/dist/tools/select_service/handler.js +120 -0
- package/dist/tools/select_service/handler.js.map +1 -0
- package/dist/tools/select_service/index.d.ts +4 -0
- package/dist/tools/select_service/index.d.ts.map +1 -0
- package/dist/tools/select_service/index.js +4 -0
- package/dist/tools/select_service/index.js.map +1 -0
- package/dist/tools/select_service/schema.d.ts +19 -0
- package/dist/tools/select_service/schema.d.ts.map +1 -0
- package/dist/tools/select_service/schema.js +20 -0
- package/dist/tools/select_service/schema.js.map +1 -0
- package/dist/tools/session/handler.d.ts.map +1 -1
- package/dist/tools/session/handler.js +7 -0
- package/dist/tools/session/handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface ServiceInfo {
|
|
2
|
+
serviceName: string;
|
|
3
|
+
aidflowPath: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* 워크스페이스에서 모든 .aidflow 디렉토리 탐색
|
|
7
|
+
*/
|
|
8
|
+
export declare function discoverServices(baseDir?: string, maxDepth?: number): ServiceInfo[];
|
|
9
|
+
/**
|
|
10
|
+
* 세션에 서비스 바인딩
|
|
11
|
+
*/
|
|
12
|
+
export declare function bindService(sessionName: string, service: ServiceInfo): void;
|
|
13
|
+
/**
|
|
14
|
+
* 세션의 바인딩된 서비스 조회
|
|
15
|
+
*/
|
|
16
|
+
export declare function getBinding(sessionName: string): ServiceInfo | null;
|
|
17
|
+
/**
|
|
18
|
+
* 세션 바인딩 해제
|
|
19
|
+
*/
|
|
20
|
+
export declare function unbindService(sessionName: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* 글로벌 서비스 선택 (세션 없이 사용 시)
|
|
23
|
+
*/
|
|
24
|
+
export declare function selectGlobal(service: ServiceInfo): void;
|
|
25
|
+
/**
|
|
26
|
+
* 글로벌 선택된 서비스 조회
|
|
27
|
+
*/
|
|
28
|
+
export declare function getGlobalSelection(): ServiceInfo | null;
|
|
29
|
+
/**
|
|
30
|
+
* 서비스 조회 (세션 바인딩 우선, 글로벌 폴백)
|
|
31
|
+
*/
|
|
32
|
+
export declare function getService(sessionName?: string): ServiceInfo | null;
|
|
33
|
+
/**
|
|
34
|
+
* 서비스 선택 여부 확인
|
|
35
|
+
*/
|
|
36
|
+
export declare function isServiceSelected(sessionName?: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 모든 바인딩 초기화
|
|
39
|
+
*/
|
|
40
|
+
export declare function clearAll(): void;
|
|
41
|
+
/**
|
|
42
|
+
* 현재 바인딩 상태 조회
|
|
43
|
+
*/
|
|
44
|
+
export declare function listBindings(): Array<{
|
|
45
|
+
sessionName: string;
|
|
46
|
+
service: ServiceInfo;
|
|
47
|
+
}>;
|
|
48
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/context/service.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,WAAW,EAAE,CAc9E;AAmCD;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAE3E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAElE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAG/B;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC,CAKnF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { getWorkspaceRoot } from "./workspace.js";
|
|
4
|
+
/**
|
|
5
|
+
* 멀티 서비스 환경에서 .aidflow 디렉토리 탐색 및 세션별 서비스 바인딩 관리
|
|
6
|
+
*/
|
|
7
|
+
// 세션별 서비스 바인딩 (세션 이름 -> 서비스 정보)
|
|
8
|
+
const bindings = new Map();
|
|
9
|
+
// 글로벌 선택 (세션 없이 사용하는 경우용)
|
|
10
|
+
let globalSelection = null;
|
|
11
|
+
/**
|
|
12
|
+
* 워크스페이스에서 모든 .aidflow 디렉토리 탐색
|
|
13
|
+
*/
|
|
14
|
+
export function discoverServices(baseDir, maxDepth = 3) {
|
|
15
|
+
const root = baseDir ?? getWorkspaceRoot();
|
|
16
|
+
const services = [];
|
|
17
|
+
// 루트에 .aidflow가 있는지 확인
|
|
18
|
+
const rootAidflow = join(root, ".aidflow");
|
|
19
|
+
if (existsSync(rootAidflow)) {
|
|
20
|
+
services.push({ serviceName: "(root)", aidflowPath: rootAidflow });
|
|
21
|
+
}
|
|
22
|
+
// 하위 디렉토리 탐색
|
|
23
|
+
scanDirectory(root, services, 0, maxDepth);
|
|
24
|
+
return services;
|
|
25
|
+
}
|
|
26
|
+
function scanDirectory(dir, services, currentDepth, maxDepth) {
|
|
27
|
+
if (currentDepth >= maxDepth)
|
|
28
|
+
return;
|
|
29
|
+
let entries;
|
|
30
|
+
try {
|
|
31
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules") {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (entry.isDirectory()) {
|
|
41
|
+
const subDir = join(dir, entry.name);
|
|
42
|
+
const aidflowPath = join(subDir, ".aidflow");
|
|
43
|
+
if (existsSync(aidflowPath)) {
|
|
44
|
+
services.push({ serviceName: entry.name, aidflowPath });
|
|
45
|
+
}
|
|
46
|
+
scanDirectory(subDir, services, currentDepth + 1, maxDepth);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 세션에 서비스 바인딩
|
|
52
|
+
*/
|
|
53
|
+
export function bindService(sessionName, service) {
|
|
54
|
+
bindings.set(sessionName, service);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 세션의 바인딩된 서비스 조회
|
|
58
|
+
*/
|
|
59
|
+
export function getBinding(sessionName) {
|
|
60
|
+
return bindings.get(sessionName) ?? null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 세션 바인딩 해제
|
|
64
|
+
*/
|
|
65
|
+
export function unbindService(sessionName) {
|
|
66
|
+
bindings.delete(sessionName);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 글로벌 서비스 선택 (세션 없이 사용 시)
|
|
70
|
+
*/
|
|
71
|
+
export function selectGlobal(service) {
|
|
72
|
+
globalSelection = service;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 글로벌 선택된 서비스 조회
|
|
76
|
+
*/
|
|
77
|
+
export function getGlobalSelection() {
|
|
78
|
+
return globalSelection;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 서비스 조회 (세션 바인딩 우선, 글로벌 폴백)
|
|
82
|
+
*/
|
|
83
|
+
export function getService(sessionName) {
|
|
84
|
+
if (sessionName) {
|
|
85
|
+
const binding = bindings.get(sessionName);
|
|
86
|
+
if (binding)
|
|
87
|
+
return binding;
|
|
88
|
+
}
|
|
89
|
+
return globalSelection;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 서비스 선택 여부 확인
|
|
93
|
+
*/
|
|
94
|
+
export function isServiceSelected(sessionName) {
|
|
95
|
+
return getService(sessionName) !== null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 모든 바인딩 초기화
|
|
99
|
+
*/
|
|
100
|
+
export function clearAll() {
|
|
101
|
+
bindings.clear();
|
|
102
|
+
globalSelection = null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 현재 바인딩 상태 조회
|
|
106
|
+
*/
|
|
107
|
+
export function listBindings() {
|
|
108
|
+
return Array.from(bindings.entries()).map(([sessionName, service]) => ({
|
|
109
|
+
sessionName,
|
|
110
|
+
service,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/context/service.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { InitInputSchema, handleInit, description as initDesc } from "./tools/in
|
|
|
6
6
|
import { SessionInputSchema, handleSession, description as sessionDesc } from "./tools/session/index.js";
|
|
7
7
|
import { PlanInputSchema, handlePlan, description as planDesc } from "./tools/plan/index.js";
|
|
8
8
|
import { GuideInputSchema, handleGuide, description as guideDesc } from "./tools/guide/index.js";
|
|
9
|
+
import { SelectServiceInputSchema, handleSelectService, description as selectServiceDesc } from "./tools/select_service/index.js";
|
|
9
10
|
const INSTRUCTIONS = `# aidflow
|
|
10
11
|
|
|
11
12
|
Session-based development workflow manager.
|
|
@@ -25,6 +26,14 @@ Before doing ANYTHING, check for existing context:
|
|
|
25
26
|
|
|
26
27
|
This ensures seamless context recovery across conversation sessions.
|
|
27
28
|
|
|
29
|
+
## Multi-Service Workspace
|
|
30
|
+
If the workspace contains multiple services (each with their own .aidflow/):
|
|
31
|
+
1. Run \`select_service(action: "list")\` to discover services.
|
|
32
|
+
2. Confirm the target service with the user.
|
|
33
|
+
3. Run \`select_service(action: "select", service: "name")\` to select.
|
|
34
|
+
4. For parallel sessions, bind service to session: \`select_service(action: "select", service: "name", session: "session-name")\`.
|
|
35
|
+
Single-service projects are auto-selected.
|
|
36
|
+
|
|
28
37
|
## First-time Setup
|
|
29
38
|
1. \`init\` to create .aidflow/ directory and configuration.
|
|
30
39
|
2. \`/spec\` to define project-level engineering foundations (SPEC.md).
|
|
@@ -35,11 +44,15 @@ This ensures seamless context recovery across conversation sessions.
|
|
|
35
44
|
3. Work using Claude Code's native tools. Follow plan.md as the execution spec.
|
|
36
45
|
4. When work is done, run \`/finish\` to complete the session (review, archive, report, commit in one step).
|
|
37
46
|
|
|
47
|
+
## Guides
|
|
48
|
+
- **Required guides** (\`_toolName.md\`, \`_toolName_*.md\`): Auto-loaded when the corresponding tool is called. Not shown in \`guide list\`.
|
|
49
|
+
- **Regular guides**: Listed by \`guide list\`. When you encounter a task or topic that likely has a relevant guide, proactively call \`guide read\` to load it. Do not wait for the user to ask -- if a guide name matches the current context (e.g., a "testing" guide when writing tests, an "api" guide when working on endpoints), read it immediately.
|
|
50
|
+
- When no matching guide is obvious, run \`guide list\` and suggest relevant ones to the user.
|
|
51
|
+
|
|
38
52
|
## Rules
|
|
39
53
|
- **All development work MUST go through aidflow**. Always use \`session create\` before coding.
|
|
40
54
|
- Always confirm with the user before proceeding (use AskUserQuestion).
|
|
41
55
|
- **When a plan item is completed, immediately update plan.md**: change \`- [ ]\` to \`- [x]\` for the corresponding item. This keeps plan progress accurate.
|
|
42
|
-
- Use \`guide list\` to find relevant guides, then let the user choose.
|
|
43
56
|
- For parallel work, create multiple sessions with worktrees and use Subagents.
|
|
44
57
|
|
|
45
58
|
## User Expertise Support
|
|
@@ -51,7 +64,7 @@ This ensures seamless context recovery across conversation sessions.
|
|
|
51
64
|
- aidflow manages the development workflow (session, plan, spec). Actual coding uses the AI client's native tools.
|
|
52
65
|
- Other MCP servers, skills, and plugins are encouraged for information gathering, code analysis, and specialized tasks.
|
|
53
66
|
- Use the best tool for each job: aidflow for structure, native tools for implementation, external tools for everything else.`;
|
|
54
|
-
const server = new McpServer({ name: "aidflow", version: "1.
|
|
67
|
+
const server = new McpServer({ name: "aidflow", version: "1.2.2" }, {
|
|
55
68
|
capabilities: {
|
|
56
69
|
tools: {},
|
|
57
70
|
},
|
|
@@ -90,6 +103,14 @@ server.registerTool("guide", {
|
|
|
90
103
|
const result = await handleGuide(input);
|
|
91
104
|
return { content: [{ type: "text", text: result }] };
|
|
92
105
|
});
|
|
106
|
+
server.registerTool("select_service", {
|
|
107
|
+
description: selectServiceDesc,
|
|
108
|
+
inputSchema: SelectServiceInputSchema,
|
|
109
|
+
}, async (params) => {
|
|
110
|
+
const input = SelectServiceInputSchema.parse(params);
|
|
111
|
+
const result = await handleSelectService(input);
|
|
112
|
+
return { content: [{ type: "text", text: result }] };
|
|
113
|
+
});
|
|
93
114
|
async function main() {
|
|
94
115
|
const transport = new StdioServerTransport();
|
|
95
116
|
// Workspace root from environment or cwd
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const description = "Access project guide documents. (list/read)\n\n- **list**: Show available guides
|
|
1
|
+
export declare const description = "Access project guide documents. (list/read)\n\n- **list**: Show available guides (excludes `_`-prefixed required guides).\n- **read**: Read a specific guide by topic name.\n\n**Required guides** (`_plan.md`, `_session_*.md`, etc.) are auto-loaded by corresponding tools.\n**Regular guides**: When a guide name matches the current task context, proactively read it without waiting for the user to ask.";
|
|
2
2
|
//# sourceMappingURL=description.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../src/tools/guide/description.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../src/tools/guide/description.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,qZAMyG,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export const description = `Access project guide documents. (list/read)
|
|
2
2
|
|
|
3
|
-
- **list**: Show available guides
|
|
3
|
+
- **list**: Show available guides (excludes \`_\`-prefixed required guides).
|
|
4
4
|
- **read**: Read a specific guide by topic name.
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
**Required guides** (\`_plan.md\`, \`_session_*.md\`, etc.) are auto-loaded by corresponding tools.
|
|
7
|
+
**Regular guides**: When a guide name matches the current task context, proactively read it without waiting for the user to ask.`;
|
|
7
8
|
//# sourceMappingURL=description.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"description.js","sourceRoot":"","sources":["../../../src/tools/guide/description.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG
|
|
1
|
+
{"version":3,"file":"description.js","sourceRoot":"","sources":["../../../src/tools/guide/description.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;iIAMsG,CAAC"}
|
|
@@ -1,3 +1,19 @@
|
|
|
1
1
|
import type { GuideInput } from "./schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* 특정 도구의 필독 가이드 조회
|
|
4
|
+
* _{toolName}.md 또는 _{toolName}_*.md 패턴 매칭
|
|
5
|
+
* 다른 도구 핸들러에서 import하여 사용
|
|
6
|
+
*/
|
|
7
|
+
export declare function getRequiredGuides(toolName: string, sessionName?: string): Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
content: string;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* 필독 가이드를 마크다운 섹션으로 포맷
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatRequiredGuides(guides: Array<{
|
|
15
|
+
name: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}>): string;
|
|
2
18
|
export declare function handleGuide(input: GuideInput): Promise<string>;
|
|
3
19
|
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/tools/guide/handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/tools/guide/handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsC9C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBlH;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAQ7F;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAWpE"}
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { isInitialized, getConfig, resolve } from "../../context/workspace.js";
|
|
4
|
-
|
|
4
|
+
import { getService } from "../../context/service.js";
|
|
5
|
+
function getGuidesDir(sessionName) {
|
|
6
|
+
// 서비스가 선택된 경우 해당 서비스의 guides/ 사용
|
|
7
|
+
const service = getService(sessionName);
|
|
8
|
+
if (service) {
|
|
9
|
+
return join(service.aidflowPath, "guides");
|
|
10
|
+
}
|
|
5
11
|
const config = getConfig();
|
|
6
12
|
return resolve(config.guides.path);
|
|
7
13
|
}
|
|
8
|
-
function listGuides() {
|
|
9
|
-
const dir = getGuidesDir();
|
|
14
|
+
function listGuides(sessionName) {
|
|
15
|
+
const dir = getGuidesDir(sessionName);
|
|
10
16
|
if (!existsSync(dir))
|
|
11
17
|
return [];
|
|
12
18
|
return readdirSync(dir)
|
|
13
|
-
.filter((f) => f.endsWith(".md"))
|
|
19
|
+
.filter((f) => f.endsWith(".md") && !f.startsWith("_"))
|
|
14
20
|
.map((f) => {
|
|
15
21
|
const name = f.replace(/\.md$/, "");
|
|
16
22
|
const content = readFileSync(join(dir, f), "utf-8");
|
|
@@ -22,23 +28,61 @@ function listGuides() {
|
|
|
22
28
|
})
|
|
23
29
|
.sort((a, b) => a.name.localeCompare(b.name));
|
|
24
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* 특정 도구의 필독 가이드 조회
|
|
33
|
+
* _{toolName}.md 또는 _{toolName}_*.md 패턴 매칭
|
|
34
|
+
* 다른 도구 핸들러에서 import하여 사용
|
|
35
|
+
*/
|
|
36
|
+
export function getRequiredGuides(toolName, sessionName) {
|
|
37
|
+
const dir = getGuidesDir(sessionName);
|
|
38
|
+
if (!existsSync(dir))
|
|
39
|
+
return [];
|
|
40
|
+
const prefix = `_${toolName}`;
|
|
41
|
+
return readdirSync(dir)
|
|
42
|
+
.filter((f) => {
|
|
43
|
+
if (!f.endsWith(".md"))
|
|
44
|
+
return false;
|
|
45
|
+
const name = f.replace(/\.md$/, "");
|
|
46
|
+
return name === prefix || name.startsWith(`${prefix}_`);
|
|
47
|
+
})
|
|
48
|
+
.map((f) => {
|
|
49
|
+
const name = f.replace(/\.md$/, "");
|
|
50
|
+
const content = readFileSync(join(dir, f), "utf-8").trim();
|
|
51
|
+
return { name, content };
|
|
52
|
+
})
|
|
53
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 필독 가이드를 마크다운 섹션으로 포맷
|
|
57
|
+
*/
|
|
58
|
+
export function formatRequiredGuides(guides) {
|
|
59
|
+
if (guides.length === 0)
|
|
60
|
+
return "";
|
|
61
|
+
const sections = guides
|
|
62
|
+
.map((g) => `### ${g.name}\n\n${g.content}`)
|
|
63
|
+
.join("\n\n---\n\n");
|
|
64
|
+
return `## Required Guides (auto-loaded)\n\n${sections}`;
|
|
65
|
+
}
|
|
25
66
|
export async function handleGuide(input) {
|
|
26
67
|
if (!isInitialized()) {
|
|
27
68
|
return "aidflow is not initialized. Run `init` first.";
|
|
28
69
|
}
|
|
29
70
|
switch (input.action) {
|
|
30
71
|
case "list":
|
|
31
|
-
return handleList();
|
|
72
|
+
return handleList(input.session);
|
|
32
73
|
case "read":
|
|
33
|
-
return handleRead(input.topic);
|
|
74
|
+
return handleRead(input.topic, input.session);
|
|
34
75
|
}
|
|
35
76
|
}
|
|
36
|
-
function handleList() {
|
|
37
|
-
const guides = listGuides();
|
|
77
|
+
function handleList(sessionName) {
|
|
78
|
+
const guides = listGuides(sessionName);
|
|
38
79
|
if (guides.length === 0) {
|
|
39
80
|
return [
|
|
40
81
|
"No guides found.",
|
|
41
82
|
"Add markdown files to .aidflow/guides/ to create project guides.",
|
|
83
|
+
"",
|
|
84
|
+
"Tip: Files prefixed with `_` (e.g., `_plan.md`, `_plan_api.md`) are auto-loaded",
|
|
85
|
+
"when the corresponding tool is called, and excluded from this list.",
|
|
42
86
|
].join("\n");
|
|
43
87
|
}
|
|
44
88
|
const lines = [
|
|
@@ -50,11 +94,11 @@ function handleList() {
|
|
|
50
94
|
];
|
|
51
95
|
return lines.join("\n");
|
|
52
96
|
}
|
|
53
|
-
function handleRead(topic) {
|
|
97
|
+
function handleRead(topic, sessionName) {
|
|
54
98
|
if (!topic) {
|
|
55
99
|
return "Specify a guide topic to read. Use `guide list` to see available guides.";
|
|
56
100
|
}
|
|
57
|
-
const guidePath = join(getGuidesDir(), `${topic}.md`);
|
|
101
|
+
const guidePath = join(getGuidesDir(sessionName), `${topic}.md`);
|
|
58
102
|
if (!existsSync(guidePath)) {
|
|
59
103
|
return `Guide "${topic}" not found. Use \`guide list\` to see available guides.`;
|
|
60
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/tools/guide/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/tools/guide/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,15 @@ import { z } from "zod";
|
|
|
2
2
|
export declare const GuideInputSchema: z.ZodObject<{
|
|
3
3
|
action: z.ZodDefault<z.ZodEnum<["list", "read"]>>;
|
|
4
4
|
topic: z.ZodOptional<z.ZodString>;
|
|
5
|
+
session: z.ZodOptional<z.ZodString>;
|
|
5
6
|
}, "strip", z.ZodTypeAny, {
|
|
6
7
|
action: "list" | "read";
|
|
7
8
|
topic?: string | undefined;
|
|
9
|
+
session?: string | undefined;
|
|
8
10
|
}, {
|
|
9
11
|
action?: "list" | "read" | undefined;
|
|
10
12
|
topic?: string | undefined;
|
|
13
|
+
session?: string | undefined;
|
|
11
14
|
}>;
|
|
12
15
|
export type GuideInput = z.infer<typeof GuideInputSchema>;
|
|
13
16
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/tools/guide/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/tools/guide/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAa3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
|
@@ -8,5 +8,9 @@ export const GuideInputSchema = z.object({
|
|
|
8
8
|
.string()
|
|
9
9
|
.optional()
|
|
10
10
|
.describe("Guide name to read (without .md extension)"),
|
|
11
|
+
session: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Session name to resolve service binding. Auto-detects if only one active session exists"),
|
|
11
15
|
});
|
|
12
16
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/guide/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACtB,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,0DAA0D,CAAC;IACvE,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/guide/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACtB,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,0DAA0D,CAAC;IACvE,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;IACzD,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yFAAyF,CAAC;CACvG,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/tools/plan/handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/tools/plan/handler.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isInitialized, resolve, getWorkspaceRoot } from "../../context/workspace.js";
|
|
2
2
|
import { findActiveSession, getPlanProgress, getPlanContent, sessionExists, } from "../../context/session.js";
|
|
3
|
+
import { getRequiredGuides, formatRequiredGuides } from "../guide/handler.js";
|
|
3
4
|
import { existsSync } from "node:fs";
|
|
4
5
|
import { join } from "node:path";
|
|
5
6
|
export async function handlePlan(input) {
|
|
@@ -45,6 +46,12 @@ function handleCreate(sessionName) {
|
|
|
45
46
|
lines.push("## Step 0: Project Context", "", "**No SPEC.md found.** Use AskUserQuestion to ask the user:", "\"SPEC.md (project engineering foundations) does not exist yet. Run /spec first to define it, or proceed without it?\"", "If proceeding without SPEC.md, include relevant engineering decisions directly in the plan's Technical Approach.", "");
|
|
46
47
|
}
|
|
47
48
|
lines.push("## Step 1: Requirements Gathering (HITL)", "", "Use AskUserQuestion **multiple rounds** to thoroughly analyze requirements.", "Do NOT skip this step. Ask until requirements are fully clear.", "", "**Important: For each round, always include an 'AI auto-research' option.**", "When the user is unsure or unfamiliar with the tech stack, offer:", "- \"I'm not sure / Let AI research best practices\"", "If selected, use WebSearch to find latest stable best practices for the relevant", "technology, synthesize into concrete recommendations, and present for confirmation.", "", "**Round 1 - Core Intent**:", "- What is the goal? What problem does this solve?", "- Who is the user/consumer of this feature?", "- What does success look like?", "", "**Round 2 - Scope & Constraints**:", "- What is explicitly OUT of scope?", "- Are there technical constraints (library, pattern, compatibility)?", "- Are there dependencies on other systems or features?", "- What is the expected timeline/priority?", "", "**Round 3 - Details & Edge Cases**:", "- What are the specific behaviors/scenarios?", "- How should errors be handled?", "- Are tests required? What level (unit/integration/e2e)?", "- Any UI/UX requirements?", "", "## Step 2: Codebase Research", "", "Before writing the plan, investigate the codebase:", "- Use Glob/Grep/Read to understand existing code structure", "- Identify files that will be created/modified", "- Understand existing patterns and conventions", "- Check for reusable code or potential conflicts", "", "## Step 3: Write Plan", "", `Write to: .aidflow/sessions/${sessionName}/plan.md`, "", "Plan format (PRD + Implementation Plan):", "```markdown", "# {Title}", "", "## Background", "{Why this task exists. Context and motivation. 2-3 sentences.}", "", "## Objective", "{What we're building/changing. Clear, measurable goal. 1-2 sentences.}", "", "## Requirements", "", "### Functional Requirements", "- FR-1: {specific, testable requirement}", "- FR-2: ...", "", "### Non-Functional Requirements (if applicable)", "- NFR-1: {performance, security, etc.}", "", "## Out of Scope", "- {Explicitly excluded items to prevent scope creep}", "", "## Technical Approach", "{How to implement. Key decisions, patterns, architecture.}", "", "### Affected Files", "- `path/to/file.ts` - {what changes}", "- `path/to/new-file.ts` - {new, purpose}", "", "## Implementation Items", "- [ ] Item 1: {specific, actionable task}", "- [ ] Item 2: ...", "- [ ] Item N: Tests / Verification", "", "## Acceptance Criteria", "- [ ] AC-1: {specific, verifiable condition}", "- [ ] AC-2: ...", "", "## Notes", "{Constraints, assumptions, open decisions, references}", "```", "", "## Step 4: User Review", "", "Present the complete plan and ask the user to review.", "Use AskUserQuestion: confirm, request changes, or approve.", "Do NOT proceed to implementation until the user approves the plan.");
|
|
49
|
+
// 필독 가이드 자동 로드 (_plan.md, _plan_*.md)
|
|
50
|
+
const requiredGuides = getRequiredGuides("plan");
|
|
51
|
+
const requiredSection = formatRequiredGuides(requiredGuides);
|
|
52
|
+
if (requiredSection) {
|
|
53
|
+
lines.push("", "---", "", requiredSection);
|
|
54
|
+
}
|
|
48
55
|
return lines.join("\n");
|
|
49
56
|
}
|
|
50
57
|
function handleGet(sessionName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/tools/plan/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EACL,iBAAiB,EAEjB,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAgB;IAC/C,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACrB,OAAO,+CAA+C,CAAC;IACzD,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,sFAAsF,CAAC;IAChG,CAAC;IAED,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;QACnC,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IACD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,OAAO,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,WAAmB;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAEzE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,YAAY,WAAW,uBAAuB;YAC9C,mEAAmE;SACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAa;QACtB,qBAAqB,WAAW,IAAI;QACpC,EAAE;KACH,CAAC;IAEF,0BAA0B;IAC1B,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CACR,iCAAiC,EACjC,EAAE,EACF,yCAAyC,EACzC,iGAAiG,EACjG,yEAAyE,EACzE,EAAE,CACH,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,4BAA4B,EAC5B,EAAE,EACF,4DAA4D,EAC5D,wHAAwH,EACxH,kHAAkH,EAClH,EAAE,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,0CAA0C,EAC1C,EAAE,EACF,6EAA6E,EAC7E,gEAAgE,EAChE,EAAE,EACF,6EAA6E,EAC7E,mEAAmE,EACnE,qDAAqD,EACrD,kFAAkF,EAClF,qFAAqF,EACrF,EAAE,EACF,4BAA4B,EAC5B,mDAAmD,EACnD,6CAA6C,EAC7C,gCAAgC,EAChC,EAAE,EACF,oCAAoC,EACpC,oCAAoC,EACpC,sEAAsE,EACtE,wDAAwD,EACxD,2CAA2C,EAC3C,EAAE,EACF,qCAAqC,EACrC,8CAA8C,EAC9C,iCAAiC,EACjC,0DAA0D,EAC1D,2BAA2B,EAC3B,EAAE,EACF,8BAA8B,EAC9B,EAAE,EACF,oDAAoD,EACpD,4DAA4D,EAC5D,gDAAgD,EAChD,gDAAgD,EAChD,kDAAkD,EAClD,EAAE,EACF,uBAAuB,EACvB,EAAE,EACF,+BAA+B,WAAW,UAAU,EACpD,EAAE,EACF,0CAA0C,EAC1C,aAAa,EACb,WAAW,EACX,EAAE,EACF,eAAe,EACf,gEAAgE,EAChE,EAAE,EACF,cAAc,EACd,wEAAwE,EACxE,EAAE,EACF,iBAAiB,EACjB,EAAE,EACF,6BAA6B,EAC7B,0CAA0C,EAC1C,aAAa,EACb,EAAE,EACF,iDAAiD,EACjD,wCAAwC,EACxC,EAAE,EACF,iBAAiB,EACjB,sDAAsD,EACtD,EAAE,EACF,uBAAuB,EACvB,4DAA4D,EAC5D,EAAE,EACF,oBAAoB,EACpB,sCAAsC,EACtC,0CAA0C,EAC1C,EAAE,EACF,yBAAyB,EACzB,2CAA2C,EAC3C,mBAAmB,EACnB,oCAAoC,EACpC,EAAE,EACF,wBAAwB,EACxB,8CAA8C,EAC9C,iBAAiB,EACjB,EAAE,EACF,UAAU,EACV,wDAAwD,EACxD,KAAK,EACL,EAAE,EACF,wBAAwB,EACxB,EAAE,EACF,uDAAuD,EACvD,4DAA4D,EAC5D,oEAAoE,CACrE,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,WAAmB;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,8BAA8B,WAAW,IAAI;YAC7C,sCAAsC;SACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE9C,OAAO;QACL,aAAa,WAAW,MAAM,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,cAAc;QAChF,EAAE;QACF,OAAO;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/tools/plan/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const description = "Select target service in multi-service workspace. (list/select/status)\n\n- **list**: Discover all .aidflow directories in workspace. Auto-selects if only one found.\n- **select**: Select a specific service by name. Optionally bind to a session for parallel work.\n- **status**: Show current service selection (session-bound or global).\n\nCall this before other tools (session, plan, guide) when working in a multi-service workspace.\nSingle-service projects are auto-selected on `list`.";
|
|
2
|
+
//# sourceMappingURL=description.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../src/tools/select_service/description.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,6eAO+B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const description = `Select target service in multi-service workspace. (list/select/status)
|
|
2
|
+
|
|
3
|
+
- **list**: Discover all .aidflow directories in workspace. Auto-selects if only one found.
|
|
4
|
+
- **select**: Select a specific service by name. Optionally bind to a session for parallel work.
|
|
5
|
+
- **status**: Show current service selection (session-bound or global).
|
|
6
|
+
|
|
7
|
+
Call this before other tools (session, plan, guide) when working in a multi-service workspace.
|
|
8
|
+
Single-service projects are auto-selected on \`list\`.`;
|
|
9
|
+
//# sourceMappingURL=description.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"description.js","sourceRoot":"","sources":["../../../src/tools/select_service/description.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;uDAO4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/tools/select_service/handler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CASpF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { discoverServices, selectGlobal, bindService, getService, listBindings, } from "../../context/service.js";
|
|
2
|
+
export async function handleSelectService(input) {
|
|
3
|
+
switch (input.action) {
|
|
4
|
+
case "list":
|
|
5
|
+
return handleList(input);
|
|
6
|
+
case "select":
|
|
7
|
+
return handleSelect(input);
|
|
8
|
+
case "status":
|
|
9
|
+
return handleStatus(input);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function handleList(input) {
|
|
13
|
+
const services = discoverServices(input.workspacePath);
|
|
14
|
+
if (services.length === 0) {
|
|
15
|
+
return [
|
|
16
|
+
"# No .aidflow directories found",
|
|
17
|
+
"",
|
|
18
|
+
"No `.aidflow/` directory found in workspace.",
|
|
19
|
+
"",
|
|
20
|
+
"Run `init` to initialize aidflow, or create `.aidflow/` in service subdirectories for multi-service setup:",
|
|
21
|
+
"```",
|
|
22
|
+
"workspace/",
|
|
23
|
+
" service-a/.aidflow/",
|
|
24
|
+
" service-b/.aidflow/",
|
|
25
|
+
"```",
|
|
26
|
+
].join("\n");
|
|
27
|
+
}
|
|
28
|
+
// 단일 서비스: 자동 선택
|
|
29
|
+
if (services.length === 1) {
|
|
30
|
+
const svc = services[0];
|
|
31
|
+
if (input.session) {
|
|
32
|
+
bindService(input.session, svc);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
selectGlobal(svc);
|
|
36
|
+
}
|
|
37
|
+
return [
|
|
38
|
+
"# Service auto-selected",
|
|
39
|
+
"",
|
|
40
|
+
`**Service**: ${svc.serviceName}`,
|
|
41
|
+
`**Path**: ${svc.aidflowPath}`,
|
|
42
|
+
input.session ? `**Bound to session**: ${input.session}` : "**Scope**: global",
|
|
43
|
+
].join("\n");
|
|
44
|
+
}
|
|
45
|
+
// 멀티 서비스: 목록 반환
|
|
46
|
+
const listText = services
|
|
47
|
+
.map((svc, idx) => `${idx + 1}. **${svc.serviceName}** - ${svc.aidflowPath}`)
|
|
48
|
+
.join("\n");
|
|
49
|
+
const currentService = getService(input.session);
|
|
50
|
+
const currentStatus = currentService
|
|
51
|
+
? `\n**Currently selected**: ${currentService.serviceName}`
|
|
52
|
+
: "";
|
|
53
|
+
return [
|
|
54
|
+
`# Services found (${services.length})`,
|
|
55
|
+
"",
|
|
56
|
+
listText,
|
|
57
|
+
currentStatus,
|
|
58
|
+
"",
|
|
59
|
+
"---",
|
|
60
|
+
"Next: Confirm target service with the user, then call `select_service(action: \"select\", service: \"name\")`.",
|
|
61
|
+
].join("\n");
|
|
62
|
+
}
|
|
63
|
+
function handleSelect(input) {
|
|
64
|
+
if (!input.service) {
|
|
65
|
+
return 'Error: `service` parameter is required for select action.';
|
|
66
|
+
}
|
|
67
|
+
const services = discoverServices(input.workspacePath);
|
|
68
|
+
const found = services.find((svc) => svc.serviceName === input.service);
|
|
69
|
+
if (!found) {
|
|
70
|
+
const available = services.map((s) => s.serviceName).join(", ");
|
|
71
|
+
return [
|
|
72
|
+
`Error: Service "${input.service}" not found.`,
|
|
73
|
+
"",
|
|
74
|
+
`Available services: ${available || "none"}`,
|
|
75
|
+
"Run `select_service(action: \"list\")` to discover services.",
|
|
76
|
+
].join("\n");
|
|
77
|
+
}
|
|
78
|
+
if (input.session) {
|
|
79
|
+
bindService(input.session, found);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
selectGlobal(found);
|
|
83
|
+
}
|
|
84
|
+
return [
|
|
85
|
+
"# Service selected",
|
|
86
|
+
"",
|
|
87
|
+
`**Service**: ${found.serviceName}`,
|
|
88
|
+
`**Path**: ${found.aidflowPath}`,
|
|
89
|
+
input.session ? `**Bound to session**: ${input.session}` : "**Scope**: global",
|
|
90
|
+
].join("\n");
|
|
91
|
+
}
|
|
92
|
+
function handleStatus(input) {
|
|
93
|
+
const service = getService(input.session);
|
|
94
|
+
if (!service) {
|
|
95
|
+
return [
|
|
96
|
+
"# No service selected",
|
|
97
|
+
"",
|
|
98
|
+
"Run `select_service(action: \"list\")` to discover and select a service.",
|
|
99
|
+
].join("\n");
|
|
100
|
+
}
|
|
101
|
+
const lines = [
|
|
102
|
+
"# Current service",
|
|
103
|
+
"",
|
|
104
|
+
`**Service**: ${service.serviceName}`,
|
|
105
|
+
`**Path**: ${service.aidflowPath}`,
|
|
106
|
+
];
|
|
107
|
+
if (input.session) {
|
|
108
|
+
lines.push(`**Session**: ${input.session}`);
|
|
109
|
+
}
|
|
110
|
+
// 다른 세션 바인딩 상태 표시
|
|
111
|
+
const allBindings = listBindings();
|
|
112
|
+
if (allBindings.length > 0) {
|
|
113
|
+
lines.push("", "**Session bindings**:");
|
|
114
|
+
for (const b of allBindings) {
|
|
115
|
+
lines.push(`- ${b.sessionName} -> ${b.service.serviceName}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return lines.join("\n");
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/tools/select_service/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/select_service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/select_service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const SelectServiceInputSchema: z.ZodObject<{
|
|
3
|
+
action: z.ZodDefault<z.ZodEnum<["list", "select", "status"]>>;
|
|
4
|
+
service: z.ZodOptional<z.ZodString>;
|
|
5
|
+
session: z.ZodOptional<z.ZodString>;
|
|
6
|
+
workspacePath: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
action: "status" | "list" | "select";
|
|
9
|
+
service?: string | undefined;
|
|
10
|
+
session?: string | undefined;
|
|
11
|
+
workspacePath?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
action?: "status" | "list" | "select" | undefined;
|
|
14
|
+
service?: string | undefined;
|
|
15
|
+
session?: string | undefined;
|
|
16
|
+
workspacePath?: string | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export type SelectServiceInput = z.infer<typeof SelectServiceInputSchema>;
|
|
19
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/tools/select_service/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;EAiBnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SelectServiceInputSchema = z.object({
|
|
3
|
+
action: z
|
|
4
|
+
.enum(["list", "select", "status"])
|
|
5
|
+
.default("list")
|
|
6
|
+
.describe("list: 서비스 목록 조회, select: 서비스 선택, status: 현재 선택 상태 확인"),
|
|
7
|
+
service: z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe('선택할 서비스명 (action이 "select"일 때 필수)'),
|
|
11
|
+
session: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("서비스를 바인딩할 세션명. 미지정 시 글로벌 선택"),
|
|
15
|
+
workspacePath: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("서비스 탐색 기준 디렉토리. 미지정 시 워크스페이스 루트 사용"),
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/select_service/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAClC,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,sDAAsD,CAAC;IACnE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;IAChD,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;CAClD,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/tools/session/handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/tools/session/handler.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAsB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAexE"}
|
|
@@ -3,6 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import { isInitialized, getConfig, getWorkspaceRoot } from "../../context/workspace.js";
|
|
4
4
|
import { createSession, listSessions, getMeta, archiveSession, findActiveSession, getPlanProgress, sessionExists, } from "../../context/session.js";
|
|
5
5
|
import { createWorktree, getChangedFiles, getGitDiffStat } from "../../worktree/manager.js";
|
|
6
|
+
import { getRequiredGuides, formatRequiredGuides } from "../guide/handler.js";
|
|
6
7
|
export async function handleSession(input) {
|
|
7
8
|
if (!isInitialized()) {
|
|
8
9
|
return "aidflow is not initialized. Run `init` first.";
|
|
@@ -58,6 +59,12 @@ function handleCreate(input) {
|
|
|
58
59
|
lines.push("**No SPEC.md found.** Use AskUserQuestion to ask the user:", "\"SPEC.md (project engineering foundations) does not exist yet. Run /spec first, or proceed without it?\"");
|
|
59
60
|
}
|
|
60
61
|
lines.push("Use `plan create` if you need upfront planning.", "Run `session complete` when done.");
|
|
62
|
+
// 필독 가이드 자동 로드 (_session.md, _session_*.md)
|
|
63
|
+
const requiredGuides = getRequiredGuides("session");
|
|
64
|
+
const requiredSection = formatRequiredGuides(requiredGuides);
|
|
65
|
+
if (requiredSection) {
|
|
66
|
+
lines.push("", "---", "", requiredSection);
|
|
67
|
+
}
|
|
61
68
|
return lines.join("\n");
|
|
62
69
|
}
|
|
63
70
|
function handleList() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/tools/session/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EACL,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/tools/session/handler.ts"],"names":[],"mappings":"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"}
|