@polderlabs/openkan 0.4.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 (114) hide show
  1. package/CHANGELOG.md +226 -0
  2. package/LICENSE +21 -0
  3. package/README.md +318 -0
  4. package/agents/openkan.md +254 -0
  5. package/bin/install-agent.mjs +63 -0
  6. package/bin/ok.mjs +17 -0
  7. package/bin/openkan.mjs +10 -0
  8. package/dist/.claude/skills/ok-planning/SKILL.md +285 -0
  9. package/dist/.claude/skills/ok-planning/references/integration.md +153 -0
  10. package/dist/.claude/skills/ok-planning/references/schemas.md +270 -0
  11. package/dist/.claude/skills/ok-planning/references/workflows.md +185 -0
  12. package/dist/.claude/skills/ok-planning/scripts/ok-init.sh +14 -0
  13. package/dist/.claude/skills/ok-planning/scripts/ok-resume.sh +38 -0
  14. package/dist/.claude/skills/ok-planning/scripts/ok-status.sh +24 -0
  15. package/dist/agents/openkan.md +254 -0
  16. package/dist/bin/install-agent.mjs +76 -0
  17. package/dist/bin/ok-install.js +58 -0
  18. package/dist/bin/ok.js +138 -0
  19. package/dist/bin/openkan.js +804 -0
  20. package/dist/commands/organize.md +15 -0
  21. package/dist/kanban/agent-profile.js +8 -0
  22. package/dist/kanban/archive.js +49 -0
  23. package/dist/kanban/bizar.js +242 -0
  24. package/dist/kanban/board.js +367 -0
  25. package/dist/kanban/bulk.js +139 -0
  26. package/dist/kanban/changelog.js +186 -0
  27. package/dist/kanban/chat.js +1280 -0
  28. package/dist/kanban/claude-state.js +974 -0
  29. package/dist/kanban/comments.js +80 -0
  30. package/dist/kanban/docs.js +144 -0
  31. package/dist/kanban/fs.js +163 -0
  32. package/dist/kanban/git.js +196 -0
  33. package/dist/kanban/images.js +140 -0
  34. package/dist/kanban/import.js +295 -0
  35. package/dist/kanban/inputs.js +94 -0
  36. package/dist/kanban/insights.js +140 -0
  37. package/dist/kanban/io.js +75 -0
  38. package/dist/kanban/mdx-render.js +348 -0
  39. package/dist/kanban/mdx.js +231 -0
  40. package/dist/kanban/projects.js +545 -0
  41. package/dist/kanban/search.js +121 -0
  42. package/dist/kanban/server.js +3296 -0
  43. package/dist/kanban/tags.js +124 -0
  44. package/dist/kanban/template.js +145 -0
  45. package/dist/kanban/tsx-sandbox.js +187 -0
  46. package/dist/kanban/watcher.js +270 -0
  47. package/dist/ok/commands/goal.js +65 -0
  48. package/dist/ok/commands/index.js +87 -0
  49. package/dist/ok/commands/init.js +15 -0
  50. package/dist/ok/commands/plan.js +155 -0
  51. package/dist/ok/commands/prd.js +202 -0
  52. package/dist/ok/commands/progress.js +31 -0
  53. package/dist/ok/commands/task.js +377 -0
  54. package/dist/ok/ids.js +98 -0
  55. package/dist/ok/lock.js +156 -0
  56. package/dist/ok/migrate.js +197 -0
  57. package/dist/ok/schemas.js +402 -0
  58. package/dist/ok/storage.js +222 -0
  59. package/dist/skills/openkan/SKILL.md +111 -0
  60. package/dist/skills/openkan/agents/openai.yaml +4 -0
  61. package/dist/skills/openkan/examples/simple-task.mdx +34 -0
  62. package/dist/skills/openkan/examples/with-ask.mdx +32 -0
  63. package/dist/skills/openkan/examples/with-choice.mdx +51 -0
  64. package/dist/skills/openkan/examples/with-preview.mdx +54 -0
  65. package/dist/skills/openkan/references/api.md +169 -0
  66. package/dist/skills/openkan/templates/task.mdx +46 -0
  67. package/dist/web/api.js +257 -0
  68. package/dist/web/app.js +4251 -0
  69. package/dist/web/bizar.js +39 -0
  70. package/dist/web/brand/agent-activity-sprite.svg +1 -0
  71. package/dist/web/brand/banner-docs.svg +24 -0
  72. package/dist/web/brand/banner.svg +32 -0
  73. package/dist/web/brand/empty-sessions.svg +17 -0
  74. package/dist/web/brand/empty-tasks.svg +17 -0
  75. package/dist/web/brand/favicon.svg +9 -0
  76. package/dist/web/brand/infinity-loader-animated.svg +220 -0
  77. package/dist/web/brand/infinity-loader-spritesheet.svg +230 -0
  78. package/dist/web/brand/logo-wordmark.svg +10 -0
  79. package/dist/web/brand/logo.svg +9 -0
  80. package/dist/web/brand/pixel-infinity-track.svg +1 -0
  81. package/dist/web/brand/social-card.svg +26 -0
  82. package/dist/web/changelog-view.js +456 -0
  83. package/dist/web/charts.js +269 -0
  84. package/dist/web/chat-sidebar.js +2397 -0
  85. package/dist/web/chat-status-motion.js +154 -0
  86. package/dist/web/claude-pane.js +820 -0
  87. package/dist/web/command-palette.js +381 -0
  88. package/dist/web/contributors-view.js +317 -0
  89. package/dist/web/cross-tab.js +102 -0
  90. package/dist/web/docs-view.js +168 -0
  91. package/dist/web/experience.css +165 -0
  92. package/dist/web/goals-view.js +45 -0
  93. package/dist/web/home-view.js +113 -0
  94. package/dist/web/images.js +311 -0
  95. package/dist/web/index.html +485 -0
  96. package/dist/web/insights.js +217 -0
  97. package/dist/web/keyboard.js +446 -0
  98. package/dist/web/mdx-viewer.js +600 -0
  99. package/dist/web/path-picker.js +787 -0
  100. package/dist/web/preview-frame.html +187 -0
  101. package/dist/web/settings.js +582 -0
  102. package/dist/web/style.css +8545 -0
  103. package/dist/web/task-view.js +1759 -0
  104. package/dist/web/vendor/gsap.min.js +11 -0
  105. package/dist/web/workspace.css +1513 -0
  106. package/package.json +71 -0
  107. package/skills/openkan/SKILL.md +111 -0
  108. package/skills/openkan/agents/openai.yaml +4 -0
  109. package/skills/openkan/examples/simple-task.mdx +34 -0
  110. package/skills/openkan/examples/with-ask.mdx +32 -0
  111. package/skills/openkan/examples/with-choice.mdx +51 -0
  112. package/skills/openkan/examples/with-preview.mdx +54 -0
  113. package/skills/openkan/references/api.md +169 -0
  114. package/skills/openkan/templates/task.mdx +46 -0
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@polderlabs/openkan",
3
+ "version": "0.4.0",
4
+ "description": "Local-first MDX kanban with native Claude Code control plane, .ok/ planning system, and embedded chat sidebar.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/PolderLabsVOF/openkan.git"
10
+ },
11
+ "homepage": "https://github.com/PolderLabsVOF/openkan#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/PolderLabsVOF/openkan/issues"
14
+ },
15
+ "keywords": [
16
+ "kanban",
17
+ "agents",
18
+ "tasks",
19
+ "goals",
20
+ "cli",
21
+ "local-first"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public",
25
+ "registry": "https://registry.npmjs.org/"
26
+ },
27
+ "files": [
28
+ "bin/*.mjs",
29
+ "dist",
30
+ "agents",
31
+ "skills/openkan",
32
+ "LICENSE",
33
+ "README.md",
34
+ "CHANGELOG.md"
35
+ ],
36
+ "bin": {
37
+ "openkan": "bin/openkan.mjs",
38
+ "ok": "bin/ok.mjs"
39
+ },
40
+ "engines": {
41
+ "node": ">=22.0.0"
42
+ },
43
+ "scripts": {
44
+ "build": "node scripts/build.mjs",
45
+ "postinstall": "node bin/install-agent.mjs",
46
+ "prepack": "npm run build",
47
+ "test:package": "node scripts/test-package.mjs",
48
+ "test": "node --test --experimental-strip-types tests/*.test.mts tests/*.test.mjs",
49
+ "typecheck": "tsc --noEmit --allowImportingTsExtensions --allowJs --checkJs --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler bin/*.ts kanban/*.ts ok/*.ts ok/commands/*.ts",
50
+ "check": "node --experimental-strip-types scripts/sanity-check.ts",
51
+ "e2e": "node --experimental-strip-types scripts/claude-e2e.mts",
52
+ "openkan": "node --experimental-strip-types bin/openkan.ts",
53
+ "ok": "node --experimental-strip-types bin/ok.ts",
54
+ "ok-install": "node --experimental-strip-types bin/ok-install.ts"
55
+ },
56
+ "dependencies": {
57
+ "gray-matter": "^4.0.3",
58
+ "gsap": "^3.15.0",
59
+ "marked": "^14.0.0",
60
+ "nanoid": "^5.0.0",
61
+ "sanitize-html": "^2.13.0",
62
+ "sucrase": "^3.34.0",
63
+ "ws": "^8.21.1"
64
+ },
65
+ "devDependencies": {
66
+ "@types/node": "^22.0.0",
67
+ "@types/sanitize-html": "^2.13.0",
68
+ "@types/ws": "^8.18.1",
69
+ "typescript": "^5.7.3"
70
+ }
71
+ }
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: openkan
3
+ description: Manage project tasks, goals, plans, progress and agent work through the OpenKan CLI. Use when a project contains .ok/ or the user asks to track project work with OpenKan.
4
+ ---
5
+
6
+ # OpenKan project workflow
7
+
8
+ Use `openkan` commands, not handwritten HTTP requests or direct JSON edits.
9
+ `.ok/` is the durable workspace; `.openkan/` is legacy import input only.
10
+ Run from the project root or a child directory of an existing `.ok/` workspace.
11
+
12
+ ## Install and discover
13
+
14
+ ```sh
15
+ npm install -g @polderlabs/openkan
16
+ openkan skill install --agent all
17
+ openkan init
18
+ openkan task list --json
19
+ openkan prd list --json
20
+ openkan goal list --json
21
+ openkan progress --json
22
+ ```
23
+
24
+ Installation is a one-time setup, not a per-task operation. Reuse a matching task
25
+ if one exists. Planning commands work offline without a server. The shorter `ok`
26
+ command supports the same task/plan/prd/goal/progress operations. Use
27
+ `openkan --help` and `ok help` for the command reference.
28
+
29
+ ## Track execution
30
+
31
+ ```sh
32
+ openkan task add "Deliver scoped change" --owner codex --priority p1 --acceptance "Regression test passes|Installed CLI works"
33
+ openkan task claim tsk-ID --owner codex
34
+ openkan task heartbeat tsk-ID --owner codex
35
+ openkan task update tsk-ID --evidence "Implemented X; test Y passed; Z remains"
36
+ openkan task update tsk-ID --status review
37
+ openkan task complete tsk-ID --owner codex --evidence "Test command and outcome; commit or file reference"
38
+ ```
39
+
40
+ Claims default to a one-hour lease; refresh during longer work. Do not take
41
+ another owner's claim or complete work without validation evidence. Cancel with
42
+ `task cancel <id> --owner NAME --reason TEXT`; release a claim with `task release`.
43
+ Read and list commands support `--json`; existing mutation commands print the
44
+ entity ID (do not assume every mutation returns JSON).
45
+
46
+ ## Goals and progression
47
+
48
+ Goals belong to a PRD, not a separate store. Save IDs from creation commands
49
+ and substitute them below; do not use the example placeholders literally.
50
+
51
+ ```sh
52
+ openkan prd add "Release outcome" --vision "Why it matters" --goals "Ship CLI|Verify install"
53
+ openkan prd update prd-ID --status active
54
+ openkan plan add "Release phase" --prd prd-ID --summary "Implementation and validation"
55
+ openkan task add "Verify clean install" --prd prd-ID --plan pln-ID --owner codex
56
+ openkan goal add prd-ID "Publish package" --json
57
+ openkan goal update prd-ID g1 --status in_progress
58
+ openkan goal update prd-ID g1 --status met
59
+ openkan plan update pln-ID --phase validation --status active
60
+ openkan progress --prd prd-ID --json
61
+ ```
62
+
63
+ `progress` reports status counts, completion percentages and dependency-ready
64
+ tasks. Cancelled/dropped/abandoned items are excluded from completion denominators;
65
+ empty denominators report 0%. It does not mark goals or plans complete for you.
66
+ Use `goal show <prd> <goal>` for detail and `goal update ... --text TEXT` to edit.
67
+
68
+ ## Dashboard tasks and collaboration
69
+
70
+ The visual board and planning records are related but distinct surfaces. Do not
71
+ assume a planning-only task is already a board card. Use board commands for cards
72
+ and include the planning ID in their description when tracking both.
73
+
74
+ ```sh
75
+ openkan start --no-open
76
+ openkan project list
77
+ openkan project use PROJECT_ID
78
+ openkan board list
79
+ openkan board add "Visible work item" --description "Planning task: tsk-ID" --column doing
80
+ openkan board show BOARD_TASK_ID
81
+ openkan board comment BOARD_TASK_ID "Changed X; validation Y passed" --author agent:codex
82
+ openkan board move BOARD_TASK_ID review
83
+ openkan board move BOARD_TASK_ID done
84
+ ```
85
+
86
+ Board commands require the local server and reject a mismatched dashboard
87
+ project. Their output is JSON. Select the intended project explicitly. Pass
88
+ `--port N` if the server is not using its configured default port.
89
+
90
+ ## Agent and advanced features
91
+
92
+ ```sh
93
+ openkan agent capabilities
94
+ openkan agent context
95
+ openkan agent start BOARD_TASK_ID --agent AGENT_ID --model MODEL_ID
96
+ openkan agent abort BOARD_TASK_ID
97
+ openkan import --path notes.md
98
+ ```
99
+
100
+ For less common features (docs, chat, structured inputs, bulk changes), consult
101
+ [the API reference](references/api.md) and use `openkan api /api/PATH` or
102
+ `openkan agent call`. These commands handle transport; do not use `curl`.
103
+ `openkan api` targets the dashboard's selected project, not necessarily cwd.
104
+ Use `--method`, `--data` or `--data-file`, and `--json` for structured requests.
105
+ Native Claude state is observational: never mutate Claude runtime files.
106
+
107
+ ## Finish
108
+
109
+ Run validation, append evidence, re-read current task state, then complete the
110
+ task and update associated goals/plan only when their criteria are met.
111
+ Run `openkan doctor` and leave unresolved work visible rather than marking it done.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "OpenKan Project Workflow"
3
+ short_description: "Keep agent work synchronized in OpenKan"
4
+ default_prompt: "Use openkan task, goal, plan, progress and board commands to track this project. Keep status and verification evidence current without handwritten HTTP requests."
@@ -0,0 +1,34 @@
1
+ ---
2
+ id: tsk-example-simple
3
+ title: Fix the login redirect on SSO failure
4
+ description: Users who fail SSO authentication get a 404 page. They should be redirected back to the login page with an error message.
5
+ tags:
6
+ - bug
7
+ - frontend
8
+ category: frontend
9
+ priority: high
10
+ effort: s
11
+ state: idle
12
+ created: 2026-07-06
13
+ ---
14
+
15
+ ## Background
16
+
17
+ When SSO authentication fails (e.g. token expired, user not found in the IdP), the callback handler throws an unhandled error and renders a 404 page. The user has no way to retry and no error message explaining what went wrong.
18
+
19
+ ## Acceptance criteria
20
+
21
+ - SSO callback catches `AuthenticationError` and `TokenExpiredError`
22
+ - Redirects to `/login?error=sso_failed` instead of 404
23
+ - Login page shows a banner: "SSO login failed. Please try again or use email/password."
24
+ - Log the failure to `sso.log` for debugging
25
+
26
+ ## Implementation notes
27
+
28
+ The callback is in `src/auth/sso.ts`, the `handleCallback` function around line 142. The login page template is at `src/pages/login.tsx`. Add a query-parameter check for `error=sso_failed` and display a warning alert above the login form.
29
+
30
+ ## Files touched
31
+
32
+ - `src/auth/sso.ts` — catch + redirect
33
+ - `src/pages/login.tsx` — error banner
34
+ - `src/lib/sso-logger.ts` — structured logging (new file, optional)
@@ -0,0 +1,32 @@
1
+ ---
2
+ id: tsk-example-ask
3
+ title: Design the new dashboard layout
4
+ description: Proposing three layout options for the main dashboard. Need user input on which direction to take.
5
+ tags:
6
+ - feature
7
+ - ux
8
+ - frontend
9
+ category: frontend
10
+ priority: normal
11
+ effort: m
12
+ state: waiting-for-input
13
+ created: 2026-07-06
14
+ ---
15
+
16
+ ## Proposal
17
+
18
+ I've sketched three layout directions for the new dashboard. Each one emphasizes different priorities:
19
+
20
+ ### Option A — Sidebar nav
21
+
22
+ A persistent left sidebar with collapsible sections. Content area on the right. Best for power users who need quick access to many sections. Familiar pattern from tools like Linear and Notion.
23
+
24
+ ### Option B — Top nav + tabbed panels
25
+
26
+ A horizontal top navigation bar with a tabbed main area. Keeps the full viewport width for content. Best for data-dense dashboards where screen real estate matters.
27
+
28
+ ### Option C — Card-based hub
29
+
30
+ A grid of large cards, each representing a workspace or project. Minimal navigation — the user clicks into a card to drill down. Best for managers who oversee multiple projects and want a summary-first view.
31
+
32
+ <Ask question="Which layout direction should I take? Option A (sidebar), Option B (top nav), or Option C (card hub)? Do you have any other preferences or constraints I should consider?" />
@@ -0,0 +1,51 @@
1
+ ---
2
+ id: tsk-example-choice
3
+ title: Pick the color palette for dark mode
4
+ description: Three dark-mode color palettes to choose from. The user picks one, and I'll implement it across the app.
5
+ tags:
6
+ - feature
7
+ - ux
8
+ - frontend
9
+ category: frontend
10
+ priority: normal
11
+ effort: l
12
+ state: waiting-for-input
13
+ created: 2026-07-06
14
+ ---
15
+
16
+ ## Background
17
+
18
+ The app already supports light mode. I'm adding a dark mode toggle and need to pick a color palette. I've narrowed it down to three options based on contrast ratios, WCAG compliance, and aesthetic fit.
19
+
20
+ ### Palette 1 — "Midnight"
21
+ - Background: `#0f172a` (slate-900)
22
+ - Surface: `#1e293b` (slate-800)
23
+ - Primary: `#38bdf8` (sky-400)
24
+ - Text: `#f1f5f9` (slate-100)
25
+ - Accent: `#a78bfa` (violet-400)
26
+ - Good for: data-heavy dashboards, professional tone
27
+
28
+ ### Palette 2 — "Onyx"
29
+ - Background: `#18181b` (zinc-900)
30
+ - Surface: `#27272a` (zinc-800)
31
+ - Primary: `#34d399` (emerald-400)
32
+ - Text: `#fafafa` (zinc-50)
33
+ - Accent: `#fb923c` (orange-400)
34
+ - Good for: creative tools, warm feel
35
+
36
+ ### Palette 3 — "Abyss"
37
+ - Background: `#000000`
38
+ - Surface: `#111111`
39
+ - Primary: `#60a5fa` (blue-400)
40
+ - Text: `#e5e7eb` (gray-200)
41
+ - Accent: `#f472b6` (pink-400)
42
+ - Good for: OLED screens, media consumption apps
43
+
44
+ <Choice
45
+ question="Which palette should I use for dark mode?"
46
+ options={[
47
+ { id: "midnight", label: "Midnight", description: "Slate-based, professional, data-dashboards" },
48
+ { id: "onyx", label: "Onyx", description: "Zinc-based, warm, creative tools" },
49
+ { id: "abyss", label: "Abyss", description: "True black, OLED-friendly, media-focused" },
50
+ ]}
51
+ />
@@ -0,0 +1,54 @@
1
+ ---
2
+ id: tsk-example-preview
3
+ title: Design the new button component variants
4
+ description: Playing with three button variants for the new component library. Preview them in the sandbox below.
5
+ tags:
6
+ - feature
7
+ - ux
8
+ - frontend
9
+ category: frontend
10
+ priority: normal
11
+ effort: s
12
+ state: idle
13
+ created: 2026-07-06
14
+ ---
15
+
16
+ ## Button variants
17
+
18
+ Here's a live preview of the three button styles I'm proposing. Click one to send feedback — each button calls `respond()` with its variant name.
19
+
20
+ <Preview
21
+ tsx={`function ButtonPreview() {
22
+ return (
23
+ <Column gap={16}>
24
+ <Text size={18} weight={700}>Button Variants</Text>
25
+ <Row gap={12} wrap>
26
+ <Button
27
+ label="Primary"
28
+ onClick={() => respond("primary-clicked")}
29
+ />
30
+ <Button
31
+ label="Secondary"
32
+ variant="secondary"
33
+ onClick={() => respond("secondary-clicked")}
34
+ />
35
+ <Button
36
+ label="Danger"
37
+ variant="danger"
38
+ onClick={() => respond("danger-clicked")}
39
+ />
40
+ </Row>
41
+ <Text size={14} color="#94a3b8">
42
+ Click a button to register your preference.
43
+ </Text>
44
+ </Column>
45
+ );
46
+ }`}
47
+ props={{}}
48
+ />
49
+
50
+ ## What do you think?
51
+
52
+ Once you've clicked a button, let me know your feedback on the styles. I can adjust colors, sizes, corner radii, or add loading states.
53
+
54
+ <Ask question="Which button variant do you prefer and what adjustments would you like?" />
@@ -0,0 +1,169 @@
1
+ # OpenKan agent API reference
2
+
3
+ The local server defaults to `http://127.0.0.1:7777`. Use the port reported
4
+ by `openkan status` when the project overrides it.
5
+
6
+ All endpoints are loopback-only. Authentication is not provided; do not
7
+ expose the port to a network.
8
+
9
+ ## Board and tasks
10
+
11
+ ```text
12
+ GET /api/board
13
+ GET /api/tasks-index
14
+ GET /api/tasks/:id
15
+ POST /api/tasks
16
+ PATCH /api/tasks/:id
17
+ DELETE /api/tasks/:id
18
+ POST /api/tasks/:id/archive
19
+ POST /api/tasks/:id/restore
20
+ GET /api/tasks/:id/subtasks
21
+ POST /api/tasks/bulk
22
+ GET /api/search?query=<text>
23
+ ```
24
+
25
+ Task columns are `backlog`, `todo`, `doing`, `review`, and `done`. Preserve
26
+ task IDs. Prefer archive over delete when history may remain useful.
27
+
28
+ ## Comments and input
29
+
30
+ ```text
31
+ GET /api/tasks/:id/comments
32
+ POST /api/tasks/:id/comments
33
+ PATCH /api/tasks/:id/comments/:commentId
34
+ DELETE /api/tasks/:id/comments/:commentId
35
+ POST /api/tasks/:id/ask
36
+ POST /api/tasks/:id/respond
37
+ ```
38
+
39
+ A comment requires `blockId`, `text`, and normally `line` and `author`.
40
+ Resolving a comment accepts:
41
+
42
+ ```json
43
+ {"resolved":true,"reason":"Addressed in commit abc123","author":"agent:mike"}
44
+ ```
45
+
46
+ A choice input uses option objects with stable IDs:
47
+
48
+ ```json
49
+ {
50
+ "type": "choice",
51
+ "question": "Which option?",
52
+ "options": [
53
+ {"id":"a","label":"Option A","description":"Tradeoff"},
54
+ {"id":"b","label":"Option B","description":"Tradeoff"}
55
+ ]
56
+ }
57
+ ```
58
+
59
+ ## M1 checkbox import
60
+
61
+ ```text
62
+ POST /api/import
63
+ ```
64
+
65
+ Body:
66
+
67
+ ```json
68
+ {"path":"notes.md","include":"**/*.md","exclude":"**/archive/**"}
69
+ ```
70
+
71
+ Returns `{ imported: [{ id, source: { path, line } }], skipped: number }`.
72
+ Imported tasks carry `source.path` and `source.line` so the dashboard can
73
+ deep-link back to the original Markdown file.
74
+
75
+ ## Native Claude Code control plane
76
+
77
+ Read the live snapshot first; it lists agents, teams, workflows, and
78
+ sessions without polling.
79
+
80
+ ```text
81
+ GET /api/claude/snapshot
82
+ GET /api/claude/agents
83
+ GET /api/claude/skills
84
+ GET /api/claude/commands
85
+ GET /api/claude/hooks
86
+ GET /api/claude/teams
87
+ GET /api/claude/workflows
88
+ GET /api/claude/model-router
89
+ GET /api/claude/activity-tail?limit=200
90
+ ```
91
+
92
+ Live updates stream over WebSocket and SSE. The WebSocket sends the full
93
+ snapshot on connect, then deltas:
94
+
95
+ ```text
96
+ ws://127.0.0.1:7777/api/claude/ws
97
+ GET /api/claude/events (SSE)
98
+ ```
99
+
100
+ Message shapes from the bridge:
101
+
102
+ ```json
103
+ {"type":"snapshot","data":{...}}
104
+ {"type":"delta","data":{"agents":[...],"sessions":[...]}}
105
+ ```
106
+
107
+ ## Chat sidebar (in development)
108
+
109
+ Backend routes are subject to change while the feature lands. Session
110
+ transcripts persist to `.ok/chat/<sid>.jsonl`.
111
+
112
+ ```text
113
+ POST /api/chat/send spawn `claude -p` and persist both turns
114
+ GET /api/chat/sessions list active + archived
115
+ GET /api/chat/sessions/<sid> full transcript
116
+ DELETE /api/chat/sessions/<sid> archive
117
+ POST /api/chat/sessions/<sid>/abort kill running subprocess
118
+ GET /api/chat/sessions/<sid>/events SSE stream of new turns
119
+ ```
120
+
121
+ Send body:
122
+
123
+ ```json
124
+ {
125
+ "sessionId": "ses-optional-or-omit-for-new",
126
+ "message": "Review the latest task state",
127
+ "model": "sonnet",
128
+ "effort": "medium",
129
+ "permissionMode": "default"
130
+ }
131
+ ```
132
+
133
+ `permissionMode` accepts `accept-edits | default | plan | bypass-permissions`.
134
+
135
+ ## Insights
136
+
137
+ ```text
138
+ GET /api/insights/velocity?days=30
139
+ ```
140
+
141
+ Returns zero-filled arrays when the changelog is empty or missing:
142
+
143
+ ```json
144
+ {
145
+ "windowDays": 30,
146
+ "generatedAt": "2026-09-04T12:00:00.000Z",
147
+ "columns": {
148
+ "backlog": [0,0,0,...],
149
+ "todo": [0,0,0,...],
150
+ "doing": [0,0,0,...],
151
+ "review": [0,0,0,...],
152
+ "done": [0,0,0,...]
153
+ },
154
+ "days": ["2026-08-05","2026-08-06",...]
155
+ }
156
+ ```
157
+
158
+ ## What you must NOT do
159
+
160
+ - Do not edit `.ok/board.json`, `.ok/tasks/<id>.json`, or `.ok/chat/*.jsonl`
161
+ directly. Use the HTTP routes so the mirror hooks, watchers, and indexes
162
+ stay in sync.
163
+ - Do not bypass the loopback. These endpoints assume `127.0.0.1`; exposing
164
+ them gives unauthenticated write access to the project.
165
+ - Do not delete `.ok/` to "reset" — it removes audit history. Use
166
+ `openkan archive` and the planning system's `ok prd close` instead.
167
+ - Do not assume a Claude control-plane endpoint is read-write. `/api/claude/*`
168
+ is observability only; writes happen via the chat sidebar or via direct
169
+ Claude Code CLI usage.
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: <short title>
3
+ id: tsk-xxxxxxxx
4
+ column: todo
5
+ state: idle
6
+ priority: normal
7
+ effort: null
8
+ tags: []
9
+ category: task
10
+ assignees: []
11
+ parentId: null
12
+ subtaskIds: []
13
+ createdAt: <iso>
14
+ updatedAt: <iso>
15
+ ---
16
+
17
+ # <title>
18
+
19
+ ## Goal
20
+
21
+ {/* One sentence: what does "done" look like for this task? */}
22
+
23
+ {/* If this task has subtasks, they appear as a Subtasks section in the web UI. Subtasks block the parent from being marked done until they are all completed. */}
24
+
25
+ ## Context
26
+
27
+ {/* Background: why this matters, what depends on it, links to related work. */}
28
+
29
+ ## Acceptance criteria
30
+
31
+ - [ ] {/* Outcome 1 the user can verify */}
32
+ - [ ] {/* Outcome 2 */}
33
+
34
+ ## Files to touch
35
+
36
+ - {/* `path/relative/to/repo.ext` — what changes here */}
37
+
38
+ ## Safety
39
+
40
+ - Do not modify unrelated files.
41
+ - Stop and ask if requirements conflict.
42
+ - Fill the agent progress section before moving to Review.
43
+
44
+ ## Agent progress
45
+
46
+ {/* Timestamped one-liners auto-appended here as you work. */}