taskin 1.0.9 → 1.0.10

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 (3) hide show
  1. package/README.md +53 -0
  2. package/dist/index.js +29 -15
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -103,6 +103,59 @@ Taskin is built as a modular ecosystem. Besides the CLI, you can use individual
103
103
  - `taskin pause <id>` - Pause work on a task
104
104
  - `taskin finish <id>` - Complete a task
105
105
  - `taskin lint` - Validate task files
106
+ - `taskin dashboard` - Start the web dashboard
107
+ - `taskin mcp-server` - Start MCP server for Claude Desktop integration (alias: `mcp`)
108
+
109
+ ## 🤖 MCP Server (Model Context Protocol)
110
+
111
+ Taskin includes an MCP server that allows AI assistants like Claude Desktop to interact with your tasks:
112
+
113
+ ```bash
114
+ taskin mcp-server
115
+ ```
116
+
117
+ ### Integration with Claude Desktop
118
+
119
+ Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
120
+
121
+ ```json
122
+ {
123
+ "mcpServers": {
124
+ "taskin": {
125
+ "args": ["taskin@beta", "mcp-server"],
126
+ "command": "npx"
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ Or if installed globally:
133
+
134
+ ```json
135
+ {
136
+ "mcpServers": {
137
+ "taskin": {
138
+ "args": ["mcp-server"],
139
+ "command": "taskin"
140
+ }
141
+ }
142
+ }
143
+ ```
144
+
145
+ **Available MCP Tools:**
146
+
147
+ - `start_task` - Start working on a task
148
+ - `finish_task` - Mark a task as finished
149
+
150
+ **Available MCP Prompts:**
151
+
152
+ - `start-task-workflow` - Guide for starting tasks
153
+ - `finish-task-workflow` - Guide for finishing tasks
154
+ - `task-summary` - Get task summary and insights
155
+
156
+ **Available MCP Resources:**
157
+
158
+ - `taskin://tasks` - Access all tasks
106
159
 
107
160
  ## 📦 Programmatic Usage
108
161
 
package/dist/index.js CHANGED
@@ -38,12 +38,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
38
38
  mod
39
39
  ));
40
40
 
41
- // ../../node_modules/.pnpm/tsup@8.5.0_postcss@8.5.6_tsx@4.20.6_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js
41
+ // ../../node_modules/.pnpm/tsup@8.5.0_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js
42
42
  import path from "path";
43
43
  import { fileURLToPath } from "url";
44
44
  var getFilename, getDirname, __dirname;
