rvlib-shipkit 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/package.json +2 -1
- package/src/cli/cmd_Tui.ts +5 -19
- package/src/init-repo.ts +10 -0
- package/src/tui/run-tui.ts +25 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.1 — 2026-07-22
|
|
4
|
+
|
|
5
|
+
- fix: `react-dom` was missing from dependencies AND the CLI entry loaded
|
|
6
|
+
the react/ink chain eagerly — every command crashed in a fresh consumer
|
|
7
|
+
repo without react-dom (found by the rabbits-vs-sheeps swap in the field,
|
|
8
|
+
confirmed against the 0.3.0 tarball). tui now lazy-loads its body; deps
|
|
9
|
+
carry react-dom. Proven by a fresh-repo install test (init → ci green in
|
|
10
|
+
a react-less repo).
|
|
11
|
+
- fix: `init` warns loudly when rvlib-shipkit is not installed in the repo
|
|
12
|
+
(the minted scripts call its bin — previously exit 127 with no hint).
|
|
13
|
+
|
|
3
14
|
## 0.3.0 — 2026-07-22
|
|
4
15
|
|
|
5
16
|
New:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rvlib-shipkit",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "All-in-one repo companion: ci gate (task DAG), auto-discovered health checks, release-contract fulfillness, asks queue, md-wiki tools, asset atelier, live tui",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"mobx": "^6.16.1",
|
|
30
30
|
"mobx-react-lite": "^4.1.1",
|
|
31
31
|
"react": "^19.2.7",
|
|
32
|
+
"react-dom": "^19.2.7",
|
|
32
33
|
"rvlib-ts-tools": "^0.2.0",
|
|
33
34
|
"sharp": "^0.35.3"
|
|
34
35
|
}
|
package/src/cli/cmd_Tui.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
// shipkit tui — the live dashboard: Tasks (the ci gate, streamed through
|
|
2
2
|
// the DAG runner) + Checks (contracts + discovered *.check.ts) built in,
|
|
3
3
|
// repo extras injected via repo.config `tui: { panels: [...] }`.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
// The body lives in src/tui/run-tui.ts and is loaded ONLY when the command
|
|
5
|
+
// runs: the react/ink chain must never load for `shipkit ci` in a repo
|
|
6
|
+
// without react-dom.
|
|
7
7
|
import { Command } from 'clipanion'
|
|
8
|
-
import { loadRepoConfig } from '../repo-config.ts'
|
|
9
|
-
import { checksPanel } from '../tui/checks-panel.ts'
|
|
10
|
-
import { tasksPanel } from '../tui/tasks-panel.ts'
|
|
11
|
-
import { TuiApp } from '../tui/tui-app.tsx'
|
|
12
|
-
import { TuiStore } from '../tui/tui-store.ts'
|
|
13
8
|
|
|
14
9
|
export class TuiCommand extends Command {
|
|
15
10
|
static override paths = [['tui']]
|
|
@@ -21,16 +16,7 @@ export class TuiCommand extends Command {
|
|
|
21
16
|
})
|
|
22
17
|
|
|
23
18
|
async execute(): Promise<number> {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
// playbook (build/mobx): enforceActions warns on stray mutations — the
|
|
27
|
-
// only signal. Read-warning flags stay off: useInput handler reads are
|
|
28
|
-
// legitimately untracked and would false-positive.
|
|
29
|
-
configure({ enforceActions: 'always' })
|
|
30
|
-
const store = new TuiStore(c.name, [tasksPanel(root, c), checksPanel(root), ...(c.tui?.panels ?? [])])
|
|
31
|
-
store.refresh() // instant static paint; results stream in
|
|
32
|
-
const app = render(React.createElement(TuiApp, { store }))
|
|
33
|
-
await app.waitUntilExit()
|
|
34
|
-
return 0
|
|
19
|
+
const { runTui } = await import('../tui/run-tui.ts')
|
|
20
|
+
return runTui(process.cwd())
|
|
35
21
|
}
|
|
36
22
|
}
|
package/src/init-repo.ts
CHANGED
|
@@ -54,6 +54,16 @@ export async function initRepo(root: string, opts: InitOpts = {}): Promise<numbe
|
|
|
54
54
|
const floor = resolveFloor(defineRepo({ name }), root)
|
|
55
55
|
for (const t of floor.tasks) console.log(`ok: floor ${t.id} ← ${floor.sources[t.id] ?? 'unknown'}`)
|
|
56
56
|
for (const u of floor.unfilled) console.log(`skip: ${u.id} (${u.reason})`)
|
|
57
|
+
// scripts call the `shipkit` bin — dead on arrival unless the package is
|
|
58
|
+
// actually installed (field bug 2026-07-22: init via bunx, no dep, exit 127)
|
|
59
|
+
if (opts.bin == null) {
|
|
60
|
+
try {
|
|
61
|
+
Bun.resolveSync('rvlib-shipkit', root)
|
|
62
|
+
} catch {
|
|
63
|
+
console.log('WARN rvlib-shipkit not installed here — the scripts above call its bin and will exit 127')
|
|
64
|
+
console.log(' fix: bun add -d rvlib-shipkit')
|
|
65
|
+
}
|
|
66
|
+
}
|
|
57
67
|
console.log('next: fill venues/social in repo.config.ts, then `bun run ci`')
|
|
58
68
|
console.log('next: identity+assets — mint .rv-identity/brand.ts + .rv-assets/kit.ts, `shipkit assets identity` (the identity contract expects public/ favicon+og+logo)')
|
|
59
69
|
return 0
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// The tui command body — a separate module so cli.ts NEVER loads
|
|
2
|
+
// react/ink/mobx for non-tui commands (a fresh consumer running `shipkit ci`
|
|
3
|
+
// must not touch the react dependency chain; field bug 2026-07-22: 0.3.0
|
|
4
|
+
// crashed every command on repos without react-dom).
|
|
5
|
+
import React from 'react'
|
|
6
|
+
import { render } from 'ink'
|
|
7
|
+
import { configure } from 'mobx'
|
|
8
|
+
import { loadRepoConfig } from '../repo-config.ts'
|
|
9
|
+
import { checksPanel } from './checks-panel.ts'
|
|
10
|
+
import { tasksPanel } from './tasks-panel.ts'
|
|
11
|
+
import { TuiApp } from './tui-app.tsx'
|
|
12
|
+
import { TuiStore } from './tui-store.ts'
|
|
13
|
+
|
|
14
|
+
export async function runTui(root: string): Promise<number> {
|
|
15
|
+
const c = await loadRepoConfig(root)
|
|
16
|
+
// playbook (build/mobx): enforceActions warns on stray mutations — the
|
|
17
|
+
// only signal. Read-warning flags stay off: useInput handler reads are
|
|
18
|
+
// legitimately untracked and would false-positive.
|
|
19
|
+
configure({ enforceActions: 'always' })
|
|
20
|
+
const store = new TuiStore(c.name, [tasksPanel(root, c), checksPanel(root), ...(c.tui?.panels ?? [])])
|
|
21
|
+
store.refresh() // instant static paint; results stream in
|
|
22
|
+
const app = render(React.createElement(TuiApp, { store }))
|
|
23
|
+
await app.waitUntilExit()
|
|
24
|
+
return 0
|
|
25
|
+
}
|