Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
217 commits
Select commit Hold shift + click to select a range
693235e
docs(spec): rewind exit-code contract (ticket v1-01)
damusix Jul 12, 2026
4a55c24
docs(spec): add v1-04-quote-ddl spec
damusix Jul 12, 2026
930df95
docs(spec): add v1-07 sdk-docs-drift spec
damusix Jul 12, 2026
4550e99
chore: adopt MIT license across packages
damusix Jul 12, 2026
f290a88
docs(spec): add v1-27 MIT license spec
damusix Jul 12, 2026
9003555
docs(spec): add v1-02 yes-flag confirmation spec
damusix Jul 12, 2026
b70124f
docs(spec): FK re-enable guarantee for truncate and transfer
damusix Jul 12, 2026
0c158ea
fix(cli): exit 2 on partial change rewind
damusix Jul 12, 2026
9cf7ec1
docs: fix nonexistent API refs in shipped docs
damusix Jul 12, 2026
4c4b198
docs(spec): v1-01 implementation log
damusix Jul 12, 2026
4bba259
fix(db): quote database names in create/drop DDL
damusix Jul 12, 2026
08e6c51
docs(spec): record v1-04-quote-ddl implementation log
damusix Jul 12, 2026
dab4945
docs(examples): make pg README config fences strict JSON
damusix Jul 12, 2026
147e480
docs(spec): record v1-07 implementation log
damusix Jul 12, 2026
c2bfa6e
docs(spec): add v1-09 dead-purge spec
damusix Jul 12, 2026
120ef1e
docs(spec): test-db guard for integration suite
damusix Jul 12, 2026
2302cfd
docs(spec): add v1-20 secret-hardening contract
damusix Jul 12, 2026
65c67ca
chore: remove dead deps, dead src/hooks, stale files
damusix Jul 12, 2026
1b89f2b
fix(teardown): guarantee FK re-enable after truncate failure
damusix Jul 12, 2026
38f06ad
docs(spec): record v1-09 implementation log
damusix Jul 12, 2026
59e9b51
docs(spec): record v1-03 implementation log
damusix Jul 12, 2026
59e7032
fix(cli): honor --yes on db truncate/teardown/reset
damusix Jul 12, 2026
213c9f6
docs(spec): record v1-02 implementation log
damusix Jul 12, 2026
cde3e26
docs(spec): use canonical checkpoint table columns
damusix Jul 12, 2026
592013e
test: guard createTestConnection against non-test DBs
damusix Jul 12, 2026
2d00139
docs(transfer): document fkChecksRestored result field
damusix Jul 12, 2026
203101f
fix(security): write config exports and state.enc at 0600
damusix Jul 12, 2026
57ee2af
docs(spec): implementation log for test-db guard
damusix Jul 12, 2026
65bce6b
feat(rpc): add session status command
damusix Jul 12, 2026
cd6b4c4
fix(security): enforce passphrase floor, mask db transfer prompt
damusix Jul 12, 2026
0ac3e56
refactor(worker-bridge): drop unused generic surfaces
damusix Jul 12, 2026
a5b39ca
fix(security): wire key-permission guard into loadPrivateKey
damusix Jul 12, 2026
5f75abc
docs(spec): add v1-06 json-sweep spec
damusix Jul 12, 2026
8179d9e
docs: move --json after subcommand in CLI examples
damusix Jul 12, 2026
e9ac6bc
docs(spec): close out v1-20 secret-hardening change log
damusix Jul 12, 2026
2e3cc21
refactor(tui): drop unused useEventPromise hook
damusix Jul 12, 2026
37e6cd6
docs(spec): close v1-22-trim-surfaces change log
damusix Jul 12, 2026
3fbffa3
chore: delete dead shouldOutputJson, add --json doc-lint guard
damusix Jul 12, 2026
78de929
fix: exempt docs/spec/ wholesale in json-placement guard
damusix Jul 12, 2026
0da0aa0
docs(spec): add v1-08 dangerous-path tests spec
damusix Jul 12, 2026
29b4206
test(change): cover tracker/manager revert, rewind, next, remove
damusix Jul 12, 2026
368d43c
docs(spec): add v1-05 help-breadcrumb spec
damusix Jul 12, 2026
089403f
fix(cli): thread parent breadcrumb into --help usage
damusix Jul 12, 2026
dda8187
docs(spec): record v1-05 implementation log
damusix Jul 12, 2026
ea2ccdf
docs(spec): record wholesale docs/spec guard exemption
damusix Jul 12, 2026
350187f
docs(spec): SQLite rewind date-hydration contract (ticket 34)
damusix Jul 12, 2026
4be4a1c
fix(change): hydrate SQLite history dates on read
damusix Jul 12, 2026
5daa7f2
test(vault): cover key crypto round-trip and storage CRUD
damusix Jul 12, 2026
4b063c8
docs(spec): add locked-stage config-deletion guard spec
damusix Jul 12, 2026
e6ce6ba
feat(config): block deletion of configs on locked stages
damusix Jul 12, 2026
35e19e6
test(cli): cover db create fresh-create and already-exists paths
damusix Jul 12, 2026
5470f65
docs(spec): add v1-19 lazy-startup spec
damusix Jul 12, 2026
b8994ef
docs(spec): add v1-10 logosdx primitives adoption spec
damusix Jul 12, 2026
d35d3d9
perf(cli): lazy-load command tree and defer ink/react
damusix Jul 12, 2026
7c77d16
refactor(core): replace local sleep() with wait() from @logosdx/utils
damusix Jul 12, 2026
af4e972
docs(spec): record v1-19 implementation log
damusix Jul 12, 2026
dbdcff7
refactor(core): use runWithTimeout for lifecycle and connection timeouts
damusix Jul 12, 2026
5b20462
feat(tui): surface locked-stage guard in config screens
damusix Jul 12, 2026
f192a63
chore: repo hygiene cleanup + release-engine docs
damusix Jul 12, 2026
4095c1e
refactor(update): rewrite download retry loop with retry()
damusix Jul 12, 2026
80398f5
docs(followups): defer v1-21-31-hygiene-f2
damusix Jul 12, 2026
d0ed966
docs(spec): record v1-29 implementation log
damusix Jul 12, 2026
0cee627
docs(spec): add implementation log for v1-21-31-hygiene
damusix Jul 12, 2026
acbf59b
refactor(update): use AbortSignal.timeout in registry fetch
damusix Jul 12, 2026
3e156a1
docs(spec): add v1-10 implementation log
damusix Jul 12, 2026
0fd0628
build(sdk): drop source maps from npm tarball
damusix Jul 12, 2026
ae9092f
docs(spec): record v1-30 implementation log
damusix Jul 12, 2026
b038211
docs(spec): add v1-25 sdk failure contract spec
damusix Jul 12, 2026
36406d0
fix(sdk): propagate vault storage query failures instead of swallowin…
damusix Jul 12, 2026
3c2cff4
docs(spec): add v1-16 checksum verification contract
damusix Jul 12, 2026
feef1aa
refactor(dt): drop inert ToUniversalOptions.version
damusix Jul 12, 2026
9f47d7b
docs(spec): add v1-12 tui/rpc helper adoption spec
damusix Jul 12, 2026
eb083a0
fix(policy): consolidate mcp-channel visibility check
damusix Jul 12, 2026
f67fcfd
feat(update): add sha256 checksum verification module
damusix Jul 12, 2026
5d0af82
refactor(dt): delete D8 worker-fetch DI seam
damusix Jul 12, 2026
ace4d8d
docs(spec): implementation log for v1-13-inert-params
damusix Jul 12, 2026
600e2cc
docs(spec): add v1-11 validation single-source spec
damusix Jul 12, 2026
6430901
feat(sdk): throw from vault init/set/delete/copy instead of returning…
damusix Jul 12, 2026
8431afa
refactor: single-source config-validate algorithm and DEFAULT_PORTS
damusix Jul 12, 2026
1f8a1d1
refactor(tui): adopt createChangeManager in run/revert screens
damusix Jul 12, 2026
c6679c7
feat(update): verify binary checksum before self-update swap
damusix Jul 12, 2026
ec5571b
chore(signals): refresh after v1-13-inert-params
damusix Jul 12, 2026
f3f96fc
docs(spec): extend v1-11 CP2 to fourth port-copy in stage editor
damusix Jul 12, 2026
8d06eb8
feat(sdk): throw from transfer.to/plan and dt.exportTable/importFile
damusix Jul 12, 2026
49066d7
feat(install): verify binary sha256 in curl-pipe-sh installer
damusix Jul 12, 2026
43471c3
refactor(tui): adopt withScreenConnection in run/db screens
damusix Jul 12, 2026
1558da6
docs(sdk): update JSDoc examples for the new throw contract
damusix Jul 12, 2026
1ef49b6
refactor: route TUI port/name validators through Zod schemas
damusix Jul 12, 2026
161fced
feat(cli): verify binary sha256 in npm postinstall
damusix Jul 12, 2026
943699b
fix(tui): guard direct getVaultKey/vaultSecretExists calls with attem…
damusix Jul 12, 2026
a290e7a
refactor(tui): adopt withScreenConnection in dir/file run screens
damusix Jul 12, 2026
36eabd6
ci(release): emit sha256 checksums.txt with binary assets
damusix Jul 12, 2026
e2558d2
docs(spec): normalize checkpoint table, add implementation log
damusix Jul 12, 2026
43aa192
docs(spec): append implementation log for v1-25
damusix Jul 12, 2026
ce2c9f1
docs(spec): add v1-16 implementation log
damusix Jul 12, 2026
1a06a3b
docs(install): document checksum verification and NOORM_INSECURE
damusix Jul 12, 2026
21ac206
docs(spec): add spec for change retry per-file skip (v1-17)
damusix Jul 12, 2026
4c5de4e
feat(secrets): enforce key format at the StateManager seam
damusix Jul 12, 2026
6890e80
docs(spec): record v1-11 implementation log
damusix Jul 12, 2026
928d862
docs(spec): add v1-14 sdk type surface hardening spec
damusix Jul 12, 2026
6df7718
fix(sdk): remove public _buildFn setter on DbNamespace
damusix Jul 12, 2026
9763eb8
docs(spec): add v1-36 hooks-order spec
damusix Jul 12, 2026
6a78f0b
fix(tui): hoist useStdout above ConfigEditScreen early returns
damusix Jul 12, 2026
b1a8aab
docs(spec): record v1-36 implementation log
damusix Jul 12, 2026
113e39c
feat(sdk): curate 11 explore/teardown types in public exports
damusix Jul 12, 2026
443929c
docs(spec): append implementation log for v1-14
damusix Jul 12, 2026
6819c29
docs(spec): add v1-35 SQLite created-flag spec
damusix Jul 12, 2026
714ede5
fix(db): report created for fresh SQLite creates
damusix Jul 12, 2026
2d6d9f7
docs(spec): add v1-35 implementation log
damusix Jul 12, 2026
f27a67b
feat(change): resume change retry from the failed file
damusix Jul 12, 2026
7788328
test(cli): refresh stale created-flag comment
damusix Jul 12, 2026
24ed7c5
docs(spec): add v1-37 updater flake determinism contract
damusix Jul 12, 2026
4610c34
feat(change): roll back failed postgres changes in a transaction
damusix Jul 12, 2026
ea2bb94
docs(spec): add implementation log for change-retry (v1-17)
damusix Jul 12, 2026
bceb391
refactor(format): consolidate display/string helpers onto voca and lo…
damusix Jul 12, 2026
0711a2e
docs(spec): restructure v1-23-formatting to atomic contract
damusix Jul 12, 2026
20a5fb5
test(update): stabilize flaky download timing tests
damusix Jul 12, 2026
7bcca81
docs(spec): add implementation log to v1-23-formatting
damusix Jul 12, 2026
515f8c5
docs(spec): add v1-37 implementation log
damusix Jul 12, 2026
3283f77
docs(spec): add v1-33 observer relocation spec
damusix Jul 12, 2026
9eb2dbd
refactor(sdk)!: relocate ctx.noorm.observer to noormObserver
damusix Jul 12, 2026
168da07
docs(spec): append implementation log for v1-33
damusix Jul 12, 2026
fb35c7e
test(change): bootstrap noorm schema in pg rollback test
damusix Jul 12, 2026
070195f
docs(spec): record pg integration test verification (v1-17)
damusix Jul 12, 2026
c5d39c8
docs(spec): add v1-26 error-docs alignment spec
damusix Jul 13, 2026
85391a6
docs: align error-handling docs to throw contract
damusix Jul 13, 2026
c593858
docs(spec): append implementation log for v1-26
damusix Jul 13, 2026
fbbbcd2
docs(spec): add v1-39 portschema dedup spec
damusix Jul 13, 2026
fe68e1a
refactor: extract shared PortSchema
damusix Jul 13, 2026
7c4b930
docs(spec): record v1-39 implementation log
damusix Jul 13, 2026
d6927ae
docs(spec): v1-40 ColumnDetail/ParameterDetail curation
damusix Jul 13, 2026
01b2edb
feat(sdk): curate ColumnDetail/ParameterDetail in public exports
damusix Jul 13, 2026
f20e90b
docs(spec): append implementation log for v1-40
damusix Jul 13, 2026
b264367
Merge branch 'v1/40-column-detail' into next
damusix Jul 13, 2026
68fdba2
Merge branch 'v1/35-createdb-flag' into next
damusix Jul 13, 2026
f906f91
Merge branch 'v1/37-updater-flake' into next
damusix Jul 13, 2026
edb6def
Merge branch 'v1/39-portschema' into next
damusix Jul 13, 2026
fd14444
Merge branch 'v1/36-hooks-order' into next
damusix Jul 13, 2026
5492730
Merge branch 'v1/34-sqlite-rewind-date' into next
damusix Jul 13, 2026
2853dc1
Merge branch 'v1/06-json-sweep' into next
damusix Jul 13, 2026
7d87879
Merge branch 'v1/19-lazy-startup' into next
damusix Jul 13, 2026
442ad1a
Merge branch 'v1/03-fk-reenable' into next
damusix Jul 13, 2026
cdf34b6
Merge branch 'v1/04-quote-ddl' into next
damusix Jul 13, 2026
fe3f090
Merge branch 'v1/18-test-db-guard' into next
damusix Jul 13, 2026
85e8b79
Merge branch 'v1/22-trim-surfaces' into next
damusix Jul 13, 2026
662dd88
Merge branch 'v1/27-mit-license' into next
damusix Jul 13, 2026
1760af7
Merge branch 'v1/30-tarball-maps' into next
damusix Jul 13, 2026
b15b6be
Merge branch 'v1/32-session-status' into next
damusix Jul 13, 2026
ac14b0b
Merge branch 'v1/07-sdk-docs-drift' into next
damusix Jul 13, 2026
7cfb8c4
Merge branch 'v1/13-inert-params' into next
damusix Jul 13, 2026
4916e20
Merge branch 'v1/20-secret-hardening' into next
damusix Jul 13, 2026
8bd51ee
Merge branch 'v1/09-dead-purge' into next
damusix Jul 13, 2026
503ffcb
Merge branch 'v1/12-tui-rpc-helpers' into next
damusix Jul 13, 2026
e6238ba
Merge branch 'v1/23-formatting' into next
damusix Jul 13, 2026
2a474b7
Merge branch 'v1/17-change-retry' into next
damusix Jul 13, 2026
c255b94
Merge branch 'v1/21-31-hygiene' into next
damusix Jul 13, 2026
86b6e76
docs(spec): add v1-38 sdk integration coverage spec
damusix Jul 13, 2026
567993c
test(sdk): live-DB throw contract for VaultNamespace
damusix Jul 13, 2026
3306c81
test(dt): bump integration passphrase to satisfy 12-char floor
damusix Jul 13, 2026
2b208c6
test(sdk): live-DB throw contract for TransferNamespace
damusix Jul 13, 2026
8ab5bc0
docs(spec): correct v1-38 checkpoint 3 to verified dt failure modes
damusix Jul 13, 2026
d3a4c3b
test(sdk): live-DB throw contract for DtNamespace
damusix Jul 13, 2026
74a8f9b
test(sdk): isolate getVaultSecret read-path throw in vault suite
damusix Jul 13, 2026
02e0843
docs(followups): defer v1-38-sdk-integration-f-2
damusix Jul 13, 2026
c7990a5
docs(spec): append v1-38 implementation log
damusix Jul 13, 2026
046e2f5
Merge branch 'v1/38-sdk-integration' into next
damusix Jul 13, 2026
a06eb16
chore(followups): regenerate index after v1-38 merge
damusix Jul 13, 2026
bce82df
revert: restore root CNAME (noorm.dev)
damusix Jul 13, 2026
f8dcd6c
docs(spec): add v1-41 dt reader dtz hang spec
damusix Jul 13, 2026
16249f6
fix(dt): forward .dtz stream error to prevent reader hang
damusix Jul 13, 2026
3da7e7d
docs(spec): add v1-28 headless config parity spec
damusix Jul 13, 2026
83e5125
fix(cli): config add/edit exit 1 on stderr, not 0 on stdout
damusix Jul 13, 2026
b92f32e
test(sdk): add .dtz sibling to dt.importFile SDK-boundary case
damusix Jul 13, 2026
b5ddba1
docs(spec): append v1-41 implementation log
damusix Jul 13, 2026
9bb3a18
docs(spec): add v1-15 convention stragglers spec
damusix Jul 13, 2026
5c855d8
refactor(tui): convert last try-catch to attempt()
damusix Jul 13, 2026
bbe62bd
refactor(core): convert TS private to native #private
damusix Jul 13, 2026
817a0d7
feat(cli): headless `config rm <name> --yes`
damusix Jul 13, 2026
10b4e3b
docs(spec): add v1-24-polish-batch spec
damusix Jul 13, 2026
7e7d432
refactor(sdk): reuse ConflictStrategy in ImportOptions
damusix Jul 13, 2026
e1faa6b
fix(env): unify NOORM_DEBUG truthiness via isEnvTruthy
damusix Jul 13, 2026
b4cc4c1
refactor(cli): camelCase citty arg keys in transfer/enroll
damusix Jul 13, 2026
0c46ec1
docs(rules): drop unused export namespace guidance
damusix Jul 13, 2026
be41f52
fix(mcp): stop leaking stack traces to MCP clients
damusix Jul 13, 2026
8385f1b
docs(followups): defer db-transfer-no-fk-negation-collision
damusix Jul 13, 2026
69c590c
docs(spec): append v1-24-polish-batch implementation log
damusix Jul 13, 2026
1f7e3b1
docs(headless): document config rm --yes, fix add/edit claims
damusix Jul 13, 2026
55bab50
Merge branch 'v1/15-convention-stragglers' into next
damusix Jul 13, 2026
9e4b358
Merge branch 'v1/24-polish-batch' into next
damusix Jul 13, 2026
696ef9f
Merge branch 'v1/28-headless-config-parity' into next
damusix Jul 13, 2026
734f7bf
Merge branch 'v1/41-dt-reader-dtz-hang' into next
damusix Jul 13, 2026
30a8161
chore(followups): close v1-38-f-2 (.dtz hang fixed by v1-41)
damusix Jul 13, 2026
d9a3fa3
fix(cli): wire --version to __CLI_VERSION__ define
damusix Jul 13, 2026
2692aa1
fix(tui): normalize sql path seed in run dir picker
damusix Jul 13, 2026
ad7b2ec
fix(examples): llm-pg build include paths are sql-dir-relative
damusix Jul 13, 2026
f8186ce
docs(spec): v1-43 sdk build filtering spec
damusix Jul 13, 2026
e31305d
fix(sdk): run.build honors include/exclude/rules
damusix Jul 13, 2026
af47089
docs(core): fix filterFilesByPaths JSDoc example
damusix Jul 13, 2026
e6c7346
docs(spec): v1-43 implementation log
damusix Jul 13, 2026
c241dab
Merge branch 'v1/43-sdk-build-include' into next
damusix Jul 13, 2026
8f840f1
fix(sdk): keep runBuild discovery-failure contract in filtered build
damusix Jul 13, 2026
2867115
docs(spec): add v1-44 change:rm gate spec
damusix Jul 13, 2026
5dc77c7
feat(policy): add change:rm permission to access matrix
damusix Jul 13, 2026
4f950bd
feat(tui): gate ChangeRemoveScreen behind change:rm policy
damusix Jul 13, 2026
2d0bba5
feat(cli): gate change rm behind change:rm policy
damusix Jul 13, 2026
7a78d85
feat(sdk): gate changes.delete behind change:rm policy
damusix Jul 13, 2026
37cc12f
docs(spec): append v1-44 implementation log
damusix Jul 13, 2026
f893c83
Merge branch 'v1/44-change-rm-gate' into next
damusix Jul 13, 2026
6f622b3
docs(headless): add change:rm to access matrix and change rm section
damusix Jul 13, 2026
b971f2f
chore(docs): remove per-ticket v1 spec files
damusix Jul 14, 2026
a3c4eb6
docs(spec): add v1-45 rewind tiebreak spec
damusix Jul 14, 2026
8f770f8
fix(change): tiebreak rewind sort on history id
damusix Jul 14, 2026
0df96a2
docs(followups): defer v1-45-rewind-tiebreak-f1
damusix Jul 14, 2026
78f9f9a
docs(spec): append v1-45 implementation log
damusix Jul 14, 2026
fe95e87
chore(signals): refresh after v1-45-rewind-tiebreak
damusix Jul 14, 2026
4990ffe
Merge branch 'v1/45-rewind-tiebreak' into next
damusix Jul 14, 2026
a4e55d2
test(change): restore rewind(2) test dropped by spec-cleanup edit
damusix Jul 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .claude/project/followups/CLOSED.md
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
- 2026-06-06 mssql-build-non-idempotent-create-type — "MSSQL build non-idempotent: bare CREATE TYPE blocks db.reset() rebuild" — *(closed 2026-06-06)*
- 2026-07-13 v1-38-sdk-integration-f-2 — "dt reader .dtz bad-path hangs instead of rejecting (unforwarded gunzip stream error)" — *(closed 2026-07-13)*
22 changes: 12 additions & 10 deletions .claude/project/followups/INDEX.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,26 @@

