@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.
- package/AGENTS.md +57 -4
- package/CHANGELOG.md +13 -0
- package/CODE_OF_CONDUCT.md +16 -0
- package/CONFIGURATION.md +1968 -0
- package/CONTRIBUTING.md +83 -0
- package/DESIGN.md +296 -0
- package/README.md +48 -8
- package/SECURITY.md +54 -0
- package/THIRD_PARTY_NOTICES.md +20 -0
- package/dist/mcp-server/kobo-tasks-handlers.js +2 -1
- package/dist/mcp-server/kobo-tasks-server.js +31 -5
- package/dist/server/db/migrations.js +37 -0
- package/dist/server/db/schema.js +6 -1
- package/dist/server/db/session-handoff-schema.js +24 -0
- package/dist/server/index.js +8 -0
- package/dist/server/routes/documents.js +1 -1
- package/dist/server/routes/environment.js +18 -0
- package/dist/server/routes/health.js +17 -2
- package/dist/server/routes/integrations.js +29 -0
- package/dist/server/routes/settings.js +5 -0
- package/dist/server/routes/sounds.js +60 -0
- package/dist/server/routes/workspaces.js +118 -20
- package/dist/server/services/agent/engines/claude-code/engine.js +15 -0
- package/dist/server/services/agent/engines/codex/engine.js +1 -0
- package/dist/server/services/agent/engines/codex/options-builder.js +1 -0
- package/dist/server/services/agent/engines/codex/spawn.js +2 -2
- package/dist/server/services/agent/integration-mcp.js +49 -0
- package/dist/server/services/agent/orchestrator.js +68 -11
- package/dist/server/services/auto-loop-service.js +45 -25
- package/dist/server/services/custom-sound-service.js +0 -0
- package/dist/server/services/engine-handoff-service.js +5 -5
- package/dist/server/services/environment-check-service.js +125 -0
- package/dist/server/services/initial-prompt-template-service.js +8 -21
- package/dist/server/services/integration-config-service.js +65 -0
- package/dist/server/services/legacy-public-prompts.js +112 -0
- package/dist/server/services/notion-service.js +25 -61
- package/dist/server/services/sentry-service.js +17 -12
- package/dist/server/services/session-activity-service.js +17 -0
- package/dist/server/services/session-handoff-runtime.js +26 -0
- package/dist/server/services/session-handoff-service.js +479 -0
- package/dist/server/services/settings-defaults.js +5 -0
- package/dist/server/services/settings-service.js +112 -23
- package/dist/server/services/skill-suite-prompts.js +29 -22
- package/dist/server/services/templates-service.js +31 -8
- package/dist/server/services/terminal-service.js +16 -0
- package/dist/server/services/wakeup-service.js +15 -5
- package/dist/server/services/workspace-service.js +30 -6
- package/dist/server/services/worktree-service.js +3 -1
- package/dist/server/utils/git-repo-lock.js +7 -3
- package/dist/server/utils/mcp-client.js +26 -12
- package/dist/server/utils/mcp-process.js +25 -0
- package/dist/server/utils/node-pty-spawn-helper.js +31 -0
- package/dist/server/utils/paths.js +7 -0
- package/dist/server/utils/workspace-lifecycle-guard.js +35 -20
- package/dist/shared/auto-loop-prompts.js +6 -2
- package/dist/shared/automatic-admission.js +1 -0
- package/dist/shared/document-roots.js +2 -0
- package/dist/shared/environment.js +1 -0
- package/dist/shared/notification-assets.js +73 -0
- package/dist/shared/session-handoff.js +4 -0
- package/dist/shared/skill-suite-prompts.js +6 -3
- package/dist/shared/workflow-policy.js +25 -0
- package/docs/getting-started.md +47 -0
- package/docs/troubleshooting.md +49 -0
- package/package.json +19 -7
- package/src/client/dist/pwa/assets/ActivityFeed-DRgetl1M.js +8 -0
- package/src/client/dist/pwa/assets/{ChangelogPage-DSKCvpr2.js → ChangelogPage-BJdICFvz.js} +1 -1
- package/src/client/dist/pwa/assets/{ComparisonPanel-DDxcsxyC.js → ComparisonPanel-2GLd8KIy.js} +1 -1
- package/src/client/dist/pwa/assets/CreatePage-B9AdNJZj.js +2 -0
- package/src/client/dist/pwa/assets/CreatePage-B9C9J9Pw.css +1 -0
- package/src/client/dist/pwa/assets/DashboardPage-CzVOvjSP.js +1 -0
- package/src/client/dist/pwa/assets/DiffViewer-X25vuf83.js +8 -0
- package/src/client/dist/pwa/assets/{DocumentsPanel-DfEoI_f7.js → DocumentsPanel-BastjrEm.js} +1 -1
- package/src/client/dist/pwa/assets/{DrawerToggleButton-D85PwhKb.js → DrawerToggleButton-DbipGmBL.js} +1 -1
- package/src/client/dist/pwa/assets/{GitPanel-BFCnyhE2.css → GitPanel-C4wOcZV2.css} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-CnW4iVao.js +3 -0
- package/src/client/dist/pwa/assets/{HealthPage-CaLCpejR.js → HealthPage-aieNQly-.js} +1 -1
- package/src/client/dist/pwa/assets/MainLayout-Cc4XzCAy.css +1 -0
- package/src/client/dist/pwa/assets/MainLayout-DqBbE8o4.js +2 -0
- package/src/client/dist/pwa/assets/{QBtnDropdown-qJWGcZpC.js → QBtnDropdown-BWy-rh45.js} +1 -1
- package/src/client/dist/pwa/assets/QExpansionItem-DfmdBGuW.js +1 -0
- package/src/client/dist/pwa/assets/QSelect-BfqaWakg.js +1 -0
- package/src/client/dist/pwa/assets/{QTooltip-cDK5AOQ5.js → QTooltip-Cy0T0vk2.js} +1 -1
- package/src/client/dist/pwa/assets/SchedulePanel-BYKSFoFj.css +1 -0
- package/src/client/dist/pwa/assets/SchedulePanel-YQPObRR3.js +1 -0
- package/src/client/dist/pwa/assets/{SearchPage-BO-J4aNc.js → SearchPage-BoBjmItc.js} +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-0GtDcXRC.js +9 -0
- package/src/client/dist/pwa/assets/{SettingsPage-W6N01tGz.css → SettingsPage-BYdLXJEJ.css} +1 -1
- package/src/client/dist/pwa/assets/SplitWorkspacePage-4wFh65Lh.js +1 -0
- package/src/client/dist/pwa/assets/{TerminalPanel-DitOCad1.js → TerminalPanel-b70x_jqH.js} +9 -9
- package/src/client/dist/pwa/assets/{TouchPan-DvPAhZsa.js → TouchPan-CcTVcxwd.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-CJYdH3Jf.js → TourReplayButton-CpEMnQS8.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-C5lTHTp2.js +1 -0
- package/src/client/dist/pwa/assets/{WorkspacePage-DAVo-E4p.css → WorkspacePage--5HsnMQ1.css} +1 -1
- package/src/client/dist/pwa/assets/WorkspacePage-D_V9gNON.js +4 -0
- package/src/client/dist/pwa/assets/{browser-BsB6cFv4.js → browser-LBbxVwWf.js} +1 -1
- package/src/client/dist/pwa/assets/build-path-tree-DyvtWxb0.js +1 -0
- package/src/client/dist/pwa/assets/custom-sounds-BpeLZUDW.js +1 -0
- package/src/client/dist/pwa/assets/de-v6i2HlE2.js +17 -0
- package/src/client/dist/pwa/assets/{documents-SCd3w8xV.js → documents-Bjx8lz-h.js} +1 -1
- package/src/client/dist/pwa/assets/{editor.api-BUdM7I6y.js → editor.api-BC3PbJkx.js} +1 -1
- package/src/client/dist/pwa/assets/efforts-BDHAnNUs.js +9 -0
- package/src/client/dist/pwa/assets/engineFeatures-hlEiwqt-.js +1 -0
- package/src/client/dist/pwa/assets/es-Bc1KgkAT.js +17 -0
- package/src/client/dist/pwa/assets/expand-template-DLDl1qPx.js +1 -0
- package/src/client/dist/pwa/assets/{format-BjQxf4pe.js → format-Q94deO3I.js} +7 -7
- package/src/client/dist/pwa/assets/{formatters-BejhmNTV.js → formatters-CWxRHuUu.js} +1 -1
- package/src/client/dist/pwa/assets/fr-ByYPK5vr.js +17 -0
- package/src/client/dist/pwa/assets/{freemarker2-5d5GhyRp.js → freemarker2-MPhk0eTh.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-DaafEsDK.js → handlebars-C60ru5gR.js} +1 -1
- package/src/client/dist/pwa/assets/{html-CwHBDd2A.js → html-ClzchR9j.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-Sy42tm-V.js +1 -0
- package/src/client/dist/pwa/assets/index-CqZ7sDcM.js +20 -0
- package/src/client/dist/pwa/assets/it-BYF_88z6.js +17 -0
- package/src/client/dist/pwa/assets/{javascript-DSNIEEH5.js → javascript-C43UJmMx.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-Dma1UpA1.js → liquid-CYTrvTKF.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-D8rqEAws.js → mdx-CxsXOvkQ.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco-contributions-2E7O2zoi.js → monaco-contributions-Cl4-iVpK.js} +1 -1
- package/src/client/dist/pwa/assets/monaco.contribution-DkjLUmyA.js +2 -0
- package/src/client/dist/pwa/assets/network-auth-CXQn2wO7.js +1 -0
- package/src/client/dist/pwa/assets/notify-theme-BrueBr2j.js +1 -0
- package/src/client/dist/pwa/assets/{pending-diff-open-CeiVIFZn.js → pending-diff-open-B4POItbR.js} +1 -1
- package/src/client/dist/pwa/assets/permissionModes-B-ciuUbz.js +36 -0
- package/src/client/dist/pwa/assets/{project-color-BCp9SWoI.js → project-color-CM3hflLH.js} +1 -1
- package/src/client/dist/pwa/assets/{python-f-9NqRlI.js → python-s2IMpsoV.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-DsCmoX0h.js → razor-DVNXiVBh.js} +1 -1
- package/src/client/dist/pwa/assets/render-chat-markdown-TU6CDfD8.js +69 -0
- package/src/client/dist/pwa/assets/{typescript-cEHg4L10.js → typescript-BYT_8ABE.js} +1 -1
- package/src/client/dist/pwa/assets/use-slide-transition-CiaDm-tR.js +1 -0
- package/src/client/dist/pwa/assets/use-tours-CNe8qb1q.js +2 -0
- package/src/client/dist/pwa/assets/workspace-templates-tBxXE52A.js +1 -0
- package/src/client/dist/pwa/assets/{xml-Plt-Y7we.js → xml-BIG-fmxk.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-ScEmaAeN.js → yaml-D7gu2CQh.js} +1 -1
- package/src/client/dist/pwa/index.html +1 -1
- package/src/client/dist/pwa/sounds/neutral.wav +0 -0
- package/src/client/dist/pwa/sounds/ready.wav +0 -0
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/mcp-server/README.md +8 -1
- package/src/mcp-server/kobo-tasks-handlers.ts +4 -1
- package/src/mcp-server/kobo-tasks-server.ts +38 -5
- package/src/client/dist/pwa/assets/ActivityFeed-D_y4aikp.js +0 -8
- package/src/client/dist/pwa/assets/CreatePage-DKVEknbL.js +0 -2
- package/src/client/dist/pwa/assets/CreatePage-TY9g3hZb.css +0 -1
- package/src/client/dist/pwa/assets/DashboardPage-Dg2s9nnv.js +0 -1
- package/src/client/dist/pwa/assets/DiffViewer-BSzNScIr.js +0 -8
- package/src/client/dist/pwa/assets/GitPanel-CuG8MlgF.js +0 -3
- package/src/client/dist/pwa/assets/MainLayout-CDxYIJ_s.js +0 -2
- package/src/client/dist/pwa/assets/MainLayout-DTLNunOi.css +0 -1
- package/src/client/dist/pwa/assets/QDrawer-DX3PhMqC.js +0 -1
- package/src/client/dist/pwa/assets/QSelect-CY4TWW_j.js +0 -1
- package/src/client/dist/pwa/assets/SchedulePanel-BAA4Aajn.css +0 -1
- package/src/client/dist/pwa/assets/SchedulePanel-LvHiZ6ZH.js +0 -1
- package/src/client/dist/pwa/assets/SettingsPage-Aw89fRSq.js +0 -9
- package/src/client/dist/pwa/assets/SplitWorkspacePage-BIEceNwH.js +0 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-CY-9z9nw.js +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-xH_OyA3r.js +0 -4
- package/src/client/dist/pwa/assets/build-path-tree-CW-ER1Mt.js +0 -1
- package/src/client/dist/pwa/assets/de-Mu7biceO.js +0 -17
- package/src/client/dist/pwa/assets/efforts-DTJQP9or.js +0 -9
- package/src/client/dist/pwa/assets/engineFeatures-Bj6Ob41d.js +0 -1
- package/src/client/dist/pwa/assets/es-BY5IfNI2.js +0 -17
- package/src/client/dist/pwa/assets/expand-template-SM8vvYyO.js +0 -1
- package/src/client/dist/pwa/assets/fouet-ahh-DdxrUXRj.mp3 +0 -0
- package/src/client/dist/pwa/assets/fr-BMXCzFCM.js +0 -17
- package/src/client/dist/pwa/assets/i18n-CgWW5vfb.js +0 -1
- package/src/client/dist/pwa/assets/index-Di9Sz5E8.js +0 -20
- package/src/client/dist/pwa/assets/it-ByPZQK_K.js +0 -17
- package/src/client/dist/pwa/assets/monaco.contribution-DqOgo72G.js +0 -2
- package/src/client/dist/pwa/assets/network-auth-DNmhJTZn.js +0 -1
- package/src/client/dist/pwa/assets/notify-theme-B6Hiwvwb.js +0 -1
- package/src/client/dist/pwa/assets/permissionModes-DWdtf81n.js +0 -36
- package/src/client/dist/pwa/assets/render-chat-markdown-DK5BD9mU.js +0 -67
- package/src/client/dist/pwa/assets/use-tours-BmTbosmB.js +0 -2
- package/src/client/dist/pwa/assets/workspace-templates-DUWDLMIX.js +0 -1
- package/src/client/dist/pwa/sounds/7eme-compagnie-03.mp3 +0 -0
- package/src/client/dist/pwa/sounds/aller-ftg.mp3 +0 -0
- package/src/client/dist/pwa/sounds/arrete-de-mentir.mp3 +0 -0
- package/src/client/dist/pwa/sounds/arretez-les-messages.mp3 +0 -0
- package/src/client/dist/pwa/sounds/bah-alors-on-est-nul.mp3 +0 -0
- package/src/client/dist/pwa/sounds/basic-notification.mp3 +0 -0
- package/src/client/dist/pwa/sounds/ca_va_peter.mp3 +0 -0
- package/src/client/dist/pwa/sounds/dry-fart.mp3 +0 -0
- package/src/client/dist/pwa/sounds/faaah.mp3 +0 -0
- package/src/client/dist/pwa/sounds/for-shure.mp3 +0 -0
- package/src/client/dist/pwa/sounds/gta-v-death.mp3 +0 -0
- package/src/client/dist/pwa/sounds/hey.mp3 +0 -0
- package/src/client/dist/pwa/sounds/mais-laisse-moi-dormir-zebi.mp3 +0 -0
- package/src/client/dist/pwa/sounds/nan-tu-degages.mp3 +0 -0
- package/src/client/dist/pwa/sounds/nan-wallah-pardon.mp3 +0 -0
- package/src/client/dist/pwa/sounds/ouais-cest-greg.mp3 +0 -0
- package/src/client/dist/pwa/sounds/pas-ca-zinedine.mp3 +0 -0
- package/src/client/dist/pwa/sounds/ta-gueule.mp3 +0 -0
- package/src/client/dist/pwa/sounds/travail_termine.mp3 +0 -0
- package/src/client/dist/pwa/sounds/tu-vas-la-fermer.mp3 +0 -0
- package/src/client/dist/pwa/sounds/warcraft-3-humain-travail.mp3 +0 -0
- package/src/client/dist/pwa/sounds/yaaa.mp3 +0 -0
package/CONTRIBUTING.md
ADDED
|
@@ -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
|
|
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
|
|
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
|
|
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
|

|
|
59
|
-
- **Quota-aware**: 5-hour / 7-day Claude usage and Codex rate-limit buckets live in the footer;
|
|
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 →
|
|
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
|
|
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
|
-
|
|
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;
|