@unbrained/pm-cli 2026.5.6 → 2026.5.10

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 (197) hide show
  1. package/.agents/pm/extensions/.managed-extensions.json +2 -2
  2. package/.agents/pm/extensions/beads/runtime.js +4 -4
  3. package/.agents/pm/extensions/beads/runtime.ts +5 -5
  4. package/.agents/pm/extensions/todos/runtime.js +7 -7
  5. package/.agents/pm/extensions/todos/runtime.ts +10 -10
  6. package/.agents/skills/HARNESS_COMPATIBILITY.md +45 -0
  7. package/.agents/skills/README.md +21 -0
  8. package/.agents/skills/pm-developer/SKILL.md +73 -0
  9. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +48 -0
  10. package/.agents/skills/pm-developer/references/PROMPTS.md +17 -0
  11. package/.agents/skills/pm-extensions/SKILL.md +57 -0
  12. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +40 -0
  13. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +25 -0
  14. package/.agents/skills/pm-sdk/SKILL.md +50 -0
  15. package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +31 -0
  16. package/.agents/skills/pm-sdk/references/PROMPTS.md +13 -0
  17. package/.agents/skills/pm-user/SKILL.md +59 -0
  18. package/.agents/skills/pm-user/references/PROMPTS.md +17 -0
  19. package/.agents/skills/pm-user/references/WORKFLOWS.md +35 -0
  20. package/.claude-plugin/marketplace.json +38 -0
  21. package/.pi/README.md +26 -0
  22. package/.pi/extensions/pm-cli/index.js +147 -0
  23. package/.pi/prompts/pm-workflow.md +5 -0
  24. package/.pi/skills/pm-native/SKILL.md +40 -0
  25. package/.pi/skills/pm-release/SKILL.md +35 -0
  26. package/AGENTS.md +1 -1
  27. package/CHANGELOG.md +6 -0
  28. package/PRD.md +16 -16
  29. package/README.md +22 -4
  30. package/dist/cli/commands/claim.js +6 -6
  31. package/dist/cli/commands/claim.js.map +1 -1
  32. package/dist/cli/commands/close.js +9 -9
  33. package/dist/cli/commands/close.js.map +1 -1
  34. package/dist/cli/commands/comments.d.ts +2 -0
  35. package/dist/cli/commands/comments.js +57 -8
  36. package/dist/cli/commands/comments.js.map +1 -1
  37. package/dist/cli/commands/completion.js +33 -4
  38. package/dist/cli/commands/completion.js.map +1 -1
  39. package/dist/cli/commands/config.js +6 -3
  40. package/dist/cli/commands/config.js.map +1 -1
  41. package/dist/cli/commands/contracts.js +4 -1
  42. package/dist/cli/commands/contracts.js.map +1 -1
  43. package/dist/cli/commands/create.d.ts +2 -2
  44. package/dist/cli/commands/create.js +4 -4
  45. package/dist/cli/commands/create.js.map +1 -1
  46. package/dist/cli/commands/docs.js +4 -4
  47. package/dist/cli/commands/docs.js.map +1 -1
  48. package/dist/cli/commands/files.js +10 -10
  49. package/dist/cli/commands/files.js.map +1 -1
  50. package/dist/cli/commands/get.js +5 -5
  51. package/dist/cli/commands/get.js.map +1 -1
  52. package/dist/cli/commands/guide.d.ts +55 -0
  53. package/dist/cli/commands/guide.js +260 -0
  54. package/dist/cli/commands/guide.js.map +1 -0
  55. package/dist/cli/commands/health.js +1 -1
  56. package/dist/cli/commands/health.js.map +1 -1
  57. package/dist/cli/commands/history.js +30 -10
  58. package/dist/cli/commands/history.js.map +1 -1
  59. package/dist/cli/commands/index.d.ts +1 -0
  60. package/dist/cli/commands/index.js +1 -0
  61. package/dist/cli/commands/index.js.map +1 -1
  62. package/dist/cli/commands/learnings.js +3 -3
  63. package/dist/cli/commands/learnings.js.map +1 -1
  64. package/dist/cli/commands/notes.js +3 -3
  65. package/dist/cli/commands/notes.js.map +1 -1
  66. package/dist/cli/commands/reindex.js +18 -32
  67. package/dist/cli/commands/reindex.js.map +1 -1
  68. package/dist/cli/commands/restore.d.ts +2 -2
  69. package/dist/cli/commands/restore.js +44 -24
  70. package/dist/cli/commands/restore.js.map +1 -1
  71. package/dist/cli/commands/search.d.ts +2 -0
  72. package/dist/cli/commands/search.js +30 -21
  73. package/dist/cli/commands/search.js.map +1 -1
  74. package/dist/cli/commands/test-all.d.ts +2 -0
  75. package/dist/cli/commands/test-all.js +2 -0
  76. package/dist/cli/commands/test-all.js.map +1 -1
  77. package/dist/cli/commands/test.d.ts +1 -0
  78. package/dist/cli/commands/test.js +4 -3
  79. package/dist/cli/commands/test.js.map +1 -1
  80. package/dist/cli/commands/update.js +118 -118
  81. package/dist/cli/commands/update.js.map +1 -1
  82. package/dist/cli/commands/validate.js +1 -1
  83. package/dist/cli/commands/validate.js.map +1 -1
  84. package/dist/cli/guide-topics.d.ts +25 -0
  85. package/dist/cli/guide-topics.js +283 -0
  86. package/dist/cli/guide-topics.js.map +1 -0
  87. package/dist/cli/help-content.js +25 -1
  88. package/dist/cli/help-content.js.map +1 -1
  89. package/dist/cli/register-list-query.js +38 -1
  90. package/dist/cli/register-list-query.js.map +1 -1
  91. package/dist/cli/register-mutation.js +17 -4
  92. package/dist/cli/register-mutation.js.map +1 -1
  93. package/dist/cli/register-setup.js +1 -1
  94. package/dist/cli/register-setup.js.map +1 -1
  95. package/dist/core/history/history.js +32 -11
  96. package/dist/core/history/history.js.map +1 -1
  97. package/dist/core/item/item-format.d.ts +2 -2
  98. package/dist/core/item/item-format.js +16 -16
  99. package/dist/core/item/item-format.js.map +1 -1
  100. package/dist/core/schema/runtime-field-filters.js +1 -1
  101. package/dist/core/schema/runtime-field-filters.js.map +1 -1
  102. package/dist/core/schema/runtime-field-values.js +2 -2
  103. package/dist/core/schema/runtime-field-values.js.map +1 -1
  104. package/dist/core/schema/runtime-schema.d.ts +1 -1
  105. package/dist/core/schema/runtime-schema.js +3 -3
  106. package/dist/core/schema/runtime-schema.js.map +1 -1
  107. package/dist/core/search/cache.js +7 -21
  108. package/dist/core/search/cache.js.map +1 -1
  109. package/dist/core/search/corpus.d.ts +13 -0
  110. package/dist/core/search/corpus.js +74 -0
  111. package/dist/core/search/corpus.js.map +1 -0
  112. package/dist/core/search/embedding-batches.js +90 -30
  113. package/dist/core/search/embedding-batches.js.map +1 -1
  114. package/dist/core/sentry/instrument.d.ts +3 -1
  115. package/dist/core/sentry/instrument.js +93 -9
  116. package/dist/core/sentry/instrument.js.map +1 -1
  117. package/dist/core/shared/constants.d.ts +1 -1
  118. package/dist/core/shared/constants.js +1 -1
  119. package/dist/core/shared/constants.js.map +1 -1
  120. package/dist/core/store/front-matter-cache.d.ts +1 -1
  121. package/dist/core/store/front-matter-cache.js +13 -13
  122. package/dist/core/store/front-matter-cache.js.map +1 -1
  123. package/dist/core/store/item-format-migration.js +5 -2
  124. package/dist/core/store/item-format-migration.js.map +1 -1
  125. package/dist/core/store/item-store.js +16 -15
  126. package/dist/core/store/item-store.js.map +1 -1
  127. package/dist/core/store/paths.js +1 -1
  128. package/dist/core/store/paths.js.map +1 -1
  129. package/dist/core/store/settings.js +6 -1
  130. package/dist/core/store/settings.js.map +1 -1
  131. package/dist/core/test/item-test-run-tracking.js +2 -2
  132. package/dist/core/test/item-test-run-tracking.js.map +1 -1
  133. package/dist/mcp/server.d.ts +2 -0
  134. package/dist/mcp/server.js +405 -0
  135. package/dist/mcp/server.js.map +1 -0
  136. package/dist/pi/native.d.ts +5 -0
  137. package/dist/pi/native.js +183 -0
  138. package/dist/pi/native.js.map +1 -0
  139. package/dist/sdk/cli-contracts.d.ts +3 -1
  140. package/dist/sdk/cli-contracts.js +67 -2
  141. package/dist/sdk/cli-contracts.js.map +1 -1
  142. package/dist/types.d.ts +10 -2
  143. package/dist/types.js.map +1 -1
  144. package/docs/AGENT_GUIDE.md +15 -0
  145. package/docs/ARCHITECTURE.md +2 -2
  146. package/docs/CLAUDE_CODE_PLUGIN.md +186 -0
  147. package/docs/CODEX_PLUGIN.md +33 -0
  148. package/docs/COMMANDS.md +6 -2
  149. package/docs/CONFIGURATION.md +2 -8
  150. package/docs/EXTENSIONS.md +1 -0
  151. package/docs/PI_PACKAGE.md +56 -0
  152. package/docs/QUICKSTART.md +1 -0
  153. package/docs/README.md +30 -1
  154. package/docs/RELEASING.md +4 -2
  155. package/docs/SDK.md +3 -2
  156. package/marketplace.json +34 -0
  157. package/package.json +38 -4
  158. package/plugins/pm-cli-claude/.claude-plugin/plugin.json +23 -0
  159. package/plugins/pm-cli-claude/.mcp.json +12 -0
  160. package/plugins/pm-cli-claude/README.md +184 -0
  161. package/plugins/pm-cli-claude/agents/pm-coordinator.md +48 -0
  162. package/plugins/pm-cli-claude/commands/pm-audit.md +39 -0
  163. package/plugins/pm-cli-claude/commands/pm-calendar.md +41 -0
  164. package/plugins/pm-cli-claude/commands/pm-close-task.md +20 -0
  165. package/plugins/pm-cli-claude/commands/pm-developer.md +38 -0
  166. package/plugins/pm-cli-claude/commands/pm-init.md +44 -0
  167. package/plugins/pm-cli-claude/commands/pm-list.md +39 -0
  168. package/plugins/pm-cli-claude/commands/pm-new.md +36 -0
  169. package/plugins/pm-cli-claude/commands/pm-planner.md +51 -0
  170. package/plugins/pm-cli-claude/commands/pm-release.md +41 -0
  171. package/plugins/pm-cli-claude/commands/pm-search.md +21 -0
  172. package/plugins/pm-cli-claude/commands/pm-start-task.md +27 -0
  173. package/plugins/pm-cli-claude/commands/pm-status.md +15 -0
  174. package/plugins/pm-cli-claude/commands/pm-triage.md +35 -0
  175. package/plugins/pm-cli-claude/commands/pm-workflow.md +49 -0
  176. package/plugins/pm-cli-claude/hooks/hooks.json +17 -0
  177. package/plugins/pm-cli-claude/hooks/session-start.mjs +55 -0
  178. package/plugins/pm-cli-claude/scripts/pm-mcp-server.mjs +60 -0
  179. package/plugins/pm-cli-claude/skills/pm-audit/SKILL.md +88 -0
  180. package/plugins/pm-cli-claude/skills/pm-developer/SKILL.md +116 -0
  181. package/plugins/pm-cli-claude/skills/pm-planner/SKILL.md +118 -0
  182. package/plugins/pm-cli-claude/skills/pm-release/SKILL.md +83 -0
  183. package/plugins/pm-cli-claude/skills/pm-workflow/SKILL.md +148 -0
  184. package/plugins/pm-cli-codex/.codex-plugin/plugin.json +45 -0
  185. package/plugins/pm-cli-codex/.mcp.json +14 -0
  186. package/plugins/pm-cli-codex/README.md +30 -0
  187. package/plugins/pm-cli-codex/assets/pm-cli-small.svg +4 -0
  188. package/plugins/pm-cli-codex/commands/pm-audit.md +8 -0
  189. package/plugins/pm-cli-codex/commands/pm-close-task.md +9 -0
  190. package/plugins/pm-cli-codex/commands/pm-start-task.md +9 -0
  191. package/plugins/pm-cli-codex/scripts/pm-mcp-server.mjs +54 -0
  192. package/plugins/pm-cli-codex/skills/pm-auditor/SKILL.md +21 -0
  193. package/plugins/pm-cli-codex/skills/pm-auditor/agents/openai.yaml +6 -0
  194. package/plugins/pm-cli-codex/skills/pm-native/SKILL.md +57 -0
  195. package/plugins/pm-cli-codex/skills/pm-native/agents/openai.yaml +6 -0
  196. package/plugins/pm-cli-codex/skills/pm-release/SKILL.md +19 -0
  197. package/plugins/pm-cli-codex/skills/pm-release/agents/openai.yaml +6 -0
