@kylewadegrove/cutline-mcp-cli 0.4.2 → 0.5.1

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.
Files changed (49) hide show
  1. package/Dockerfile +11 -0
  2. package/README.md +177 -107
  3. package/dist/auth/callback.js +30 -32
  4. package/dist/auth/keychain.js +7 -15
  5. package/dist/commands/init.d.ts +4 -0
  6. package/dist/commands/init.js +246 -0
  7. package/dist/commands/login.js +39 -45
  8. package/dist/commands/logout.js +13 -19
  9. package/dist/commands/serve.d.ts +1 -0
  10. package/dist/commands/serve.js +38 -0
  11. package/dist/commands/setup.d.ts +5 -0
  12. package/dist/commands/setup.js +267 -0
  13. package/dist/commands/status.js +29 -35
  14. package/dist/commands/upgrade.js +44 -38
  15. package/dist/index.js +38 -14
  16. package/dist/servers/chunk-7FHM2GD3.js +5836 -0
  17. package/dist/servers/chunk-IVWF7VYZ.js +10086 -0
  18. package/dist/servers/chunk-JBJYSV4P.js +139 -0
  19. package/dist/servers/chunk-KMUSQOTJ.js +47 -0
  20. package/dist/servers/chunk-PD2HN2R5.js +908 -0
  21. package/dist/servers/chunk-PU7TL6S3.js +91 -0
  22. package/dist/servers/chunk-TGSEURMN.js +46 -0
  23. package/dist/servers/chunk-UBBAYTW3.js +946 -0
  24. package/dist/servers/cutline-server.js +11512 -0
  25. package/dist/servers/exploration-server.js +1030 -0
  26. package/dist/servers/graph-metrics-DCNR7JZN.js +12 -0
  27. package/dist/servers/integrations-server.js +121 -0
  28. package/dist/servers/output-server.js +120 -0
  29. package/dist/servers/pipeline-O5GJPNR4.js +20 -0
  30. package/dist/servers/premortem-handoff-XT4K3YDJ.js +10 -0
  31. package/dist/servers/premortem-server.js +958 -0
  32. package/dist/servers/score-history-HO5KRVGC.js +6 -0
  33. package/dist/servers/tools-server.js +291 -0
  34. package/dist/utils/config-store.js +13 -21
  35. package/dist/utils/config.js +2 -6
  36. package/mcpb/manifest.json +77 -0
  37. package/package.json +55 -9
  38. package/server.json +42 -0
  39. package/smithery.yaml +10 -0
  40. package/src/auth/callback.ts +0 -102
  41. package/src/auth/keychain.ts +0 -16
  42. package/src/commands/login.ts +0 -202
  43. package/src/commands/logout.ts +0 -30
  44. package/src/commands/status.ts +0 -153
  45. package/src/commands/upgrade.ts +0 -121
  46. package/src/index.ts +0 -40
  47. package/src/utils/config-store.ts +0 -46
  48. package/src/utils/config.ts +0 -65
  49. package/tsconfig.json +0 -22