Auto-generated by `atomic followups render`. Do not edit.

Open: 7 • Stale: 0 • Last rendered: 2026-07-08
Open: 10 • Stale: 0 • Last rendered: 2026-07-14

## 📋 plans (1)

- [configurable-sql-function-policy](configurable-sql-function-policy.md) — Configurable per-config SQL function allow/deny list + TUI editor → src/core/policy/classify.ts:79 (DESTRUCTIVE_FUNCTIONS)

## 🟡 risks (4)
## 🟡 risks (6)

- [config-module-scope-env-snapshot](config-module-scope-env-snapshot.md) — Move makeNestedConfig to call-time in config module (37d)
- [downgrade-unprotects-configs](downgrade-unprotects-configs.md) — Downgrade after schemaVersion-2 migration silently unprotects all configs (0d)
- [policy-denial-observability](policy-denial-observability.md) — Policy denials leave no server-side trace; MCP server never inits logger (0d)
- [state-enc-atomic-write-lock](state-enc-atomic-write-lock.md) — state.enc: atomic write + inter-process lock + pre-migration backup (0d)
- [config-module-scope-env-snapshot](config-module-scope-env-snapshot.md) — Move makeNestedConfig to call-time in config module (43d)
- [db-transfer-no-fk-negation-collision](db-transfer-no-fk-negation-collision.md) — citty --no-fk/--no-identity never actually toggle (negation collision) (1d)
- [downgrade-unprotects-configs](downgrade-unprotects-configs.md) — Downgrade after schemaVersion-2 migration silently unprotects all configs (6d)
- [policy-denial-observability](policy-denial-observability.md) — Policy denials leave no server-side trace; MCP server never inits logger (6d)
- [state-enc-atomic-write-lock](state-enc-atomic-write-lock.md) — state.enc: atomic write + inter-process lock + pre-migration backup (6d)
- [v1-45-rewind-tiebreak-f1](v1-45-rewind-tiebreak-f1.md) — rewind tiebreak tests rely on wall-clock timing, not forced tie (0d)

