kanban-lite 1.0.4

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 (99) hide show
  1. package/.editorconfig +9 -0
  2. package/.github/workflows/ci.yml +59 -0
  3. package/.github/workflows/release.yml +75 -0
  4. package/.prettierignore +6 -0
  5. package/.prettierrc.yaml +4 -0
  6. package/.vscode/extensions.json +3 -0
  7. package/.vscode/launch.json +17 -0
  8. package/.vscode/settings.json +21 -0
  9. package/.vscode/tasks.json +22 -0
  10. package/.vscodeignore +11 -0
  11. package/CHANGELOG.md +184 -0
  12. package/CLAUDE.md +58 -0
  13. package/CONTRIBUTING.md +114 -0
  14. package/LICENSE +22 -0
  15. package/README.md +482 -0
  16. package/SKILL.md +237 -0
  17. package/dist/cli.js +8716 -0
  18. package/dist/extension.js +8463 -0
  19. package/dist/mcp-server.js +1327 -0
  20. package/dist/standalone-webview/icons-Dx9MGYqN.js +180 -0
  21. package/dist/standalone-webview/icons-Dx9MGYqN.js.map +1 -0
  22. package/dist/standalone-webview/index.js +85 -0
  23. package/dist/standalone-webview/index.js.map +1 -0
  24. package/dist/standalone-webview/react-vendor-DkYdDBET.js +25 -0
  25. package/dist/standalone-webview/react-vendor-DkYdDBET.js.map +1 -0
  26. package/dist/standalone-webview/style.css +1 -0
  27. package/dist/standalone.js +7513 -0
  28. package/dist/webview/icons-Dx9MGYqN.js +180 -0
  29. package/dist/webview/icons-Dx9MGYqN.js.map +1 -0
  30. package/dist/webview/index.js +85 -0
  31. package/dist/webview/index.js.map +1 -0
  32. package/dist/webview/react-vendor-DkYdDBET.js +25 -0
  33. package/dist/webview/react-vendor-DkYdDBET.js.map +1 -0
  34. package/dist/webview/style.css +1 -0
  35. package/docs/images/board-overview.png +0 -0
  36. package/docs/images/editor-view.png +0 -0
  37. package/docs/plans/2026-02-20-kanban-json-config-design.md +74 -0
  38. package/docs/plans/2026-02-20-kanban-json-config.md +690 -0
  39. package/eslint.config.mjs +31 -0
  40. package/package.json +161 -0
  41. package/postcss.config.js +6 -0
  42. package/resources/icon-light.png +0 -0
  43. package/resources/icon-light.svg +105 -0
  44. package/resources/icon.png +0 -0
  45. package/resources/icon.svg +105 -0
  46. package/resources/kanban-dark.svg +21 -0
  47. package/resources/kanban-light.svg +21 -0
  48. package/resources/kanban.svg +21 -0
  49. package/src/cli/index.ts +846 -0
  50. package/src/extension/FeatureHeaderProvider.ts +370 -0
  51. package/src/extension/KanbanPanel.ts +973 -0
  52. package/src/extension/SidebarViewProvider.ts +507 -0
  53. package/src/extension/featureFileUtils.ts +82 -0
  54. package/src/extension/index.ts +234 -0
  55. package/src/mcp-server/index.ts +632 -0
  56. package/src/sdk/KanbanSDK.ts +349 -0
  57. package/src/sdk/__tests__/KanbanSDK.test.ts +468 -0
  58. package/src/sdk/__tests__/parser.test.ts +170 -0
  59. package/src/sdk/fileUtils.ts +76 -0
  60. package/src/sdk/index.ts +6 -0
  61. package/src/sdk/parser.ts +70 -0
  62. package/src/sdk/types.ts +15 -0
  63. package/src/shared/config.ts +113 -0
  64. package/src/shared/editorTypes.ts +14 -0
  65. package/src/shared/types.ts +120 -0
  66. package/src/standalone/__tests__/server.integration.test.ts +1916 -0
  67. package/src/standalone/__tests__/webhooks.test.ts +357 -0
  68. package/src/standalone/fileUtils.ts +70 -0
  69. package/src/standalone/index.ts +71 -0
  70. package/src/standalone/server.ts +1046 -0
  71. package/src/standalone/webhooks.ts +135 -0
  72. package/src/webview/App.tsx +469 -0
  73. package/src/webview/assets/main.css +329 -0
  74. package/src/webview/assets/standalone-theme.css +130 -0
  75. package/src/webview/components/ColumnDialog.tsx +119 -0
  76. package/src/webview/components/CreateFeatureDialog.tsx +524 -0
  77. package/src/webview/components/DatePicker.tsx +185 -0
  78. package/src/webview/components/FeatureCard.tsx +186 -0
  79. package/src/webview/components/FeatureEditor.tsx +623 -0
  80. package/src/webview/components/KanbanBoard.tsx +144 -0
  81. package/src/webview/components/KanbanColumn.tsx +159 -0
  82. package/src/webview/components/MarkdownEditor.tsx +291 -0
  83. package/src/webview/components/PrioritySelect.tsx +39 -0
  84. package/src/webview/components/QuickAddInput.tsx +72 -0
  85. package/src/webview/components/SettingsPanel.tsx +284 -0
  86. package/src/webview/components/Toolbar.tsx +175 -0
  87. package/src/webview/components/UndoToast.tsx +70 -0
  88. package/src/webview/index.html +12 -0
  89. package/src/webview/lib/utils.ts +6 -0
  90. package/src/webview/main.tsx +11 -0
  91. package/src/webview/standalone-main.tsx +13 -0
  92. package/src/webview/standalone-shim.ts +132 -0
  93. package/src/webview/standalone.html +12 -0
  94. package/src/webview/store/index.ts +241 -0
  95. package/tailwind.config.js +53 -0
  96. package/tsconfig.json +22 -0
  97. package/vite.config.ts +36 -0
  98. package/vite.standalone.config.ts +62 -0
  99. package/vitest.config.ts +15 -0