45
45
  var init_esm_shims = __esm({
46
- "../../node_modules/.pnpm/tsup@8.5.0_postcss@8.5.6_tsx@4.20.6_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js"() {
46
+ "../../node_modules/.pnpm/tsup@8.5.0_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js"() {
47
47
  "use strict";
48
48
  getFilename = () => fileURLToPath(import.meta.url);
49
49
  getDirname = () => path.dirname(getFilename());
@@ -7339,9 +7339,7 @@ var UserRegistry = class {
7339
7339
  console.log(`[UserRegistry] Loaded ${this.users.size} users`);
7340
7340
  } catch (error2) {
7341
7341
  if (error2.code === "ENOENT") {
7342
- console.warn(
7343
- "[UserRegistry] users.json not found, starting with empty registry"
7344
- );
7342
+ console.warn("[UserRegistry] users.json not found, starting with empty registry");
7345
7343
  this.users.clear();
7346
7344
  } else {
7347
7345
  throw error2;
@@ -7360,10 +7358,12 @@ var UserRegistry = class {
7360
7358
  */
7361
7359
  resolveUser(nameOrId) {
7362
7360
  const byId = this.users.get(nameOrId);
7363
- if (byId) return byId;
7361
+ if (byId)
7362
+ return byId;
7364
7363
  const slug = nameOrId.toLowerCase().replace(/\s+/g, "-");
7365
7364
  const bySlug = this.users.get(slug);
7366
- if (bySlug) return bySlug;
7365
+ if (bySlug)
7366
+ return bySlug;
7367
7367
  for (const user of this.users.values()) {
7368
7368
  if (user.name.toLowerCase() === nameOrId.toLowerCase()) {
7369
7369
  return user;
@@ -7403,11 +7403,7 @@ var UserRegistry = class {
7403
7403
  const data = {
7404
7404
  users: Object.fromEntries(this.users.entries())
7405
7405
  };
7406
- await fs2.writeFile(
7407
- this.usersFilePath,
7408
- JSON.stringify(data, null, 2),
7409
- "utf-8"
7410
- );
7406
+ await fs2.writeFile(this.usersFilePath, JSON.stringify(data, null, 2), "utf-8");
7411
7407
  }
7412
7408
  };
7413
7409
 
@@ -9027,13 +9023,13 @@ async function listTasks(filter, options) {
9027
9023
  }
9028
9024
  if (options.assignee) {
9029
9025
  filteredTasks = filteredTasks.filter(
9030
- (t) => t.userId?.toLowerCase().includes(options.assignee.toLowerCase())
9026
+ (t) => t.assignee?.name.toLowerCase().includes(options.assignee.toLowerCase()) || t.assignee?.id.toLowerCase().includes(options.assignee.toLowerCase())
9031
9027
  );
9032
9028
  }
9033
9029
  if (filter) {
9034
9030
  const lowerFilter = filter.toLowerCase();
9035
9031
  filteredTasks = filteredTasks.filter(
9036
- (t) => t.id.includes(lowerFilter) || t.title.toLowerCase().includes(lowerFilter) || t.status.toLowerCase().includes(lowerFilter) || t.userId?.toLowerCase().includes(lowerFilter)
9032
+ (t) => t.id.includes(lowerFilter) || t.title.toLowerCase().includes(lowerFilter) || t.status.toLowerCase().includes(lowerFilter) || t.assignee?.name.toLowerCase().includes(lowerFilter) || t.assignee?.id.toLowerCase().includes(lowerFilter)
9037
9033
  );
9038
9034
  }
9039
9035
  if (filteredTasks.length === 0) {
@@ -9050,7 +9046,7 @@ async function listTasks(filter, options) {
9050
9046
  const statusColor = getStatusColor(task.status);
9051
9047
  const typeColor = getTypeColor(task.type);
9052
9048
  console.log(
9053
- `${colors2.info(task.id.padEnd(15))} ${statusColor(task.status.padEnd(15))} ${typeColor(task.type.padEnd(12))} ${colors2.secondary((task.userId || "unknown").padEnd(15))} ${colors2.normal(task.title)}`
9049
+ `${colors2.info(task.id.padEnd(15))} ${statusColor(task.status.padEnd(15))} ${typeColor(task.type.padEnd(12))} ${colors2.secondary((task.assignee?.name || "unassigned").padEnd(15))} ${colors2.normal(task.title)}`
9054
9050
  );
9055
9051
  });
9056
9052
  console.log();
@@ -11712,6 +11708,24 @@ function showCustomHelp() {
11712
11708
  "taskin lint -p /path/to/tasks"
11713
11709
  ],
11714
11710
  icon: "\u{1F50D}"
11711
+ },
11712
+ {
11713
+ name: colors2.highlight("taskin dashboard") + colors2.normal(" [options]"),
11714
+ alias: colors2.secondary("Options: --host, --port"),
11715
+ description: "Start the web dashboard",
11716
+ examples: [
11717
+ "taskin dashboard",
11718
+ "taskin dashboard --port 3000",
11719
+ "taskin dashboard --host 0.0.0.0"
11720
+ ],
11721
+ icon: "\u{1F4CA}"
11722
+ },
11723
+ {
11724
+ name: colors2.highlight("taskin mcp-server"),
11725
+ alias: colors2.secondary("Alias: mcp"),
11726
+ description: "Start MCP server for Claude Desktop integration",
11727
+ examples: ["taskin mcp-server", "taskin mcp"],
11728
+ icon: "\u{1F916}"
11715
11729
  }
11716
11730
  ];
11717
11731
  commands.forEach((cmd, index) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskin",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "Task management system integrated with Git workflows",
5
5
  "motivation": "Provide a CLI tool for task management integrated with Git workflows",
6
6
  "solve": "Simplifies task tracking and management directly from the command line",
@@ -87,10 +87,10 @@
87
87
  "vitest": "^1.6.1",
88
88
  "@opentask/taskin-fs-provider": "1.0.5",
89
89
  "@opentask/taskin-task-manager": "1.0.5",
90
+ "@opentask/taskin-task-server-ws": "0.1.0",
90
91
  "@opentask/taskin-task-server-mcp": "0.1.0",
91
92
  "@opentask/taskin-types": "1.0.5",
92
- "@opentask/taskin-utils": "1.0.5",
93
- "@opentask/taskin-task-server-ws": "0.1.0"
93
+ "@opentask/taskin-utils": "1.0.5"
94
94
  },
95
95
  "scripts": {
96
96
  "build": "pnpm run build:dashboard && tsup",