## 🔵 nits (2)

- [debug-process-test-no-assertions](debug-process-test-no-assertions.md) — debug-process.test.ts has no assertions (passes unconditionally) (37d)
- [legacy-protected-removal-trigger](legacy-protected-removal-trigger.md) — Legacy 'protected' input path has no removal trigger; export still mints it (0d)
- [debug-process-test-no-assertions](debug-process-test-no-assertions.md) — debug-process.test.ts has no assertions (passes unconditionally) (43d)
- [legacy-protected-removal-trigger](legacy-protected-removal-trigger.md) — Legacy 'protected' input path has no removal trigger; export still mints it (6d)

## ❓ questions (0)
## ❓ questions (1)

(none)
- [v1-21-31-hygiene-f2](v1-21-31-hygiene-f2.md) — Add release-engine paragraph to ignatius CLAUDE.md (2d)
24 changes: 24 additions & 0 deletions .claude/project/followups/db-transfer-no-fk-negation-collision.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
id: db-transfer-no-fk-negation-collision
title: citty --no-fk/--no-identity never actually toggle (negation collision)
created: "2026-07-13"
origin: |
docs/spec/v1-24-polish-batch.md, iter 1 implementer+reviewer (CP-3)
kind: finding
severity: risk
review_by: "2026-09-11"
status: open
file: src/cli/db/transfer.ts:305-306
---

