gsd-pi 2.29.0 → 2.30.0-dev.7e1bbce

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 (328) hide show
  1. package/README.md +24 -17
  2. package/dist/cli.js +51 -0
  3. package/dist/extension-registry.d.ts +63 -0
  4. package/dist/extension-registry.js +166 -0
  5. package/dist/headless.js +4 -0
  6. package/dist/help-text.js +35 -0
  7. package/dist/loader.js +10 -1
  8. package/dist/resource-loader.js +11 -1
  9. package/dist/resources/extensions/async-jobs/extension-manifest.json +13 -0
  10. package/dist/resources/extensions/bg-shell/extension-manifest.json +14 -0
  11. package/dist/resources/extensions/bg-shell/process-manager.ts +13 -0
  12. package/dist/resources/extensions/browser-tools/extension-manifest.json +37 -0
  13. package/dist/resources/extensions/context7/extension-manifest.json +12 -0
  14. package/dist/resources/extensions/google-search/extension-manifest.json +12 -0
  15. package/dist/resources/extensions/gsd/auto-dashboard.ts +31 -0
  16. package/dist/resources/extensions/gsd/auto-dispatch.ts +32 -3
  17. package/dist/resources/extensions/gsd/auto-post-unit.ts +45 -13
  18. package/dist/resources/extensions/gsd/auto-prompts.ts +40 -17
  19. package/dist/resources/extensions/gsd/auto-recovery.ts +18 -23
  20. package/dist/resources/extensions/gsd/auto-start.ts +18 -32
  21. package/dist/resources/extensions/gsd/auto-worktree.ts +21 -182
  22. package/dist/resources/extensions/gsd/auto.ts +2 -24
  23. package/dist/resources/extensions/gsd/captures.ts +4 -10
  24. package/dist/resources/extensions/gsd/commands-extensions.ts +328 -0
  25. package/dist/resources/extensions/gsd/commands-handlers.ts +22 -2
  26. package/dist/resources/extensions/gsd/commands-logs.ts +13 -14
  27. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +44 -14
  28. package/dist/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
  29. package/dist/resources/extensions/gsd/commands.ts +108 -24
  30. package/dist/resources/extensions/gsd/dashboard-overlay.ts +2 -1
  31. package/dist/resources/extensions/gsd/detection.ts +2 -1
  32. package/dist/resources/extensions/gsd/doctor-checks.ts +49 -1
  33. package/dist/resources/extensions/gsd/doctor-types.ts +3 -1
  34. package/dist/resources/extensions/gsd/extension-manifest.json +18 -0
  35. package/dist/resources/extensions/gsd/forensics.ts +2 -2
  36. package/dist/resources/extensions/gsd/git-service.ts +3 -2
  37. package/dist/resources/extensions/gsd/gitignore.ts +9 -63
  38. package/dist/resources/extensions/gsd/gsd-db.ts +1 -165
  39. package/dist/resources/extensions/gsd/guided-flow.ts +8 -5
  40. package/dist/resources/extensions/gsd/index.ts +16 -3
  41. package/dist/resources/extensions/gsd/json-persistence.ts +16 -1
  42. package/dist/resources/extensions/gsd/md-importer.ts +3 -2
  43. package/dist/resources/extensions/gsd/mechanical-completion.ts +430 -0
  44. package/dist/resources/extensions/gsd/migrate/command.ts +3 -2
  45. package/dist/resources/extensions/gsd/migrate/writer.ts +2 -1
  46. package/dist/resources/extensions/gsd/migrate-external.ts +123 -0
  47. package/dist/resources/extensions/gsd/paths.ts +24 -2
  48. package/dist/resources/extensions/gsd/post-unit-hooks.ts +6 -5
  49. package/dist/resources/extensions/gsd/preferences-models.ts +7 -1
  50. package/dist/resources/extensions/gsd/preferences-validation.ts +2 -1
  51. package/dist/resources/extensions/gsd/preferences.ts +10 -5
  52. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +4 -2
  53. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  54. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +26 -2
  55. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -1
  56. package/dist/resources/extensions/gsd/prompts/workflow-start.md +28 -0
  57. package/dist/resources/extensions/gsd/queue-order.ts +10 -11
  58. package/dist/resources/extensions/gsd/repo-identity.ts +148 -0
  59. package/dist/resources/extensions/gsd/resource-version.ts +99 -0
  60. package/dist/resources/extensions/gsd/roadmap-slices.ts +22 -7
  61. package/dist/resources/extensions/gsd/session-forensics.ts +4 -3
  62. package/dist/resources/extensions/gsd/session-lock.ts +53 -4
  63. package/dist/resources/extensions/gsd/session-status-io.ts +23 -41
  64. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +2 -2
  65. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  66. package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +3 -3
  67. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
  68. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -58
  69. package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +3 -4
  70. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +60 -38
  71. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +5 -18
  72. package/dist/resources/extensions/gsd/tests/git-service.test.ts +10 -37
  73. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +4 -4
  74. package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +356 -0
  75. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
  76. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -0
  77. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +14 -16
  78. package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
  79. package/dist/resources/extensions/gsd/triage-resolution.ts +2 -1
  80. package/dist/resources/extensions/gsd/types.ts +2 -0
  81. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
  82. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
  83. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
  84. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
  85. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
  86. package/dist/resources/extensions/gsd/workflow-templates/registry.json +85 -0
  87. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
  88. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
  89. package/dist/resources/extensions/gsd/workflow-templates/spike.md +69 -0
  90. package/dist/resources/extensions/gsd/workflow-templates.ts +241 -0
  91. package/dist/resources/extensions/gsd/worktree-command.ts +1 -11
  92. package/dist/resources/extensions/gsd/worktree-manager.ts +3 -2
  93. package/dist/resources/extensions/gsd/worktree.ts +42 -5
  94. package/dist/resources/extensions/mac-tools/extension-manifest.json +16 -0
  95. package/dist/resources/extensions/mcp-client/index.ts +459 -0
  96. package/dist/resources/extensions/mcporter/extension-manifest.json +12 -0
  97. package/dist/resources/extensions/remote-questions/discord-adapter.ts +8 -19
  98. package/dist/resources/extensions/remote-questions/extension-manifest.json +11 -0
  99. package/dist/resources/extensions/remote-questions/http-client.ts +76 -0
  100. package/dist/resources/extensions/remote-questions/slack-adapter.ts +11 -17
  101. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +8 -19
  102. package/dist/resources/extensions/search-the-web/extension-manifest.json +13 -0
  103. package/dist/resources/extensions/slash-commands/extension-manifest.json +11 -0
  104. package/dist/resources/extensions/subagent/extension-manifest.json +13 -0
  105. package/dist/resources/extensions/ttsr/extension-manifest.json +11 -0
  106. package/dist/resources/extensions/universal-config/extension-manifest.json +13 -0
  107. package/dist/resources/extensions/voice/extension-manifest.json +12 -0
  108. package/dist/resources/skills/create-gsd-extension/SKILL.md +87 -0
  109. package/dist/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
  110. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
  111. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
  112. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
  113. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
  114. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
  115. package/dist/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
  116. package/dist/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
  117. package/dist/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
  118. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
  119. package/dist/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
  120. package/dist/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
  121. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
  122. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
  123. package/dist/resources/skills/create-gsd-extension/references/state-management.md +70 -0
  124. package/dist/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
  125. package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
  126. package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
  127. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
  128. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
  129. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
  130. package/dist/resources/skills/create-skill/SKILL.md +184 -0
  131. package/dist/resources/skills/create-skill/references/api-security.md +226 -0
  132. package/dist/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
  133. package/dist/resources/skills/create-skill/references/common-patterns.md +595 -0
  134. package/dist/resources/skills/create-skill/references/core-principles.md +437 -0
  135. package/dist/resources/skills/create-skill/references/executable-code.md +175 -0
  136. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
  137. package/dist/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
  138. package/dist/resources/skills/create-skill/references/recommended-structure.md +168 -0
  139. package/dist/resources/skills/create-skill/references/skill-structure.md +372 -0
  140. package/dist/resources/skills/create-skill/references/use-xml-tags.md +466 -0
  141. package/dist/resources/skills/create-skill/references/using-scripts.md +113 -0
  142. package/dist/resources/skills/create-skill/references/using-templates.md +112 -0
  143. package/dist/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
  144. package/dist/resources/skills/create-skill/templates/router-skill.md +73 -0
  145. package/dist/resources/skills/create-skill/templates/simple-skill.md +33 -0
  146. package/dist/resources/skills/create-skill/workflows/add-reference.md +96 -0
  147. package/dist/resources/skills/create-skill/workflows/add-script.md +93 -0
  148. package/dist/resources/skills/create-skill/workflows/add-template.md +74 -0
  149. package/dist/resources/skills/create-skill/workflows/add-workflow.md +120 -0
  150. package/dist/resources/skills/create-skill/workflows/audit-skill.md +148 -0
  151. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
  152. package/dist/resources/skills/create-skill/workflows/get-guidance.md +121 -0
  153. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
  154. package/dist/resources/skills/create-skill/workflows/verify-skill.md +204 -0
  155. package/dist/resources/skills/react-best-practices/SKILL.md +1 -1
  156. package/dist/worktree-cli.d.ts +34 -0
  157. package/dist/worktree-cli.js +294 -0
  158. package/dist/worktree-name-gen.d.ts +7 -0
  159. package/dist/worktree-name-gen.js +44 -0
  160. package/package.json +1 -1
  161. package/packages/native/dist/native.d.ts +2 -0
  162. package/packages/native/dist/native.js +19 -5
  163. package/packages/native/src/native.ts +23 -9
  164. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  165. package/packages/pi-coding-agent/dist/core/extensions/loader.js +13 -0
  166. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  167. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -0
  169. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  170. package/packages/pi-coding-agent/package.json +1 -1
  171. package/packages/pi-coding-agent/src/core/extensions/loader.ts +13 -0
  172. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -0
  173. package/pkg/package.json +1 -1
  174. package/src/resources/extensions/async-jobs/extension-manifest.json +13 -0
  175. package/src/resources/extensions/bg-shell/extension-manifest.json +14 -0
  176. package/src/resources/extensions/bg-shell/process-manager.ts +13 -0
  177. package/src/resources/extensions/browser-tools/extension-manifest.json +37 -0
  178. package/src/resources/extensions/context7/extension-manifest.json +12 -0
  179. package/src/resources/extensions/google-search/extension-manifest.json +12 -0
  180. package/src/resources/extensions/gsd/auto-dashboard.ts +31 -0
  181. package/src/resources/extensions/gsd/auto-dispatch.ts +32 -3
  182. package/src/resources/extensions/gsd/auto-post-unit.ts +45 -13
  183. package/src/resources/extensions/gsd/auto-prompts.ts +40 -17
  184. package/src/resources/extensions/gsd/auto-recovery.ts +18 -23
  185. package/src/resources/extensions/gsd/auto-start.ts +18 -32
  186. package/src/resources/extensions/gsd/auto-worktree.ts +21 -182
  187. package/src/resources/extensions/gsd/auto.ts +2 -24
  188. package/src/resources/extensions/gsd/captures.ts +4 -10
  189. package/src/resources/extensions/gsd/commands-extensions.ts +328 -0
  190. package/src/resources/extensions/gsd/commands-handlers.ts +22 -2
  191. package/src/resources/extensions/gsd/commands-logs.ts +13 -14
  192. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +44 -14
  193. package/src/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
  194. package/src/resources/extensions/gsd/commands.ts +108 -24
  195. package/src/resources/extensions/gsd/dashboard-overlay.ts +2 -1
  196. package/src/resources/extensions/gsd/detection.ts +2 -1
  197. package/src/resources/extensions/gsd/doctor-checks.ts +49 -1
  198. package/src/resources/extensions/gsd/doctor-types.ts +3 -1
  199. package/src/resources/extensions/gsd/extension-manifest.json +18 -0
  200. package/src/resources/extensions/gsd/forensics.ts +2 -2
  201. package/src/resources/extensions/gsd/git-service.ts +3 -2
  202. package/src/resources/extensions/gsd/gitignore.ts +9 -63
  203. package/src/resources/extensions/gsd/gsd-db.ts +1 -165
  204. package/src/resources/extensions/gsd/guided-flow.ts +8 -5
  205. package/src/resources/extensions/gsd/index.ts +16 -3
  206. package/src/resources/extensions/gsd/json-persistence.ts +16 -1
  207. package/src/resources/extensions/gsd/md-importer.ts +3 -2
  208. package/src/resources/extensions/gsd/mechanical-completion.ts +430 -0
  209. package/src/resources/extensions/gsd/migrate/command.ts +3 -2
  210. package/src/resources/extensions/gsd/migrate/writer.ts +2 -1
  211. package/src/resources/extensions/gsd/migrate-external.ts +123 -0
  212. package/src/resources/extensions/gsd/paths.ts +24 -2
  213. package/src/resources/extensions/gsd/post-unit-hooks.ts +6 -5
  214. package/src/resources/extensions/gsd/preferences-models.ts +7 -1
  215. package/src/resources/extensions/gsd/preferences-validation.ts +2 -1
  216. package/src/resources/extensions/gsd/preferences.ts +10 -5
  217. package/src/resources/extensions/gsd/prompts/discuss-headless.md +4 -2
  218. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  219. package/src/resources/extensions/gsd/prompts/plan-milestone.md +26 -2
  220. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -1
  221. package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
  222. package/src/resources/extensions/gsd/queue-order.ts +10 -11
  223. package/src/resources/extensions/gsd/repo-identity.ts +148 -0
  224. package/src/resources/extensions/gsd/resource-version.ts +99 -0
  225. package/src/resources/extensions/gsd/roadmap-slices.ts +22 -7
  226. package/src/resources/extensions/gsd/session-forensics.ts +4 -3
  227. package/src/resources/extensions/gsd/session-lock.ts +53 -4
  228. package/src/resources/extensions/gsd/session-status-io.ts +23 -41
  229. package/src/resources/extensions/gsd/tests/activity-log.test.ts +2 -2
  230. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  231. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +3 -3
  232. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
  233. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -58
  234. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +3 -4
  235. package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +60 -38
  236. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +5 -18
  237. package/src/resources/extensions/gsd/tests/git-service.test.ts +10 -37
  238. package/src/resources/extensions/gsd/tests/knowledge.test.ts +4 -4
  239. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +356 -0
  240. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
  241. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -0
  242. package/src/resources/extensions/gsd/tests/token-profile.test.ts +14 -16
  243. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
  244. package/src/resources/extensions/gsd/triage-resolution.ts +2 -1
  245. package/src/resources/extensions/gsd/types.ts +2 -0
  246. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
  247. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
  248. package/src/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
  249. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
  250. package/src/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
  251. package/src/resources/extensions/gsd/workflow-templates/registry.json +85 -0
  252. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
  253. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
  254. package/src/resources/extensions/gsd/workflow-templates/spike.md +69 -0
  255. package/src/resources/extensions/gsd/workflow-templates.ts +241 -0
  256. package/src/resources/extensions/gsd/worktree-command.ts +1 -11
  257. package/src/resources/extensions/gsd/worktree-manager.ts +3 -2
  258. package/src/resources/extensions/gsd/worktree.ts +42 -5
  259. package/src/resources/extensions/mac-tools/extension-manifest.json +16 -0
  260. package/src/resources/extensions/mcp-client/index.ts +459 -0
  261. package/src/resources/extensions/mcporter/extension-manifest.json +12 -0
  262. package/src/resources/extensions/remote-questions/discord-adapter.ts +8 -19
  263. package/src/resources/extensions/remote-questions/extension-manifest.json +11 -0
  264. package/src/resources/extensions/remote-questions/http-client.ts +76 -0
  265. package/src/resources/extensions/remote-questions/slack-adapter.ts +11 -17
  266. package/src/resources/extensions/remote-questions/telegram-adapter.ts +8 -19
  267. package/src/resources/extensions/search-the-web/extension-manifest.json +13 -0
  268. package/src/resources/extensions/slash-commands/extension-manifest.json +11 -0
  269. package/src/resources/extensions/subagent/extension-manifest.json +13 -0
  270. package/src/resources/extensions/ttsr/extension-manifest.json +11 -0
  271. package/src/resources/extensions/universal-config/extension-manifest.json +13 -0
  272. package/src/resources/extensions/voice/extension-manifest.json +12 -0
  273. package/src/resources/skills/create-gsd-extension/SKILL.md +87 -0
  274. package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
  275. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
  276. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
  277. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
  278. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
  279. package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
  280. package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
  281. package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
  282. package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
  283. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
  284. package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
  285. package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
  286. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
  287. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
  288. package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
  289. package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
  290. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
  291. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
  292. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
  293. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
  294. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
  295. package/src/resources/skills/create-skill/SKILL.md +184 -0
  296. package/src/resources/skills/create-skill/references/api-security.md +226 -0
  297. package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
  298. package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
  299. package/src/resources/skills/create-skill/references/core-principles.md +437 -0
  300. package/src/resources/skills/create-skill/references/executable-code.md +175 -0
  301. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
  302. package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
  303. package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
  304. package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
  305. package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
  306. package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
  307. package/src/resources/skills/create-skill/references/using-templates.md +112 -0
  308. package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
  309. package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
  310. package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
  311. package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
  312. package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
  313. package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
  314. package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
  315. package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
  316. package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
  317. package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
  318. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
  319. package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
  320. package/src/resources/skills/react-best-practices/SKILL.md +1 -1
  321. package/dist/resources/extensions/gsd/auto-worktree-sync.ts +0 -198
  322. package/dist/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -205
  323. package/dist/resources/extensions/gsd/tests/worktree-db.test.ts +0 -442
  324. package/dist/resources/extensions/mcporter/index.ts +0 -525
  325. package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -198
  326. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -205
  327. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +0 -442
  328. package/src/resources/extensions/mcporter/index.ts +0 -525
