kanbo-cli 0.2.0 → 0.3.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.
Files changed (86) hide show
  1. package/CHANGELOG.md +173 -0
  2. package/LICENSE +75 -21
  3. package/README.md +19 -48
  4. package/dist/{better-sqlite3-fU3G4xnX.cjs → better-sqlite3-DPdSZ6sH.cjs} +244 -247
  5. package/dist/cli-main.cjs +51208 -0
  6. package/dist/cli.cjs +32 -45216
  7. package/dist/dist-IHRTF-b5.cjs +2552 -0
  8. package/dist/lib/{tool-names-WfH4IURz.d.cts → approval-BsBk2xVr.d.cts} +72 -3
  9. package/dist/lib/{tool-names-3q_GEZej.d.mts → approval-LRZ6ontC.d.mts} +72 -3
  10. package/dist/lib/{board-store-BvWn9xTB.d.mts → board-store-D_Mpfb84.d.mts} +75 -2
  11. package/dist/lib/{board-store-BfszzAJB.d.cts → board-store-Dx-mw2I6.d.cts} +75 -2
  12. package/dist/lib/index.cjs +8 -2
  13. package/dist/lib/index.d.cts +202 -91
  14. package/dist/lib/index.d.mts +202 -91
  15. package/dist/lib/index.mjs +3 -3
  16. package/dist/lib/{manifest-RDyoGrVR.cjs → manifest-QPoQl8tn.cjs} +6881 -1556
  17. package/dist/lib/{manifest-BwpC-4BO.mjs → manifest-v2e9x_C8.mjs} +6795 -1556
  18. package/dist/lib/mcp/index.cjs +156 -21
  19. package/dist/lib/mcp/index.d.cts +140 -5
  20. package/dist/lib/mcp/index.d.mts +140 -5
  21. package/dist/lib/mcp/index.mjs +152 -22
  22. package/dist/lib/{migrate-DnMjTCvu.cjs → migrate-Dca5WdYd.cjs} +144 -14
  23. package/dist/lib/{migrate-BhYi9cXw.mjs → migrate-DtBeW3Fs.mjs} +134 -16
  24. package/dist/lib/{migrations-path-Ciwan537.mjs → migrations-path-ClaYRNwk.mjs} +5 -7
  25. package/dist/lib/{migrations-path-CZxVOgeD.cjs → migrations-path-DBCE17dT.cjs} +5 -7
  26. package/dist/lib/postgres/index.cjs +2 -4
  27. package/dist/lib/postgres/index.d.cts +2 -3
  28. package/dist/lib/postgres/index.d.mts +2 -3
  29. package/dist/lib/postgres/index.mjs +2 -4
  30. package/dist/lib/{roles.sql-CvyCGt38.mjs → roles.sql-BoOZSkBp.mjs} +96 -5
  31. package/dist/lib/{roles.sql-B9rt-x4o.cjs → roles.sql-E58x7mLS.cjs} +95 -4
  32. package/dist/lib/schema-D0MyXcej.d.cts +1 -2
  33. package/dist/lib/schema-D0MyXcej.d.mts +1 -2
  34. package/dist/lib/schema-epoch-ZyumVL_A.d.cts +1 -2
  35. package/dist/lib/schema-epoch-ZyumVL_A.d.mts +1 -2
  36. package/dist/lib/sqlite/index.cjs +2 -2
  37. package/dist/lib/sqlite/index.d.cts +3 -4
  38. package/dist/lib/sqlite/index.d.mts +3 -4
  39. package/dist/lib/sqlite/index.mjs +2 -2
  40. package/dist/lib/sqlite/schema.cjs +0 -2
  41. package/dist/lib/sqlite/schema.mjs +0 -2
  42. package/package.json +14 -11
  43. package/dist/better-sqlite3-fU3G4xnX.cjs.map +0 -1
  44. package/dist/cli.cjs.map +0 -1
  45. package/dist/dist-BsCwQFEl.cjs +0 -989
  46. package/dist/dist-BsCwQFEl.cjs.map +0 -1
  47. package/dist/lib/manifest-BwpC-4BO.mjs.map +0 -1
  48. package/dist/lib/manifest-RDyoGrVR.cjs.map +0 -1
  49. package/dist/lib/mcp/index.cjs.map +0 -1
  50. package/dist/lib/mcp/index.mjs.map +0 -1
  51. package/dist/lib/migrate-BhYi9cXw.mjs.map +0 -1
  52. package/dist/lib/migrate-DnMjTCvu.cjs.map +0 -1
  53. package/dist/lib/migrations-path-CZxVOgeD.cjs.map +0 -1
  54. package/dist/lib/migrations-path-Ciwan537.mjs.map +0 -1
  55. package/dist/lib/postgres/index.cjs.map +0 -1
  56. package/dist/lib/postgres/index.mjs.map +0 -1
  57. package/dist/lib/roles.sql-B9rt-x4o.cjs.map +0 -1
  58. package/dist/lib/roles.sql-CvyCGt38.mjs.map +0 -1
  59. package/dist/lib/sqlite/schema.cjs.map +0 -1
  60. package/dist/lib/sqlite/schema.mjs.map +0 -1
  61. package/drizzle-postgres/0000_board.sql +0 -135
  62. package/drizzle-postgres/0001_history_order.sql +0 -2
  63. package/drizzle-postgres/0002_issue_pull_requests.sql +0 -16
  64. package/drizzle-postgres/0003_milestone_start_date.sql +0 -1
  65. package/drizzle-postgres/0004_status_entry_rules.sql +0 -1
  66. package/drizzle-postgres/0005_run_external_session_ref.sql +0 -1
  67. package/drizzle-postgres/README.md +0 -61
  68. package/drizzle-postgres/meta/0000_snapshot.json +0 -1078
  69. package/drizzle-postgres/meta/0001_snapshot.json +0 -1090
  70. package/drizzle-postgres/meta/0002_snapshot.json +0 -1239
  71. package/drizzle-postgres/meta/0003_snapshot.json +0 -1245
  72. package/drizzle-postgres/meta/0004_snapshot.json +0 -1251
  73. package/drizzle-postgres/meta/0005_snapshot.json +0 -1257
  74. package/drizzle-postgres/meta/_journal.json +0 -48
  75. package/drizzle-sqlite/0000_board.sql +0 -133
  76. package/drizzle-sqlite/0001_issue_pull_requests.sql +0 -15
  77. package/drizzle-sqlite/0002_milestone_start_date.sql +0 -1
  78. package/drizzle-sqlite/0003_status_entry_rules.sql +0 -1
  79. package/drizzle-sqlite/0004_run_external_session_ref.sql +0 -1
  80. package/drizzle-sqlite/README.md +0 -67
  81. package/drizzle-sqlite/meta/0000_snapshot.json +0 -946
  82. package/drizzle-sqlite/meta/0001_snapshot.json +0 -1054
  83. package/drizzle-sqlite/meta/0002_snapshot.json +0 -1061
  84. package/drizzle-sqlite/meta/0003_snapshot.json +0 -1068
  85. package/drizzle-sqlite/meta/0004_snapshot.json +0 -1075
  86. package/drizzle-sqlite/meta/_journal.json +0 -41
