@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.
- package/CHANGELOG.md +226 -0
- package/LICENSE +21 -0
- package/README.md +318 -0
- package/agents/openkan.md +254 -0
- package/bin/install-agent.mjs +63 -0
- package/bin/ok.mjs +17 -0
- package/bin/openkan.mjs +10 -0
- package/dist/.claude/skills/ok-planning/SKILL.md +285 -0
- package/dist/.claude/skills/ok-planning/references/integration.md +153 -0
- package/dist/.claude/skills/ok-planning/references/schemas.md +270 -0
- package/dist/.claude/skills/ok-planning/references/workflows.md +185 -0
- package/dist/.claude/skills/ok-planning/scripts/ok-init.sh +14 -0
- package/dist/.claude/skills/ok-planning/scripts/ok-resume.sh +38 -0
- package/dist/.claude/skills/ok-planning/scripts/ok-status.sh +24 -0
- package/dist/agents/openkan.md +254 -0
- package/dist/bin/install-agent.mjs +76 -0
- package/dist/bin/ok-install.js +58 -0
- package/dist/bin/ok.js +138 -0
- package/dist/bin/openkan.js +804 -0
- package/dist/commands/organize.md +15 -0
- package/dist/kanban/agent-profile.js +8 -0
- package/dist/kanban/archive.js +49 -0
- package/dist/kanban/bizar.js +242 -0
- package/dist/kanban/board.js +367 -0
- package/dist/kanban/bulk.js +139 -0
- package/dist/kanban/changelog.js +186 -0
- package/dist/kanban/chat.js +1280 -0
- package/dist/kanban/claude-state.js +974 -0
- package/dist/kanban/comments.js +80 -0
- package/dist/kanban/docs.js +144 -0
- package/dist/kanban/fs.js +163 -0
- package/dist/kanban/git.js +196 -0
- package/dist/kanban/images.js +140 -0
- package/dist/kanban/import.js +295 -0
- package/dist/kanban/inputs.js +94 -0
- package/dist/kanban/insights.js +140 -0
- package/dist/kanban/io.js +75 -0
- package/dist/kanban/mdx-render.js +348 -0
- package/dist/kanban/mdx.js +231 -0
- package/dist/kanban/projects.js +545 -0
- package/dist/kanban/search.js +121 -0
- package/dist/kanban/server.js +3296 -0
- package/dist/kanban/tags.js +124 -0
- package/dist/kanban/template.js +145 -0
- package/dist/kanban/tsx-sandbox.js +187 -0
- package/dist/kanban/watcher.js +270 -0
- package/dist/ok/commands/goal.js +65 -0
- package/dist/ok/commands/index.js +87 -0
- package/dist/ok/commands/init.js +15 -0
- package/dist/ok/commands/plan.js +155 -0
- package/dist/ok/commands/prd.js +202 -0
- package/dist/ok/commands/progress.js +31 -0
- package/dist/ok/commands/task.js +377 -0
- package/dist/ok/ids.js +98 -0
- package/dist/ok/lock.js +156 -0
- package/dist/ok/migrate.js +197 -0
- package/dist/ok/schemas.js +402 -0
- package/dist/ok/storage.js +222 -0
- package/dist/skills/openkan/SKILL.md +111 -0
- package/dist/skills/openkan/agents/openai.yaml +4 -0
- package/dist/skills/openkan/examples/simple-task.mdx +34 -0
- package/dist/skills/openkan/examples/with-ask.mdx +32 -0
- package/dist/skills/openkan/examples/with-choice.mdx +51 -0
- package/dist/skills/openkan/examples/with-preview.mdx +54 -0
- package/dist/skills/openkan/references/api.md +169 -0
- package/dist/skills/openkan/templates/task.mdx +46 -0
- package/dist/web/api.js +257 -0
- package/dist/web/app.js +4251 -0
- package/dist/web/bizar.js +39 -0
- package/dist/web/brand/agent-activity-sprite.svg +1 -0
- package/dist/web/brand/banner-docs.svg +24 -0
- package/dist/web/brand/banner.svg +32 -0
- package/dist/web/brand/empty-sessions.svg +17 -0
- package/dist/web/brand/empty-tasks.svg +17 -0
- package/dist/web/brand/favicon.svg +9 -0
- package/dist/web/brand/infinity-loader-animated.svg +220 -0
- package/dist/web/brand/infinity-loader-spritesheet.svg +230 -0
- package/dist/web/brand/logo-wordmark.svg +10 -0
- package/dist/web/brand/logo.svg +9 -0
- package/dist/web/brand/pixel-infinity-track.svg +1 -0
- package/dist/web/brand/social-card.svg +26 -0
- package/dist/web/changelog-view.js +456 -0
- package/dist/web/charts.js +269 -0
- package/dist/web/chat-sidebar.js +2397 -0
- package/dist/web/chat-status-motion.js +154 -0
- package/dist/web/claude-pane.js +820 -0
- package/dist/web/command-palette.js +381 -0
- package/dist/web/contributors-view.js +317 -0
- package/dist/web/cross-tab.js +102 -0
- package/dist/web/docs-view.js +168 -0
- package/dist/web/experience.css +165 -0
- package/dist/web/goals-view.js +45 -0
- package/dist/web/home-view.js +113 -0
- package/dist/web/images.js +311 -0
- package/dist/web/index.html +485 -0
- package/dist/web/insights.js +217 -0
- package/dist/web/keyboard.js +446 -0
- package/dist/web/mdx-viewer.js +600 -0
- package/dist/web/path-picker.js +787 -0
- package/dist/web/preview-frame.html +187 -0
- package/dist/web/settings.js +582 -0
- package/dist/web/style.css +8545 -0
- package/dist/web/task-view.js +1759 -0
- package/dist/web/vendor/gsap.min.js +11 -0
- package/dist/web/workspace.css +1513 -0
- package/package.json +71 -0
- package/skills/openkan/SKILL.md +111 -0
- package/skills/openkan/agents/openai.yaml +4 -0
- package/skills/openkan/examples/simple-task.mdx +34 -0
- package/skills/openkan/examples/with-ask.mdx +32 -0
- package/skills/openkan/examples/with-choice.mdx +51 -0
- package/skills/openkan/examples/with-preview.mdx +54 -0
- package/skills/openkan/references/api.md +169 -0
- package/skills/openkan/templates/task.mdx +46 -0
|
@@ -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. */}
|