kanbo-cli 0.4.0 → 0.6.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 (43) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/cli-main.cjs +1322 -154
  3. package/dist/drizzle-postgres/0006_flow_rules_and_column_entries.sql +3 -0
  4. package/dist/drizzle-postgres/README.md +8 -0
  5. package/dist/drizzle-postgres/meta/0006_snapshot.json +1290 -0
  6. package/dist/drizzle-postgres/meta/_journal.json +7 -0
  7. package/dist/drizzle-sqlite/0005_flow_rules_and_column_entries.sql +3 -0
  8. package/dist/drizzle-sqlite/README.md +8 -0
  9. package/dist/drizzle-sqlite/meta/0005_snapshot.json +1097 -0
  10. package/dist/drizzle-sqlite/meta/_journal.json +7 -0
  11. package/dist/lib/{approval-BsBk2xVr.d.cts → approval-CnJJfwfi.d.mts} +30 -6
  12. package/dist/lib/{approval-LRZ6ontC.d.mts → approval-DNfUhYD5.d.cts} +30 -6
  13. package/dist/lib/{board-store-D_Mpfb84.d.mts → board-store-BjhiH9TZ.d.mts} +38 -2
  14. package/dist/lib/{board-store-Dx-mw2I6.d.cts → board-store-CsyBXBwH.d.cts} +38 -2
  15. package/dist/lib/index.cjs +9 -1
  16. package/dist/lib/index.d.cts +302 -6
  17. package/dist/lib/index.d.mts +302 -6
  18. package/dist/lib/index.mjs +2 -2
  19. package/dist/lib/{manifest-DcIMYvWk.cjs → manifest-BFI4HGPh.cjs} +1410 -225
  20. package/dist/lib/{manifest-Dmo6IlWk.mjs → manifest-DHI1fkoW.mjs} +1395 -258
  21. package/dist/lib/mcp/index.cjs +24 -4
  22. package/dist/lib/mcp/index.d.cts +19 -4
  23. package/dist/lib/mcp/index.d.mts +19 -4
  24. package/dist/lib/mcp/index.mjs +24 -4
  25. package/dist/lib/{migrate-Dca5WdYd.cjs → migrate-36aT0rV0.cjs} +17 -0
  26. package/dist/lib/{migrate-DtBeW3Fs.mjs → migrate-Bgj_aABY.mjs} +18 -1
  27. package/dist/lib/postgres/index.cjs +1 -1
  28. package/dist/lib/postgres/index.d.cts +69 -1
  29. package/dist/lib/postgres/index.d.mts +69 -1
  30. package/dist/lib/postgres/index.mjs +1 -1
  31. package/dist/lib/{roles.sql-BoOZSkBp.mjs → roles.sql-9OkYvsNM.mjs} +26 -2
  32. package/dist/lib/{roles.sql-E58x7mLS.cjs → roles.sql-BC7k_zPh.cjs} +25 -1
  33. package/dist/lib/{schema-D0MyXcej.d.cts → schema-Cwx3HosC.d.cts} +72 -0
  34. package/dist/lib/{schema-D0MyXcej.d.mts → schema-Cwx3HosC.d.mts} +72 -0
  35. package/dist/lib/sqlite/index.cjs +1 -1
  36. package/dist/lib/sqlite/index.d.cts +2 -2
  37. package/dist/lib/sqlite/index.d.mts +2 -2
  38. package/dist/lib/sqlite/index.mjs +1 -1
  39. package/dist/lib/sqlite/schema.cjs +13 -1
  40. package/dist/lib/sqlite/schema.d.cts +1 -1
  41. package/dist/lib/sqlite/schema.d.mts +1 -1
  42. package/dist/lib/sqlite/schema.mjs +13 -1
  43. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import { a as IssuePullRequest, c as IssueStatus, f as issueFieldChanges, i as IssueMilestone, l as KanbanMeta, n as IssueComment, o as IssueRelation, r as IssueFieldChange, s as IssueRun, t as Issue, v as issues } from "./schema-D0MyXcej.mjs";
2
- import { _ as IssueRunStore, a as BoardMilestoneCardCount, c as BoardStore, d as IssueContextRefStore, f as IssueFieldChangeStore, g as IssueRowStore, h as IssueRelationStore, i as BoardLinkedPullRequest, l as BoardTransactionMode, m as IssuePullRequestStore, n as BoardCardPage, o as BoardRunProjection, p as IssueMilestoneStore, r as BoardCardQuery, s as BoardRunProjectionScope, t as BoardActiveRun, u as IssueCommentStore, v as IssueStatusStore, y as KanbanMetaStore } from "./board-store-D_Mpfb84.mjs";
3
- import { C as readEntryRules, S as readChecklist, _ as EntryRule, a as IssueActorReference, b as UnmetEntryRule, c as isOutsideWriter, d as KANBO_TOOL_CLI_EQUIVALENTS, f as KANBO_TOOL_NAMES, g as ENTRY_RULE_DESCRIPTIONS, h as ENTRY_RULES, i as IssueActorKind, l as normalizeCommentAuthorKind, m as KanboToolName, n as CardAttention, o as IssueView, p as KanboToolCliEquivalent, r as CardLastComment, s as IssueWriterProvenance, t as BoardApproval, u as toIssueView, v as EntryRuleFacts, w as serializeEntryRules, x as evaluateEntryRules, y as UNMET_ENTRY_RULE_REASONS } from "./approval-LRZ6ontC.mjs";
1
+ import { a as IssuePullRequest, c as IssueStatus, f as issueFieldChanges, i as IssueMilestone, l as KanbanMeta, n as IssueComment, o as IssueRelation, r as IssueFieldChange, s as IssueRun, t as Issue, v as issues } from "./schema-Cwx3HosC.mjs";
2
+ import { _ as IssueRelationStore, a as BoardLinkedPullRequest, b as IssueStatusStore, c as BoardRunProjectionScope, d as BoardWorkspaceFieldChange, f as IssueCommentStore, g as IssuePullRequestStore, h as IssueMilestoneStore, i as BoardFieldChangeQuery, l as BoardStore, m as IssueFieldChangeStore, n as BoardCardPage, o as BoardMilestoneCardCount, p as IssueContextRefStore, r as BoardCardQuery, s as BoardRunProjection, t as BoardActiveRun, u as BoardTransactionMode, v as IssueRowStore, x as KanbanMetaStore, y as IssueRunStore } from "./board-store-BjhiH9TZ.mjs";
3
+ import { C as readEntryRules, D as FlowRule, E as FLOW_RULES, O as readFlowRules, S as readChecklist, T as ColumnFlowRules, _ as EntryRule, a as IssueActorReference, b as UnmetEntryRule, c as isOutsideWriter, d as KANBO_TOOL_CLI_EQUIVALENTS, f as KANBO_TOOL_NAMES, g as ENTRY_RULE_DESCRIPTIONS, h as ENTRY_RULES, i as IssueActorKind, l as normalizeCommentAuthorKind, m as KanboToolName, n as CardAttention, o as IssueView, p as KanboToolCliEquivalent, r as CardLastComment, s as IssueWriterProvenance, t as BoardApproval, u as toIssueView, v as EntryRuleFacts, w as serializeEntryRules, x as evaluateEntryRules, y as UNMET_ENTRY_RULE_REASONS } from "./approval-CnJJfwfi.mjs";
4
4
  import { z } from "zod";
