@scanton/phase2s 0.14.0 → 0.15.0
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/src/cli/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import { Conversation } from "../core/conversation.js";
|
|
|
12
12
|
import { loadLearnings, formatLearningsForPrompt } from "../core/memory.js";
|
|
13
13
|
import { loadAllSkills } from "../skills/index.js";
|
|
14
14
|
import { log } from "../utils/logger.js";
|
|
15
|
-
const VERSION = "0.
|
|
15
|
+
const VERSION = "0.15.0";
|
|
16
16
|
/** Directory for session auto-saves. */
|
|
17
17
|
const SESSION_DIR = join(process.cwd(), ".phase2s", "sessions");
|
|
18
18
|
/** Path for today's session file. */
|
package/dist/src/mcp/server.d.ts
CHANGED
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
* Start via: phase2s mcp
|
|
12
12
|
* Configure in: .claude/settings.json
|
|
13
13
|
*/
|
|
14
|
+
import { Conversation } from "../core/conversation.js";
|
|
14
15
|
import type { Skill } from "../skills/types.js";
|
|
15
|
-
export declare const MCP_SERVER_VERSION = "0.
|
|
16
|
+
export declare const MCP_SERVER_VERSION = "0.15.0";
|
|
16
17
|
interface JSONRPCRequest {
|
|
17
18
|
jsonrpc: "2.0";
|
|
18
19
|
id: number | string | null;
|
|
@@ -37,6 +38,15 @@ export interface MCPTool {
|
|
|
37
38
|
required: string[];
|
|
38
39
|
};
|
|
39
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* A JSON-RPC notification — like a response but with no `id`.
|
|
43
|
+
* Used for server-to-client push events (e.g. tools list changed).
|
|
44
|
+
*/
|
|
45
|
+
export interface MCPNotification {
|
|
46
|
+
jsonrpc: "2.0";
|
|
47
|
+
method: string;
|
|
48
|
+
params?: unknown;
|
|
49
|
+
}
|
|
40
50
|
/**
|
|
41
51
|
* Convert a Phase2S Skill into an MCP tool descriptor.
|
|
42
52
|
*
|
|
@@ -50,16 +60,33 @@ export declare function skillToTool(skill: Skill): MCPTool;
|
|
|
50
60
|
* "phase2s__consensus_plan" → "consensus-plan"
|
|
51
61
|
*/
|
|
52
62
|
export declare function toolNameToSkillName(toolName: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* Build a JSON-RPC notification (no `id` field — this is a server push, not
|
|
65
|
+
* a response to a request).
|
|
66
|
+
*/
|
|
67
|
+
export declare function buildNotification(method: string, params?: unknown): MCPNotification;
|
|
68
|
+
/**
|
|
69
|
+
* Watch the skills directory for new SKILL.md files. When a change is
|
|
70
|
+
* detected (debounced 80ms), reload skills and call notify() so the server
|
|
71
|
+
* can send a notifications/tools/list_changed message to the MCP client.
|
|
72
|
+
*
|
|
73
|
+
* Silently skips watching if the directory does not exist.
|
|
74
|
+
*/
|
|
75
|
+
export declare function setupSkillsWatcher(skillsDir: string, onReload: (skills: Skill[]) => void, notify: () => void): void;
|
|
53
76
|
/**
|
|
54
77
|
* Handle a single JSON-RPC request and return the response.
|
|
55
78
|
*
|
|
56
79
|
* Exported so tests can call it directly without stdio.
|
|
57
80
|
*
|
|
58
|
-
* @param request
|
|
59
|
-
* @param skills
|
|
60
|
-
* @param cwd
|
|
81
|
+
* @param request Parsed JSON-RPC request
|
|
82
|
+
* @param skills Loaded Phase2S skills (passed in so tests can inject fixtures)
|
|
83
|
+
* @param cwd Working directory for config loading and agent runs
|
|
84
|
+
* @param sessionConversations Optional per-skill conversation map for session persistence.
|
|
85
|
+
* When provided, tools/call reuses the existing Conversation
|
|
86
|
+
* for each skill across multiple invocations rather than
|
|
87
|
+
* starting cold every call.
|
|
61
88
|
*/
|
|
62
|
-
export declare function handleRequest(request: JSONRPCRequest, skills: Skill[], cwd: string): Promise<JSONRPCResponse>;
|
|
89
|
+
export declare function handleRequest(request: JSONRPCRequest, skills: Skill[], cwd: string, sessionConversations?: Map<string, Conversation>): Promise<JSONRPCResponse>;
|
|
63
90
|
/**
|
|
64
91
|
* Start the MCP server. Reads JSON-RPC messages from stdin, writes responses
|
|
65
92
|
* to stdout. Runs until stdin closes (i.e. Claude Code terminates the session).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAM3C,UAAU,cAAc;IACtB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAMD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAejD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAMD
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAM3C,UAAU,cAAc;IACtB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAejD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,eAAe,CAInF;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,EACnC,MAAM,EAAE,MAAM,IAAI,GACjB,IAAI,CAsBN;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,MAAM,EACX,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAC/C,OAAO,CAAC,eAAe,CAAC,CA8F1B;AAMD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoF7D"}
|
package/dist/src/mcp/server.js
CHANGED
|
@@ -12,11 +12,12 @@
|
|
|
12
12
|
* Configure in: .claude/settings.json
|
|
13
13
|
*/
|
|
14
14
|
import { createInterface } from "node:readline";
|
|
15
|
+
import { watch } from "node:fs";
|
|
15
16
|
import { loadSkillsFromDir } from "../skills/loader.js";
|
|
16
17
|
import { loadConfig } from "../core/config.js";
|
|
17
18
|
import { Agent } from "../core/agent.js";
|
|
18
19
|
import { join } from "node:path";
|
|
19
|
-
export const MCP_SERVER_VERSION = "0.
|
|
20
|
+
export const MCP_SERVER_VERSION = "0.15.0";
|
|
20
21
|
// ---------------------------------------------------------------------------
|
|
21
22
|
// Tool generation
|
|
22
23
|
// ---------------------------------------------------------------------------
|
|
@@ -51,6 +52,53 @@ export function toolNameToSkillName(toolName) {
|
|
|
51
52
|
return toolName.replace(/^phase2s__/, "").replace(/_/g, "-");
|
|
52
53
|
}
|
|
53
54
|
// ---------------------------------------------------------------------------
|
|
55
|
+
// Notification helpers
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
/**
|
|
58
|
+
* Build a JSON-RPC notification (no `id` field — this is a server push, not
|
|
59
|
+
* a response to a request).
|
|
60
|
+
*/
|
|
61
|
+
export function buildNotification(method, params) {
|
|
62
|
+
const n = { jsonrpc: "2.0", method };
|
|
63
|
+
if (params !== undefined)
|
|
64
|
+
n.params = params;
|
|
65
|
+
return n;
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Skills watcher (exported for testing)
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
/**
|
|
71
|
+
* Watch the skills directory for new SKILL.md files. When a change is
|
|
72
|
+
* detected (debounced 80ms), reload skills and call notify() so the server
|
|
73
|
+
* can send a notifications/tools/list_changed message to the MCP client.
|
|
74
|
+
*
|
|
75
|
+
* Silently skips watching if the directory does not exist.
|
|
76
|
+
*/
|
|
77
|
+
export function setupSkillsWatcher(skillsDir, onReload, notify) {
|
|
78
|
+
let debounceTimer = null;
|
|
79
|
+
try {
|
|
80
|
+
watch(skillsDir, { persistent: false }, () => {
|
|
81
|
+
if (debounceTimer)
|
|
82
|
+
clearTimeout(debounceTimer);
|
|
83
|
+
debounceTimer = setTimeout(() => {
|
|
84
|
+
loadSkillsFromDir(skillsDir)
|
|
85
|
+
.then((updated) => {
|
|
86
|
+
onReload(updated);
|
|
87
|
+
notify();
|
|
88
|
+
})
|
|
89
|
+
.catch(() => {
|
|
90
|
+
// Reload errors are silently ignored — stale skill list is better
|
|
91
|
+
// than crashing the server.
|
|
92
|
+
});
|
|
93
|
+
}, 80);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Skills directory doesn't exist or isn't watchable — skip silently.
|
|
98
|
+
// The server still works, just without hot-reload.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
54
102
|
// Request handler (exported for testing)
|
|
55
103
|
// ---------------------------------------------------------------------------
|
|
56
104
|
/**
|
|
@@ -58,11 +106,15 @@ export function toolNameToSkillName(toolName) {
|
|
|
58
106
|
*
|
|
59
107
|
* Exported so tests can call it directly without stdio.
|
|
60
108
|
*
|
|
61
|
-
* @param request
|
|
62
|
-
* @param skills
|
|
63
|
-
* @param cwd
|
|
109
|
+
* @param request Parsed JSON-RPC request
|
|
110
|
+
* @param skills Loaded Phase2S skills (passed in so tests can inject fixtures)
|
|
111
|
+
* @param cwd Working directory for config loading and agent runs
|
|
112
|
+
* @param sessionConversations Optional per-skill conversation map for session persistence.
|
|
113
|
+
* When provided, tools/call reuses the existing Conversation
|
|
114
|
+
* for each skill across multiple invocations rather than
|
|
115
|
+
* starting cold every call.
|
|
64
116
|
*/
|
|
65
|
-
export async function handleRequest(request, skills, cwd) {
|
|
117
|
+
export async function handleRequest(request, skills, cwd, sessionConversations) {
|
|
66
118
|
// -----------------------------------------------------------------------
|
|
67
119
|
// initialize
|
|
68
120
|
// -----------------------------------------------------------------------
|
|
@@ -72,7 +124,9 @@ export async function handleRequest(request, skills, cwd) {
|
|
|
72
124
|
id: request.id,
|
|
73
125
|
result: {
|
|
74
126
|
protocolVersion: "2024-11-05",
|
|
75
|
-
|
|
127
|
+
// listChanged: true tells the client to re-fetch tools/list when it
|
|
128
|
+
// receives a notifications/tools/list_changed notification.
|
|
129
|
+
capabilities: { tools: { listChanged: true } },
|
|
76
130
|
serverInfo: { name: "phase2s", version: MCP_SERVER_VERSION },
|
|
77
131
|
},
|
|
78
132
|
};
|
|
@@ -107,8 +161,17 @@ export async function handleRequest(request, skills, cwd) {
|
|
|
107
161
|
const fullPrompt = skill.promptTemplate + (userPrompt ? `\n\n## Input\n\n${userPrompt}` : "");
|
|
108
162
|
try {
|
|
109
163
|
const config = await loadConfig();
|
|
110
|
-
|
|
164
|
+
// Session persistence: look up an existing Conversation for this skill.
|
|
165
|
+
// On the first call the map has no entry and Agent creates a fresh one.
|
|
166
|
+
// On subsequent calls the Agent resumes where it left off.
|
|
167
|
+
const existingConversation = sessionConversations?.get(skillName);
|
|
168
|
+
const agent = new Agent({ config, conversation: existingConversation });
|
|
111
169
|
const text = await agent.run(fullPrompt, { modelOverride: skill.model });
|
|
170
|
+
// Store the (possibly updated) conversation back into the session map
|
|
171
|
+
// so the next call to this skill can continue the conversation.
|
|
172
|
+
if (sessionConversations) {
|
|
173
|
+
sessionConversations.set(skillName, agent.getConversation());
|
|
174
|
+
}
|
|
112
175
|
return {
|
|
113
176
|
jsonrpc: "2.0",
|
|
114
177
|
id: request.id,
|
|
@@ -150,10 +213,21 @@ export async function handleRequest(request, skills, cwd) {
|
|
|
150
213
|
*/
|
|
151
214
|
export async function runMCPServer(cwd) {
|
|
152
215
|
const skillsDir = join(cwd, ".phase2s", "skills");
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
216
|
+
let skills = await loadSkillsFromDir(skillsDir);
|
|
217
|
+
// One Conversation per skill, scoped to this process lifetime (= one Claude
|
|
218
|
+
// Code project session). Multi-turn skills like /satori and /consensus-plan
|
|
219
|
+
// resume where they left off rather than starting cold on every tools/call.
|
|
220
|
+
const sessionConversations = new Map();
|
|
221
|
+
const respond = (message) => {
|
|
222
|
+
process.stdout.write(JSON.stringify(message) + "\n");
|
|
156
223
|
};
|
|
224
|
+
// Watch for new skills added mid-session (e.g. via /skill). When detected,
|
|
225
|
+
// reload the skills list and notify the MCP client so it re-fetches tools/list.
|
|
226
|
+
setupSkillsWatcher(skillsDir, (updated) => {
|
|
227
|
+
skills = updated;
|
|
228
|
+
}, () => {
|
|
229
|
+
respond(buildNotification("notifications/tools/list_changed"));
|
|
230
|
+
});
|
|
157
231
|
// Manual event queue — safer than readline async iterator for long-lived servers
|
|
158
232
|
const lineQueue = [];
|
|
159
233
|
let pendingResolve = null;
|
|
@@ -208,7 +282,7 @@ export async function runMCPServer(cwd) {
|
|
|
208
282
|
});
|
|
209
283
|
continue;
|
|
210
284
|
}
|
|
211
|
-
const response = await handleRequest(request, skills, cwd);
|
|
285
|
+
const response = await handleRequest(request, skills, cwd, sessionConversations);
|
|
212
286
|
respond(response);
|
|
213
287
|
}
|
|
214
288
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|