package/SKILL.md ADDED
@@ -0,0 +1,237 @@
1
+ # Kanban Markdown
2
+
3
+ Manage a project kanban board stored as markdown files. Cards have status, priority, assignee, due dates, labels, and attachments. Columns are customizable.
4
+
5
+ ## Setup
6
+
7
+ **MCP (recommended):** Add to your MCP config (e.g. `.claude/settings.json`):
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "kanban": {
13
+ "command": "npx",
14
+ "args": ["kanban-lite", "kanban-mcp", "--dir", ".kanban"]
15
+ }
16
+ }
17
+ }
18
+ ```
19
+
20
+ **CLI:** `npm install -g kanban-lite` then use `kanban-lite` or the shorthand `kl`.
21
+
22
+ **API:** Start with `kl serve` (default: `http://localhost:3000/api`).
23
+
24
+ ## Interface Priority
25
+
26
+ Use **MCP tools** when available (native LLM integration). Fall back to **CLI** when running shell commands. Use **REST API** for HTTP-based integrations.
27
+
28
+ ## Quick Reference
29
+
30
+ | Operation | MCP Tool | CLI Command | API Endpoint |
31
+ |-----------|----------|-------------|--------------|
32
+ | List cards | `list_cards` | `kl list` | `GET /api/tasks` |
33
+ | Get card | `get_card` | `kl show <id>` | `GET /api/tasks/:id` |
34
+ | Create card | `create_card` | `kl add --title "..."` | `POST /api/tasks` |
35
+ | Update card | `update_card` | `kl edit <id>` | `PUT /api/tasks/:id` |
36
+ | Move card | `move_card` | `kl move <id> <status>` | `PATCH /api/tasks/:id/move` |
37
+ | Delete card | `delete_card` | `kl delete <id>` | `DELETE /api/tasks/:id` |
38
+ | List columns | `list_columns` | `kl columns` | `GET /api/columns` |
39
+ | Add column | `add_column` | `kl columns add` | `POST /api/columns` |
40
+ | Update column | `update_column` | `kl columns update <id>` | `PUT /api/columns/:id` |
41
+ | Remove column | `remove_column` | `kl columns remove <id>` | `DELETE /api/columns/:id` |
42
+ | List attachments | `list_attachments` | `kl attach <id>` | via card object |
43
+ | Add attachment | `add_attachment` | `kl attach add <id> <path>` | `POST /api/tasks/:id/attachments` |
44
+ | Remove attachment | `remove_attachment` | `kl attach remove <id> <name>` | `DELETE /api/tasks/:id/attachments/:name` |
45
+ | Get settings | `get_settings` | `kl settings` | `GET /api/settings` |
46
+ | Update settings | `update_settings` | `kl settings update` | `PUT /api/settings` |
47
+ | List webhooks | `list_webhooks` | `kl webhooks` | `GET /api/webhooks` |
48
+ | Add webhook | `add_webhook` | `kl webhooks add --url <url>` | `POST /api/webhooks` |
49
+ | Remove webhook | `remove_webhook` | `kl webhooks remove <id>` | `DELETE /api/webhooks/:id` |
50
+ | Workspace path | `get_workspace_info` | `kl pwd` | `GET /api/workspace` |
51
+
52
+ ## Card Operations
53
+
54
+ ### List and filter cards
55
+
56
+ ```
57
+ MCP: list_cards(status="todo", priority="high")
58
+ CLI: kl list --status todo --priority high --json
59
+ API: GET /api/tasks?status=todo&priority=high
60
+ ```
61
+
62
+ Filters: `status`, `priority`, `assignee`, `label`. All optional.
63
+
64
+ ### Get a card
65
+
66
+ ```
67
+ MCP: get_card(cardId="implement-search")
68
+ CLI: kl show implement-search --json
69
+ ```
70
+
71
+ Supports **partial ID matching** - `"search"` will match `"implement-search-2026-02-21"` if unambiguous.
72
+
73
+ ### Create a card
74
+
75
+ ```
76
+ MCP: create_card(
77
+ title="Implement search",
78
+ body="Full-text search across all cards.",
79
+ status="todo",
80
+ priority="high",
81
+ assignee="alice",
82
+ labels=["frontend", "search"]
83
+ )
84
+
85
+ CLI: kl add --title "Implement search" --body "Full-text search." \
86
+ --status todo --priority high --assignee alice --label "frontend,search"
87
+
88
+ API: POST /api/tasks
89
+ {"content": "# Implement search\n\nFull-text search.", "status": "todo", "priority": "high"}
90
+ ```
91
+
92
+ Note: MCP/CLI use `title` + `body`, API uses `content` (full markdown with `# Title` heading).
93
+
94
+ ### Update a card
95
+
96
+ ```
97
+ MCP: update_card(cardId="implement-search", priority="critical", assignee="bob")
98
+ CLI: kl edit implement-search --priority critical --assignee bob
99
+ ```
100
+
101
+ Only specified fields are changed. Timestamps update automatically.
102
+
103
+ ### Move a card
104
+
105
+ ```
106
+ MCP: move_card(cardId="implement-search", status="in-progress")
107
+ CLI: kl move implement-search in-progress
108
+ CLI: kl move implement-search in-progress --position 0 # move to top
109
+ ```
110
+
111
+ Moving to `done` auto-sets `completedAt`. Moving away from `done` clears it.
112
+
113
+ ### Delete a card
114
+
115
+ ```
116
+ MCP: delete_card(cardId="implement-search")
117
+ CLI: kl delete implement-search
118
+ ```
119
+
120
+ ## Column Operations
121
+
122
+ ```
123
+ MCP: list_columns()
124
+ MCP: add_column(id="testing", name="Testing", color="#ff9900")
125
+ MCP: update_column(columnId="testing", name="QA", color="#22c55e")
126
+ MCP: remove_column(columnId="testing") # fails if cards exist in column
127
+
128
+ CLI: kl columns
129
+ CLI: kl columns add --id testing --name Testing --color "#ff9900"
130
+ CLI: kl columns update testing --name QA --color "#22c55e"
131
+ CLI: kl columns remove testing
132
+ ```
133
+
134
+ ## Settings
135
+
136
+ ```
137
+ MCP: get_settings()
138
+ MCP: update_settings(compactMode=true, defaultPriority="high")
139
+
140
+ CLI: kl settings
141
+ CLI: kl settings update --compactMode true --defaultPriority high
142
+ ```
143
+
144
+ Available settings: `showPriorityBadges`, `showAssignee`, `showDueDate`, `showLabels`, `showFileName`, `compactMode`, `defaultPriority`, `defaultStatus`.
145
+
146
+ ## Webhooks
147
+
148
+ ```
149
+ MCP: list_webhooks()
150
+ MCP: add_webhook(url="https://example.com/hook", events=["task.created", "task.moved"])
151
+ MCP: remove_webhook(webhookId="wh_abc123")
152
+
153
+ CLI: kl webhooks
154
+ CLI: kl webhooks add --url https://example.com/hook --events task.created,task.moved --secret mykey
155
+ CLI: kl webhooks remove wh_abc123
156
+ ```
157
+
158
+ Events: `task.created`, `task.updated`, `task.moved`, `task.deleted`, `column.created`, `column.updated`, `column.deleted`. Use `["*"]` for all.
159
+
160
+ ## Data Model
161
+
162
+ ### Statuses
163
+
164
+ `backlog` | `todo` | `in-progress` | `review` | `done`
165
+
166
+ ### Priorities
167
+
168
+ `critical` | `high` | `medium` | `low`
169
+
170
+ ### Card fields
171
+
172
+ | Field | Type | Description |
173
+ |-------|------|-------------|
174
+ | `id` | string | Auto-generated from title + date (e.g. `implement-search-2026-02-21`) |
175
+ | `status` | string | Current column |
176
+ | `priority` | string | Priority level |
177
+ | `assignee` | string or null | Assigned person |
178
+ | `dueDate` | string or null | Due date (`YYYY-MM-DD`) |
179
+ | `created` | string | ISO timestamp, set on creation |
180
+ | `modified` | string | ISO timestamp, auto-updated |
181
+ | `completedAt` | string or null | ISO timestamp, auto-set when status becomes `done` |
182
+ | `labels` | string[] | Tags |
183
+ | `attachments` | string[] | Attached filenames |
184
+ | `order` | string | Fractional index for sorting within column |
185
+ | `content` | string | Markdown body (starts with `# Title`) |
186
+
187
+ ### File storage
188
+
189
+ Cards are stored as markdown files with YAML frontmatter in `{featuresDir}/{status}/`:
190
+
191
+ ```
192
+ .kanban/
193
+ backlog/
194
+ my-card-2026-02-21.md
195
+ todo/
196
+ in-progress/
197
+ review/
198
+ done/
199
+ ```
200
+
201
+ Config: `.kanban.json` at workspace root. Webhooks: `.kanban-webhooks.json` at workspace root.
202
+
203
+ ## Common Workflows
204
+
205
+ ### Start working on a task
206
+
207
+ ```
208
+ list_cards(status="todo", priority="high") # find high-priority todo items
209
+ move_card(cardId="...", status="in-progress") # claim it
210
+ update_card(cardId="...", assignee="me") # assign yourself
211
+ ```
212
+
213
+ ### Triage backlog
214
+
215
+ ```
216
+ list_cards(status="backlog") # see all backlog items
217
+ update_card(cardId="...", priority="critical") # re-prioritize
218
+ move_card(cardId="...", status="todo") # promote to todo
219
+ ```
220
+
221
+ ### Complete a task
222
+
223
+ ```
224
+ move_card(cardId="...", status="done") # completedAt auto-set
225
+ ```
226
+
227
+ ### Review board state
228
+
229
+ ```
230
+ list_columns() # see all columns
231
+ list_cards() # see all cards
232
+ get_settings() # see board config
233
+ ```
234
+
235
+ ## CLI Output
236
+
237
+ Add `--json` to any CLI command for machine-readable JSON output. Add `--dir <path>` to specify a custom features directory (default: `.kanban`).