citty's raw-arg parser unconditionally strips any --no-X argv token and treats
it as negating a flag literally named X, regardless of what is declared. Two of
`db transfer`'s boolean flags are themselves named no-fk/no-identity (now noFk/noIdentity),
so passing --no-fk on the CLI has never set args.noFk to true -- it silently sets an
unrelated, undeclared args.fk = false instead. disableForeignKeys: args.noFk !== true
therefore always evaluates true regardless of the flag. Confirmed empirically both
before and after the v1-24 camelCase rename -- behavior is byte-identical, so that
ticket's "flag surface must not change" bar was met, but the flags have likely never
worked as documented. Needs a dedicated fix: likely renaming away from the no- prefix
pattern (e.g. --skip-fk-check/--skip-identity) or adding explicit non-auto-negated
boolean parsing.
18 changes: 18 additions & 0 deletions .claude/project/followups/v1-21-31-hygiene-f2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
id: v1-21-31-hygiene-f2
title: Add release-engine paragraph to ignatius CLAUDE.md
created: "2026-07-12"
origin: |
docs/spec/v1-21-31-hygiene.md, iter 1 implementer (CP-10)
kind: finding
severity: question
review_by: "2026-09-10"
status: open
file: /Users/alonso/projects/noorm/ignatius/CLAUDE.md
---