@@ -0,0 +1,75 @@
1
+ <overview>
2
+ ExtensionAPI methods — the `pi` object received in the default export function.
3
+ </overview>
4
+
5
+ <core_registration>
6
+ | Method | Purpose |
7
+ |--------|---------|
8
+ | `pi.on(event, handler)` | Subscribe to events |
9
+ | `pi.registerTool(definition)` | Register LLM-callable tool |
10
+ | `pi.registerCommand(name, options)` | Register `/command` |
11
+ | `pi.registerShortcut(key, options)` | Register keyboard shortcut |
12
+ | `pi.registerFlag(name, options)` | Register CLI flag |
13
+ | `pi.registerMessageRenderer(customType, renderer)` | Custom message rendering |
14
+ | `pi.registerProvider(name, config)` | Register/override model provider |
15
+ | `pi.unregisterProvider(name)` | Remove a provider |
16
+ </core_registration>
17
+
18
+ <messaging>
19
+ | Method | Purpose |
20
+ |--------|---------|
21
+ | `pi.sendMessage(message, options?)` | Inject custom message into session |
22
+ | `pi.sendUserMessage(content, options?)` | Send user message (triggers turn) |
23
+
24
+ **Delivery modes for `sendMessage`:**
25
+ - `"steer"` (default) — Interrupts streaming after current tool
26
+ - `"followUp"` — Waits for agent to finish all tools
27
+ - `"nextTurn"` — Queued for next user prompt
28
+
29
+ ```typescript
30
+ pi.sendMessage({
31
+ customType: "my-extension",
32
+ content: "Additional context",
33
+ display: true,
34
+ details: { ... },
35
+ }, { deliverAs: "steer", triggerTurn: true });
36
+ ```
37
+ </messaging>
38
+
39
+ <state_session>
40
+ | Method | Purpose |
41
+ |--------|---------|
42
+ | `pi.appendEntry(customType, data?)` | Persist state (NOT sent to LLM) |
43
+ | `pi.setSessionName(name)` | Set session display name |
44
+ | `pi.getSessionName()` | Get session name |
45
+ | `pi.setLabel(entryId, label)` | Bookmark entry for `/tree` |
46
+ </state_session>
47
+
48
+ <tool_management>
49
+ ```typescript
50
+ const active = pi.getActiveTools(); // ["read", "bash", "edit", "write"]
51
+ const all = pi.getAllTools(); // [{ name, description }, ...]
52
+ pi.setActiveTools(["read", "bash"]); // Enable/disable tools
53
+ ```
54
+ </tool_management>
55
+
56
+ <model_management>
57
+ ```typescript
58
+ const model = ctx.modelRegistry.find("anthropic", "claude-sonnet-4-5");
59
+ if (model) {
60
+ const success = await pi.setModel(model); // Returns false if no API key
61
+ }
62
+
63
+ pi.getThinkingLevel(); // "off" | "minimal" | "low" | "medium" | "high" | "xhigh"
64
+ pi.setThinkingLevel("high");
65
+ ```
66
+ </model_management>
67
+
68
+ <utilities>
69
+ | Method | Purpose |
70
+ |--------|---------|
71
+ | `pi.exec(cmd, args, opts?)` | Shell command (prefer over child_process) |
72
+ | `pi.events` | Shared event bus for inter-extension communication |
73
+ | `pi.getFlag(name)` | Get CLI flag value |
74
+ | `pi.getCommands()` | All available slash commands |
75
+ </utilities>
@@ -0,0 +1,53 @@
1
+ <overview>
2
+ ExtensionContext (`ctx`) — available in all event handlers (except `session_directory`).
3
+ </overview>
4
+
5
+ <ui_methods>
6
+ **Dialogs (blocking — wait for user response):**
7
+ ```typescript
8
+ const choice = await ctx.ui.select("Pick one:", ["A", "B", "C"]);
9
+ const ok = await ctx.ui.confirm("Delete?", "This cannot be undone");
10
+ const name = await ctx.ui.input("Name:", "placeholder");
11
+ const text = await ctx.ui.editor("Edit:", "prefilled text");
12
+
13
+ // Timed dialog — auto-dismiss after timeout
14
+ const ok = await ctx.ui.confirm("Auto-confirm?", "Proceeds in 5s", { timeout: 5000 });
15
+ ```
16
+
17
+ **Non-blocking UI:**
18
+ ```typescript
19
+ ctx.ui.notify("Done!", "info"); // Toast: "info" | "warning" | "error"
20
+ ctx.ui.setStatus("my-ext", "● Active"); // Footer status
21
+ ctx.ui.setStatus("my-ext", undefined); // Clear
22
+ ctx.ui.setWidget("my-id", ["Line 1", "Line 2"]); // Widget above editor
23
+ ctx.ui.setWidget("my-id", ["Below!"], { placement: "belowEditor" });
24
+ ctx.ui.setTitle("gsd - my project"); // Terminal title
25
+ ctx.ui.setEditorText("Prefill"); // Set editor content
26
+ ctx.ui.setWorkingMessage("Analyzing..."); // Working message during streaming
27
+ ctx.ui.setToolsExpanded(true); // Expand tool output
28
+ ```
29
+ </ui_methods>
30
+
31
+ <ctx_properties>
32
+ | Property/Method | Purpose |
33
+ |----------------|---------|
34
+ | `ctx.hasUI` | `false` in print/JSON mode — check before dialogs |
35
+ | `ctx.cwd` | Current working directory |
36
+ | `ctx.sessionManager` | Read-only session state |
37
+ | `ctx.modelRegistry` / `ctx.model` | Model access |
38
+ | `ctx.isIdle()` / `ctx.abort()` / `ctx.hasPendingMessages()` | Agent state |
39
+ | `ctx.shutdown()` | Request graceful exit (deferred until idle) |
40
+ | `ctx.getContextUsage()` | Current context token usage |
41
+ | `ctx.compact(options?)` | Trigger compaction |
42
+ | `ctx.getSystemPrompt()` | Current effective system prompt |
43
+ </ctx_properties>
44
+
45
+ <session_manager>
46
+ ```typescript
47
+ ctx.sessionManager.getEntries() // All entries
48
+ ctx.sessionManager.getBranch() // Current branch
49
+ ctx.sessionManager.getLeafId() // Current leaf entry ID
50
+ ctx.sessionManager.getSessionFile() // Session JSONL path
51
+ ctx.sessionManager.getLabel(entryId) // Entry label
52
+ ```
53
+ </session_manager>
@@ -0,0 +1,36 @@
1
+ <overview>
2
+ Non-negotiable rules and common gotchas when building GSD extensions.
3
+ </overview>
4
+
5
+ <must_follow>
6
+ 1. **Use `StringEnum` for string enums** — `Type.Union`/`Type.Literal` breaks Google's API.
7
+ 2. **Truncate tool output** — Large output causes context overflow, compaction failures, degraded performance. Limit: 50KB / 2000 lines.
8
+ 3. **Use theme from callback** — Don't import theme directly. Use the `theme` parameter from `ctx.ui.custom()` or render functions.
9
+ 4. **`DynamicBorder` color param** — Type as `(s: string) => theme.fg("accent", s)`.
10
+ 5. **Call `tui.requestRender()` after state changes** in `handleInput`.
11
+ 6. **Return `{ render, invalidate, handleInput }`** from custom components.
12
+ 7. **Lines must not exceed `width`** in `render()` — use `truncateToWidth()`.
13
+ 8. **Session control methods ONLY in commands** — `waitForIdle()`, `newSession()`, `fork()`, `navigateTree()`, `reload()` will **deadlock** in event handlers.
14
+ 9. **Strip leading `@` from path arguments** — some models add it.
15
+ 10. **Store state in tool result `details`** for proper branching support.
16
+ </must_follow>
17
+
18
+ <common_patterns>
19
+ - Rebuild component on `invalidate()` when pre-baking theme colors
20
+ - Check `signal?.aborted` in long-running tool executions
21
+ - Use `pi.exec()` instead of `child_process` for shell commands
22
+ - Overlay components are **disposed when closed** — create fresh instances each time
23
+ - Treat `ctx.reload()` as terminal — code after runs from pre-reload version
24
+ - Check `ctx.hasUI` before dialog methods (false in print/JSON mode)
25
+ - Extension errors are logged but don't crash GSD — tool_call handler errors fail-safe (block the tool)
26
+ </common_patterns>
27
+
28
+ <gsd_paths>
29
+ **GSD extension paths:**
30
+ - Global: `~/.gsd/agent/extensions/*.ts`
31
+ - Global (subdir): `~/.gsd/agent/extensions/*/index.ts`
32
+ - Project-local: `.gsd/extensions/*.ts`
33
+ - Project-local (subdir): `.gsd/extensions/*/index.ts`
34
+
35
+ The upstream pi docs reference `~/.pi` paths — GSD uses `~/.gsd` everywhere instead.
36
+ </gsd_paths>
@@ -0,0 +1,32 @@
1
+ <overview>
2
+ Mode behavior determines which UI methods work. Extensions may run in non-interactive modes where dialogs are unavailable.
3
+ </overview>
4
+
5
+ <mode_table>
6
+ | Mode | UI Methods | Notes |
7
+ |------|-----------|-------|
8
+ | **Interactive** (default) | Full TUI | Normal operation — all UI works |
9
+ | **RPC** (`--mode rpc`) | JSON protocol | Host handles UI, dialogs work via sub-protocol |
10
+ | **JSON** (`--mode json`) | No-op | Event stream to stdout, no UI |
11
+ | **Print** (`-p`) | No-op | Extensions run but can't prompt users |
12
+ </mode_table>
13
+
14
+ <checking_ui>
15
+ **Always check `ctx.hasUI`** before calling dialog methods:
16
+
17
+ ```typescript
18
+ if (ctx.hasUI) {
19
+ const ok = await ctx.ui.confirm("Delete?", "Sure?");
20
+ if (!ok) return;
21
+ } else {
22
+ // Default behavior for non-interactive mode
23
+ // Or just proceed without confirmation
24
+ }
25
+ ```
26
+
27
+ `ctx.hasUI` is `false` in print mode (`-p`) and JSON mode. `true` in interactive and RPC mode.
28
+ </checking_ui>
29
+
30
+ <fire_and_forget>
31
+ Non-blocking methods (`notify`, `setStatus`, `setWidget`, `setTitle`, `setEditorText`) are safe in all modes — they're no-ops when no UI is available.
32
+ </fire_and_forget>
@@ -0,0 +1,89 @@
1
+ <overview>
2
+ Model and provider management — switching models, registering custom providers with OAuth, and reacting to model changes.
3
+ </overview>
4
+
5
+ <switching_models>
6
+ ```typescript
7
+ const model = ctx.modelRegistry.find("anthropic", "claude-sonnet-4-5");
8
+ if (model) {
9
+ const success = await pi.setModel(model);
10
+ if (!success) ctx.ui.notify("No API key for this model", "error");
11
+ }
12
+
13
+ // Thinking level
14
+ pi.getThinkingLevel(); // "off" | "minimal" | "low" | "medium" | "high" | "xhigh"
15
+ pi.setThinkingLevel("high"); // Clamped to model capabilities
16
+ ```
17
+ </switching_models>
18
+
19
+ <register_provider>
20
+ ```typescript
21
+ pi.registerProvider("my-proxy", {
22
+ baseUrl: "https://proxy.example.com",
23
+ apiKey: "PROXY_API_KEY", // Env var name or literal
24
+ api: "anthropic-messages", // or "openai-completions", "openai-responses"
25
+ headers: { "X-Custom": "value" }, // Optional custom headers
26
+ authHeader: true, // Auto-add Authorization: Bearer header
27
+ models: [
28
+ {
29
+ id: "claude-sonnet-4-20250514",
30
+ name: "Claude 4 Sonnet (proxy)",
31
+ reasoning: false,
32
+ input: ["text", "image"],
33
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
34
+ contextWindow: 200000,
35
+ maxTokens: 16384,
36
+ }
37
+ ],
38
+ });
39
+
40
+ // Override just baseUrl for an existing provider (keeps all models)
41
+ pi.registerProvider("anthropic", {
42
+ baseUrl: "https://proxy.example.com",
43
+ });
44
+
45
+ // Remove a provider (restores any overridden built-in models)
46
+ pi.unregisterProvider("my-proxy");
47
+ ```
48
+
49
+ Takes effect immediately after initial load phase — no `/reload` required.
50
+ </register_provider>
51
+
52
+ <oauth_provider>
53
+ Register a provider with OAuth support for `/login`:
54
+
55
+ ```typescript
56
+ pi.registerProvider("corporate-ai", {
57
+ baseUrl: "https://ai.corp.com",
58
+ api: "openai-responses",
59
+ models: [/* ... */],
60
+ oauth: {
61
+ name: "Corporate AI (SSO)",
62
+ async login(callbacks) {
63
+ callbacks.onAuth({ url: "https://sso.corp.com/..." });
64
+ const code = await callbacks.onPrompt({ message: "Enter code:" });
65
+ return { refresh: code, access: code, expires: Date.now() + 3600000 };
66
+ },
67
+ async refreshToken(credentials) {
68
+ return credentials; // Refresh logic
69
+ },
70
+ getApiKey(credentials) {
71
+ return credentials.access;
72
+ },
73
+ },
74
+ });
75
+ ```
76
+ </oauth_provider>
77
+
78
+ <model_events>
79
+ React to model changes:
80
+
81
+ ```typescript
82
+ pi.on("model_select", async (event, ctx) => {
83
+ // event.model — newly selected model
84
+ // event.previousModel — previous model (undefined if first)
85
+ // event.source — "set" | "cycle" | "restore"
86
+ ctx.ui.setStatus("model", `${event.model.provider}/${event.model.id}`);
87
+ });
88
+ ```
89
+ </model_events>
@@ -0,0 +1,55 @@
1
+ <overview>
2
+ Packaging extensions for distribution via npm, git, or local paths. Creating GSD/pi packages.
3
+ </overview>
4
+
5
+ <package_manifest>
6
+ Add a `pi` manifest to `package.json`:
7
+
8
+ ```json
9
+ {
10
+ "name": "my-gsd-package",
11
+ "keywords": ["pi-package"],
12
+ "pi": {
13
+ "extensions": ["./extensions"],
14
+ "skills": ["./skills"],
15
+ "prompts": ["./prompts"],
16
+ "themes": ["./themes"]
17
+ }
18
+ }
19
+ ```
20
+ </package_manifest>
21
+
22
+ <installing>
23
+ ```bash
24
+ gsd install npm:@foo/bar@1.0.0
25
+ gsd install git:github.com/user/repo@v1
26
+ gsd install ./local/path
27
+
28
+ # Try without installing:
29
+ gsd -e npm:@foo/bar
30
+ ```
31
+ </installing>
32
+
33
+ <convention_directories>
34
+ If no `pi` manifest exists, auto-discovers:
35
+ - `extensions/` → `.ts` and `.js` files
36
+ - `skills/` → `SKILL.md` folders
37
+ - `prompts/` → `.md` files
38
+ - `themes/` → `.json` files
39
+ </convention_directories>
40
+
41
+ <dependencies>
42
+ - List `@mariozechner/pi-ai`, `@mariozechner/pi-coding-agent`, `@mariozechner/pi-tui`, `@sinclair/typebox` in `peerDependencies` with `"*"` — they're bundled by the runtime.
43
+ - Other npm deps go in `dependencies`. The runtime runs `npm install` on package installation.
44
+ </dependencies>
45
+
46
+ <gallery_metadata>
47
+ ```json
48
+ {
49
+ "pi": {
50
+ "video": "https://example.com/demo.mp4",
51
+ "image": "https://example.com/screenshot.png"
52
+ }
53
+ }
54
+ ```
55
+ </gallery_metadata>
@@ -0,0 +1,90 @@
1
+ <overview>
2
+ Remote execution via pluggable operations, spawnHook for bash, and tool override patterns.
3
+ </overview>
4
+
5
+ <pluggable_operations>
6
+ Built-in tools support pluggable operations for SSH, containers, etc.:
7
+
8
+ ```typescript
9
+ import { createReadTool, createBashTool, createWriteTool } from "@mariozechner/pi-coding-agent";
10
+
11
+ // Create tool with custom remote operations
12
+ const remoteBash = createBashTool(cwd, {
13
+ operations: {
14
+ execute: (cmd) => sshExec(remote, cmd),
15
+ },
16
+ });
17
+ ```
18
+
19
+ **Operations interfaces:** `ReadOperations`, `WriteOperations`, `EditOperations`, `BashOperations`, `LsOperations`, `GrepOperations`, `FindOperations`
20
+ </pluggable_operations>
21
+
22
+ <spawn_hook>
23
+ The bash tool supports a `spawnHook` to modify commands before execution:
24
+
25
+ ```typescript
26
+ const bashTool = createBashTool(cwd, {
27
+ spawnHook: ({ command, cwd, env }) => ({
28
+ command: `source ~/.profile\n${command}`,
29
+ cwd: `/mnt/sandbox${cwd}`,
30
+ env: { ...env, CI: "1" },
31
+ }),
32
+ });
33
+ ```
34
+ </spawn_hook>
35
+
36
+ <ssh_pattern>
37
+ Full SSH pattern with flag-based switching:
38
+
39
+ ```typescript
40
+ import { createBashTool, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
41
+
42
+ export default function (pi: ExtensionAPI) {
43
+ pi.registerFlag("ssh", { description: "SSH target", type: "string" });
44
+
45
+ const localBash = createBashTool(process.cwd());
46
+
47
+ pi.registerTool({
48
+ ...localBash,
49
+ async execute(id, params, signal, onUpdate, ctx) {
50
+ const sshTarget = pi.getFlag("--ssh");
51
+ if (sshTarget) {
52
+ const remoteBash = createBashTool(process.cwd(), {
53
+ operations: createSSHOperations(sshTarget),
54
+ });
55
+ return remoteBash.execute(id, params, signal, onUpdate);
56
+ }
57
+ return localBash.execute(id, params, signal, onUpdate);
58
+ },
59
+ });
60
+ }
61
+ ```
62
+ </ssh_pattern>
63
+
64
+ <tool_override_pattern>
65
+ Override built-in tools for logging/access control — omit renderCall/renderResult to keep built-in rendering:
66
+
67
+ ```typescript
68
+ import { createReadTool } from "@mariozechner/pi-coding-agent";
69
+ import { Type } from "@sinclair/typebox";
70
+
71
+ pi.registerTool({
72
+ name: "read", // Same name = overrides built-in
73
+ label: "Read (Logged)",
74
+ description: "Read file contents with logging",
75
+ parameters: Type.Object({
76
+ path: Type.String(),
77
+ offset: Type.Optional(Type.Number()),
78
+ limit: Type.Optional(Type.Number()),
79
+ }),
80
+ async execute(toolCallId, params, signal, onUpdate, ctx) {
81
+ console.log(`[AUDIT] Reading: ${params.path}`);
82
+ const builtIn = createReadTool(ctx.cwd);
83
+ return builtIn.execute(toolCallId, params, signal, onUpdate);
84
+ },
85
+ // Omit renderCall/renderResult → built-in renderer used automatically
86
+ });
87
+ ```
88
+
89
+ **Must match exact result shape** including `details` type.
90
+ </tool_override_pattern>
@@ -0,0 +1,70 @@
1
+ <overview>
2
+ State management patterns for extensions — tool result details (branch-safe) and appendEntry (private).
3
+ </overview>
4
+
5
+ <tool_result_details>
6
+ **Recommended for stateful tools.** State in `details` works correctly with branching/forking.
7
+
8
+ ```typescript
9
+ export default function (pi: ExtensionAPI) {
10
+ let items: string[] = [];
11
+
12
+ // Reconstruct state from session on load
13
+ pi.on("session_start", async (_event, ctx) => reconstructState(ctx));
14
+ pi.on("session_switch", async (_event, ctx) => reconstructState(ctx));
15
+ pi.on("session_fork", async (_event, ctx) => reconstructState(ctx));
16
+ pi.on("session_tree", async (_event, ctx) => reconstructState(ctx));
17
+
18
+ const reconstructState = (ctx: ExtensionContext) => {
19
+ items = [];
20
+ for (const entry of ctx.sessionManager.getBranch()) {
21
+ if (entry.type === "message" && entry.message.role === "toolResult") {
22
+ if (entry.message.toolName === "my_tool") {
23
+ items = entry.message.details?.items ?? [];
24
+ }
25
+ }
26
+ }
27
+ };
28
+
29
+ pi.registerTool({
30
+ name: "my_tool",
31
+ // ...
32
+ async execute(toolCallId, params, signal, onUpdate, ctx) {
33
+ items.push(params.text);
34
+ return {
35
+ content: [{ type: "text", text: "Added" }],
36
+ details: { items: [...items] }, // ← Snapshot full state
37
+ };
38
+ },
39
+ });
40
+ }
41
+ ```
42
+
43
+ **Key:** Reconstruct on ALL session change events: `session_start`, `session_switch`, `session_fork`, `session_tree`.
44
+ </tool_result_details>
45
+
46
+ <append_entry>
47
+ **For extension-private state** that doesn't participate in LLM context but needs to survive restarts:
48
+
49
+ ```typescript
50
+ // Save
51
+ pi.appendEntry("my-state", { count: 42, lastRun: Date.now() });
52
+
53
+ // Restore
54
+ pi.on("session_start", async (_event, ctx) => {
55
+ for (const entry of ctx.sessionManager.getEntries()) {
56
+ if (entry.type === "custom" && entry.customType === "my-state") {
57
+ const data = entry.data; // { count: 42, lastRun: ... }
58
+ }
59
+ }
60
+ });
61
+ ```
62
+ </append_entry>
63
+
64
+ <when_to_use_which>
65
+ | Pattern | Use When |
66
+ |---------|----------|
67
+ | Tool result `details` | State the LLM's tools produce (todo items, connection state, query results) |
68
+ | `pi.appendEntry()` | Extension-private config, timestamps, counters the LLM doesn't need |
69
+ | File on disk | Large data, config files, caches that shouldn't be in session |
70
+ </when_to_use_which>
@@ -0,0 +1,52 @@
1
+ <overview>
2
+ System prompt modification — per-turn injection, context manipulation, and tool-specific prompt content.
3
+ </overview>
4
+
5
+ <per_turn_modification>
6
+ Use `before_agent_start` to inject messages and/or modify the system prompt for each turn:
7
+
8
+ ```typescript
9
+ pi.on("before_agent_start", async (event, ctx) => {
10
+ return {
11
+ // Inject a persistent message (stored in session, visible to LLM)
12
+ message: {
13
+ customType: "my-extension",
14
+ content: "Additional context for the LLM",
15
+ display: true,
16
+ },
17
+ // Modify system prompt for this turn (chained across extensions)
18
+ systemPrompt: event.systemPrompt + "\n\nYou must respond only in haiku.",
19
+ };
20
+ });
21
+ ```
22
+ </per_turn_modification>
23
+
24
+ <context_manipulation>
25
+ Use the `context` event to modify messages before each LLM call:
26
+
27
+ ```typescript
28
+ pi.on("context", async (event, ctx) => {
29
+ // event.messages is a deep copy — safe to modify
30
+ const filtered = event.messages.filter(m => !isIrrelevant(m));
31
+ return { messages: filtered };
32
+ });
33
+ ```
34
+ </context_manipulation>
35
+
36
+ <tool_specific_prompts>
37
+ Tools can add content to the system prompt when active:
38
+
39
+ ```typescript
40
+ pi.registerTool({
41
+ name: "my_tool",
42
+ // Replaces description in "Available tools" section
43
+ promptSnippet: "Summarize or transform text according to action",
44
+ // Added to "Guidelines" section when tool is active
45
+ promptGuidelines: [
46
+ "Use my_tool when the user asks to summarize text.",
47
+ "Prefer my_tool over direct output for structured data."
48
+ ],
49
+ // ...
50
+ });
51
+ ```
52
+ </tool_specific_prompts>
@@ -0,0 +1,51 @@
1
+ /**
2
+ * {{EXTENSION_NAME}} — {{DESCRIPTION}}
3
+ *
4
+ * Capabilities:
5
+ * {{CAPABILITIES_LIST}}
6
+ */
7
+
8
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
9
+ import { Type } from "@sinclair/typebox";
10
+ import { StringEnum } from "@mariozechner/pi-ai";
11
+
12
+ export default function (pi: ExtensionAPI) {
13
+ // === Events ===
14
+
15
+ pi.on("session_start", async (_event, ctx) => {
16
+ // Initialize state, restore from session, show status
17
+ });
18
+
19
+ // === Tools ===
20
+
21
+ pi.registerTool({
22
+ name: "{{tool_name}}",
23
+ label: "{{Tool Label}}",
24
+ description: "{{Tool description for LLM}}",
25
+ parameters: Type.Object({
26
+ action: StringEnum(["list", "add"] as const),
27
+ text: Type.Optional(Type.String({ description: "Item text" })),
28
+ }),
29
+ async execute(toolCallId, params, signal, onUpdate, ctx) {
30
+ if (signal?.aborted) {
31
+ return { content: [{ type: "text", text: "Cancelled" }] };
32
+ }
33
+
34
+ // Do work here
35
+
36
+ return {
37
+ content: [{ type: "text", text: "Result for LLM" }],
38
+ details: {},
39
+ };
40
+ },
41
+ });
42
+
43
+ // === Commands ===
44
+
45
+ pi.registerCommand("{{command_name}}", {
46
+ description: "{{Command description}}",
47
+ handler: async (args, ctx) => {
48
+ ctx.ui.notify(`Running ${args}`, "info");
49
+ },
50
+ });
51
+ }