@@ -1,8 +1,18 @@
1
- const require_migrations_path = require("./migrations-path-CZxVOgeD.cjs");
1
+ const require_migrations_path = require("./migrations-path-DBCE17dT.cjs");
2
2
  let drizzle_orm = require("drizzle-orm");
3
3
  let drizzle_orm_pg_core = require("drizzle-orm/pg-core");
4
4
  let node_path = require("node:path");
5
5
  let node_url = require("node:url");
6
+ //#region src/domain/like-pattern.ts
7
+ /**
8
+ * A `like` pattern that finds `text` anywhere in a value, the text matched as
9
+ * written: `%`, `_` and the escape character itself are escaped with `\`, the
10
+ * character a statement names in `escape '\'`.
11
+ */
12
+ function containsLikePattern(text) {
13
+ return `%${text.replace(/[\\%_]/g, (character) => `\\${character}`)}%`;
14
+ }
15
+ //#endregion
6
16
  //#region src/postgres/schema.ts
7
17
  /**
8
18
  * The board, as a Postgres database holds it.
@@ -348,6 +358,71 @@ async function selectRunProjection(database, scope) {
348
358
  }));
349
359
  }
350
360
  /**
361
+ * One page of the cards a query picks, and how many it picks in all, in one
362
+ * statement — the SQLite store's read, with the count cast to `int` (Postgres
363
+ * counts in `bigint`) and text matched with `ilike`, which folds every letter.
364
+ */
365
+ async function selectCardPage(database, query) {
366
+ if (query.statusIds?.length === 0 || query.priorities?.length === 0) return {
367
+ cards: [],
368
+ total: 0
369
+ };
370
+ const where = (0, drizzle_orm.and)(...cardQueryPredicates(query));
371
+ const page = database.select({
372
+ ...(0, drizzle_orm.getTableColumns)(issues),
373
+ pickedTotal: drizzle_orm.sql`cast(count(*) over () as int)`
374
+ }).from(issues).where(where).orderBy(issues.order, (0, drizzle_orm.desc)(issues.createdAt), issues.id).offset(query.offset ?? 0).$dynamic();
375
+ const rows = await (query.limit === void 0 ? page : page.limit(query.limit));
376
+ if (rows.length === 0) {
377
+ if ((query.offset ?? 0) === 0) return {
378
+ cards: [],
379
+ total: 0
380
+ };
381
+ const [row] = await database.select({ count: drizzle_orm.sql`cast(count(*) as int)` }).from(issues).where(where);
382
+ return {
383
+ cards: [],
384
+ total: row?.count ?? 0
385
+ };
386
+ }
387
+ return {
388
+ cards: rows.map(({ pickedTotal: _total, ...card }) => card),
389
+ total: rows[0].pickedTotal
390
+ };
391
+ }
392
+ function cardQueryPredicates(query) {
393
+ const running = drizzle_orm.sql`${issues.id} in (select ${issueRuns.issueId} from ${issueRuns} where ${issueRuns.state} = 'running')`;
394
+ const pattern = containsLikePattern(query.text ?? "");
395
+ return [
396
+ (0, drizzle_orm.eq)(issues.workspaceId, query.workspaceId),
397
+ query.statusIds === void 0 ? void 0 : (0, drizzle_orm.inArray)(issues.statusId, [...query.statusIds]),
398
+ query.waitingForPerson === void 0 ? void 0 : query.waitingForPerson ? (0, drizzle_orm.eq)(issues.waitingFor, "human") : (0, drizzle_orm.isNull)(issues.waitingFor),
399
+ query.parentIssueId === void 0 ? void 0 : (0, drizzle_orm.eq)(issues.parentIssueId, query.parentIssueId),
400
+ query.hasActiveRun === void 0 ? void 0 : query.hasActiveRun ? running : drizzle_orm.sql`not ${running}`,
401
+ query.returned === void 0 ? void 0 : query.returned ? returnedCard(running) : drizzle_orm.sql`not ${returnedCard(running)}`,
402
+ query.text === void 0 ? void 0 : drizzle_orm.sql`(${issues.id} ilike ${pattern} escape '\\' or ${issues.title} ilike ${pattern} escape '\\' or coalesce(${issues.description}, '') ilike ${pattern} escape '\\')`,
403
+ query.updatedSince === void 0 ? void 0 : (0, drizzle_orm.gte)(issues.updatedAt, query.updatedSince),
404
+ ...(query.labels ?? []).map((label) => drizzle_orm.sql`cast(${issues.labels} as jsonb) @> cast(${JSON.stringify([label])} as jsonb)`),
405
+ query.priorities === void 0 ? void 0 : (0, drizzle_orm.inArray)(issues.priority, [...query.priorities])
406
+ ];
407
+ }
408
+ /**
409
+ * A card a person sent back that nobody picked up again (`BoardCardQuery.returned`):
410
+ * not waiting, not running, and its last decision a return — `seq` breaking a
411
+ * tie inside one second where SQLite reads `rowid`.
412
+ */
413
+ function returnedCard(running) {
414
+ return drizzle_orm.sql`(${issues.waitingFor} is null and not ${running} and exists (
415
+ select 1 from ${issueComments} as decision
416
+ where decision.issue_id = ${issues.id} and decision.author_kind = 'system.returned'
417
+ and not exists (
418
+ select 1 from ${issueComments} as later
419
+ where later.issue_id = decision.issue_id
420
+ and later.author_kind in ('system.approved', 'system.returned')
421
+ and (later.created_at > decision.created_at or (later.created_at = decision.created_at and later.seq > decision.seq))
422
+ )
423
+ ))`;
424
+ }
425
+ /**
351
426
  * The board's statements against one Postgres handle — a connection, or a
352
427
  * transaction on one.
353
428
  *
@@ -365,6 +440,10 @@ function createStoreOver(database) {
365
440
  const [row] = await database.select().from(issueStatuses).where((0, drizzle_orm.eq)(issueStatuses.id, statusId)).limit(1);
366
441
  return row ?? null;
367
442
  },
443
+ lockById: async (statusId) => {
444
+ const [row] = await database.select().from(issueStatuses).where((0, drizzle_orm.eq)(issueStatuses.id, statusId)).limit(1).for("update");
445
+ return row ?? null;
446
+ },
368
447
  findInWorkspace: async (workspaceId, statusId) => {
369
448
  const [row] = await database.select().from(issueStatuses).where((0, drizzle_orm.and)((0, drizzle_orm.eq)(issueStatuses.workspaceId, workspaceId), (0, drizzle_orm.eq)(issueStatuses.id, statusId))).limit(1);
370
449
  return row ?? null;
@@ -408,10 +487,16 @@ function createStoreOver(database) {
408
487
  }
409
488
  },
410
489
  issues: {
411
- listInBoardOrder: async (workspaceId) => await database.select().from(issues).where(workspaceId ? (0, drizzle_orm.eq)(issues.workspaceId, workspaceId) : void 0).orderBy(issues.order, (0, drizzle_orm.desc)(issues.createdAt)),
490
+ listInBoardOrder: async (workspaceId) => await database.select().from(issues).where(workspaceId ? (0, drizzle_orm.eq)(issues.workspaceId, workspaceId) : void 0).orderBy(issues.order, (0, drizzle_orm.desc)(issues.createdAt), issues.id),
412
491
  listNewestFirst: async () => await database.select().from(issues).orderBy((0, drizzle_orm.desc)(issues.createdAt)),
413
492
  listAll: async () => await database.select().from(issues),
414
493
  listByWorkspace: async (workspaceId) => await database.select().from(issues).where((0, drizzle_orm.eq)(issues.workspaceId, workspaceId)),
494
+ listPage: async (query) => await selectCardPage(database, query),
495
+ countByMilestone: async (workspaceId) => await database.select({
496
+ milestoneId: drizzle_orm.sql`${issues.milestoneId}`,
497
+ statusId: issues.statusId,
498
+ count: drizzle_orm.sql`cast(count(*) as int)`
499
+ }).from(issues).where((0, drizzle_orm.and)((0, drizzle_orm.eq)(issues.workspaceId, workspaceId), (0, drizzle_orm.isNotNull)(issues.milestoneId))).groupBy(issues.milestoneId, issues.statusId),
415
500
  listByIds: async (issueIds) => await database.select().from(issues).where((0, drizzle_orm.inArray)(issues.id, issueIds)),
416
501
  findById: async (issueId) => {
417
502
  const [row] = await database.select().from(issues).where((0, drizzle_orm.eq)(issues.id, issueId)).limit(1);
@@ -481,6 +566,14 @@ function createStoreOver(database) {
481
566
  },
482
567
  comments: {
483
568
  listByIssue: async (issueId) => (await database.select().from(issueComments).where((0, drizzle_orm.eq)(issueComments.issueId, issueId)).orderBy((0, drizzle_orm.asc)(issueComments.createdAt), (0, drizzle_orm.asc)(issueComments.seq))).map(toIssueComment),
569
+ listLatestByIssues: async (issueIds, authorKinds) => {
570
+ if (issueIds.length === 0 || authorKinds?.length === 0) return [];
571
+ const ranked = database.select({
572
+ id: issueComments.id,
573
+ commentRank: drizzle_orm.sql`cast(row_number() over (partition by ${issueComments.issueId} order by ${issueComments.createdAt} desc, ${issueComments.seq} desc) as int)`.as("comment_rank")
574
+ }).from(issueComments).where((0, drizzle_orm.and)((0, drizzle_orm.inArray)(issueComments.issueId, [...issueIds]), authorKinds === void 0 ? void 0 : (0, drizzle_orm.inArray)(issueComments.authorKind, [...authorKinds]))).as("ranked");
575
+ return (await database.select((0, drizzle_orm.getTableColumns)(issueComments)).from(issueComments).innerJoin(ranked, (0, drizzle_orm.eq)(ranked.id, issueComments.id)).where((0, drizzle_orm.eq)(ranked.commentRank, 1))).map(toIssueComment);
576
+ },
484
577
  findById: async (commentId) => {
485
578
  const [row] = await database.select().from(issueComments).where((0, drizzle_orm.eq)(issueComments.id, commentId)).limit(1);
486
579
  return row ? toIssueComment(row) : null;
@@ -1029,5 +1122,3 @@ Object.defineProperty(exports, "kanbanMeta", {
1029
1122
  return kanbanMeta;
1030
1123
  }
1031
1124
  });
1032
-
1033
- //# sourceMappingURL=roles.sql-B9rt-x4o.cjs.map
@@ -3608,5 +3608,4 @@ declare const boardSqliteSchema: {
3608
3608
  }>;
3609
3609
  };
3610
3610
  //#endregion
3611
- export { issueStatuses as _, IssuePullRequest as a, IssueStatus as c, issueComments as d, issueFieldChanges as f, issueRuns as g, issueRelations as h, IssueMilestone as i, KanbanMeta as l, issuePullRequests as m, IssueComment as n, IssueRelation as o, issueMilestones as p, IssueFieldChange as r, IssueRun as s, Issue as t, boardSqliteSchema as u, issues as v, kanbanMeta as y };
3612
- //# sourceMappingURL=schema-D0MyXcej.d.cts.map
3611
+ export { issueStatuses as _, IssuePullRequest as a, IssueStatus as c, issueComments as d, issueFieldChanges as f, issueRuns as g, issueRelations as h, IssueMilestone as i, KanbanMeta as l, issuePullRequests as m, IssueComment as n, IssueRelation as o, issueMilestones as p, IssueFieldChange as r, IssueRun as s, Issue as t, boardSqliteSchema as u, issues as v, kanbanMeta as y };
@@ -3608,5 +3608,4 @@ declare const boardSqliteSchema: {
3608
3608
  }>;
3609
3609
  };
3610
3610
  //#endregion
3611
- export { issueStatuses as _, IssuePullRequest as a, IssueStatus as c, issueComments as d, issueFieldChanges as f, issueRuns as g, issueRelations as h, IssueMilestone as i, KanbanMeta as l, issuePullRequests as m, IssueComment as n, IssueRelation as o, issueMilestones as p, IssueFieldChange as r, IssueRun as s, Issue as t, boardSqliteSchema as u, issues as v, kanbanMeta as y };
3612
- //# sourceMappingURL=schema-D0MyXcej.d.mts.map
3611
+ export { issueStatuses as _, IssuePullRequest as a, IssueStatus as c, issueComments as d, issueFieldChanges as f, issueRuns as g, issueRelations as h, IssueMilestone as i, KanbanMeta as l, issuePullRequests as m, IssueComment as n, IssueRelation as o, issueMilestones as p, IssueFieldChange as r, IssueRun as s, Issue as t, boardSqliteSchema as u, issues as v, kanbanMeta as y };
@@ -12,5 +12,4 @@
12
12
  */