Ticket 31 (document release-engine split) asks for a matching paragraph in the ignatius repo's CLAUDE.md stating release-please as its engine and why it fits (conventional-commit-derived changelog, single-package manifest -- unlike monorepo's fixed-version group, which exists to keep two coupled packages in lockstep). Not applied during v1/21-31-hygiene because ignatius is a separate git repo (/Users/alonso/projects/noorm/ignatius) with no worktree isolation or review loop inside that branch's scope.

Verbatim paragraph to add to ignatius/CLAUDE.md:

"Ignatius releases via release-please (conventional-commit-derived changelog, single-package manifest) -- the right fit for a single-package repo, unlike monorepo's fixed-version group which exists specifically to keep two coupled packages in lockstep."
14 changes: 14 additions & 0 deletions .claude/project/followups/v1-45-rewind-tiebreak-f1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
id: v1-45-rewind-tiebreak-f1
title: rewind tiebreak tests rely on wall-clock timing, not forced tie
created: "2026-07-14"
origin: |
docs/spec/v1-45-rewind-tiebreak.md, iter 1 reviewer (checkpoint 1)
kind: finding
severity: risk
review_by: "2026-09-12"
status: open
file: tests/core/change/manager.test.ts:291-316
---

tests/core/change/manager.test.ts:291-316 (new tie-specific test) and the pre-existing test at ~line 250 force an appliedAt tie by relying on two sequential manager.run() calls landing within the same wall-clock second (SQLite CURRENT_TIMESTAMP second-precision), rather than deterministically forcing equal executed_at values. In the rare case the two calls straddle a second boundary, the test would still pass (non-tied ordering is unaffected by the tiebreak fix) but would not actually exercise the new appliedHistoryId tiebreak logic for that run -- false confidence, not a false failure. Fix: force the tie deterministically, e.g. by writing two history rows with an identical executed_at value directly, or by stubbing the clock during the two run() calls in this test file specifically.
6 changes: 1 addition & 5 deletions .claude/rules/tui-development.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ For fixed-position elements (like toast), use fixed width to reserve space and p
Use hooks from `src/tui/hooks/useObserver.ts` for event subscriptions. These handle cleanup automatically.