5
5
  //#region src/cli/output.d.ts
6
6
  /**
@@ -366,7 +366,7 @@ export declare function maskDatabaseUrls(text: string): string;
366
366
  * (`../serve/board-error-responses.ts`), the one table `kanbo serve` and any app
367
367
  * serving the board over HTTP answer with.
368
368
  */
369
- type BoardErrorCode = 'board_approval_requires_user' | 'board_column_name_taken' | 'board_column_not_empty' | 'board_column_ready_protected' | 'board_column_remove_target_invalid' | 'board_column_rules_requires_user' | 'board_column_structure_requires_user' | 'board_column_rules_unmet' | 'board_entry_rule_invalid' | 'board_execution_mode_locked' | 'board_pull_request_invalid' | 'board_pull_request_not_found' | 'board_pull_request_not_yours' | 'board_return_no_previous_column' | 'board_return_requires_user' | 'board_run_already_finished' | 'board_run_not_found' | 'board_run_session_ref_conflict' | 'board_run_session_ref_invalid' | 'board_run_session_ref_requires_user' | 'board_schema_outdated' | 'board_sprint_carry_invalid' | 'board_sprint_close_requires_user' | 'board_sprint_dates_invalid' | 'issue_comment_delete_requires_user' | 'issue_comment_not_found' | 'issue_context_ref_invalid_index' | 'issue_milestone_not_found' | 'issue_not_found' | 'issue_parent_cycle' | 'issue_parent_not_found' | 'issue_parent_self_reference' | 'issue_relation_not_found' | 'issue_relation_self_reference' | 'issue_status_name_empty' | 'issue_status_not_found' | 'issue_status_reference_conflict' | 'issue_workspace_not_found';
369
+ type BoardErrorCode = 'board_approval_requires_user' | 'board_card_not_ready' | 'board_card_run_active' | 'board_column_name_taken' | 'board_column_not_empty' | 'board_column_ready_protected' | 'board_column_remove_target_invalid' | 'board_column_rules_requires_user' | 'board_column_structure_requires_user' | 'board_column_rules_unmet' | 'board_entry_rule_invalid' | 'board_execution_mode_locked' | 'board_flow_rule_invalid' | 'board_metrics_range_invalid' | 'board_nothing_ready' | 'board_pull_request_invalid' | 'board_pull_request_not_found' | 'board_pull_request_not_yours' | 'board_return_no_previous_column' | 'board_return_requires_user' | 'board_run_already_finished' | 'board_run_not_found' | 'board_run_session_ref_conflict' | 'board_run_session_ref_invalid' | 'board_run_session_ref_requires_user' | 'board_schema_outdated' | 'board_sprint_carry_invalid' | 'board_sprint_close_requires_user' | 'board_sprint_dates_invalid' | 'issue_comment_delete_requires_user' | 'issue_comment_not_found' | 'issue_context_ref_invalid_index' | 'issue_milestone_not_found' | 'issue_not_found' | 'issue_parent_cycle' | 'issue_parent_not_found' | 'issue_parent_self_reference' | 'issue_relation_not_found' | 'issue_relation_self_reference' | 'issue_status_name_empty' | 'issue_status_not_found' | 'issue_status_reference_conflict' | 'issue_workspace_not_found';
370
370
  /** A board rule the caller broke, carrying the offending values in `details`. */
