@cwim/kanban 1.0.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.
@@ -0,0 +1,160 @@
1
+ import { promises as fs, existsSync, mkdirSync } from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ const KANBAN_DIR = path.join(os.homedir(), '.kanban');
5
+ const DATA_FILE = path.join(KANBAN_DIR, 'tasks.json');
6
+ const CLAUDE_PROJECTS_DIR = path.join(os.homedir(), '.claude', 'projects');
7
+ function getDefaultData() {
8
+ return {
9
+ version: 1,
10
+ updatedAt: new Date().toISOString(),
11
+ tasks: [],
12
+ };
13
+ }
14
+ function ensureDir() {
15
+ if (!existsSync(KANBAN_DIR)) {
16
+ mkdirSync(KANBAN_DIR, { recursive: true });
17
+ }
18
+ }
19
+ export async function initStorage() {
20
+ ensureDir();
21
+ if (!existsSync(DATA_FILE)) {
22
+ await writeData(getDefaultData());
23
+ }
24
+ }
25
+ async function readData() {
26
+ ensureDir();
27
+ try {
28
+ const raw = await fs.readFile(DATA_FILE, 'utf-8');
29
+ return JSON.parse(raw);
30
+ }
31
+ catch {
32
+ const defaultData = getDefaultData();
33
+ await writeData(defaultData);
34
+ return defaultData;
35
+ }
36
+ }
37
+ async function writeData(data) {
38
+ ensureDir();
39
+ data.updatedAt = new Date().toISOString();
40
+ await fs.writeFile(DATA_FILE, JSON.stringify(data, null, 2), 'utf-8');
41
+ }
42
+ export async function detectSession() {
43
+ try {
44
+ if (!existsSync(CLAUDE_PROJECTS_DIR))
45
+ return undefined;
46
+ const entries = await fs.readdir(CLAUDE_PROJECTS_DIR, { withFileTypes: true });
47
+ const sessions = entries
48
+ .filter((e) => e.isDirectory())
49
+ .map((e) => ({
50
+ name: e.name,
51
+ path: path.join(CLAUDE_PROJECTS_DIR, e.name),
52
+ detectedAt: new Date().toISOString(),
53
+ }));
54
+ if (sessions.length === 0)
55
+ return undefined;
56
+ // Return the most recently modified session
57
+ const stats = await Promise.all(sessions.map(async (s) => {
58
+ const stat = await fs.stat(s.path);
59
+ return { ...s, mtime: stat.mtime };
60
+ }));
61
+ stats.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
62
+ const latest = stats[0];
63
+ return {
64
+ name: latest.name,
65
+ path: latest.path,
66
+ detectedAt: new Date().toISOString(),
67
+ };
68
+ }
69
+ catch {
70
+ return undefined;
71
+ }
72
+ }
73
+ let cachedSession = null;
74
+ export async function getSession() {
75
+ if (cachedSession === null) {
76
+ cachedSession = await detectSession();
77
+ }
78
+ return cachedSession ?? undefined;
79
+ }
80
+ export function clearSessionCache() {
81
+ cachedSession = null;
82
+ }
83
+ // Task CRUD
84
+ export async function listTasks(filter) {
85
+ const data = await readData();
86
+ let tasks = data.tasks;
87
+ if (filter?.status) {
88
+ tasks = tasks.filter((t) => t.status === filter.status);
89
+ }
90
+ if (filter?.tag) {
91
+ tasks = tasks.filter((t) => t.tags.includes(filter.tag));
92
+ }
93
+ return tasks;
94
+ }
95
+ export async function getTask(id) {
96
+ const data = await readData();
97
+ return data.tasks.find((t) => t.id === id);
98
+ }
99
+ export async function createTask(input) {
100
+ const data = await readData();
101
+ const session = await getSession();
102
+ const task = {
103
+ id: generateId(),
104
+ title: input.title,
105
+ description: input.description,
106
+ status: input.status ?? 'todo',
107
+ tags: input.tags ?? [],
108
+ source: input.source ?? 'manual',
109
+ createdAt: new Date().toISOString(),
110
+ updatedAt: new Date().toISOString(),
111
+ };
112
+ data.tasks.push(task);
113
+ data.session = data.session ?? session ?? undefined;
114
+ await writeData(data);
115
+ return task;
116
+ }
117
+ export async function updateTask(id, input) {
118
+ const data = await readData();
119
+ const idx = data.tasks.findIndex((t) => t.id === id);
120
+ if (idx === -1)
121
+ return undefined;
122
+ const task = data.tasks[idx];
123
+ if (input.title !== undefined)
124
+ task.title = input.title;
125
+ if (input.description !== undefined)
126
+ task.description = input.description;
127
+ if (input.status !== undefined)
128
+ task.status = input.status;
129
+ if (input.tags !== undefined)
130
+ task.tags = input.tags;
131
+ task.updatedAt = new Date().toISOString();
132
+ await writeData(data);
133
+ return task;
134
+ }
135
+ export async function moveTask(id, status) {
136
+ return updateTask(id, { status });
137
+ }
138
+ export async function deleteTask(id) {
139
+ const data = await readData();
140
+ const initialLen = data.tasks.length;
141
+ data.tasks = data.tasks.filter((t) => t.id !== id);
142
+ if (data.tasks.length === initialLen)
143
+ return false;
144
+ await writeData(data);
145
+ return true;
146
+ }
147
+ export async function getAllData() {
148
+ const data = await readData();
149
+ const session = await getSession();
150
+ if (session) {
151
+ data.session = session;
152
+ }
153
+ return data;
154
+ }
155
+ function generateId() {
156
+ const ts = Date.now().toString(36);
157
+ const rand = Math.random().toString(36).substring(2, 6);
158
+ return `tf-${ts}-${rand}`;
159
+ }
160
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/storage/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export type TaskStatus = 'todo' | 'in-progress' | 'done' | 'blocked';
2
+ export interface Task {
3
+ id: string;
4
+ title: string;
5
+ description?: string;
6
+ status: TaskStatus;
7
+ tags: string[];
8
+ source: 'claude' | 'manual';
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ }
12
+ export interface SessionInfo {
13
+ name: string;
14
+ path: string;
15
+ detectedAt: string;
16
+ }
17
+ export interface TaskFlowData {
18
+ version: number;
19
+ updatedAt: string;
20
+ session?: SessionInfo;
21
+ tasks: Task[];
22
+ }
23
+ export declare const VALID_STATUSES: TaskStatus[];
24
+ export declare const STATUS_LABELS: Record<TaskStatus, string>;
25
+ export declare const STATUS_COLORS: Record<TaskStatus, string>;
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,eAAO,MAAM,cAAc,EAAE,UAAU,EAA+C,CAAC;AAEvF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKpD,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKpD,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ export const VALID_STATUSES = ['todo', 'in-progress', 'done', 'blocked'];
2
+ export const STATUS_LABELS = {
3
+ 'todo': 'To Do',
4
+ 'in-progress': 'In Progress',
5
+ 'done': 'Done',
6
+ 'blocked': 'Blocked',
7
+ };
8
+ export const STATUS_COLORS = {
9
+ 'todo': '#F59E0B',
10
+ 'in-progress': '#3B82F6',
11
+ 'done': '#10B981',
12
+ 'blocked': '#EF4444',
13
+ };
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,MAAM,cAAc,GAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,aAAa,GAA+B;IACvD,MAAM,EAAE,OAAO;IACf,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,SAAS;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAA+B;IACvD,MAAM,EAAE,SAAS;IACjB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;CACrB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@cwim/kanban",
3
+ "version": "1.0.0",
4
+ "description": "Minimal Kanban task tracking with MCP integration for Claude Code",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "kanban": "dist/cli/commands.js",
10
+ "kb": "dist/cli/commands.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "dashboard/dist"
15
+ ],
16
+ "scripts": {
17
+ "build": "npm run build:dashboard && npm run build:server",
18
+ "build:dashboard": "cd dashboard && tsc -b && vite build",
19
+ "build:server": "tsc -p tsconfig.server.json",
20
+ "dev": "cd dashboard && vite",
21
+ "dev:dashboard": "cd dashboard && vite",
22
+ "check": "tsc -p tsconfig.server.json --noEmit && cd dashboard && tsc -b --noEmit",
23
+ "lint": "eslint .",
24
+ "format": "prettier --write ."
25
+ },
26
+ "keywords": [
27
+ "claude-code",
28
+ "mcp",
29
+ "kanban",
30
+ "task-tracking",
31
+ "context-window",
32
+ "cwim"
33
+ ],
34
+ "author": "Chiheb Nabil",
35
+ "license": "MIT",
36
+ "dependencies": {
37
+ "@modelcontextprotocol/sdk": "^1.29.0",
38
+ "commander": "^13.1.0",
39
+ "date-fns": "^4.1.0",
40
+ "lucide-react": "^0.562.0",
41
+ "open": "^10.2.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^24.10.1",
45
+ "@types/react": "^19.2.5",
46
+ "@types/react-dom": "^19.2.3",
47
+ "@vitejs/plugin-react": "^5.1.1",
48
+ "autoprefixer": "^10.4.23",
49
+ "class-variance-authority": "^0.7.1",
50
+ "clsx": "^2.1.1",
51
+ "postcss": "^8.5.6",
52
+ "react": "^19.2.0",
53
+ "react-dom": "^19.2.0",
54
+ "tailwind-merge": "^3.4.0",
55
+ "tailwindcss": "^3.4.19",
56
+ "tailwindcss-animate": "^1.0.7",
57
+ "typescript": "~5.9.3",
58
+ "vite": "^7.2.4"
59
+ },
60
+ "engines": {
61
+ "node": ">=18.0.0"
62
+ }
63
+ }