```tsx
import { useOnEvent, useOnceEvent, useEmit, useEventPromise } from '../hooks/index.js';
import { useOnEvent, useOnceEvent, useEmit } from '../hooks/index.js';

// Subscribe to events - cleanup on unmount
useOnEvent('changeset:complete', (data) => {
Expand All @@ -143,10 +143,6 @@ useOnceEvent('build:complete', (data) => setFinalResult(data), []);
// Emit events via memoized callback
const emitStart = useEmit('build:start');
emitStart({ schemaPath, fileCount });

// Promise-based with state management
const [result, error, pending, cancel] = useEventPromise('build:complete');
if (pending) return <Spinner />;
```


Expand Down
22 changes: 9 additions & 13 deletions .claude/rules/typescript.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,13 @@ If you're going to re-throw the error unchanged in every case, skip `attempt` an

## Error Handling (ZERO TOLERANCE)

- **NEVER use try-catch** - This is a critical violation
- **ALWAYS use @logosdx/utils utilities**: `attempt`, `attemptSync`, `batch`, `circuitBreaker`, `debounce`, `throttle`, `memo`, `rateLimit`, `retry`, `withTimeout`, `ObserverEngine`, `FetchEngine`
- **NEVER use try-catch** - This is a critical violation. The zero tolerance targets try-catch specifically, not throwing or `attempt`/`attemptSync` - see Function Structure above for when to wrap deliberately vs. let errors propagate.
- **Mandated `@logosdx/utils` utilities**: `attempt`/`attemptSync` (the convention actually in use - 553 call sites across 175 files) and `retry` (used at `src/core/connection/factory.ts:93`). Use `attempt`/`attemptSync` per the Function Structure guidance above - only when the function does something with the error.
- **Available in `@logosdx/utils` but not currently used**: `batch`, `circuitBreaker`, `debounce`, `throttle`, `memo`/`memoize`, `rateLimit`, `withTimeout`, `FetchEngine`. Reach for them if a real need arises; they are not mandated because nothing in `src/` imports them today.
- `ObserverEngine` is `@logosdx/observer`, not `@logosdx/utils`.