371
371
  export declare class BoardError extends Error {
372
372
  readonly code: BoardErrorCode;
@@ -960,6 +960,235 @@ type BoardRunView = IssueRun & {
960
960
  attempt: number;
961
961
  };
962
962
  //#endregion
963
+ //#region src/ops/claim.d.ts
964
+ /** What a claim takes: the board, the card when the claimer names one, and the run it starts. */
965
+ interface ClaimCardInput {
966
+ workspaceId: string;
967
+ /** The card to take; the first ready card in To Do, in board order, when absent. */
968
+ issueId?: string;
969
+ run: StartRunInput;
970
+ }
971
+ /** What a claim did: the card where it now is, the run it started, and the column it moved to. */
972
+ interface ClaimedCard {
973
+ /** Carries `unmetRules` when a person's claim put it in a column whose rules it does not meet. */
974
+ card: BoardCardWrite;
975
+ run: IssueRun;
976
+ column: IssueStatus;
977
+ }
978
+ /** Why a named card is not there to take, most telling first. */
979
+ type CardNotReadyReason = 'run_active' | 'waiting_for_person' | 'not_in_to_do';
980
+ //#endregion
981
+ //#region src/ops/column-entries.d.ts
982
+ /** One card entering one column: a move, or a card created in it (`fromStatusId: null`). */
983
+ interface ColumnEntry {
984
+ changeId: string;
985
+ issueId: string;
986
+ workspaceId: string;
987
+ fromStatusId: string | null;
988
+ toStatusId: string;
989
+ actorKind: IssueFieldChange['actorKind'];
990
+ actorId: string | null;
991
+ /** Unix seconds. */
992
+ at: number;
993
+ }
994
+ /** Which boards to read, from when (unix seconds, inclusive), and where a page may end. */
995
+ interface ListColumnEntriesInput {
996
+ workspaceIds: string[];
997
+ since: number;
998
+ limit?: number;
999
+ }
1000
+ //#endregion
1001
+ //#region src/ops/board-metrics.d.ts
1002
+ /** What the metrics are asked about: the workspaces, the range (unix seconds, both ends included) and, for a sprint, its milestone. */
1003
+ interface BoardMetricsInput {
1004
+ workspaceIds: readonly string[];
1005
+ from: number;
1006
+ to: number;
1007
+ milestoneId?: string | null;
1008
+ }
1009
+ /** Every row the metrics are computed from, as the store lists them — one board's, or several boards' put together. */
1010
+ interface BoardMetricsHistory {
1011
+ statuses: IssueStatus[];
1012
+ milestones: IssueMilestone[];
1013
+ cards: Issue[];
1014
+ /** Every column change of those cards, from the first on. */
1015
+ entries: ColumnEntry[];
1016
+ runs: IssueRun[];
1017
+ /** The approvals of those cards: `system.approved` comments. Returns are read from `entries` (R012-7). */
1018
+ approvals: IssueComment[];
1019
+ }
1020
+ /** A duration over the cards a metric counts, in seconds: nearest-rank percentiles, `null` over no cards. */
1021
+ interface BoardMetricsDurations {
1022
+ cards: number;
1023
+ p50: number | null;
1024
+ p85: number | null;
1025
+ }
1026
+ /** A column as the metrics name it: one per slug across the workspaces, in the first workspace's board order. */
1027
+ interface BoardMetricsColumn {
1028
+ slug: string;
1029
+ name: string;
1030
+ category: IssueStatus['category'];
1031
+ }
1032
+ interface BoardMetricsWeek {
1033
+ /** ISO 8601 week, `2026-W02`. */
1034
+ week: string;
1035
+ /** Monday 00:00 UTC of the week, unix seconds. */
1036
+ start: number;
1037
+ finished: number;
1038
+ }
1039
+ interface BoardMetricsWip {
1040
+ slug: string;
1041
+ cards: number;
1042
+ /** The most cards the column may hold: the workspaces' limits added up when each has one, `null` for no limit. */
1043
+ limit: number | null;
1044
+ }
1045
+ interface BoardMetricsCard {
1046
+ issueId: string;
1047
+ workspaceId: string;
1048
+ title: string;
1049
+ }
1050
+ interface BoardMetricsAgingCard extends BoardMetricsCard {
1051
+ /** The column the card is in now. */
1052
+ slug: string;
1053
+ startedAt: number;
1054
+ ageSeconds: number;
1055
+ inColumnSeconds: number;
1056
+ /** Older than the range's cycle-time p85. */
1057
+ overCycleP85: boolean;
1058
+ }
1059
+ interface BoardMetricsFinishedCard extends BoardMetricsCard {
1060
+ /** `null` for a card that never entered a started column. */
1061
+ startedAt: number | null;
1062
+ finishedAt: number;
1063
+ cycleSeconds: number | null;
1064
+ leadSeconds: number;
1065
+ returns: number;
1066
+ runs: number;
1067
+ }
1068
+ interface BoardMetricsColumnTime {
1069
+ slug: string;
1070
+ seconds: number;
1071
+ }
1072
+ interface BoardMetricsFlowDay {
1073
+ /** The UTC day, `2026-01-05`. */
1074
+ day: string;
1075
+ /** When the day is read: its last second, or the end of the range on its last day. */
1076
+ at: number;
1077
+ /** Cards per column slug at `at`; every column is present. */
1078
+ cards: Record<string, number>;
1079
+ }
1080
+ interface BoardMetricsAgent {
1081
+ /** `agentId` when its runs carry one, else `agentName` (`boardMetricsAgentKey`). */
1082
+ key: string;
1083
+ agentId: string | null;
1084
+ /** The name its newest run was started under. */
1085
+ agentName: string;
1086
+ /** Its runs started in the range. */
1087
+ runs: {
1088
+ total: number;
1089
+ finished: number;
1090
+ failed: number;
1091
+ stopped: number;
1092
+ running: number;
1093
+ };
1094
+ /** Median length of those that ended (nearest rank), seconds; `null` when none ended. */
1095
+ medianRunSeconds: number | null;
1096
+ /** Cards finished in the range that it ran at least once. */
1097
+ cardsFinished: number;
1098
+ /** The share of those cards returned at least once; `null` when there are none. */
1099
+ returnRate: number | null;
1100
+ }
1101
+ /**
1102
+ * Moves back over the cards finished in the range (R012-7): a move to an
1103
+ * earlier column of the same board whose category is unstarted or started, by
1104
+ * anyone.
1105
+ */
1106
+ interface BoardMetricsReturns {
1107
+ total: number;
1108
+ perFinishedCard: number | null;
1109
+ /** Finished cards with zero returns ÷ finished cards. */
1110
+ firstPassRate: number | null;
1111
+ /** The same returns by who made them: a person, an agent (a provider target counts as one), or an outside writer (`system`). */
1112
+ byActorKind: {
1113
+ user: number;
1114
+ agent: number;
1115
+ external: number;
1116
+ };
1117
+ }
1118
+ interface BoardMetricsPerson {
1119
+ /** The person's actor id; `null` for one who gave none. */
1120
+ id: string | null;
1121
+ created: number;
1122
+ approvals: number;
1123
+ returns: number;
1124
+ /** Column changes they made; creating a card is not one. */
1125
+ moves: number;
1126
+ }
1127
+ /**
1128
+ * How work flows on a board over a range (spec 2026-11-05, Part 4).
1129
+ *
1130
+ * Started is the first entry into a `started` column; finished is the latest
1131
+ * entry into a `completed` column, for a card still in one; cycle time is
1132
+ * finished − started and lead time finished − created, both as nearest-rank
1133
+ * p50 and p85. Cards in a `canceled` column are counted in `canceled` and left
1134
+ * out of everything else.
1135
+ */
1136
+ interface BoardMetrics {
1137
+ /** The range read; `to` is cut at now, so a range starting after now has `from` after `to` and empty series. */
1138
+ range: {
1139
+ from: number;
1140
+ to: number;
1141
+ };
1142
+ now: number;
1143
+ milestoneId: string | null;
1144
+ columns: BoardMetricsColumn[];
1145
+ cycleTime: BoardMetricsDurations;
1146
+ leadTime: BoardMetricsDurations;
1147
+ /** Cards finished per ISO week, every week the range touches. */
1148
+ throughput: BoardMetricsWeek[];
1149
+ /** Cards in each `started` column now. */
1150
+ wip: BoardMetricsWip[];
1151
+ /** The cards in `started` columns now, oldest first. */
1152
+ aging: BoardMetricsAgingCard[];
1153
+ /** Seconds the cards finished in the range spent in each column before they finished. */
1154
+ timeInColumn: BoardMetricsColumnTime[];
1155
+ /** Cards per column at the end of each UTC day of the range. */
1156
+ cumulativeFlow: BoardMetricsFlowDay[];
1157
+ /** The cards finished in the range, in the order they finished. */
1158
+ finished: BoardMetricsFinishedCard[];
1159
+ returns: BoardMetricsReturns;
1160
+ attempts: {
1161
+ runs: number;
1162
+ perFinishedCard: number | null;
1163
+ };
1164
+ canceled: number;
1165
+ agents: BoardMetricsAgent[];
1166
+ people: BoardMetricsPerson[];
1167
+ }
1168
+ /**
1169
+ * The value at `percent` of `values` by nearest rank (ruling R012-2): the
1170
+ * ⌈percent·n/100⌉-th in ascending order. Always a value that occurred; `null`
1171
+ * for none.
1172
+ */
1173
+ export declare function nearestRank(values: readonly number[], percent: number): number | null;
1174
+ /** Who a run counts under in the agent rows: the host's agent id when the run names one, else the name it was started under. */
1175
+ export declare function boardMetricsAgentKey(run: Pick<IssueRun, 'agentId' | 'agentName'>): string;
1176
+ /**
1177
+ * The runs of the counted cards, and apart those of the cards in a canceled
1178
+ * column (R012-6): what a host prices to put a cost beside the metrics, and the
1179
+ * spend on canceled work on a line of its own.
1180
+ */
1181
+ export declare function boardMetricsRuns(history: BoardMetricsHistory, input: BoardMetricsInput): {
1182
+ counted: IssueRun[];
1183
+ canceled: IssueRun[];
1184
+ };
1185
+ /**
1186
+ * The metrics of `input` over rows already read. Pure: the same rows give the
1187
+ * same answer in any order, so a host may put several boards' rows together
1188
+ * and compute once — percentiles of parts do not add up to the whole's.
1189
+ */
1190
+ export declare function computeBoardMetrics(history: BoardMetricsHistory, input: BoardMetricsInput, now: number): BoardMetrics;
1191
+ //#endregion
963
1192
  //#region src/ops/activity.d.ts
964
1193
  /**
965
1194
  * What the host knows and the board does not: the names of its workspaces, who
@@ -1231,6 +1460,7 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1231
1460
  assertReturnable: (issueId: string, input: {
1232
1461
  toStatusName?: string | null;
1233
1462
  }, actor: BoardActor) => Promise<{
1463
+ allowedFrom: string | null;
1234
1464
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1235
1465
  color: string | null;
1236
1466
  createdAt: number;
@@ -1239,6 +1469,7 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1239
1469
  id: string;
1240
1470
  name: string;
1241
1471
  order: number;
1472
+ wipLimit: number | null;
1242
1473
  workspaceId: string;
1243
1474
  }>;
1244
1475
  readApproval: (issueId: string) => Promise<BoardApproval>;
@@ -1317,6 +1548,7 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1317
1548
  carryTo?: string | null;
1318
1549
  }, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<CloseSprintResult>;
1319
1550
  listColumns: (workspaceId: string) => Promise<{
1551
+ allowedFrom: string | null;
1320
1552
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1321
1553
  color: string | null;
1322
1554
  createdAt: number;
@@ -1325,9 +1557,11 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1325
1557
  id: string;
1326
1558
  name: string;
1327
1559
  order: number;
1560
+ wipLimit: number | null;
1328
1561
  workspaceId: string;
1329
1562
  }[]>;
1330
1563
  findColumn: (workspaceId: string, nameOrId: string) => Promise<{
1564
+ allowedFrom: string | null;
1331
1565
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1332
1566
  color: string | null;
1333
1567
  createdAt: number;
@@ -1336,9 +1570,11 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1336
1570
  id: string;
1337
1571
  name: string;
1338
1572
  order: number;
1573
+ wipLimit: number | null;
1339
1574
  workspaceId: string;
1340
1575
  } | null>;
1341
1576
  requireColumn: (workspaceId: string, nameOrId: string) => Promise<{
1577
+ allowedFrom: string | null;
1342
1578
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1343
1579
  color: string | null;
1344
1580
  createdAt: number;
@@ -1347,9 +1583,11 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1347
1583
  id: string;
1348
1584
  name: string;
1349
1585
  order: number;
1586
+ wipLimit: number | null;
1350
1587
  workspaceId: string;
1351
1588
  }>;
1352
1589
  ensureDefaultColumns: (workspaceId: string, scope?: BoardWriteScope<TStore>) => Promise<{
1590
+ allowedFrom: string | null;
1353
1591
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1354
1592
  color: string | null;
1355
1593
  createdAt: number;
@@ -1358,9 +1596,11 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1358
1596
  id: string;
1359
1597
  name: string;
1360
1598
  order: number;
1599
+ wipLimit: number | null;
1361
1600
  workspaceId: string;
1362
1601
  }[]>;
1363
1602
  createColumn: (input: BoardColumnInput, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<{
1603
+ allowedFrom: string | null;
1364
1604
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1365
1605
  color: string | null;
1366
1606
  createdAt: number;
@@ -1369,9 +1609,11 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1369
1609
  id: string;
1370
1610
  name: string;
1371
1611
  order: number;
1612
+ wipLimit: number | null;
1372
1613
  workspaceId: string;
1373
1614
  }>;
1374
1615
  updateColumn: (statusId: string, patch: BoardColumnPatch, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<{
1616
+ allowedFrom: string | null;
1375
1617
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1376
1618
  color: string | null;
1377
1619
  createdAt: number;
@@ -1380,9 +1622,11 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1380
1622
  id: string;
1381
1623
  name: string;
1382
1624
  order: number;
1625
+ wipLimit: number | null;
1383
1626
  workspaceId: string;
1384
1627
  }>;
1385
1628
  describeColumn: (workspaceId: string, nameOrId: string, description: string | null, scope?: BoardWriteScope<TStore>) => Promise<{
1629
+ allowedFrom: string | null;
1386
1630
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1387
1631
  color: string | null;
1388
1632
  createdAt: number;
@@ -1391,9 +1635,24 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1391
1635
  id: string;
1392
1636
  name: string;
1393
1637
  order: number;
1638
+ wipLimit: number | null;
1394
1639
  workspaceId: string;
1395
1640
  }>;
1396
1641
  setColumnEntryRules: (workspaceId: string, nameOrId: string, entryRules: readonly string[] | null, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<{
1642
+ allowedFrom: string | null;
1643
+ category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1644
+ color: string | null;
1645
+ createdAt: number;
1646
+ description: string | null;
1647
+ entryRules: string | null;
1648
+ id: string;
1649
+ name: string;
1650
+ order: number;
1651
+ wipLimit: number | null;
1652
+ workspaceId: string;
1653
+ }>;
1654
+ setColumnFlowRules: (columnId: string, rules: ColumnFlowRules, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<{
1655
+ allowedFrom: string | null;
1397
1656
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1398
1657
  color: string | null;
1399
1658
  createdAt: number;
@@ -1402,8 +1661,22 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1402
1661
  id: string;
1403
1662
  name: string;
1404
1663
  order: number;
1664
+ wipLimit: number | null;
1405
1665
  workspaceId: string;
1406
1666
  }>;
1667
+ applyStandardFlow: (workspaceId: string, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<{
1668
+ allowedFrom: string | null;
1669
+ category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1670
+ color: string | null;
1671
+ createdAt: number;
1672
+ description: string | null;
1673
+ entryRules: string | null;
1674
+ id: string;
1675
+ name: string;
1676
+ order: number;
1677
+ wipLimit: number | null;
1678
+ workspaceId: string;
1679
+ }[]>;
1407
1680
  enforceColumnEntryForCards: (issueIds: string[], statusId: string, actor: BoardActor) => Promise<{
1408
1681
  issueId: string;
1409
1682
  unmet: UnmetEntryRule[];
@@ -1415,6 +1688,7 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1415
1688
  added: string[];
1416
1689
  }>;
1417
1690
  addColumn: (workspaceId: string, input: AddColumnInput, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<{
1691
+ allowedFrom: string | null;
1418
1692
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1419
1693
  color: string | null;
1420
1694
  createdAt: number;
@@ -1423,6 +1697,7 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1423
1697
  id: string;
1424
1698
  name: string;
1425
1699
  order: number;
1700
+ wipLimit: number | null;
1426
1701
  workspaceId: string;
1427
1702
  }>;
1428
1703
  applyColumnTemplate: (workspaceId: string, columns: readonly ColumnSpec[], options: ApplyColumnTemplateOptions, scope?: BoardWriteScope<TStore>) => Promise<{
@@ -1430,6 +1705,7 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1430
1705
  added: string[];
1431
1706
  }>;
1432
1707
  renameColumn: (workspaceId: string, nameOrId: string, newName: string, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<{
1708
+ allowedFrom: string | null;
1433
1709
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1434
1710
  color: string | null;
1435
1711
  createdAt: number;
@@ -1438,9 +1714,11 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1438
1714
  id: string;
1439
1715
  name: string;
1440
1716
  order: number;
1717
+ wipLimit: number | null;
1441
1718
  workspaceId: string;
1442
1719
  }>;
1443
1720
  moveColumn: (workspaceId: string, nameOrId: string, position: ColumnPosition, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<{
1721
+ allowedFrom: string | null;
1444
1722
  category: "backlog" | "canceled" | "completed" | "started" | "triage" | "unstarted";
1445
1723
  color: string | null;
1446
1724
  createdAt: number;
@@ -1449,6 +1727,7 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1449
1727
  id: string;
1450
1728
  name: string;
1451
1729
  order: number;
1730
+ wipLimit: number | null;
1452
1731
  workspaceId: string;
1453
1732
  }[]>;
1454
1733
  removeColumn: (workspaceId: string, nameOrId: string, options: RemoveColumnOptions, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<RemoveColumnResult>;
@@ -1469,6 +1748,7 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1469
1748
  state: "failed" | "finished" | "running" | "stopped";
1470
1749
  worktreePath: string | null;
1471
1750
  }>;
1751
+ claimCard: (input: ClaimCardInput, actor: BoardActor, scope?: BoardWriteScope<TStore>) => Promise<ClaimedCard>;
1472
1752
  attachRunExecution: (runId: string, input: AttachRunExecutionInput, scope?: BoardWriteScope<TStore>) => Promise<{
1473
1753
  agentId: string | null;
1474
1754
  agentName: string;
@@ -1596,11 +1876,27 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1596
1876
  limit?: number;
1597
1877
  offset?: number;
1598
1878
  }) => Promise<CardQueryResult>;
1879
+ listColumnEntries: (input: ListColumnEntriesInput) => Promise<ColumnEntry[]>;
1599
1880
  buildPrimeText: (workspaceId: string) => Promise<string>;
1881
+ readBoardMetricsHistory: (workspaceIds: readonly string[]) => Promise<BoardMetricsHistory>;
1882
+ boardMetrics: (input: BoardMetricsInput, now?: number) => Promise<BoardMetrics>;
1600
1883
  };
1601
1884
  /** The board's operations, as a type callers can name. */
1602
1885
  type BoardOps = ReturnType<typeof createBoardOps<BoardStore>>;
1603
1886
  //#endregion
1887
+ //#region src/domain/iso-week.d.ts
1888
+ /** An ISO 8601 week: its label and the Monday 00:00 UTC it starts at. */
1889
+ interface IsoWeek {
1890
+ /** `2026-W02`: the ISO year, which around 1 January is not always the calendar year. */
1891
+ week: string;
1892
+ /** Monday 00:00 UTC, in unix seconds. */
1893
+ start: number;
1894
+ }
1895
+ /** The ISO week a moment falls in, read in UTC like every board date (ruling 5x-6). */
1896
+ export declare function isoWeekOf(seconds: number): IsoWeek;
1897
+ /** The UTC day a moment falls on, as `2026-01-05`. */
1898
+ export declare function utcDayLabel(seconds: number): string;
1899
+ //#endregion
1604
1900
  //#region src/serve/board-error-responses.d.ts
1605
1901
  /** What one board failure is over HTTP: the status, the sentence, and the code a client matches on when it is renamed. */
1606
1902
  interface BoardErrorResponse {
@@ -1622,7 +1918,7 @@ interface BoardErrorResponse {
1622
1918
  * answering for a person — approving a card, sending it back or closing a
1623
1919
  * sprint — as anyone but one is 403, dropping a pull request link somebody else made is the same 403
1624
1920
  * for the same reason, and acting on a run that has already ended is 409,
1625
- * because the answer would have been yes a moment earlier. An agent putting a
1921
+ * because the answer would have been yes a moment earlier. Starting a run on a card that has one going, and claiming a card nobody can take right now, are 409 for the same reason. An agent putting a
1626
1922
  * card in a column whose entry rules it does not meet yet is 409 for the same
1627
1923
  * reason turned around: the answer will be yes once the card meets them, and
1628
1924
  * `details.unmet` says what is missing. Deleting a column that still holds
@@ -1636,4 +1932,4 @@ interface BoardErrorResponse {
1636
1932
  */
1637
1933
  export declare const BOARD_ERROR_RESPONSES: Record<BoardErrorCode, BoardErrorResponse>;
1638
1934
  //#endregion
1639
- export { type AddColumnInput, type AddCommentInput, type ApplyColumnTemplateOptions, type AttachRunExecutionInput, type BoardActiveRun, type BoardActor, type BoardApproval, type BoardCardPage, type BoardCardQuery, type BoardCardWrite, type BoardColumnInput, type BoardColumnPatch, type BoardErrorCode, type BoardErrorResponse, type BoardLinkedPullRequest, type BoardMilestoneCardCount, type BoardOps, type BoardPullRequestStanding, type BoardRunProjection, type BoardRunProjectionScope, type BoardRunView, type BoardSprint, type BoardStore, type BoardTransactionMode, type BoardWorkspaceIdentity, type BoardWriteScope, type BulkUpdateCardsInput, type BulkUpdateCardsResult, type CardAttention, type CardLastComment, type CardQueryInput, type CardQueryResult, type CloseSprintResult, type ColumnPosition, type ColumnSpec, type ColumnTemplateId, type CreateCardInput, type CreateCommentOnceInput, type CreateMilestoneInput, type CreateRelationInput, ENTRY_RULES, ENTRY_RULE_DESCRIPTIONS, type EntryRule, type EntryRuleFacts, type ExternalSessionRef, type FinishRunInput, type Issue, type IssueActivityAction, type IssueActivityCommentView, type IssueActivityField, type IssueActivityFieldChangeView, type IssueActivityItemView, type IssueActivityLookup, type IssueActivityResolver, type IssueActivityValueToken, type IssueActivityValueView, type IssueActorKind, type IssueActorReference, type IssueComment, type IssueCommentAuthorView, type IssueCommentStore, type IssueContextRefStore, type IssueFieldChange, type IssueFieldChangeStore, type IssueMilestone, type IssueMilestoneStore, type IssueMutationActor, type IssuePullRequest, type IssuePullRequestStore, type IssueRelation, type IssueRelationCounterpart, type IssueRelationStore, type IssueRelationView, type IssueRowStore, type IssueRun, type IssueRunStore, type IssueStatus, type IssueStatusStore, type IssueView, KANBO_TOOL_CLI_EQUIVALENTS, KANBO_TOOL_NAMES, type KanbanMeta, type KanbanMetaStore, type KanboBinding, type KanboCapabilities, type KanboCapabilitiesPackage, type KanboCapabilitiesRoles, type KanboCapabilityCommand, type KanboCapabilityCommandArgument, type KanboCapabilityCommandOption, type KanboCapabilityEntryRule, type KanboCapabilityStorage, type KanboCapabilityTool, type KanboToolCliEquivalent, type KanboToolName, type MigrateCardsInput, type MigrateCardsResult, type PullRequestFactKeys, type RemoveColumnOptions, type RemoveColumnResult, type StartRunInput, UNMET_ENTRY_RULE_REASONS, type UnmetEntryRule, type UpdateCardInput, type UpdateMilestoneInput, evaluateEntryRules, isOutsideWriter, normalizeCommentAuthorKind, readChecklist, readEntryRules, serializeEntryRules, toIssueView };
1935
+ export { type AddColumnInput, type AddCommentInput, type ApplyColumnTemplateOptions, type AttachRunExecutionInput, type BoardActiveRun, type BoardActor, type BoardApproval, type BoardCardPage, type BoardCardQuery, type BoardCardWrite, type BoardColumnInput, type BoardColumnPatch, type BoardErrorCode, type BoardErrorResponse, type BoardFieldChangeQuery, type BoardLinkedPullRequest, type BoardMetrics, type BoardMetricsAgent, type BoardMetricsAgingCard, type BoardMetricsCard, type BoardMetricsColumn, type BoardMetricsColumnTime, type BoardMetricsDurations, type BoardMetricsFinishedCard, type BoardMetricsFlowDay, type BoardMetricsHistory, type BoardMetricsInput, type BoardMetricsPerson, type BoardMetricsReturns, type BoardMetricsWeek, type BoardMetricsWip, type BoardMilestoneCardCount, type BoardOps, type BoardPullRequestStanding, type BoardRunProjection, type BoardRunProjectionScope, type BoardRunView, type BoardSprint, type BoardStore, type BoardTransactionMode, type BoardWorkspaceFieldChange, type BoardWorkspaceIdentity, type BoardWriteScope, type BulkUpdateCardsInput, type BulkUpdateCardsResult, type CardAttention, type CardLastComment, type CardNotReadyReason, type CardQueryInput, type CardQueryResult, type ClaimCardInput, type ClaimedCard, type CloseSprintResult, type ColumnEntry, type ColumnFlowRules, type ColumnPosition, type ColumnSpec, type ColumnTemplateId, type CreateCardInput, type CreateCommentOnceInput, type CreateMilestoneInput, type CreateRelationInput, ENTRY_RULES, ENTRY_RULE_DESCRIPTIONS, type EntryRule, type EntryRuleFacts, type ExternalSessionRef, FLOW_RULES, type FinishRunInput, type FlowRule, type IsoWeek, type Issue, type IssueActivityAction, type IssueActivityCommentView, type IssueActivityField, type IssueActivityFieldChangeView, type IssueActivityItemView, type IssueActivityLookup, type IssueActivityResolver, type IssueActivityValueToken, type IssueActivityValueView, type IssueActorKind, type IssueActorReference, type IssueComment, type IssueCommentAuthorView, type IssueCommentStore, type IssueContextRefStore, type IssueFieldChange, type IssueFieldChangeStore, type IssueMilestone, type IssueMilestoneStore, type IssueMutationActor, type IssuePullRequest, type IssuePullRequestStore, type IssueRelation, type IssueRelationCounterpart, type IssueRelationStore, type IssueRelationView, type IssueRowStore, type IssueRun, type IssueRunStore, type IssueStatus, type IssueStatusStore, type IssueView, KANBO_TOOL_CLI_EQUIVALENTS, KANBO_TOOL_NAMES, type KanbanMeta, type KanbanMetaStore, type KanboBinding, type KanboCapabilities, type KanboCapabilitiesPackage, type KanboCapabilitiesRoles, type KanboCapabilityCommand, type KanboCapabilityCommandArgument, type KanboCapabilityCommandOption, type KanboCapabilityEntryRule, type KanboCapabilityStorage, type KanboCapabilityTool, type KanboToolCliEquivalent, type KanboToolName, type ListColumnEntriesInput, type MigrateCardsInput, type MigrateCardsResult, type PullRequestFactKeys, type RemoveColumnOptions, type RemoveColumnResult, type StartRunInput, UNMET_ENTRY_RULE_REASONS, type UnmetEntryRule, type UpdateCardInput, type UpdateMilestoneInput, evaluateEntryRules, isOutsideWriter, normalizeCommentAuthorKind, readChecklist, readEntryRules, readFlowRules, serializeEntryRules, toIssueView };
@@ -1,3 +1,3 @@
1
- import { $ as COLUMN_TEMPLATES, B as createBoardOps, Ct as nextIssueIdentity, Et as readIssuePrefix, F as BINDING_FILE_PATH, G as ENTRY_RULES, H as formatExternalSessionRef, I as ignoreBoardFile, J as evaluateEntryRules, K as ENTRY_RULE_DESCRIPTIONS, L as readBinding, M as renderCapabilitiesMarkdown, N as maskDatabaseUrl, P as maskDatabaseUrls, Q as COLUMN_CATALOGUE, R as readProjectBinding, St as formatIssueId, Tt as nextIssueOrder, U as parseExternalSessionRef, V as cardDisplayTitle, W as pullRequestFactKeys, X as readEntryRules, Y as readChecklist, Z as serializeEntryRules, _ as suggestCardKey, _t as parseActivityStringArray, a as BOARD_ERROR_RESPONSES, at as TRACKED_FIELDS, bt as normalizeCommentAuthorKind, ct as BOARD_ACTOR, dt as activityText, et as COLUMN_TEMPLATE_IDS, ft as activityToken, g as isValidCardKey, gt as isEmptyActivityValue, h as CARD_KEY_PATTERN, ht as formatPlainActivityValue, i as KANBO_TOOL_NAMES, it as normalizeStatusName, lt as currentUnixSeconds, mt as formatActivityIssueReference, n as buildCapabilitiesManifest, nt as runBoardWrite, ot as diffFieldChanges, pt as commentAuthorReference, q as UNMET_ENTRY_RULE_REASONS, r as KANBO_TOOL_CLI_EQUIVALENTS, rt as DEFAULT_STATUSES, t as CAPABILITIES_MANIFEST_VERSION, tt as readChangeSeq, ut as activityKindOrder, v as DEFAULT_BOARD_FILE_PATH, vt as readSystemCommentKind, wt as nextIssueNumber, xt as toIssueView, yt as isOutsideWriter, z as writeBinding } from "./manifest-Dmo6IlWk.mjs";
1
+ import { $ as COLUMN_TEMPLATE_IDS, At as formatIssueId, B as createBoardOps, Ct as formatPlainActivityValue, Dt as isOutsideWriter, Et as readSystemCommentKind, F as BINDING_FILE_PATH, G as ENTRY_RULE_DESCRIPTIONS, H as parseExternalSessionRef, I as ignoreBoardFile, J as readChecklist, K as UNMET_ENTRY_RULE_REASONS, L as readBinding, M as renderCapabilitiesMarkdown, Mt as nextIssueNumber, N as maskDatabaseUrl, Nt as nextIssueOrder, Ot as normalizeCommentAuthorKind, P as maskDatabaseUrls, Pt as readIssuePrefix, Q as COLUMN_TEMPLATES, R as readProjectBinding, St as formatActivityIssueReference, Tt as parseActivityStringArray, U as pullRequestFactKeys, V as formatExternalSessionRef, W as ENTRY_RULES, X as serializeEntryRules, Y as readEntryRules, Z as COLUMN_CATALOGUE, _ as suggestCardKey, _t as currentUnixSeconds, a as BOARD_ERROR_RESPONSES, at as boardMetricsRuns, bt as activityToken, ct as isoWeekOf, dt as readFlowRules, et as readChangeSeq, ft as DEFAULT_STATUSES, g as isValidCardKey, gt as BOARD_ACTOR, h as CARD_KEY_PATTERN, i as KANBO_TOOL_NAMES, it as boardMetricsAgentKey, jt as nextIssueIdentity, kt as toIssueView, lt as utcDayLabel, mt as cardDisplayTitle, n as buildCapabilitiesManifest, nt as TRACKED_FIELDS, ot as computeBoardMetrics, pt as normalizeStatusName, q as evaluateEntryRules, r as KANBO_TOOL_CLI_EQUIVALENTS, rt as diffFieldChanges, st as nearestRank, t as CAPABILITIES_MANIFEST_VERSION, tt as runBoardWrite, ut as FLOW_RULES, v as DEFAULT_BOARD_FILE_PATH, vt as activityKindOrder, wt as isEmptyActivityValue, xt as commentAuthorReference, yt as activityText, z as writeBinding } from "./manifest-DHI1fkoW.mjs";
2
2
  import { a as BoardError } from "./migrations-path-ClaYRNwk.mjs";
3
- export { BINDING_FILE_PATH, BOARD_ACTOR, BOARD_ERROR_RESPONSES, BoardError, CAPABILITIES_MANIFEST_VERSION, CARD_KEY_PATTERN, COLUMN_CATALOGUE, COLUMN_TEMPLATES, COLUMN_TEMPLATE_IDS, DEFAULT_BOARD_FILE_PATH, DEFAULT_STATUSES, ENTRY_RULES, ENTRY_RULE_DESCRIPTIONS, KANBO_TOOL_CLI_EQUIVALENTS, KANBO_TOOL_NAMES, TRACKED_FIELDS, UNMET_ENTRY_RULE_REASONS, activityKindOrder, activityText, activityToken, buildCapabilitiesManifest, cardDisplayTitle, commentAuthorReference, createBoardOps, currentUnixSeconds, diffFieldChanges, evaluateEntryRules, formatActivityIssueReference, formatExternalSessionRef, formatIssueId, formatPlainActivityValue, ignoreBoardFile, isEmptyActivityValue, isOutsideWriter, isValidCardKey, maskDatabaseUrl, maskDatabaseUrls, nextIssueIdentity, nextIssueNumber, nextIssueOrder, normalizeCommentAuthorKind, normalizeStatusName, parseActivityStringArray, parseExternalSessionRef, pullRequestFactKeys, readBinding, readChangeSeq, readChecklist, readEntryRules, readIssuePrefix, readProjectBinding, readSystemCommentKind, renderCapabilitiesMarkdown, runBoardWrite, serializeEntryRules, suggestCardKey, toIssueView, writeBinding };
3
+ export { BINDING_FILE_PATH, BOARD_ACTOR, BOARD_ERROR_RESPONSES, BoardError, CAPABILITIES_MANIFEST_VERSION, CARD_KEY_PATTERN, COLUMN_CATALOGUE, COLUMN_TEMPLATES, COLUMN_TEMPLATE_IDS, DEFAULT_BOARD_FILE_PATH, DEFAULT_STATUSES, ENTRY_RULES, ENTRY_RULE_DESCRIPTIONS, FLOW_RULES, KANBO_TOOL_CLI_EQUIVALENTS, KANBO_TOOL_NAMES, TRACKED_FIELDS, UNMET_ENTRY_RULE_REASONS, activityKindOrder, activityText, activityToken, boardMetricsAgentKey, boardMetricsRuns, buildCapabilitiesManifest, cardDisplayTitle, commentAuthorReference, computeBoardMetrics, createBoardOps, currentUnixSeconds, diffFieldChanges, evaluateEntryRules, formatActivityIssueReference, formatExternalSessionRef, formatIssueId, formatPlainActivityValue, ignoreBoardFile, isEmptyActivityValue, isOutsideWriter, isValidCardKey, isoWeekOf, maskDatabaseUrl, maskDatabaseUrls, nearestRank, nextIssueIdentity, nextIssueNumber, nextIssueOrder, normalizeCommentAuthorKind, normalizeStatusName, parseActivityStringArray, parseExternalSessionRef, pullRequestFactKeys, readBinding, readChangeSeq, readChecklist, readEntryRules, readFlowRules, readIssuePrefix, readProjectBinding, readSystemCommentKind, renderCapabilitiesMarkdown, runBoardWrite, serializeEntryRules, suggestCardKey, toIssueView, utcDayLabel, writeBinding };