@@ -0,0 +1,405 @@
1
+ #!/usr/bin/env node
2
+ import readline from "node:readline";
3
+ import { PmCliError } from "../core/shared/errors.js";
4
+ import { runActivity, runAggregate, runAppend, runCalendar, runClaim, runClose, runComments, runCommentsAudit, runContracts, runContext, runCreate, runCompletion, runConfig, runDelete, runDedupeAudit, runDeps, runDocs, runExtension, runFiles, runFilesDiscover, runGc, runGet, runGuide, runHealth, runHistory, runInit, runLearnings, runList, runNormalize, runNotes, runReindex, runRelease, runSearch, runStats, runTemplatesList, runTemplatesSave, runTemplatesShow, runTest, runTestAll, runTestRunsList, runTestRunsLogs, runTestRunsResume, runTestRunsStatus, runTestRunsStop, runUpdate, runUpdateMany, runValidate, } from "../cli/commands/index.js";
5
+ const TOOL_SCHEMA_BASE = {
6
+ type: "object",
7
+ properties: {
8
+ cwd: {
9
+ type: "string",
10
+ description: "Workspace directory to run the native pm operation in. Defaults to the MCP server process cwd.",
11
+ },
12
+ path: {
13
+ type: "string",
14
+ description: "Optional pm data root, equivalent to PM_PATH/global --path. Leave unset for real repository tracking.",
15
+ },
16
+ author: {
17
+ type: "string",
18
+ description: "Mutation author. Defaults to PM_AUTHOR or pm settings when supported by the underlying operation.",
19
+ },
20
+ },
21
+ additionalProperties: true,
22
+ };
23
+ const idSchema = {
24
+ type: "string",
25
+ description: "pm item id, for example pm-abc1.",
26
+ };
27
+ function objectSchema(properties, required = []) {
28
+ return {
29
+ ...TOOL_SCHEMA_BASE,
30
+ properties: {
31
+ ...TOOL_SCHEMA_BASE.properties,
32
+ ...properties,
33
+ },
34
+ required,
35
+ };
36
+ }
37
+ const TOOLS = [
38
+ {
39
+ name: "pm_run",
40
+ description: "Run any supported pm operation natively through the pm library. Use this for commands not covered by narrower pm_* tools.",
41
+ inputSchema: objectSchema({
42
+ action: {
43
+ type: "string",
44
+ description: "Operation name: init, context, list, get, search, create, update, delete, claim, release, close, comments, notes, learnings, files, files-discover, docs, deps, test, test-all, validate, health, contracts, completion, config, calendar, activity, aggregate, dedupe-audit, normalize, reindex, extension, history, stats, append, update-many, comments-audit, gc, templates-list, templates-save, templates-show, test-runs-list, test-runs-status, test-runs-logs, test-runs-stop, test-runs-resume.",
45
+ },
46
+ id: idSchema,
47
+ query: { type: "string", description: "Search query for action=search." },
48
+ reason: { type: "string", description: "Close reason for action=close." },
49
+ force: { type: "boolean", description: "Force ownership/terminal-state override when supported." },
50
+ options: { type: "object", description: "Underlying pm command options using camelCase keys." },
51
+ }, ["action"]),
52
+ },
53
+ {
54
+ name: "pm_context",
55
+ description: "Return the agent-oriented project context snapshot.",
56
+ inputSchema: objectSchema({ options: { type: "object" } }),
57
+ },
58
+ {
59
+ name: "pm_search",
60
+ description: "Search pm items with keyword, semantic, or hybrid search.",
61
+ inputSchema: objectSchema({ query: { type: "string" }, options: { type: "object" } }, ["query"]),
62
+ },
63
+ {
64
+ name: "pm_list",
65
+ description: "List pm items with status/type/tag/priority filters.",
66
+ inputSchema: objectSchema({ options: { type: "object" } }),
67
+ },
68
+ {
69
+ name: "pm_get",
70
+ description: "Read one pm item with body, linked files/tests/docs, and claim state.",
71
+ inputSchema: objectSchema({ id: idSchema }, ["id"]),
72
+ },
73
+ {
74
+ name: "pm_create",
75
+ description: "Create a pm item natively and write pm history.",
76
+ inputSchema: objectSchema({ options: { type: "object", description: "Create options. title and description are required." } }, [
77
+ "options",
78
+ ]),
79
+ },
80
+ {
81
+ name: "pm_update",
82
+ description: "Update pm item metadata/body/dependencies/log seeds natively.",
83
+ inputSchema: objectSchema({ id: idSchema, options: { type: "object" } }, ["id", "options"]),
84
+ },
85
+ {
86
+ name: "pm_claim",
87
+ description: "Claim a pm item.",
88
+ inputSchema: objectSchema({ id: idSchema, force: { type: "boolean" }, options: { type: "object" } }, ["id"]),
89
+ },
90
+ {
91
+ name: "pm_release",
92
+ description: "Release a pm item claim.",
93
+ inputSchema: objectSchema({ id: idSchema, force: { type: "boolean" }, options: { type: "object" } }, ["id"]),
94
+ },
95
+ {
96
+ name: "pm_close",
97
+ description: "Close a pm item with a reason and optional close validation.",
98
+ inputSchema: objectSchema({ id: idSchema, reason: { type: "string" }, options: { type: "object" } }, ["id", "reason"]),
99
+ },
100
+ {
101
+ name: "pm_comments",
102
+ description: "List or add comments on a pm item. Use options.add to append.",
103
+ inputSchema: objectSchema({ id: idSchema, options: { type: "object" } }, ["id"]),
104
+ },
105
+ {
106
+ name: "pm_files",
107
+ description: "List, add, remove, audit, or validate linked files for a pm item.",
108
+ inputSchema: objectSchema({ id: idSchema, options: { type: "object" } }, ["id"]),
109
+ },
110
+ {
111
+ name: "pm_docs",
112
+ description: "List, add, or remove linked docs for a pm item.",
113
+ inputSchema: objectSchema({ id: idSchema, options: { type: "object" } }, ["id"]),
114
+ },
115
+ {
116
+ name: "pm_test",
117
+ description: "List, add, remove, or run linked tests for a pm item.",
118
+ inputSchema: objectSchema({ id: idSchema, options: { type: "object" } }, ["id"]),
119
+ },
120
+ {
121
+ name: "pm_validate",
122
+ description: "Run pm validation checks.",
123
+ inputSchema: objectSchema({ options: { type: "object" } }),
124
+ },
125
+ {
126
+ name: "pm_health",
127
+ description: "Run pm health diagnostics.",
128
+ inputSchema: objectSchema({ options: { type: "object" } }),
129
+ },
130
+ {
131
+ name: "pm_contracts",
132
+ description: "Inspect pm command, flag, schema, and availability contracts.",
133
+ inputSchema: objectSchema({ options: { type: "object" } }),
134
+ },
135
+ {
136
+ name: "pm_guide",
137
+ description: "Read progressive-disclosure pm guide topics.",
138
+ inputSchema: objectSchema({ options: { type: "object" } }),
139
+ },
140
+ ];
141
+ function asRecord(value) {
142
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? { ...value } : {};
143
+ }
144
+ function readString(args, key) {
145
+ const value = args[key];
146
+ return typeof value === "string" && value.trim().length > 0 ? value : undefined;
147
+ }
148
+ function readRequiredString(args, key) {
149
+ const value = readString(args, key);
150
+ if (!value) {
151
+ throw new PmCliError(`Missing required argument: ${key}`, 64);
152
+ }
153
+ return value;
154
+ }
155
+ function globalOptions(args) {
156
+ return {
157
+ json: true,
158
+ quiet: true,
159
+ path: readString(args, "path"),
160
+ noPager: true,
161
+ };
162
+ }
163
+ function optionsWithAuthor(args) {
164
+ const options = asRecord(args.options);
165
+ const author = readString(args, "author");
166
+ return author && options.author === undefined ? { ...options, author } : options;
167
+ }
168
+ async function withCwd(cwd, run) {
169
+ if (typeof cwd !== "string" || cwd.trim().length === 0) {
170
+ return run();
171
+ }
172
+ const previous = process.cwd();
173
+ process.chdir(cwd);
174
+ try {
175
+ return await run();
176
+ }
177
+ finally {
178
+ process.chdir(previous);
179
+ }
180
+ }
181
+ async function runAction(args) {
182
+ const action = readRequiredString(args, "action");
183
+ const global = globalOptions(args);
184
+ const options = optionsWithAuthor(args);
185
+ const id = readString(args, "id");
186
+ const force = args.force === true;
187
+ switch (action) {
188
+ case "init":
189
+ return runInit(readString(args, "prefix"), global, options);
190
+ case "context":
191
+ return runContext(options, global);
192
+ case "list":
193
+ return runList(readString(args, "status"), options, global);
194
+ case "get":
195
+ return runGet(id ?? readRequiredString(options, "id"), global);
196
+ case "search":
197
+ return runSearch(readRequiredString(args, "query"), options, global);
198
+ case "create":
199
+ return runCreate(options, global);
200
+ case "update":
201
+ return runUpdate(id ?? readRequiredString(options, "id"), options, global);
202
+ case "claim":
203
+ return runClaim(id ?? readRequiredString(options, "id"), force, global, options);
204
+ case "release":
205
+ return runRelease(id ?? readRequiredString(options, "id"), force, global, options);
206
+ case "close":
207
+ return runClose(id ?? readRequiredString(options, "id"), readRequiredString(args, "reason"), options, global);
208
+ case "comments":
209
+ return runComments(id ?? readRequiredString(options, "id"), options, global);
210
+ case "notes":
211
+ return runNotes(id ?? readRequiredString(options, "id"), options, global);
212
+ case "learnings":
213
+ return runLearnings(id ?? readRequiredString(options, "id"), options, global);
214
+ case "files":
215
+ return runFiles(id ?? readRequiredString(options, "id"), options, global);
216
+ case "docs":
217
+ return runDocs(id ?? readRequiredString(options, "id"), options, global);
218
+ case "test":
219
+ return runTest(id ?? readRequiredString(options, "id"), options, global);
220
+ case "test-all":
221
+ return runTestAll(options, global);
222
+ case "validate":
223
+ return runValidate(options, global);
224
+ case "health":
225
+ return runHealth(global, options);
226
+ case "contracts":
227
+ return runContracts(options, global);
228
+ case "completion":
229
+ return runCompletion(readRequiredString(args, "shell"), Array.isArray(options.itemTypes) ? options.itemTypes.map(String) : undefined, Array.isArray(options.tags) ? options.tags.map(String) : undefined, options.eagerTags === true, asRecord(options.runtime));
230
+ case "config":
231
+ return runConfig(readString(args, "scope") ?? readString(options, "scope") ?? "project", readString(args, "configAction") ?? readRequiredString(options, "action"), readString(args, "key") ?? readString(options, "key"), options, global);
232
+ case "calendar":
233
+ return runCalendar(options, global);
234
+ case "activity":
235
+ return runActivity(options, global);
236
+ case "aggregate":
237
+ return runAggregate(options, global);
238
+ case "dedupe-audit":
239
+ return runDedupeAudit(options, global);
240
+ case "normalize":
241
+ return runNormalize(options, global);
242
+ case "reindex":
243
+ return runReindex(options, global);
244
+ case "extension":
245
+ return runExtension(readString(args, "target") ?? readString(options, "target"), options, global);
246
+ case "delete":
247
+ return runDelete(id ?? readRequiredString(options, "id"), options, global);
248
+ case "deps":
249
+ return runDeps(id ?? readRequiredString(options, "id"), options, global);
250
+ case "files-discover":
251
+ return runFilesDiscover(id ?? readRequiredString(options, "id"), options, global);
252
+ case "history":
253
+ return runHistory(id ?? readRequiredString(options, "id"), options, global);
254
+ case "stats":
255
+ return runStats(global);
256
+ case "append":
257
+ return runAppend(id ?? readRequiredString(options, "id"), options, global);
258
+ case "update-many":
259
+ return runUpdateMany(options, global);
260
+ case "comments-audit":
261
+ return runCommentsAudit(options, global);
262
+ case "gc":
263
+ return runGc(global, options);
264
+ case "templates-list":
265
+ return runTemplatesList(global);
266
+ case "templates-save":
267
+ return runTemplatesSave(readRequiredString(options, "name"), options, global);
268
+ case "templates-show":
269
+ return runTemplatesShow(readRequiredString(options, "name"), global);
270
+ case "test-runs-list":
271
+ return runTestRunsList(options, global);
272
+ case "test-runs-status":
273
+ return runTestRunsStatus(readRequiredString(args, "runId"), global);
274
+ case "test-runs-logs":
275
+ return runTestRunsLogs(readRequiredString(args, "runId"), options, global);
276
+ case "test-runs-stop":
277
+ return runTestRunsStop(readRequiredString(args, "runId"), options, global);
278
+ case "test-runs-resume":
279
+ return runTestRunsResume(readRequiredString(args, "runId"), options, global);
280
+ case "guide":
281
+ return runGuide(options, global);
282
+ default:
283
+ throw new PmCliError(`Unsupported native pm action: ${action}`, 64);
284
+ }
285
+ }
286
+ const HANDLERS = {
287
+ pm_run: (args) => runAction(args),
288
+ pm_context: (args) => runAction({ ...args, action: "context" }),
289
+ pm_search: (args) => runAction({ ...args, action: "search" }),
290
+ pm_list: (args) => runAction({ ...args, action: "list" }),
291
+ pm_get: (args) => runAction({ ...args, action: "get" }),
292
+ pm_create: (args) => runAction({ ...args, action: "create" }),
293
+ pm_update: (args) => runAction({ ...args, action: "update" }),
294
+ pm_claim: (args) => runAction({ ...args, action: "claim" }),
295
+ pm_release: (args) => runAction({ ...args, action: "release" }),
296
+ pm_close: (args) => runAction({ ...args, action: "close" }),
297
+ pm_comments: (args) => runAction({ ...args, action: "comments" }),
298
+ pm_files: (args) => runAction({ ...args, action: "files" }),
299
+ pm_docs: (args) => runAction({ ...args, action: "docs" }),
300
+ pm_test: (args) => runAction({ ...args, action: "test" }),
301
+ pm_validate: (args) => runAction({ ...args, action: "validate" }),
302
+ pm_health: (args) => runAction({ ...args, action: "health" }),
303
+ pm_contracts: (args) => runAction({ ...args, action: "contracts" }),
304
+ pm_guide: (args) => runAction({ ...args, action: "guide" }),
305
+ };
306
+ function resultContent(result) {
307
+ return {
308
+ content: [
309
+ {
310
+ type: "text",
311
+ text: JSON.stringify(result, null, 2),
312
+ },
313
+ ],
314
+ structuredContent: { result },
315
+ };
316
+ }
317
+ function errorContent(error) {
318
+ const code = error instanceof PmCliError ? error.exitCode : 1;
319
+ const message = error instanceof Error ? error.message : String(error);
320
+ return {
321
+ isError: true,
322
+ content: [
323
+ {
324
+ type: "text",
325
+ text: JSON.stringify({ error: message, code }, null, 2),
326
+ },
327
+ ],
328
+ structuredContent: { error: message, code },
329
+ };
330
+ }
331
+ async function handleRequest(request) {
332
+ if (!request.id && request.method?.startsWith("notifications/")) {
333
+ return undefined;
334
+ }
335
+ if (request.method === "initialize") {
336
+ return {
337
+ protocolVersion: "2025-06-18",
338
+ capabilities: { tools: {} },
339
+ serverInfo: { name: "pm-cli-native", version: "1.0.0" },
340
+ instructions: "You have access to native pm CLI tools for git-based project management. " +
341
+ "Use pm_context or pm_search before creating new work. " +
342
+ "Prefer narrow tools (pm_context, pm_list, pm_get, pm_search, pm_create, pm_update, pm_claim, pm_release, pm_close, pm_comments, pm_files, pm_docs, pm_test, pm_validate, pm_health, pm_contracts, pm_guide) over pm_run when they cover the operation. " +
343
+ "Use pm_run with an explicit action for calendar, activity, aggregate, dedupe-audit, normalize, reindex, history, stats, append, notes, learnings, test-all, gc, and template operations. " +
344
+ "Set author to 'claude-code-agent' on all mutations. " +
345
+ "Do not pass path during real repository tracking — only pass path for sandbox or test runs.",
346
+ };
347
+ }
348
+ if (request.method === "tools/list") {
349
+ return { tools: TOOLS };
350
+ }
351
+ if (request.method === "tools/call") {
352
+ const params = asRecord(request.params);
353
+ const name = readRequiredString(params, "name");
354
+ const handler = HANDLERS[name];
355
+ if (!handler) {
356
+ throw new PmCliError(`Unknown pm MCP tool: ${name}`, 64);
357
+ }
358
+ const args = asRecord(params.arguments);
359
+ const result = await withCwd(args.cwd, () => handler(args));
360
+ return resultContent(result);
361
+ }
362
+ throw new PmCliError(`Unsupported MCP method: ${request.method ?? "(missing)"}`, 64);
363
+ }
364
+ function writeResponse(id, payload) {
365
+ process.stdout.write(`${JSON.stringify({ jsonrpc: "2.0", id, result: payload })}\n`);
366
+ }
367
+ function writeError(id, error) {
368
+ const code = error instanceof PmCliError ? error.exitCode : -32603;
369
+ const message = error instanceof Error ? error.message : String(error);
370
+ process.stdout.write(`${JSON.stringify({ jsonrpc: "2.0", id, error: { code, message } })}\n`);
371
+ }
372
+ export function startMcpServer() {
373
+ const rl = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
374
+ rl.on("line", (line) => {
375
+ void (async () => {
376
+ if (line.trim().length === 0) {
377
+ return;
378
+ }
379
+ let request;
380
+ try {
381
+ request = JSON.parse(line);
382
+ }
383
+ catch (error) {
384
+ writeError(null, error);
385
+ return;
386
+ }
387
+ try {
388
+ const result = await handleRequest(request);
389
+ if (result !== undefined) {
390
+ writeResponse(request.id, result);
391
+ }
392
+ }
393
+ catch (error) {
394
+ if (request.method === "tools/call") {
395
+ writeResponse(request.id, errorContent(error));
396
+ }
397
+ else {
398
+ writeError(request.id, error);
399
+ }
400
+ }
401
+ })();
402
+ });
403
+ }
404
+ startMcpServer();
405
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"/","sources":["mcp/server.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport readline from \"node:readline\";\nimport type { GlobalOptions } from \"../core/shared/command-types.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport {\n runActivity,\n runAggregate,\n runAppend,\n runCalendar,\n runClaim,\n runClose,\n runComments,\n runCommentsAudit,\n runContracts,\n runContext,\n runCreate,\n runCompletion,\n runConfig,\n runDelete,\n runDedupeAudit,\n runDeps,\n runDocs,\n runExtension,\n runFiles,\n runFilesDiscover,\n runGc,\n runGet,\n runGuide,\n runHealth,\n runHistory,\n runInit,\n runLearnings,\n runList,\n runNormalize,\n runNotes,\n runReindex,\n runRelease,\n runSearch,\n runStats,\n runTemplatesList,\n runTemplatesSave,\n runTemplatesShow,\n runTest,\n runTestAll,\n runTestRunsList,\n runTestRunsLogs,\n runTestRunsResume,\n runTestRunsStatus,\n runTestRunsStop,\n runUpdate,\n runUpdateMany,\n runValidate,\n} from \"../cli/commands/index.js\";\n\ninterface JsonRpcRequest {\n jsonrpc?: string;\n id?: string | number | null;\n method?: string;\n params?: Record<string, unknown>;\n}\n\ninterface ToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\ntype ToolHandler = (args: Record<string, unknown>) => Promise<unknown>;\n\nconst TOOL_SCHEMA_BASE = {\n type: \"object\",\n properties: {\n cwd: {\n type: \"string\",\n description: \"Workspace directory to run the native pm operation in. Defaults to the MCP server process cwd.\",\n },\n path: {\n type: \"string\",\n description: \"Optional pm data root, equivalent to PM_PATH/global --path. Leave unset for real repository tracking.\",\n },\n author: {\n type: \"string\",\n description: \"Mutation author. Defaults to PM_AUTHOR or pm settings when supported by the underlying operation.\",\n },\n },\n additionalProperties: true,\n} as const;\n\nconst idSchema = {\n type: \"string\",\n description: \"pm item id, for example pm-abc1.\",\n};\n\nfunction objectSchema(properties: Record<string, unknown>, required: string[] = []): Record<string, unknown> {\n return {\n ...TOOL_SCHEMA_BASE,\n properties: {\n ...TOOL_SCHEMA_BASE.properties,\n ...properties,\n },\n required,\n };\n}\n\nconst TOOLS: ToolDefinition[] = [\n {\n name: \"pm_run\",\n description:\n \"Run any supported pm operation natively through the pm library. Use this for commands not covered by narrower pm_* tools.\",\n inputSchema: objectSchema(\n {\n action: {\n type: \"string\",\n description:\n \"Operation name: init, context, list, get, search, create, update, delete, claim, release, close, comments, notes, learnings, files, files-discover, docs, deps, test, test-all, validate, health, contracts, completion, config, calendar, activity, aggregate, dedupe-audit, normalize, reindex, extension, history, stats, append, update-many, comments-audit, gc, templates-list, templates-save, templates-show, test-runs-list, test-runs-status, test-runs-logs, test-runs-stop, test-runs-resume.\",\n },\n id: idSchema,\n query: { type: \"string\", description: \"Search query for action=search.\" },\n reason: { type: \"string\", description: \"Close reason for action=close.\" },\n force: { type: \"boolean\", description: \"Force ownership/terminal-state override when supported.\" },\n options: { type: \"object\", description: \"Underlying pm command options using camelCase keys.\" },\n },\n [\"action\"],\n ),\n },\n {\n name: \"pm_context\",\n description: \"Return the agent-oriented project context snapshot.\",\n inputSchema: objectSchema({ options: { type: \"object\" } }),\n },\n {\n name: \"pm_search\",\n description: \"Search pm items with keyword, semantic, or hybrid search.\",\n inputSchema: objectSchema({ query: { type: \"string\" }, options: { type: \"object\" } }, [\"query\"]),\n },\n {\n name: \"pm_list\",\n description: \"List pm items with status/type/tag/priority filters.\",\n inputSchema: objectSchema({ options: { type: \"object\" } }),\n },\n {\n name: \"pm_get\",\n description: \"Read one pm item with body, linked files/tests/docs, and claim state.\",\n inputSchema: objectSchema({ id: idSchema }, [\"id\"]),\n },\n {\n name: \"pm_create\",\n description: \"Create a pm item natively and write pm history.\",\n inputSchema: objectSchema({ options: { type: \"object\", description: \"Create options. title and description are required.\" } }, [\n \"options\",\n ]),\n },\n {\n name: \"pm_update\",\n description: \"Update pm item metadata/body/dependencies/log seeds natively.\",\n inputSchema: objectSchema({ id: idSchema, options: { type: \"object\" } }, [\"id\", \"options\"]),\n },\n {\n name: \"pm_claim\",\n description: \"Claim a pm item.\",\n inputSchema: objectSchema({ id: idSchema, force: { type: \"boolean\" }, options: { type: \"object\" } }, [\"id\"]),\n },\n {\n name: \"pm_release\",\n description: \"Release a pm item claim.\",\n inputSchema: objectSchema({ id: idSchema, force: { type: \"boolean\" }, options: { type: \"object\" } }, [\"id\"]),\n },\n {\n name: \"pm_close\",\n description: \"Close a pm item with a reason and optional close validation.\",\n inputSchema: objectSchema({ id: idSchema, reason: { type: \"string\" }, options: { type: \"object\" } }, [\"id\", \"reason\"]),\n },\n {\n name: \"pm_comments\",\n description: \"List or add comments on a pm item. Use options.add to append.\",\n inputSchema: objectSchema({ id: idSchema, options: { type: \"object\" } }, [\"id\"]),\n },\n {\n name: \"pm_files\",\n description: \"List, add, remove, audit, or validate linked files for a pm item.\",\n inputSchema: objectSchema({ id: idSchema, options: { type: \"object\" } }, [\"id\"]),\n },\n {\n name: \"pm_docs\",\n description: \"List, add, or remove linked docs for a pm item.\",\n inputSchema: objectSchema({ id: idSchema, options: { type: \"object\" } }, [\"id\"]),\n },\n {\n name: \"pm_test\",\n description: \"List, add, remove, or run linked tests for a pm item.\",\n inputSchema: objectSchema({ id: idSchema, options: { type: \"object\" } }, [\"id\"]),\n },\n {\n name: \"pm_validate\",\n description: \"Run pm validation checks.\",\n inputSchema: objectSchema({ options: { type: \"object\" } }),\n },\n {\n name: \"pm_health\",\n description: \"Run pm health diagnostics.\",\n inputSchema: objectSchema({ options: { type: \"object\" } }),\n },\n {\n name: \"pm_contracts\",\n description: \"Inspect pm command, flag, schema, and availability contracts.\",\n inputSchema: objectSchema({ options: { type: \"object\" } }),\n },\n {\n name: \"pm_guide\",\n description: \"Read progressive-disclosure pm guide topics.\",\n inputSchema: objectSchema({ options: { type: \"object\" } }),\n },\n];\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? { ...value } as Record<string, unknown> : {};\n}\n\nfunction readString(args: Record<string, unknown>, key: string): string | undefined {\n const value = args[key];\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n}\n\nfunction readRequiredString(args: Record<string, unknown>, key: string): string {\n const value = readString(args, key);\n if (!value) {\n throw new PmCliError(`Missing required argument: ${key}`, 64);\n }\n return value;\n}\n\nfunction globalOptions(args: Record<string, unknown>): GlobalOptions {\n return {\n json: true,\n quiet: true,\n path: readString(args, \"path\"),\n noPager: true,\n };\n}\n\nfunction optionsWithAuthor(args: Record<string, unknown>): Record<string, unknown> {\n const options = asRecord(args.options);\n const author = readString(args, \"author\");\n return author && options.author === undefined ? { ...options, author } : options;\n}\n\nasync function withCwd<T>(cwd: unknown, run: () => Promise<T>): Promise<T> {\n if (typeof cwd !== \"string\" || cwd.trim().length === 0) {\n return run();\n }\n const previous = process.cwd();\n process.chdir(cwd);\n try {\n return await run();\n } finally {\n process.chdir(previous);\n }\n}\n\nasync function runAction(args: Record<string, unknown>): Promise<unknown> {\n const action = readRequiredString(args, \"action\");\n const global = globalOptions(args);\n const options = optionsWithAuthor(args);\n const id = readString(args, \"id\");\n const force = args.force === true;\n\n switch (action) {\n case \"init\":\n return runInit(readString(args, \"prefix\"), global, options);\n case \"context\":\n return runContext(options, global);\n case \"list\":\n return runList(readString(args, \"status\"), options, global);\n case \"get\":\n return runGet(id ?? readRequiredString(options, \"id\"), global);\n case \"search\":\n return runSearch(readRequiredString(args, \"query\"), options, global);\n case \"create\":\n return runCreate(options, global);\n case \"update\":\n return runUpdate(id ?? readRequiredString(options, \"id\"), options, global);\n case \"claim\":\n return runClaim(id ?? readRequiredString(options, \"id\"), force, global, options);\n case \"release\":\n return runRelease(id ?? readRequiredString(options, \"id\"), force, global, options);\n case \"close\":\n return runClose(id ?? readRequiredString(options, \"id\"), readRequiredString(args, \"reason\"), options, global);\n case \"comments\":\n return runComments(id ?? readRequiredString(options, \"id\"), options, global);\n case \"notes\":\n return runNotes(id ?? readRequiredString(options, \"id\"), options, global);\n case \"learnings\":\n return runLearnings(id ?? readRequiredString(options, \"id\"), options, global);\n case \"files\":\n return runFiles(id ?? readRequiredString(options, \"id\"), options, global);\n case \"docs\":\n return runDocs(id ?? readRequiredString(options, \"id\"), options, global);\n case \"test\":\n return runTest(id ?? readRequiredString(options, \"id\"), options, global);\n case \"test-all\":\n return runTestAll(options, global);\n case \"validate\":\n return runValidate(options, global);\n case \"health\":\n return runHealth(global, options);\n case \"contracts\":\n return runContracts(options, global);\n case \"completion\":\n return runCompletion(\n readRequiredString(args, \"shell\"),\n Array.isArray(options.itemTypes) ? options.itemTypes.map(String) : undefined,\n Array.isArray(options.tags) ? options.tags.map(String) : undefined,\n options.eagerTags === true,\n asRecord(options.runtime) as never,\n );\n case \"config\":\n return runConfig(\n readString(args, \"scope\") ?? readString(options, \"scope\") ?? \"project\",\n readString(args, \"configAction\") ?? readRequiredString(options, \"action\"),\n readString(args, \"key\") ?? readString(options, \"key\"),\n options,\n global,\n );\n case \"calendar\":\n return runCalendar(options, global);\n case \"activity\":\n return runActivity(options, global);\n case \"aggregate\":\n return runAggregate(options, global);\n case \"dedupe-audit\":\n return runDedupeAudit(options, global);\n case \"normalize\":\n return runNormalize(options as never, global);\n case \"reindex\":\n return runReindex(options, global);\n case \"extension\":\n return runExtension(readString(args, \"target\") ?? readString(options, \"target\"), options, global);\n case \"delete\":\n return runDelete(id ?? readRequiredString(options, \"id\"), options, global);\n case \"deps\":\n return runDeps(id ?? readRequiredString(options, \"id\"), options, global);\n case \"files-discover\":\n return runFilesDiscover(id ?? readRequiredString(options, \"id\"), options, global);\n case \"history\":\n return runHistory(id ?? readRequiredString(options, \"id\"), options, global);\n case \"stats\":\n return runStats(global);\n case \"append\":\n return runAppend(id ?? readRequiredString(options, \"id\"), options as never, global);\n case \"update-many\":\n return runUpdateMany(options as never, global);\n case \"comments-audit\":\n return runCommentsAudit(options, global);\n case \"gc\":\n return runGc(global, options);\n case \"templates-list\":\n return runTemplatesList(global);\n case \"templates-save\":\n return runTemplatesSave(readRequiredString(options, \"name\"), options, global);\n case \"templates-show\":\n return runTemplatesShow(readRequiredString(options, \"name\"), global);\n case \"test-runs-list\":\n return runTestRunsList(options, global);\n case \"test-runs-status\":\n return runTestRunsStatus(readRequiredString(args, \"runId\"), global);\n case \"test-runs-logs\":\n return runTestRunsLogs(readRequiredString(args, \"runId\"), options, global);\n case \"test-runs-stop\":\n return runTestRunsStop(readRequiredString(args, \"runId\"), options, global);\n case \"test-runs-resume\":\n return runTestRunsResume(readRequiredString(args, \"runId\"), options, global);\n case \"guide\":\n return runGuide(options, global);\n default:\n throw new PmCliError(`Unsupported native pm action: ${action}`, 64);\n }\n}\n\nconst HANDLERS: Record<string, ToolHandler> = {\n pm_run: (args) => runAction(args),\n pm_context: (args) => runAction({ ...args, action: \"context\" }),\n pm_search: (args) => runAction({ ...args, action: \"search\" }),\n pm_list: (args) => runAction({ ...args, action: \"list\" }),\n pm_get: (args) => runAction({ ...args, action: \"get\" }),\n pm_create: (args) => runAction({ ...args, action: \"create\" }),\n pm_update: (args) => runAction({ ...args, action: \"update\" }),\n pm_claim: (args) => runAction({ ...args, action: \"claim\" }),\n pm_release: (args) => runAction({ ...args, action: \"release\" }),\n pm_close: (args) => runAction({ ...args, action: \"close\" }),\n pm_comments: (args) => runAction({ ...args, action: \"comments\" }),\n pm_files: (args) => runAction({ ...args, action: \"files\" }),\n pm_docs: (args) => runAction({ ...args, action: \"docs\" }),\n pm_test: (args) => runAction({ ...args, action: \"test\" }),\n pm_validate: (args) => runAction({ ...args, action: \"validate\" }),\n pm_health: (args) => runAction({ ...args, action: \"health\" }),\n pm_contracts: (args) => runAction({ ...args, action: \"contracts\" }),\n pm_guide: (args) => runAction({ ...args, action: \"guide\" }),\n};\n\nfunction resultContent(result: unknown): Record<string, unknown> {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: { result },\n };\n}\n\nfunction errorContent(error: unknown): Record<string, unknown> {\n const code = error instanceof PmCliError ? error.exitCode : 1;\n const message = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: message, code }, null, 2),\n },\n ],\n structuredContent: { error: message, code },\n };\n}\n\nasync function handleRequest(request: JsonRpcRequest): Promise<Record<string, unknown> | undefined> {\n if (!request.id && request.method?.startsWith(\"notifications/\")) {\n return undefined;\n }\n if (request.method === \"initialize\") {\n return {\n protocolVersion: \"2025-06-18\",\n capabilities: { tools: {} },\n serverInfo: { name: \"pm-cli-native\", version: \"1.0.0\" },\n instructions:\n \"You have access to native pm CLI tools for git-based project management. \" +\n \"Use pm_context or pm_search before creating new work. \" +\n \"Prefer narrow tools (pm_context, pm_list, pm_get, pm_search, pm_create, pm_update, pm_claim, pm_release, pm_close, pm_comments, pm_files, pm_docs, pm_test, pm_validate, pm_health, pm_contracts, pm_guide) over pm_run when they cover the operation. \" +\n \"Use pm_run with an explicit action for calendar, activity, aggregate, dedupe-audit, normalize, reindex, history, stats, append, notes, learnings, test-all, gc, and template operations. \" +\n \"Set author to 'claude-code-agent' on all mutations. \" +\n \"Do not pass path during real repository tracking — only pass path for sandbox or test runs.\",\n };\n }\n if (request.method === \"tools/list\") {\n return { tools: TOOLS };\n }\n if (request.method === \"tools/call\") {\n const params = asRecord(request.params);\n const name = readRequiredString(params, \"name\");\n const handler = HANDLERS[name];\n if (!handler) {\n throw new PmCliError(`Unknown pm MCP tool: ${name}`, 64);\n }\n const args = asRecord(params.arguments);\n const result = await withCwd(args.cwd, () => handler(args));\n return resultContent(result);\n }\n throw new PmCliError(`Unsupported MCP method: ${request.method ?? \"(missing)\"}`, 64);\n}\n\nfunction writeResponse(id: JsonRpcRequest[\"id\"], payload: Record<string, unknown>): void {\n process.stdout.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, result: payload })}\\n`);\n}\n\nfunction writeError(id: JsonRpcRequest[\"id\"], error: unknown): void {\n const code = error instanceof PmCliError ? error.exitCode : -32603;\n const message = error instanceof Error ? error.message : String(error);\n process.stdout.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, error: { code, message } })}\\n`);\n}\n\nexport function startMcpServer(): void {\n const rl = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });\n rl.on(\"line\", (line) => {\n void (async () => {\n if (line.trim().length === 0) {\n return;\n }\n let request: JsonRpcRequest;\n try {\n request = JSON.parse(line) as JsonRpcRequest;\n } catch (error) {\n writeError(null, error);\n return;\n }\n try {\n const result = await handleRequest(request);\n if (result !== undefined) {\n writeResponse(request.id, result);\n }\n } catch (error) {\n if (request.method === \"tools/call\") {\n writeResponse(request.id, errorContent(error));\n } else {\n writeError(request.id, error);\n }\n }\n })();\n });\n}\n\nstartMcpServer();\n"]}
@@ -0,0 +1,5 @@
1
+ import type { GlobalOptions } from "../core/shared/command-types.js";
2
+ export type NativePmArgs = Record<string, unknown>;
3
+ export declare function nativeGlobalOptions(args: NativePmArgs): GlobalOptions;
4
+ export declare function nativeCommandOptions(args: NativePmArgs): Record<string, unknown>;
5
+ export declare function runNativePmAction(args: NativePmArgs): Promise<unknown>;