planbrew-mcp 0.1.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/README.md +76 -0
- package/dist/api-client.d.ts +8 -0
- package/dist/api-client.js +22 -0
- package/dist/api-client.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/get-history.d.ts +20 -0
- package/dist/tools/get-history.js +32 -0
- package/dist/tools/get-history.js.map +1 -0
- package/dist/tools/get-last-session.d.ts +8 -0
- package/dist/tools/get-last-session.js +19 -0
- package/dist/tools/get-last-session.js.map +1 -0
- package/dist/tools/get-status.d.ts +8 -0
- package/dist/tools/get-status.js +16 -0
- package/dist/tools/get-status.js.map +1 -0
- package/dist/tools/log-blocker.d.ts +17 -0
- package/dist/tools/log-blocker.js +23 -0
- package/dist/tools/log-blocker.js.map +1 -0
- package/dist/tools/mark-complete.d.ts +20 -0
- package/dist/tools/mark-complete.js +25 -0
- package/dist/tools/mark-complete.js.map +1 -0
- package/dist/tools/recall-work.d.ts +23 -0
- package/dist/tools/recall-work.js +33 -0
- package/dist/tools/recall-work.js.map +1 -0
- package/dist/tools/save-progress.d.ts +20 -0
- package/dist/tools/save-progress.js +28 -0
- package/dist/tools/save-progress.js.map +1 -0
- package/dist/tools/save-session.d.ts +26 -0
- package/dist/tools/save-session.js +34 -0
- package/dist/tools/save-session.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# planbrew-mcp
|
|
2
|
+
|
|
3
|
+
Project memory for AI coding agents. Save what you did, recall what you did — across sessions.
|
|
4
|
+
|
|
5
|
+
[PlanBrew](https://www.planbrew.ai) gives your AI assistant persistent memory so it can pick up where you left off.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
1. Sign up at [planbrew.ai](https://www.planbrew.ai) and create a project
|
|
10
|
+
2. Copy your API key and project ID from the setup page
|
|
11
|
+
3. Add to your MCP config:
|
|
12
|
+
|
|
13
|
+
### Claude Code (`.mcp.json`)
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"mcpServers": {
|
|
18
|
+
"planbrew": {
|
|
19
|
+
"command": "npx",
|
|
20
|
+
"args": ["-y", "planbrew-mcp"],
|
|
21
|
+
"env": {
|
|
22
|
+
"PLANBREW_API_KEY": "your-api-key",
|
|
23
|
+
"PLANBREW_PROJECT_ID": "your-project-id"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Cursor (`.cursor/mcp.json`)
|
|
31
|
+
|
|
32
|
+
Same JSON as above.
|
|
33
|
+
|
|
34
|
+
### Codex (`.codex/config.toml`)
|
|
35
|
+
|
|
36
|
+
```toml
|
|
37
|
+
[mcp_servers.planbrew]
|
|
38
|
+
command = "npx"
|
|
39
|
+
args = ["-y", "planbrew-mcp"]
|
|
40
|
+
|
|
41
|
+
[mcp_servers.planbrew.env]
|
|
42
|
+
PLANBREW_API_KEY = "your-api-key"
|
|
43
|
+
PLANBREW_PROJECT_ID = "your-project-id"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Tools
|
|
47
|
+
|
|
48
|
+
### Memory IN — save context as you work
|
|
49
|
+
|
|
50
|
+
| Tool | Description |
|
|
51
|
+
|------|-------------|
|
|
52
|
+
| `save_progress` | Save what you worked on |
|
|
53
|
+
| `mark_complete` | Mark a task as done |
|
|
54
|
+
| `log_blocker` | Record a blocker |
|
|
55
|
+
| `save_session` | End-of-session summary |
|
|
56
|
+
|
|
57
|
+
### Memory OUT — recall past work
|
|
58
|
+
|
|
59
|
+
| Tool | Description |
|
|
60
|
+
|------|-------------|
|
|
61
|
+
| `recall_work` | Search past work by keyword or date |
|
|
62
|
+
| `get_last_session` | What happened last session |
|
|
63
|
+
| `get_history` | Activity feed for any time period |
|
|
64
|
+
| `get_status` | Project overview and health |
|
|
65
|
+
|
|
66
|
+
## Environment Variables
|
|
67
|
+
|
|
68
|
+
| Variable | Required | Default |
|
|
69
|
+
|----------|----------|---------|
|
|
70
|
+
| `PLANBREW_API_KEY` | Yes | — |
|
|
71
|
+
| `PLANBREW_PROJECT_ID` | Yes | — |
|
|
72
|
+
| `PLANBREW_API_URL` | No | `https://api.planbrew.ai/api/v1` |
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { config } from "./config.js";
|
|
2
|
+
export async function apiRequest(method, path, body) {
|
|
3
|
+
const url = `${config.apiUrl}${path}`;
|
|
4
|
+
try {
|
|
5
|
+
const res = await fetch(url, {
|
|
6
|
+
method,
|
|
7
|
+
headers: {
|
|
8
|
+
"Content-Type": "application/json",
|
|
9
|
+
"X-API-KEY": config.apiKey,
|
|
10
|
+
},
|
|
11
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
12
|
+
});
|
|
13
|
+
const json = (await res.json());
|
|
14
|
+
return json;
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
18
|
+
console.error(`[planbrew-mcp] API request failed: ${message}`);
|
|
19
|
+
return { success: false, message: `Network error: ${message}` };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AASrC,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAAY,EACZ,IAA8B;IAE9B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,MAAM,CAAC,MAAM;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,OAAO,EAAE,EAAE,CAAC;IAClE,CAAC;AACH,CAAC"}
|
package/dist/config.d.ts
ADDED
package/dist/config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,gCAAgC;IACxE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;IAC1C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE;CACjD,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
// Memory IN tools
|
|
5
|
+
import { saveProgressSchema, saveProgressHandler } from "./tools/save-progress.js";
|
|
6
|
+
import { markCompleteSchema, markCompleteHandler } from "./tools/mark-complete.js";
|
|
7
|
+
import { logBlockerSchema, logBlockerHandler } from "./tools/log-blocker.js";
|
|
8
|
+
import { saveSessionSchema, saveSessionHandler } from "./tools/save-session.js";
|
|
9
|
+
// Memory OUT tools
|
|
10
|
+
import { recallWorkSchema, recallWorkHandler } from "./tools/recall-work.js";
|
|
11
|
+
import { getLastSessionSchema, getLastSessionHandler } from "./tools/get-last-session.js";
|
|
12
|
+
import { getHistorySchema, getHistoryHandler } from "./tools/get-history.js";
|
|
13
|
+
import { getStatusSchema, getStatusHandler } from "./tools/get-status.js";
|
|
14
|
+
const server = new McpServer({
|
|
15
|
+
name: "planbrew",
|
|
16
|
+
version: "0.1.0",
|
|
17
|
+
});
|
|
18
|
+
// --- Memory IN (save work context) ---
|
|
19
|
+
server.tool("save_progress", "Save what you worked on so it can be recalled later", saveProgressSchema.shape, saveProgressHandler);
|
|
20
|
+
server.tool("mark_complete", "Mark a task as done and record what was accomplished", markCompleteSchema.shape, markCompleteHandler);
|
|
21
|
+
server.tool("log_blocker", "Record a blocker or impediment that is slowing down work", logBlockerSchema.shape, logBlockerHandler);
|
|
22
|
+
server.tool("save_session", "Save a full session summary including files changed and blockers", saveSessionSchema.shape, saveSessionHandler);
|
|
23
|
+
// --- Memory OUT (recall past work) ---
|
|
24
|
+
server.tool("recall_work", "Search past work history to remember what was done before", recallWorkSchema.shape, recallWorkHandler);
|
|
25
|
+
server.tool("get_last_session", "Get the most recent session summary to pick up where you left off", getLastSessionSchema.shape, getLastSessionHandler);
|
|
26
|
+
server.tool("get_history", "Browse the activity feed to see what has been happening on the project", getHistorySchema.shape, getHistoryHandler);
|
|
27
|
+
server.tool("get_status", "Get the current project status including health, progress, and blockers", getStatusSchema.shape, getStatusHandler);
|
|
28
|
+
async function main() {
|
|
29
|
+
const transport = new StdioServerTransport();
|
|
30
|
+
await server.connect(transport);
|
|
31
|
+
console.error("[planbrew-mcp] Server started on STDIO");
|
|
32
|
+
}
|
|
33
|
+
main().catch((err) => {
|
|
34
|
+
console.error("[planbrew-mcp] Fatal error:", err);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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;AAEjF,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEhF,mBAAmB;AACnB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,wCAAwC;AAExC,MAAM,CAAC,IAAI,CACT,eAAe,EACf,qDAAqD,EACrD,kBAAkB,CAAC,KAAK,EACxB,mBAAmB,CACpB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,sDAAsD,EACtD,kBAAkB,CAAC,KAAK,EACxB,mBAAmB,CACpB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,0DAA0D,EAC1D,gBAAgB,CAAC,KAAK,EACtB,iBAAiB,CAClB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,kEAAkE,EAClE,iBAAiB,CAAC,KAAK,EACvB,kBAAkB,CACnB,CAAC;AAEF,wCAAwC;AAExC,MAAM,CAAC,IAAI,CACT,aAAa,EACb,2DAA2D,EAC3D,gBAAgB,CAAC,KAAK,EACtB,iBAAiB,CAClB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,mEAAmE,EACnE,oBAAoB,CAAC,KAAK,EAC1B,qBAAqB,CACtB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,wEAAwE,EACxE,gBAAgB,CAAC,KAAK,EACtB,iBAAiB,CAClB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,yEAAyE,EACzE,eAAe,CAAC,KAAK,EACrB,gBAAgB,CACjB,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getHistorySchema: z.ZodObject<{
|
|
3
|
+
from: z.ZodOptional<z.ZodString>;
|
|
4
|
+
to: z.ZodOptional<z.ZodString>;
|
|
5
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
from?: string | undefined;
|
|
8
|
+
to?: string | undefined;
|
|
9
|
+
limit?: number | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
from?: string | undefined;
|
|
12
|
+
to?: string | undefined;
|
|
13
|
+
limit?: number | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function getHistoryHandler(args: z.infer<typeof getHistorySchema>): Promise<{
|
|
16
|
+
content: {
|
|
17
|
+
type: "text";
|
|
18
|
+
text: string;
|
|
19
|
+
}[];
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { apiRequest } from "../api-client.js";
|
|
4
|
+
export const getHistorySchema = z.object({
|
|
5
|
+
from: z.string().optional().describe("Start date filter (ISO 8601 format, e.g., '2025-01-01')"),
|
|
6
|
+
to: z.string().optional().describe("End date filter (ISO 8601 format, e.g., '2025-12-31')"),
|
|
7
|
+
limit: z.number().optional().describe("Maximum number of entries to return"),
|
|
8
|
+
});
|
|
9
|
+
export async function getHistoryHandler(args) {
|
|
10
|
+
const projectId = config.projectId;
|
|
11
|
+
if (!projectId) {
|
|
12
|
+
return { content: [{ type: "text", text: "Error: PLANBREW_PROJECT_ID not set." }] };
|
|
13
|
+
}
|
|
14
|
+
const params = new URLSearchParams();
|
|
15
|
+
if (args.from)
|
|
16
|
+
params.set("from", args.from);
|
|
17
|
+
if (args.to)
|
|
18
|
+
params.set("to", args.to);
|
|
19
|
+
if (args.limit !== undefined)
|
|
20
|
+
params.set("limit", String(args.limit));
|
|
21
|
+
const qs = params.toString();
|
|
22
|
+
const path = `/progress/${encodeURIComponent(projectId)}/feed${qs ? `?${qs}` : ""}`;
|
|
23
|
+
const res = await apiRequest("GET", path);
|
|
24
|
+
if (!res.success) {
|
|
25
|
+
return { content: [{ type: "text", text: `Error fetching activity history: ${res.message}` }] };
|
|
26
|
+
}
|
|
27
|
+
if (!res.data || (Array.isArray(res.data) && res.data.length === 0)) {
|
|
28
|
+
return { content: [{ type: "text", text: "No activity history found." }] };
|
|
29
|
+
}
|
|
30
|
+
return { content: [{ type: "text", text: JSON.stringify(res.data, null, 2) }] };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=get-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-history.js","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IAC/F,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC3F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CAC7E,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAsC;IAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,aAAa,kBAAkB,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEpF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE1C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oCAAoC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IAC3G,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC;IACtF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { apiRequest } from "../api-client.js";
|
|
4
|
+
export const getLastSessionSchema = z.object({});
|
|
5
|
+
export async function getLastSessionHandler() {
|
|
6
|
+
const projectId = config.projectId;
|
|
7
|
+
if (!projectId) {
|
|
8
|
+
return { content: [{ type: "text", text: "Error: PLANBREW_PROJECT_ID not set." }] };
|
|
9
|
+
}
|
|
10
|
+
const res = await apiRequest("GET", `/progress/${encodeURIComponent(projectId)}/last-session`);
|
|
11
|
+
if (!res.success) {
|
|
12
|
+
return { content: [{ type: "text", text: `Error fetching last session: ${res.message}` }] };
|
|
13
|
+
}
|
|
14
|
+
if (!res.data) {
|
|
15
|
+
return { content: [{ type: "text", text: "No previous sessions found." }] };
|
|
16
|
+
}
|
|
17
|
+
return { content: [{ type: "text", text: JSON.stringify(res.data, null, 2) }] };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=get-last-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-last-session.js","sourceRoot":"","sources":["../../src/tools/get-last-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,eAAe,CAC1D,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gCAAgC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACvG,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,EAAE,CAAC;IACvF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { apiRequest } from "../api-client.js";
|
|
4
|
+
export const getStatusSchema = z.object({});
|
|
5
|
+
export async function getStatusHandler() {
|
|
6
|
+
const projectId = config.projectId;
|
|
7
|
+
if (!projectId) {
|
|
8
|
+
return { content: [{ type: "text", text: "Error: PLANBREW_PROJECT_ID not set." }] };
|
|
9
|
+
}
|
|
10
|
+
const res = await apiRequest("GET", `/progress/${encodeURIComponent(projectId)}/overview`);
|
|
11
|
+
if (!res.success) {
|
|
12
|
+
return { content: [{ type: "text", text: `Error fetching project status: ${res.message}` }] };
|
|
13
|
+
}
|
|
14
|
+
return { content: [{ type: "text", text: JSON.stringify(res.data, null, 2) }] };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=get-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-status.js","sourceRoot":"","sources":["../../src/tools/get-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,WAAW,CACtD,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kCAAkC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACzG,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const logBlockerSchema: z.ZodObject<{
|
|
3
|
+
description: z.ZodString;
|
|
4
|
+
severity: z.ZodOptional<z.ZodEnum<["LOW", "MEDIUM", "HIGH"]>>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
description: string;
|
|
7
|
+
severity?: "LOW" | "MEDIUM" | "HIGH" | undefined;
|
|
8
|
+
}, {
|
|
9
|
+
description: string;
|
|
10
|
+
severity?: "LOW" | "MEDIUM" | "HIGH" | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function logBlockerHandler(args: z.infer<typeof logBlockerSchema>): Promise<{
|
|
13
|
+
content: {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}[];
|
|
17
|
+
}>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { apiRequest } from "../api-client.js";
|
|
4
|
+
export const logBlockerSchema = z.object({
|
|
5
|
+
description: z.string().describe("Description of the blocker or impediment"),
|
|
6
|
+
severity: z.enum(["LOW", "MEDIUM", "HIGH"]).optional().describe("Blocker severity (default: MEDIUM)"),
|
|
7
|
+
});
|
|
8
|
+
export async function logBlockerHandler(args) {
|
|
9
|
+
const projectId = config.projectId;
|
|
10
|
+
if (!projectId) {
|
|
11
|
+
return { content: [{ type: "text", text: "Error: PLANBREW_PROJECT_ID not set." }] };
|
|
12
|
+
}
|
|
13
|
+
const res = await apiRequest("POST", "/progress/blocker", {
|
|
14
|
+
projectId,
|
|
15
|
+
description: args.description,
|
|
16
|
+
severity: args.severity || "MEDIUM",
|
|
17
|
+
});
|
|
18
|
+
if (!res.success) {
|
|
19
|
+
return { content: [{ type: "text", text: `Error logging blocker: ${res.message}` }] };
|
|
20
|
+
}
|
|
21
|
+
return { content: [{ type: "text", text: `Blocker logged: ${args.description}` }] };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=log-blocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-blocker.js","sourceRoot":"","sources":["../../src/tools/log-blocker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAC5E,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CACtG,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAsC;IAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE;QACxD,SAAS;QACT,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ;KACpC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACjG,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const markCompleteSchema: z.ZodObject<{
|
|
3
|
+
taskId: z.ZodString;
|
|
4
|
+
summary: z.ZodString;
|
|
5
|
+
filesChanged: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
summary: string;
|
|
8
|
+
taskId: string;
|
|
9
|
+
filesChanged?: string[] | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
summary: string;
|
|
12
|
+
taskId: string;
|
|
13
|
+
filesChanged?: string[] | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function markCompleteHandler(args: z.infer<typeof markCompleteSchema>): Promise<{
|
|
16
|
+
content: {
|
|
17
|
+
type: "text";
|
|
18
|
+
text: string;
|
|
19
|
+
}[];
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { apiRequest } from "../api-client.js";
|
|
4
|
+
export const markCompleteSchema = z.object({
|
|
5
|
+
taskId: z.string().describe("Task id or identifier to mark as complete"),
|
|
6
|
+
summary: z.string().describe("Summary of what was accomplished"),
|
|
7
|
+
filesChanged: z.array(z.string()).optional().describe("List of files that were changed"),
|
|
8
|
+
});
|
|
9
|
+
export async function markCompleteHandler(args) {
|
|
10
|
+
const projectId = config.projectId;
|
|
11
|
+
if (!projectId) {
|
|
12
|
+
return { content: [{ type: "text", text: "Error: PLANBREW_PROJECT_ID not set." }] };
|
|
13
|
+
}
|
|
14
|
+
const res = await apiRequest("POST", "/progress/complete", {
|
|
15
|
+
projectId,
|
|
16
|
+
taskId: args.taskId,
|
|
17
|
+
summary: args.summary,
|
|
18
|
+
filesChanged: args.filesChanged || [],
|
|
19
|
+
});
|
|
20
|
+
if (!res.success) {
|
|
21
|
+
return { content: [{ type: "text", text: `Error marking task complete: ${res.message}` }] };
|
|
22
|
+
}
|
|
23
|
+
return { content: [{ type: "text", text: `Task ${args.taskId} marked complete: ${args.summary}` }] };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=mark-complete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mark-complete.js","sourceRoot":"","sources":["../../src/tools/mark-complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACxE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAChE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CACzF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAwC;IAChF,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE;QACzD,SAAS;QACT,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;KACtC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gCAAgC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACvG,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,MAAM,qBAAqB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;AAChH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const recallWorkSchema: z.ZodObject<{
|
|
3
|
+
query: z.ZodString;
|
|
4
|
+
from: z.ZodOptional<z.ZodString>;
|
|
5
|
+
to: z.ZodOptional<z.ZodString>;
|
|
6
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
query: string;
|
|
9
|
+
from?: string | undefined;
|
|
10
|
+
to?: string | undefined;
|
|
11
|
+
limit?: number | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
query: string;
|
|
14
|
+
from?: string | undefined;
|
|
15
|
+
to?: string | undefined;
|
|
16
|
+
limit?: number | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function recallWorkHandler(args: z.infer<typeof recallWorkSchema>): Promise<{
|
|
19
|
+
content: {
|
|
20
|
+
type: "text";
|
|
21
|
+
text: string;
|
|
22
|
+
}[];
|
|
23
|
+
}>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { apiRequest } from "../api-client.js";
|
|
4
|
+
export const recallWorkSchema = z.object({
|
|
5
|
+
query: z.string().describe("Search query to find past work (e.g., 'auth refactor', 'payment bug fix')"),
|
|
6
|
+
from: z.string().optional().describe("Start date filter (ISO 8601 format, e.g., '2025-01-01')"),
|
|
7
|
+
to: z.string().optional().describe("End date filter (ISO 8601 format, e.g., '2025-12-31')"),
|
|
8
|
+
limit: z.number().optional().describe("Maximum number of results to return"),
|
|
9
|
+
});
|
|
10
|
+
export async function recallWorkHandler(args) {
|
|
11
|
+
const projectId = config.projectId;
|
|
12
|
+
if (!projectId) {
|
|
13
|
+
return { content: [{ type: "text", text: "Error: PLANBREW_PROJECT_ID not set." }] };
|
|
14
|
+
}
|
|
15
|
+
const params = new URLSearchParams();
|
|
16
|
+
params.set("q", args.query);
|
|
17
|
+
if (args.from)
|
|
18
|
+
params.set("from", args.from);
|
|
19
|
+
if (args.to)
|
|
20
|
+
params.set("to", args.to);
|
|
21
|
+
if (args.limit !== undefined)
|
|
22
|
+
params.set("limit", String(args.limit));
|
|
23
|
+
const res = await apiRequest("GET", `/progress/${encodeURIComponent(projectId)}/search?${params.toString()}`);
|
|
24
|
+
if (!res.success) {
|
|
25
|
+
return { content: [{ type: "text", text: `Error searching work history: ${res.message}` }] };
|
|
26
|
+
}
|
|
27
|
+
const data = res.data;
|
|
28
|
+
if (!data || (Array.isArray(data) && data.length === 0)) {
|
|
29
|
+
return { content: [{ type: "text", text: `No results found for "${args.query}".` }] };
|
|
30
|
+
}
|
|
31
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=recall-work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall-work.js","sourceRoot":"","sources":["../../src/tools/recall-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;IACvG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IAC/F,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC3F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CAC7E,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAsC;IAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtE,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,CACzE,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iCAAiC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACxG,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IACjG,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const saveProgressSchema: z.ZodObject<{
|
|
3
|
+
summary: z.ZodString;
|
|
4
|
+
featureArea: z.ZodOptional<z.ZodString>;
|
|
5
|
+
percentComplete: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
summary: string;
|
|
8
|
+
featureArea?: string | undefined;
|
|
9
|
+
percentComplete?: number | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
summary: string;
|
|
12
|
+
featureArea?: string | undefined;
|
|
13
|
+
percentComplete?: number | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function saveProgressHandler(args: z.infer<typeof saveProgressSchema>): Promise<{
|
|
16
|
+
content: {
|
|
17
|
+
type: "text";
|
|
18
|
+
text: string;
|
|
19
|
+
}[];
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { apiRequest } from "../api-client.js";
|
|
4
|
+
export const saveProgressSchema = z.object({
|
|
5
|
+
summary: z.string().describe("What you worked on - be specific about changes made"),
|
|
6
|
+
featureArea: z.string().optional().describe("Which feature area was worked on (e.g., 'auth', 'payments', 'dashboard')"),
|
|
7
|
+
percentComplete: z.number().min(0).max(100).optional().describe("Estimated completion percentage of current work (0-100)"),
|
|
8
|
+
});
|
|
9
|
+
export async function saveProgressHandler(args) {
|
|
10
|
+
const projectId = config.projectId;
|
|
11
|
+
if (!projectId) {
|
|
12
|
+
return { content: [{ type: "text", text: "Error: PLANBREW_PROJECT_ID not set." }] };
|
|
13
|
+
}
|
|
14
|
+
const body = {
|
|
15
|
+
projectId,
|
|
16
|
+
summary: args.summary,
|
|
17
|
+
};
|
|
18
|
+
if (args.featureArea)
|
|
19
|
+
body.featureArea = args.featureArea;
|
|
20
|
+
if (args.percentComplete !== undefined)
|
|
21
|
+
body.percentComplete = args.percentComplete;
|
|
22
|
+
const res = await apiRequest("POST", "/progress/update", body);
|
|
23
|
+
if (!res.success) {
|
|
24
|
+
return { content: [{ type: "text", text: `Error saving progress: ${res.message}` }] };
|
|
25
|
+
}
|
|
26
|
+
return { content: [{ type: "text", text: `Progress saved: ${args.summary}` }] };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=save-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-progress.js","sourceRoot":"","sources":["../../src/tools/save-progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IACnF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;IACvH,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;CAC3H,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAwC;IAChF,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,IAAI,GAA4B;QACpC,SAAS;QACT,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;IAEF,IAAI,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC1D,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;QAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IAEpF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAE/D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACjG,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const saveSessionSchema: z.ZodObject<{
|
|
3
|
+
summary: z.ZodString;
|
|
4
|
+
filesChanged: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
5
|
+
featureArea: z.ZodOptional<z.ZodString>;
|
|
6
|
+
estimatedCompletion: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
blockers: z.ZodOptional<z.ZodString>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
summary: string;
|
|
10
|
+
featureArea?: string | undefined;
|
|
11
|
+
filesChanged?: string[] | undefined;
|
|
12
|
+
estimatedCompletion?: number | undefined;
|
|
13
|
+
blockers?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
summary: string;
|
|
16
|
+
featureArea?: string | undefined;
|
|
17
|
+
filesChanged?: string[] | undefined;
|
|
18
|
+
estimatedCompletion?: number | undefined;
|
|
19
|
+
blockers?: string | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function saveSessionHandler(args: z.infer<typeof saveSessionSchema>): Promise<{
|
|
22
|
+
content: {
|
|
23
|
+
type: "text";
|
|
24
|
+
text: string;
|
|
25
|
+
}[];
|
|
26
|
+
}>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { apiRequest } from "../api-client.js";
|
|
4
|
+
export const saveSessionSchema = z.object({
|
|
5
|
+
summary: z.string().describe("What was accomplished in this coding session"),
|
|
6
|
+
filesChanged: z.array(z.string()).optional().describe("List of files that were changed"),
|
|
7
|
+
featureArea: z.string().optional().describe("Which feature area was worked on (e.g., 'auth', 'payments')"),
|
|
8
|
+
estimatedCompletion: z.number().min(0).max(100).optional().describe("Estimated completion percentage of current feature (0-100)"),
|
|
9
|
+
blockers: z.string().optional().describe("Any blockers encountered during the session"),
|
|
10
|
+
});
|
|
11
|
+
export async function saveSessionHandler(args) {
|
|
12
|
+
const projectId = config.projectId;
|
|
13
|
+
if (!projectId) {
|
|
14
|
+
return { content: [{ type: "text", text: "Error: PLANBREW_PROJECT_ID not set." }] };
|
|
15
|
+
}
|
|
16
|
+
const body = {
|
|
17
|
+
projectId,
|
|
18
|
+
summary: args.summary,
|
|
19
|
+
};
|
|
20
|
+
if (args.filesChanged)
|
|
21
|
+
body.filesChanged = args.filesChanged;
|
|
22
|
+
if (args.featureArea)
|
|
23
|
+
body.featureArea = args.featureArea;
|
|
24
|
+
if (args.estimatedCompletion !== undefined)
|
|
25
|
+
body.estimatedCompletion = args.estimatedCompletion;
|
|
26
|
+
if (args.blockers)
|
|
27
|
+
body.blockers = args.blockers;
|
|
28
|
+
const res = await apiRequest("POST", "/progress/session-report", body);
|
|
29
|
+
if (!res.success) {
|
|
30
|
+
return { content: [{ type: "text", text: `Error saving session: ${res.message}` }] };
|
|
31
|
+
}
|
|
32
|
+
return { content: [{ type: "text", text: `Session saved.\n${JSON.stringify(res.data, null, 2)}` }] };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=save-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-session.js","sourceRoot":"","sources":["../../src/tools/save-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAC5E,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACxF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;IAC1G,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;IACjI,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;CACxF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAuC;IAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,IAAI,GAA4B;QACpC,SAAS;QACT,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;IAEF,IAAI,IAAI,CAAC,YAAY;QAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IAC7D,IAAI,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC1D,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;QAAE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;IAChG,IAAI,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAEjD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,0BAA0B,EAAE,IAAI,CAAC,CAAC;IAEvE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IAChG,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAChH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "planbrew-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for PlanBrew - project memory for AI coding agents",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"bin": {
|
|
9
|
+
"planbrew-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"keywords": [
|
|
15
|
+
"mcp",
|
|
16
|
+
"planbrew",
|
|
17
|
+
"ai",
|
|
18
|
+
"developer-tools",
|
|
19
|
+
"progress-tracking",
|
|
20
|
+
"model-context-protocol",
|
|
21
|
+
"claude",
|
|
22
|
+
"cursor",
|
|
23
|
+
"codex"
|
|
24
|
+
],
|
|
25
|
+
"homepage": "https://www.planbrew.ai",
|
|
26
|
+
"scripts": {
|
|
27
|
+
"prepublishOnly": "npm run build",
|
|
28
|
+
"build": "tsc",
|
|
29
|
+
"dev": "tsc --watch",
|
|
30
|
+
"start": "node dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
34
|
+
"zod": "^3.24.2"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^22.0.0",
|
|
38
|
+
"typescript": "^5.7.0"
|
|
39
|
+
}
|
|
40
|
+
}
|