kanbo-cli 0.5.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.
@@ -162,6 +162,12 @@ interface IssueCommentStore {
162
162
  * is absent. "Latest" is the order `listByIssue` lists them in, its last.
163
163
  */
164
164
  listLatestByIssues: (issueIds: readonly string[], authorKinds?: readonly IssueComment['authorKind'][]) => Promise<IssueComment[]>;
165
+ /**
166
+ * The comments of these kinds on the cards of these workspaces, oldest first
167
+ * (insertion order within one second), in one statement — what the board's
168
+ * metrics read for every approval. An empty list of either reads nothing.
169
+ */
170
+ listByWorkspaces: (workspaceIds: readonly string[], authorKinds: readonly IssueComment['authorKind'][]) => Promise<IssueComment[]>;
165
171
  findById: (commentId: string) => Promise<IssueComment | null>;
166
172
  /**
167
173
  * The comment on that issue carrying `dedupeKey`, or `null` — one read of the
@@ -206,6 +212,12 @@ interface IssueRunStore {
206
212
  * nothing about, and is still going for all the board can tell.
207
213
  */
208
214
  listRunningWithSession: () => Promise<IssueRun[]>;
215
+ /**
216
+ * Every run of the cards of these workspaces, oldest first (insertion order
217
+ * within one second), in one statement — what the board's metrics read. An
218
+ * empty list reads nothing.
219
+ */
220
+ listByWorkspaces: (workspaceIds: readonly string[]) => Promise<IssueRun[]>;
209
221
  findById: (runId: string) => Promise<IssueRun | null>;
210
222
  /** The newest run driving that chat session, across every issue. */
211
223
  findByChatSessionId: (chatSessionId: string) => Promise<IssueRun | null>;
@@ -162,6 +162,12 @@ interface IssueCommentStore {
162
162
  * is absent. "Latest" is the order `listByIssue` lists them in, its last.
163
163
  */
164
164
  listLatestByIssues: (issueIds: readonly string[], authorKinds?: readonly IssueComment['authorKind'][]) => Promise<IssueComment[]>;
165
+ /**
166
+ * The comments of these kinds on the cards of these workspaces, oldest first
167
+ * (insertion order within one second), in one statement — what the board's
168
+ * metrics read for every approval. An empty list of either reads nothing.
169
+ */
170
+ listByWorkspaces: (workspaceIds: readonly string[], authorKinds: readonly IssueComment['authorKind'][]) => Promise<IssueComment[]>;
165
171
  findById: (commentId: string) => Promise<IssueComment | null>;
166
172
  /**
167
173
  * The comment on that issue carrying `dedupeKey`, or `null` — one read of the
@@ -206,6 +212,12 @@ interface IssueRunStore {
206
212
  * nothing about, and is still going for all the board can tell.
207
213
  */
208
214
  listRunningWithSession: () => Promise<IssueRun[]>;
215
+ /**
216
+ * Every run of the cards of these workspaces, oldest first (insertion order
217
+ * within one second), in one statement — what the board's metrics read. An
218
+ * empty list reads nothing.
219
+ */
220
+ listByWorkspaces: (workspaceIds: readonly string[]) => Promise<IssueRun[]>;
209
221
  findById: (runId: string) => Promise<IssueRun | null>;
210
222
  /** The newest run driving that chat session, across every issue. */
211
223
  findByChatSessionId: (chatSessionId: string) => Promise<IssueRun | null>;
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_manifest = require("./manifest-DUGRyC7A.cjs");
2
+ const require_manifest = require("./manifest-BFI4HGPh.cjs");
3
3
  const require_migrations_path = require("./migrations-path-DBCE17dT.cjs");
4
4
  exports.BINDING_FILE_PATH = require_manifest.BINDING_FILE_PATH;
5
5
  exports.BOARD_ACTOR = require_manifest.BOARD_ACTOR;
@@ -22,9 +22,12 @@ exports.UNMET_ENTRY_RULE_REASONS = require_manifest.UNMET_ENTRY_RULE_REASONS;
22
22
  exports.activityKindOrder = require_manifest.activityKindOrder;
23
23
  exports.activityText = require_manifest.activityText;
24
24
  exports.activityToken = require_manifest.activityToken;
25
+ exports.boardMetricsAgentKey = require_manifest.boardMetricsAgentKey;
26
+ exports.boardMetricsRuns = require_manifest.boardMetricsRuns;
25
27
  exports.buildCapabilitiesManifest = require_manifest.buildCapabilitiesManifest;
26
28
  exports.cardDisplayTitle = require_manifest.cardDisplayTitle;
27
29
  exports.commentAuthorReference = require_manifest.commentAuthorReference;
30
+ exports.computeBoardMetrics = require_manifest.computeBoardMetrics;
28
31
  exports.createBoardOps = require_manifest.createBoardOps;
29
32
  exports.currentUnixSeconds = require_manifest.currentUnixSeconds;
30
33
  exports.diffFieldChanges = require_manifest.diffFieldChanges;
@@ -37,8 +40,10 @@ exports.ignoreBoardFile = require_manifest.ignoreBoardFile;
37
40
  exports.isEmptyActivityValue = require_manifest.isEmptyActivityValue;
38
41
  exports.isOutsideWriter = require_manifest.isOutsideWriter;
39
42
  exports.isValidCardKey = require_manifest.isValidCardKey;
43
+ exports.isoWeekOf = require_manifest.isoWeekOf;
40
44
  exports.maskDatabaseUrl = require_manifest.maskDatabaseUrl;
41
45
  exports.maskDatabaseUrls = require_manifest.maskDatabaseUrls;
46
+ exports.nearestRank = require_manifest.nearestRank;
42
47
  exports.nextIssueIdentity = require_manifest.nextIssueIdentity;
43
48
  exports.nextIssueNumber = require_manifest.nextIssueNumber;
44
49
  exports.nextIssueOrder = require_manifest.nextIssueOrder;
@@ -60,4 +65,5 @@ exports.runBoardWrite = require_manifest.runBoardWrite;
60
65
  exports.serializeEntryRules = require_manifest.serializeEntryRules;
61
66
  exports.suggestCardKey = require_manifest.suggestCardKey;
62
67
  exports.toIssueView = require_manifest.toIssueView;
68
+ exports.utcDayLabel = require_manifest.utcDayLabel;
63
69
  exports.writeBinding = require_manifest.writeBinding;
@@ -1,5 +1,5 @@
1
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.cjs";
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-D2x2w1wG.cjs";
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-CsyBXBwH.cjs";
3
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-DNfUhYD5.cjs";
4
4
  import { z } from "zod";
5
5
  //#region src/cli/output.d.ts
@@ -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_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_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';
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;
@@ -998,6 +998,197 @@ interface ListColumnEntriesInput {
998
998
  limit?: number;
999
999
  }
1000
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
1001
1192
  //#region src/ops/activity.d.ts
1002
1193
  /**
1003
1194
  * What the host knows and the board does not: the names of its workspaces, who
@@ -1687,10 +1878,25 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1687
1878
  }) => Promise<CardQueryResult>;
1688
1879
  listColumnEntries: (input: ListColumnEntriesInput) => Promise<ColumnEntry[]>;
1689
1880
  buildPrimeText: (workspaceId: string) => Promise<string>;
1881
+ readBoardMetricsHistory: (workspaceIds: readonly string[]) => Promise<BoardMetricsHistory>;
1882
+ boardMetrics: (input: BoardMetricsInput, now?: number) => Promise<BoardMetrics>;
1690
1883
  };
1691
1884
  /** The board's operations, as a type callers can name. */
1692
1885
  type BoardOps = ReturnType<typeof createBoardOps<BoardStore>>;
1693
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
1694
1900
  //#region src/serve/board-error-responses.d.ts
1695
1901
  /** What one board failure is over HTTP: the status, the sentence, and the code a client matches on when it is renamed. */
1696
1902
  interface BoardErrorResponse {
@@ -1726,4 +1932,4 @@ interface BoardErrorResponse {
1726
1932
  */
1727
1933
  export declare const BOARD_ERROR_RESPONSES: Record<BoardErrorCode, BoardErrorResponse>;
1728
1934
  //#endregion
1729
- 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 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 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 };
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,5 +1,5 @@
1
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-DN5Y2U2y.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
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
@@ -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_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_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';
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;
@@ -998,6 +998,197 @@ interface ListColumnEntriesInput {
998
998
  limit?: number;
999
999
  }
1000
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
1001
1192
  //#region src/ops/activity.d.ts
1002
1193
  /**
1003
1194
  * What the host knows and the board does not: the names of its workspaces, who
@@ -1687,10 +1878,25 @@ export declare function createBoardOps<TStore extends BoardStore>(store: TStore)
1687
1878
  }) => Promise<CardQueryResult>;
1688
1879
  listColumnEntries: (input: ListColumnEntriesInput) => Promise<ColumnEntry[]>;
1689
1880
  buildPrimeText: (workspaceId: string) => Promise<string>;
1881
+ readBoardMetricsHistory: (workspaceIds: readonly string[]) => Promise<BoardMetricsHistory>;
1882
+ boardMetrics: (input: BoardMetricsInput, now?: number) => Promise<BoardMetrics>;
1690
1883
  };
1691
1884
  /** The board's operations, as a type callers can name. */
1692
1885
  type BoardOps = ReturnType<typeof createBoardOps<BoardStore>>;
1693
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
1694
1900
  //#region src/serve/board-error-responses.d.ts
1695
1901
  /** What one board failure is over HTTP: the status, the sentence, and the code a client matches on when it is renamed. */
1696
1902
  interface BoardErrorResponse {
@@ -1726,4 +1932,4 @@ interface BoardErrorResponse {
1726
1932
  */
1727
1933
  export declare const BOARD_ERROR_RESPONSES: Record<BoardErrorCode, BoardErrorResponse>;
1728
1934
  //#endregion
1729
- 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 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 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 };
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 serializeEntryRules, B as createBoardOps, Ct as toIssueView, Dt as nextIssueOrder, Et as nextIssueNumber, F as BINDING_FILE_PATH, G as FLOW_RULES, H as formatExternalSessionRef, I as ignoreBoardFile, J as ENTRY_RULE_DESCRIPTIONS, K as readFlowRules, L as readBinding, M as renderCapabilitiesMarkdown, N as maskDatabaseUrl, Ot as readIssuePrefix, P as maskDatabaseUrls, Q as readEntryRules, R as readProjectBinding, St as normalizeCommentAuthorKind, Tt as nextIssueIdentity, U as parseExternalSessionRef, V as cardDisplayTitle, W as pullRequestFactKeys, X as evaluateEntryRules, Y as UNMET_ENTRY_RULE_REASONS, Z as readChecklist, _ as suggestCardKey, _t as formatPlainActivityValue, a as BOARD_ERROR_RESPONSES, at as DEFAULT_STATUSES, bt as readSystemCommentKind, ct as diffFieldChanges, dt as currentUnixSeconds, et as COLUMN_CATALOGUE, ft as activityKindOrder, g as isValidCardKey, gt as formatActivityIssueReference, h as CARD_KEY_PATTERN, ht as commentAuthorReference, i as KANBO_TOOL_NAMES, it as runBoardWrite, mt as activityToken, n as buildCapabilitiesManifest, nt as COLUMN_TEMPLATE_IDS, ot as normalizeStatusName, pt as activityText, q as ENTRY_RULES, r as KANBO_TOOL_CLI_EQUIVALENTS, rt as readChangeSeq, st as TRACKED_FIELDS, t as CAPABILITIES_MANIFEST_VERSION, tt as COLUMN_TEMPLATES, ut as BOARD_ACTOR, v as DEFAULT_BOARD_FILE_PATH, vt as isEmptyActivityValue, wt as formatIssueId, xt as isOutsideWriter, yt as parseActivityStringArray, z as writeBinding } from "./manifest-t4LvFgzH.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, FLOW_RULES, 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, readFlowRules, 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 };