@loicngr/kobo 1.11.44 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/AGENTS.md +57 -4
  2. package/CHANGELOG.md +13 -0
  3. package/CODE_OF_CONDUCT.md +16 -0
  4. package/CONFIGURATION.md +1968 -0
  5. package/CONTRIBUTING.md +83 -0
  6. package/DESIGN.md +296 -0
  7. package/README.md +48 -8
  8. package/SECURITY.md +54 -0
  9. package/THIRD_PARTY_NOTICES.md +20 -0
  10. package/dist/mcp-server/kobo-tasks-handlers.js +2 -1
  11. package/dist/mcp-server/kobo-tasks-server.js +31 -5
  12. package/dist/server/db/migrations.js +37 -0
  13. package/dist/server/db/schema.js +6 -1
  14. package/dist/server/db/session-handoff-schema.js +24 -0
  15. package/dist/server/index.js +8 -0
  16. package/dist/server/routes/documents.js +1 -1
  17. package/dist/server/routes/environment.js +18 -0
  18. package/dist/server/routes/health.js +17 -2
  19. package/dist/server/routes/integrations.js +29 -0
  20. package/dist/server/routes/settings.js +5 -0
  21. package/dist/server/routes/sounds.js +60 -0
  22. package/dist/server/routes/workspaces.js +118 -20
  23. package/dist/server/services/agent/engines/claude-code/engine.js +15 -0
  24. package/dist/server/services/agent/engines/codex/engine.js +1 -0
  25. package/dist/server/services/agent/engines/codex/options-builder.js +1 -0
  26. package/dist/server/services/agent/engines/codex/spawn.js +2 -2
  27. package/dist/server/services/agent/integration-mcp.js +49 -0
  28. package/dist/server/services/agent/orchestrator.js +68 -11
  29. package/dist/server/services/auto-loop-service.js +45 -25
  30. package/dist/server/services/custom-sound-service.js +0 -0
  31. package/dist/server/services/engine-handoff-service.js +5 -5
  32. package/dist/server/services/environment-check-service.js +125 -0
  33. package/dist/server/services/initial-prompt-template-service.js +8 -21
  34. package/dist/server/services/integration-config-service.js +65 -0
  35. package/dist/server/services/legacy-public-prompts.js +112 -0
  36. package/dist/server/services/notion-service.js +25 -61
  37. package/dist/server/services/sentry-service.js +17 -12
  38. package/dist/server/services/session-activity-service.js +17 -0
  39. package/dist/server/services/session-handoff-runtime.js +26 -0
  40. package/dist/server/services/session-handoff-service.js +479 -0
  41. package/dist/server/services/settings-defaults.js +5 -0
  42. package/dist/server/services/settings-service.js +112 -23
  43. package/dist/server/services/skill-suite-prompts.js +29 -22
  44. package/dist/server/services/templates-service.js +31 -8
  45. package/dist/server/services/terminal-service.js +16 -0
  46. package/dist/server/services/wakeup-service.js +15 -5
  47. package/dist/server/services/workspace-service.js +30 -6
  48. package/dist/server/services/worktree-service.js +3 -1
  49. package/dist/server/utils/git-repo-lock.js +7 -3
  50. package/dist/server/utils/mcp-client.js +26 -12
  51. package/dist/server/utils/mcp-process.js +25 -0
  52. package/dist/server/utils/node-pty-spawn-helper.js +31 -0
  53. package/dist/server/utils/paths.js +7 -0
  54. package/dist/server/utils/workspace-lifecycle-guard.js +35 -20
  55. package/dist/shared/auto-loop-prompts.js +6 -2
  56. package/dist/shared/automatic-admission.js +1 -0
  57. package/dist/shared/document-roots.js +2 -0
  58. package/dist/shared/environment.js +1 -0
  59. package/dist/shared/notification-assets.js +73 -0
  60. package/dist/shared/session-handoff.js +4 -0
  61. package/dist/shared/skill-suite-prompts.js +6 -3
  62. package/dist/shared/workflow-policy.js +25 -0
  63. package/docs/getting-started.md +47 -0
  64. package/docs/troubleshooting.md +49 -0
  65. package/package.json +19 -7
  66. package/src/client/dist/pwa/assets/ActivityFeed-DRgetl1M.js +8 -0
  67. package/src/client/dist/pwa/assets/{ChangelogPage-DSKCvpr2.js → ChangelogPage-BJdICFvz.js} +1 -1
  68. package/src/client/dist/pwa/assets/{ComparisonPanel-DDxcsxyC.js → ComparisonPanel-2GLd8KIy.js} +1 -1
  69. package/src/client/dist/pwa/assets/CreatePage-B9AdNJZj.js +2 -0
  70. package/src/client/dist/pwa/assets/CreatePage-B9C9J9Pw.css +1 -0
  71. package/src/client/dist/pwa/assets/DashboardPage-CzVOvjSP.js +1 -0
  72. package/src/client/dist/pwa/assets/DiffViewer-X25vuf83.js +8 -0
  73. package/src/client/dist/pwa/assets/{DocumentsPanel-DfEoI_f7.js → DocumentsPanel-BastjrEm.js} +1 -1
  74. package/src/client/dist/pwa/assets/{DrawerToggleButton-D85PwhKb.js → DrawerToggleButton-DbipGmBL.js} +1 -1
  75. package/src/client/dist/pwa/assets/{GitPanel-BFCnyhE2.css → GitPanel-C4wOcZV2.css} +1 -1
  76. package/src/client/dist/pwa/assets/GitPanel-CnW4iVao.js +3 -0
  77. package/src/client/dist/pwa/assets/{HealthPage-CaLCpejR.js → HealthPage-aieNQly-.js} +1 -1
  78. package/src/client/dist/pwa/assets/MainLayout-Cc4XzCAy.css +1 -0
  79. package/src/client/dist/pwa/assets/MainLayout-DqBbE8o4.js +2 -0
  80. package/src/client/dist/pwa/assets/{QBtnDropdown-qJWGcZpC.js → QBtnDropdown-BWy-rh45.js} +1 -1
  81. package/src/client/dist/pwa/assets/QExpansionItem-DfmdBGuW.js +1 -0
  82. package/src/client/dist/pwa/assets/QSelect-BfqaWakg.js +1 -0
  83. package/src/client/dist/pwa/assets/{QTooltip-cDK5AOQ5.js → QTooltip-Cy0T0vk2.js} +1 -1
  84. package/src/client/dist/pwa/assets/SchedulePanel-BYKSFoFj.css +1 -0
  85. package/src/client/dist/pwa/assets/SchedulePanel-YQPObRR3.js +1 -0
  86. package/src/client/dist/pwa/assets/{SearchPage-BO-J4aNc.js → SearchPage-BoBjmItc.js} +1 -1
  87. package/src/client/dist/pwa/assets/SettingsPage-0GtDcXRC.js +9 -0
  88. package/src/client/dist/pwa/assets/{SettingsPage-W6N01tGz.css → SettingsPage-BYdLXJEJ.css} +1 -1
  89. package/src/client/dist/pwa/assets/SplitWorkspacePage-4wFh65Lh.js +1 -0
  90. package/src/client/dist/pwa/assets/{TerminalPanel-DitOCad1.js → TerminalPanel-b70x_jqH.js} +9 -9
  91. package/src/client/dist/pwa/assets/{TouchPan-DvPAhZsa.js → TouchPan-CcTVcxwd.js} +1 -1
  92. package/src/client/dist/pwa/assets/{TourReplayButton-CJYdH3Jf.js → TourReplayButton-CpEMnQS8.js} +1 -1
  93. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-C5lTHTp2.js +1 -0
  94. package/src/client/dist/pwa/assets/{WorkspacePage-DAVo-E4p.css → WorkspacePage--5HsnMQ1.css} +1 -1
  95. package/src/client/dist/pwa/assets/WorkspacePage-D_V9gNON.js +4 -0
  96. package/src/client/dist/pwa/assets/{browser-BsB6cFv4.js → browser-LBbxVwWf.js} +1 -1
  97. package/src/client/dist/pwa/assets/build-path-tree-DyvtWxb0.js +1 -0
  98. package/src/client/dist/pwa/assets/custom-sounds-BpeLZUDW.js +1 -0
  99. package/src/client/dist/pwa/assets/de-v6i2HlE2.js +17 -0
  100. package/src/client/dist/pwa/assets/{documents-SCd3w8xV.js → documents-Bjx8lz-h.js} +1 -1
  101. package/src/client/dist/pwa/assets/{editor.api-BUdM7I6y.js → editor.api-BC3PbJkx.js} +1 -1
  102. package/src/client/dist/pwa/assets/efforts-BDHAnNUs.js +9 -0
  103. package/src/client/dist/pwa/assets/engineFeatures-hlEiwqt-.js +1 -0
  104. package/src/client/dist/pwa/assets/es-Bc1KgkAT.js +17 -0
  105. package/src/client/dist/pwa/assets/expand-template-DLDl1qPx.js +1 -0
  106. package/src/client/dist/pwa/assets/{format-BjQxf4pe.js → format-Q94deO3I.js} +7 -7
  107. package/src/client/dist/pwa/assets/{formatters-BejhmNTV.js → formatters-CWxRHuUu.js} +1 -1
  108. package/src/client/dist/pwa/assets/fr-ByYPK5vr.js +17 -0
  109. package/src/client/dist/pwa/assets/{freemarker2-5d5GhyRp.js → freemarker2-MPhk0eTh.js} +1 -1
  110. package/src/client/dist/pwa/assets/{handlebars-DaafEsDK.js → handlebars-C60ru5gR.js} +1 -1
  111. package/src/client/dist/pwa/assets/{html-CwHBDd2A.js → html-ClzchR9j.js} +1 -1
  112. package/src/client/dist/pwa/assets/i18n-Sy42tm-V.js +1 -0
  113. package/src/client/dist/pwa/assets/index-CqZ7sDcM.js +20 -0
  114. package/src/client/dist/pwa/assets/it-BYF_88z6.js +17 -0
  115. package/src/client/dist/pwa/assets/{javascript-DSNIEEH5.js → javascript-C43UJmMx.js} +1 -1
  116. package/src/client/dist/pwa/assets/{liquid-Dma1UpA1.js → liquid-CYTrvTKF.js} +1 -1
  117. package/src/client/dist/pwa/assets/{mdx-D8rqEAws.js → mdx-CxsXOvkQ.js} +1 -1
  118. package/src/client/dist/pwa/assets/{monaco-contributions-2E7O2zoi.js → monaco-contributions-Cl4-iVpK.js} +1 -1
  119. package/src/client/dist/pwa/assets/monaco.contribution-DkjLUmyA.js +2 -0
  120. package/src/client/dist/pwa/assets/network-auth-CXQn2wO7.js +1 -0
  121. package/src/client/dist/pwa/assets/notify-theme-BrueBr2j.js +1 -0
  122. package/src/client/dist/pwa/assets/{pending-diff-open-CeiVIFZn.js → pending-diff-open-B4POItbR.js} +1 -1
  123. package/src/client/dist/pwa/assets/permissionModes-B-ciuUbz.js +36 -0
  124. package/src/client/dist/pwa/assets/{project-color-BCp9SWoI.js → project-color-CM3hflLH.js} +1 -1
  125. package/src/client/dist/pwa/assets/{python-f-9NqRlI.js → python-s2IMpsoV.js} +1 -1
  126. package/src/client/dist/pwa/assets/{razor-DsCmoX0h.js → razor-DVNXiVBh.js} +1 -1
  127. package/src/client/dist/pwa/assets/render-chat-markdown-TU6CDfD8.js +69 -0
  128. package/src/client/dist/pwa/assets/{typescript-cEHg4L10.js → typescript-BYT_8ABE.js} +1 -1
  129. package/src/client/dist/pwa/assets/use-slide-transition-CiaDm-tR.js +1 -0
  130. package/src/client/dist/pwa/assets/use-tours-CNe8qb1q.js +2 -0
  131. package/src/client/dist/pwa/assets/workspace-templates-tBxXE52A.js +1 -0
  132. package/src/client/dist/pwa/assets/{xml-Plt-Y7we.js → xml-BIG-fmxk.js} +1 -1
  133. package/src/client/dist/pwa/assets/{yaml-ScEmaAeN.js → yaml-D7gu2CQh.js} +1 -1
  134. package/src/client/dist/pwa/index.html +1 -1
  135. package/src/client/dist/pwa/sounds/neutral.wav +0 -0
  136. package/src/client/dist/pwa/sounds/ready.wav +0 -0
  137. package/src/client/dist/pwa/sw.js +1 -1
  138. package/src/mcp-server/README.md +8 -1
  139. package/src/mcp-server/kobo-tasks-handlers.ts +4 -1
  140. package/src/mcp-server/kobo-tasks-server.ts +38 -5
  141. package/src/client/dist/pwa/assets/ActivityFeed-D_y4aikp.js +0 -8
  142. package/src/client/dist/pwa/assets/CreatePage-DKVEknbL.js +0 -2
  143. package/src/client/dist/pwa/assets/CreatePage-TY9g3hZb.css +0 -1
  144. package/src/client/dist/pwa/assets/DashboardPage-Dg2s9nnv.js +0 -1
  145. package/src/client/dist/pwa/assets/DiffViewer-BSzNScIr.js +0 -8
  146. package/src/client/dist/pwa/assets/GitPanel-CuG8MlgF.js +0 -3
  147. package/src/client/dist/pwa/assets/MainLayout-CDxYIJ_s.js +0 -2
  148. package/src/client/dist/pwa/assets/MainLayout-DTLNunOi.css +0 -1
  149. package/src/client/dist/pwa/assets/QDrawer-DX3PhMqC.js +0 -1
  150. package/src/client/dist/pwa/assets/QSelect-CY4TWW_j.js +0 -1
  151. package/src/client/dist/pwa/assets/SchedulePanel-BAA4Aajn.css +0 -1
  152. package/src/client/dist/pwa/assets/SchedulePanel-LvHiZ6ZH.js +0 -1
  153. package/src/client/dist/pwa/assets/SettingsPage-Aw89fRSq.js +0 -9
  154. package/src/client/dist/pwa/assets/SplitWorkspacePage-BIEceNwH.js +0 -1
  155. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-CY-9z9nw.js +0 -1
  156. package/src/client/dist/pwa/assets/WorkspacePage-xH_OyA3r.js +0 -4
  157. package/src/client/dist/pwa/assets/build-path-tree-CW-ER1Mt.js +0 -1
  158. package/src/client/dist/pwa/assets/de-Mu7biceO.js +0 -17
  159. package/src/client/dist/pwa/assets/efforts-DTJQP9or.js +0 -9
  160. package/src/client/dist/pwa/assets/engineFeatures-Bj6Ob41d.js +0 -1
  161. package/src/client/dist/pwa/assets/es-BY5IfNI2.js +0 -17
  162. package/src/client/dist/pwa/assets/expand-template-SM8vvYyO.js +0 -1
  163. package/src/client/dist/pwa/assets/fouet-ahh-DdxrUXRj.mp3 +0 -0
  164. package/src/client/dist/pwa/assets/fr-BMXCzFCM.js +0 -17
  165. package/src/client/dist/pwa/assets/i18n-CgWW5vfb.js +0 -1
  166. package/src/client/dist/pwa/assets/index-Di9Sz5E8.js +0 -20
  167. package/src/client/dist/pwa/assets/it-ByPZQK_K.js +0 -17
  168. package/src/client/dist/pwa/assets/monaco.contribution-DqOgo72G.js +0 -2
  169. package/src/client/dist/pwa/assets/network-auth-DNmhJTZn.js +0 -1
  170. package/src/client/dist/pwa/assets/notify-theme-B6Hiwvwb.js +0 -1
  171. package/src/client/dist/pwa/assets/permissionModes-DWdtf81n.js +0 -36
  172. package/src/client/dist/pwa/assets/render-chat-markdown-DK5BD9mU.js +0 -67
  173. package/src/client/dist/pwa/assets/use-tours-BmTbosmB.js +0 -2
  174. package/src/client/dist/pwa/assets/workspace-templates-DUWDLMIX.js +0 -1
  175. package/src/client/dist/pwa/sounds/7eme-compagnie-03.mp3 +0 -0
  176. package/src/client/dist/pwa/sounds/aller-ftg.mp3 +0 -0
  177. package/src/client/dist/pwa/sounds/arrete-de-mentir.mp3 +0 -0
  178. package/src/client/dist/pwa/sounds/arretez-les-messages.mp3 +0 -0
  179. package/src/client/dist/pwa/sounds/bah-alors-on-est-nul.mp3 +0 -0
  180. package/src/client/dist/pwa/sounds/basic-notification.mp3 +0 -0
  181. package/src/client/dist/pwa/sounds/ca_va_peter.mp3 +0 -0
  182. package/src/client/dist/pwa/sounds/dry-fart.mp3 +0 -0
  183. package/src/client/dist/pwa/sounds/faaah.mp3 +0 -0
  184. package/src/client/dist/pwa/sounds/for-shure.mp3 +0 -0
  185. package/src/client/dist/pwa/sounds/gta-v-death.mp3 +0 -0
  186. package/src/client/dist/pwa/sounds/hey.mp3 +0 -0
  187. package/src/client/dist/pwa/sounds/mais-laisse-moi-dormir-zebi.mp3 +0 -0
  188. package/src/client/dist/pwa/sounds/nan-tu-degages.mp3 +0 -0
  189. package/src/client/dist/pwa/sounds/nan-wallah-pardon.mp3 +0 -0
  190. package/src/client/dist/pwa/sounds/ouais-cest-greg.mp3 +0 -0
  191. package/src/client/dist/pwa/sounds/pas-ca-zinedine.mp3 +0 -0
  192. package/src/client/dist/pwa/sounds/ta-gueule.mp3 +0 -0
  193. package/src/client/dist/pwa/sounds/travail_termine.mp3 +0 -0
  194. package/src/client/dist/pwa/sounds/tu-vas-la-fermer.mp3 +0 -0
  195. package/src/client/dist/pwa/sounds/warcraft-3-humain-travail.mp3 +0 -0
  196. package/src/client/dist/pwa/sounds/yaaa.mp3 +0 -0
