kanbo-cli 0.1.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/better-sqlite3-fU3G4xnX.cjs +2254 -0
  4. package/dist/better-sqlite3-fU3G4xnX.cjs.map +1 -0
  5. package/dist/cli.cjs +42949 -0
  6. package/dist/cli.cjs.map +1 -0
  7. package/dist/dist-Cd6wg8pp.cjs +942 -0
  8. package/dist/dist-Cd6wg8pp.cjs.map +1 -0
  9. package/dist/drizzle-postgres/0000_board.sql +135 -0
  10. package/dist/drizzle-postgres/0001_history_order.sql +2 -0
  11. package/dist/drizzle-postgres/0002_issue_pull_requests.sql +16 -0
  12. package/dist/drizzle-postgres/0003_milestone_start_date.sql +1 -0
  13. package/dist/drizzle-postgres/0004_status_entry_rules.sql +1 -0
  14. package/dist/drizzle-postgres/0005_run_external_session_ref.sql +1 -0
  15. package/dist/drizzle-postgres/README.md +61 -0
  16. package/dist/drizzle-postgres/meta/0000_snapshot.json +1078 -0
  17. package/dist/drizzle-postgres/meta/0001_snapshot.json +1090 -0
  18. package/dist/drizzle-postgres/meta/0002_snapshot.json +1239 -0
  19. package/dist/drizzle-postgres/meta/0003_snapshot.json +1245 -0
  20. package/dist/drizzle-postgres/meta/0004_snapshot.json +1251 -0
  21. package/dist/drizzle-postgres/meta/0005_snapshot.json +1257 -0
  22. package/dist/drizzle-postgres/meta/_journal.json +48 -0
  23. package/dist/drizzle-sqlite/0000_board.sql +133 -0
  24. package/dist/drizzle-sqlite/0001_issue_pull_requests.sql +15 -0
  25. package/dist/drizzle-sqlite/0002_milestone_start_date.sql +1 -0
  26. package/dist/drizzle-sqlite/0003_status_entry_rules.sql +1 -0
  27. package/dist/drizzle-sqlite/0004_run_external_session_ref.sql +1 -0
  28. package/dist/drizzle-sqlite/README.md +67 -0
  29. package/dist/drizzle-sqlite/meta/0000_snapshot.json +946 -0
  30. package/dist/drizzle-sqlite/meta/0001_snapshot.json +1054 -0
  31. package/dist/drizzle-sqlite/meta/0002_snapshot.json +1061 -0
  32. package/dist/drizzle-sqlite/meta/0003_snapshot.json +1068 -0
  33. package/dist/drizzle-sqlite/meta/0004_snapshot.json +1075 -0
  34. package/dist/drizzle-sqlite/meta/_journal.json +41 -0
  35. package/dist/lib/board-store-B16YarvX.d.mts +281 -0
  36. package/dist/lib/board-store-BHHo_ZlR.d.cts +281 -0
  37. package/dist/lib/index.cjs +340 -0
  38. package/dist/lib/index.cjs.map +1 -0
  39. package/dist/lib/index.d.cts +1608 -0
  40. package/dist/lib/index.d.mts +1608 -0
  41. package/dist/lib/index.mjs +284 -0
  42. package/dist/lib/index.mjs.map +1 -0
  43. package/dist/lib/manifest-C0EcwwgO.mjs +7866 -0
  44. package/dist/lib/manifest-C0EcwwgO.mjs.map +1 -0
  45. package/dist/lib/manifest-CpZOcB_6.cjs +8272 -0
  46. package/dist/lib/manifest-CpZOcB_6.cjs.map +1 -0
  47. package/dist/lib/mcp/index.cjs +184 -0
  48. package/dist/lib/mcp/index.cjs.map +1 -0
  49. package/dist/lib/mcp/index.d.cts +346 -0
  50. package/dist/lib/mcp/index.d.mts +346 -0
  51. package/dist/lib/mcp/index.mjs +173 -0
  52. package/dist/lib/mcp/index.mjs.map +1 -0
  53. package/dist/lib/migrate-BhYi9cXw.mjs +656 -0
  54. package/dist/lib/migrate-BhYi9cXw.mjs.map +1 -0
  55. package/dist/lib/migrate-DnMjTCvu.cjs +709 -0
  56. package/dist/lib/migrate-DnMjTCvu.cjs.map +1 -0
  57. package/dist/lib/migrations-path-CZxVOgeD.cjs +109 -0
  58. package/dist/lib/migrations-path-CZxVOgeD.cjs.map +1 -0
  59. package/dist/lib/migrations-path-Ciwan537.mjs +80 -0
  60. package/dist/lib/migrations-path-Ciwan537.mjs.map +1 -0
  61. package/dist/lib/postgres/index.cjs +56 -0
  62. package/dist/lib/postgres/index.cjs.map +1 -0
  63. package/dist/lib/postgres/index.d.cts +3403 -0
  64. package/dist/lib/postgres/index.d.mts +3403 -0
  65. package/dist/lib/postgres/index.mjs +35 -0
  66. package/dist/lib/postgres/index.mjs.map +1 -0
  67. package/dist/lib/roles.sql-B9rt-x4o.cjs +1033 -0
  68. package/dist/lib/roles.sql-B9rt-x4o.cjs.map +1 -0
  69. package/dist/lib/roles.sql-CvyCGt38.mjs +920 -0
  70. package/dist/lib/roles.sql-CvyCGt38.mjs.map +1 -0
  71. package/dist/lib/schema-epoch-ZyumVL_A.d.cts +16 -0
  72. package/dist/lib/schema-epoch-ZyumVL_A.d.mts +16 -0
  73. package/dist/lib/schema-fsHqNAip.d.cts +3612 -0
  74. package/dist/lib/schema-fsHqNAip.d.mts +3612 -0
  75. package/dist/lib/sqlite/index.cjs +23 -0
  76. package/dist/lib/sqlite/index.d.cts +175 -0
  77. package/dist/lib/sqlite/index.d.mts +175 -0
  78. package/dist/lib/sqlite/index.mjs +4 -0
  79. package/dist/lib/sqlite/schema.cjs +266 -0
  80. package/dist/lib/sqlite/schema.cjs.map +1 -0
  81. package/dist/lib/sqlite/schema.d.cts +2 -0
  82. package/dist/lib/sqlite/schema.d.mts +2 -0
  83. package/dist/lib/sqlite/schema.mjs +256 -0
  84. package/dist/lib/sqlite/schema.mjs.map +1 -0
  85. package/dist/lib/tool-names-9cmCn0gP.d.cts +112 -0
  86. package/dist/lib/tool-names-Dxg1UTUl.d.mts +112 -0
  87. package/dist/page/board.css +477 -0
  88. package/dist/page/board.js +2 -0
  89. package/drizzle-postgres/0000_board.sql +135 -0
  90. package/drizzle-postgres/0001_history_order.sql +2 -0
  91. package/drizzle-postgres/0002_issue_pull_requests.sql +16 -0
  92. package/drizzle-postgres/0003_milestone_start_date.sql +1 -0
  93. package/drizzle-postgres/0004_status_entry_rules.sql +1 -0
  94. package/drizzle-postgres/0005_run_external_session_ref.sql +1 -0
  95. package/drizzle-postgres/README.md +61 -0
  96. package/drizzle-postgres/meta/0000_snapshot.json +1078 -0
  97. package/drizzle-postgres/meta/0001_snapshot.json +1090 -0
  98. package/drizzle-postgres/meta/0002_snapshot.json +1239 -0
  99. package/drizzle-postgres/meta/0003_snapshot.json +1245 -0
  100. package/drizzle-postgres/meta/0004_snapshot.json +1251 -0
  101. package/drizzle-postgres/meta/0005_snapshot.json +1257 -0
  102. package/drizzle-postgres/meta/_journal.json +48 -0
  103. package/drizzle-sqlite/0000_board.sql +133 -0
  104. package/drizzle-sqlite/0001_issue_pull_requests.sql +15 -0
  105. package/drizzle-sqlite/0002_milestone_start_date.sql +1 -0
  106. package/drizzle-sqlite/0003_status_entry_rules.sql +1 -0
  107. package/drizzle-sqlite/0004_run_external_session_ref.sql +1 -0
  108. package/drizzle-sqlite/README.md +67 -0
  109. package/drizzle-sqlite/meta/0000_snapshot.json +946 -0
  110. package/drizzle-sqlite/meta/0001_snapshot.json +1054 -0
  111. package/drizzle-sqlite/meta/0002_snapshot.json +1061 -0
  112. package/drizzle-sqlite/meta/0003_snapshot.json +1068 -0
  113. package/drizzle-sqlite/meta/0004_snapshot.json +1075 -0
  114. package/drizzle-sqlite/meta/_journal.json +41 -0
  115. package/package.json +147 -0