13
13
  declare const BOARD_SCHEMA_EPOCH = 1;
14
14
  //#endregion
15
- export { BOARD_SCHEMA_EPOCH as t };
16
- //# sourceMappingURL=schema-epoch-ZyumVL_A.d.cts.map
15
+ export { BOARD_SCHEMA_EPOCH as t };
@@ -12,5 +12,4 @@
12
12
  */
13
13
  declare const BOARD_SCHEMA_EPOCH = 1;
14
14
  //#endregion
15
- export { BOARD_SCHEMA_EPOCH as t };
16
- //# sourceMappingURL=schema-epoch-ZyumVL_A.d.mts.map
15
+ export { BOARD_SCHEMA_EPOCH as t };
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_migrations_path = require("../migrations-path-CZxVOgeD.cjs");
2
+ const require_migrations_path = require("../migrations-path-DBCE17dT.cjs");
3
+ const require_migrate = require("../migrate-Dca5WdYd.cjs");
3
4
  const require_sqlite_schema = require("./schema.cjs");
4
- const require_migrate = require("../migrate-DnMjTCvu.cjs");
5
5
  exports.BOARD_SCHEMA_EPOCH = require_migrations_path.BOARD_SCHEMA_EPOCH;
6
6
  exports.assertBoardSchema = require_migrate.assertBoardSchema;