@@ -0,0 +1,12 @@
1
+ import {
2
+ applyGenericPrior,
3
+ computeGenericGraphMetrics,
4
+ computeGraphMetrics,
5
+ computeMetricsFromGraph
6
+ } from "./chunk-UBBAYTW3.js";
7
+ export {
8
+ applyGenericPrior,
9
+ computeGenericGraphMetrics,
10
+ computeGraphMetrics,
11
+ computeMetricsFromGraph
12
+ };
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isWriteTool
4
+ } from "./chunk-KMUSQOTJ.js";
5
+ import {
6
+ createLinearIssues,
7
+ processStripeEvent
8
+ } from "./chunk-IVWF7VYZ.js";
9
+ import {
10
+ guardBoundary,
11
+ guardOutput,
12
+ initFirebase,
13
+ mapErrorToMcp,
14
+ requirePremiumWithAutoAuth,
15
+ validateAuth,
16
+ validateRequestSize,
17
+ withPerfTracking
18
+ } from "./chunk-PD2HN2R5.js";
19
+ import "./chunk-7FHM2GD3.js";
20
+ import "./chunk-JBJYSV4P.js";
21
+
22
+ // ../mcp/dist/mcp/src/integrations-server.js
23
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
24
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
25
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from "@modelcontextprotocol/sdk/types.js";
26
+ import Stripe from "stripe";
27
+ var server = new Server({
28
+ name: "cutline-integrations",
29
+ version: "0.1.0"
30
+ }, {
31
+ capabilities: {
32
+ tools: {}
33
+ }
34
+ });
35
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
36
+ return {
37
+ tools: [
38
+ {
39
+ name: "integrations_create_issues",
40
+ description: "Create issues in issue tracker (stub)",
41
+ inputSchema: {
42
+ type: "object",
43
+ properties: {
44
+ schema_json: { type: "object" },
45
+ limit: { type: "number" },
46
+ auth_token: { type: "string" }
47
+ },
48
+ required: ["schema_json"]
49
+ }
50
+ },
51
+ {
52
+ name: "stripe_webhook_dispatch",
53
+ description: "Manually dispatch a Stripe webhook event",
54
+ inputSchema: {
55
+ type: "object",
56
+ properties: {
57
+ event: { type: "object" },
58
+ auth_token: { type: "string" }
59
+ },
60
+ required: ["event"]
61
+ }
62
+ }
63
+ ]
64
+ };
65
+ });
66
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
67
+ try {
68
+ const { name, arguments: rawArgs } = request.params;
69
+ if (!rawArgs)
70
+ throw new McpError(ErrorCode.InvalidParams, "Missing arguments");
71
+ validateRequestSize(rawArgs);
72
+ const { args } = guardBoundary(name, rawArgs);
73
+ initFirebase();
74
+ const rawResponse = await withPerfTracking(name, async () => {
75
+ if (isWriteTool(name)) {
76
+ const peekToken = args.auth_token;
77
+ if (peekToken) {
78
+ const peekDecoded = await validateAuth(peekToken).catch(() => null);
79
+ if (peekDecoded && peekDecoded.accountType === "agent") {
80
+ throw new McpError(ErrorCode.InvalidRequest, "This is a read-only agent account. Write operations require the owner account.");
81
+ }
82
+ }
83
+ }
84
+ switch (name) {
85
+ case "integrations_create_issues": {
86
+ const { schema_json, limit, auth_token } = args;
87
+ await requirePremiumWithAutoAuth(auth_token);
88
+ const result = await createLinearIssues(schema_json, limit);
89
+ return {
90
+ content: [{ type: "text", text: JSON.stringify(result) }]
91
+ };
92
+ }
93
+ case "stripe_webhook_dispatch": {
94
+ const { event, auth_token } = args;
95
+ await requirePremiumWithAutoAuth(auth_token);
96
+ const stripe = new Stripe(process.env.STRIPE_SECRET_KEY || "", {
97
+ apiVersion: "2023-10-16"
98
+ });
99
+ await processStripeEvent(event, stripe);
100
+ return {
101
+ content: [{ type: "text", text: JSON.stringify({ dispatched: true }) }]
102
+ };
103
+ }
104
+ default:
105
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
106
+ }
107
+ });
108
+ return guardOutput(name, rawResponse);
109
+ } catch (error) {
110
+ throw mapErrorToMcp(error, { tool: request.params.name });
111
+ }
112
+ });
113
+ async function run() {
114
+ const transport = new StdioServerTransport();
115
+ await server.connect(transport);
116
+ console.error("Cutline Integrations MCP Server running on stdio");
117
+ }
118
+ run().catch((error) => {
119
+ console.error("Fatal error running server:", error);
120
+ process.exit(1);
121
+ });
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ buildPdfBuffer,
4
+ generateAnswer,
5
+ uploadAndSign
6
+ } from "./chunk-IVWF7VYZ.js";
7
+ import {
8
+ guardBoundary,
9
+ guardOutput,
10
+ initFirebase,
11
+ mapErrorToMcp,
12
+ requirePremiumWithAutoAuth,
13
+ validateRequestSize,
14
+ withPerfTracking
15
+ } from "./chunk-PD2HN2R5.js";
16
+ import {
17
+ PMJsonSchema
18
+ } from "./chunk-7FHM2GD3.js";
19
+ import "./chunk-JBJYSV4P.js";
20
+
21
+ // ../mcp/dist/mcp/src/output-server.js
22
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
23
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
24
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from "@modelcontextprotocol/sdk/types.js";
25
+ var server = new Server({
26
+ name: "cutline-output",
27
+ version: "0.1.0"
28
+ }, {
29
+ capabilities: {
30
+ tools: {}
31
+ }
32
+ });
33
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
34
+ return {
35
+ tools: [
36
+ {
37
+ name: "premortem_render_pdf",
38
+ description: "Generate PDF and signed URL",
39
+ inputSchema: {
40
+ type: "object",
41
+ properties: {
42
+ doc: { type: "object" },
43
+ auth_token: { type: "string" },
44
+ store: { type: "boolean" }
45
+ },
46
+ required: ["doc"]
47
+ }
48
+ },
49
+ {
50
+ name: "premortem_qa_answer",
51
+ description: "Answer questions against a premortem doc",
52
+ inputSchema: {
53
+ type: "object",
54
+ properties: {
55
+ question: { type: "string" },
56
+ doc: { type: "object" }
57
+ },
58
+ required: ["question"]
59
+ }
60
+ }
61
+ ]
62
+ };
63
+ });
64
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
65
+ try {
66
+ const { name, arguments: rawArgs } = request.params;
67
+ if (!rawArgs)
68
+ throw new McpError(ErrorCode.InvalidParams, "Missing arguments");
69
+ validateRequestSize(rawArgs);
70
+ const { args } = guardBoundary(name, rawArgs);
71
+ initFirebase();
72
+ const rawResponse = await withPerfTracking(name, async () => {
73
+ switch (name) {
74
+ case "premortem_render_pdf": {
75
+ const { doc, auth_token, store = true } = args;
76
+ await requirePremiumWithAutoAuth(auth_token);
77
+ const parsedDoc = PMJsonSchema.parse(doc);
78
+ const bytes = await buildPdfBuffer(parsedDoc);
79
+ if (store) {
80
+ const uploaded = await uploadAndSign(bytes, parsedDoc?.project?.name || "premortem");
81
+ if (uploaded?.url) {
82
+ return {
83
+ content: [{ type: "text", text: JSON.stringify({ ok: true, url: uploaded.url }) }]
84
+ };
85
+ }
86
+ }
87
+ const base64 = Buffer.from(bytes).toString("base64");
88
+ return {
89
+ content: [{ type: "text", text: JSON.stringify({ ok: true, dataUrl: `data:application/pdf;base64,${base64}` }) }]
90
+ };
91
+ }
92
+ case "premortem_qa_answer": {
93
+ const { question, doc, auth_token } = args;
94
+ const allowPublic = process.env.ALLOW_PUBLIC_PREMORTEM === "true";
95
+ if (!allowPublic) {
96
+ await requirePremiumWithAutoAuth(auth_token);
97
+ }
98
+ const result = await generateAnswer(question, doc);
99
+ return {
100
+ content: [{ type: "text", text: JSON.stringify(result) }]
101
+ };
102
+ }
103
+ default:
104
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
105
+ }
106
+ });
107
+ return guardOutput(name, rawResponse);
108
+ } catch (error) {
109
+ throw mapErrorToMcp(error, { tool: request.params.name });
110
+ }
111
+ });
112
+ async function run() {
113
+ const transport = new StdioServerTransport();
114
+ await server.connect(transport);
115
+ console.error("Cutline Output MCP Server running on stdio");
116
+ }
117
+ run().catch((error) => {
118
+ console.error("Fatal error running server:", error);
119
+ process.exit(1);
120
+ });
@@ -0,0 +1,20 @@
1
+ import {
2
+ regenerateAssumptions,
3
+ regenerateExperiments,
4
+ regenerateFeaturePriorities,
5
+ regenerateFeatures,
6
+ regenerateFeaturesOnly,
7
+ regenerateGraphAndVerdict,
8
+ runRolesAndSummarize,
9
+ runRolesAndSummarizeIncremental
10
+ } from "./chunk-7FHM2GD3.js";
11
+ export {
12
+ regenerateAssumptions,
13
+ regenerateExperiments,
14
+ regenerateFeaturePriorities,
15
+ regenerateFeatures,
16
+ regenerateFeaturesOnly,
17
+ regenerateGraphAndVerdict,
18
+ runRolesAndSummarize,
19
+ runRolesAndSummarizeIncremental
20
+ };
@@ -0,0 +1,10 @@
1
+ import {
2
+ buildGraduationMetadata,
3
+ buildRunInput,
4
+ validateForGraduation
5
+ } from "./chunk-JBJYSV4P.js";
6
+ export {
7
+ buildGraduationMetadata,
8
+ buildRunInput,
9
+ validateForGraduation
10
+ };