precursor-ai 2026.7.0__tar.gz

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 (540) hide show
  1. precursor_ai-2026.7.0/.editorconfig +12 -0
  2. precursor_ai-2026.7.0/.env.example +35 -0
  3. precursor_ai-2026.7.0/.github/ISSUE_TEMPLATE/bug_report.yml +63 -0
  4. precursor_ai-2026.7.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. precursor_ai-2026.7.0/.github/ISSUE_TEMPLATE/feature_request.yml +38 -0
  6. precursor_ai-2026.7.0/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  7. precursor_ai-2026.7.0/.github/copilot-instructions.md +156 -0
  8. precursor_ai-2026.7.0/.github/dependabot.yml +44 -0
  9. precursor_ai-2026.7.0/.github/prompts/release.prompt.md +51 -0
  10. precursor_ai-2026.7.0/.github/prompts/ship-change.prompt.md +39 -0
  11. precursor_ai-2026.7.0/.github/workflows/ci.yml +72 -0
  12. precursor_ai-2026.7.0/.github/workflows/pages.yml +61 -0
  13. precursor_ai-2026.7.0/.github/workflows/release.yml +110 -0
  14. precursor_ai-2026.7.0/.gitignore +60 -0
  15. precursor_ai-2026.7.0/.impeccable/config.json +26 -0
  16. precursor_ai-2026.7.0/.impeccable/hook.cache.json +1 -0
  17. precursor_ai-2026.7.0/CHANGELOG.md +369 -0
  18. precursor_ai-2026.7.0/CONTRIBUTING.md +129 -0
  19. precursor_ai-2026.7.0/LICENSE +21 -0
  20. precursor_ai-2026.7.0/Makefile +57 -0
  21. precursor_ai-2026.7.0/PKG-INFO +271 -0
  22. precursor_ai-2026.7.0/README.md +233 -0
  23. precursor_ai-2026.7.0/RELEASING.md +105 -0
  24. precursor_ai-2026.7.0/SECURITY.md +31 -0
  25. precursor_ai-2026.7.0/alembic.ini +47 -0
  26. precursor_ai-2026.7.0/docs/architecture.md +368 -0
  27. precursor_ai-2026.7.0/docs/live-meeting-assistant.md +96 -0
  28. precursor_ai-2026.7.0/docs/plugins.md +79 -0
  29. precursor_ai-2026.7.0/frontend/dist/assets/abnfDiagram-VRR7QNED-8eH-JFcy.js +1 -0
  30. precursor_ai-2026.7.0/frontend/dist/assets/arc-B646etem.js +1 -0
  31. precursor_ai-2026.7.0/frontend/dist/assets/architecture-TIHT7OUA-C2MdFPwk.js +1 -0
  32. precursor_ai-2026.7.0/frontend/dist/assets/architectureDiagram-ZJ3FMSHR-l0KQH1Yt.js +36 -0
  33. precursor_ai-2026.7.0/frontend/dist/assets/array-BifhSqXX.js +1 -0
  34. precursor_ai-2026.7.0/frontend/dist/assets/blockDiagram-677ZJIJ3-D8wVu_Wz.js +132 -0
  35. precursor_ai-2026.7.0/frontend/dist/assets/c4Diagram-LMCZKHZV-DIED2ou9.js +10 -0
  36. precursor_ai-2026.7.0/frontend/dist/assets/channel-_MjatZHN.js +1 -0
  37. precursor_ai-2026.7.0/frontend/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  38. precursor_ai-2026.7.0/frontend/dist/assets/chunk-32BRIVSS-B8CLHOxy.js +1 -0
  39. precursor_ai-2026.7.0/frontend/dist/assets/chunk-52WLFC77-vi_uNvUR.js +10 -0
  40. precursor_ai-2026.7.0/frontend/dist/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  41. precursor_ai-2026.7.0/frontend/dist/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  42. precursor_ai-2026.7.0/frontend/dist/assets/chunk-C7G6YPKG-oqVqIkDe.js +1 -0
  43. precursor_ai-2026.7.0/frontend/dist/assets/chunk-EX3LRPZG-BDbdHh1Q.js +231 -0
  44. precursor_ai-2026.7.0/frontend/dist/assets/chunk-FWX5IMBZ-D4A7F4vw.js +2 -0
  45. precursor_ai-2026.7.0/frontend/dist/assets/chunk-HOUHSVGY-CmHms1m5.js +1 -0
  46. precursor_ai-2026.7.0/frontend/dist/assets/chunk-ICXQ74PX-BK9SdEk1.js +2 -0
  47. precursor_ai-2026.7.0/frontend/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  48. precursor_ai-2026.7.0/frontend/dist/assets/chunk-KEIR6QF5-Dj-OpFgW.js +161 -0
  49. precursor_ai-2026.7.0/frontend/dist/assets/chunk-MOJQB5TN-BYR8QyTJ.js +88 -0
  50. precursor_ai-2026.7.0/frontend/dist/assets/chunk-OGEWGWER-Dy2bNPVL.js +1 -0
  51. precursor_ai-2026.7.0/frontend/dist/assets/chunk-PUDLZKDR-DnxCt17b.js +156 -0
  52. precursor_ai-2026.7.0/frontend/dist/assets/chunk-Q4XR5HBZ-AmUS9ANX.js +70 -0
  53. precursor_ai-2026.7.0/frontend/dist/assets/chunk-RYQCIY6F-4P3gUyDb.js +1 -0
  54. precursor_ai-2026.7.0/frontend/dist/assets/chunk-V7JOEXUC-DO13Cb8i.js +206 -0
  55. precursor_ai-2026.7.0/frontend/dist/assets/chunk-VAUOI2AC-aEdS9dbJ.js +1 -0
  56. precursor_ai-2026.7.0/frontend/dist/assets/chunk-VR4S4FIN-B-RVDyMv.js +1 -0
  57. precursor_ai-2026.7.0/frontend/dist/assets/chunk-WYO6CB5R-CebLxzzA.js +125 -0
  58. precursor_ai-2026.7.0/frontend/dist/assets/chunk-XXDRQBXY-C1bTmJTP.js +1 -0
  59. precursor_ai-2026.7.0/frontend/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  60. precursor_ai-2026.7.0/frontend/dist/assets/chunk-ZGVPDNZ5-BT5e5VPo.js +62 -0
  61. precursor_ai-2026.7.0/frontend/dist/assets/chunk-ZIRB5QZD-C6fEPe3t.js +32 -0
  62. precursor_ai-2026.7.0/frontend/dist/assets/classDiagram-OUVF2IWQ-DPLnyamp.js +1 -0
  63. precursor_ai-2026.7.0/frontend/dist/assets/classDiagram-v2-EOCWNBFH-DPLnyamp.js +1 -0
  64. precursor_ai-2026.7.0/frontend/dist/assets/cose-bilkent-JH36ORCC-DUHWOPnM.js +1 -0
  65. precursor_ai-2026.7.0/frontend/dist/assets/cynefin-VYW2F7L2-Chl7Mfqb.js +1 -0
  66. precursor_ai-2026.7.0/frontend/dist/assets/cynefinDiagram-TSTJHNR4-BsqDoPdi.js +62 -0
  67. precursor_ai-2026.7.0/frontend/dist/assets/cytoscape.esm-CQFVGiJu.js +321 -0
  68. precursor_ai-2026.7.0/frontend/dist/assets/dagre-VKFMJZFB-c2EyI3Fu.js +4 -0
  69. precursor_ai-2026.7.0/frontend/dist/assets/dagre-dpRSp0QF.js +1 -0
  70. precursor_ai-2026.7.0/frontend/dist/assets/defaultLocale-C8Fc0cco.js +1 -0
  71. precursor_ai-2026.7.0/frontend/dist/assets/diagram-FQU43EPY-kRvPjRSG.js +3 -0
  72. precursor_ai-2026.7.0/frontend/dist/assets/diagram-G47NLZAW-DrPkfD6W.js +24 -0
  73. precursor_ai-2026.7.0/frontend/dist/assets/diagram-NH7WQ7WH-DJWqMllx.js +24 -0
  74. precursor_ai-2026.7.0/frontend/dist/assets/diagram-OA4YK3LP-CF-vqOyG.js +30 -0
  75. precursor_ai-2026.7.0/frontend/dist/assets/diagram-WEI45ONY-BXjXBYBi.js +41 -0
  76. precursor_ai-2026.7.0/frontend/dist/assets/dist-CHE2FhNa.js +1 -0
  77. precursor_ai-2026.7.0/frontend/dist/assets/ebnfDiagram-CCIWWBDH-C1c8k_TO.js +1 -0
  78. precursor_ai-2026.7.0/frontend/dist/assets/erDiagram-Q63AITRT-DWuXmssN.js +85 -0
  79. precursor_ai-2026.7.0/frontend/dist/assets/eventmodeling-45OFAUF4-DWW4bBGm.js +1 -0
  80. precursor_ai-2026.7.0/frontend/dist/assets/flowDiagram-23GEKE2U-DnoRymzP.js +1 -0
  81. precursor_ai-2026.7.0/frontend/dist/assets/ganttDiagram-NO4QXBWP-Cfw_yaAL.js +292 -0
  82. precursor_ai-2026.7.0/frontend/dist/assets/gitGraph-TEB2WS4Q-CvFbEGLF.js +1 -0
  83. precursor_ai-2026.7.0/frontend/dist/assets/gitGraphDiagram-IHSO6WYX-DZBfb6x8.js +106 -0
  84. precursor_ai-2026.7.0/frontend/dist/assets/graphlib-DS17s2tU.js +1 -0
  85. precursor_ai-2026.7.0/frontend/dist/assets/index-Ce0_SCpn.css +2 -0
  86. precursor_ai-2026.7.0/frontend/dist/assets/index-CwqE7Qsi.js +65 -0
  87. precursor_ai-2026.7.0/frontend/dist/assets/info-DKCQHKI2-VkxOpYKM.js +1 -0
  88. precursor_ai-2026.7.0/frontend/dist/assets/infoDiagram-FWYZ7A6U-CgMcnRVu.js +2 -0
  89. precursor_ai-2026.7.0/frontend/dist/assets/init-D6jRqBbL.js +1 -0
  90. precursor_ai-2026.7.0/frontend/dist/assets/ishikawaDiagram-FXEZZL3T-CivPtJtF.js +70 -0
  91. precursor_ai-2026.7.0/frontend/dist/assets/journeyDiagram-5HDEW3XC-DCB3BYGg.js +139 -0
  92. precursor_ai-2026.7.0/frontend/dist/assets/kanban-definition-HUTT4EX6-DiKstbXF.js +89 -0
  93. precursor_ai-2026.7.0/frontend/dist/assets/katex-B7rAX3Vi.js +257 -0
  94. precursor_ai-2026.7.0/frontend/dist/assets/line-beULIPPc.js +1 -0
  95. precursor_ai-2026.7.0/frontend/dist/assets/linear-CLn3_xhg.js +1 -0
  96. precursor_ai-2026.7.0/frontend/dist/assets/map-BaFkSB1l.js +1 -0
  97. precursor_ai-2026.7.0/frontend/dist/assets/mermaid-parser.core-phaPNyBI.js +7 -0
  98. precursor_ai-2026.7.0/frontend/dist/assets/mermaid.core-DBZEh2v0.js +11 -0
  99. precursor_ai-2026.7.0/frontend/dist/assets/microsoft.cognitiveservices.speech.sdk-DTuwpYU7.js +22 -0
  100. precursor_ai-2026.7.0/frontend/dist/assets/mindmap-definition-LN4V7U3C-Dg6wd4a9.js +96 -0
  101. precursor_ai-2026.7.0/frontend/dist/assets/ordinal-hYBb2elL.js +1 -0
  102. precursor_ai-2026.7.0/frontend/dist/assets/packet-7NZHBO7P-B-xt1vek.js +1 -0
  103. precursor_ai-2026.7.0/frontend/dist/assets/path-BWPyau1x.js +1 -0
  104. precursor_ai-2026.7.0/frontend/dist/assets/pegDiagram-2B236MQR-C_QjCauy.js +1 -0
  105. precursor_ai-2026.7.0/frontend/dist/assets/pie-RZYD4A2V-CHOl6z81.js +1 -0
  106. precursor_ai-2026.7.0/frontend/dist/assets/pieDiagram-ENE6RG2P-9ZKtGnq0.js +39 -0
  107. precursor_ai-2026.7.0/frontend/dist/assets/quadrantDiagram-ABIIQ3AL-CQuZs40W.js +7 -0
  108. precursor_ai-2026.7.0/frontend/dist/assets/radar-I7S5WNFK-BSAnOlzV.js +1 -0
  109. precursor_ai-2026.7.0/frontend/dist/assets/railroad-3IZDKUUU-sB_gWeaZ.js +1 -0
  110. precursor_ai-2026.7.0/frontend/dist/assets/railroad-abnf-AHOZXSZD-By_Nq7we.js +1 -0
  111. precursor_ai-2026.7.0/frontend/dist/assets/railroad-ebnf-EBAXGLYW-Dp16YeUI.js +1 -0
  112. precursor_ai-2026.7.0/frontend/dist/assets/railroad-peg-LSFZ7HO6-hHZcyCQX.js +1 -0
  113. precursor_ai-2026.7.0/frontend/dist/assets/railroadDiagram-RFXS5EU6-CSsxT5US.js +1 -0
  114. precursor_ai-2026.7.0/frontend/dist/assets/requirementDiagram-TGXJPOKE-CX9H5l5a.js +84 -0
  115. precursor_ai-2026.7.0/frontend/dist/assets/rough.esm-CSKSodPl.js +1 -0
  116. precursor_ai-2026.7.0/frontend/dist/assets/sankeyDiagram-HTMAVEWB-BrkqlI4V.js +40 -0
  117. precursor_ai-2026.7.0/frontend/dist/assets/sequenceDiagram-DBY2YBRQ-CBGAc4pO.js +162 -0
  118. precursor_ai-2026.7.0/frontend/dist/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  119. precursor_ai-2026.7.0/frontend/dist/assets/src-uhs9siQF.js +1 -0
  120. precursor_ai-2026.7.0/frontend/dist/assets/stateDiagram-2N3HPSRC-umR6awOW.js +1 -0
  121. precursor_ai-2026.7.0/frontend/dist/assets/stateDiagram-v2-6OUMAXLB-BZSFawce.js +1 -0
  122. precursor_ai-2026.7.0/frontend/dist/assets/swimlanes-5IMT3BWC-BVeNnEev.js +2 -0
  123. precursor_ai-2026.7.0/frontend/dist/assets/swimlanesDiagram-G3AALYLV-BVjKjDQx.js +8 -0
  124. precursor_ai-2026.7.0/frontend/dist/assets/timeline-definition-FHXFAJF6-STAQZ5pE.js +120 -0
  125. precursor_ai-2026.7.0/frontend/dist/assets/treeView-QDETBFTQ-Cn1ckkmO.js +1 -0
  126. precursor_ai-2026.7.0/frontend/dist/assets/treemap-6X3UGDF4-CB-SAmlf.js +1 -0
  127. precursor_ai-2026.7.0/frontend/dist/assets/vennDiagram-L72KCM5P-gkcMUP5D.js +34 -0
  128. precursor_ai-2026.7.0/frontend/dist/assets/wardley-OPB4EBWU-DQ1oYZTj.js +1 -0
  129. precursor_ai-2026.7.0/frontend/dist/assets/wardleyDiagram-EHGQE667-DsUcIFCP.js +78 -0
  130. precursor_ai-2026.7.0/frontend/dist/assets/xychartDiagram-FW5EYKEG-PzbqUHbU.js +7 -0
  131. precursor_ai-2026.7.0/frontend/dist/index.html +15 -0
  132. precursor_ai-2026.7.0/frontend/dist/logo.legacy.svg +21 -0
  133. precursor_ai-2026.7.0/frontend/dist/logo.svg +13 -0
  134. precursor_ai-2026.7.0/frontend/index.html +14 -0
  135. precursor_ai-2026.7.0/frontend/package-lock.json +4310 -0
  136. precursor_ai-2026.7.0/frontend/package.json +34 -0
  137. precursor_ai-2026.7.0/frontend/public/logo.legacy.svg +21 -0
  138. precursor_ai-2026.7.0/frontend/public/logo.svg +13 -0
  139. precursor_ai-2026.7.0/frontend/src/App.tsx +2477 -0
  140. precursor_ai-2026.7.0/frontend/src/components/AboutModal.tsx +177 -0
  141. precursor_ai-2026.7.0/frontend/src/components/AgentList.tsx +182 -0
  142. precursor_ai-2026.7.0/frontend/src/components/AgentPermissionBody.tsx +115 -0
  143. precursor_ai-2026.7.0/frontend/src/components/AgentSettingsPanel.tsx +351 -0
  144. precursor_ai-2026.7.0/frontend/src/components/AgentStatusBadge.tsx +49 -0
  145. precursor_ai-2026.7.0/frontend/src/components/AgentTimeline.tsx +184 -0
  146. precursor_ai-2026.7.0/frontend/src/components/AgentUsage.tsx +183 -0
  147. precursor_ai-2026.7.0/frontend/src/components/AgentView.tsx +1420 -0
  148. precursor_ai-2026.7.0/frontend/src/components/AgentsSettings.tsx +316 -0
  149. precursor_ai-2026.7.0/frontend/src/components/ArchivePanel.tsx +460 -0
  150. precursor_ai-2026.7.0/frontend/src/components/ChatList.tsx +230 -0
  151. precursor_ai-2026.7.0/frontend/src/components/ChatPanel.tsx +1234 -0
  152. precursor_ai-2026.7.0/frontend/src/components/ChatSessionPanel.tsx +751 -0
  153. precursor_ai-2026.7.0/frontend/src/components/ChatSettingsPanel.tsx +291 -0
  154. precursor_ai-2026.7.0/frontend/src/components/ChatStatsPanel.tsx +318 -0
  155. precursor_ai-2026.7.0/frontend/src/components/CollapsibleSection.tsx +74 -0
  156. precursor_ai-2026.7.0/frontend/src/components/CommandDraftCard.tsx +128 -0
  157. precursor_ai-2026.7.0/frontend/src/components/CommandPalette.tsx +509 -0
  158. precursor_ai-2026.7.0/frontend/src/components/CommandPanel.tsx +270 -0
  159. precursor_ai-2026.7.0/frontend/src/components/Composer.tsx +506 -0
  160. precursor_ai-2026.7.0/frontend/src/components/ComposerModelControls.tsx +435 -0
  161. precursor_ai-2026.7.0/frontend/src/components/ConfirmDialog.tsx +178 -0
  162. precursor_ai-2026.7.0/frontend/src/components/ContextSection.tsx +369 -0
  163. precursor_ai-2026.7.0/frontend/src/components/CopyableMarkdown.tsx +96 -0
  164. precursor_ai-2026.7.0/frontend/src/components/DetachedCommandController.tsx +64 -0
  165. precursor_ai-2026.7.0/frontend/src/components/DetachedDraftHost.tsx +32 -0
  166. precursor_ai-2026.7.0/frontend/src/components/DetachedNotesController.tsx +210 -0
  167. precursor_ai-2026.7.0/frontend/src/components/DetachedWindowPortal.tsx +133 -0
  168. precursor_ai-2026.7.0/frontend/src/components/DevicePicker.tsx +108 -0
  169. precursor_ai-2026.7.0/frontend/src/components/FeaturePicker.tsx +91 -0
  170. precursor_ai-2026.7.0/frontend/src/components/FileTree.tsx +328 -0
  171. precursor_ai-2026.7.0/frontend/src/components/GitDiffViewer.tsx +270 -0
  172. precursor_ai-2026.7.0/frontend/src/components/HomePage.tsx +378 -0
  173. precursor_ai-2026.7.0/frontend/src/components/InlineTitle.tsx +101 -0
  174. precursor_ai-2026.7.0/frontend/src/components/IssuePreviewModal.tsx +475 -0
  175. precursor_ai-2026.7.0/frontend/src/components/IssueStatusBadge.tsx +89 -0
  176. precursor_ai-2026.7.0/frontend/src/components/IssueTags.tsx +49 -0
  177. precursor_ai-2026.7.0/frontend/src/components/KanbanBoard.tsx +485 -0
  178. precursor_ai-2026.7.0/frontend/src/components/ListSelection.tsx +87 -0
  179. precursor_ai-2026.7.0/frontend/src/components/LiveAudioHelp.tsx +220 -0
  180. precursor_ai-2026.7.0/frontend/src/components/LiveChatSection.tsx +20 -0
  181. precursor_ai-2026.7.0/frontend/src/components/LiveList.tsx +172 -0
  182. precursor_ai-2026.7.0/frontend/src/components/LivePanel.tsx +339 -0
  183. precursor_ai-2026.7.0/frontend/src/components/LiveStartHero.tsx +348 -0
  184. precursor_ai-2026.7.0/frontend/src/components/LiveView.tsx +1258 -0
  185. precursor_ai-2026.7.0/frontend/src/components/Markdown.tsx +218 -0
  186. precursor_ai-2026.7.0/frontend/src/components/McpAuthBanner.tsx +67 -0
  187. precursor_ai-2026.7.0/frontend/src/components/MeetingBody.tsx +25 -0
  188. precursor_ai-2026.7.0/frontend/src/components/MemoriesTab.tsx +249 -0
  189. precursor_ai-2026.7.0/frontend/src/components/MermaidBlock.tsx +134 -0
  190. precursor_ai-2026.7.0/frontend/src/components/MessageBubble.tsx +478 -0
  191. precursor_ai-2026.7.0/frontend/src/components/MessageMeta.tsx +92 -0
  192. precursor_ai-2026.7.0/frontend/src/components/Modal.tsx +81 -0
  193. precursor_ai-2026.7.0/frontend/src/components/NotesPanel.tsx +307 -0
  194. precursor_ai-2026.7.0/frontend/src/components/NotesSection.tsx +175 -0
  195. precursor_ai-2026.7.0/frontend/src/components/PersonaMenu.tsx +231 -0
  196. precursor_ai-2026.7.0/frontend/src/components/ProjectList.tsx +73 -0
  197. precursor_ai-2026.7.0/frontend/src/components/RecurrenceEditor.tsx +200 -0
  198. precursor_ai-2026.7.0/frontend/src/components/RefineButton.tsx +56 -0
  199. precursor_ai-2026.7.0/frontend/src/components/RefineTextarea.tsx +89 -0
  200. precursor_ai-2026.7.0/frontend/src/components/ReminderBanner.tsx +34 -0
  201. precursor_ai-2026.7.0/frontend/src/components/ReminderModal.tsx +289 -0
  202. precursor_ai-2026.7.0/frontend/src/components/ResizeHandle.tsx +19 -0
  203. precursor_ai-2026.7.0/frontend/src/components/RoleSelector.tsx +98 -0
  204. precursor_ai-2026.7.0/frontend/src/components/RolesTab.tsx +246 -0
  205. precursor_ai-2026.7.0/frontend/src/components/Select.tsx +148 -0
  206. precursor_ai-2026.7.0/frontend/src/components/SettingsPanel.tsx +2227 -0
  207. precursor_ai-2026.7.0/frontend/src/components/Sidebar.tsx +1043 -0
  208. precursor_ai-2026.7.0/frontend/src/components/SidebarTabs.tsx +61 -0
  209. precursor_ai-2026.7.0/frontend/src/components/SkillsTab.tsx +344 -0
  210. precursor_ai-2026.7.0/frontend/src/components/SlashCommandPicker.tsx +80 -0
  211. precursor_ai-2026.7.0/frontend/src/components/SpeakerNamePicker.tsx +111 -0
  212. precursor_ai-2026.7.0/frontend/src/components/StartHero.tsx +125 -0
  213. precursor_ai-2026.7.0/frontend/src/components/StatsTab.tsx +478 -0
  214. precursor_ai-2026.7.0/frontend/src/components/SuggestedReplies.tsx +41 -0
  215. precursor_ai-2026.7.0/frontend/src/components/SummarySection.tsx +283 -0
  216. precursor_ai-2026.7.0/frontend/src/components/SvgBlock.tsx +133 -0
  217. precursor_ai-2026.7.0/frontend/src/components/ToolCallBubble.tsx +88 -0
  218. precursor_ai-2026.7.0/frontend/src/components/Tooltip.tsx +155 -0
  219. precursor_ai-2026.7.0/frontend/src/components/TopicCreateForm.tsx +224 -0
  220. precursor_ai-2026.7.0/frontend/src/components/TopicPicker.tsx +175 -0
  221. precursor_ai-2026.7.0/frontend/src/components/TopicSettingsPanel.tsx +759 -0
  222. precursor_ai-2026.7.0/frontend/src/components/TranslationSection.tsx +129 -0
  223. precursor_ai-2026.7.0/frontend/src/components/WeekdayPicker.tsx +74 -0
  224. precursor_ai-2026.7.0/frontend/src/components/WorkspaceChat.tsx +489 -0
  225. precursor_ai-2026.7.0/frontend/src/components/WorkspaceList.tsx +69 -0
  226. precursor_ai-2026.7.0/frontend/src/components/WorkspaceView.tsx +946 -0
  227. precursor_ai-2026.7.0/frontend/src/components/icons/GithubIcon.tsx +26 -0
  228. precursor_ai-2026.7.0/frontend/src/index.css +493 -0
  229. precursor_ai-2026.7.0/frontend/src/lib/api.ts +896 -0
  230. precursor_ai-2026.7.0/frontend/src/lib/attachments.ts +37 -0
  231. precursor_ai-2026.7.0/frontend/src/lib/clientId.ts +21 -0
  232. precursor_ai-2026.7.0/frontend/src/lib/commands.ts +395 -0
  233. precursor_ai-2026.7.0/frontend/src/lib/constants.ts +41 -0
  234. precursor_ai-2026.7.0/frontend/src/lib/detachedDraftStore.ts +108 -0
  235. precursor_ai-2026.7.0/frontend/src/lib/events.ts +149 -0
  236. precursor_ai-2026.7.0/frontend/src/lib/mcpAuth.ts +59 -0
  237. precursor_ai-2026.7.0/frontend/src/lib/modelsStore.ts +94 -0
  238. precursor_ai-2026.7.0/frontend/src/lib/notifications.ts +58 -0
  239. precursor_ai-2026.7.0/frontend/src/lib/plugins.ts +38 -0
  240. precursor_ai-2026.7.0/frontend/src/lib/rolesStore.ts +70 -0
  241. precursor_ai-2026.7.0/frontend/src/lib/searchHighlight.tsx +135 -0
  242. precursor_ai-2026.7.0/frontend/src/lib/sections.ts +86 -0
  243. precursor_ai-2026.7.0/frontend/src/lib/settingsStore.ts +71 -0
  244. precursor_ai-2026.7.0/frontend/src/lib/skillsStore.ts +59 -0
  245. precursor_ai-2026.7.0/frontend/src/lib/sse.ts +187 -0
  246. precursor_ai-2026.7.0/frontend/src/lib/streamStore.ts +412 -0
  247. precursor_ai-2026.7.0/frontend/src/lib/suggestions.ts +40 -0
  248. precursor_ai-2026.7.0/frontend/src/lib/theme.ts +27 -0
  249. precursor_ai-2026.7.0/frontend/src/lib/toolMeta.ts +19 -0
  250. precursor_ai-2026.7.0/frontend/src/lib/types.ts +1084 -0
  251. precursor_ai-2026.7.0/frontend/src/lib/useAzureSpeech.ts +268 -0
  252. precursor_ai-2026.7.0/frontend/src/lib/useChatScroll.ts +87 -0
  253. precursor_ai-2026.7.0/frontend/src/lib/useConversationTranscriber.ts +382 -0
  254. precursor_ai-2026.7.0/frontend/src/lib/useFloatingWindow.ts +163 -0
  255. precursor_ai-2026.7.0/frontend/src/lib/useIssueContext.ts +154 -0
  256. precursor_ai-2026.7.0/frontend/src/lib/useMessageDeletion.ts +86 -0
  257. precursor_ai-2026.7.0/frontend/src/lib/useMultiSelect.ts +83 -0
  258. precursor_ai-2026.7.0/frontend/src/lib/useNotesDraft.ts +347 -0
  259. precursor_ai-2026.7.0/frontend/src/lib/usePendingAttachments.ts +99 -0
  260. precursor_ai-2026.7.0/frontend/src/lib/useRefine.ts +71 -0
  261. precursor_ai-2026.7.0/frontend/src/lib/useReminders.ts +101 -0
  262. precursor_ai-2026.7.0/frontend/src/lib/useResizableBox.ts +98 -0
  263. precursor_ai-2026.7.0/frontend/src/lib/useResizableHeight.ts +75 -0
  264. precursor_ai-2026.7.0/frontend/src/lib/useResizableWidth.ts +75 -0
  265. precursor_ai-2026.7.0/frontend/src/lib/useWindowedMessages.ts +156 -0
  266. precursor_ai-2026.7.0/frontend/src/lib/workiqSignIn.ts +87 -0
  267. precursor_ai-2026.7.0/frontend/src/main.tsx +16 -0
  268. precursor_ai-2026.7.0/frontend/src/vite-env.d.ts +1 -0
  269. precursor_ai-2026.7.0/frontend/tsconfig.json +23 -0
  270. precursor_ai-2026.7.0/frontend/tsconfig.node.json +11 -0
  271. precursor_ai-2026.7.0/frontend/vite.config.ts +30 -0
  272. precursor_ai-2026.7.0/hatch_build.py +35 -0
  273. precursor_ai-2026.7.0/precursor/__init__.py +29 -0
  274. precursor_ai-2026.7.0/precursor/_version.py +24 -0
  275. precursor_ai-2026.7.0/precursor/backend/__init__.py +1 -0
  276. precursor_ai-2026.7.0/precursor/backend/__main__.py +578 -0
  277. precursor_ai-2026.7.0/precursor/backend/alembic/env.py +62 -0
  278. precursor_ai-2026.7.0/precursor/backend/alembic/script.py.mako +27 -0
  279. precursor_ai-2026.7.0/precursor/backend/alembic/versions/.keep +6 -0
  280. precursor_ai-2026.7.0/precursor/backend/alembic/versions/0001_baseline.py +438 -0
  281. precursor_ai-2026.7.0/precursor/backend/alembic/versions/0ab504427707_drop_agent_streaming_column.py +36 -0
  282. precursor_ai-2026.7.0/precursor/backend/alembic/versions/0c1254639726_add_note_draft_attachments.py +62 -0
  283. precursor_ai-2026.7.0/precursor/backend/alembic/versions/0fd63760742a_add_agent_sessions.py +77 -0
  284. precursor_ai-2026.7.0/precursor/backend/alembic/versions/22ce95ab9f0a_add_meeting_attachments_table.py +64 -0
  285. precursor_ai-2026.7.0/precursor/backend/alembic/versions/2b00968ac335_add_agent_events_timeline_archive.py +48 -0
  286. precursor_ai-2026.7.0/precursor/backend/alembic/versions/2ec08130160f_meeting_session_attendees.py +34 -0
  287. precursor_ai-2026.7.0/precursor/backend/alembic/versions/38e2b7f39f6c_add_context_notes_json_to_meeting_.py +34 -0
  288. precursor_ai-2026.7.0/precursor/backend/alembic/versions/4083e9c16be8_add_chat_id_to_meeting_sessions.py +36 -0
  289. precursor_ai-2026.7.0/precursor/backend/alembic/versions/4cc067ddf339_meeting_session_external_meeting_link.py +31 -0
  290. precursor_ai-2026.7.0/precursor/backend/alembic/versions/4fbf2183a9da_add_meeting_session_archiving.py +33 -0
  291. precursor_ai-2026.7.0/precursor/backend/alembic/versions/5c8e2aeaa48d_meeting_session_speaker_names_map.py +34 -0
  292. precursor_ai-2026.7.0/precursor/backend/alembic/versions/64f57b15c12d_add_skill_enablement_columns.py +33 -0
  293. precursor_ai-2026.7.0/precursor/backend/alembic/versions/7ef20a82eb10_add_agent_archiving_and_message_agent_.py +45 -0
  294. precursor_ai-2026.7.0/precursor/backend/alembic/versions/949c707eb929_add_agent_schedule.py +71 -0
  295. precursor_ai-2026.7.0/precursor/backend/alembic/versions/9633c13db421_add_notes_to_meeting_sessions.py +33 -0
  296. precursor_ai-2026.7.0/precursor/backend/alembic/versions/9f842f526300_live_meeting_assistant_sessions.py +114 -0
  297. precursor_ai-2026.7.0/precursor/backend/alembic/versions/a1b2c3d4e5f6_add_role_id_to_live_and_agents.py +40 -0
  298. precursor_ai-2026.7.0/precursor/backend/alembic/versions/a5eb51059e1e_add_message_model_and_elapsed_ms.py +33 -0
  299. precursor_ai-2026.7.0/precursor/backend/alembic/versions/b548d127e6b3_add_features_to_meeting_sessions.py +43 -0
  300. precursor_ai-2026.7.0/precursor/backend/alembic/versions/c04d5ffe8e4c_add_agent_active_prompt_and_streaming_.py +35 -0
  301. precursor_ai-2026.7.0/precursor/backend/alembic/versions/c7a1e2b3d4f5_scheduled_topics_to_schedule.py +43 -0
  302. precursor_ai-2026.7.0/precursor/backend/alembic/versions/cf7e6a63db17_add_note_drafts.py +60 -0
  303. precursor_ai-2026.7.0/precursor/backend/alembic/versions/d1b38ab39d00_add_meeting_sessions_topic_summary.py +31 -0
  304. precursor_ai-2026.7.0/precursor/backend/alembic/versions/df4618970b0e_add_message_suggestions.py +31 -0
  305. precursor_ai-2026.7.0/precursor/backend/alembic/versions/e1a2c3d4b5f6_add_agent_last_read_at.py +34 -0
  306. precursor_ai-2026.7.0/precursor/backend/alembic/versions/f1a2b3c4d5e6_move_attachments_to_disk.py +84 -0
  307. precursor_ai-2026.7.0/precursor/backend/alembic/versions/f4d0de85d7e4_add_meeting_sessions_summary_posted_.py +39 -0
  308. precursor_ai-2026.7.0/precursor/backend/banner.py +131 -0
  309. precursor_ai-2026.7.0/precursor/backend/config.py +196 -0
  310. precursor_ai-2026.7.0/precursor/backend/db.py +177 -0
  311. precursor_ai-2026.7.0/precursor/backend/logging_config.py +162 -0
  312. precursor_ai-2026.7.0/precursor/backend/main.py +336 -0
  313. precursor_ai-2026.7.0/precursor/backend/models/__init__.py +56 -0
  314. precursor_ai-2026.7.0/precursor/backend/models/agent_event.py +44 -0
  315. precursor_ai-2026.7.0/precursor/backend/models/agent_schedule.py +88 -0
  316. precursor_ai-2026.7.0/precursor/backend/models/agent_session.py +147 -0
  317. precursor_ai-2026.7.0/precursor/backend/models/attachment.py +51 -0
  318. precursor_ai-2026.7.0/precursor/backend/models/base.py +32 -0
  319. precursor_ai-2026.7.0/precursor/backend/models/chat.py +74 -0
  320. precursor_ai-2026.7.0/precursor/backend/models/issue_context.py +34 -0
  321. precursor_ai-2026.7.0/precursor/backend/models/mcp_server.py +27 -0
  322. precursor_ai-2026.7.0/precursor/backend/models/meeting.py +251 -0
  323. precursor_ai-2026.7.0/precursor/backend/models/memory.py +18 -0
  324. precursor_ai-2026.7.0/precursor/backend/models/message.py +99 -0
  325. precursor_ai-2026.7.0/precursor/backend/models/note_draft.py +50 -0
  326. precursor_ai-2026.7.0/precursor/backend/models/note_draft_attachment.py +32 -0
  327. precursor_ai-2026.7.0/precursor/backend/models/reminder.py +72 -0
  328. precursor_ai-2026.7.0/precursor/backend/models/role.py +31 -0
  329. precursor_ai-2026.7.0/precursor/backend/models/settings.py +16 -0
  330. precursor_ai-2026.7.0/precursor/backend/models/skill.py +39 -0
  331. precursor_ai-2026.7.0/precursor/backend/models/topic.py +113 -0
  332. precursor_ai-2026.7.0/precursor/backend/models/topic_schedule.py +85 -0
  333. precursor_ai-2026.7.0/precursor/backend/models/usage.py +42 -0
  334. precursor_ai-2026.7.0/precursor/backend/models/workspace.py +51 -0
  335. precursor_ai-2026.7.0/precursor/backend/plugins/__init__.py +26 -0
  336. precursor_ai-2026.7.0/precursor/backend/plugins/registry.py +70 -0
  337. precursor_ai-2026.7.0/precursor/backend/routers/__init__.py +5 -0
  338. precursor_ai-2026.7.0/precursor/backend/routers/agents.py +605 -0
  339. precursor_ai-2026.7.0/precursor/backend/routers/attachments.py +138 -0
  340. precursor_ai-2026.7.0/precursor/backend/routers/chat.py +234 -0
  341. precursor_ai-2026.7.0/precursor/backend/routers/chat_messages.py +376 -0
  342. precursor_ai-2026.7.0/precursor/backend/routers/chats.py +237 -0
  343. precursor_ai-2026.7.0/precursor/backend/routers/commands.py +788 -0
  344. precursor_ai-2026.7.0/precursor/backend/routers/deps.py +35 -0
  345. precursor_ai-2026.7.0/precursor/backend/routers/events.py +41 -0
  346. precursor_ai-2026.7.0/precursor/backend/routers/github.py +210 -0
  347. precursor_ai-2026.7.0/precursor/backend/routers/issue.py +90 -0
  348. precursor_ai-2026.7.0/precursor/backend/routers/live.py +901 -0
  349. precursor_ai-2026.7.0/precursor/backend/routers/llm.py +58 -0
  350. precursor_ai-2026.7.0/precursor/backend/routers/mcp.py +526 -0
  351. precursor_ai-2026.7.0/precursor/backend/routers/me.py +60 -0
  352. precursor_ai-2026.7.0/precursor/backend/routers/memories.py +48 -0
  353. precursor_ai-2026.7.0/precursor/backend/routers/projects.py +128 -0
  354. precursor_ai-2026.7.0/precursor/backend/routers/raw.py +37 -0
  355. precursor_ai-2026.7.0/precursor/backend/routers/refine.py +35 -0
  356. precursor_ai-2026.7.0/precursor/backend/routers/reminders.py +110 -0
  357. precursor_ai-2026.7.0/precursor/backend/routers/roles.py +126 -0
  358. precursor_ai-2026.7.0/precursor/backend/routers/search.py +21 -0
  359. precursor_ai-2026.7.0/precursor/backend/routers/settings.py +265 -0
  360. precursor_ai-2026.7.0/precursor/backend/routers/skills.py +121 -0
  361. precursor_ai-2026.7.0/precursor/backend/routers/stats.py +23 -0
  362. precursor_ai-2026.7.0/precursor/backend/routers/stt.py +93 -0
  363. precursor_ai-2026.7.0/precursor/backend/routers/summary.py +236 -0
  364. precursor_ai-2026.7.0/precursor/backend/routers/topics.py +459 -0
  365. precursor_ai-2026.7.0/precursor/backend/routers/version.py +42 -0
  366. precursor_ai-2026.7.0/precursor/backend/routers/workspaces.py +770 -0
  367. precursor_ai-2026.7.0/precursor/backend/schemas/__init__.py +173 -0
  368. precursor_ai-2026.7.0/precursor/backend/schemas/agent.py +132 -0
  369. precursor_ai-2026.7.0/precursor/backend/schemas/agent_schedule.py +67 -0
  370. precursor_ai-2026.7.0/precursor/backend/schemas/chat.py +42 -0
  371. precursor_ai-2026.7.0/precursor/backend/schemas/llm.py +30 -0
  372. precursor_ai-2026.7.0/precursor/backend/schemas/meeting.py +217 -0
  373. precursor_ai-2026.7.0/precursor/backend/schemas/memory.py +51 -0
  374. precursor_ai-2026.7.0/precursor/backend/schemas/message.py +141 -0
  375. precursor_ai-2026.7.0/precursor/backend/schemas/projects.py +99 -0
  376. precursor_ai-2026.7.0/precursor/backend/schemas/refine.py +23 -0
  377. precursor_ai-2026.7.0/precursor/backend/schemas/reminder.py +41 -0
  378. precursor_ai-2026.7.0/precursor/backend/schemas/role.py +48 -0
  379. precursor_ai-2026.7.0/precursor/backend/schemas/schedule.py +101 -0
  380. precursor_ai-2026.7.0/precursor/backend/schemas/search.py +65 -0
  381. precursor_ai-2026.7.0/precursor/backend/schemas/settings.py +171 -0
  382. precursor_ai-2026.7.0/precursor/backend/schemas/skill.py +66 -0
  383. precursor_ai-2026.7.0/precursor/backend/schemas/stats.py +92 -0
  384. precursor_ai-2026.7.0/precursor/backend/schemas/topic.py +64 -0
  385. precursor_ai-2026.7.0/precursor/backend/schemas/workspace.py +137 -0
  386. precursor_ai-2026.7.0/precursor/backend/services/__init__.py +1 -0
  387. precursor_ai-2026.7.0/precursor/backend/services/agents/__init__.py +0 -0
  388. precursor_ai-2026.7.0/precursor/backend/services/agents/event_normalizer.py +154 -0
  389. precursor_ai-2026.7.0/precursor/backend/services/agents/manager.py +1697 -0
  390. precursor_ai-2026.7.0/precursor/backend/services/agents/permissions.py +77 -0
  391. precursor_ai-2026.7.0/precursor/backend/services/agents/runtime.py +115 -0
  392. precursor_ai-2026.7.0/precursor/backend/services/app_settings.py +615 -0
  393. precursor_ai-2026.7.0/precursor/backend/services/attachment_extraction.py +183 -0
  394. precursor_ai-2026.7.0/precursor/backend/services/background_poll.py +89 -0
  395. precursor_ai-2026.7.0/precursor/backend/services/backup.py +311 -0
  396. precursor_ai-2026.7.0/precursor/backend/services/backup_ticker.py +54 -0
  397. precursor_ai-2026.7.0/precursor/backend/services/blob_store.py +110 -0
  398. precursor_ai-2026.7.0/precursor/backend/services/cmd_runner.py +229 -0
  399. precursor_ai-2026.7.0/precursor/backend/services/context_budget.py +102 -0
  400. precursor_ai-2026.7.0/precursor/backend/services/events.py +220 -0
  401. precursor_ai-2026.7.0/precursor/backend/services/github_auth.py +78 -0
  402. precursor_ai-2026.7.0/precursor/backend/services/github_client.py +511 -0
  403. precursor_ai-2026.7.0/precursor/backend/services/image_uploads.py +62 -0
  404. precursor_ai-2026.7.0/precursor/backend/services/llm/__init__.py +92 -0
  405. precursor_ai-2026.7.0/precursor/backend/services/llm/_openai_compat.py +183 -0
  406. precursor_ai-2026.7.0/precursor/backend/services/llm/azure_foundry.py +97 -0
  407. precursor_ai-2026.7.0/precursor/backend/services/llm/base.py +139 -0
  408. precursor_ai-2026.7.0/precursor/backend/services/llm/github_copilot.py +131 -0
  409. precursor_ai-2026.7.0/precursor/backend/services/llm/github_models.py +116 -0
  410. precursor_ai-2026.7.0/precursor/backend/services/llm/mock.py +84 -0
  411. precursor_ai-2026.7.0/precursor/backend/services/llm/openai_compatible.py +115 -0
  412. precursor_ai-2026.7.0/precursor/backend/services/llm/registry.py +176 -0
  413. precursor_ai-2026.7.0/precursor/backend/services/mcp/__init__.py +1 -0
  414. precursor_ai-2026.7.0/precursor/backend/services/mcp/client.py +712 -0
  415. precursor_ai-2026.7.0/precursor/backend/services/mcp/cmd_runner_server.py +220 -0
  416. precursor_ai-2026.7.0/precursor/backend/services/mcp/fetch_server.py +161 -0
  417. precursor_ai-2026.7.0/precursor/backend/services/mcp/precursor_server.py +789 -0
  418. precursor_ai-2026.7.0/precursor/backend/services/mcp/server.py +81 -0
  419. precursor_ai-2026.7.0/precursor/backend/services/mcp/user_servers.py +85 -0
  420. precursor_ai-2026.7.0/precursor/backend/services/mcp/workiq_keepalive.py +139 -0
  421. precursor_ai-2026.7.0/precursor/backend/services/mcp/workiq_preview.py +772 -0
  422. precursor_ai-2026.7.0/precursor/backend/services/mcp/workspace_fs_server.py +205 -0
  423. precursor_ai-2026.7.0/precursor/backend/services/meeting_agenda.py +205 -0
  424. precursor_ai-2026.7.0/precursor/backend/services/meeting_analysis.py +626 -0
  425. precursor_ai-2026.7.0/precursor/backend/services/meeting_summary.py +271 -0
  426. precursor_ai-2026.7.0/precursor/backend/services/memories.py +134 -0
  427. precursor_ai-2026.7.0/precursor/backend/services/message_paging.py +47 -0
  428. precursor_ai-2026.7.0/precursor/backend/services/note_drafts.py +103 -0
  429. precursor_ai-2026.7.0/precursor/backend/services/notes.py +179 -0
  430. precursor_ai-2026.7.0/precursor/backend/services/reminder_ticker.py +40 -0
  431. precursor_ai-2026.7.0/precursor/backend/services/reminders.py +221 -0
  432. precursor_ai-2026.7.0/precursor/backend/services/roles.py +27 -0
  433. precursor_ai-2026.7.0/precursor/backend/services/schedule_timing.py +102 -0
  434. precursor_ai-2026.7.0/precursor/backend/services/scheduled_commands.py +865 -0
  435. precursor_ai-2026.7.0/precursor/backend/services/scheduler.py +388 -0
  436. precursor_ai-2026.7.0/precursor/backend/services/search.py +334 -0
  437. precursor_ai-2026.7.0/precursor/backend/services/skills.py +364 -0
  438. precursor_ai-2026.7.0/precursor/backend/services/slugs.py +58 -0
  439. precursor_ai-2026.7.0/precursor/backend/services/stt.py +38 -0
  440. precursor_ai-2026.7.0/precursor/backend/services/suggestions.py +73 -0
  441. precursor_ai-2026.7.0/precursor/backend/services/system_stats.py +153 -0
  442. precursor_ai-2026.7.0/precursor/backend/services/text_refine.py +115 -0
  443. precursor_ai-2026.7.0/precursor/backend/services/tool_result_retention.py +71 -0
  444. precursor_ai-2026.7.0/precursor/backend/services/tool_result_ticker.py +36 -0
  445. precursor_ai-2026.7.0/precursor/backend/services/topic_issue.py +89 -0
  446. precursor_ai-2026.7.0/precursor/backend/services/turn.py +244 -0
  447. precursor_ai-2026.7.0/precursor/backend/services/turn_engine.py +847 -0
  448. precursor_ai-2026.7.0/precursor/backend/services/unread.py +43 -0
  449. precursor_ai-2026.7.0/precursor/backend/services/usage_stats.py +128 -0
  450. precursor_ai-2026.7.0/precursor/backend/services/workspace_fs.py +155 -0
  451. precursor_ai-2026.7.0/precursor/backend/services/workspace_git.py +192 -0
  452. precursor_ai-2026.7.0/pyproject.toml +151 -0
  453. precursor_ai-2026.7.0/tests/__init__.py +0 -0
  454. precursor_ai-2026.7.0/tests/conftest.py +51 -0
  455. precursor_ai-2026.7.0/tests/test_agent_schedules.py +192 -0
  456. precursor_ai-2026.7.0/tests/test_agents.py +1045 -0
  457. precursor_ai-2026.7.0/tests/test_agents_auth_surface.py +138 -0
  458. precursor_ai-2026.7.0/tests/test_app.py +911 -0
  459. precursor_ai-2026.7.0/tests/test_backup.py +177 -0
  460. precursor_ai-2026.7.0/tests/test_banner.py +38 -0
  461. precursor_ai-2026.7.0/tests/test_chat_description_prompt.py +152 -0
  462. precursor_ai-2026.7.0/tests/test_chat_tool_result.py +51 -0
  463. precursor_ai-2026.7.0/tests/test_cmd_runner.py +111 -0
  464. precursor_ai-2026.7.0/tests/test_frontend_build.py +111 -0
  465. precursor_ai-2026.7.0/tests/test_issue_detail.py +140 -0
  466. precursor_ai-2026.7.0/tests/test_launcher_ports.py +81 -0
  467. precursor_ai-2026.7.0/tests/test_live_sessions.py +919 -0
  468. precursor_ai-2026.7.0/tests/test_mcp_auth_pause.py +144 -0
  469. precursor_ai-2026.7.0/tests/test_mcp_deferred_status.py +75 -0
  470. precursor_ai-2026.7.0/tests/test_mcp_pool.py +127 -0
  471. precursor_ai-2026.7.0/tests/test_memory_commands.py +206 -0
  472. precursor_ai-2026.7.0/tests/test_precursor_mcp.py +256 -0
  473. precursor_ai-2026.7.0/tests/test_projects.py +284 -0
  474. precursor_ai-2026.7.0/tests/test_refine.py +70 -0
  475. precursor_ai-2026.7.0/tests/test_reminders.py +111 -0
  476. precursor_ai-2026.7.0/tests/test_roles.py +214 -0
  477. precursor_ai-2026.7.0/tests/test_scheduled_commands.py +612 -0
  478. precursor_ai-2026.7.0/tests/test_skills.py +286 -0
  479. precursor_ai-2026.7.0/tests/test_suggestions.py +76 -0
  480. precursor_ai-2026.7.0/tests/test_system_stats.py +165 -0
  481. precursor_ai-2026.7.0/tests/test_tool_result_retention.py +181 -0
  482. precursor_ai-2026.7.0/tests/test_topic_schedules.py +85 -0
  483. precursor_ai-2026.7.0/tests/test_usage_stats.py +149 -0
  484. precursor_ai-2026.7.0/tests/test_version.py +37 -0
  485. precursor_ai-2026.7.0/tests/test_workiq_keepalive.py +120 -0
  486. precursor_ai-2026.7.0/tests/test_workiq_preview.py +386 -0
  487. precursor_ai-2026.7.0/tests/test_workspace_fs.py +75 -0
  488. precursor_ai-2026.7.0/uv.lock +1766 -0
  489. precursor_ai-2026.7.0/website/.vitepress/config.mts +136 -0
  490. precursor_ai-2026.7.0/website/.vitepress/theme/Layout.vue +26 -0
  491. precursor_ai-2026.7.0/website/.vitepress/theme/Screenshot.vue +35 -0
  492. precursor_ai-2026.7.0/website/.vitepress/theme/custom.css +109 -0
  493. precursor_ai-2026.7.0/website/.vitepress/theme/index.ts +38 -0
  494. precursor_ai-2026.7.0/website/README.md +39 -0
  495. precursor_ai-2026.7.0/website/contributing/index.md +108 -0
  496. precursor_ai-2026.7.0/website/contributing/releasing.md +102 -0
  497. precursor_ai-2026.7.0/website/contributing/workflow.md +86 -0
  498. precursor_ai-2026.7.0/website/features/agents.md +68 -0
  499. precursor_ai-2026.7.0/website/features/attachments.md +45 -0
  500. precursor_ai-2026.7.0/website/features/chats.md +52 -0
  501. precursor_ai-2026.7.0/website/features/command-runner.md +45 -0
  502. precursor_ai-2026.7.0/website/features/index.md +49 -0
  503. precursor_ai-2026.7.0/website/features/kanban.md +46 -0
  504. precursor_ai-2026.7.0/website/features/live-sessions.md +78 -0
  505. precursor_ai-2026.7.0/website/features/mcp.md +70 -0
  506. precursor_ai-2026.7.0/website/features/plugins.md +87 -0
  507. precursor_ai-2026.7.0/website/features/scheduler.md +103 -0
  508. precursor_ai-2026.7.0/website/features/skills-memory.md +71 -0
  509. precursor_ai-2026.7.0/website/features/topics.md +67 -0
  510. precursor_ai-2026.7.0/website/features/workspaces.md +42 -0
  511. precursor_ai-2026.7.0/website/guide/configuration.md +95 -0
  512. precursor_ai-2026.7.0/website/guide/installation.md +139 -0
  513. precursor_ai-2026.7.0/website/guide/introduction.md +78 -0
  514. precursor_ai-2026.7.0/website/guide/quick-start.md +73 -0
  515. precursor_ai-2026.7.0/website/index.md +138 -0
  516. precursor_ai-2026.7.0/website/package-lock.json +3812 -0
  517. precursor_ai-2026.7.0/website/package.json +19 -0
  518. precursor_ai-2026.7.0/website/public/CNAME +1 -0
  519. precursor_ai-2026.7.0/website/public/logo.svg +13 -0
  520. precursor_ai-2026.7.0/website/public/screenshots/agents-dark.png +0 -0
  521. precursor_ai-2026.7.0/website/public/screenshots/agents.png +0 -0
  522. precursor_ai-2026.7.0/website/public/screenshots/chats-dark.png +0 -0
  523. precursor_ai-2026.7.0/website/public/screenshots/chats.png +0 -0
  524. precursor_ai-2026.7.0/website/public/screenshots/home-dark.png +0 -0
  525. precursor_ai-2026.7.0/website/public/screenshots/home.png +0 -0
  526. precursor_ai-2026.7.0/website/public/screenshots/kanban-dark.png +0 -0
  527. precursor_ai-2026.7.0/website/public/screenshots/kanban.png +0 -0
  528. precursor_ai-2026.7.0/website/public/screenshots/live-dark.png +0 -0
  529. precursor_ai-2026.7.0/website/public/screenshots/live.png +0 -0
  530. precursor_ai-2026.7.0/website/public/screenshots/mcp-settings-dark.png +0 -0
  531. precursor_ai-2026.7.0/website/public/screenshots/mcp-settings.png +0 -0
  532. precursor_ai-2026.7.0/website/public/screenshots/topics-dark.png +0 -0
  533. precursor_ai-2026.7.0/website/public/screenshots/topics.png +0 -0
  534. precursor_ai-2026.7.0/website/public/screenshots/workspaces-dark.png +0 -0
  535. precursor_ai-2026.7.0/website/public/screenshots/workspaces.png +0 -0
  536. precursor_ai-2026.7.0/website/reference/api.md +60 -0
  537. precursor_ai-2026.7.0/website/reference/architecture.md +188 -0
  538. precursor_ai-2026.7.0/website/reference/configuration.md +71 -0
  539. precursor_ai-2026.7.0/website/reference/plugins.md +109 -0
  540. precursor_ai-2026.7.0/website/reference/stack.md +66 -0
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ indent_style = space
7
+ indent_size = 4
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.{ts,tsx,js,jsx,json,html,css,yml,yaml,md}]
12
+ indent_size = 2
@@ -0,0 +1,35 @@
1
+ # Precursor configuration. Every setting has a built-in default (see
2
+ # precursor/backend/config.py), so this file is optional — Precursor runs fine
3
+ # with no .env. Copy to `.env` and uncomment only what you want to override.
4
+
5
+ # --- Server ---
6
+ # `--port` (PRECURSOR_PORT) is always the URL you open. In `--dev` the Vite UI
7
+ # runs there and the backend moves to PORT + 1 (override with `--api-port`).
8
+ # A busy port auto-bumps to the next free one (use `--strict-port` to fail
9
+ # instead, or `--port 0` for any free port).
10
+ # PRECURSOR_HOST=127.0.0.1
11
+ # PRECURSOR_PORT=8000
12
+ # PRECURSOR_LOG_LEVEL=info
13
+ # Seconds to wait for in-flight requests (e.g. SSE streams) before force-closing
14
+ # on Ctrl-C, so the port is released promptly instead of hanging.
15
+ # PRECURSOR_SHUTDOWN_GRACE_SECONDS=3
16
+
17
+ # --- Database ---
18
+ # Defaults to a local SQLite file; point at Postgres for production.
19
+ # PRECURSOR_DATABASE_URL=sqlite+aiosqlite:///./precursor.db
20
+ # PRECURSOR_DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/precursor
21
+
22
+ # --- LLM provider ---
23
+ # The provider (GitHub Copilot, GitHub Models, Azure AI Foundry, OpenAI,
24
+ # Mistral, Hugging Face, Ollama, or Mock) and its credentials are configured at
25
+ # runtime in the app — Settings → Model — not via the environment. The GitHub
26
+ # providers fall back to your `gh auth login` session when no token is saved.
27
+
28
+ # --- Backup ---
29
+ # Periodic copy of the SQLite DB + attachment blobs into a plain folder (e.g. a
30
+ # OneDrive/Dropbox/iCloud-synced directory). Enable it, pick the target folder
31
+ # and set snapshot retention at runtime in the app — Settings → Backup. Only the
32
+ # scheduling knobs below are env-level (the ticker polls every poll interval and
33
+ # runs once the interval has elapsed since the last success).
34
+ # PRECURSOR_BACKUP_INTERVAL_SECONDS=86400
35
+ # PRECURSOR_BACKUP_POLL_SECONDS=3600
@@ -0,0 +1,63 @@
1
+ name: Bug report
2
+ description: Something doesn't work as expected.
3
+ labels: ["bug", "needs-triage"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for taking the time to file a bug. Please fill out the sections below.
9
+
10
+ - type: textarea
11
+ id: what-happened
12
+ attributes:
13
+ label: What happened?
14
+ description: A clear and concise description of the problem.
15
+ validations:
16
+ required: true
17
+
18
+ - type: textarea
19
+ id: expected
20
+ attributes:
21
+ label: Expected behavior
22
+ description: What did you expect to happen instead?
23
+ validations:
24
+ required: true
25
+
26
+ - type: textarea
27
+ id: repro
28
+ attributes:
29
+ label: Steps to reproduce
30
+ description: Minimum steps to reproduce.
31
+ value: |
32
+ 1.
33
+ 2.
34
+ 3.
35
+ validations:
36
+ required: true
37
+
38
+ - type: input
39
+ id: version
40
+ attributes:
41
+ label: Precursor version / commit
42
+ validations:
43
+ required: true
44
+
45
+ - type: dropdown
46
+ id: surface
47
+ attributes:
48
+ label: Surface
49
+ options:
50
+ - Backend (API / streaming)
51
+ - Frontend (SPA)
52
+ - GitHub integration
53
+ - MCP
54
+ - Plugins
55
+ - Other / unsure
56
+ validations:
57
+ required: true
58
+
59
+ - type: textarea
60
+ id: logs
61
+ attributes:
62
+ label: Relevant logs / stack traces
63
+ render: shell
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Discussions
4
+ url: https://github.com/lrivallain/precursor/discussions
5
+ about: Ask a question or propose an idea before opening an issue.
@@ -0,0 +1,38 @@
1
+ name: Feature request
2
+ description: Propose a new capability or improvement.
3
+ labels: ["enhancement", "needs-triage"]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: Problem
9
+ description: What problem are you trying to solve? Why does it matter?
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: proposal
15
+ attributes:
16
+ label: Proposed solution
17
+ description: How would you like Precursor to behave?
18
+ validations:
19
+ required: true
20
+
21
+ - type: textarea
22
+ id: alternatives
23
+ attributes:
24
+ label: Alternatives considered
25
+
26
+ - type: dropdown
27
+ id: surface
28
+ attributes:
29
+ label: Surface
30
+ options:
31
+ - Backend
32
+ - Frontend
33
+ - GitHub integration
34
+ - MCP
35
+ - Plugins
36
+ - Docs / DX
37
+ validations:
38
+ required: true
@@ -0,0 +1,28 @@
1
+ <!--
2
+ Thanks for contributing to Precursor! Please fill out the sections below.
3
+ -->
4
+
5
+ ## Summary
6
+
7
+ <!-- One or two sentences describing what this PR does and why. -->
8
+
9
+ ## Linked issue
10
+
11
+ Closes #
12
+
13
+ ## Changes
14
+
15
+ -
16
+
17
+ ## Verification
18
+
19
+ - [ ] `ruff check .` passes
20
+ - [ ] `mypy precursor` passes
21
+ - [ ] `pytest` passes
22
+ - [ ] `npm --prefix frontend run typecheck` passes
23
+ - [ ] `npm --prefix frontend run build` succeeds
24
+ - [ ] Manually exercised the affected flow
25
+
26
+ ## Notes for reviewers
27
+
28
+ <!-- Anything reviewers should know: tradeoffs, follow-ups, screenshots. -->
@@ -0,0 +1,156 @@
1
+ # Copilot / agent instructions for Precursor
2
+
3
+ Use these notes to stay aligned with the project's conventions when working in
4
+ this repo.
5
+
6
+ ## Architecture in one paragraph
7
+
8
+ Single uvicorn process. FastAPI exposes a JSON API under `/api/*` and mounts
9
+ the built React SPA at `/`. SQLAlchemy 2 (async) backs `Topic`, `Message`, and
10
+ `AppSetting`. Chat replies stream from an LLM provider (`GitHubModelsProvider`
11
+ or `MockProvider` fallback) over Server-Sent Events. Precursor is both an MCP
12
+ server (exposes conversations) and an MCP client (attaches tool servers).
13
+ Third parties extend the system via the `precursor.plugins` entry-point group
14
+ plus a frontend extension registry.
15
+
16
+ ## Conventions
17
+
18
+ ### Tooling
19
+
20
+ - **uv** is the Python toolchain — env, run, build, release. Prefer
21
+ `uv run <cmd>` (e.g. `uv run pytest`, `uv run ruff check .`) over a manually
22
+ activated venv, and `uv build` for wheels. `make` targets wrap these
23
+ (`make sync`, `make dev`, `make check`, `make wheel`). Don't reintroduce
24
+ `pip install` / bare `uvicorn` invocations in docs or scripts.
25
+
26
+ ### Python (backend)
27
+
28
+ - Target **Python 3.12+**. Always use `from __future__ import annotations`.
29
+ - Async everywhere DB or network is touched. Use `AsyncSession` from
30
+ `precursor.backend.db` via `Depends(get_session)`.
31
+ - Pydantic v2 models in `schemas/`. Never return ORM objects with secrets
32
+ embedded — define a read model.
33
+ - Settings come from `precursor.backend.config.get_settings()` (cached).
34
+ Don't read `os.environ` directly in routers.
35
+ - Routers are thin; logic goes in `services/`.
36
+ - When streaming responses, persist the assistant turn in a **fresh session**
37
+ (`async with SessionLocal() as ...`) because the request-scoped one may be
38
+ closed by the time the generator finishes — see `routers/chat.py`.
39
+
40
+ ### TypeScript (frontend)
41
+
42
+ - React 19 + Tailwind. Components are function components with named exports.
43
+ - Styling uses CSS variables for theme tokens; toggle dark mode by adding
44
+ `.dark` on `<html>` (see `lib/theme.ts`).
45
+ - All HTTP goes through `src/lib/api.ts`. Streaming chat goes through
46
+ `src/lib/sse.ts` (we don't use `EventSource` because we POST a JSON body).
47
+ - Keep type definitions in `src/lib/types.ts` mirrored to the Pydantic schemas.
48
+
49
+ ### Plugins
50
+
51
+ - Backend plugins register via `[project.entry-points."precursor.plugins"]`
52
+ and a `register(registry)` callable.
53
+ - Frontend extensions are *descriptors* served from `/api/plugins`; the SPA
54
+ matches them to renderers registered through `frontend/src/lib/plugins.ts`.
55
+ - Don't grow core to host a single use case — write a plugin instead.
56
+
57
+ ## When making changes
58
+
59
+ 1. Update both the Pydantic schema **and** the TS `types.ts` for any API
60
+ change.
61
+ 2. When models change, generate a migration with `make migration m="…"`
62
+ (Alembic autogenerate), review it, and commit it. Alembic is the single
63
+ source of truth: `init_db` runs `alembic upgrade head` on startup for dev and
64
+ prod alike — there is no `create_all` or hand-written dev backfill.
65
+ 3. Keep comments to "why", not "what". Don't add docstrings to code you didn't
66
+ touch.
67
+ 4. **Assess documentation impact** — every user-facing change must update the
68
+ docs in the same PR (see [Documentation](#documentation) below). Treat "docs
69
+ updated" as part of the definition of done, not a follow-up.
70
+ 5. Run the quality gates (`make check`, listed in `CONTRIBUTING.md`).
71
+
72
+ ## Documentation
73
+
74
+ **Documentation is part of every change, not an afterthought.** Before you call
75
+ a change complete, explicitly assess what documentation it affects and update it
76
+ in the *same* PR. If you conclude nothing needs changing, say so in the PR
77
+ description so the assessment is visible.
78
+
79
+ ### Where documentation lives
80
+
81
+ - **`README.md`** — the project's front door (motto, quick start, highlights).
82
+ - **`docs/`** — in-repo deep dives (`architecture.md`, `plugins.md`, …).
83
+ - **`website/`** — the VitePress showcase + docs site published to GitHub Pages
84
+ (`.github/workflows/pages.yml`, base path `/precursor/`):
85
+ - `website/index.md` — landing page hero + **feature grid**.
86
+ - `website/guide/` — getting started (installation, quick start, configuration).
87
+ - `website/features/` — **one page per feature**.
88
+ - `website/reference/` — stack, architecture, configuration, API, plugins.
89
+ - `website/contributing/` — contribution, workflow, releasing.
90
+ - `website/.vitepress/config.mts` — nav + sidebar registration.
91
+ - `website/public/screenshots/` — product screenshots (see below).
92
+ - **`CHANGELOG.md`** — keep the `[Unreleased]` section current for any
93
+ user-facing change.
94
+
95
+ ### Decision checklist — what triggers a doc update
96
+
97
+ | If your change… | …then update |
98
+ | --- | --- |
99
+ | Adds or changes a **user-facing feature** | the relevant `website/features/*.md` page (+ landing feature grid in `index.md` if it's a headline capability), and `CHANGELOG.md` `[Unreleased]` |
100
+ | Adds a **new sidebar section / cockpit** | a new `website/features/<section>.md` **and** its sidebar entry in `config.mts` **and** the landing grid — mirroring the in-app wiring (`Sidebar.tsx`, `sections.ts`, and the **command palette**) |
101
+ | Adds/renames/removes a **setting or env var** | `website/guide/configuration.md` and `website/reference/configuration.md` (and `.env.example` if env-level) |
102
+ | Adds/changes a **slash command** | the surface's feature page (e.g. `/reminder` on `features/scheduler.md`) and `frontend/src/lib/commands.ts` stays the source of truth |
103
+ | Changes the **API** (routes, schemas, SSE events) | `website/reference/api.md` and the architecture request-flow notes |
104
+ | Adds a **built-in MCP server / provider** | `website/features/mcp.md` / `website/reference/architecture.md` |
105
+ | Changes **installation / run** steps | `README.md`, `website/guide/installation.md`, `CONTRIBUTING.md` |
106
+ | Is **experimental / untested** | mark it clearly as WIP (e.g. a `::: warning` admonition), don't present it as stable |
107
+
108
+ ### Exposing a new feature on the site
109
+
110
+ 1. Write `website/features/<feature>.md` (mirror the tone of the existing pages:
111
+ a one-line intent, a `<Screenshot>` if it has UI, then how it works).
112
+ 2. Register it in the sidebar (`website/.vitepress/config.mts`) and, for a
113
+ headline capability, add a card to the feature grid in `website/index.md`.
114
+ 3. Cross-link from related pages (e.g. a scheduler feature links to MCP guards).
115
+ 4. Add a `CHANGELOG.md` `[Unreleased]` entry.
116
+
117
+ ### Screenshots
118
+
119
+ Screenshots live in `website/public/screenshots/` and are **theme-aware**: each
120
+ has a light file (`foo.png`) and a dark file (`foo-dark.png`); the `<Screenshot>`
121
+ component derives the `-dark` variant and swaps by site theme. **When a UI change
122
+ alters a screenshotted screen, retake both variants.**
123
+
124
+ Capture rules (keep them consistent and privacy-safe):
125
+
126
+ - Run a **seeded demo instance** with the **account hidden** — no resolvable
127
+ GitHub token, so the persona shows "Guest / Not connected" (never a real
128
+ account/avatar). Reuse the demo fixtures (the `precursor-demo` repo + Project
129
+ board) rather than real data.
130
+ - **Fake missing config** (e.g. a dummy Speech key, disabled remote MCP servers)
131
+ so shots have **no error/warning banners** — never use real secrets.
132
+ - Capture **both** `colorScheme: light` and `dark` at `deviceScaleFactor: 2`,
133
+ writing `foo.png` and `foo-dark.png`.
134
+ - **Clip** to the relevant pane when the sidebar/persona footer would leak the
135
+ account.
136
+ - Reference the new file from a page via
137
+ `<Screenshot src="/screenshots/foo.png" alt="…" caption="…" />` (light path
138
+ only — the component finds the dark one).
139
+
140
+ ### Verify before you finish
141
+
142
+ - Build the site: `cd website && npm run docs:build` — it must pass (checks
143
+ broken component usage and, effectively, that referenced pages exist).
144
+ - Sanity-check new nav/sidebar links resolve and every referenced screenshot
145
+ (both variants) exists.
146
+
147
+ ## What *not* to do
148
+
149
+ - Don't add new top-level dependencies without flagging it in the PR.
150
+ - Don't introduce a Node.js runtime requirement in production — the SPA must
151
+ be pre-built and served by FastAPI.
152
+ - Don't echo secret values (API tokens) in API responses. Use the
153
+ `api_keys_present` boolean pattern from `schemas/settings.py`.
154
+ - Don't hardcode the version anywhere — it's CalVer from git tags via hatch-vcs
155
+ (read `precursor.__version__`). See `RELEASING.md`.
156
+ - Don't add unrelated refactors to a feature PR.
@@ -0,0 +1,44 @@
1
+ version: 2
2
+ updates:
3
+ # Python deps (uv-managed; Dependabot reads pyproject.toml).
4
+ - package-ecosystem: pip
5
+ directory: "/"
6
+ schedule:
7
+ interval: weekly
8
+ open-pull-requests-limit: 10
9
+ # Only raise a floor in pyproject.toml when the latest release no longer
10
+ # satisfies it (e.g. a real breaking floor) or for a security advisory.
11
+ # Routine minor/patch releases that already satisfy our coarse `>=` floors
12
+ # produce no manifest PR — the lockfile stays the source of exact versions.
13
+ versioning-strategy: increase-if-necessary
14
+ groups:
15
+ # Group only minor/patch bumps; majors get their own PR so a breaking
16
+ # upgrade is never bundled with safe ones.
17
+ python-minor-patch:
18
+ patterns: ["*"]
19
+ update-types: ["minor", "patch"]
20
+
21
+ # Frontend deps.
22
+ - package-ecosystem: npm
23
+ directory: "/frontend"
24
+ schedule:
25
+ interval: weekly
26
+ open-pull-requests-limit: 10
27
+ # Same intent as the pip ecosystem: don't churn package.json for bumps the
28
+ # existing range already allows; only widen/raise when actually required.
29
+ versioning-strategy: increase-if-necessary
30
+ groups:
31
+ # Group only minor/patch bumps; majors (e.g. Tailwind v4, Vite, TS) get
32
+ # their own PR so each migration is reviewed in isolation.
33
+ frontend-minor-patch:
34
+ patterns: ["*"]
35
+ update-types: ["minor", "patch"]
36
+
37
+ # GitHub Actions used by the CI / release workflows.
38
+ - package-ecosystem: github-actions
39
+ directory: "/"
40
+ schedule:
41
+ interval: weekly
42
+ groups:
43
+ actions:
44
+ patterns: ["*"]
@@ -0,0 +1,51 @@
1
+ ---
2
+ mode: agent
3
+ description: Cut a CalVer release — pick the version, promote the changelog, tag, push, and verify the GitHub Release.
4
+ ---
5
+
6
+ # Tag a release
7
+
8
+ Cut a CalVer release of Precursor. The version is **derived from the git tag**
9
+ by hatch-vcs — there is no literal to bump. Full reference: `RELEASING.md`.
10
+
11
+ ## Preconditions
12
+
13
+ - `main` is the source of truth and CI is green on it. Confirm with
14
+ `git switch main && git pull` and `gh run list --branch main --limit 1`.
15
+ - The working tree is clean.
16
+
17
+ ## Steps
18
+
19
+ 1. **Pick the version (CalVer `YYYY.M.MICRO`).**
20
+ - `YYYY` = current year, `M` = current month **without leading zero**,
21
+ `MICRO` = release counter **within that month**, starting at `0` and
22
+ resetting to `0` on the first release of a new month.
23
+ - Inspect existing tags (`git tag --list 'v*' | sort -V`) to choose the next
24
+ value. Example: after `v2026.6.0` in June → `v2026.6.1`; first July release
25
+ → `v2026.7.0`.
26
+ 2. **Promote the changelog.** In `CHANGELOG.md`, rename the `[Unreleased]`
27
+ section to a dated release heading — `## [<version>] - YYYY-MM-DD` — and open
28
+ a fresh empty `[Unreleased]` above it. Commit on `main` (or via a quick PR if
29
+ `main` is protected): `docs(changelog): release <version>`.
30
+ 3. **Sanity-check the build version.** `uv build --wheel` and confirm the wheel
31
+ filename encodes the intended version (or `uvx hatch version`). A clean
32
+ checkout on the tag must yield exactly `<version>`.
33
+ 4. **Tag and push.** The leading `v` is required (the release workflow triggers
34
+ on `v*`):
35
+ ```bash
36
+ git tag v<version>
37
+ git push origin v<version>
38
+ ```
39
+ 5. **Verify the release.** Watch `release.yml`
40
+ (`gh run watch` on the tag's run). On success, confirm the GitHub Release
41
+ exists with the wheel + sdist assets and auto-generated notes
42
+ (`gh release view v<version>`). Report the release URL.
43
+
44
+ ## Guardrails
45
+
46
+ - Never edit a version literal — if you find one, that's a bug; flag it.
47
+ - Don't delete or move a tag once pushed (it's published). To fix a bad release,
48
+ cut a new patch (`MICRO + 1`).
49
+ - If the build's version doesn't match the tag, stop — the release job's own
50
+ guard will fail; investigate hatch-vcs / git history (shallow clone? missing
51
+ tags?) before retrying.
@@ -0,0 +1,39 @@
1
+ ---
2
+ mode: agent
3
+ description: Ship a focused code change — run gates, branch, conventional commit, open a PR, and confirm CI.
4
+ ---
5
+
6
+ # Ship a code change
7
+
8
+ Drive a code change from working tree to an open, green PR. Follow the repo
9
+ conventions in `.github/copilot-instructions.md` and `CONTRIBUTING.md`.
10
+
11
+ ## Steps
12
+
13
+ 1. **Scope check.** Summarize what changed (`git status`, `git diff --stat`).
14
+ If the change mixes unrelated concerns, stop and ask whether to split it.
15
+ 2. **Quality gates.** Run `make check` (ruff, ruff format --check, mypy,
16
+ pytest, frontend typecheck + build). Fix anything red before continuing —
17
+ never commit with failing gates, and don't bypass them.
18
+ 3. **Update docs/changelog if user-facing.** If the change affects behavior,
19
+ add a bullet to the `[Unreleased]` section of `CHANGELOG.md`. If it changes
20
+ an API, update both the Pydantic schema and `frontend/src/lib/types.ts`.
21
+ 4. **Branch.** Create a branch off `main` named for the change:
22
+ `feat/<slug>`, `fix/<slug>`, `chore/<slug>`, or `docs/<slug>`.
23
+ 5. **Commit.** Stage intentionally (never `.env`, `frontend/dist`,
24
+ `precursor/_version.py`, or the dev DB — verify with `git status`). Use a
25
+ **Conventional Commits** message: `type(scope): summary`, with a body
26
+ explaining the *why*.
27
+ 6. **Push & PR.** Push the branch and open a PR with `gh pr create` using the
28
+ repo PR template; reference the issue with `Closes #N` when applicable. If
29
+ `main` isn't on the remote yet, push it first.
30
+ 7. **Confirm CI.** Watch the PR checks (`gh pr checks`); if a check fails, fetch
31
+ the log (`gh run view --log-failed`), fix on the same branch, and push again.
32
+ Report the PR URL and final check status.
33
+
34
+ ## Guardrails
35
+
36
+ - Do not force-push, merge, or tag as part of this workflow — only open the PR.
37
+ - Keep the diff minimal and on-topic; no drive-by refactors.
38
+ - If a gate reveals pre-existing repo-wide debt unrelated to the change, flag it
39
+ rather than fixing it here.
@@ -0,0 +1,72 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ # Cancel superseded runs on the same ref to save CI minutes.
9
+ concurrency:
10
+ group: ci-${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ backend:
18
+ name: Backend (lint · types · tests)
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v7
22
+ with:
23
+ # Full history + tags so hatch-vcs can resolve the CalVer version.
24
+ fetch-depth: 0
25
+
26
+ - name: Install uv
27
+ uses: astral-sh/setup-uv@v7
28
+ with:
29
+ enable-cache: true
30
+
31
+ - name: Set up Python
32
+ run: uv python install 3.12
33
+
34
+ - name: Sync dependencies
35
+ run: uv sync
36
+
37
+ - name: Ruff lint
38
+ run: uv run ruff check .
39
+
40
+ - name: Ruff format check
41
+ run: uv run ruff format --check .
42
+
43
+ - name: Mypy
44
+ run: uv run mypy precursor
45
+
46
+ - name: Pytest
47
+ run: uv run pytest -q
48
+
49
+ frontend:
50
+ name: Frontend (typecheck · build)
51
+ runs-on: ubuntu-latest
52
+ defaults:
53
+ run:
54
+ working-directory: frontend
55
+ steps:
56
+ - uses: actions/checkout@v7
57
+
58
+ - name: Set up Node
59
+ uses: actions/setup-node@v6
60
+ with:
61
+ node-version: 20
62
+ cache: npm
63
+ cache-dependency-path: frontend/package-lock.json
64
+
65
+ - name: Install dependencies
66
+ run: npm ci
67
+
68
+ - name: Typecheck
69
+ run: npm run typecheck
70
+
71
+ - name: Build
72
+ run: npm run build
@@ -0,0 +1,61 @@
1
+ name: Deploy website
2
+
3
+ # Build the VitePress showcase + docs (website/) and publish it to GitHub Pages
4
+ # on every push to main. Enable Pages once under Settings → Pages → Source:
5
+ # "GitHub Actions".
6
+ on:
7
+ push:
8
+ branches: [main]
9
+ paths:
10
+ - "website/**"
11
+ - ".github/workflows/pages.yml"
12
+ workflow_dispatch:
13
+
14
+ # Least-privilege token that can publish to Pages.
15
+ permissions:
16
+ contents: read
17
+ pages: write
18
+ id-token: write
19
+
20
+ # Allow one concurrent deployment; don't cancel an in-progress publish.
21
+ concurrency:
22
+ group: pages
23
+ cancel-in-progress: false
24
+
25
+ jobs:
26
+ build:
27
+ name: Build site
28
+ runs-on: ubuntu-latest
29
+ defaults:
30
+ run:
31
+ working-directory: website
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+
35
+ - name: Set up Node
36
+ uses: actions/setup-node@v4
37
+ with:
38
+ node-version: 20
39
+
40
+ - name: Install dependencies
41
+ run: npm install
42
+
43
+ - name: Build with VitePress
44
+ run: npm run docs:build
45
+
46
+ - name: Upload Pages artifact
47
+ uses: actions/upload-pages-artifact@v3
48
+ with:
49
+ path: website/.vitepress/dist
50
+
51
+ deploy:
52
+ name: Deploy to GitHub Pages
53
+ needs: build
54
+ runs-on: ubuntu-latest
55
+ environment:
56
+ name: github-pages
57
+ url: ${{ steps.deployment.outputs.page_url }}
58
+ steps:
59
+ - name: Deploy
60
+ id: deployment
61
+ uses: actions/deploy-pages@v4