@@ -0,0 +1,48 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "postgresql",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "7",
8
+ "when": 1790077635921,
9
+ "tag": "0000_board",
10
+ "breakpoints": true
11
+ },
12
+ {
13
+ "idx": 1,
14
+ "version": "7",
15
+ "when": 1790112642551,
16
+ "tag": "0001_history_order",
17
+ "breakpoints": true
18
+ },
19
+ {
20
+ "idx": 2,
21
+ "version": "7",
22
+ "when": 1790227027724,
23
+ "tag": "0002_issue_pull_requests",
24
+ "breakpoints": true
25
+ },
26
+ {
27
+ "idx": 3,
28
+ "version": "7",
29
+ "when": 1790244865401,
30
+ "tag": "0003_milestone_start_date",
31
+ "breakpoints": true
32
+ },
33
+ {
34
+ "idx": 4,
35
+ "version": "7",
36
+ "when": 1790255382146,
37
+ "tag": "0004_status_entry_rules",
38
+ "breakpoints": true
39
+ },
40
+ {
41
+ "idx": 5,
42
+ "version": "7",
43
+ "when": 1790266707460,
44
+ "tag": "0005_run_external_session_ref",
45
+ "breakpoints": true
46
+ }
47
+ ]
48
+ }
@@ -0,0 +1,133 @@
1
+ CREATE TABLE `issue_comments` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `issue_id` text NOT NULL,
4
+ `content` text NOT NULL,
5
+ `author_kind` text DEFAULT 'user' NOT NULL,
6
+ `author_id` text,
7
+ `source_chat_session_id` text,
8
+ `agent_activity_id` text,
9
+ `dedupe_key` text,
10
+ `created_at` integer DEFAULT (unixepoch()) NOT NULL,
11
+ FOREIGN KEY (`issue_id`) REFERENCES `issues`(`id`) ON UPDATE no action ON DELETE cascade
12
+ );
13
+ --> statement-breakpoint
14
+ CREATE INDEX `issue_comments_issue_id_idx` ON `issue_comments` (`issue_id`);--> statement-breakpoint
15
+ CREATE UNIQUE INDEX `issue_comments_issue_dedupe_idx` ON `issue_comments` (`issue_id`,`dedupe_key`);--> statement-breakpoint
16
+ CREATE TABLE `issue_field_changes` (
17
+ `id` text PRIMARY KEY NOT NULL,
18
+ `issue_id` text NOT NULL,
19
+ `field` text NOT NULL,
20
+ `from_value` text,
21
+ `to_value` text,
22
+ `actor_kind` text DEFAULT 'user' NOT NULL,
23
+ `actor_id` text,
24
+ `source_chat_session_id` text,
25
+ `created_at` integer DEFAULT (unixepoch()) NOT NULL,
26
+ FOREIGN KEY (`issue_id`) REFERENCES `issues`(`id`) ON UPDATE no action ON DELETE cascade
27
+ );
28
+ --> statement-breakpoint
29
+ CREATE INDEX `issue_field_changes_issue_id_idx` ON `issue_field_changes` (`issue_id`);--> statement-breakpoint
30
+ CREATE TABLE `issue_milestones` (
31
+ `id` text PRIMARY KEY NOT NULL,
32
+ `workspace_id` text NOT NULL,
33
+ `title` text NOT NULL,
34
+ `description` text,
35
+ `due_date` integer,
36
+ `status` text DEFAULT 'open' NOT NULL,
37
+ `created_at` integer DEFAULT (unixepoch()) NOT NULL,
38
+ `updated_at` integer DEFAULT (unixepoch()) NOT NULL
39
+ );
40
+ --> statement-breakpoint
41
+ CREATE INDEX `issue_milestones_workspace_id_idx` ON `issue_milestones` (`workspace_id`);--> statement-breakpoint
42
+ CREATE TABLE `issue_relations` (
43
+ `id` text PRIMARY KEY NOT NULL,
44
+ `source_issue_id` text NOT NULL,
45
+ `target_issue_id` text NOT NULL,
46
+ `type` text NOT NULL,
47
+ `created_at` integer DEFAULT (unixepoch()) NOT NULL,
48
+ FOREIGN KEY (`source_issue_id`) REFERENCES `issues`(`id`) ON UPDATE no action ON DELETE cascade,
49
+ FOREIGN KEY (`target_issue_id`) REFERENCES `issues`(`id`) ON UPDATE no action ON DELETE cascade
50
+ );
51
+ --> statement-breakpoint
52
+ CREATE INDEX `issue_relations_source_issue_id_idx` ON `issue_relations` (`source_issue_id`);--> statement-breakpoint
53
+ CREATE INDEX `issue_relations_target_issue_id_idx` ON `issue_relations` (`target_issue_id`);--> statement-breakpoint
54
+ CREATE UNIQUE INDEX `issue_relations_pair_type_unique` ON `issue_relations` (`source_issue_id`,`target_issue_id`,`type`);--> statement-breakpoint
55
+ CREATE TABLE `issue_runs` (
56
+ `id` text PRIMARY KEY NOT NULL,
57
+ `issue_id` text NOT NULL,
58
+ `launched_by_kind` text DEFAULT 'user' NOT NULL,
59
+ `launched_by_id` text,
60
+ `agent_id` text,
61
+ `agent_name` text NOT NULL,
62
+ `host` text,
63
+ `execution_mode` text DEFAULT 'worktree' NOT NULL,
64
+ `branch` text,
65
+ `worktree_path` text,
66
+ `state` text DEFAULT 'running' NOT NULL,
67
+ `chat_session_id` text,
68
+ `started_at` integer DEFAULT (unixepoch()) NOT NULL,
69
+ `ended_at` integer,
70
+ FOREIGN KEY (`issue_id`) REFERENCES `issues`(`id`) ON UPDATE no action ON DELETE cascade
71
+ );
72
+ --> statement-breakpoint
73
+ CREATE INDEX `issue_runs_issue_id_idx` ON `issue_runs` (`issue_id`);--> statement-breakpoint
74
+ CREATE INDEX `issue_runs_issue_state_idx` ON `issue_runs` (`issue_id`,`state`);--> statement-breakpoint
75
+ CREATE INDEX `issue_runs_chat_session_idx` ON `issue_runs` (`chat_session_id`);--> statement-breakpoint
76
+ CREATE TABLE `issue_statuses` (
77
+ `id` text PRIMARY KEY NOT NULL,
78
+ `workspace_id` text NOT NULL,
79
+ `name` text NOT NULL,
80
+ `description` text,
81
+ `color` text,
82
+ `category` text DEFAULT 'unstarted' NOT NULL,
83
+ `order` integer DEFAULT 0 NOT NULL,
84
+ `created_at` integer DEFAULT (unixepoch()) NOT NULL
85
+ );
86
+ --> statement-breakpoint
87
+ CREATE INDEX `issue_statuses_workspace_id_idx` ON `issue_statuses` (`workspace_id`);--> statement-breakpoint
88
+ CREATE UNIQUE INDEX `issue_statuses_workspace_name_unique` ON `issue_statuses` (`workspace_id`,`name`);--> statement-breakpoint
89
+ CREATE TABLE `issues` (
90
+ `id` text PRIMARY KEY NOT NULL,
91
+ `workspace_id` text NOT NULL,
92
+ `number` integer NOT NULL,
93
+ `status_id` text,
94
+ `milestone_id` text,
95
+ `parent_issue_id` text,
96
+ `title` text NOT NULL,
97
+ `description` text,
98
+ `priority` text DEFAULT 'none' NOT NULL,
99
+ `labels` text DEFAULT '[]' NOT NULL,
100
+ `assignee_kind` text,
101
+ `assignee_id` text,
102
+ `due_date` integer,
103
+ `created_by_kind` text DEFAULT 'user' NOT NULL,
104
+ `created_by_id` text DEFAULT '__self__' NOT NULL,
105
+ `source_chat_session_id` text,
106
+ `delegate_agent_id` text,
107
+ `delegate_provider_target_id` text,
108
+ `context_refs` text DEFAULT '[]' NOT NULL,
109
+ `status_line` text,
110
+ `waiting_for` text,
111
+ `execution_mode` text DEFAULT 'worktree' NOT NULL,
112
+ `order` integer DEFAULT 0 NOT NULL,
113
+ `created_at` integer DEFAULT (unixepoch()) NOT NULL,
114
+ `updated_at` integer DEFAULT (unixepoch()) NOT NULL,
115
+ FOREIGN KEY (`status_id`) REFERENCES `issue_statuses`(`id`) ON UPDATE no action ON DELETE set null,
116
+ FOREIGN KEY (`milestone_id`) REFERENCES `issue_milestones`(`id`) ON UPDATE no action ON DELETE set null,
117
+ FOREIGN KEY (`parent_issue_id`) REFERENCES `issues`(`id`) ON UPDATE no action ON DELETE set null
118
+ );
119
+ --> statement-breakpoint
120
+ CREATE INDEX `issues_workspace_id_idx` ON `issues` (`workspace_id`);--> statement-breakpoint
121
+ CREATE UNIQUE INDEX `issues_workspace_number_unique` ON `issues` (`workspace_id`,`number`);--> statement-breakpoint
122
+ CREATE INDEX `issues_status_id_idx` ON `issues` (`status_id`);--> statement-breakpoint
123
+ CREATE INDEX `issues_milestone_id_idx` ON `issues` (`milestone_id`);--> statement-breakpoint
124
+ CREATE INDEX `issues_parent_issue_id_idx` ON `issues` (`parent_issue_id`);--> statement-breakpoint
125
+ CREATE INDEX `issues_delegate_agent_id_idx` ON `issues` (`delegate_agent_id`);--> statement-breakpoint
126
+ CREATE INDEX `issues_delegate_provider_target_id_idx` ON `issues` (`delegate_provider_target_id`);--> statement-breakpoint
127
+ CREATE TABLE `kanban_meta` (
128
+ `key` text PRIMARY KEY NOT NULL,
129
+ `revision` integer DEFAULT 0 NOT NULL,
130
+ `updated_at` integer DEFAULT (unixepoch()) NOT NULL
131
+ );--> statement-breakpoint
132
+ INSERT OR IGNORE INTO `kanban_meta` (`key`, `revision`) VALUES ('board', 0);--> statement-breakpoint
133
+ INSERT OR IGNORE INTO `kanban_meta` (`key`, `revision`) VALUES ('schema_epoch', 1);
@@ -0,0 +1,15 @@
1
+ CREATE TABLE `issue_pull_requests` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `issue_id` text NOT NULL,
4
+ `owner` text NOT NULL,
5
+ `repo` text NOT NULL,
6
+ `number` integer NOT NULL,
7
+ `url` text NOT NULL,
8
+ `created_by_kind` text NOT NULL,
9
+ `created_by_id` text,
10
+ `created_at` integer DEFAULT (unixepoch()) NOT NULL,
11
+ FOREIGN KEY (`issue_id`) REFERENCES `issues`(`id`) ON UPDATE no action ON DELETE cascade
12
+ );
13
+ --> statement-breakpoint
14
+ CREATE UNIQUE INDEX `issue_pull_requests_issue_pr_unique` ON `issue_pull_requests` (`issue_id`,`owner`,`repo`,`number`);--> statement-breakpoint
15
+ CREATE INDEX `issue_pull_requests_pr_idx` ON `issue_pull_requests` (`owner`,`repo`,`number`);
@@ -0,0 +1 @@
1
+ ALTER TABLE `issue_milestones` ADD `start_date` integer;
@@ -0,0 +1 @@
1
+ ALTER TABLE `issue_statuses` ADD `entry_rules` text;
@@ -0,0 +1 @@
1
+ ALTER TABLE `issue_runs` ADD `external_session_ref` text;
@@ -0,0 +1,67 @@
1
+ <!-- Once this directory changes, update this README.md -->
2
+
3
+ # Board migrations for a board file of this package's own
4
+
5
+ The board schema for a SQLite file nobody but this package owns — the one a
6
+ project keeps beside its code. It is one of the chains that build the same
7
+ board (ruling 5-2):
8
+
9
+ | Where the board lives | Who migrates it | With what |
10
+ | --- | --- | --- |
11
+ | a board file of a project's own | this package, through `migrateBoardFile` | **this folder** |
12
+ | an external Postgres | `kanbo migrate` (`migrateBoardDatabase`) | `drizzle-postgres/` |
13
+ | a host app's own database | the app, with its own migrations | the app's own chain |
14
+
15
+ **A change to the board is a migration in every chain, written together** — at
16
+ the same `BOARD_SCHEMA_EPOCH` — or a board stops being the same board when it
17
+ moves. An app that keeps the board in its own database re-exports
18
+ `kanbo/sqlite/schema` and generates its own migration from it. `src/postgres/schema.parity.test.ts` compares the two schemas the chains
19
+ are generated from, so a column added on one side alone fails there rather than
20
+ in somebody's database.
21
+
22
+ Generated with `npm run generate:sqlite` from
23
+ `src/sqlite/schema.ts`.
24
+
25
+ ## Files
26
+
27
+ - **0000_board.sql**: the whole board at epoch 1 — eight tables, their indexes
28
+ and the foreign keys that point inside the board. There are no foreign keys
29
+ out of it: this file has no `workspaces`, `agents` or `provider_targets` to
30
+ point at (ruling 5-1). The two `INSERT OR IGNORE` statements at the end seed
31
+ `kanban_meta` with `board` revision `0` and `schema_epoch` `1` (the generation
32
+ `assertBoardSchema` demands). They are hand-written, because `drizzle-kit`
33
+ generates structure, not rows: regenerating this file drops them, and they
34
+ have to be put back.
35
+ - **0001_issue_pull_requests.sql**: `issue_pull_requests`, the pull requests a
36
+ card names (ruling 4-1) — a plain `CREATE TABLE` with its foreign key onto
37
+ `issues` (cascade), the unique `(issue_id, owner, repo, number)` and the
38
+ `(owner, repo, number)` index. The epoch stays 1: a file still at 0000 carries
39
+ the right stamp and lacks the table, which `assertBoardSchema` reports as
40
+ `missingAddedTables` until `kanbo migrate` has been run on it.
41
+ - **0002_milestone_start_date.sql**: `issue_milestones.start_date` (unix
42
+ seconds, nullable), the day a milestone read as a sprint begins (ruling
43
+ 5x-3) — a plain `ADD COLUMN`. The epoch stays 1; a file still at 0001 reads as
44
+ `board_schema_outdated` (`missingColumns`) until `kanbo migrate` has run.
45
+ - **0003_status_entry_rules.sql**: `issue_statuses.entry_rules` (text, a JSON
46
+ array of `ENTRY_RULES`, nullable), what a card must satisfy before an agent
47
+ may put it in the column (ruling 6-1) — a plain `ADD COLUMN`; `null` asks for
48
+ nothing. The epoch stays 1; a file still at 0002 reads as
49
+ `board_schema_outdated` (`missingColumns`) until `kanbo migrate` has run.
50
+ - **0004_run_external_session_ref.sql**: `issue_runs.external_session_ref`
51
+ (text, nullable), where an external agent's own log of a run lives, once it
52
+ has said (ruling 7-1): `claude:<id>` (a Claude Code session id) or
53
+ `codex:<id>` (a Codex session id — the one in the rollout's `session_meta`); `null` while it never has — a plain
54
+ `ADD COLUMN`. The epoch stays 1; a file still at 0003 reads as
55
+ `board_schema_outdated` (`missingColumns`) until `kanbo migrate` has run.
56
+ - **meta/**: the drizzle journal and schema snapshots. JSON only, or
57
+ `drizzle-kit generate` fails to parse the directory.
58
+
59
+ Nothing here rebuilds a table, and nothing here ever should: `migrateBoardFile`
60
+ is drizzle's own migrator, in one pass with foreign keys left as the caller set
61
+ them. A rebuild would need a runner that turns foreign keys off around it, and
62
+ the only reason to have one is other tables that point at the board — of which
63
+ this file has none.
64
+
65
+ A second migration takes a name of its own — the package script carries
66
+ `--name board` for the first one — so it is
67
+ `npx drizzle-kit generate --config drizzle.sqlite.config.ts --name <what it does>`.