```typescript
// CORRECT
// CORRECT - attempt() used deliberately: observes the error, emits, then stops
const [result, err] = await attempt(() => db.execute(sql));
if (err) {

Expand All @@ -139,6 +141,9 @@ if (err) {
return;
}

// ALSO CORRECT - nothing to add by wrapping; let the error propagate
return db.execute(sql);

// WRONG - Never do this
try {
const result = await db.execute(sql);
Expand Down Expand Up @@ -264,7 +269,7 @@ assert(condition, 'message', CustomError);

## Class Patterns

Use private fields with `#` prefix. Namespace types under the class.
Use private fields with `#` prefix.

```typescript
export class StateManager {
Expand All @@ -280,15 +285,6 @@ export class StateManager {

}

}

export namespace StateManager {

export interface Config {
name: string;
connection: ConnectionConfig;
}

}
```

Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ jobs:
bun install --frozen-lockfile
cd docs && bun install --frozen-lockfile

- name: Check --json doc placement
run: bun run lint:docs

- name: Build docs
env:
VITEPRESS_BASE: /
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,18 @@ jobs:
- name: Build binaries
run: bun run build:binary

- name: Generate checksums
working-directory: packages/cli/bin
run: |
shasum -a 256 noorm-* > checksums.txt
cat checksums.txt

- name: Upload binaries to release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.version.outputs.tag }}
files: packages/cli/bin/noorm-*
files: |
packages/cli/bin/noorm-*
packages/cli/bin/checksums.txt
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
10 changes: 9 additions & 1 deletion .github/workflows/release-binary.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,18 @@ jobs:
- name: Build binaries
run: bun run build:binary

- name: Generate checksums
working-directory: packages/cli/bin
run: |
shasum -a 256 noorm-* > checksums.txt
cat checksums.txt

