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.
- precursor_ai-2026.7.0/.editorconfig +12 -0
- precursor_ai-2026.7.0/.env.example +35 -0
- precursor_ai-2026.7.0/.github/ISSUE_TEMPLATE/bug_report.yml +63 -0
- precursor_ai-2026.7.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- precursor_ai-2026.7.0/.github/ISSUE_TEMPLATE/feature_request.yml +38 -0
- precursor_ai-2026.7.0/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- precursor_ai-2026.7.0/.github/copilot-instructions.md +156 -0
- precursor_ai-2026.7.0/.github/dependabot.yml +44 -0
- precursor_ai-2026.7.0/.github/prompts/release.prompt.md +51 -0
- precursor_ai-2026.7.0/.github/prompts/ship-change.prompt.md +39 -0
- precursor_ai-2026.7.0/.github/workflows/ci.yml +72 -0
- precursor_ai-2026.7.0/.github/workflows/pages.yml +61 -0
- precursor_ai-2026.7.0/.github/workflows/release.yml +110 -0
- precursor_ai-2026.7.0/.gitignore +60 -0
- precursor_ai-2026.7.0/.impeccable/config.json +26 -0
- precursor_ai-2026.7.0/.impeccable/hook.cache.json +1 -0
- precursor_ai-2026.7.0/CHANGELOG.md +369 -0
- precursor_ai-2026.7.0/CONTRIBUTING.md +129 -0
- precursor_ai-2026.7.0/LICENSE +21 -0
- precursor_ai-2026.7.0/Makefile +57 -0
- precursor_ai-2026.7.0/PKG-INFO +271 -0
- precursor_ai-2026.7.0/README.md +233 -0
- precursor_ai-2026.7.0/RELEASING.md +105 -0
- precursor_ai-2026.7.0/SECURITY.md +31 -0
- precursor_ai-2026.7.0/alembic.ini +47 -0
- precursor_ai-2026.7.0/docs/architecture.md +368 -0
- precursor_ai-2026.7.0/docs/live-meeting-assistant.md +96 -0
- precursor_ai-2026.7.0/docs/plugins.md +79 -0
- precursor_ai-2026.7.0/frontend/dist/assets/abnfDiagram-VRR7QNED-8eH-JFcy.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/arc-B646etem.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/architecture-TIHT7OUA-C2MdFPwk.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/architectureDiagram-ZJ3FMSHR-l0KQH1Yt.js +36 -0
- precursor_ai-2026.7.0/frontend/dist/assets/array-BifhSqXX.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/blockDiagram-677ZJIJ3-D8wVu_Wz.js +132 -0
- precursor_ai-2026.7.0/frontend/dist/assets/c4Diagram-LMCZKHZV-DIED2ou9.js +10 -0
- precursor_ai-2026.7.0/frontend/dist/assets/channel-_MjatZHN.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-32BRIVSS-B8CLHOxy.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-52WLFC77-vi_uNvUR.js +10 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-C7G6YPKG-oqVqIkDe.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-EX3LRPZG-BDbdHh1Q.js +231 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-FWX5IMBZ-D4A7F4vw.js +2 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-HOUHSVGY-CmHms1m5.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-ICXQ74PX-BK9SdEk1.js +2 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-KEIR6QF5-Dj-OpFgW.js +161 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-MOJQB5TN-BYR8QyTJ.js +88 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-OGEWGWER-Dy2bNPVL.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-PUDLZKDR-DnxCt17b.js +156 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-Q4XR5HBZ-AmUS9ANX.js +70 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-RYQCIY6F-4P3gUyDb.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-V7JOEXUC-DO13Cb8i.js +206 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-VAUOI2AC-aEdS9dbJ.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-VR4S4FIN-B-RVDyMv.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-WYO6CB5R-CebLxzzA.js +125 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-XXDRQBXY-C1bTmJTP.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-ZGVPDNZ5-BT5e5VPo.js +62 -0
- precursor_ai-2026.7.0/frontend/dist/assets/chunk-ZIRB5QZD-C6fEPe3t.js +32 -0
- precursor_ai-2026.7.0/frontend/dist/assets/classDiagram-OUVF2IWQ-DPLnyamp.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/classDiagram-v2-EOCWNBFH-DPLnyamp.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/cose-bilkent-JH36ORCC-DUHWOPnM.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/cynefin-VYW2F7L2-Chl7Mfqb.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/cynefinDiagram-TSTJHNR4-BsqDoPdi.js +62 -0
- precursor_ai-2026.7.0/frontend/dist/assets/cytoscape.esm-CQFVGiJu.js +321 -0
- precursor_ai-2026.7.0/frontend/dist/assets/dagre-VKFMJZFB-c2EyI3Fu.js +4 -0
- precursor_ai-2026.7.0/frontend/dist/assets/dagre-dpRSp0QF.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/defaultLocale-C8Fc0cco.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/diagram-FQU43EPY-kRvPjRSG.js +3 -0
- precursor_ai-2026.7.0/frontend/dist/assets/diagram-G47NLZAW-DrPkfD6W.js +24 -0
- precursor_ai-2026.7.0/frontend/dist/assets/diagram-NH7WQ7WH-DJWqMllx.js +24 -0
- precursor_ai-2026.7.0/frontend/dist/assets/diagram-OA4YK3LP-CF-vqOyG.js +30 -0
- precursor_ai-2026.7.0/frontend/dist/assets/diagram-WEI45ONY-BXjXBYBi.js +41 -0
- precursor_ai-2026.7.0/frontend/dist/assets/dist-CHE2FhNa.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/ebnfDiagram-CCIWWBDH-C1c8k_TO.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/erDiagram-Q63AITRT-DWuXmssN.js +85 -0
- precursor_ai-2026.7.0/frontend/dist/assets/eventmodeling-45OFAUF4-DWW4bBGm.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/flowDiagram-23GEKE2U-DnoRymzP.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/ganttDiagram-NO4QXBWP-Cfw_yaAL.js +292 -0
- precursor_ai-2026.7.0/frontend/dist/assets/gitGraph-TEB2WS4Q-CvFbEGLF.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/gitGraphDiagram-IHSO6WYX-DZBfb6x8.js +106 -0
- precursor_ai-2026.7.0/frontend/dist/assets/graphlib-DS17s2tU.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/index-Ce0_SCpn.css +2 -0
- precursor_ai-2026.7.0/frontend/dist/assets/index-CwqE7Qsi.js +65 -0
- precursor_ai-2026.7.0/frontend/dist/assets/info-DKCQHKI2-VkxOpYKM.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/infoDiagram-FWYZ7A6U-CgMcnRVu.js +2 -0
- precursor_ai-2026.7.0/frontend/dist/assets/init-D6jRqBbL.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/ishikawaDiagram-FXEZZL3T-CivPtJtF.js +70 -0
- precursor_ai-2026.7.0/frontend/dist/assets/journeyDiagram-5HDEW3XC-DCB3BYGg.js +139 -0
- precursor_ai-2026.7.0/frontend/dist/assets/kanban-definition-HUTT4EX6-DiKstbXF.js +89 -0
- precursor_ai-2026.7.0/frontend/dist/assets/katex-B7rAX3Vi.js +257 -0
- precursor_ai-2026.7.0/frontend/dist/assets/line-beULIPPc.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/linear-CLn3_xhg.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/map-BaFkSB1l.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/mermaid-parser.core-phaPNyBI.js +7 -0
- precursor_ai-2026.7.0/frontend/dist/assets/mermaid.core-DBZEh2v0.js +11 -0
- precursor_ai-2026.7.0/frontend/dist/assets/microsoft.cognitiveservices.speech.sdk-DTuwpYU7.js +22 -0
- precursor_ai-2026.7.0/frontend/dist/assets/mindmap-definition-LN4V7U3C-Dg6wd4a9.js +96 -0
- precursor_ai-2026.7.0/frontend/dist/assets/ordinal-hYBb2elL.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/packet-7NZHBO7P-B-xt1vek.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/path-BWPyau1x.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/pegDiagram-2B236MQR-C_QjCauy.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/pie-RZYD4A2V-CHOl6z81.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/pieDiagram-ENE6RG2P-9ZKtGnq0.js +39 -0
- precursor_ai-2026.7.0/frontend/dist/assets/quadrantDiagram-ABIIQ3AL-CQuZs40W.js +7 -0
- precursor_ai-2026.7.0/frontend/dist/assets/radar-I7S5WNFK-BSAnOlzV.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/railroad-3IZDKUUU-sB_gWeaZ.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/railroad-abnf-AHOZXSZD-By_Nq7we.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/railroad-ebnf-EBAXGLYW-Dp16YeUI.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/railroad-peg-LSFZ7HO6-hHZcyCQX.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/railroadDiagram-RFXS5EU6-CSsxT5US.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/requirementDiagram-TGXJPOKE-CX9H5l5a.js +84 -0
- precursor_ai-2026.7.0/frontend/dist/assets/rough.esm-CSKSodPl.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/sankeyDiagram-HTMAVEWB-BrkqlI4V.js +40 -0
- precursor_ai-2026.7.0/frontend/dist/assets/sequenceDiagram-DBY2YBRQ-CBGAc4pO.js +162 -0
- precursor_ai-2026.7.0/frontend/dist/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/src-uhs9siQF.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/stateDiagram-2N3HPSRC-umR6awOW.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/stateDiagram-v2-6OUMAXLB-BZSFawce.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/swimlanes-5IMT3BWC-BVeNnEev.js +2 -0
- precursor_ai-2026.7.0/frontend/dist/assets/swimlanesDiagram-G3AALYLV-BVjKjDQx.js +8 -0
- precursor_ai-2026.7.0/frontend/dist/assets/timeline-definition-FHXFAJF6-STAQZ5pE.js +120 -0
- precursor_ai-2026.7.0/frontend/dist/assets/treeView-QDETBFTQ-Cn1ckkmO.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/treemap-6X3UGDF4-CB-SAmlf.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/vennDiagram-L72KCM5P-gkcMUP5D.js +34 -0
- precursor_ai-2026.7.0/frontend/dist/assets/wardley-OPB4EBWU-DQ1oYZTj.js +1 -0
- precursor_ai-2026.7.0/frontend/dist/assets/wardleyDiagram-EHGQE667-DsUcIFCP.js +78 -0
- precursor_ai-2026.7.0/frontend/dist/assets/xychartDiagram-FW5EYKEG-PzbqUHbU.js +7 -0
- precursor_ai-2026.7.0/frontend/dist/index.html +15 -0
- precursor_ai-2026.7.0/frontend/dist/logo.legacy.svg +21 -0
- precursor_ai-2026.7.0/frontend/dist/logo.svg +13 -0
- precursor_ai-2026.7.0/frontend/index.html +14 -0
- precursor_ai-2026.7.0/frontend/package-lock.json +4310 -0
- precursor_ai-2026.7.0/frontend/package.json +34 -0
- precursor_ai-2026.7.0/frontend/public/logo.legacy.svg +21 -0
- precursor_ai-2026.7.0/frontend/public/logo.svg +13 -0
- precursor_ai-2026.7.0/frontend/src/App.tsx +2477 -0
- precursor_ai-2026.7.0/frontend/src/components/AboutModal.tsx +177 -0
- precursor_ai-2026.7.0/frontend/src/components/AgentList.tsx +182 -0
- precursor_ai-2026.7.0/frontend/src/components/AgentPermissionBody.tsx +115 -0
- precursor_ai-2026.7.0/frontend/src/components/AgentSettingsPanel.tsx +351 -0
- precursor_ai-2026.7.0/frontend/src/components/AgentStatusBadge.tsx +49 -0
- precursor_ai-2026.7.0/frontend/src/components/AgentTimeline.tsx +184 -0
- precursor_ai-2026.7.0/frontend/src/components/AgentUsage.tsx +183 -0
- precursor_ai-2026.7.0/frontend/src/components/AgentView.tsx +1420 -0
- precursor_ai-2026.7.0/frontend/src/components/AgentsSettings.tsx +316 -0
- precursor_ai-2026.7.0/frontend/src/components/ArchivePanel.tsx +460 -0
- precursor_ai-2026.7.0/frontend/src/components/ChatList.tsx +230 -0
- precursor_ai-2026.7.0/frontend/src/components/ChatPanel.tsx +1234 -0
- precursor_ai-2026.7.0/frontend/src/components/ChatSessionPanel.tsx +751 -0
- precursor_ai-2026.7.0/frontend/src/components/ChatSettingsPanel.tsx +291 -0
- precursor_ai-2026.7.0/frontend/src/components/ChatStatsPanel.tsx +318 -0
- precursor_ai-2026.7.0/frontend/src/components/CollapsibleSection.tsx +74 -0
- precursor_ai-2026.7.0/frontend/src/components/CommandDraftCard.tsx +128 -0
- precursor_ai-2026.7.0/frontend/src/components/CommandPalette.tsx +509 -0
- precursor_ai-2026.7.0/frontend/src/components/CommandPanel.tsx +270 -0
- precursor_ai-2026.7.0/frontend/src/components/Composer.tsx +506 -0
- precursor_ai-2026.7.0/frontend/src/components/ComposerModelControls.tsx +435 -0
- precursor_ai-2026.7.0/frontend/src/components/ConfirmDialog.tsx +178 -0
- precursor_ai-2026.7.0/frontend/src/components/ContextSection.tsx +369 -0
- precursor_ai-2026.7.0/frontend/src/components/CopyableMarkdown.tsx +96 -0
- precursor_ai-2026.7.0/frontend/src/components/DetachedCommandController.tsx +64 -0
- precursor_ai-2026.7.0/frontend/src/components/DetachedDraftHost.tsx +32 -0
- precursor_ai-2026.7.0/frontend/src/components/DetachedNotesController.tsx +210 -0
- precursor_ai-2026.7.0/frontend/src/components/DetachedWindowPortal.tsx +133 -0
- precursor_ai-2026.7.0/frontend/src/components/DevicePicker.tsx +108 -0
- precursor_ai-2026.7.0/frontend/src/components/FeaturePicker.tsx +91 -0
- precursor_ai-2026.7.0/frontend/src/components/FileTree.tsx +328 -0
- precursor_ai-2026.7.0/frontend/src/components/GitDiffViewer.tsx +270 -0
- precursor_ai-2026.7.0/frontend/src/components/HomePage.tsx +378 -0
- precursor_ai-2026.7.0/frontend/src/components/InlineTitle.tsx +101 -0
- precursor_ai-2026.7.0/frontend/src/components/IssuePreviewModal.tsx +475 -0
- precursor_ai-2026.7.0/frontend/src/components/IssueStatusBadge.tsx +89 -0
- precursor_ai-2026.7.0/frontend/src/components/IssueTags.tsx +49 -0
- precursor_ai-2026.7.0/frontend/src/components/KanbanBoard.tsx +485 -0
- precursor_ai-2026.7.0/frontend/src/components/ListSelection.tsx +87 -0
- precursor_ai-2026.7.0/frontend/src/components/LiveAudioHelp.tsx +220 -0
- precursor_ai-2026.7.0/frontend/src/components/LiveChatSection.tsx +20 -0
- precursor_ai-2026.7.0/frontend/src/components/LiveList.tsx +172 -0
- precursor_ai-2026.7.0/frontend/src/components/LivePanel.tsx +339 -0
- precursor_ai-2026.7.0/frontend/src/components/LiveStartHero.tsx +348 -0
- precursor_ai-2026.7.0/frontend/src/components/LiveView.tsx +1258 -0
- precursor_ai-2026.7.0/frontend/src/components/Markdown.tsx +218 -0
- precursor_ai-2026.7.0/frontend/src/components/McpAuthBanner.tsx +67 -0
- precursor_ai-2026.7.0/frontend/src/components/MeetingBody.tsx +25 -0
- precursor_ai-2026.7.0/frontend/src/components/MemoriesTab.tsx +249 -0
- precursor_ai-2026.7.0/frontend/src/components/MermaidBlock.tsx +134 -0
- precursor_ai-2026.7.0/frontend/src/components/MessageBubble.tsx +478 -0
- precursor_ai-2026.7.0/frontend/src/components/MessageMeta.tsx +92 -0
- precursor_ai-2026.7.0/frontend/src/components/Modal.tsx +81 -0
- precursor_ai-2026.7.0/frontend/src/components/NotesPanel.tsx +307 -0
- precursor_ai-2026.7.0/frontend/src/components/NotesSection.tsx +175 -0
- precursor_ai-2026.7.0/frontend/src/components/PersonaMenu.tsx +231 -0
- precursor_ai-2026.7.0/frontend/src/components/ProjectList.tsx +73 -0
- precursor_ai-2026.7.0/frontend/src/components/RecurrenceEditor.tsx +200 -0
- precursor_ai-2026.7.0/frontend/src/components/RefineButton.tsx +56 -0
- precursor_ai-2026.7.0/frontend/src/components/RefineTextarea.tsx +89 -0
- precursor_ai-2026.7.0/frontend/src/components/ReminderBanner.tsx +34 -0
- precursor_ai-2026.7.0/frontend/src/components/ReminderModal.tsx +289 -0
- precursor_ai-2026.7.0/frontend/src/components/ResizeHandle.tsx +19 -0
- precursor_ai-2026.7.0/frontend/src/components/RoleSelector.tsx +98 -0
- precursor_ai-2026.7.0/frontend/src/components/RolesTab.tsx +246 -0
- precursor_ai-2026.7.0/frontend/src/components/Select.tsx +148 -0
- precursor_ai-2026.7.0/frontend/src/components/SettingsPanel.tsx +2227 -0
- precursor_ai-2026.7.0/frontend/src/components/Sidebar.tsx +1043 -0
- precursor_ai-2026.7.0/frontend/src/components/SidebarTabs.tsx +61 -0
- precursor_ai-2026.7.0/frontend/src/components/SkillsTab.tsx +344 -0
- precursor_ai-2026.7.0/frontend/src/components/SlashCommandPicker.tsx +80 -0
- precursor_ai-2026.7.0/frontend/src/components/SpeakerNamePicker.tsx +111 -0
- precursor_ai-2026.7.0/frontend/src/components/StartHero.tsx +125 -0
- precursor_ai-2026.7.0/frontend/src/components/StatsTab.tsx +478 -0
- precursor_ai-2026.7.0/frontend/src/components/SuggestedReplies.tsx +41 -0
- precursor_ai-2026.7.0/frontend/src/components/SummarySection.tsx +283 -0
- precursor_ai-2026.7.0/frontend/src/components/SvgBlock.tsx +133 -0
- precursor_ai-2026.7.0/frontend/src/components/ToolCallBubble.tsx +88 -0
- precursor_ai-2026.7.0/frontend/src/components/Tooltip.tsx +155 -0
- precursor_ai-2026.7.0/frontend/src/components/TopicCreateForm.tsx +224 -0
- precursor_ai-2026.7.0/frontend/src/components/TopicPicker.tsx +175 -0
- precursor_ai-2026.7.0/frontend/src/components/TopicSettingsPanel.tsx +759 -0
- precursor_ai-2026.7.0/frontend/src/components/TranslationSection.tsx +129 -0
- precursor_ai-2026.7.0/frontend/src/components/WeekdayPicker.tsx +74 -0
- precursor_ai-2026.7.0/frontend/src/components/WorkspaceChat.tsx +489 -0
- precursor_ai-2026.7.0/frontend/src/components/WorkspaceList.tsx +69 -0
- precursor_ai-2026.7.0/frontend/src/components/WorkspaceView.tsx +946 -0
- precursor_ai-2026.7.0/frontend/src/components/icons/GithubIcon.tsx +26 -0
- precursor_ai-2026.7.0/frontend/src/index.css +493 -0
- precursor_ai-2026.7.0/frontend/src/lib/api.ts +896 -0
- precursor_ai-2026.7.0/frontend/src/lib/attachments.ts +37 -0
- precursor_ai-2026.7.0/frontend/src/lib/clientId.ts +21 -0
- precursor_ai-2026.7.0/frontend/src/lib/commands.ts +395 -0
- precursor_ai-2026.7.0/frontend/src/lib/constants.ts +41 -0
- precursor_ai-2026.7.0/frontend/src/lib/detachedDraftStore.ts +108 -0
- precursor_ai-2026.7.0/frontend/src/lib/events.ts +149 -0
- precursor_ai-2026.7.0/frontend/src/lib/mcpAuth.ts +59 -0
- precursor_ai-2026.7.0/frontend/src/lib/modelsStore.ts +94 -0
- precursor_ai-2026.7.0/frontend/src/lib/notifications.ts +58 -0
- precursor_ai-2026.7.0/frontend/src/lib/plugins.ts +38 -0
- precursor_ai-2026.7.0/frontend/src/lib/rolesStore.ts +70 -0
- precursor_ai-2026.7.0/frontend/src/lib/searchHighlight.tsx +135 -0
- precursor_ai-2026.7.0/frontend/src/lib/sections.ts +86 -0
- precursor_ai-2026.7.0/frontend/src/lib/settingsStore.ts +71 -0
- precursor_ai-2026.7.0/frontend/src/lib/skillsStore.ts +59 -0
- precursor_ai-2026.7.0/frontend/src/lib/sse.ts +187 -0
- precursor_ai-2026.7.0/frontend/src/lib/streamStore.ts +412 -0
- precursor_ai-2026.7.0/frontend/src/lib/suggestions.ts +40 -0
- precursor_ai-2026.7.0/frontend/src/lib/theme.ts +27 -0
- precursor_ai-2026.7.0/frontend/src/lib/toolMeta.ts +19 -0
- precursor_ai-2026.7.0/frontend/src/lib/types.ts +1084 -0
- precursor_ai-2026.7.0/frontend/src/lib/useAzureSpeech.ts +268 -0
- precursor_ai-2026.7.0/frontend/src/lib/useChatScroll.ts +87 -0
- precursor_ai-2026.7.0/frontend/src/lib/useConversationTranscriber.ts +382 -0
- precursor_ai-2026.7.0/frontend/src/lib/useFloatingWindow.ts +163 -0
- precursor_ai-2026.7.0/frontend/src/lib/useIssueContext.ts +154 -0
- precursor_ai-2026.7.0/frontend/src/lib/useMessageDeletion.ts +86 -0
- precursor_ai-2026.7.0/frontend/src/lib/useMultiSelect.ts +83 -0
- precursor_ai-2026.7.0/frontend/src/lib/useNotesDraft.ts +347 -0
- precursor_ai-2026.7.0/frontend/src/lib/usePendingAttachments.ts +99 -0
- precursor_ai-2026.7.0/frontend/src/lib/useRefine.ts +71 -0
- precursor_ai-2026.7.0/frontend/src/lib/useReminders.ts +101 -0
- precursor_ai-2026.7.0/frontend/src/lib/useResizableBox.ts +98 -0
- precursor_ai-2026.7.0/frontend/src/lib/useResizableHeight.ts +75 -0
- precursor_ai-2026.7.0/frontend/src/lib/useResizableWidth.ts +75 -0
- precursor_ai-2026.7.0/frontend/src/lib/useWindowedMessages.ts +156 -0
- precursor_ai-2026.7.0/frontend/src/lib/workiqSignIn.ts +87 -0
- precursor_ai-2026.7.0/frontend/src/main.tsx +16 -0
- precursor_ai-2026.7.0/frontend/src/vite-env.d.ts +1 -0
- precursor_ai-2026.7.0/frontend/tsconfig.json +23 -0
- precursor_ai-2026.7.0/frontend/tsconfig.node.json +11 -0
- precursor_ai-2026.7.0/frontend/vite.config.ts +30 -0
- precursor_ai-2026.7.0/hatch_build.py +35 -0
- precursor_ai-2026.7.0/precursor/__init__.py +29 -0
- precursor_ai-2026.7.0/precursor/_version.py +24 -0
- precursor_ai-2026.7.0/precursor/backend/__init__.py +1 -0
- precursor_ai-2026.7.0/precursor/backend/__main__.py +578 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/env.py +62 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/script.py.mako +27 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/.keep +6 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/0001_baseline.py +438 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/0ab504427707_drop_agent_streaming_column.py +36 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/0c1254639726_add_note_draft_attachments.py +62 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/0fd63760742a_add_agent_sessions.py +77 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/22ce95ab9f0a_add_meeting_attachments_table.py +64 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/2b00968ac335_add_agent_events_timeline_archive.py +48 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/2ec08130160f_meeting_session_attendees.py +34 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/38e2b7f39f6c_add_context_notes_json_to_meeting_.py +34 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/4083e9c16be8_add_chat_id_to_meeting_sessions.py +36 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/4cc067ddf339_meeting_session_external_meeting_link.py +31 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/4fbf2183a9da_add_meeting_session_archiving.py +33 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/5c8e2aeaa48d_meeting_session_speaker_names_map.py +34 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/64f57b15c12d_add_skill_enablement_columns.py +33 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/7ef20a82eb10_add_agent_archiving_and_message_agent_.py +45 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/949c707eb929_add_agent_schedule.py +71 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/9633c13db421_add_notes_to_meeting_sessions.py +33 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/9f842f526300_live_meeting_assistant_sessions.py +114 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/a1b2c3d4e5f6_add_role_id_to_live_and_agents.py +40 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/a5eb51059e1e_add_message_model_and_elapsed_ms.py +33 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/b548d127e6b3_add_features_to_meeting_sessions.py +43 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/c04d5ffe8e4c_add_agent_active_prompt_and_streaming_.py +35 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/c7a1e2b3d4f5_scheduled_topics_to_schedule.py +43 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/cf7e6a63db17_add_note_drafts.py +60 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/d1b38ab39d00_add_meeting_sessions_topic_summary.py +31 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/df4618970b0e_add_message_suggestions.py +31 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/e1a2c3d4b5f6_add_agent_last_read_at.py +34 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/f1a2b3c4d5e6_move_attachments_to_disk.py +84 -0
- precursor_ai-2026.7.0/precursor/backend/alembic/versions/f4d0de85d7e4_add_meeting_sessions_summary_posted_.py +39 -0
- precursor_ai-2026.7.0/precursor/backend/banner.py +131 -0
- precursor_ai-2026.7.0/precursor/backend/config.py +196 -0
- precursor_ai-2026.7.0/precursor/backend/db.py +177 -0
- precursor_ai-2026.7.0/precursor/backend/logging_config.py +162 -0
- precursor_ai-2026.7.0/precursor/backend/main.py +336 -0
- precursor_ai-2026.7.0/precursor/backend/models/__init__.py +56 -0
- precursor_ai-2026.7.0/precursor/backend/models/agent_event.py +44 -0
- precursor_ai-2026.7.0/precursor/backend/models/agent_schedule.py +88 -0
- precursor_ai-2026.7.0/precursor/backend/models/agent_session.py +147 -0
- precursor_ai-2026.7.0/precursor/backend/models/attachment.py +51 -0
- precursor_ai-2026.7.0/precursor/backend/models/base.py +32 -0
- precursor_ai-2026.7.0/precursor/backend/models/chat.py +74 -0
- precursor_ai-2026.7.0/precursor/backend/models/issue_context.py +34 -0
- precursor_ai-2026.7.0/precursor/backend/models/mcp_server.py +27 -0
- precursor_ai-2026.7.0/precursor/backend/models/meeting.py +251 -0
- precursor_ai-2026.7.0/precursor/backend/models/memory.py +18 -0
- precursor_ai-2026.7.0/precursor/backend/models/message.py +99 -0
- precursor_ai-2026.7.0/precursor/backend/models/note_draft.py +50 -0
- precursor_ai-2026.7.0/precursor/backend/models/note_draft_attachment.py +32 -0
- precursor_ai-2026.7.0/precursor/backend/models/reminder.py +72 -0
- precursor_ai-2026.7.0/precursor/backend/models/role.py +31 -0
- precursor_ai-2026.7.0/precursor/backend/models/settings.py +16 -0
- precursor_ai-2026.7.0/precursor/backend/models/skill.py +39 -0
- precursor_ai-2026.7.0/precursor/backend/models/topic.py +113 -0
- precursor_ai-2026.7.0/precursor/backend/models/topic_schedule.py +85 -0
- precursor_ai-2026.7.0/precursor/backend/models/usage.py +42 -0
- precursor_ai-2026.7.0/precursor/backend/models/workspace.py +51 -0
- precursor_ai-2026.7.0/precursor/backend/plugins/__init__.py +26 -0
- precursor_ai-2026.7.0/precursor/backend/plugins/registry.py +70 -0
- precursor_ai-2026.7.0/precursor/backend/routers/__init__.py +5 -0
- precursor_ai-2026.7.0/precursor/backend/routers/agents.py +605 -0
- precursor_ai-2026.7.0/precursor/backend/routers/attachments.py +138 -0
- precursor_ai-2026.7.0/precursor/backend/routers/chat.py +234 -0
- precursor_ai-2026.7.0/precursor/backend/routers/chat_messages.py +376 -0
- precursor_ai-2026.7.0/precursor/backend/routers/chats.py +237 -0
- precursor_ai-2026.7.0/precursor/backend/routers/commands.py +788 -0
- precursor_ai-2026.7.0/precursor/backend/routers/deps.py +35 -0
- precursor_ai-2026.7.0/precursor/backend/routers/events.py +41 -0
- precursor_ai-2026.7.0/precursor/backend/routers/github.py +210 -0
- precursor_ai-2026.7.0/precursor/backend/routers/issue.py +90 -0
- precursor_ai-2026.7.0/precursor/backend/routers/live.py +901 -0
- precursor_ai-2026.7.0/precursor/backend/routers/llm.py +58 -0
- precursor_ai-2026.7.0/precursor/backend/routers/mcp.py +526 -0
- precursor_ai-2026.7.0/precursor/backend/routers/me.py +60 -0
- precursor_ai-2026.7.0/precursor/backend/routers/memories.py +48 -0
- precursor_ai-2026.7.0/precursor/backend/routers/projects.py +128 -0
- precursor_ai-2026.7.0/precursor/backend/routers/raw.py +37 -0
- precursor_ai-2026.7.0/precursor/backend/routers/refine.py +35 -0
- precursor_ai-2026.7.0/precursor/backend/routers/reminders.py +110 -0
- precursor_ai-2026.7.0/precursor/backend/routers/roles.py +126 -0
- precursor_ai-2026.7.0/precursor/backend/routers/search.py +21 -0
- precursor_ai-2026.7.0/precursor/backend/routers/settings.py +265 -0
- precursor_ai-2026.7.0/precursor/backend/routers/skills.py +121 -0
- precursor_ai-2026.7.0/precursor/backend/routers/stats.py +23 -0
- precursor_ai-2026.7.0/precursor/backend/routers/stt.py +93 -0
- precursor_ai-2026.7.0/precursor/backend/routers/summary.py +236 -0
- precursor_ai-2026.7.0/precursor/backend/routers/topics.py +459 -0
- precursor_ai-2026.7.0/precursor/backend/routers/version.py +42 -0
- precursor_ai-2026.7.0/precursor/backend/routers/workspaces.py +770 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/__init__.py +173 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/agent.py +132 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/agent_schedule.py +67 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/chat.py +42 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/llm.py +30 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/meeting.py +217 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/memory.py +51 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/message.py +141 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/projects.py +99 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/refine.py +23 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/reminder.py +41 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/role.py +48 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/schedule.py +101 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/search.py +65 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/settings.py +171 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/skill.py +66 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/stats.py +92 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/topic.py +64 -0
- precursor_ai-2026.7.0/precursor/backend/schemas/workspace.py +137 -0
- precursor_ai-2026.7.0/precursor/backend/services/__init__.py +1 -0
- precursor_ai-2026.7.0/precursor/backend/services/agents/__init__.py +0 -0
- precursor_ai-2026.7.0/precursor/backend/services/agents/event_normalizer.py +154 -0
- precursor_ai-2026.7.0/precursor/backend/services/agents/manager.py +1697 -0
- precursor_ai-2026.7.0/precursor/backend/services/agents/permissions.py +77 -0
- precursor_ai-2026.7.0/precursor/backend/services/agents/runtime.py +115 -0
- precursor_ai-2026.7.0/precursor/backend/services/app_settings.py +615 -0
- precursor_ai-2026.7.0/precursor/backend/services/attachment_extraction.py +183 -0
- precursor_ai-2026.7.0/precursor/backend/services/background_poll.py +89 -0
- precursor_ai-2026.7.0/precursor/backend/services/backup.py +311 -0
- precursor_ai-2026.7.0/precursor/backend/services/backup_ticker.py +54 -0
- precursor_ai-2026.7.0/precursor/backend/services/blob_store.py +110 -0
- precursor_ai-2026.7.0/precursor/backend/services/cmd_runner.py +229 -0
- precursor_ai-2026.7.0/precursor/backend/services/context_budget.py +102 -0
- precursor_ai-2026.7.0/precursor/backend/services/events.py +220 -0
- precursor_ai-2026.7.0/precursor/backend/services/github_auth.py +78 -0
- precursor_ai-2026.7.0/precursor/backend/services/github_client.py +511 -0
- precursor_ai-2026.7.0/precursor/backend/services/image_uploads.py +62 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/__init__.py +92 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/_openai_compat.py +183 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/azure_foundry.py +97 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/base.py +139 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/github_copilot.py +131 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/github_models.py +116 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/mock.py +84 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/openai_compatible.py +115 -0
- precursor_ai-2026.7.0/precursor/backend/services/llm/registry.py +176 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/__init__.py +1 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/client.py +712 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/cmd_runner_server.py +220 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/fetch_server.py +161 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/precursor_server.py +789 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/server.py +81 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/user_servers.py +85 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/workiq_keepalive.py +139 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/workiq_preview.py +772 -0
- precursor_ai-2026.7.0/precursor/backend/services/mcp/workspace_fs_server.py +205 -0
- precursor_ai-2026.7.0/precursor/backend/services/meeting_agenda.py +205 -0
- precursor_ai-2026.7.0/precursor/backend/services/meeting_analysis.py +626 -0
- precursor_ai-2026.7.0/precursor/backend/services/meeting_summary.py +271 -0
- precursor_ai-2026.7.0/precursor/backend/services/memories.py +134 -0
- precursor_ai-2026.7.0/precursor/backend/services/message_paging.py +47 -0
- precursor_ai-2026.7.0/precursor/backend/services/note_drafts.py +103 -0
- precursor_ai-2026.7.0/precursor/backend/services/notes.py +179 -0
- precursor_ai-2026.7.0/precursor/backend/services/reminder_ticker.py +40 -0
- precursor_ai-2026.7.0/precursor/backend/services/reminders.py +221 -0
- precursor_ai-2026.7.0/precursor/backend/services/roles.py +27 -0
- precursor_ai-2026.7.0/precursor/backend/services/schedule_timing.py +102 -0
- precursor_ai-2026.7.0/precursor/backend/services/scheduled_commands.py +865 -0
- precursor_ai-2026.7.0/precursor/backend/services/scheduler.py +388 -0
- precursor_ai-2026.7.0/precursor/backend/services/search.py +334 -0
- precursor_ai-2026.7.0/precursor/backend/services/skills.py +364 -0
- precursor_ai-2026.7.0/precursor/backend/services/slugs.py +58 -0
- precursor_ai-2026.7.0/precursor/backend/services/stt.py +38 -0
- precursor_ai-2026.7.0/precursor/backend/services/suggestions.py +73 -0
- precursor_ai-2026.7.0/precursor/backend/services/system_stats.py +153 -0
- precursor_ai-2026.7.0/precursor/backend/services/text_refine.py +115 -0
- precursor_ai-2026.7.0/precursor/backend/services/tool_result_retention.py +71 -0
- precursor_ai-2026.7.0/precursor/backend/services/tool_result_ticker.py +36 -0
- precursor_ai-2026.7.0/precursor/backend/services/topic_issue.py +89 -0
- precursor_ai-2026.7.0/precursor/backend/services/turn.py +244 -0
- precursor_ai-2026.7.0/precursor/backend/services/turn_engine.py +847 -0
- precursor_ai-2026.7.0/precursor/backend/services/unread.py +43 -0
- precursor_ai-2026.7.0/precursor/backend/services/usage_stats.py +128 -0
- precursor_ai-2026.7.0/precursor/backend/services/workspace_fs.py +155 -0
- precursor_ai-2026.7.0/precursor/backend/services/workspace_git.py +192 -0
- precursor_ai-2026.7.0/pyproject.toml +151 -0
- precursor_ai-2026.7.0/tests/__init__.py +0 -0
- precursor_ai-2026.7.0/tests/conftest.py +51 -0
- precursor_ai-2026.7.0/tests/test_agent_schedules.py +192 -0
- precursor_ai-2026.7.0/tests/test_agents.py +1045 -0
- precursor_ai-2026.7.0/tests/test_agents_auth_surface.py +138 -0
- precursor_ai-2026.7.0/tests/test_app.py +911 -0
- precursor_ai-2026.7.0/tests/test_backup.py +177 -0
- precursor_ai-2026.7.0/tests/test_banner.py +38 -0
- precursor_ai-2026.7.0/tests/test_chat_description_prompt.py +152 -0
- precursor_ai-2026.7.0/tests/test_chat_tool_result.py +51 -0
- precursor_ai-2026.7.0/tests/test_cmd_runner.py +111 -0
- precursor_ai-2026.7.0/tests/test_frontend_build.py +111 -0
- precursor_ai-2026.7.0/tests/test_issue_detail.py +140 -0
- precursor_ai-2026.7.0/tests/test_launcher_ports.py +81 -0
- precursor_ai-2026.7.0/tests/test_live_sessions.py +919 -0
- precursor_ai-2026.7.0/tests/test_mcp_auth_pause.py +144 -0
- precursor_ai-2026.7.0/tests/test_mcp_deferred_status.py +75 -0
- precursor_ai-2026.7.0/tests/test_mcp_pool.py +127 -0
- precursor_ai-2026.7.0/tests/test_memory_commands.py +206 -0
- precursor_ai-2026.7.0/tests/test_precursor_mcp.py +256 -0
- precursor_ai-2026.7.0/tests/test_projects.py +284 -0
- precursor_ai-2026.7.0/tests/test_refine.py +70 -0
- precursor_ai-2026.7.0/tests/test_reminders.py +111 -0
- precursor_ai-2026.7.0/tests/test_roles.py +214 -0
- precursor_ai-2026.7.0/tests/test_scheduled_commands.py +612 -0
- precursor_ai-2026.7.0/tests/test_skills.py +286 -0
- precursor_ai-2026.7.0/tests/test_suggestions.py +76 -0
- precursor_ai-2026.7.0/tests/test_system_stats.py +165 -0
- precursor_ai-2026.7.0/tests/test_tool_result_retention.py +181 -0
- precursor_ai-2026.7.0/tests/test_topic_schedules.py +85 -0
- precursor_ai-2026.7.0/tests/test_usage_stats.py +149 -0
- precursor_ai-2026.7.0/tests/test_version.py +37 -0
- precursor_ai-2026.7.0/tests/test_workiq_keepalive.py +120 -0
- precursor_ai-2026.7.0/tests/test_workiq_preview.py +386 -0
- precursor_ai-2026.7.0/tests/test_workspace_fs.py +75 -0
- precursor_ai-2026.7.0/uv.lock +1766 -0
- precursor_ai-2026.7.0/website/.vitepress/config.mts +136 -0
- precursor_ai-2026.7.0/website/.vitepress/theme/Layout.vue +26 -0
- precursor_ai-2026.7.0/website/.vitepress/theme/Screenshot.vue +35 -0
- precursor_ai-2026.7.0/website/.vitepress/theme/custom.css +109 -0
- precursor_ai-2026.7.0/website/.vitepress/theme/index.ts +38 -0
- precursor_ai-2026.7.0/website/README.md +39 -0
- precursor_ai-2026.7.0/website/contributing/index.md +108 -0
- precursor_ai-2026.7.0/website/contributing/releasing.md +102 -0
- precursor_ai-2026.7.0/website/contributing/workflow.md +86 -0
- precursor_ai-2026.7.0/website/features/agents.md +68 -0
- precursor_ai-2026.7.0/website/features/attachments.md +45 -0
- precursor_ai-2026.7.0/website/features/chats.md +52 -0
- precursor_ai-2026.7.0/website/features/command-runner.md +45 -0
- precursor_ai-2026.7.0/website/features/index.md +49 -0
- precursor_ai-2026.7.0/website/features/kanban.md +46 -0
- precursor_ai-2026.7.0/website/features/live-sessions.md +78 -0
- precursor_ai-2026.7.0/website/features/mcp.md +70 -0
- precursor_ai-2026.7.0/website/features/plugins.md +87 -0
- precursor_ai-2026.7.0/website/features/scheduler.md +103 -0
- precursor_ai-2026.7.0/website/features/skills-memory.md +71 -0
- precursor_ai-2026.7.0/website/features/topics.md +67 -0
- precursor_ai-2026.7.0/website/features/workspaces.md +42 -0
- precursor_ai-2026.7.0/website/guide/configuration.md +95 -0
- precursor_ai-2026.7.0/website/guide/installation.md +139 -0
- precursor_ai-2026.7.0/website/guide/introduction.md +78 -0
- precursor_ai-2026.7.0/website/guide/quick-start.md +73 -0
- precursor_ai-2026.7.0/website/index.md +138 -0
- precursor_ai-2026.7.0/website/package-lock.json +3812 -0
- precursor_ai-2026.7.0/website/package.json +19 -0
- precursor_ai-2026.7.0/website/public/CNAME +1 -0
- precursor_ai-2026.7.0/website/public/logo.svg +13 -0
- precursor_ai-2026.7.0/website/public/screenshots/agents-dark.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/agents.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/chats-dark.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/chats.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/home-dark.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/home.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/kanban-dark.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/kanban.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/live-dark.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/live.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/mcp-settings-dark.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/mcp-settings.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/topics-dark.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/topics.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/workspaces-dark.png +0 -0
- precursor_ai-2026.7.0/website/public/screenshots/workspaces.png +0 -0
- precursor_ai-2026.7.0/website/reference/api.md +60 -0
- precursor_ai-2026.7.0/website/reference/architecture.md +188 -0
- precursor_ai-2026.7.0/website/reference/configuration.md +71 -0
- precursor_ai-2026.7.0/website/reference/plugins.md +109 -0
- precursor_ai-2026.7.0/website/reference/stack.md +66 -0
|
@@ -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,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
|