@hasna/todos 0.9.47 → 0.9.48

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/dist/cli/index.js CHANGED
@@ -14807,6 +14807,61 @@ program2.command("pin <id>").description("Escalate task to critical priority").o
14807
14807
  handleError(new Error("Failed to pin"));
14808
14808
  }
14809
14809
  });
14810
+ program2.command("summary").description("Generate a markdown summary of recent task activity").option("--days <n>", "Days of history to include", "7").option("--project <id>", "Filter to project").option("--agent <id>", "Filter to agent").option("--json", "Output as JSON").action(async (opts) => {
14811
+ const globalOpts = program2.opts();
14812
+ const db = getDatabase();
14813
+ const days = parseInt(opts.days, 10);
14814
+ const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
14815
+ const projectId = opts.project || autoProject(globalOpts);
14816
+ const filter = {};
14817
+ if (projectId)
14818
+ filter.project_id = projectId;
14819
+ if (opts.agent)
14820
+ filter.assigned_to = opts.agent;
14821
+ const { getTasksChangedSince: getTasksChangedSince2 } = (init_tasks(), __toCommonJS(exports_tasks));
14822
+ const changed = getTasksChangedSince2(since, Object.keys(filter).length ? filter : undefined, db);
14823
+ const completed = changed.filter((t) => t.status === "completed");
14824
+ const inProgress = changed.filter((t) => t.status === "in_progress");
14825
+ const failed = changed.filter((t) => t.status === "failed");
14826
+ const allTasks = listTasks({ ...filter, status: "pending" });
14827
+ if (opts.json || globalOpts.json) {
14828
+ console.log(JSON.stringify({ completed, in_progress: inProgress, failed, pending: allTasks.length, period_days: days }, null, 2));
14829
+ return;
14830
+ }
14831
+ const lines = [];
14832
+ lines.push(`## Task Summary \u2014 Last ${days} day${days !== 1 ? "s" : ""}`);
14833
+ lines.push(`*${new Date().toLocaleDateString()}*
14834
+ `);
14835
+ if (completed.length > 0) {
14836
+ lines.push(`### \u2705 Completed (${completed.length})`);
14837
+ for (const t of completed) {
14838
+ const id = t.short_id || t.id.slice(0, 8);
14839
+ const who = t.assigned_to ? ` \u2014 ${t.assigned_to}` : "";
14840
+ lines.push(`- **${id}**: ${t.title}${who}`);
14841
+ }
14842
+ lines.push("");
14843
+ }
14844
+ if (inProgress.length > 0) {
14845
+ lines.push(`### \uD83D\uDD04 In Progress (${inProgress.length})`);
14846
+ for (const t of inProgress) {
14847
+ const id = t.short_id || t.id.slice(0, 8);
14848
+ const who = t.assigned_to ? ` \u2014 ${t.assigned_to}` : "";
14849
+ lines.push(`- **${id}**: ${t.title}${who}`);
14850
+ }
14851
+ lines.push("");
14852
+ }
14853
+ if (failed.length > 0) {
14854
+ lines.push(`### \u274C Failed (${failed.length})`);
14855
+ for (const t of failed) {
14856
+ const id = t.short_id || t.id.slice(0, 8);
14857
+ lines.push(`- **${id}**: ${t.title}`);
14858
+ }
14859
+ lines.push("");
14860
+ }
14861
+ lines.push(`### \uD83D\uDCCB Pending: ${allTasks.length} task${allTasks.length !== 1 ? "s" : ""} remaining`);
14862
+ console.log(lines.join(`
14863
+ `));
14864
+ });
14810
14865
  program2.action(async () => {
14811
14866
  if (process.stdout.isTTY) {
14812
14867
  try {
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ export { TodosClient, createClient } from "./sdk.js";
2
+ export type { TodosClientOptions } from "./sdk.js";
1
3
  export { getDatabase, closeDatabase, resetDatabase, resolvePartialId, now, uuid } from "./db/database.js";
2
4
  export { createTask, getTask, getTaskWithRelations, listTasks, countTasks, updateTask, deleteTask, startTask, completeTask, lockTask, unlockTask, addDependency, removeDependency, getTaskDependencies, getTaskDependents, getBlockingDeps, bulkUpdateTasks, bulkCreateTasks, cloneTask, getTaskStats, getTaskGraph, moveTask, getNextTask, claimNextTask, getActiveWork, failTask, getTasksChangedSince, getStaleTasks, getStatus, decomposeTasks, setTaskStatus, setTaskPriority, } from "./db/tasks.js";
3
5
  export type { TaskGraphNode, TaskGraph, BulkCreateTaskInput, ActiveWorkItem, StatusSummary, DecomposeSubtaskInput } from "./db/tasks.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,95 @@
1
1
  // @bun
2
+ // src/sdk.ts
3
+ class TodosClient {
4
+ baseUrl;
5
+ timeout;
6
+ constructor(options = {}) {
7
+ this.baseUrl = options.baseUrl || process.env["TODOS_URL"] || "http://localhost:19427";
8
+ this.timeout = options.timeout || 1e4;
9
+ }
10
+ static fromEnv() {
11
+ return new TodosClient({ baseUrl: process.env["TODOS_URL"] });
12
+ }
13
+ async fetch(path, init) {
14
+ const controller = new AbortController;
15
+ const timer = setTimeout(() => controller.abort(), this.timeout);
16
+ try {
17
+ const res = await fetch(`${this.baseUrl}${path}`, { ...init, signal: controller.signal });
18
+ if (!res.ok) {
19
+ const err = await res.json().catch(() => ({ error: res.statusText }));
20
+ throw new Error(err.error || `HTTP ${res.status}`);
21
+ }
22
+ return res.json();
23
+ } finally {
24
+ clearTimeout(timer);
25
+ }
26
+ }
27
+ async isAlive() {
28
+ try {
29
+ await this.fetch("/api/stats");
30
+ return true;
31
+ } catch {
32
+ return false;
33
+ }
34
+ }
35
+ async getStatus(projectId, agentId) {
36
+ const params = new URLSearchParams;
37
+ if (projectId)
38
+ params.set("project_id", projectId);
39
+ if (agentId)
40
+ params.set("agent_id", agentId);
41
+ return this.fetch(`/api/tasks/status?${params}`);
42
+ }
43
+ async listTasks(filter = {}) {
44
+ const params = new URLSearchParams;
45
+ for (const [k, v] of Object.entries(filter)) {
46
+ if (v !== undefined)
47
+ params.set(k, String(v));
48
+ }
49
+ return this.fetch(`/api/tasks?${params}`);
50
+ }
51
+ async getTask(id) {
52
+ return this.fetch(`/api/tasks/${id}`);
53
+ }
54
+ async getTaskHistory(id) {
55
+ return this.fetch(`/api/tasks/${id}/history`);
56
+ }
57
+ async getTaskProgress(id) {
58
+ return this.fetch(`/api/tasks/${id}/progress`);
59
+ }
60
+ async claimNextTask(agentId, projectId) {
61
+ return this.fetch("/api/tasks/claim", {
62
+ method: "POST",
63
+ headers: { "Content-Type": "application/json" },
64
+ body: JSON.stringify({ agent_id: agentId, project_id: projectId })
65
+ });
66
+ }
67
+ async completeTask(id, agentId) {
68
+ return this.fetch(`/api/tasks/${id}/complete`, {
69
+ method: "POST",
70
+ headers: { "Content-Type": "application/json" },
71
+ body: JSON.stringify({ agent_id: agentId })
72
+ });
73
+ }
74
+ async getStats() {
75
+ return this.fetch("/api/stats");
76
+ }
77
+ async getActiveWork(projectId) {
78
+ const params = new URLSearchParams;
79
+ if (projectId)
80
+ params.set("project_id", projectId);
81
+ return this.fetch(`/api/tasks/active?${params}`);
82
+ }
83
+ async getTasksChangedSince(since, projectId) {
84
+ const params = new URLSearchParams({ since });
85
+ if (projectId)
86
+ params.set("project_id", projectId);
87
+ return this.fetch(`/api/tasks/changed?${params}`);
88
+ }
89
+ }
90
+ function createClient(options) {
91
+ return new TodosClient(options);
92
+ }
2
93
  // src/db/database.ts
3
94
  import { Database } from "bun:sqlite";
4
95
  import { existsSync, mkdirSync } from "fs";
@@ -3180,6 +3271,7 @@ export {
3180
3271
  createProject,
3181
3272
  createPlan,
3182
3273
  createOrg,
3274
+ createClient,
3183
3275
  countTasks,
3184
3276
  completeTask,
3185
3277
  closeDatabase,
@@ -3191,6 +3283,7 @@ export {
3191
3283
  addDependency,
3192
3284
  addComment,
3193
3285
  VersionConflictError,
3286
+ TodosClient,
3194
3287
  TaskNotFoundError,
3195
3288
  TaskListNotFoundError,
3196
3289
  TASK_STATUSES,
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @hasna/todos REST SDK Client
3
+ * Zero-dependency HTTP client for the todos REST API (todos serve).
4
+ * Use when you need to interact with todos from another machine or process.
5
+ */
6
+ export interface TodosClientOptions {
7
+ baseUrl?: string;
8
+ timeout?: number;
9
+ }
10
+ export declare class TodosClient {
11
+ private baseUrl;
12
+ private timeout;
13
+ constructor(options?: TodosClientOptions);
14
+ static fromEnv(): TodosClient;
15
+ private fetch;
16
+ isAlive(): Promise<boolean>;
17
+ getStatus(projectId?: string, agentId?: string): Promise<any>;
18
+ listTasks(filter?: {
19
+ status?: string;
20
+ project_id?: string;
21
+ assigned_to?: string;
22
+ limit?: number;
23
+ offset?: number;
24
+ session_id?: string;
25
+ }): Promise<any[]>;
26
+ getTask(id: string): Promise<any>;
27
+ getTaskHistory(id: string): Promise<any[]>;
28
+ getTaskProgress(id: string): Promise<any>;
29
+ claimNextTask(agentId: string, projectId?: string): Promise<any>;
30
+ completeTask(id: string, agentId?: string): Promise<any>;
31
+ getStats(): Promise<any>;
32
+ getActiveWork(projectId?: string): Promise<any[]>;
33
+ getTasksChangedSince(since: string, projectId?: string): Promise<any>;
34
+ }
35
+ export declare function createClient(options?: TodosClientOptions): TodosClient;
36
+ //# sourceMappingURL=sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,kBAAuB;IAK5C,MAAM,CAAC,OAAO,IAAI,WAAW;YAIf,KAAK;IAeb,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAO3B,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAO7D,SAAS,CAAC,MAAM,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAQ5J,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAIjC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAI1C,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAIzC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQhE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQxD,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IAIxB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAMjD,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAK5E;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAEtE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.9.47",
3
+ "version": "0.9.48",
4
4
  "description": "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",