- name: Upload binaries to release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.version.outputs.tag }}
files: packages/cli/bin/noorm-*
files: |
packages/cli/bin/noorm-*
packages/cli/bin/checksums.txt
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,15 @@ The integration step needs postgres/mysql/mssql reachable (CI uses service conta

## Changesets

This is a pnpm monorepo with two publishable packages. Changeset frontmatter must reference the correct workspace package name:
This is a bun workspace monorepo with two publishable packages. Changeset frontmatter must reference the correct workspace package name:

- **`@noormdev/cli`** — `packages/cli` (CLI/TUI)
- **`@noormdev/sdk`** — `packages/sdk` (programmatic SDK)

Never use `noorm` or `@noormdev/main` — those are not workspace packages and will fail the Release workflow.

Changesets is the release engine because it supports a fixed-version group: `@noormdev/cli` and `@noormdev/sdk` are coupled packages that always bump together on every release, which fits a two-package monorepo where the packages version in lockstep rather than independently.


## Tech Stack

Expand Down
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Danilo Alonso

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
93 changes: 1 addition & 92 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,101 +17,10 @@ Core SDK is implemented and packaged (`@noormdev/sdk`). Remaining:

### Headless CLI Gaps

40 handlers implemented. Missing commands:

**Database:**

- [x] `db reset` - Teardown + build (idempotent rebuild)
- [x] `db drop` - Drop entire database
- [x] `db create` - Create database if not exists

**Configuration:**

- [x] `config validate` - Validate config can connect
- [x] `config list` - List available configs

**SQL Execution:**

- [x] `sql <query>` - Execute raw SQL
- [x] `sql -f <file>` - Execute SQL from file

**Changes:**

- [x] `change next` - Apply next pending change

**Runner:**

- [x] `run files <path...>` - Run multiple specific files
- [x] `run exec` - Batch-execute selected SQL files (currently TUI-only `RunExecScreen`)


### TUI Parity Gaps

Surfaces that exist in the TUI but have no headless CLI equivalent. Discovered after the citty migration audit. Blocks CI/CD adoption for anything beyond `change`/`run`/`vault` workflows.

**Identity:** (entire domain TUI-only — no `noorm identity` command)

- [x] **CI provisioning + runtime** — full `noorm ci` namespace for CI/CD:
- `noorm ci identity new` — generate a local keypair + env block for test CI
- `noorm ci identity enroll --config <name>` — generate + register identity in a prod DB's `identities` table with vault propagation
- `noorm ci init` — bootstrap ephemeral state.enc from env vars (identity + connection)
- `noorm ci secrets --file <path>` — batch-load secrets from dotenv file into active config's vault
- Absorbs and removes the former `noorm identity ci` diagnostic
- [x] `identity init` - Generate or regenerate an identity headlessly
- [x] `identity edit` - Edit identity metadata (name, email)
- [x] `identity export` - Export public key
- [x] `identity list` - List known users

**Init:**

- [x] `noorm init` - Bootstrap a project (identity setup + project setup) from CLI

**Settings:** (entire domain TUI-only — no `noorm settings` command)

- [x] `settings init` - Initialize `settings.yml`
- [x] `settings build` - Build/regenerate settings
- [x] `settings edit` - Interactive editor. Prompts for a field to edit (paths, strict, logging, stages, rules), applies the change, then loops back to the field picker. Exits on "Done" selection or `Esc`. One command covers everything.
- [x] `settings secret` - Interactive secret **requirement** declaration (config enforcement, not value storage). Declares that a given secret must be set for a particular stage (or all stages). Loop pattern: pick action (add/edit/rm requirement), pick scope (universal or a stage), apply, loop. Exits on "Done" or `Esc`. Actual secret values live in `secret/*` / vault.

**Secrets:** (entire `secret/*` domain TUI-only — distinct from `vault`)

- [x] `secret list` - List secrets
- [x] `secret set <key> <value>` - Set a secret
- [x] `secret rm <key>` - Remove a secret

**Configuration (additional):**

- [x] `config cp <src> <dest>` - Copy a config
- [x] `config export <name>` - Export a config to file
- [x] `config import <path>` - Import a config from file

**Changes (additional):**

- [x] `change add <name>` - Create a new change
- [x] `change edit <name>` - Edit an existing change
- [x] `change rm <name>` - Delete a change
- [x] `change rewind <name>` - Rewind to a specific change
- [x] `change history detail <name>` - Show per-file execution history

**Database (additional):**
All headless CLI commands are implemented except one:

- [ ] `db dt-modify <path>` - Modify a `.dt` file (currently only TUI `DtModifyScreen`)

**Database Exploration:**

- [x] `db explore views` + `db explore views <name>` - List and inspect views
- [x] `db explore procedures` + `db explore procedures <name>` - List and inspect stored procedures
- [x] `db explore functions` + `db explore functions <name>` - List and inspect functions
- [x] `db explore types` + `db explore types <name>` - List and inspect custom types
- [x] `db explore indexes` - List indexes
- [x] `db explore fks` - List foreign keys

**SQL Terminal:** (CLI `sql` is one-shot only)

- [x] `sql repl` - Interactive SQL REPL (currently TUI-only `SqlTerminalScreen`)
- [x] `sql history` - Show SQL execution history
- [x] `sql clear` - Clear SQL execution history


### CI/CD Integration

Expand Down
Binary file modified bun.lockb
Binary file not shown.
File renamed without changes.
4 changes: 2 additions & 2 deletions docs/cli/identity.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Print your public key so teammates can add you to encrypted vaults:

```bash
noorm identity export
noorm --json identity export
noorm identity export --json
```


Expand All @@ -54,7 +54,7 @@ Show every identity discovered from database syncs (the audit trail of who has t

```bash
noorm identity list
noorm --json identity list
noorm identity list --json
```


Expand Down
Loading
Loading