@@ -0,0 +1,83 @@
1
+ # Contributing to Kōbō
2
+
3
+ Thanks for considering a contribution. This guide covers the from-source setup, available scripts, testing discipline, git workflow, and release process. For architecture, data model, and code conventions, see [`AGENTS.md`](./AGENTS.md).
4
+
5
+ ## Prerequisites
6
+
7
+ Node.js ≥ 24.15. The repository's `.nvmrc` pins the tested version; run
8
+ `nvm use` when using nvm.
9
+
10
+ ## Setup
11
+
12
+ ```bash
13
+ git clone https://github.com/loicngr/Kobo.git
14
+ cd Kobo
15
+ npm run install-all # root + client + PWA build dependencies
16
+ npm run dev:all # backend :3300 + client :8080
17
+ ```
18
+
19
+ A production-installed Kōbō (`npx @loicngr/kobo`) and a dev server can run side by side, since they use separate data directories (`KOBO_HOME=./data` in dev vs `~/.config/kobo/` in production).
20
+
21
+ ## Scripts
22
+
23
+ ```bash
24
+ npm run dev # backend only (tsx watch, :3300)
25
+ npm run dev:client # frontend only (quasar dev, :8080)
26
+ npm run dev:all # both concurrently
27
+
28
+ npm run build # production build (client + server)
29
+ npm start # run the compiled server
30
+
31
+ npm test # backend vitest suite
32
+ npm run test:client # client vitest suite
33
+ npm run test:all # both
34
+
35
+ npm run test:package # after build: install tarball in a disposable home and exercise it
36
+ npm run security:scan # requires Gitleaks 8.30.1; history + current nonignored source
37
+
38
+ npm run lint # biome check (lint + format)
39
+ npm run lint:fix # biome check --write
40
+
41
+ npx tsc --noEmit # backend type check
42
+ npm run typecheck:tests # backend tests and fixtures type check
43
+ (cd src/client && npm run type-check) # client + Vue type check
44
+
45
+ make ci # install + audit + lint + type checks + build + both test suites
46
+ make help # list every Makefile target
47
+ ```
48
+
49
+ Run a single test file with `npx vitest run src/__tests__/<file>.test.ts`, filter by name with `-t "<pattern>"`.
50
+
51
+ ## Testing discipline
52
+
53
+ TDD for backend changes: write the failing test, confirm it fails for the right reason, implement minimally, then confirm it passes. Frontend tests cover stores, utilities, composables, and selected Vue components using Vue Test Utils and `happy-dom`. Type-checking and browser smoke tests complement this coverage. See [`AGENTS.md`](./AGENTS.md#testing-discipline) for route mocking and cleanup conventions.
54
+
55
+ Backend tests pin `KOBO_HOME` to a temporary directory; never point tests at your production data. Live MCP tests are a separate, explicit command (`npm run test:mcp:live`) requiring `KOBO_LIVE_ENGINE`, `KOBO_LIVE_MODEL`, and real provider credentials. They stay outside normal CI; see the [MCP guide](./src/mcp-server/README.md#live-engine-validation).
56
+
57
+ Schema changes must append a migration and update the fresh-install schema, with upgrade tests proving data preservation. See [Database migrations](./AGENTS.md#database-migrations). UI changes must follow [`DESIGN.md`](./DESIGN.md) and update all five translation files for user-visible text.
58
+
59
+ ## Git workflow
60
+
61
+ - Branch off `develop`: `feature/<slug>` or `fix/<slug>`.
62
+ - Follow [Conventional Commits](https://www.conventionalcommits.org/): `type(scope): subject`.
63
+ - Rebase on `develop` before opening a PR; never merge it in.
64
+ - Keep commits atomic — each one compiles and passes tests.
65
+ - Never force-push to shared branches.
66
+
67
+ Run `make ci` before pushing. It reinstalls all three dependency trees with `npm ci`, audits them, runs Biome and the three type checks, builds production assets, then runs both test suites. CI runs on pushes to `develop` and PRs targeting `develop` or `main`.
68
+
69
+ Full commit and branch conventions are in [`AGENTS.md`](./AGENTS.md#git-workflow).
70
+
71
+ ## Release process
72
+
73
+ Releases are cut from `main`. Prepare the version change in a branch targeting `develop`, keeping `package.json` and its lockfile synchronized; then merge `develop` into `main`. A push to `main` starts the release workflow. Manual dispatch also requires `main`.
74
+
75
+ The read-only preparation job scans secrets, installs and audits dependencies, lints, type-checks, runs both suites and builds. It creates one tarball and installs that exact artifact in a disposable environment, checking native modules, server/PWA assets and both MCP transports. A separate privileged job verifies its SHA-256 and version/tag availability, publishes that tarball with provenance without rebuilding or running lifecycle hooks, and creates the tag and GitHub Release. `make release` runs the local CI gates plus the version/tag availability checks; publishing remains the workflow's responsibility.
76
+
77
+ ## Public contribution boundaries
78
+
79
+ Read [Security](./SECURITY.md) before attaching diagnostics and follow the [Code of conduct](./CODE_OF_CONDUCT.md). No paid provider account is needed for deterministic CI; real-provider tests are separate opt-in work. Add new public documentation through the narrow `.gitignore` allowlist instead of publishing all internal plans or captures.
80
+
81
+ Run secret scanning with Gitleaks 8.30.1 (`GITLEAKS_BINARY` may point to the executable). Findings must be redacted. The single historical fingerprint in `.gitleaksignore` is a reviewed synthetic test fixture; do not add broad path or rule exclusions. A passing scan is evidence for known signatures, not proof that every historical document or binary is public-safe.
82
+
83
+ See the [opening checklist](./docs/release/public-opening-checklist.md) for remaining human and platform gates. No release, visibility change or repository-history rewrite is implied by local development.
package/DESIGN.md ADDED
@@ -0,0 +1,296 @@
1
+ # Design System — Kōbō
2
+
3
+ ## Product Context
4
+
5
+ - **What this is:** Kōbō — a Claude Code and Codex multi-agent orchestrator. Each "workspace" is a
6
+ self-contained mission with its own git worktree, branch, agent session, optional dev
7
+ server, optional Notion source-of-truth, and a dedicated MCP tools server.
8
+ - **Who it's for:** Developers using their own local instance, from a first mission to advanced parallel workflows,
9
+ distributed via `npx @loicngr/kobo`.
10
+ - **Space/industry:** Developer tools. Peers: Linear, Anthropic Console, Tailscale admin,
11
+ Vercel dashboard. Not Notion, not Raycast, not Stripe marketing.
12
+ - **Project type:** Local developer tool, served as a Quasar PWA in production.
13
+ Dark-native, dense, with interconnected workspace, Git, terminal and settings panels.
14
+
15
+ This document defines the visual rules. The deployed token values live in
16
+ [`src/client/src/css/design-tokens.scss`](./src/client/src/css/design-tokens.scss).
17
+ Implementation notes below distinguish the current UI from outstanding design
18
+ targets; documenting an existing deviation does not authorize expanding it.
19
+
20
+ ## Memorable Thing
21
+
22
+ If a choice makes the product feel "fun" or
23
+ "chaleureux," it's wrong. If it makes the product feel "serious tool for serious work,"
24
+ it's right.
25
+
26
+ ## Aesthetic Direction
27
+
28
+ - **Direction:** Brutally Minimal × Industrial
29
+ - **Decoration level:** minimal — typography + whitespace do the work
30
+ - **Mood:** Modern, monochrome, dense-but-aerated. Confident enough to use a single
31
+ accent color sparingly. No gradients, no glow, no decorative blobs, no illustrations.
32
+ - **Reference sites:** Linear settings, Anthropic Console preferences, Tailscale admin,
33
+ Vercel dashboard settings.
34
+
35
+ ## Typography
36
+
37
+ Single typeface family for the entire UI. **Geist** (Vercel) — the modern de-facto
38
+ standard for dev tools. Tabular-nums included. Pair with **Geist Mono** for technical
39
+ values (paths, UUIDs, hex codes, branch names, model identifiers).
40
+
41
+ - **Display / Section headers:** Geist 600, 24px (`H2` / section titles)
42
+ - **Subsection headers:** Geist 600, 16px (`H3`)
43
+ - **Body / labels:** Geist 500, 14px
44
+ - **Secondary text / hints:** Geist 400, 13px, color `text-secondary`
45
+ - **Mono (paths, hex, IDs, branches, models):** Geist Mono 400, 13px, slight
46
+ `bg-surface-2` background pill, color `text-secondary`
47
+ - **Loading:** Geist and Geist Mono variable WOFF2 files are vendored in
48
+ `src/client/public/fonts/` and loaded by `src/client/src/css/fonts.scss`.
49
+ Their SIL OFL license is shipped alongside them. Keep font requests local.
50
+
51
+ **Never use:** Inter, Roboto, Arial, system-ui, Open Sans, Poppins, Space Grotesk
52
+ (convergence trap), Lato. They scream "I gave up on typography."
53
+
54
+ ## Color
55
+
56
+ Dark-first. The default state of Kōbō is the dark theme — light mode is a secondary
57
+ concern (or deliberately absent for now).
58
+
59
+ Palette aligned with Kobo's existing brand (deep purple-blue darks), refined
60
+ for accessibility. Variant C's cool-gray palette was rejected to keep cohesion
61
+ with the workspaces drawer and activity feed (which use the purple-blue tones).
62
+
63
+ ```
64
+ Canvas / surfaces
65
+ --kobo-bg #1a1a2e /* main canvas — matches workspace drawer body */
66
+ --kobo-bg-deep #16162a /* deepest surface — sidebar nav */
67
+ --kobo-surface #222244 /* cards, panels */
68
+ --kobo-surface-2 #1a1a30 /* inputs, popovers */
69
+ --kobo-hover #2a2a4a /* hover on items in lists */
70
+
71
+ Borders
72
+ --kobo-border-subtle #2a2a4a /* internal section dividers */
73
+ --kobo-border #3a3a5e /* card outlines, input borders */
74
+ --kobo-border-strong #4a4a6e /* focus ring (combined with accent) */
75
+
76
+ Text
77
+ --kobo-text #f4f4f5 /* primary */
78
+ --kobo-text-2 #c9c9e8 /* secondary — most labels */
79
+ --kobo-text-3 #9a9ab5 /* tertiary — hints, captions */
80
+ --kobo-text-disabled #5a5a7a
81
+
82
+ Accent (rare, indigo — only for active states, primary CTAs, focus ring)
83
+ --kobo-accent #6c63ff /* comparison with the palette before PR #34 */
84
+ --kobo-accent-hover #5a51e6
85
+ --kobo-accent-fg #ffffff
86
+
87
+ Measured contrast (WCAG 2.1, sRGB):
88
+ --kobo-accent-fg on --kobo-accent 4.32:1 temporary comparison value
89
+ --kobo-accent-fg on --kobo-accent-hover 5.59:1
90
+ --kobo-accent on --kobo-bg 3.95:1 AA non-text (1.4.11) ✓
91
+ --kobo-accent on --kobo-surface 3.53:1 AA non-text (1.4.11) ✓
92
+
93
+ The accent is a BACKGROUND and a UI-component colour. It is never a text
94
+ colour: white on the accent needs Y <= 0.1833 while the accent read as text
95
+ on --kobo-bg needs Y >= 0.2270, so no single value can clear 4.5:1 on both
96
+ sides. Link and emphasis text uses --kobo-text-2 instead.
97
+
98
+ Semantic (used only when conveying status — keep desaturated)
99
+ --kobo-success #34d399
100
+ --kobo-warning #fbbf24
101
+ --kobo-danger #f87171
102
+ Info states use --kobo-accent; there is no separate --kobo-info token.
103
+
104
+ Conversation speaker markers
105
+ --kobo-turn-user #ce93d8
106
+ --kobo-turn-agent #7986cb
107
+ ```
108
+
109
+ **Rules of color use:**
110
+
111
+ 1. The accent (`--kobo-accent`) appears at most twice per visible screen — typically:
112
+ the active sidebar item (left-border 2px) and the primary CTA. Never for decoration.
113
+ 2. Semantic colors only carry meaning. A red border is a problem, not a style.
114
+ 3. No gradients anywhere. Solid fills only. No glow, no shadow halos.
115
+ 4. Hover states are a 1-shade nudge (`--kobo-hover`), not a saturation pump.
116
+
117
+ ## Spacing
118
+
119
+ Base unit **4px**. Compact-aerated density (Linear, not Notion).
120
+
121
+ ```
122
+ 2xs 2px
123
+ xs 4px
124
+ sm 8px
125
+ md 12px
126
+ lg 16px
127
+ xl 20px /* default card padding */
128
+ 2xl 24px
129
+ 3xl 32px /* between sections */
130
+ 4xl 48px
131
+ ```
132
+
133
+ - Section padding: 20px
134
+ - Row gap (between settings within a section): 16px
135
+ - Section gap (between section headers): 32px
136
+ - Card padding: 20px (when cards are used at all)
137
+ - No element gets more padding than necessary to feel breathable
138
+
139
+ ## Layout
140
+
141
+ - **Approach:** Sidebar split.
142
+ - **Settings sidebar:** 240px fixed width, dark `--kobo-surface`, sections rendered as
143
+ `icon (16px Lucide) + label`. Active item: `border-left: 2px solid var(--kobo-accent)`,
144
+ text in `--kobo-text`, slight background `--kobo-hover`. Inactive: `--kobo-text-2`,
145
+ no border, hover bg `--kobo-hover`.
146
+ - **Content panel:** max-width 720px, left-aligned. Sections rendered **flat** (not
147
+ cards): only `--kobo-border-subtle` dividers between rows. Section header on top,
148
+ rows below, no encompassing card.
149
+ - **Top bar:** 48px tall, contains breadcrumb-style title left + `⌘K` shortcut hint
150
+ right (muted).
151
+ - **Sticky save bar (when dirty):** full width, `bg-canvas` with `border-top
152
+ --kobo-border-subtle`, contains "Unsaved changes" text left + primary `Save`
153
+ button right. Slides up in 150ms when dirty, slides down when saved.
154
+ - **Border radius scale:** `sm 4px` (inputs, small buttons), `md 6px` (cards, larger
155
+ buttons), `lg 8px` (modals). **No `9999px` pill shapes** — pills feel friendly,
156
+ Kobo is not friendly, Kobo is precise.
157
+
158
+ ## Motion
159
+
160
+ **Minimal-functional only.** This is non-negotiable — a dev tool must feel
161
+ instantaneous, not choreographed.
162
+
163
+ - **Easing:** Hover/focus `ease-out`, dismissals `ease-in`, movements `ease-in-out`
164
+ - **Duration:**
165
+ - Micro (focus ring, hover): 100ms
166
+ - Short (toggle, popover open): 150ms
167
+ - Medium (sticky save bar slide-up): 200ms
168
+ - Anything longer (or stagger, scroll-driven, entrance animations) is forbidden
169
+ - No spring physics. No bouncing. No `requestAnimationFrame` chains for cosmetic
170
+ effects. Reserve animation for **state transitions that carry information**.
171
+
172
+ ## Iconography
173
+
174
+ - **Library:** [Lucide icons](https://lucide.dev) exclusively. Cohérent with Geist.
175
+ - **Size:** 16px in nav, 14px inline, 12px in dense tables
176
+ - **Stroke:** 1.5px (default Lucide)
177
+ - **Color:** `--kobo-text-2` by default, `--kobo-text` on hover/active, `--kobo-accent`
178
+ only when the icon carries the active-state meaning
179
+ - No emojis as decoration. Emojis are allowed only as user-content (workspace icons,
180
+ templates), never in chrome.
181
+
182
+ **Implementation status:** the shipped UI currently uses Quasar `q-icon` with
183
+ the `material-icons` extra registered in `quasar.config.ts`; Lucide is still a
184
+ design target, not an installed icon system. An icon migration must be handled
185
+ as a deliberate UI change rather than assumed complete from this guide.
186
+
187
+ ## Component Patterns
188
+
189
+ - **Inputs:** Flat. `bg-surface-2`, `border-subtle`, focus → `border-accent` +
190
+ 2px accent-tinted shadow. No bevels.
191
+ - **Buttons:**
192
+ - Primary: `bg-accent`, `text-accent-fg`, hover `bg-accent-hover`. One per screen
193
+ (the page's main action — typically Save).
194
+ - Secondary: `bg-surface-2`, `text`, `border-subtle`. Used for actions like
195
+ "Refresh", "Reset to default".
196
+ - Tertiary / link: no background, `--kobo-text-2` text, underline on hover,
197
+ consistent with the accent contrast rule above.
198
+ - **Toggles:** Quasar's `q-toggle` default, color override to `--kobo-accent`.
199
+ - **Segmented control / radio row:** Active option `bg-accent + text-accent-fg`,
200
+ inactive `text-2` with hover bg `--kobo-hover`.
201
+ - **Mono pills:** Technical values get a 2px-padded mono pill with `bg-surface-2`
202
+ background. Example: model IDs, UUIDs, paths, hex codes, branch names.
203
+
204
+ ## Anti-Patterns (forbidden)
205
+
206
+ - Purple/violet gradients
207
+ - 3-column icon-in-circle feature grids
208
+ - Centered everything with uniform padding
209
+ - Bubble/pill shapes (`border-radius: 9999px`) on rectangular elements
210
+ - Multiple competing accent colors
211
+ - Drop-shadow halos on cards
212
+ - `system-ui` or `-apple-system` as primary display/body font
213
+ - Decorative SVG illustrations in section headers
214
+ - "Welcome back!" / "Let's get started!" tone in microcopy
215
+
216
+ ## Settings-Page-Specific Application
217
+
218
+ `SettingsPage.vue` now uses `SettingsNavList.vue`, a desktop sidebar and a mobile
219
+ navigation drawer, an active-section content panel, and a dirty-state save bar.
220
+ The old three-tab redesign description is no longer the implementation baseline.
221
+
222
+ - Section membership is declared by `navItems` in `SettingsPage.vue`: General,
223
+ Agents, Skills, Git, Prompts, Scripts, Notion, Sentry, Forge, Voice, Notifications,
224
+ Worktrees, Projects, prompt Templates, Workspace templates, and Export.
225
+ - Git groups workflow preferences, conventions and branch prefixes.
226
+ Prompts keeps post-PR/MR, review, CI-fix and finalization instructions. Project overrides use
227
+ the same Git grouping. Retry limits belong to Agents and reminders to Notifications.
228
+ - Keep new sections in the same navigation and guided-tour registry; all labels
229
+ go through the five locale files.
230
+ - Use flat rows and subtle dividers, a clear section heading, and technical
231
+ values in Geist Mono. Avoid introducing nested card chrome.
232
+ - Keep colors, spacing, fonts and transitions on the existing tokens. The
233
+ frontend `design-system-*` tests cover token consistency, palette, typography
234
+ and contrast; they complement browser review rather than proving every screen
235
+ follows this guide.
236
+
237
+ ## CSS Variables
238
+
239
+ The following core tokens mirror `src/client/src/css/design-tokens.scss`.
240
+ That stylesheet also defines font stacks, easing curves and the accent RGB
241
+ triplet. Keep the document and stylesheet synchronized; Quasar theming overrides
242
+ must stay consistent with them.
243
+
244
+ ```scss
245
+ :root {
246
+ --kobo-bg: #1a1a2e;
247
+ --kobo-bg-deep: #16162a;
248
+ --kobo-surface: #222244;
249
+ --kobo-surface-2: #1a1a30;
250
+ --kobo-hover: #2a2a4a;
251
+
252
+ --kobo-border-subtle: #2a2a4a;
253
+ --kobo-border: #3a3a5e;
254
+ --kobo-border-strong: #4a4a6e;
255
+
256
+ --kobo-text: #f4f4f5;
257
+ --kobo-text-2: #c9c9e8;
258
+ --kobo-text-3: #9a9ab5;
259
+ --kobo-text-disabled: #5a5a7a;
260
+
261
+ --kobo-accent: #6c63ff;
262
+ --kobo-accent-hover: #5a51e6;
263
+ --kobo-accent-fg: #ffffff;
264
+
265
+ --kobo-success: #34d399;
266
+ --kobo-warning: #fbbf24;
267
+ --kobo-danger: #f87171;
268
+
269
+ --kobo-turn-user: #ce93d8;
270
+ --kobo-turn-agent: #7986cb;
271
+
272
+ --kobo-radius-sm: 4px;
273
+ --kobo-radius-md: 6px;
274
+ --kobo-radius-lg: 8px;
275
+
276
+ --kobo-space-2xs: 2px;
277
+ --kobo-space-xs: 4px;
278
+ --kobo-space-sm: 8px;
279
+ --kobo-space-md: 12px;
280
+ --kobo-space-lg: 16px;
281
+ --kobo-space-xl: 20px;
282
+ --kobo-space-2xl: 24px;
283
+ --kobo-space-3xl: 32px;
284
+ --kobo-space-4xl: 48px;
285
+
286
+ --kobo-duration-micro: 100ms;
287
+ --kobo-duration-short: 150ms;
288
+ --kobo-duration-medium: 200ms;
289
+ }
290
+ ```
291
+
292
+ ## First-run and optional configuration
293
+
294
+ The first-run panel stays hidden until settings load and does not interrupt migrated installations. Its diagnostic statuses distinguish ready, missing, failed and unverified; provider authentication is never inferred from a local executable check. Starting from this panel opens the ordinary creation form without automatically launching an agent. Preserve keyboard access, responsive layout and translated remediation text in all five locales.
295
+
296
+ Direct integration settings show configured status without fetching stored credentials; replacement is explicit and clears local fields only after success. Scheduled-session admission is diagnostic information, not proof that a pending instruction was delivered. Workflow preferences must state their scope separately from engine permissions. Public audio assets are original quiet tones; avoid insulting labels or unverified third-party clips.
package/README.md CHANGED
@@ -17,20 +17,24 @@ Kōbō (工房, "workshop") turns *one agent, one terminal* into a real workflow
17
17
 
18
18
  | | |
19
19
  |---|---|
20
- | **🗂️ Isolated worktrees, two engines** | Every workspace is its own git worktree and branch — parallel sessions never collide. Pick Claude Code or OpenAI Codex per workspace, and switch engines later without losing the worktree: Kōbō hands off tasks, git state, and recent context to a fresh session. |
20
+ | **🗂️ Isolated worktrees, two engines** | Every workspace is its own git worktree and branch — parallel sessions never collide. Pick Claude Code or OpenAI Codex per workspace, and [continue in a fresh session](#fresh-sessions-and-llm-handoffs) with the same LLM or a different model/engine, preserving the worktree and mission history. |
21
21
  | **💬 Live chat, real diff review** | Streaming responses, inline Edit/Write diffs, a reasoning panel, and a Monaco diff viewer with **inline file editing**, conflict resolution, and one-click `Sync` / `Push` / `Open PR` / `Merge`. |
22
22
  | **🔁 Auto-loop, cron, wakeups** | Turn an agent loose on the task list: it works through tasks, retries on rate limits, and stops itself when there's nothing left, progress stalls, or it needs you. Cron schedules and one-shot wakeups keep workspaces moving on their own timeline. |
23
23
  | **🔀 Create from a PR/MR, or from a ticket** | Pick an open pull/merge request from GitHub, GitLab, or Bitbucket and Kōbō resolves every local conflict for you before spinning up the workspace. Or start straight from a Notion page or a Sentry issue URL. |
24
24
 
25
25
  ## Quick start
26
26
 
27
- Requires Node.js ≥ 24.15 and a logged-in Claude Code **or** Codex CLI.
27
+ Requires Node.js ≥ 24.15, Git, Bash and your own Claude Code **or** Codex authentication. No skill plugin or ticket integration is required. Kōbō is a local, single-user tool; each user installs their own instance.
28
28
 
29
29
  ```bash
30
30
  npx @loicngr/kobo@latest
31
31
  ```
32
32
 
33
- Open <http://localhost:3000>. Data is persisted under `~/.config/kobo/` (override via `KOBO_HOME`).
33
+ Open <http://localhost:3000> and follow the first-run check. Use **Choose a folder** beside the project field to select a local Git repository; completing setup opens the mission form without launching an agent. New installs use the plugin-free **Standard** suite, **Plan** permissions, manual commit/push/publication preferences, and disabled optional integrations/audio. Existing preferences are preserved on upgrade.
34
+
35
+ Follow [your first mission](./docs/getting-started.md), [troubleshooting](./docs/troubleshooting.md), or the [security and privacy model](./SECURITY.md).
36
+
37
+ Data is persisted under `~/.config/kobo/` (override via `KOBO_HOME`).
34
38
 
35
39
  Default port is `3000`; if it's taken, `SERVER_PORT` (checked first) or `PORT` picks another:
36
40
 
@@ -56,11 +60,23 @@ Kōbō's production build is an installable PWA — use your browser's **Install
56
60
  - **Interactive Q&A**: an agent can pause mid-session to ask you a question through the UI instead of guessing.
57
61
 
58
62
  ![Agent asking a clarifying question, awaiting the user's answer](docs/assets/images/agent-question.png)
59
- - **Quota-aware**: 5-hour / 7-day Claude usage and Codex rate-limit buckets live in the footer; sessions auto-resume after a reset.
63
+ - **Quota-aware**: 5-hour / 7-day Claude usage and Codex rate-limit buckets live in the footer; auto-loops can resume after a reset. Explicit cron/wakeup schedules can also resume work; a manual workspace does not restart solely because its quota resets.
60
64
  - **Disk-space purge**: reclaim a merged workspace's `node_modules`/`vendor` weight without losing its chat history — see [`CONFIGURATION.md`](./CONFIGURATION.md#auto-purge-worktree-on-pr-merged).
61
65
  - **Lifecycle scripts**: shell scripts run on setup, cleanup, archive, session end, PR merge, or auto-loop stop, with output streamed into the chat.
62
66
  - **Observability**: a per-session timeline (duration, tools, tokens, errors) and a downloadable redacted diagnostic JSON.
63
- - **Optional integrations**: Notion (import missions) and Sentry (fix from issue URL), each independently toggled with a **Test connection** action; local voice transcription via `whisper.cpp`.
67
+ - **Optional integrations**: Notion (import missions) and Sentry (fix from issue URL), usable by both agent engines through saved connections, each independently toggled with a **Test connection** action; local voice transcription via `whisper.cpp`.
68
+
69
+ ## Fresh sessions and LLM handoffs
70
+
71
+ Long conversation getting crowded? Use **Continue in a fresh session** at the bottom of the right-hand Tools panel. **Change LLM** uses the same transfer flow and also lets you select another model within the current engine.
72
+
73
+ 1. Choose the destination model, reasoning effort and permission mode. A fresh session starts with the workspace's current configuration selected.
74
+ 2. Leave **Generate a handoff with the current agent** enabled to have the current conversation summarize the objective, constraints, decisions, verified progress, failed approaches and next action. Disable it when the old provider has no quota left: Kōbō builds context from the mission, tasks, Git state and source history without calling that LLM.
75
+ 3. Start the transfer. Kōbō interrupts the current work immediately, waits for confirmed shutdown, prepares the handoff and opens a fresh native conversation that continues the mission automatically.
76
+
77
+ The workspace, worktree, task list and conversation history remain available. The transfer links to its source session and a Markdown report in **Documents** (`.ai/handoffs/`, ignored by Git). Auto-loop keeps its intent and diagnostic budget; queued instructions retain their delivery state. Pending wakeups from the source conversation follow the fresh session once its startup is confirmed.
78
+
79
+ If generation fails, choose **Retry**, **Continue without an LLM summary**, or **Cancel transfer**. Cancel and Stop leave the work stopped and restore the source conversation and LLM configuration, including when the destination failed to start. Failed attempts remain in history without being resumed automatically. If there was no source conversation, the next message starts a fresh one. A server restart preserves the transfer and report for an explicit recovery decision; it never automatically replays a potentially delivered prompt. Transfers are manual—conversation size does not trigger them automatically.
64
80
 
65
81
  ## Configuration
66
82
 
@@ -76,24 +92,42 @@ The most common knobs:
76
92
 
77
93
  Everything else — worktree paths, dev server commands, prompt templates, git conventions, lifecycle scripts, forge selection, permission modes — lives in **Settings**, with per-project values inheriting from global ones. The full reference (every env var, every setting key, MCP server registration, forge/Notion/Sentry/voice setup) is in [`CONFIGURATION.md`](./CONFIGURATION.md).
78
94
 
95
+ ### Workflow and integration settings
96
+
97
+ **Settings → Git** groups manual/automatic commit, push and publication preferences,
98
+ Git conventions and branch prefixes. **Prompts** contains post-PR/MR, review, CI-fix
99
+ and finalization instructions. New workspaces snapshot the workflow preferences;
100
+ changing global defaults does not alter existing workspaces. These preferences guide
101
+ agents, while engine permissions remain a separate control.
102
+
103
+ Notion and Sentry are optional. Save a **Direct connection** in the integration tab,
104
+ enable it, save Settings, then use **Test connection**. Saved direct connections take
105
+ priority over the Claude MCP selector, which is disabled while one exists. Enabled
106
+ connections also reach Claude Code and Codex agents through `kobo-notion-*` and
107
+ `kobo-sentry-*` MCP servers. Stop and resume a running agent to apply a connection
108
+ change. See [managed integration MCPs](./CONFIGURATION.md#managed-integration-mcps-in-agent-sessions)
109
+ for credential priority and native-configuration scope.
110
+
79
111
  ### Docker
80
112
 
81
113
  An official `Dockerfile` and three ready-to-use Compose files ship in this repository: a quick local test stack, a Traefik-fronted local rehearsal (no domain needed), and a full VPS reference (Traefik + Let's Encrypt, SSH access, optional Docker-socket passthrough). See [`CONFIGURATION.md`](./CONFIGURATION.md#docker-deployment) for every compose file, env var, and volume mount.
82
114
 
83
115
  ### Network access
84
116
 
85
- Kōbō binds to `127.0.0.1` only by default. Enabling **Settings → Global → Network access** re-binds to the LAN behind a shared token (a QR code makes pairing a phone easy). Plain HTTP — keep it to trusted networks, or front it with HTTPS/a VPN for anything further. Details in [`CONFIGURATION.md`](./CONFIGURATION.md#network-access).
117
+ Kōbō binds to `127.0.0.1` only by default. Enabling **Settings → General → Network access** re-binds to the LAN behind a shared token (a QR code makes pairing a phone easy). Plain HTTP — keep it to trusted networks, or front it with HTTPS/a VPN for anything further. Details in [`CONFIGURATION.md`](./CONFIGURATION.md#network-access).
86
118
 
87
119
  ## Agent runtimes
88
120
 
89
- - **Claude Code**: authenticate once with `claude /login`. Kōbō calls the embedded SDK directly — no `claude` binary needed at runtime.
121
+ - **Claude Code**: authenticate once with `claude /login`. Kōbō calls the embedded SDK directly — no separately installed Claude CLI is required at runtime; the SDK supplies its runtime.
90
122
  - **OpenAI Codex**: run `codex login` or export `OPENAI_API_KEY`. Kōbō spawns a long-lived `codex app-server` subprocess per workspace.
91
123
 
92
124
  Both engines share task tracking, permission modes, the sub-agent panel, and the quota footer. The mapping of Kōbō's four permission modes (`plan` / `bypass` / `strict` / `interactive`) to each engine's native sandbox semantics is in [`CONFIGURATION.md`](./CONFIGURATION.md#permission-modes).
93
125
 
94
126
  ## Skill suites
95
127
 
96
- Kōbō's auto-generated prompts (review, auto-loop grooming, QA, brainstorming) can target **[superpowers](https://github.com/obra/superpowers)** (brainstorm → spec → plan → execute, TDD, debugging), **[gstack](https://github.com/garrytan/gstack)** (slash-command workflows for QA, design review, ship pipelines), both together, or your own custom prompts — selectable in **Settings → Skills**. Pairs optionally with **[gbrain](https://github.com/garrytan/gbrain)** for per-project semantic search. Full setup in [`CONFIGURATION.md`](./CONFIGURATION.md#skill-suites).
128
+ **Standard** is the default and works without a skill extension. **Settings → Skills** also offers **Superpowers**, **gstack**, **ECC**, **Superpowers + gstack**, **Superpowers + gstack + ECC**, and **Custom** instructions. These choices adapt the review, grooming, QA and brainstorming instructions; selecting one does not install a suite or change permissions. External skills must already be available to the selected Claude Code or Codex engine.
129
+
130
+ The Settings guided tour includes a dedicated skill-suite explanation; replay it from the help icon or Help menu. See the [skill-suite reference](./CONFIGURATION.md#skill-suites) for the available choices and custom instructions.
97
131
 
98
132
  ## Architecture
99
133
 
@@ -119,3 +153,9 @@ PRs welcome. See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for the from-source setu
119
153
  ## License
120
154
 
121
155
  GPL-3.0-or-later. See [`LICENSE`](./LICENSE).
156
+
157
+ ## Community and support
158
+
159
+ Report reproducible bugs and feature requests in [GitHub Issues](https://github.com/loicngr/Kobo/issues). Read [Contributing](./CONTRIBUTING.md) and the [Code of conduct](./CODE_OF_CONDUCT.md) before participating. Vulnerabilities belong in the private channel described in [Security](./SECURITY.md), not public issues. Support is maintained on a best-effort basis; no response-time commitment is implied.
160
+
161
+ Platform validation and release blockers are recorded in the [public-readiness evidence](./docs/release/public-readiness-evidence.md). Linux is locally exercised; macOS CI, WSL and real-provider beta sessions require their own evidence. See [third-party notices](./THIRD_PARTY_NOTICES.md) for redistributed assets.
package/SECURITY.md ADDED
@@ -0,0 +1,54 @@
1
+ # Security
2
+
3
+ ## Report privately
4
+
5
+ Use [GitHub private vulnerability reporting](https://github.com/loicngr/Kobo/security/advisories/new).
6
+ Private reporting was verified enabled on 2026-09-23. Do not disclose credentials,
7
+ private conversations, customer tickets or an unpatched exploit in a public issue.
8
+ Include the Kōbō version, OS, engine, deployment mode and a minimal reproduction
9
+ using synthetic data. The maintainer handles reports on a best-effort basis; no
10
+ response-time commitment is offered. Fixes target the latest release.
11
+
12
+ ## Trust boundary
13
+
14
+ Kōbō is a local, single-user development tool. Agents, terminals, project hooks and
15
+ configured MCP commands execute on the **server machine**, with the privileges of
16
+ the account running Kōbō and the selected engine's permission mode. A Git worktree
17
+ isolates a checkout, not processes, credentials or the filesystem. Only open
18
+ projects and configure executable hooks/integrations you trust.
19
+
20
+ The default listener is loopback. LAN access uses one shared token; it is not
21
+ per-user authorization. Behind a reverse proxy, enable the corresponding setting
22
+ so loopback API/WebSocket requests also require that token. Health checks are
23
+ exempt. Host and Origin validation remain separate protections. Use HTTPS or a
24
+ trusted private network; do not offer this installation as a shared public service.
25
+
26
+ Git workflow preferences express which automatic actions are wanted. They are not
27
+ a sandbox for arbitrary shell commands or external MCP tools. Claude and Codex
28
+ permission modes have different enforcement mechanisms; unrestricted access can
29
+ modify files outside a worktree. Provider authentication is separate from Kōbō's
30
+ network token.
31
+
32
+ ## Data and credentials
33
+
34
+ KOBO_HOME stores conversations, workspaces, backups and settings. Direct integration
35
+ commands and credentials live in `integrations.json`, written atomically with mode
36
+ 0600 on Unix. They are plaintext local secrets: protect the host account and backups.
37
+ They are excluded from settings exports and are never returned by the connection
38
+ status API. A replacement connection must be entered in full. MCP error text and
39
+ stderr are withheld because third-party processes may echo secrets.
40
+
41
+ Agents send prompts and applicable project context to the selected provider.
42
+ Notion/Sentry receive requests only when their configured actions are used.
43
+ Git forge actions use your authenticated CLI/configuration. The update checker
44
+ contacts the npm registry. Local history is not a promise that agent execution is
45
+ offline. Review exports and attachments before sharing them: conversation content
46
+ and personal paths may be sensitive even when known credential fields are redacted.
47
+
48
+ ## Development checks
49
+
50
+ CI scans Git history with a pinned Gitleaks version and runs dependency audits.
51
+ The one historical allowlisted finding is a synthetic test fixture, identified by
52
+ its exact fingerprint in `.gitleaksignore`. A successful scan is not proof that all
53
+ private information has been removed. Historical screenshots, media, author
54
+ metadata, old npm packages and GitHub artifacts need separate review.
@@ -0,0 +1,20 @@
1
+ # Distributed assets
2
+
3
+ Kōbō source code is licensed under GPL-3.0-or-later. Dependency packages retain
4
+ their respective licenses; consult the installed packages and lockfiles.
5
+
6
+ | Asset | Provenance | License / evidence |
7
+ |---|---|---|
8
+ | `src/client/public/sounds/neutral.wav` and `ready.wav` | Original mathematical sine tones, no samples or recordings | GPL-3.0-or-later; reproducible with `node scripts/generate-notification-sounds.mjs` |
9
+ | Geist and Geist Mono | Vendored font distributions | SIL Open Font License, shipped in `src/client/public/fonts/GEIST-LICENSE.txt` |
10
+ | Quasar Material icons | Installed through `@quasar/extras` | See the package's upstream notices |
11
+
12
+ Earlier versions included recorded notification sounds without a provenance
13
+ manifest in this repository. Those files are no longer part of the current source
14
+ or newly built package. Existing sound preferences fall back to a neutral tone,
15
+ preserving notification enablement and volume. Older Git refs and published
16
+ artifacts may still contain those recordings and require a separate publication
17
+ decision; removing them from the current tree does not erase history.
18
+
19
+ Repository screenshots and the application icon still require owner confirmation
20
+ of their provenance before the public-opening gate can be marked complete.
@@ -1,3 +1,5 @@
1
+ import { DOCUMENT_DIRS } from '../shared/document-roots.js';
2
+ export { DOCUMENT_DIRS } from '../shared/document-roots.js';
1
3
  import fs from 'node:fs';
2
4
  import path from 'node:path';
3
5
  import { nanoid } from 'nanoid';
@@ -267,7 +269,6 @@ export function getTicketSourcesHandler(worktreePath) {
267
269
  }
268
270
  // ── Documents ────────────────────────────────────────────────────────────────
269
271
  /** Directories (relative to the worktree root) scanned for AI-generated docs. */
270
- export const DOCUMENT_DIRS = ['docs/plans', 'docs/superpowers', '.ai/thoughts'];
271
272
  /** Depth cap to keep recursion bounded even on pathological symlink loops. */
272
273
  const DOC_MAX_DEPTH = 8;
273
274
  const DOC_MAX_FILE_BYTES = 1024 * 1024;