@ilya-lesikov/pi-pi 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.
Files changed (271) hide show
  1. package/3p/pi-ask-user/index.ts +1835 -0
  2. package/3p/pi-ask-user/package.json +50 -0
  3. package/3p/pi-ask-user/single-select-layout.ts +203 -0
  4. package/3p/pi-lsp/extensions/lsp/client.ts +542 -0
  5. package/3p/pi-lsp/extensions/lsp/config.ts +135 -0
  6. package/3p/pi-lsp/extensions/lsp/effects/command.ts +42 -0
  7. package/3p/pi-lsp/extensions/lsp/effects/filesystem.ts +50 -0
  8. package/3p/pi-lsp/extensions/lsp/effects/runtime.ts +21 -0
  9. package/3p/pi-lsp/extensions/lsp/errors.ts +113 -0
  10. package/3p/pi-lsp/extensions/lsp/formatting.ts +315 -0
  11. package/3p/pi-lsp/extensions/lsp/index.ts +231 -0
  12. package/3p/pi-lsp/extensions/lsp/protocol.ts +209 -0
  13. package/3p/pi-lsp/extensions/lsp/retry.ts +39 -0
  14. package/3p/pi-lsp/extensions/lsp/tools/programs.ts +293 -0
  15. package/3p/pi-lsp/extensions/lsp/tools.ts +89 -0
  16. package/3p/pi-lsp/extensions/lsp/types.ts +243 -0
  17. package/3p/pi-lsp/package.json +54 -0
  18. package/3p/pi-plannotator/AGENTS.md +583 -0
  19. package/3p/pi-plannotator/apps/pi-extension/README.md +228 -0
  20. package/3p/pi-plannotator/apps/pi-extension/assistant-message.ts +128 -0
  21. package/3p/pi-plannotator/apps/pi-extension/config.test.ts +166 -0
  22. package/3p/pi-plannotator/apps/pi-extension/config.ts +318 -0
  23. package/3p/pi-plannotator/apps/pi-extension/current-pi-session.ts +147 -0
  24. package/3p/pi-plannotator/apps/pi-extension/index.ts +1279 -0
  25. package/3p/pi-plannotator/apps/pi-extension/package.json +56 -0
  26. package/3p/pi-plannotator/apps/pi-extension/plannotator-browser.test.ts +13 -0
  27. package/3p/pi-plannotator/apps/pi-extension/plannotator-browser.ts +616 -0
  28. package/3p/pi-plannotator/apps/pi-extension/plannotator-events.ts +342 -0
  29. package/3p/pi-plannotator/apps/pi-extension/plannotator.json +12 -0
  30. package/3p/pi-plannotator/apps/pi-extension/server/agent-jobs.ts +515 -0
  31. package/3p/pi-plannotator/apps/pi-extension/server/ai-runtime.ts +169 -0
  32. package/3p/pi-plannotator/apps/pi-extension/server/annotations.ts +85 -0
  33. package/3p/pi-plannotator/apps/pi-extension/server/external-annotations.ts +189 -0
  34. package/3p/pi-plannotator/apps/pi-extension/server/handlers.ts +210 -0
  35. package/3p/pi-plannotator/apps/pi-extension/server/helpers.ts +78 -0
  36. package/3p/pi-plannotator/apps/pi-extension/server/ide.ts +46 -0
  37. package/3p/pi-plannotator/apps/pi-extension/server/integrations.ts +195 -0
  38. package/3p/pi-plannotator/apps/pi-extension/server/network.test.ts +158 -0
  39. package/3p/pi-plannotator/apps/pi-extension/server/network.ts +268 -0
  40. package/3p/pi-plannotator/apps/pi-extension/server/pr.ts +126 -0
  41. package/3p/pi-plannotator/apps/pi-extension/server/project.ts +64 -0
  42. package/3p/pi-plannotator/apps/pi-extension/server/reference.ts +362 -0
  43. package/3p/pi-plannotator/apps/pi-extension/server/serverAnnotate.ts +199 -0
  44. package/3p/pi-plannotator/apps/pi-extension/server/serverPlan.ts +505 -0
  45. package/3p/pi-plannotator/apps/pi-extension/server/serverReview.ts +1229 -0
  46. package/3p/pi-plannotator/apps/pi-extension/server/vcs.ts +121 -0
  47. package/3p/pi-plannotator/apps/pi-extension/server.test.ts +966 -0
  48. package/3p/pi-plannotator/apps/pi-extension/server.ts +44 -0
  49. package/3p/pi-plannotator/apps/pi-extension/tool-scope.test.ts +88 -0
  50. package/3p/pi-plannotator/apps/pi-extension/tool-scope.ts +39 -0
  51. package/3p/pi-plannotator/apps/pi-extension/tsconfig.json +16 -0
  52. package/3p/pi-plannotator/apps/pi-extension/vendor.sh +48 -0
  53. package/3p/pi-plannotator/package.json +53 -0
  54. package/3p/pi-plannotator/packages/ai/ai.test.ts +1407 -0
  55. package/3p/pi-plannotator/packages/ai/base-session.ts +94 -0
  56. package/3p/pi-plannotator/packages/ai/context.ts +250 -0
  57. package/3p/pi-plannotator/packages/ai/endpoints.ts +326 -0
  58. package/3p/pi-plannotator/packages/ai/index.ts +105 -0
  59. package/3p/pi-plannotator/packages/ai/package.json +21 -0
  60. package/3p/pi-plannotator/packages/ai/provider.ts +103 -0
  61. package/3p/pi-plannotator/packages/ai/providers/claude-agent-sdk.ts +447 -0
  62. package/3p/pi-plannotator/packages/ai/providers/codex-sdk.ts +430 -0
  63. package/3p/pi-plannotator/packages/ai/providers/command-path.ts +115 -0
  64. package/3p/pi-plannotator/packages/ai/providers/opencode-sdk.ts +546 -0
  65. package/3p/pi-plannotator/packages/ai/providers/pi-events.ts +110 -0
  66. package/3p/pi-plannotator/packages/ai/providers/pi-sdk-node.ts +425 -0
  67. package/3p/pi-plannotator/packages/ai/providers/pi-sdk.ts +469 -0
  68. package/3p/pi-plannotator/packages/ai/session-manager.ts +195 -0
  69. package/3p/pi-plannotator/packages/ai/tsconfig.json +15 -0
  70. package/3p/pi-plannotator/packages/ai/types.ts +379 -0
  71. package/3p/pi-plannotator/packages/server/agent-jobs.ts +538 -0
  72. package/3p/pi-plannotator/packages/server/agent-review-message.test.ts +135 -0
  73. package/3p/pi-plannotator/packages/server/agent-review-message.ts +243 -0
  74. package/3p/pi-plannotator/packages/server/ai-runtime.ts +108 -0
  75. package/3p/pi-plannotator/packages/server/annotate.ts +401 -0
  76. package/3p/pi-plannotator/packages/server/browser.test.ts +87 -0
  77. package/3p/pi-plannotator/packages/server/browser.ts +245 -0
  78. package/3p/pi-plannotator/packages/server/claude-review.ts +352 -0
  79. package/3p/pi-plannotator/packages/server/code-nav.ts +73 -0
  80. package/3p/pi-plannotator/packages/server/codex-review-schema.json +41 -0
  81. package/3p/pi-plannotator/packages/server/codex-review.ts +330 -0
  82. package/3p/pi-plannotator/packages/server/config.ts +8 -0
  83. package/3p/pi-plannotator/packages/server/draft.ts +1 -0
  84. package/3p/pi-plannotator/packages/server/editor-annotations.ts +76 -0
  85. package/3p/pi-plannotator/packages/server/external-annotations.test.ts +18 -0
  86. package/3p/pi-plannotator/packages/server/external-annotations.ts +207 -0
  87. package/3p/pi-plannotator/packages/server/git.ts +141 -0
  88. package/3p/pi-plannotator/packages/server/goal-setup.test.ts +55 -0
  89. package/3p/pi-plannotator/packages/server/goal-setup.ts +248 -0
  90. package/3p/pi-plannotator/packages/server/ide.ts +43 -0
  91. package/3p/pi-plannotator/packages/server/image.test.ts +63 -0
  92. package/3p/pi-plannotator/packages/server/image.ts +66 -0
  93. package/3p/pi-plannotator/packages/server/index.ts +648 -0
  94. package/3p/pi-plannotator/packages/server/integrations.test.ts +172 -0
  95. package/3p/pi-plannotator/packages/server/integrations.ts +214 -0
  96. package/3p/pi-plannotator/packages/server/jj.test.ts +69 -0
  97. package/3p/pi-plannotator/packages/server/jj.ts +86 -0
  98. package/3p/pi-plannotator/packages/server/p4.ts +417 -0
  99. package/3p/pi-plannotator/packages/server/package.json +40 -0
  100. package/3p/pi-plannotator/packages/server/path-utils.ts +18 -0
  101. package/3p/pi-plannotator/packages/server/pr.ts +146 -0
  102. package/3p/pi-plannotator/packages/server/project.test.ts +115 -0
  103. package/3p/pi-plannotator/packages/server/project.ts +45 -0
  104. package/3p/pi-plannotator/packages/server/reference-handlers.ts +404 -0
  105. package/3p/pi-plannotator/packages/server/remote.test.ts +150 -0
  106. package/3p/pi-plannotator/packages/server/remote.ts +74 -0
  107. package/3p/pi-plannotator/packages/server/repo.ts +80 -0
  108. package/3p/pi-plannotator/packages/server/resolve-file.test.ts +310 -0
  109. package/3p/pi-plannotator/packages/server/review-workspace.test.ts +1032 -0
  110. package/3p/pi-plannotator/packages/server/review-workspace.ts +48 -0
  111. package/3p/pi-plannotator/packages/server/review.ts +1318 -0
  112. package/3p/pi-plannotator/packages/server/sessions.ts +111 -0
  113. package/3p/pi-plannotator/packages/server/share-url.ts +53 -0
  114. package/3p/pi-plannotator/packages/server/shared-handlers.test.ts +43 -0
  115. package/3p/pi-plannotator/packages/server/shared-handlers.ts +177 -0
  116. package/3p/pi-plannotator/packages/server/storage.test.ts +176 -0
  117. package/3p/pi-plannotator/packages/server/storage.ts +17 -0
  118. package/3p/pi-plannotator/packages/server/tour/tour-review.test.ts +146 -0
  119. package/3p/pi-plannotator/packages/server/tour/tour-review.ts +604 -0
  120. package/3p/pi-plannotator/packages/server/tsconfig.json +15 -0
  121. package/3p/pi-plannotator/packages/server/vcs.test.ts +48 -0
  122. package/3p/pi-plannotator/packages/server/vcs.ts +80 -0
  123. package/3p/pi-plannotator/packages/shared/agent-jobs.ts +132 -0
  124. package/3p/pi-plannotator/packages/shared/agents.ts +53 -0
  125. package/3p/pi-plannotator/packages/shared/annotate-args.test.ts +386 -0
  126. package/3p/pi-plannotator/packages/shared/annotate-args.ts +107 -0
  127. package/3p/pi-plannotator/packages/shared/at-reference.test.ts +99 -0
  128. package/3p/pi-plannotator/packages/shared/at-reference.ts +52 -0
  129. package/3p/pi-plannotator/packages/shared/checklist.ts +52 -0
  130. package/3p/pi-plannotator/packages/shared/code-file.test.ts +112 -0
  131. package/3p/pi-plannotator/packages/shared/code-file.ts +41 -0
  132. package/3p/pi-plannotator/packages/shared/code-nav.test.ts +515 -0
  133. package/3p/pi-plannotator/packages/shared/code-nav.ts +436 -0
  134. package/3p/pi-plannotator/packages/shared/compress.ts +51 -0
  135. package/3p/pi-plannotator/packages/shared/config.ts +262 -0
  136. package/3p/pi-plannotator/packages/shared/crypto.test.ts +172 -0
  137. package/3p/pi-plannotator/packages/shared/crypto.ts +97 -0
  138. package/3p/pi-plannotator/packages/shared/data-dir.ts +42 -0
  139. package/3p/pi-plannotator/packages/shared/diff-paths.test.ts +30 -0
  140. package/3p/pi-plannotator/packages/shared/diff-paths.ts +137 -0
  141. package/3p/pi-plannotator/packages/shared/draft.ts +64 -0
  142. package/3p/pi-plannotator/packages/shared/external-annotation.ts +397 -0
  143. package/3p/pi-plannotator/packages/shared/extract-code-paths.test.ts +59 -0
  144. package/3p/pi-plannotator/packages/shared/extract-code-paths.ts +66 -0
  145. package/3p/pi-plannotator/packages/shared/favicon.ts +5 -0
  146. package/3p/pi-plannotator/packages/shared/feedback-templates.test.ts +65 -0
  147. package/3p/pi-plannotator/packages/shared/feedback-templates.ts +29 -0
  148. package/3p/pi-plannotator/packages/shared/goal-setup.test.ts +231 -0
  149. package/3p/pi-plannotator/packages/shared/goal-setup.ts +336 -0
  150. package/3p/pi-plannotator/packages/shared/html-to-markdown.test.ts +62 -0
  151. package/3p/pi-plannotator/packages/shared/html-to-markdown.ts +32 -0
  152. package/3p/pi-plannotator/packages/shared/improvement-hooks.test.ts +135 -0
  153. package/3p/pi-plannotator/packages/shared/improvement-hooks.ts +115 -0
  154. package/3p/pi-plannotator/packages/shared/integrations-common.ts +243 -0
  155. package/3p/pi-plannotator/packages/shared/jj-core.test.ts +236 -0
  156. package/3p/pi-plannotator/packages/shared/jj-core.ts +433 -0
  157. package/3p/pi-plannotator/packages/shared/package.json +55 -0
  158. package/3p/pi-plannotator/packages/shared/pfm-reminder.test.ts +88 -0
  159. package/3p/pi-plannotator/packages/shared/pfm-reminder.ts +80 -0
  160. package/3p/pi-plannotator/packages/shared/pr-github.ts +661 -0
  161. package/3p/pi-plannotator/packages/shared/pr-gitlab.test.ts +202 -0
  162. package/3p/pi-plannotator/packages/shared/pr-gitlab.ts +620 -0
  163. package/3p/pi-plannotator/packages/shared/pr-provider.test.ts +266 -0
  164. package/3p/pi-plannotator/packages/shared/pr-provider.ts +123 -0
  165. package/3p/pi-plannotator/packages/shared/pr-stack.test.ts +104 -0
  166. package/3p/pi-plannotator/packages/shared/pr-stack.ts +194 -0
  167. package/3p/pi-plannotator/packages/shared/pr-types.ts +326 -0
  168. package/3p/pi-plannotator/packages/shared/project.ts +71 -0
  169. package/3p/pi-plannotator/packages/shared/prompts-integration.test.ts +421 -0
  170. package/3p/pi-plannotator/packages/shared/prompts.test.ts +504 -0
  171. package/3p/pi-plannotator/packages/shared/prompts.ts +247 -0
  172. package/3p/pi-plannotator/packages/shared/reference-common.ts +87 -0
  173. package/3p/pi-plannotator/packages/shared/repo.ts +71 -0
  174. package/3p/pi-plannotator/packages/shared/resolve-file.test.ts +113 -0
  175. package/3p/pi-plannotator/packages/shared/resolve-file.ts +509 -0
  176. package/3p/pi-plannotator/packages/shared/review-args.test.ts +64 -0
  177. package/3p/pi-plannotator/packages/shared/review-args.ts +85 -0
  178. package/3p/pi-plannotator/packages/shared/review-core.test.ts +286 -0
  179. package/3p/pi-plannotator/packages/shared/review-core.ts +895 -0
  180. package/3p/pi-plannotator/packages/shared/review-workspace-node.ts +230 -0
  181. package/3p/pi-plannotator/packages/shared/review-workspace.ts +436 -0
  182. package/3p/pi-plannotator/packages/shared/semantic-diff-types.ts +76 -0
  183. package/3p/pi-plannotator/packages/shared/semantic-diff.test.ts +322 -0
  184. package/3p/pi-plannotator/packages/shared/semantic-diff.ts +520 -0
  185. package/3p/pi-plannotator/packages/shared/storage.ts +378 -0
  186. package/3p/pi-plannotator/packages/shared/tour.ts +61 -0
  187. package/3p/pi-plannotator/packages/shared/tsconfig.json +15 -0
  188. package/3p/pi-plannotator/packages/shared/types.ts +29 -0
  189. package/3p/pi-plannotator/packages/shared/url-to-markdown.test.ts +177 -0
  190. package/3p/pi-plannotator/packages/shared/url-to-markdown.ts +351 -0
  191. package/3p/pi-plannotator/packages/shared/vcs-core.test.ts +332 -0
  192. package/3p/pi-plannotator/packages/shared/vcs-core.ts +482 -0
  193. package/3p/pi-plannotator/packages/shared/worktree-pool.test.ts +162 -0
  194. package/3p/pi-plannotator/packages/shared/worktree-pool.ts +103 -0
  195. package/3p/pi-plannotator/packages/shared/worktree.ts +119 -0
  196. package/3p/pi-subagents/package.json +50 -0
  197. package/3p/pi-subagents/src/agent-manager.ts +413 -0
  198. package/3p/pi-subagents/src/agent-runner.ts +502 -0
  199. package/3p/pi-subagents/src/agent-types.ts +248 -0
  200. package/3p/pi-subagents/src/context.ts +58 -0
  201. package/3p/pi-subagents/src/cross-extension-rpc.ts +135 -0
  202. package/3p/pi-subagents/src/custom-agents.ts +137 -0
  203. package/3p/pi-subagents/src/default-agents.ts +144 -0
  204. package/3p/pi-subagents/src/env.ts +33 -0
  205. package/3p/pi-subagents/src/group-join.ts +141 -0
  206. package/3p/pi-subagents/src/index.ts +1811 -0
  207. package/3p/pi-subagents/src/invocation-config.ts +40 -0
  208. package/3p/pi-subagents/src/memory.ts +165 -0
  209. package/3p/pi-subagents/src/model-resolver.ts +81 -0
  210. package/3p/pi-subagents/src/output-file.ts +77 -0
  211. package/3p/pi-subagents/src/prompts.ts +85 -0
  212. package/3p/pi-subagents/src/skill-loader.ts +79 -0
  213. package/3p/pi-subagents/src/types.ts +111 -0
  214. package/3p/pi-subagents/src/ui/agent-widget.ts +496 -0
  215. package/3p/pi-subagents/src/ui/conversation-viewer.ts +250 -0
  216. package/3p/pi-subagents/src/worktree.ts +162 -0
  217. package/3p/pi-tasks/package.json +52 -0
  218. package/3p/pi-tasks/src/auto-clear.ts +91 -0
  219. package/3p/pi-tasks/src/index.ts +1150 -0
  220. package/3p/pi-tasks/src/process-tracker.ts +140 -0
  221. package/3p/pi-tasks/src/reminder-cadence.ts +90 -0
  222. package/3p/pi-tasks/src/task-store.ts +324 -0
  223. package/3p/pi-tasks/src/tasks-config.ts +27 -0
  224. package/3p/pi-tasks/src/types.ts +40 -0
  225. package/3p/pi-tasks/src/ui/settings-menu.ts +152 -0
  226. package/3p/pi-tasks/src/ui/task-widget.ts +296 -0
  227. package/AGENTS.md +28 -0
  228. package/LICENSE +201 -0
  229. package/extensions/orchestrator/agents/brainstorm-reviewer.ts +77 -0
  230. package/extensions/orchestrator/agents/code-reviewer.ts +89 -0
  231. package/extensions/orchestrator/agents/explore.ts +33 -0
  232. package/extensions/orchestrator/agents/librarian.ts +43 -0
  233. package/extensions/orchestrator/agents/plan-reviewer.ts +75 -0
  234. package/extensions/orchestrator/agents/planner.ts +61 -0
  235. package/extensions/orchestrator/agents/registry.ts +156 -0
  236. package/extensions/orchestrator/agents/task.ts +50 -0
  237. package/extensions/orchestrator/agents/tool-routing.ts +84 -0
  238. package/extensions/orchestrator/ast-search.ts +85 -0
  239. package/extensions/orchestrator/cbm.ts +330 -0
  240. package/extensions/orchestrator/command-handlers.test.ts +163 -0
  241. package/extensions/orchestrator/command-handlers.ts +116 -0
  242. package/extensions/orchestrator/commands.test.ts +81 -0
  243. package/extensions/orchestrator/commands.ts +75 -0
  244. package/extensions/orchestrator/config.test.ts +221 -0
  245. package/extensions/orchestrator/config.ts +230 -0
  246. package/extensions/orchestrator/context.test.ts +293 -0
  247. package/extensions/orchestrator/context.ts +206 -0
  248. package/extensions/orchestrator/event-handlers.test.ts +190 -0
  249. package/extensions/orchestrator/event-handlers.ts +1416 -0
  250. package/extensions/orchestrator/exa.ts +104 -0
  251. package/extensions/orchestrator/flant-infra.ts +486 -0
  252. package/extensions/orchestrator/index.ts +80 -0
  253. package/extensions/orchestrator/integration.test.ts +1214 -0
  254. package/extensions/orchestrator/orchestrator.test.ts +252 -0
  255. package/extensions/orchestrator/orchestrator.ts +538 -0
  256. package/extensions/orchestrator/phases/brainstorm.test.ts +15 -0
  257. package/extensions/orchestrator/phases/brainstorm.ts +273 -0
  258. package/extensions/orchestrator/phases/implementation.ts +40 -0
  259. package/extensions/orchestrator/phases/machine.test.ts +293 -0
  260. package/extensions/orchestrator/phases/machine.ts +209 -0
  261. package/extensions/orchestrator/phases/planning.ts +255 -0
  262. package/extensions/orchestrator/phases/review.ts +193 -0
  263. package/extensions/orchestrator/plannotator.ts +56 -0
  264. package/extensions/orchestrator/pp-menu.ts +866 -0
  265. package/extensions/orchestrator/state.test.ts +343 -0
  266. package/extensions/orchestrator/state.ts +237 -0
  267. package/extensions/orchestrator/validate-artifacts.test.ts +88 -0
  268. package/extensions/orchestrator/validate-artifacts.ts +272 -0
  269. package/extensions/orchestrator/vendor.d.ts +26 -0
  270. package/package.json +73 -0
  271. package/scripts/postinstall.sh +18 -0
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Node-compatible servers for Plannotator Pi extension.
3
+ *
4
+ * Pi loads extensions via jiti (Node.js), so we can't use Bun.serve().
5
+ * These are lightweight node:http servers implementing just the routes
6
+ * each UI needs — plan review, code review, and markdown annotation.
7
+ */
8
+
9
+ export type {
10
+ DiffOption,
11
+ DiffType,
12
+ GitContext,
13
+ } from "./generated/review-core.js";
14
+ export type { WorkspaceDiffType } from "./generated/review-workspace.js";
15
+ export type { VcsSelection } from "./server/vcs.js";
16
+ export {
17
+ type AnnotateServerResult,
18
+ startAnnotateServer,
19
+ } from "./server/serverAnnotate.js";
20
+ export {
21
+ type PlanServerResult,
22
+ startPlanReviewServer,
23
+ } from "./server/serverPlan.js";
24
+ export {
25
+ type ReviewServerResult,
26
+ startReviewServer,
27
+ } from "./server/serverReview.js";
28
+ export {
29
+ canStageFiles,
30
+ detectManagedVcs,
31
+ detectRemoteDefaultCompareTarget,
32
+ detectVcs,
33
+ getGitContext,
34
+ getVcsContext,
35
+ getVcsFileContentsForDiff,
36
+ prepareLocalReviewDiff,
37
+ resolveInitialDiffType,
38
+ resolveVcsCwd,
39
+ reviewRuntime,
40
+ runGitDiff,
41
+ runVcsDiff,
42
+ stageFile,
43
+ unstageFile,
44
+ } from "./server/vcs.js";
@@ -0,0 +1,88 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import {
3
+ getToolsForPhase,
4
+ isPlanWritePathAllowed,
5
+ PLAN_SUBMIT_TOOL,
6
+ stripPlanningOnlyTools,
7
+ } from "./tool-scope";
8
+
9
+ describe("pi plan tool scoping", () => {
10
+ test("planning phase adds the submit tool and discovery helpers", () => {
11
+ expect(getToolsForPhase(["read", "bash", "edit", "write"], "planning")).toEqual([
12
+ "read",
13
+ "bash",
14
+ "edit",
15
+ "write",
16
+ "grep",
17
+ "find",
18
+ "ls",
19
+ PLAN_SUBMIT_TOOL,
20
+ ]);
21
+ });
22
+
23
+ test("idle and executing phases strip the planning-only submit tool", () => {
24
+ const leakedTools = ["read", "bash", "grep", PLAN_SUBMIT_TOOL, "write"];
25
+
26
+ expect(getToolsForPhase(leakedTools, "idle")).toEqual([
27
+ "read",
28
+ "bash",
29
+ "grep",
30
+ "write",
31
+ ]);
32
+ expect(getToolsForPhase(leakedTools, "executing")).toEqual([
33
+ "read",
34
+ "bash",
35
+ "grep",
36
+ "write",
37
+ ]);
38
+ });
39
+
40
+ test("stripping planning-only tools preserves unrelated tools", () => {
41
+ expect(stripPlanningOnlyTools([PLAN_SUBMIT_TOOL, "todo", "question", "read"])).toEqual([
42
+ "todo",
43
+ "question",
44
+ "read",
45
+ ]);
46
+ });
47
+ });
48
+
49
+ describe("plan write path gate", () => {
50
+ const cwd = "/r";
51
+
52
+ test("allows markdown files anywhere inside cwd", () => {
53
+ expect(isPlanWritePathAllowed("PLAN.md", cwd)).toBe(true);
54
+ expect(isPlanWritePathAllowed("plans/auth.md", cwd)).toBe(true);
55
+ expect(isPlanWritePathAllowed("deeply/nested/dir/notes.mdx", cwd)).toBe(true);
56
+ });
57
+
58
+ test("rejects non-markdown extensions", () => {
59
+ expect(isPlanWritePathAllowed("src/app.ts", cwd)).toBe(false);
60
+ expect(isPlanWritePathAllowed("notes.txt", cwd)).toBe(false);
61
+ expect(isPlanWritePathAllowed("config.json", cwd)).toBe(false);
62
+ });
63
+
64
+ test("rejects files with no extension or bare directories", () => {
65
+ expect(isPlanWritePathAllowed("plans", cwd)).toBe(false);
66
+ expect(isPlanWritePathAllowed("PLAN", cwd)).toBe(false);
67
+ });
68
+
69
+ test("rejects traversal and absolute paths outside cwd", () => {
70
+ expect(isPlanWritePathAllowed("../escape.md", cwd)).toBe(false);
71
+ expect(isPlanWritePathAllowed("../../etc/passwd.md", cwd)).toBe(false);
72
+ expect(isPlanWritePathAllowed("/tmp/leak.md", cwd)).toBe(false);
73
+ });
74
+
75
+ test("allows absolute paths that resolve inside cwd", () => {
76
+ expect(isPlanWritePathAllowed("/r/plans/foo.md", cwd)).toBe(true);
77
+ });
78
+
79
+ test("rejects empty path and the cwd itself", () => {
80
+ expect(isPlanWritePathAllowed("", cwd)).toBe(false);
81
+ expect(isPlanWritePathAllowed(".", cwd)).toBe(false);
82
+ });
83
+
84
+ test("extension check is case-insensitive", () => {
85
+ expect(isPlanWritePathAllowed("PLAN.MD", cwd)).toBe(true);
86
+ expect(isPlanWritePathAllowed("notes.MdX", cwd)).toBe(true);
87
+ });
88
+ });
@@ -0,0 +1,39 @@
1
+ import { extname, isAbsolute, relative, resolve } from "node:path";
2
+
3
+ export type Phase = "idle" | "planning" | "executing";
4
+
5
+ export const PLAN_SUBMIT_TOOL = "plannotator_submit_plan";
6
+ export const PLANNING_DISCOVERY_TOOLS = ["grep", "find", "ls"] as const;
7
+
8
+ const PLANNING_ONLY_TOOLS = new Set<string>([PLAN_SUBMIT_TOOL]);
9
+ const ALLOWED_PLAN_EXTENSIONS = new Set<string>([".md", ".mdx"]);
10
+
11
+ export function stripPlanningOnlyTools(tools: readonly string[]): string[] {
12
+ return tools.filter((tool) => !PLANNING_ONLY_TOOLS.has(tool));
13
+ }
14
+
15
+ export function getToolsForPhase(
16
+ baseTools: readonly string[],
17
+ phase: Phase,
18
+ ): string[] {
19
+ const tools = stripPlanningOnlyTools(baseTools);
20
+ if (phase !== "planning") {
21
+ return [...new Set(tools)];
22
+ }
23
+
24
+ return [
25
+ ...new Set([...tools, ...PLANNING_DISCOVERY_TOOLS, PLAN_SUBMIT_TOOL]),
26
+ ];
27
+ }
28
+
29
+ // Used by both the planning-phase write gate and plannotator_submit_plan.
30
+ // Path must resolve inside cwd (no traversal, no absolute escape) and end
31
+ // in a permitted markdown extension.
32
+ export function isPlanWritePathAllowed(inputPath: string, cwd: string): boolean {
33
+ if (!inputPath) return false;
34
+ const targetAbs = resolve(cwd, inputPath);
35
+ const rel = relative(resolve(cwd), targetAbs);
36
+ if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) return false;
37
+ const ext = extname(targetAbs).toLowerCase();
38
+ return ALLOWED_PLAN_EXTENSIONS.has(ext);
39
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "strict": true,
7
+ "skipLibCheck": true,
8
+ "noEmit": true,
9
+ "allowImportingTsExtensions": true,
10
+ "isolatedModules": true,
11
+ "moduleDetection": "force",
12
+ "types": ["node"]
13
+ },
14
+ "include": ["*.ts", "server/**/*.ts"],
15
+ "exclude": ["**/*.test.ts"]
16
+ }
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+ # Vendor shared modules into generated/ for Pi extension.
3
+ # Single source of truth — used by both `npm run build` and CI test workflow.
4
+ set -euo pipefail
5
+ cd "$(dirname "$0")"
6
+
7
+ rm -rf generated
8
+ mkdir -p generated generated/ai/providers
9
+
10
+ for f in feedback-templates prompts review-core diff-paths jj-core vcs-core review-args storage draft project pr-types pr-provider pr-stack pr-github pr-gitlab checklist integrations-common repo reference-common favicon code-file resolve-file config external-annotation agent-jobs worktree worktree-pool html-to-markdown url-to-markdown tour annotate-args at-reference review-workspace-node review-workspace pfm-reminder improvement-hooks code-nav data-dir semantic-diff-types semantic-diff; do
11
+ src="../../packages/shared/$f.ts"
12
+ printf '// @generated — DO NOT EDIT. Source: packages/shared/%s.ts\n' "$f" | cat - "$src" > "generated/$f.ts"
13
+ done
14
+
15
+ # Vendor review agent modules from packages/server/ — rewrite imports for generated/ layout
16
+ for f in agent-review-message codex-review claude-review path-utils; do
17
+ src="../../packages/server/$f.ts"
18
+ printf '// @generated — DO NOT EDIT. Source: packages/server/%s.ts\n' "$f" | cat - "$src" \
19
+ | sed 's|from "./vcs"|from "./review-core.js"|' \
20
+ | sed 's|from "./pr"|from "./pr-provider.js"|' \
21
+ | sed 's|from "./path-utils"|from "./path-utils.js"|' \
22
+ | sed 's|from "@plannotator/shared/review-workspace"|from "./review-workspace.js"|' \
23
+ | sed 's|from "@plannotator/shared/data-dir"|from "./data-dir"|' \
24
+ > "generated/$f.ts"
25
+ done
26
+
27
+ # tour-review lives in packages/server/tour/ — parent-relative imports and the
28
+ # shared tour types package each map to the flat generated/ layout.
29
+ for f in tour-review; do
30
+ src="../../packages/server/tour/$f.ts"
31
+ printf '// @generated — DO NOT EDIT. Source: packages/server/tour/%s.ts\n' "$f" | cat - "$src" \
32
+ | sed 's|from "\.\./vcs"|from "./review-core.js"|' \
33
+ | sed 's|from "\.\./pr"|from "./pr-provider.js"|' \
34
+ | sed 's|from "\.\./agent-review-message"|from "./agent-review-message.js"|' \
35
+ | sed 's|from "@plannotator/shared/tour"|from "./tour.js"|' \
36
+ | sed 's|from "@plannotator/shared/data-dir"|from "./data-dir"|' \
37
+ > "generated/$f.ts"
38
+ done
39
+
40
+ for f in index types provider session-manager endpoints context base-session; do
41
+ src="../../packages/ai/$f.ts"
42
+ printf '// @generated — DO NOT EDIT. Source: packages/ai/%s.ts\n' "$f" | cat - "$src" > "generated/ai/$f.ts"
43
+ done
44
+
45
+ for f in claude-agent-sdk codex-sdk opencode-sdk command-path pi-sdk pi-sdk-node pi-events; do
46
+ src="../../packages/ai/providers/$f.ts"
47
+ printf '// @generated — DO NOT EDIT. Source: packages/ai/providers/%s.ts\n' "$f" | cat - "$src" > "generated/ai/providers/$f.ts"
48
+ done
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "plannotator",
3
+ "version": "0.20.0",
4
+ "private": true,
5
+ "description": "Interactive Plan Review for Claude Code - annotate plans visually, share with team, automatically send feedback",
6
+ "author": "backnotprop",
7
+ "license": "MIT OR Apache-2.0",
8
+ "bin": {
9
+ "plannotator": "bin/plannotator.js"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/backnotprop/plannotator.git"
14
+ },
15
+ "homepage": "https://github.com/backnotprop/plannotator",
16
+ "bugs": {
17
+ "url": "https://github.com/backnotprop/plannotator/issues"
18
+ },
19
+ "scripts": {
20
+ "dev:hook": "bun run --cwd apps/hook dev",
21
+ "dev:portal": "bun run --cwd apps/portal dev",
22
+ "dev:marketing": "bun run --cwd apps/marketing dev",
23
+ "dev:review": "bun run --cwd apps/review dev",
24
+ "build:hook": "bun run --cwd apps/hook build",
25
+ "build:portal": "bun run --cwd apps/portal build",
26
+ "build:marketing": "bun run --cwd apps/marketing build",
27
+ "build:opencode": "bun run --cwd apps/opencode-plugin build",
28
+ "build:review": "bun run --cwd apps/review build",
29
+ "build:pi": "bun run build:review && bun run build:hook && bun run --cwd apps/pi-extension build",
30
+ "build": "bun run build:hook && bun run build:opencode",
31
+ "dev:vscode": "bun run --cwd apps/vscode-extension watch",
32
+ "build:vscode": "bun run --cwd apps/vscode-extension build",
33
+ "package:vscode": "bun run --cwd apps/vscode-extension package",
34
+ "test": "bun test",
35
+ "typecheck": "bash apps/pi-extension/vendor.sh && tsc --noEmit -p packages/shared/tsconfig.json && tsc --noEmit -p packages/ai/tsconfig.json && tsc --noEmit -p packages/server/tsconfig.json && tsc --noEmit -p packages/ui/tsconfig.json && tsc --noEmit -p apps/pi-extension/tsconfig.json"
36
+ },
37
+ "dependencies": {
38
+ "@anthropic-ai/claude-agent-sdk": "^0.2.92",
39
+ "@openai/codex-sdk": "^0.118.0",
40
+ "@opencode-ai/sdk": "^1.3.0",
41
+ "@pierre/diffs": "^1.1.20",
42
+ "diff": "^8.0.4",
43
+ "dockview-react": "^5.2.0",
44
+ "dompurify": "^3.3.3",
45
+ "marked": "^17.0.6",
46
+ "sonner": "^2.0.7"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^25.5.2",
50
+ "@types/turndown": "^5.0.6",
51
+ "bun-types": "^1.3.11"
52
+ }
53
+ }