7
7
  exports.boardSqliteSchema = require_sqlite_schema.boardSqliteSchema;
@@ -1,8 +1,8 @@
1
1
  import { _ as issueStatuses, c as IssueStatus, d as issueComments, f as issueFieldChanges, g as issueRuns, h as issueRelations, i as IssueMilestone, l as KanbanMeta, n as IssueComment, o as IssueRelation, p as issueMilestones, r as IssueFieldChange, s as IssueRun, t as Issue, u as boardSqliteSchema, v as issues, y as kanbanMeta } from "../schema-D0MyXcej.cjs";
2
- import { a as BoardStore } from "../board-store-BfszzAJB.cjs";
2
+ import { c as BoardStore } from "../board-store-Dx-mw2I6.cjs";
3
3
  import { t as BOARD_SCHEMA_EPOCH } from "../schema-epoch-ZyumVL_A.cjs";
4
- import { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
5
4
  import { Database } from "better-sqlite3";
5
+ import { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
6
6
  //#region src/sqlite/transaction.d.ts
7
7
  /**
8
8
  * The database handle itself — what the host hands the board — and not an open
@@ -171,5 +171,4 @@ interface BoardFileContents {
171
171
  */
172
172
  export declare function readBoardFileContents(path: string): BoardFileContents;
173
173
  //#endregion
174
- export { BOARD_SCHEMA_EPOCH, type BoardDatabase, type BoardFileContents, type BoardFileOwner, type Issue, type IssueComment, type IssueFieldChange, type IssueMilestone, type IssueRelation, type IssueRun, type IssueStatus, type KanbanMeta, type SqliteDatabase, type SqliteTransactionMode, boardSqliteSchema, issueComments, issueFieldChanges, issueMilestones, issueRelations, issueRuns, issueStatuses, issues, kanbanMeta };
175
- //# sourceMappingURL=index.d.cts.map
174
+ export { BOARD_SCHEMA_EPOCH, type BoardDatabase, type BoardFileContents, type BoardFileOwner, type Issue, type IssueComment, type IssueFieldChange, type IssueMilestone, type IssueRelation, type IssueRun, type IssueStatus, type KanbanMeta, type SqliteDatabase, type SqliteTransactionMode, boardSqliteSchema, issueComments, issueFieldChanges, issueMilestones, issueRelations, issueRuns, issueStatuses, issues, kanbanMeta };
@@ -1,8 +1,8 @@
1
1
  import { _ as issueStatuses, c as IssueStatus, d as issueComments, f as issueFieldChanges, g as issueRuns, h as issueRelations, i as IssueMilestone, l as KanbanMeta, n as IssueComment, o as IssueRelation, p as issueMilestones, r as IssueFieldChange, s as IssueRun, t as Issue, u as boardSqliteSchema, v as issues, y as kanbanMeta } from "../schema-D0MyXcej.mjs";
2
- import { a as BoardStore } from "../board-store-BvWn9xTB.mjs";
2
+ import { c as BoardStore } from "../board-store-D_Mpfb84.mjs";
3
3
  import { t as BOARD_SCHEMA_EPOCH } from "../schema-epoch-ZyumVL_A.mjs";
4
- import { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
5
4
  import { Database } from "better-sqlite3";
5
+ import { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
6
6
  //#region src/sqlite/transaction.d.ts
7
7
  /**
8
8
  * The database handle itself — what the host hands the board — and not an open
@@ -171,5 +171,4 @@ interface BoardFileContents {
171
171
  */
172
172
  export declare function readBoardFileContents(path: string): BoardFileContents;
173
173
  //#endregion
174
- export { BOARD_SCHEMA_EPOCH, type BoardDatabase, type BoardFileContents, type BoardFileOwner, type Issue, type IssueComment, type IssueFieldChange, type IssueMilestone, type IssueRelation, type IssueRun, type IssueStatus, type KanbanMeta, type SqliteDatabase, type SqliteTransactionMode, boardSqliteSchema, issueComments, issueFieldChanges, issueMilestones, issueRelations, issueRuns, issueStatuses, issues, kanbanMeta };
175
- //# sourceMappingURL=index.d.mts.map
174
+ export { BOARD_SCHEMA_EPOCH, type BoardDatabase, type BoardFileContents, type BoardFileOwner, type Issue, type IssueComment, type IssueFieldChange, type IssueMilestone, type IssueRelation, type IssueRun, type IssueStatus, type KanbanMeta, type SqliteDatabase, type SqliteTransactionMode, boardSqliteSchema, issueComments, issueFieldChanges, issueMilestones, issueRelations, issueRuns, issueStatuses, issues, kanbanMeta };
@@ -1,4 +1,4 @@
1
- import { r as BOARD_SCHEMA_EPOCH } from "../migrations-path-Ciwan537.mjs";
1
+ import { r as BOARD_SCHEMA_EPOCH } from "../migrations-path-ClaYRNwk.mjs";
2
+ import { a as openBoardDatabase, i as markBoardFileOwnedByKanbo, l as createSqliteBoardStore, n as migrateBoardFile, o as readBoardFileContents, r as assertBoardSchema, s as readBoardFileOwner, t as getBoardSqliteMigrationsPath, u as runSqliteTransaction } from "../migrate-DtBeW3Fs.mjs";
2
3
  import { boardSqliteSchema, issueComments, issueFieldChanges, issueMilestones, issueRelations, issueRuns, issueStatuses, issues, kanbanMeta } from "./schema.mjs";
3
- import { a as openBoardDatabase, c as createSqliteBoardStore, i as markBoardFileOwnedByKanbo, l as runSqliteTransaction, n as migrateBoardFile, o as readBoardFileContents, r as assertBoardSchema, s as readBoardFileOwner, t as getBoardSqliteMigrationsPath } from "../migrate-BhYi9cXw.mjs";
4
4
  export { BOARD_SCHEMA_EPOCH, assertBoardSchema, boardSqliteSchema, createSqliteBoardStore, getBoardSqliteMigrationsPath, issueComments, issueFieldChanges, issueMilestones, issueRelations, issueRuns, issueStatuses, issues, kanbanMeta, markBoardFileOwnedByKanbo, migrateBoardFile, openBoardDatabase, readBoardFileContents, readBoardFileOwner, runSqliteTransaction };
@@ -262,5 +262,3 @@ exports.issueRuns = issueRuns;
262
262
  exports.issueStatuses = issueStatuses;
263
263
  exports.issues = issues;
264
264
  exports.kanbanMeta = kanbanMeta;
265
-
266
- //# sourceMappingURL=schema.cjs.map
@@ -252,5 +252,3 @@ const boardSqliteSchema = {
252
252
  };
253
253
  //#endregion
254
254
  export { boardSqliteSchema, issueComments, issueFieldChanges, issueMilestones, issuePullRequests, issueRelations, issueRuns, issueStatuses, issues, kanbanMeta };
255
-
256
- //# sourceMappingURL=schema.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kanbo-cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A Kanban board your AI agents drive through a CLI and an MCP server, and you watch and approve.",
5
5
  "keywords": [
6
6
  "kanban",
@@ -27,7 +27,7 @@
27
27
  "type": "git",
28
28
  "url": "git+https://github.com/Krowli/kanbo.git"
29
29
  },
30
- "license": "MIT",
30
+ "license": "PolyForm-Noncommercial-1.0.0",
31
31
  "author": "Krowli",
32
32
  "type": "module",
33
33
  "bin": {
@@ -91,9 +91,8 @@
91
91
  },
92
92
  "files": [
93
93
  "dist",
94
- "drizzle-sqlite",
95
- "drizzle-postgres",
96
94
  "README.md",
95
+ "CHANGELOG.md",
97
96
  "LICENSE"
98
97
  ],
99
98
  "engines": {
@@ -103,39 +102,43 @@
103
102
  "access": "public"
104
103
  },
105
104
  "scripts": {
106
- "build": "tsdown --config tsdown.cli.config.ts && tsdown --config tsdown.lib.config.ts && tsdown --config tsdown.page.config.ts && cp -R drizzle-postgres dist/drizzle-postgres && cp -R drizzle-sqlite dist/drizzle-sqlite && chmod +x dist/cli.cjs",
105
+ "build": "tsdown --config tsdown.cli.config.ts && tsdown --config tsdown.lib.config.ts && tsdown --config tsdown.page.config.ts && node scripts/copy-build-assets.mjs",
107
106
  "test": "vitest run src",
107
+ "coverage": "vitest run src --coverage",
108
108
  "typecheck": "tsc --noEmit && tsc --noEmit -p src/serve/page/tsconfig.json",
109
109
  "generate:postgres": "drizzle-kit generate --config drizzle.postgres.config.ts --name board",
110
110
  "generate:sqlite": "drizzle-kit generate --config drizzle.sqlite.config.ts --name board",
111
111
  "kanbo": "tsx src/cli/index.ts",
112
- "prepack": "npm run build"
112
+ "prepack": "npm run build",
113
+ "bench": "tsx scripts/bench.mjs"
113
114
  },
114
115
  "dependencies": {
115
116
  "@clack/prompts": "^1.7.0",
116
117
  "@modelcontextprotocol/sdk": "^1.30.0",
117
118
  "commander": "^15.0.0",
119
+ "cross-spawn": "^7.0.6",
118
120
  "drizzle-orm": "^0.45.2",
119
121
  "picocolors": "^1.1.1",
120
122
  "postgres": "^3.4.9",
121
123
  "zod": "^4.5.4"
122
124
  },
123
- "peerDependencies": {
124
- "@types/better-sqlite3": "^9.6.0",
125
+ "optionalDependencies": {
125
126
  "better-sqlite3": "^13.0.3"
126
127
  },
128
+ "peerDependencies": {
129
+ "@types/better-sqlite3": "^9.6.0"
130
+ },
127
131
  "peerDependenciesMeta": {
128
132
  "@types/better-sqlite3": {
129
133
  "optional": true
130
- },
131
- "better-sqlite3": {
132
- "optional": true
133
134
  }
134
135
  },
135
136
  "devDependencies": {
136
137
  "@electric-sql/pglite": "^0.5.8",
137
138
  "@types/better-sqlite3": "^9.6.0",
139
+ "@types/cross-spawn": "^6.0.6",
138
140
  "@types/node": "^22.20.1",
141
+ "@vitest/coverage-v8": "^5.0.2",
139
142
  "better-sqlite3": "^13.0.3",
140
143
  "drizzle-kit": "^0.31.10",
141
144
  "jsdom": "^30.0.1",