@north-light/crouter 0.3.318 → 0.3.320
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/README.md +0 -3
- package/dist/api/client.js +2 -912
- package/dist/api/dto/attach.js +0 -13
- package/dist/api/dto/bash-jobs.js +1 -9
- package/dist/api/dto/broker-ops.js +0 -6
- package/dist/api/dto/broker.js +0 -20
- package/dist/api/dto/canvas.js +0 -2
- package/dist/api/dto/chat-inventory.js +0 -11
- package/dist/api/dto/common.js +1 -15
- package/dist/api/dto/config.js +0 -3
- package/dist/api/dto/crons.js +1 -10
- package/dist/api/dto/files.js +0 -7
- package/dist/api/dto/focus.js +0 -10
- package/dist/api/dto/health.js +0 -2
- package/dist/api/dto/human-requests.js +0 -4
- package/dist/api/dto/human.js +0 -4
- package/dist/api/dto/inbox.js +0 -4
- package/dist/api/dto/lifecycle.js +0 -3
- package/dist/api/dto/mail.js +0 -1
- package/dist/api/dto/memory.js +0 -6
- package/dist/api/dto/messages.js +0 -2
- package/dist/api/dto/model-config.js +0 -1
- package/dist/api/dto/modelauth.js +0 -4
- package/dist/api/dto/node-outcomes.js +0 -2
- package/dist/api/dto/nodes.js +0 -3
- package/dist/api/dto/profiles.js +1 -4
- package/dist/api/dto/recovery.js +0 -1
- package/dist/api/dto/reports.js +0 -2
- package/dist/api/dto/review-comments.js +0 -5
- package/dist/api/dto/reviews.js +0 -5
- package/dist/api/dto/subscriptions.js +0 -2
- package/dist/api/dto/worktree.js +0 -6
- package/dist/api/errors.js +1 -40
- package/dist/api/index.js +1 -33
- package/dist/api/plugin-manifest-schema.js +0 -23
- package/dist/api/routes.js +1 -147
- package/dist/build-root.js +1 -198
- package/dist/cli.js +3 -99
- package/dist/clients/attach/ansi-cells.js +1 -137
- package/dist/clients/attach/chrome/bash-jobs.js +1 -31
- package/dist/clients/attach/chrome/canvas-panels.js +1 -194
- package/dist/clients/attach/chrome/completion-bell.js +1 -89
- package/dist/clients/attach/chrome/cron-wait.js +1 -34
- package/dist/clients/attach/chrome/git-info.js +2 -44
- package/dist/clients/attach/chrome/header.js +1 -30
- package/dist/clients/attach/chrome/inbox-strip.js +1 -199
- package/dist/clients/attach/chrome/recap.js +1 -19
- package/dist/clients/attach/chrome/review-wait.js +1 -22
- package/dist/clients/attach/chrome/roster.js +4 -275
- package/dist/clients/attach/chrome/status-line.js +1 -117
- package/dist/clients/attach/chrome/ticket-panel.js +1 -280
- package/dist/clients/attach/chrome/widgets.js +1 -51
- package/dist/clients/attach/command.js +1 -107
- package/dist/clients/attach/config.js +1 -274
- package/dist/clients/attach/input/capabilities.js +1 -104
- package/dist/clients/attach/input/clipboard-image.js +3 -220
- package/dist/clients/attach/input/completion-frecency.js +1 -141
- package/dist/clients/attach/input/controller.js +7 -377
- package/dist/clients/attach/input/overlay-owner.js +1 -199
- package/dist/clients/attach/input/ref-autocomplete.js +2 -176
- package/dist/clients/attach/input/titled-editor.js +4 -859
- package/dist/clients/attach/overlays/auth.js +2 -271
- package/dist/clients/attach/overlays/dialogs.js +2 -102
- package/dist/clients/attach/overlays/file-review.js +2 -128
- package/dist/clients/attach/overlays/graph.js +1 -661
- package/dist/clients/attach/overlays/help.js +1 -211
- package/dist/clients/attach/overlays/mcp.js +1 -302
- package/dist/clients/attach/overlays/pickers.js +1 -163
- package/dist/clients/attach/render/activity-slot.js +1 -13
- package/dist/clients/attach/render/assistant-message.js +1 -56
- package/dist/clients/attach/render/card-presentation.js +5 -218
- package/dist/clients/attach/render/chat-view.js +5 -1708
- package/dist/clients/attach/render/condensed-history.js +1 -60
- package/dist/clients/attach/render/context-message.js +1 -63
- package/dist/clients/attach/render/crtr-output.js +17 -905
- package/dist/clients/attach/render/diagram.js +7 -111
- package/dist/clients/attach/render/edit-diff.js +5 -304
- package/dist/clients/attach/render/glyph-codepoints.js +1 -42
- package/dist/clients/attach/render/group-activity.js +2 -263
- package/dist/clients/attach/render/group-recap.js +1 -152
- package/dist/clients/attach/render/markdown-source.js +5 -266
- package/dist/clients/attach/render/measured-container.js +1 -322
- package/dist/clients/attach/render/page-block.js +1 -183
- package/dist/clients/attach/render/scroll-animation.js +1 -80
- package/dist/clients/attach/render/tool-calls.js +3 -361
- package/dist/clients/attach/render/transcript-copy.js +2 -81
- package/dist/clients/attach/render/transcript-search.js +1 -152
- package/dist/clients/attach/render/viewport.js +1 -184
- package/dist/clients/attach/session/banner.js +1 -29
- package/dist/clients/attach/session/bindings.js +1 -71
- package/dist/clients/attach/session/chrome-refresh.js +1 -94
- package/dist/clients/attach/session/connection.js +1 -186
- package/dist/clients/attach/session/context.js +0 -16
- package/dist/clients/attach/session/editor-frame.js +1 -142
- package/dist/clients/attach/session/editor-inventory.js +6 -160
- package/dist/clients/attach/session/file-links.js +1 -68
- package/dist/clients/attach/session/focus-events.js +1 -12
- package/dist/clients/attach/session/frame.js +1 -214
- package/dist/clients/attach/session/frames.js +1 -188
- package/dist/clients/attach/session/identity.js +1 -26
- package/dist/clients/attach/session/input-wiring.js +1 -140
- package/dist/clients/attach/session/invariant.js +1 -15
- package/dist/clients/attach/session/keys.js +1 -77
- package/dist/clients/attach/session/layout.js +1 -59
- package/dist/clients/attach/session/mouse.js +1 -78
- package/dist/clients/attach/session/pane-focus.js +1 -42
- package/dist/clients/attach/session/pane-tag.js +1 -112
- package/dist/clients/attach/session/pi-assets.js +1 -24
- package/dist/clients/attach/session/pi-oauth-flows.js +1 -21
- package/dist/clients/attach/session/profile-files.js +1 -228
- package/dist/clients/attach/session/reconnect.js +1 -175
- package/dist/clients/attach/session/selection.js +3 -108
- package/dist/clients/attach/session/state-sync.js +1 -67
- package/dist/clients/attach/session/surface-frame.js +1 -73
- package/dist/clients/attach/session/surface-host.js +1 -255
- package/dist/clients/attach/session/teardown.js +5 -94
- package/dist/clients/attach/session/transcript-search.js +3 -151
- package/dist/clients/attach/session/whip-achievements.js +2 -145
- package/dist/clients/attach/session/whip.js +1 -362
- package/dist/clients/attach/slash/dispatch.js +1 -706
- package/dist/clients/attach/slash/prompt-preview.js +1 -121
- package/dist/clients/attach/viewer.js +441 -441
- package/dist/clients/conversation/projection.js +1 -324
- package/dist/clients/conversation/submit.js +1 -51
- package/dist/clients/inbox/controller.js +1 -701
- package/dist/clients/inbox/dto-adapt.js +1 -93
- package/dist/clients/inbox/layout.js +1 -9
- package/dist/clients/inbox/page-adapter.js +1 -55
- package/dist/clients/inbox/resolve.js +1 -35
- package/dist/clients/inbox/review/anchors.js +1 -89
- package/dist/clients/inbox/review/comments-client.js +1 -98
- package/dist/clients/inbox/review/companion-pane.js +1 -82
- package/dist/clients/inbox/review/document-surface.js +2 -1188
- package/dist/clients/inbox/review/frame.js +1 -216
- package/dist/clients/inbox/review/keys.js +1 -123
- package/dist/clients/inbox/review/launch.js +1 -151
- package/dist/clients/inbox/review/live-source.js +1 -160
- package/dist/clients/inbox/review/nvim.js +1 -44
- package/dist/clients/inbox/review/remap.js +1 -157
- package/dist/clients/inbox/review/review-client.js +1 -123
- package/dist/clients/inbox/review/roundtrip.js +3 -36
- package/dist/clients/inbox/review/state.js +4 -315
- package/dist/clients/inbox/review-adapter.js +1 -43
- package/dist/clients/inbox/surface.js +1 -152
- package/dist/clients/inbox/tui/ansi.js +3 -321
- package/dist/clients/inbox/tui/input.js +5 -392
- package/dist/clients/inbox/tui/keys.js +1 -104
- package/dist/clients/inbox/tui/page-body.js +1 -66
- package/dist/clients/inbox/tui/panel.js +1 -84
- package/dist/clients/inbox/tui/render.js +2 -368
- package/dist/clients/inbox/tui/slots.js +3 -134
- package/dist/clients/inbox/tui/types.js +0 -1
- package/dist/clients/inbox/tui.js +1 -86
- package/dist/clients/surfaces/host.js +0 -1
- package/dist/commands/api-client.js +4 -290
- package/dist/commands/attention.js +1 -215
- package/dist/commands/canvas-browse.js +1 -70
- package/dist/commands/canvas-config.js +2 -192
- package/dist/commands/canvas-history/grep.js +7 -85
- package/dist/commands/canvas-history/read.js +3 -50
- package/dist/commands/canvas-history/search.js +10 -99
- package/dist/commands/canvas-history/shared.js +1 -139
- package/dist/commands/canvas-history/stats.js +6 -68
- package/dist/commands/canvas-history.js +1 -32
- package/dist/commands/canvas-issue.js +14 -149
- package/dist/commands/canvas-prune.js +1 -108
- package/dist/commands/canvas-roster.js +1 -69
- package/dist/commands/canvas-snapshot.js +1 -34
- package/dist/commands/canvas-use.js +1 -61
- package/dist/commands/canvas.js +1 -49
- package/dist/commands/chord.js +1 -241
- package/dist/commands/cron.js +11 -534
- package/dist/commands/dashboard.js +1 -85
- package/dist/commands/human/components.js +3 -77
- package/dist/commands/human/feedback.js +1 -112
- package/dist/commands/human/prompts.js +1 -331
- package/dist/commands/human/queue.js +1 -191
- package/dist/commands/human/request.js +1 -266
- package/dist/commands/human/review.js +1 -288
- package/dist/commands/human/shared.js +1 -67
- package/dist/commands/human.js +4 -60
- package/dist/commands/memory/delete.js +1 -100
- package/dist/commands/memory/edit.js +21 -219
- package/dist/commands/memory/find.js +2 -244
- package/dist/commands/memory/history.js +5 -199
- package/dist/commands/memory/lint.js +1 -107
- package/dist/commands/memory/list.js +1 -142
- package/dist/commands/memory/move.js +1 -223
- package/dist/commands/memory/origin.js +1 -130
- package/dist/commands/memory/read.js +6 -232
- package/dist/commands/memory/shared.js +12 -802
- package/dist/commands/memory/write.js +13 -235
- package/dist/commands/memory.js +1 -30
- package/dist/commands/node/bash.js +5 -245
- package/dist/commands/node/create.js +3 -332
- package/dist/commands/node/inspect.js +12 -300
- package/dist/commands/node/lifecycle.js +2 -453
- package/dist/commands/node/message.js +1 -161
- package/dist/commands/node/outcome.js +4 -134
- package/dist/commands/node/pyramid.js +2 -79
- package/dist/commands/node/subscription.js +1 -78
- package/dist/commands/node/wait.js +7 -163
- package/dist/commands/node-context.js +2 -159
- package/dist/commands/node-inspect-artifacts.js +8 -109
- package/dist/commands/node-lifecycle-revive.js +1 -217
- package/dist/commands/node-snapshot.js +1 -37
- package/dist/commands/node-transcript.js +1 -62
- package/dist/commands/node-worktree.js +1 -138
- package/dist/commands/node.js +1 -29
- package/dist/commands/pkg/browse/actions.js +1 -198
- package/dist/commands/pkg/browse/catalog.js +1 -466
- package/dist/commands/pkg/browse/command-view.js +1 -191
- package/dist/commands/pkg/browse/detail-panel.js +1 -402
- package/dist/commands/pkg/browse/doc-view.js +1 -89
- package/dist/commands/pkg/browse/list-panel.js +2 -168
- package/dist/commands/pkg/browse/model.js +1 -36
- package/dist/commands/pkg/browse/shell.js +1 -640
- package/dist/commands/pkg/browse.js +1 -27
- package/dist/commands/pkg/market-inspect.js +1 -141
- package/dist/commands/pkg/market-manage.js +1 -327
- package/dist/commands/pkg/market.js +1 -14
- package/dist/commands/pkg/plugin-inspect.js +1 -168
- package/dist/commands/pkg/plugin-manage.js +17 -1109
- package/dist/commands/pkg/plugin.js +1 -14
- package/dist/commands/pkg/shared.js +1 -62
- package/dist/commands/pkg.js +1 -21
- package/dist/commands/profile/default.js +1 -139
- package/dist/commands/profile/delete.js +1 -66
- package/dist/commands/profile/env.js +3 -188
- package/dist/commands/profile/kind.js +2 -35
- package/dist/commands/profile/list.js +1 -43
- package/dist/commands/profile/meta.js +1 -67
- package/dist/commands/profile/new.js +1 -115
- package/dist/commands/profile/pause.js +1 -59
- package/dist/commands/profile/project.js +1 -113
- package/dist/commands/profile/rename.js +1 -38
- package/dist/commands/profile/show.js +1 -52
- package/dist/commands/profile.js +1 -35
- package/dist/commands/push.js +9 -265
- package/dist/commands/revive.js +10 -181
- package/dist/commands/surface/node/cycle.js +1 -83
- package/dist/commands/surface/node/focus.js +1 -81
- package/dist/commands/surface/node/id.js +1 -38
- package/dist/commands/surface/node/pin.js +1 -42
- package/dist/commands/surface/node/placement.js +1 -134
- package/dist/commands/surface-edit.js +1 -157
- package/dist/commands/surface-inbox.js +1 -98
- package/dist/commands/surface-inspect.js +1 -39
- package/dist/commands/surface-node.js +1 -19
- package/dist/commands/surface-reload.js +2 -134
- package/dist/commands/surface-tmux-spread.js +1 -214
- package/dist/commands/surface.js +1 -28
- package/dist/commands/sys/branch.js +1 -19
- package/dist/commands/sys/config.js +1 -353
- package/dist/commands/sys/context/admin/actions.js +2 -246
- package/dist/commands/sys/context/admin/detail-panel.js +1 -247
- package/dist/commands/sys/context/admin/docs-panel.js +1 -191
- package/dist/commands/sys/context/admin/list-view.js +1 -183
- package/dist/commands/sys/context/admin/model.js +1 -229
- package/dist/commands/sys/context/admin/rail-panel.js +1 -227
- package/dist/commands/sys/context/admin/read-view.js +2 -194
- package/dist/commands/sys/context/admin/shell.js +1 -910
- package/dist/commands/sys/context/admin.js +2 -126
- package/dist/commands/sys/context/doc.js +3 -197
- package/dist/commands/sys/context/prompt-review.js +11 -291
- package/dist/commands/sys/context/resolve.js +10 -489
- package/dist/commands/sys/context/sysprompt.js +5 -96
- package/dist/commands/sys/context.js +1 -20
- package/dist/commands/sys/daemon.js +1 -313
- package/dist/commands/sys/doctor.js +1 -617
- package/dist/commands/sys/feedback.js +7 -228
- package/dist/commands/sys/logs.js +3 -129
- package/dist/commands/sys/migrate.js +1 -94
- package/dist/commands/sys/panels/broker-limits-panel.js +2 -110
- package/dist/commands/sys/panels/dependencies-panel.js +1 -80
- package/dist/commands/sys/panels/keybindings-panel.js +1 -703
- package/dist/commands/sys/panels/models-panel.js +1 -1133
- package/dist/commands/sys/panels/plugins-panel.js +1 -80
- package/dist/commands/sys/panels/prefs-panel.js +1 -85
- package/dist/commands/sys/panels/profiles-panel.js +1 -601
- package/dist/commands/sys/panels/provider-panel.js +1 -538
- package/dist/commands/sys/settings-shell.js +1 -400
- package/dist/commands/sys/settings.js +1 -46
- package/dist/commands/sys/setup-core.js +6 -579
- package/dist/commands/sys/setup-settings-runner.js +1 -16
- package/dist/commands/sys/setup-wizard.js +1 -279
- package/dist/commands/sys/setup.js +1 -34
- package/dist/commands/sys/shared.js +1 -81
- package/dist/commands/sys/support/prepare.js +3 -239
- package/dist/commands/sys/support/submit.js +6 -524
- package/dist/commands/sys/support.js +1 -18
- package/dist/commands/sys/sync-deps.js +15 -498
- package/dist/commands/sys/sync-project-guidance.js +4 -481
- package/dist/commands/sys/sync-shared.js +1 -49
- package/dist/commands/sys/sync-skills.js +2 -311
- package/dist/commands/sys/sync.js +1 -18
- package/dist/commands/sys/update.js +1 -147
- package/dist/commands/sys/worktrees.js +5 -53
- package/dist/commands/sys.js +1 -18
- package/dist/core/activity-signal.js +2 -38
- package/dist/core/asset-root.js +1 -18
- package/dist/core/auth-file.js +2 -179
- package/dist/core/auth-interaction.js +3 -94
- package/dist/core/auto-update.js +4 -94
- package/dist/core/bash-guard.js +11 -393
- package/dist/core/bash-jobs.js +7 -411
- package/dist/core/bootstrap.js +2 -53
- package/dist/core/broker-client/client.js +1 -184
- package/dist/core/broker-client/index.js +1 -13
- package/dist/core/broker-client/transport-relay.js +1 -157
- package/dist/core/broker-client/transport-socket.js +1 -179
- package/dist/core/broker-client/transport.js +1 -26
- package/dist/core/canvas/attention.js +1 -47
- package/dist/core/canvas/boot-id.js +1 -26
- package/dist/core/canvas/boot.js +1 -186
- package/dist/core/canvas/browse/app.js +3 -919
- package/dist/core/canvas/browse/model.js +1 -477
- package/dist/core/canvas/browse/pins.js +1 -29
- package/dist/core/canvas/browse/render.js +3 -1055
- package/dist/core/canvas/canvas.js +15 -922
- package/dist/core/canvas/crons.js +11 -481
- package/dist/core/canvas/daemon-owner.js +2 -146
- package/dist/core/canvas/db.js +2 -100
- package/dist/core/canvas/deliveries.js +22 -283
- package/dist/core/canvas/delivery-contract.js +1 -8
- package/dist/core/canvas/executions.js +1 -68
- package/dist/core/canvas/extensions.js +1 -83
- package/dist/core/canvas/focuses.js +1 -77
- package/dist/core/canvas/history.js +24 -860
- package/dist/core/canvas/index.js +1 -15
- package/dist/core/canvas/install-id.js +1 -84
- package/dist/core/canvas/labels.js +1 -43
- package/dist/core/canvas/meta-file.js +1 -89
- package/dist/core/canvas/migrations.js +41 -1150
- package/dist/core/canvas/nav-model.js +1 -231
- package/dist/core/canvas/nav-render.js +1 -260
- package/dist/core/canvas/node-order.js +1 -37
- package/dist/core/canvas/node-recap.js +2 -67
- package/dist/core/canvas/node-sql-migration.js +2 -209
- package/dist/core/canvas/paths.js +1 -153
- package/dist/core/canvas/pid.js +4 -683
- package/dist/core/canvas/recovery.js +3 -565
- package/dist/core/canvas/remote-canvas-source.js +1 -288
- package/dist/core/canvas/remote-transport.js +1 -57
- package/dist/core/canvas/render-source.js +10 -635
- package/dist/core/canvas/sessions.js +1 -78
- package/dist/core/canvas/source.js +1 -47
- package/dist/core/canvas/status-glyph.js +1 -132
- package/dist/core/canvas/telemetry.js +1 -35
- package/dist/core/canvas/types.js +1 -6
- package/dist/core/canvas/waits.js +4 -68
- package/dist/core/canvas/worktrees.js +1 -93
- package/dist/core/clipboard-text.js +1 -57
- package/dist/core/command-hooks/artifact.js +1 -145
- package/dist/core/command-hooks/catalog.js +1 -38
- package/dist/core/command-hooks/compose.js +1 -99
- package/dist/core/command-hooks/discovery.js +1 -228
- package/dist/core/command-hooks/help.js +1 -18
- package/dist/core/command-hooks/index.js +1 -7
- package/dist/core/command-hooks/lifecycle-catalog.js +1 -9
- package/dist/core/command-hooks/lifecycle-create.js +1 -51
- package/dist/core/command-hooks/report.js +1 -28
- package/dist/core/command-hooks/schema.js +1 -157
- package/dist/core/command-hooks/transport/exec-invoke.js +1 -276
- package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -211
- package/dist/core/command-manifests/manifest.js +1 -324
- package/dist/core/command-manifests/registry.js +1 -118
- package/dist/core/command-manifests/schema.js +1 -736
- package/dist/core/command-plugins/bundle.js +1 -261
- package/dist/core/command-plugins/compose.js +1 -65
- package/dist/core/command-plugins/discovery.js +1 -245
- package/dist/core/command-plugins/endpoint.js +1 -48
- package/dist/core/command-plugins/extensions.js +1 -166
- package/dist/core/command-plugins/help-addenda.js +1 -44
- package/dist/core/command-plugins/presence.js +1 -17
- package/dist/core/command-plugins/revalidate.js +2 -152
- package/dist/core/command-plugins/transport/exec-invoke.js +1 -215
- package/dist/core/command-plugins/transport/http-fetch.js +1 -68
- package/dist/core/command-plugins/transport/http-invoke.js +3 -546
- package/dist/core/command.js +10 -739
- package/dist/core/config.js +1 -1059
- package/dist/core/document-lines.js +3 -6
- package/dist/core/env-name.js +1 -9
- package/dist/core/errors.js +1 -52
- package/dist/core/events/emit.js +1 -17
- package/dist/core/events/envelope.js +1 -84
- package/dist/core/events/errors.js +1 -69
- package/dist/core/events/index.js +1 -4
- package/dist/core/events/operation-id.js +1 -24
- package/dist/core/events/read.js +1 -623
- package/dist/core/events/serialize.js +1 -199
- package/dist/core/events/source.js +1 -31
- package/dist/core/events/types.js +1 -11
- package/dist/core/exclusive-lock.js +1 -197
- package/dist/core/fault-classifier.js +1 -96
- package/dist/core/feed/feed.js +7 -202
- package/dist/core/feed/inbox-migrate.js +3 -135
- package/dist/core/feed/inbox.js +10 -122
- package/dist/core/feed/messages.js +6 -212
- package/dist/core/frontmatter.js +1 -35
- package/dist/core/fs-utils.js +3 -202
- package/dist/core/git.js +2 -103
- package/dist/core/help.js +9 -310
- package/dist/core/host-exports/builtins.js +9 -68
- package/dist/core/host-exports/export.js +3 -124
- package/dist/core/human/action-binding.js +1 -40
- package/dist/core/human/answer-text.js +5 -100
- package/dist/core/human/answer.js +1 -119
- package/dist/core/human/claim.js +3 -67
- package/dist/core/human/completion.js +1 -27
- package/dist/core/human/component-docs.js +78 -272
- package/dist/core/human/convention.js +2 -82
- package/dist/core/human/feedback-companion.js +1 -106
- package/dist/core/human/feedback.js +1 -88
- package/dist/core/human/page-authoring.js +1 -19
- package/dist/core/human/page-catalog.js +1 -172
- package/dist/core/human/page-errors.js +1 -7
- package/dist/core/human/page-eval.js +1 -125
- package/dist/core/human/page-html-markdown.js +8 -260
- package/dist/core/human/page-markdown.js +17 -295
- package/dist/core/human/page-schema.js +1 -373
- package/dist/core/human/page-synth.js +8 -27
- package/dist/core/human/page.js +1 -198
- package/dist/core/human/requests.js +15 -466
- package/dist/core/human/review-schema.js +1 -34
- package/dist/core/human/root.js +1 -11
- package/dist/core/human/scan.js +1 -69
- package/dist/core/human/summary.js +1 -5
- package/dist/core/human/tickets.js +1 -171
- package/dist/core/human/types.js +0 -1
- package/dist/core/human/visible-paths.js +1 -77
- package/dist/core/human-actions.js +1 -101
- package/dist/core/inspector/chrome.js +1 -14
- package/dist/core/inspector/contract.js +0 -1
- package/dist/core/inspector/core.js +2 -295
- package/dist/core/inspector/host.js +4 -538
- package/dist/core/inspector/model.js +2 -226
- package/dist/core/inspector/text.js +6 -45
- package/dist/core/inspector/transport.js +1 -36
- package/dist/core/inspector/tui.js +2 -295
- package/dist/core/installed-plugins.js +1 -78
- package/dist/core/io.js +7 -356
- package/dist/core/keybindings/attach-control.js +1 -42
- package/dist/core/keybindings/background-bash.js +1 -33
- package/dist/core/keybindings/catalog.js +1 -256
- package/dist/core/keybindings/inbox.js +1 -25
- package/dist/core/keybindings/index.js +1 -7
- package/dist/core/keybindings/match.js +1 -127
- package/dist/core/keybindings/persistence.js +1 -49
- package/dist/core/keybindings/resolve.js +1 -348
- package/dist/core/keybindings/types.js +0 -1
- package/dist/core/locked-file.js +1 -118
- package/dist/core/log.js +3 -27
- package/dist/core/manifest-recovery.js +1 -72
- package/dist/core/manifest-stale.js +1 -39
- package/dist/core/manifest.js +1 -20
- package/dist/core/memory/doc-link-grammar.js +2 -109
- package/dist/core/memory/extensions.js +1 -221
- package/dist/core/memory/history.js +6 -268
- package/dist/core/memory/identity.js +1 -181
- package/dist/core/memory/inline-ref-grammar.js +1 -98
- package/dist/core/memory/inline-ref-guidance.js +2 -35
- package/dist/core/memory/inline-ref-inventory.js +1 -59
- package/dist/core/memory/lint.js +2 -671
- package/dist/core/memory/project-namespace.js +2 -85
- package/dist/core/memory/repository-association.js +1 -129
- package/dist/core/memory/tree.js +1 -93
- package/dist/core/memory-resolver.js +2 -611
- package/dist/core/model-config.js +1 -107
- package/dist/core/model-routes.js +1 -201
- package/dist/core/nested-stores.js +2 -166
- package/dist/core/output.js +7 -99
- package/dist/core/pagination.js +1 -88
- package/dist/core/plugin-swap-lock.js +1 -31
- package/dist/core/pool-credential-store.js +1 -116
- package/dist/core/predicate.js +1 -191
- package/dist/core/preview-registry.js +2 -411
- package/dist/core/preview-result-path.js +1 -26
- package/dist/core/profiles/default-binding.js +1 -24
- package/dist/core/profiles/deletion-reservation.js +1 -42
- package/dist/core/profiles/env-store.js +2 -162
- package/dist/core/profiles/fuzzy-match.js +1 -92
- package/dist/core/profiles/manifest.js +1 -574
- package/dist/core/profiles/select.js +35 -741
- package/dist/core/profiles/state-block.js +3 -17
- package/dist/core/provider-error-recognition.js +1 -74
- package/dist/core/provider-failure.js +1 -86
- package/dist/core/provider-management.js +1 -22
- package/dist/core/remote-canvas-target.js +1 -30
- package/dist/core/render.js +18 -138
- package/dist/core/resolver.js +1 -111
- package/dist/core/review/birth.js +1 -52
- package/dist/core/review/comments.js +5 -279
- package/dist/core/review/companion.js +1 -215
- package/dist/core/review/document.js +2 -138
- package/dist/core/review/project.js +1 -36
- package/dist/core/review/realize.js +1 -71
- package/dist/core/review/remap.js +4 -141
- package/dist/core/review/signal.js +1 -12
- package/dist/core/review/stage.js +1 -184
- package/dist/core/review/store.js +1 -168
- package/dist/core/review/types.js +1 -23
- package/dist/core/runtime/advertised-command-invocation.js +1 -233
- package/dist/core/runtime/auth-reload.js +1 -67
- package/dist/core/runtime/banner.js +1 -51
- package/dist/core/runtime/bearings-render.js +18 -250
- package/dist/core/runtime/bearings.js +7 -194
- package/dist/core/runtime/bin-contributions.js +2 -186
- package/dist/core/runtime/boot-root.js +1 -107
- package/dist/core/runtime/branded-host.js +2 -264
- package/dist/core/runtime/broker/auth-reload.js +1 -157
- package/dist/core/runtime/broker/client-registry.js +1 -179
- package/dist/core/runtime/broker/daemon-ops.js +1 -88
- package/dist/core/runtime/broker/engine-drive.js +1 -354
- package/dist/core/runtime/broker/engine-routing.js +1 -211
- package/dist/core/runtime/broker/event-projection.js +1 -193
- package/dist/core/runtime/broker/extension-abort.js +1 -36
- package/dist/core/runtime/broker/fault-retry.js +1 -588
- package/dist/core/runtime/broker/frame-client.js +1 -132
- package/dist/core/runtime/broker/frame-dispatch.js +1 -183
- package/dist/core/runtime/broker/frame-engine-control.js +1 -231
- package/dist/core/runtime/broker/frame-memory-refs.js +1 -41
- package/dist/core/runtime/broker/frame-model-query.js +1 -69
- package/dist/core/runtime/broker/frame-read.js +1 -116
- package/dist/core/runtime/broker/frame-replies.js +1 -64
- package/dist/core/runtime/broker/frame-session.js +4 -203
- package/dist/core/runtime/broker/held-deferred-inbox.js +1 -13
- package/dist/core/runtime/broker/inbox.js +13 -163
- package/dist/core/runtime/broker/node-named.js +1 -27
- package/dist/core/runtime/broker/read-ops.js +1 -171
- package/dist/core/runtime/broker/rebind.js +1 -318
- package/dist/core/runtime/broker/tool-groups.js +1 -246
- package/dist/core/runtime/broker/turn-admission.js +1 -31
- package/dist/core/runtime/broker/turn-ignition.js +1 -84
- package/dist/core/runtime/broker-cli.js +3 -81
- package/dist/core/runtime/broker-extension-render.js +5 -135
- package/dist/core/runtime/broker-inventory.js +1 -116
- package/dist/core/runtime/broker-persona-guidance.js +4 -154
- package/dist/core/runtime/broker-protocol.js +3 -152
- package/dist/core/runtime/broker-request.js +1 -85
- package/dist/core/runtime/broker-sdk.js +1 -129
- package/dist/core/runtime/broker.js +1 -1214
- package/dist/core/runtime/canvas-extensions.js +1 -96
- package/dist/core/runtime/chat-inventory-rows.js +1 -105
- package/dist/core/runtime/close.js +1 -265
- package/dist/core/runtime/command-expansion.js +9 -104
- package/dist/core/runtime/command-surface.js +1 -117
- package/dist/core/runtime/connectivity.js +1 -73
- package/dist/core/runtime/deliver-live.js +1 -88
- package/dist/core/runtime/fault-recovery.js +1 -83
- package/dist/core/runtime/fault.js +1 -17
- package/dist/core/runtime/fleet.js +1 -58
- package/dist/core/runtime/front-door-env.js +1 -16
- package/dist/core/runtime/front-door.js +7 -183
- package/dist/core/runtime/headless-pi.js +1 -161
- package/dist/core/runtime/host.js +1 -457
- package/dist/core/runtime/interactive-deliver.js +1 -51
- package/dist/core/runtime/invocation.js +0 -10
- package/dist/core/runtime/kickoff.js +30 -327
- package/dist/core/runtime/launch-config-worker.js +1 -12
- package/dist/core/runtime/launch-prompt.js +4 -13
- package/dist/core/runtime/launch-target.js +1 -55
- package/dist/core/runtime/launch.js +1 -483
- package/dist/core/runtime/lifecycle.js +2 -213
- package/dist/core/runtime/managed-provider-cooling.js +1 -62
- package/dist/core/runtime/memory.js +1 -17
- package/dist/core/runtime/model-registry.js +1 -13
- package/dist/core/runtime/model-selection.js +1 -135
- package/dist/core/runtime/model-swap.js +1 -86
- package/dist/core/runtime/naming.js +14 -298
- package/dist/core/runtime/nerd-font.js +2 -127
- package/dist/core/runtime/node-read.js +2 -386
- package/dist/core/runtime/nodes.js +1 -331
- package/dist/core/runtime/outcome-document.js +1 -97
- package/dist/core/runtime/package-health.js +4 -99
- package/dist/core/runtime/persona.js +2 -55
- package/dist/core/runtime/pi-cli.js +1 -65
- package/dist/core/runtime/pi-vendored.js +1 -66
- package/dist/core/runtime/placement-tmux.js +1 -81
- package/dist/core/runtime/placement.js +1 -386
- package/dist/core/runtime/promote.js +1 -174
- package/dist/core/runtime/prospective-inventory-cli.js +3 -61
- package/dist/core/runtime/prospective-inventory.js +2 -88
- package/dist/core/runtime/recap.js +27 -103
- package/dist/core/runtime/recycle.js +1 -190
- package/dist/core/runtime/reopen.js +1 -138
- package/dist/core/runtime/reset.js +1 -245
- package/dist/core/runtime/resume-root.js +10 -290
- package/dist/core/runtime/revive-all.js +1 -107
- package/dist/core/runtime/revive.js +4 -544
- package/dist/core/runtime/roadmap.js +4 -38
- package/dist/core/runtime/session-branch.js +1 -46
- package/dist/core/runtime/session-cycles.js +1 -110
- package/dist/core/runtime/session-list-cache.js +1 -406
- package/dist/core/runtime/session-visibility.js +1 -99
- package/dist/core/runtime/shell-expansion.js +9 -100
- package/dist/core/runtime/situational-context.js +2 -67
- package/dist/core/runtime/situational-live.js +1 -41
- package/dist/core/runtime/spawn-env.js +1 -255
- package/dist/core/runtime/spawn.js +3 -577
- package/dist/core/runtime/stamp/channel.js +1 -76
- package/dist/core/runtime/stamp/protocol.js +1 -113
- package/dist/core/runtime/stop-guard.js +7 -116
- package/dist/core/runtime/stop-signals.js +1 -46
- package/dist/core/runtime/stream-watchdog.js +1 -134
- package/dist/core/runtime/structured-output.js +4 -156
- package/dist/core/runtime/surface-bg.js +1 -85
- package/dist/core/runtime/tmux-bindings.js +4 -730
- package/dist/core/runtime/tmux-chrome.js +1 -5
- package/dist/core/runtime/tmux-driver.js +7 -637
- package/dist/core/runtime/tool-group-summary.js +6 -85
- package/dist/core/runtime/turn-visibility.js +1 -31
- package/dist/core/runtime/view-socket.js +1 -83
- package/dist/core/runtime/warm-pool.js +1 -395
- package/dist/core/scope.js +1 -254
- package/dist/core/scoped-state/db.js +1 -135
- package/dist/core/scoped-state/migrate.js +3 -181
- package/dist/core/scoped-state/paths.js +1 -27
- package/dist/core/scoped-state/profiles.js +1 -62
- package/dist/core/scoped-state/providers.js +1 -8
- package/dist/core/scoped-state/schema.js +3 -16
- package/dist/core/scoped-state/settings.js +1 -82
- package/dist/core/secrets.js +2 -55
- package/dist/core/self-update.js +1 -71
- package/dist/core/session-model/session-state.js +1 -180
- package/dist/core/shell-segments.js +4 -169
- package/dist/core/spawn.js +1 -26
- package/dist/core/stdout-errors.js +1 -14
- package/dist/core/subscription-state.js +3 -193
- package/dist/core/substrate/frontmatter-validation.js +1 -105
- package/dist/core/substrate/gate-explain.js +1 -424
- package/dist/core/substrate/gate.js +1 -26
- package/dist/core/substrate/index.js +1 -30
- package/dist/core/substrate/injected-store.js +1 -249
- package/dist/core/substrate/listings.js +1 -115
- package/dist/core/substrate/on-read-node.js +1 -36
- package/dist/core/substrate/on-read.js +9 -315
- package/dist/core/substrate/plan.js +1 -266
- package/dist/core/substrate/render-node.js +1 -30
- package/dist/core/substrate/render.js +65 -689
- package/dist/core/substrate/schema.js +1 -186
- package/dist/core/substrate/session-cache.js +1 -83
- package/dist/core/substrate/subject-fields.js +1 -35
- package/dist/core/substrate/subject.js +1 -47
- package/dist/core/substrate/surface-match.js +1 -242
- package/dist/core/termrender/code-doc.js +5 -92
- package/dist/core/termrender/display.js +2 -56
- package/dist/core/termrender/termrender.js +14 -719
- package/dist/core/termrender/version.js +1 -1
- package/dist/core/timing.js +2 -94
- package/dist/core/tui/draw.js +2 -378
- package/dist/core/tui/fuzzy.js +1 -38
- package/dist/core/tui/markdown.js +3 -407
- package/dist/core/tui/page-host.js +1 -74
- package/dist/core/tui/panel.js +1 -137
- package/dist/core/tui/terminal.js +2 -100
- package/dist/core/user-settings.js +1 -454
- package/dist/core/wake.js +1 -296
- package/dist/core/worktree-close.js +6 -228
- package/dist/core/worktree-containment.js +3 -48
- package/dist/core/worktree-landing.js +4 -56
- package/dist/core/worktree-mutation-async.js +10 -280
- package/dist/core/worktree-quarantine.js +1 -54
- package/dist/core/worktree-sweep.js +6 -453
- package/dist/core/worktree.js +18 -899
- package/dist/daemon/api/bridge.js +8 -418
- package/dist/daemon/api/handlers/attach.js +1 -65
- package/dist/daemon/api/handlers/bash-jobs.js +2 -91
- package/dist/daemon/api/handlers/broker-ops.js +1 -447
- package/dist/daemon/api/handlers/broker-recovery.js +1 -251
- package/dist/daemon/api/handlers/canvas.js +6 -490
- package/dist/daemon/api/handlers/chat-inventory.js +1 -25
- package/dist/daemon/api/handlers/crons.js +1 -373
- package/dist/daemon/api/handlers/daemon.js +1 -76
- package/dist/daemon/api/handlers/feedback-comments.js +3 -199
- package/dist/daemon/api/handlers/files.js +1 -63
- package/dist/daemon/api/handlers/focus.js +1 -92
- package/dist/daemon/api/handlers/health.js +1 -76
- package/dist/daemon/api/handlers/human-requests.js +1 -379
- package/dist/daemon/api/handlers/human.js +1 -3
- package/dist/daemon/api/handlers/inbox-page.js +1 -89
- package/dist/daemon/api/handlers/inbox.js +1 -301
- package/dist/daemon/api/handlers/memory.js +1 -50
- package/dist/daemon/api/handlers/messages.js +2 -506
- package/dist/daemon/api/handlers/model-config.js +1 -44
- package/dist/daemon/api/handlers/modelauth.js +1 -165
- package/dist/daemon/api/handlers/node-outcomes.js +1 -181
- package/dist/daemon/api/handlers/nodes.js +1 -939
- package/dist/daemon/api/handlers/profiles.js +1 -140
- package/dist/daemon/api/handlers/prospective-chat-inventory.js +1 -59
- package/dist/daemon/api/handlers/reports.js +16 -332
- package/dist/daemon/api/handlers/review-comments.js +1 -465
- package/dist/daemon/api/handlers/reviews.js +1 -200
- package/dist/daemon/api/handlers/subscriptions.js +1 -53
- package/dist/daemon/api/handlers/validate.js +1 -58
- package/dist/daemon/api/handlers/worktree.js +1 -39
- package/dist/daemon/api/map.js +2 -735
- package/dist/daemon/api/router.js +1 -190
- package/dist/daemon/api/server.js +11 -408
- package/dist/daemon/boot-migrations.js +1 -31
- package/dist/daemon/companion-retire.js +1 -34
- package/dist/daemon/control.js +1 -22
- package/dist/daemon/cron/armed-context.js +1 -100
- package/dist/daemon/cron/capture.js +2 -45
- package/dist/daemon/cron/disposition.js +1 -55
- package/dist/daemon/cron/escalation.js +3 -124
- package/dist/daemon/cron/held.js +1 -20
- package/dist/daemon/cron/lease-recovery.js +1 -119
- package/dist/daemon/cron/live-runs.js +1 -23
- package/dist/daemon/cron/passes.js +1 -58
- package/dist/daemon/cron/settle.js +1 -61
- package/dist/daemon/cron/sinks.js +2 -59
- package/dist/daemon/cron-run.js +1 -405
- package/dist/daemon/crtrd-cli.js +1 -23
- package/dist/daemon/crtrd.js +8 -854
- package/dist/daemon/delivery/run-delivery.js +1 -164
- package/dist/daemon/fleet.js +17 -475
- package/dist/daemon/human/finish.js +10 -179
- package/dist/daemon/human/settle.js +1 -89
- package/dist/daemon/human/sweep.js +1 -66
- package/dist/daemon/manage.js +2 -595
- package/dist/daemon/messaging/node-message.js +1 -99
- package/dist/daemon/park-activity.js +1 -30
- package/dist/daemon/park-pending.js +1 -52
- package/dist/daemon/pidfile.js +1 -37
- package/dist/daemon/profile-delete.js +1 -306
- package/dist/daemon/reconcilers/bash-deadline.js +1 -80
- package/dist/daemon/reconcilers/broker-supervision.js +4 -761
- package/dist/daemon/reconcilers/controller-death.js +1 -14
- package/dist/daemon/reconcilers/cron-lane.js +1 -29
- package/dist/daemon/reconcilers/delivery-lane.js +1 -130
- package/dist/daemon/reconcilers/live-obligation.js +1 -87
- package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -202
- package/dist/daemon/reconcilers/node-deadline.js +1 -82
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -172
- package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -59
- package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -12
- package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -146
- package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -11
- package/dist/daemon/reconcilers/pending-review-submit.js +1 -36
- package/dist/daemon/reconcilers/storage-maintenance.js +1 -207
- package/dist/daemon/review/comment-notify.js +2 -109
- package/dist/daemon/review/companion.js +1 -29
- package/dist/daemon/review/deliver.js +3 -8
- package/dist/daemon/review/finish.js +1 -122
- package/dist/daemon/review/sweep.js +1 -18
- package/dist/daemon/startup-policy.js +1 -1
- package/dist/daemon/supervise-cadence.js +1 -6
- package/dist/hook-authoring.js +5 -447
- package/dist/hook-process.js +1 -34
- package/dist/index.js +1 -52
- package/dist/migrations/001-surfaces-frontmatter.js +1 -161
- package/dist/migrations/002-profile-project-memory.js +1 -72
- package/dist/migrations/003-repository-root-memory-identity/front-door.js +11 -231
- package/dist/migrations/003-repository-root-memory-identity/index.js +5 -513
- package/dist/migrations/003-repository-root-memory-identity/references.js +5 -469
- package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +3 -349
- package/dist/migrations/activation.js +2 -89
- package/dist/migrations/convergent.js +2 -82
- package/dist/migrations/corpus.js +3 -483
- package/dist/migrations/frontmatter-splice.js +8 -176
- package/dist/migrations/profile-manifests.js +2 -70
- package/dist/migrations/registry.js +1 -42
- package/dist/migrations/runner.js +1 -85
- package/dist/migrations/types.js +0 -24
- package/dist/pi-extensions/broker-local.js +2 -106
- package/dist/pi-extensions/canvas-bash-valve.js +7 -461
- package/dist/pi-extensions/canvas-context-intro.js +2 -113
- package/dist/pi-extensions/canvas-doc-substrate.js +9 -178
- package/dist/pi-extensions/canvas-goal-capture.js +1 -83
- package/dist/pi-extensions/canvas-inbox-watcher.js +1 -1010
- package/dist/pi-extensions/canvas-passive-context.js +14 -203
- package/dist/pi-extensions/canvas-preview-result.js +2 -72
- package/dist/pi-extensions/canvas-prompt-scrub.js +2 -54
- package/dist/pi-extensions/canvas-recap.js +11 -405
- package/dist/pi-extensions/canvas-review-boundary.js +3 -63
- package/dist/pi-extensions/canvas-stamp.js +2 -77
- package/dist/pi-extensions/canvas-stophook.js +1 -643
- package/dist/pi-extensions/canvas-structured-output.js +13 -35
- package/dist/pi-extensions/canvas-tool-guide.js +9 -78
- package/dist/pi-extensions/envelope-merge.js +8 -29
- package/dist/prompts/review.js +20 -42
- package/dist/shared/birth-announcement.js +1 -25
- package/dist/shared/crtr-version.js +1 -18
- package/dist/shared/env.js +1 -214
- package/dist/shared/generated-context.js +11 -226
- package/dist/shared/predicates.js +1 -4
- package/dist/shared/shell-quote.js +1 -5
- package/dist/shared/tool-groups.js +1 -64
- package/dist/shared/working-activity.js +1 -27
- package/dist/suppress-experimental-warnings.js +1 -15
- package/dist/types.js +1 -185
- package/docs/public-api.md +10 -9
- package/package.json +6 -4
- package/runtime.lock.json +5 -5
- package/scripts/pack-minify.mjs +108 -0
- package/dist/api/__tests__/integration/client.test.d.ts +0 -1
- package/dist/api/__tests__/integration/client.test.js +0 -163
- package/dist/builtin-pi-packages/pi-crtr-extensions/__tests__/insights-active-init.test.ts +0 -98
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-commands.test.ts +0 -93
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +0 -2530
- package/dist/clients/__tests__/helpers/human-daemon.d.ts +0 -11
- package/dist/clients/__tests__/helpers/human-daemon.js +0 -60
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +0 -97
- package/dist/clients/attach/__tests__/bash-call-width.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/bash-call-width.test.js +0 -38
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +0 -175
- package/dist/clients/attach/__tests__/completion-frecency.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/completion-frecency.test.js +0 -35
- package/dist/clients/attach/__tests__/context-message.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/context-message.test.js +0 -130
- package/dist/clients/attach/__tests__/crtr-output.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/crtr-output.test.js +0 -68
- package/dist/clients/attach/__tests__/diagram.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/diagram.test.js +0 -42
- package/dist/clients/attach/__tests__/edit-diff.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -31
- package/dist/clients/attach/__tests__/frame-selection.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/frame-selection.test.js +0 -84
- package/dist/clients/attach/__tests__/group-activity.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +0 -165
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +0 -83
- package/dist/clients/attach/__tests__/pane-tag-successor.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/pane-tag-successor.test.js +0 -56
- package/dist/clients/attach/__tests__/profile-files.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/profile-files.test.js +0 -21
- package/dist/clients/attach/__tests__/prompt-preview.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/prompt-preview.test.js +0 -21
- package/dist/clients/attach/__tests__/ref-autocomplete.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +0 -64
- package/dist/clients/attach/__tests__/titled-editor-paste.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/titled-editor-paste.test.js +0 -114
- package/dist/clients/attach/__tests__/titled-editor-preview.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +0 -83
- package/dist/clients/inbox/__tests__/integration/inbox-controller.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +0 -81
- package/dist/clients/inbox/__tests__/integration/mount-panel.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/mount-panel.test.js +0 -135
- package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +0 -66
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +0 -35
- package/dist/clients/inbox/review/__tests__/review-core.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/review-core.test.js +0 -52
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +0 -100
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.d.ts +0 -1
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +0 -69
- package/dist/commands/__tests__/human.test.d.ts +0 -1
- package/dist/commands/__tests__/human.test.js +0 -172
- package/dist/commands/__tests__/integration/dashboard-snapshot.test.d.ts +0 -1
- package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +0 -237
- package/dist/commands/__tests__/integration/migrate.test.d.ts +0 -1
- package/dist/commands/__tests__/integration/migrate.test.js +0 -1330
- package/dist/commands/__tests__/node-message.test.d.ts +0 -1
- package/dist/commands/__tests__/node-message.test.js +0 -112
- package/dist/commands/__tests__/node-new.test.d.ts +0 -1
- package/dist/commands/__tests__/node-new.test.js +0 -58
- package/dist/commands/__tests__/revive-now-gate.test.d.ts +0 -1
- package/dist/commands/__tests__/revive-now-gate.test.js +0 -62
- package/dist/commands/__tests__/seam/daemon-status.test.d.ts +0 -1
- package/dist/commands/__tests__/seam/daemon-status.test.js +0 -29
- package/dist/commands/__tests__/surface-reload-target.test.d.ts +0 -1
- package/dist/commands/__tests__/surface-reload-target.test.js +0 -21
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +0 -379
- package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +0 -124
- package/dist/commands/memory/__tests__/repository-root-lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/repository-root-lint.test.js +0 -148
- package/dist/commands/sys/__tests__/config-model-ladders.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-model-ladders.test.js +0 -114
- package/dist/commands/sys/__tests__/setup-core.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-core.test.js +0 -45
- package/dist/commands/sys/__tests__/sync-project-guidance.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-project-guidance.test.js +0 -244
- package/dist/core/__tests__/bash-guard.test.d.ts +0 -1
- package/dist/core/__tests__/bash-guard.test.js +0 -190
- package/dist/core/__tests__/boot-fault-attempt.test.d.ts +0 -1
- package/dist/core/__tests__/boot-fault-attempt.test.js +0 -105
- package/dist/core/__tests__/boot.test.d.ts +0 -1
- package/dist/core/__tests__/boot.test.js +0 -274
- package/dist/core/__tests__/branded-host-concurrency.test.d.ts +0 -1
- package/dist/core/__tests__/branded-host-concurrency.test.js +0 -72
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +0 -75
- package/dist/core/__tests__/broker-launch-candidates.test.d.ts +0 -1
- package/dist/core/__tests__/broker-launch-candidates.test.js +0 -311
- package/dist/core/__tests__/broker-preflight.test.d.ts +0 -1
- package/dist/core/__tests__/broker-preflight.test.js +0 -95
- package/dist/core/__tests__/broker-stream-watchdog-floor.test.d.ts +0 -1
- package/dist/core/__tests__/broker-stream-watchdog-floor.test.js +0 -82
- package/dist/core/__tests__/broker-turn-admission.test.d.ts +0 -1
- package/dist/core/__tests__/broker-turn-admission.test.js +0 -44
- package/dist/core/__tests__/canvas-db-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-db-boundary.test.js +0 -46
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +0 -710
- package/dist/core/__tests__/canvas-inbox-watcher-naming.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +0 -310
- package/dist/core/__tests__/canvas-inbox-watcher.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +0 -397
- package/dist/core/__tests__/canvas.test.d.ts +0 -1
- package/dist/core/__tests__/canvas.test.js +0 -138
- package/dist/core/__tests__/child-death-wake.test.d.ts +0 -1
- package/dist/core/__tests__/child-death-wake.test.js +0 -153
- package/dist/core/__tests__/cli-help-contract.test.d.ts +0 -1
- package/dist/core/__tests__/cli-help-contract.test.js +0 -152
- package/dist/core/__tests__/close.test.d.ts +0 -1
- package/dist/core/__tests__/close.test.js +0 -284
- package/dist/core/__tests__/collectible.test.d.ts +0 -1
- package/dist/core/__tests__/collectible.test.js +0 -89
- package/dist/core/__tests__/config-change-delta.test.d.ts +0 -1
- package/dist/core/__tests__/config-change-delta.test.js +0 -108
- package/dist/core/__tests__/context-intro.test.d.ts +0 -1
- package/dist/core/__tests__/context-intro.test.js +0 -123
- package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +0 -1
- package/dist/core/__tests__/cron-armed-context-failure.test.js +0 -150
- package/dist/core/__tests__/cron-held-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/cron-held-settlement.test.js +0 -240
- package/dist/core/__tests__/cron-node-sink-parked-root.test.d.ts +0 -1
- package/dist/core/__tests__/cron-node-sink-parked-root.test.js +0 -166
- package/dist/core/__tests__/cron-self-cancel-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/cron-self-cancel-delivery.test.js +0 -84
- package/dist/core/__tests__/cron-timeout-descendants.test.d.ts +0 -1
- package/dist/core/__tests__/cron-timeout-descendants.test.js +0 -114
- package/dist/core/__tests__/daemon-boot.test.d.ts +0 -1
- package/dist/core/__tests__/daemon-boot.test.js +0 -422
- package/dist/core/__tests__/daemon-wedge.test.d.ts +0 -1
- package/dist/core/__tests__/daemon-wedge.test.js +0 -106
- package/dist/core/__tests__/dead-node-policy-table.test.d.ts +0 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +0 -77
- package/dist/core/__tests__/events-contract.test.d.ts +0 -1
- package/dist/core/__tests__/events-contract.test.js +0 -76
- package/dist/core/__tests__/extension-abort.test.d.ts +0 -1
- package/dist/core/__tests__/extension-abort.test.js +0 -21
- package/dist/core/__tests__/fault-classifier.test.d.ts +0 -1
- package/dist/core/__tests__/fault-classifier.test.js +0 -138
- package/dist/core/__tests__/fixtures/api-server-host.d.ts +0 -1
- package/dist/core/__tests__/fixtures/api-server-host.js +0 -47
- package/dist/core/__tests__/fixtures/c3-custom-provider-ext.d.ts +0 -2
- package/dist/core/__tests__/fixtures/c3-custom-provider-ext.js +0 -34
- package/dist/core/__tests__/fixtures/c5-command-boundary-ext.d.ts +0 -2
- package/dist/core/__tests__/fixtures/c5-command-boundary-ext.js +0 -32
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +0 -347
- package/dist/core/__tests__/fixtures/fake-engine.js +0 -1509
- package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +0 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +0 -311
- package/dist/core/__tests__/fixtures/memory-slash-live-probe.d.ts +0 -1
- package/dist/core/__tests__/fixtures/memory-slash-live-probe.js +0 -75
- package/dist/core/__tests__/fixtures/metadata-migration-race.d.ts +0 -1
- package/dist/core/__tests__/fixtures/metadata-migration-race.js +0 -49
- package/dist/core/__tests__/focuses.test.d.ts +0 -1
- package/dist/core/__tests__/focuses.test.js +0 -113
- package/dist/core/__tests__/fs-utils.test.d.ts +0 -1
- package/dist/core/__tests__/fs-utils.test.js +0 -50
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -43
- package/dist/core/__tests__/helpers/broker-clients.js +0 -174
- package/dist/core/__tests__/helpers/fleet.d.ts +0 -12
- package/dist/core/__tests__/helpers/fleet.js +0 -50
- package/dist/core/__tests__/helpers/harness.d.ts +0 -124
- package/dist/core/__tests__/helpers/harness.js +0 -806
- package/dist/core/__tests__/helpers/viewer-panes.d.ts +0 -12
- package/dist/core/__tests__/helpers/viewer-panes.js +0 -133
- package/dist/core/__tests__/history-inbox.test.d.ts +0 -1
- package/dist/core/__tests__/history-inbox.test.js +0 -121
- package/dist/core/__tests__/human-action-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/human-action-delivery.test.js +0 -162
- package/dist/core/__tests__/human-actions.test.d.ts +0 -1
- package/dist/core/__tests__/human-actions.test.js +0 -120
- package/dist/core/__tests__/inline-memory-refs.test.d.ts +0 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +0 -225
- package/dist/core/__tests__/integration/broker-fork-seam.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -193
- package/dist/core/__tests__/integration/broker-sdk-wiring.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +0 -750
- package/dist/core/__tests__/integration/broker-snapshot-history.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-snapshot-history.test.js +0 -288
- package/dist/core/__tests__/integration/broker-wedge-supervision.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +0 -103
- package/dist/core/__tests__/integration/command-plugins.test.d.ts +0 -1
- package/dist/core/__tests__/integration/command-plugins.test.js +0 -1200
- package/dist/core/__tests__/integration/deferred-no-wake.test.d.ts +0 -1
- package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -610
- package/dist/core/__tests__/integration/flagship-lifecycle.test.d.ts +0 -1
- package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -264
- package/dist/core/__tests__/integration/fresh-home-commands.test.d.ts +0 -1
- package/dist/core/__tests__/integration/fresh-home-commands.test.js +0 -49
- package/dist/core/__tests__/integration/git-optional-locks.test.d.ts +0 -1
- package/dist/core/__tests__/integration/git-optional-locks.test.js +0 -81
- package/dist/core/__tests__/integration/host-teardown-process-group.test.d.ts +0 -1
- package/dist/core/__tests__/integration/host-teardown-process-group.test.js +0 -480
- package/dist/core/__tests__/integration/lifecycle-hooks.test.d.ts +0 -1
- package/dist/core/__tests__/integration/lifecycle-hooks.test.js +0 -498
- package/dist/core/__tests__/integration/live-mutation-verbs.test.d.ts +0 -1
- package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -180
- package/dist/core/__tests__/integration/live-mutation.test.d.ts +0 -1
- package/dist/core/__tests__/integration/live-mutation.test.js +0 -173
- package/dist/core/__tests__/integration/plugin-revalidate.test.d.ts +0 -1
- package/dist/core/__tests__/integration/plugin-revalidate.test.js +0 -359
- package/dist/core/__tests__/integration/profile-pause.test.d.ts +0 -1
- package/dist/core/__tests__/integration/profile-pause.test.js +0 -115
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.d.ts +0 -1
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +0 -151
- package/dist/core/__tests__/integration/revive.test.d.ts +0 -1
- package/dist/core/__tests__/integration/revive.test.js +0 -615
- package/dist/core/__tests__/integration/spawn-root.test.d.ts +0 -1
- package/dist/core/__tests__/integration/spawn-root.test.js +0 -536
- package/dist/core/__tests__/integration/subscription-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -132
- package/dist/core/__tests__/integration/tmux-surface.test.d.ts +0 -1
- package/dist/core/__tests__/integration/tmux-surface.test.js +0 -330
- package/dist/core/__tests__/integration/worktree-land.test.d.ts +0 -1
- package/dist/core/__tests__/integration/worktree-land.test.js +0 -607
- package/dist/core/__tests__/integration/worktree-reap.test.d.ts +0 -1
- package/dist/core/__tests__/integration/worktree-reap.test.js +0 -842
- package/dist/core/__tests__/kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/kickoff.test.js +0 -196
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +0 -1
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +0 -62
- package/dist/core/__tests__/lifecycle.test.d.ts +0 -1
- package/dist/core/__tests__/lifecycle.test.js +0 -176
- package/dist/core/__tests__/live-lifecycle-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/live-lifecycle-prompt.test.js +0 -63
- package/dist/core/__tests__/memory-resolver-precedence.test.d.ts +0 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +0 -228
- package/dist/core/__tests__/migration.test.d.ts +0 -1
- package/dist/core/__tests__/migration.test.js +0 -946
- package/dist/core/__tests__/model-pin-durability.test.d.ts +0 -1
- package/dist/core/__tests__/model-pin-durability.test.js +0 -195
- package/dist/core/__tests__/model-routes-config.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes-config.test.js +0 -150
- package/dist/core/__tests__/nested-store-discovery.test.d.ts +0 -1
- package/dist/core/__tests__/nested-store-discovery.test.js +0 -89
- package/dist/core/__tests__/node-outcome.test.d.ts +0 -1
- package/dist/core/__tests__/node-outcome.test.js +0 -246
- package/dist/core/__tests__/on-read-crouter-home-fence.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-crouter-home-fence.test.js +0 -66
- package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-dedup-resume.test.js +0 -132
- package/dist/core/__tests__/on-read-nested-store.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-nested-store.test.js +0 -135
- package/dist/core/__tests__/parse-argv-stdin-secret.test.d.ts +0 -1
- package/dist/core/__tests__/parse-argv-stdin-secret.test.js +0 -68
- package/dist/core/__tests__/passive-subscription.test.d.ts +0 -1
- package/dist/core/__tests__/passive-subscription.test.js +0 -120
- package/dist/core/__tests__/pid-identity-match.test.d.ts +0 -1
- package/dist/core/__tests__/pid-identity-match.test.js +0 -145
- package/dist/core/__tests__/pid-zombie.test.d.ts +0 -1
- package/dist/core/__tests__/pid-zombie.test.js +0 -42
- package/dist/core/__tests__/plugin-kinds.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-kinds.test.js +0 -182
- package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +0 -43
- package/dist/core/__tests__/plugin-page-components.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-page-components.test.js +0 -159
- package/dist/core/__tests__/preview-mirror-cap.test.d.ts +0 -1
- package/dist/core/__tests__/preview-mirror-cap.test.js +0 -53
- package/dist/core/__tests__/preview-registry-sync.test.d.ts +0 -1
- package/dist/core/__tests__/preview-registry-sync.test.js +0 -107
- package/dist/core/__tests__/profile-project-memory-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/profile-project-memory-delivery.test.js +0 -644
- package/dist/core/__tests__/prospective-inventory-capability-parity.test.d.ts +0 -1
- package/dist/core/__tests__/prospective-inventory-capability-parity.test.js +0 -91
- package/dist/core/__tests__/prune.test.d.ts +0 -1
- package/dist/core/__tests__/prune.test.js +0 -243
- package/dist/core/__tests__/push-final-guard.test.d.ts +0 -1
- package/dist/core/__tests__/push-final-guard.test.js +0 -191
- package/dist/core/__tests__/relaunch-root.test.d.ts +0 -1
- package/dist/core/__tests__/relaunch-root.test.js +0 -249
- package/dist/core/__tests__/remote-canvas-target.test.d.ts +0 -1
- package/dist/core/__tests__/remote-canvas-target.test.js +0 -93
- package/dist/core/__tests__/repository-association.test.d.ts +0 -1
- package/dist/core/__tests__/repository-association.test.js +0 -153
- package/dist/core/__tests__/repository-root-identity.test.d.ts +0 -1
- package/dist/core/__tests__/repository-root-identity.test.js +0 -223
- package/dist/core/__tests__/respawn-throttle.test.d.ts +0 -1
- package/dist/core/__tests__/respawn-throttle.test.js +0 -20
- package/dist/core/__tests__/review-model-floor.test.d.ts +0 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -83
- package/dist/core/__tests__/revive-all.test.d.ts +0 -1
- package/dist/core/__tests__/revive-all.test.js +0 -157
- package/dist/core/__tests__/revive-capacity.test.d.ts +0 -1
- package/dist/core/__tests__/revive-capacity.test.js +0 -184
- package/dist/core/__tests__/revive-parked-fresh.test.d.ts +0 -1
- package/dist/core/__tests__/revive-parked-fresh.test.js +0 -176
- package/dist/core/__tests__/scope-crouter-home-fence.test.d.ts +0 -1
- package/dist/core/__tests__/scope-crouter-home-fence.test.js +0 -55
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -262
- package/dist/core/__tests__/seam/broker-attach-stream.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -176
- package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-cap-freeze.test.js +0 -155
- package/dist/core/__tests__/seam/broker-crash-teardown.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -131
- package/dist/core/__tests__/seam/broker-pane-resolution.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-pane-resolution.test.js +0 -204
- package/dist/core/__tests__/seam/broker-provider-retry.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-provider-retry.test.js +0 -686
- package/dist/core/__tests__/seam/broker-startup-diagnostics.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-startup-diagnostics.test.js +0 -82
- package/dist/core/__tests__/seam/broker-whip-interrupt.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-whip-interrupt.test.js +0 -50
- package/dist/core/__tests__/seam/deadline-wake-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/seam/deadline-wake-delivery.test.js +0 -138
- package/dist/core/__tests__/seam/dormancy-release.test.d.ts +0 -1
- package/dist/core/__tests__/seam/dormancy-release.test.js +0 -516
- package/dist/core/__tests__/seam/held-deferred-human-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +0 -65
- package/dist/core/__tests__/seam/inbox-reference-guidance.test.d.ts +0 -1
- package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +0 -84
- package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.d.ts +0 -1
- package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.js +0 -160
- package/dist/core/__tests__/seam/node-outcome-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/seam/node-outcome-delivery.test.js +0 -177
- package/dist/core/__tests__/seam/prospective-inventory-stdout.test.d.ts +0 -1
- package/dist/core/__tests__/seam/prospective-inventory-stdout.test.js +0 -31
- package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.d.ts +0 -1
- package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.js +0 -60
- package/dist/core/__tests__/seam/self-close-teardown.test.d.ts +0 -1
- package/dist/core/__tests__/seam/self-close-teardown.test.js +0 -49
- package/dist/core/__tests__/seam/yield-refresh-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +0 -100
- package/dist/core/__tests__/secrets.test.d.ts +0 -1
- package/dist/core/__tests__/secrets.test.js +0 -49
- package/dist/core/__tests__/self-update.test.d.ts +0 -1
- package/dist/core/__tests__/self-update.test.js +0 -46
- package/dist/core/__tests__/session-branch.test.d.ts +0 -1
- package/dist/core/__tests__/session-branch.test.js +0 -61
- package/dist/core/__tests__/session-cycles.test.d.ts +0 -1
- package/dist/core/__tests__/session-cycles.test.js +0 -133
- package/dist/core/__tests__/session-model.test.d.ts +0 -1
- package/dist/core/__tests__/session-model.test.js +0 -111
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +0 -71
- package/dist/core/__tests__/stdin-body-no-discard.test.d.ts +0 -1
- package/dist/core/__tests__/stdin-body-no-discard.test.js +0 -33
- package/dist/core/__tests__/stdout-errors.test.d.ts +0 -1
- package/dist/core/__tests__/stdout-errors.test.js +0 -16
- package/dist/core/__tests__/stop-guard.test.d.ts +0 -1
- package/dist/core/__tests__/stop-guard.test.js +0 -237
- package/dist/core/__tests__/stream-watchdog.test.d.ts +0 -1
- package/dist/core/__tests__/stream-watchdog.test.js +0 -154
- package/dist/core/__tests__/subscription-pool-credential-guard.test.d.ts +0 -1
- package/dist/core/__tests__/subscription-pool-credential-guard.test.js +0 -95
- package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/tmux-driver-boundary.test.js +0 -50
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +0 -54
- package/dist/core/__tests__/worktree-landing.test.d.ts +0 -1
- package/dist/core/__tests__/worktree-landing.test.js +0 -11
- package/dist/core/__tests__/yield-ensures-daemon.test.d.ts +0 -1
- package/dist/core/__tests__/yield-ensures-daemon.test.js +0 -55
- package/dist/core/broker-client/__tests__/transport-relay.test.d.ts +0 -1
- package/dist/core/broker-client/__tests__/transport-relay.test.js +0 -214
- package/dist/core/broker-client/__tests__/transport-socket.test.d.ts +0 -1
- package/dist/core/broker-client/__tests__/transport-socket.test.js +0 -73
- package/dist/core/canvas/__tests__/attention.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/attention.test.js +0 -83
- package/dist/core/canvas/__tests__/history-transcript.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/history-transcript.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-canvas-source.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +0 -328
- package/dist/core/canvas/__tests__/remote-transport.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-transport.test.js +0 -97
- package/dist/core/canvas/__tests__/render-remote.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/render-remote.test.js +0 -243
- package/dist/core/canvas/__tests__/session-window.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/session-window.test.js +0 -70
- package/dist/core/feed/__tests__/inbox-migrate.test.d.ts +0 -1
- package/dist/core/feed/__tests__/inbox-migrate.test.js +0 -49
- package/dist/core/human/__tests__/page-catalog.test.d.ts +0 -1
- package/dist/core/human/__tests__/page-catalog.test.js +0 -20
- package/dist/core/human/__tests__/page-html-markdown.test.d.ts +0 -1
- package/dist/core/human/__tests__/page-html-markdown.test.js +0 -48
- package/dist/core/human/__tests__/page.test.d.ts +0 -1
- package/dist/core/human/__tests__/page.test.js +0 -92
- package/dist/core/keybindings/__tests__/resolve.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/resolve.test.js +0 -171
- package/dist/core/profiles/__tests__/env-store.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/env-store.test.js +0 -99
- package/dist/core/profiles/__tests__/fuzzy-match.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/fuzzy-match.test.js +0 -51
- package/dist/core/profiles/__tests__/root-profile.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/root-profile.test.js +0 -59
- package/dist/core/review/__tests__/capture-origin.test.d.ts +0 -1
- package/dist/core/review/__tests__/capture-origin.test.js +0 -150
- package/dist/core/review/__tests__/comments.test.d.ts +0 -1
- package/dist/core/review/__tests__/comments.test.js +0 -116
- package/dist/core/review/__tests__/remap.test.d.ts +0 -1
- package/dist/core/review/__tests__/remap.test.js +0 -177
- package/dist/core/review/__tests__/stage-identity.test.d.ts +0 -1
- package/dist/core/review/__tests__/stage-identity.test.js +0 -150
- package/dist/core/runtime/__tests__/engine-route.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +0 -36
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +0 -45
- package/dist/core/runtime/__tests__/node-env.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/node-env.test.js +0 -73
- package/dist/core/runtime/__tests__/spawn-env.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-env.test.js +0 -259
- package/dist/core/substrate/__tests__/surface-match-command.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-command.test.js +0 -89
- package/dist/core/substrate/__tests__/surface-match-memory-read.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-memory-read.test.js +0 -28
- package/dist/core/substrate/__tests__/surface-match-pre-command.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +0 -92
- package/dist/daemon/__tests__/autostart-storm.test.d.ts +0 -1
- package/dist/daemon/__tests__/autostart-storm.test.js +0 -128
- package/dist/daemon/__tests__/broker-ownership.test.d.ts +0 -1
- package/dist/daemon/__tests__/broker-ownership.test.js +0 -25
- package/dist/daemon/__tests__/daemon-ownership.test.d.ts +0 -1
- package/dist/daemon/__tests__/daemon-ownership.test.js +0 -27
- package/dist/daemon/__tests__/helpers/source-daemon.d.ts +0 -30
- package/dist/daemon/__tests__/helpers/source-daemon.js +0 -176
- package/dist/daemon/__tests__/integration/api-startup-readiness.test.d.ts +0 -1
- package/dist/daemon/__tests__/integration/api-startup-readiness.test.js +0 -83
- package/dist/daemon/__tests__/integration/migration-startup.test.d.ts +0 -1
- package/dist/daemon/__tests__/integration/migration-startup.test.js +0 -127
- package/dist/daemon/__tests__/node-deadline-lane.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-deadline-lane.test.js +0 -77
- package/dist/daemon/__tests__/node-outcome-birth-invariants.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +0 -146
- package/dist/daemon/__tests__/node-outcome-delivery.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-outcome-delivery.test.js +0 -116
- package/dist/daemon/__tests__/reconciler-signature.test.d.ts +0 -1
- package/dist/daemon/__tests__/reconciler-signature.test.js +0 -37
- package/dist/daemon/__tests__/subtree-filter-freshness.test.d.ts +0 -1
- package/dist/daemon/__tests__/subtree-filter-freshness.test.js +0 -63
- package/dist/daemon/__tests__/thaw-order.test.d.ts +0 -1
- package/dist/daemon/__tests__/thaw-order.test.js +0 -55
- package/dist/daemon/api/__tests__/bridge-heartbeat.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/bridge-heartbeat.test.js +0 -58
- package/dist/daemon/api/__tests__/broker-settle-park.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/broker-settle-park.test.js +0 -175
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +0 -216
- package/dist/daemon/api/__tests__/error-seam.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/error-seam.test.js +0 -83
- package/dist/daemon/api/__tests__/model-config.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/model-config.test.js +0 -73
- package/dist/daemon/api/__tests__/node-create-description.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/node-create-description.test.js +0 -127
- package/dist/daemon/api/__tests__/node-model-validation.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +0 -183
- package/dist/daemon/api/__tests__/nodes-activity-query.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/nodes-activity-query.test.js +0 -99
- package/dist/daemon/api/__tests__/profile-launch-gates.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/profile-launch-gates.test.js +0 -172
- package/dist/daemon/api/__tests__/profile-metadata-route.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/profile-metadata-route.test.js +0 -95
- package/dist/daemon/api/__tests__/reopen-delivery.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/reopen-delivery.test.js +0 -260
- package/dist/daemon/api/__tests__/seam/api-server.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/api-server.test.js +0 -442
- package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +0 -310
- package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -351
- package/dist/daemon/api/__tests__/seam/node-outcome-api.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/node-outcome-api.test.js +0 -159
- package/dist/daemon/api/__tests__/seam/profile-delete.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/profile-delete.test.js +0 -372
- package/dist/daemon/api/__tests__/submit-result.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/submit-result.test.js +0 -215
- package/dist/migrations/__tests__/activation-concurrency.test.d.ts +0 -1
- package/dist/migrations/__tests__/activation-concurrency.test.js +0 -146
- package/dist/migrations/__tests__/activation.test.d.ts +0 -1
- package/dist/migrations/__tests__/activation.test.js +0 -152
- package/dist/migrations/__tests__/deletion-and-root-declaration.test.d.ts +0 -1
- package/dist/migrations/__tests__/deletion-and-root-declaration.test.js +0 -149
- package/dist/pi-extensions/__tests__/canvas-bash-valve.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-bash-valve.test.js +0 -86
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +0 -364
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +0 -106
- package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +0 -62
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -432
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +0 -152
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +0 -88
- package/dist/pi-extensions/__tests__/canvas-tool-guide.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-tool-guide.test.js +0 -96
- package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.js +0 -133
- package/dist/pi-extensions/__tests__/pre-command-gate.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/pre-command-gate.test.js +0 -232
- package/dist/shared/__tests__/env-boundary.test.d.ts +0 -1
- package/dist/shared/__tests__/env-boundary.test.js +0 -95
- package/dist/shared/__tests__/generated-context-grammar.test.d.ts +0 -1
- package/dist/shared/__tests__/generated-context-grammar.test.js +0 -80
- package/docs/compat/hearth-crtr-v1.md +0 -179
- package/docs/compat/hearth-crtr-v2.md +0 -177
- package/docs/compat/hearth-crtr-v3.md +0 -176
- package/docs/compat/hearth-crtr-v4.md +0 -182
- package/docs/compat/hearth-crtr-v5.md +0 -169
|
@@ -1,1330 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import { spawnSync } from 'node:child_process';
|
|
3
|
-
import { existsSync, mkdtempSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import { dirname, join, relative } from 'node:path';
|
|
6
|
-
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
7
|
-
import test from 'node:test';
|
|
8
|
-
import { parse as parseYaml } from 'yaml';
|
|
9
|
-
import { onDiskMigrationIdentity } from '../../../migrations/registry.js';
|
|
10
|
-
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
11
|
-
import { userStore } from '../../../core/scoped-state/paths.js';
|
|
12
|
-
import { writeRawSettings } from '../../../core/scoped-state/settings.js';
|
|
13
|
-
import { createSourceDaemonFixture, startSourceDaemon, waitForHealth, } from '../../../daemon/__tests__/helpers/source-daemon.js';
|
|
14
|
-
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
15
|
-
const CLI = join(HERE, '../../../cli.ts');
|
|
16
|
-
const TSX_LOADER = import.meta.resolve('tsx/esm');
|
|
17
|
-
const OLD_DOC = `---
|
|
18
|
-
kind: knowledge
|
|
19
|
-
system-prompt-visibility: content
|
|
20
|
-
file-read-visibility: none
|
|
21
|
-
---
|
|
22
|
-
# Old format
|
|
23
|
-
`;
|
|
24
|
-
const CURRENT_DOC = `---
|
|
25
|
-
kind: knowledge
|
|
26
|
-
---
|
|
27
|
-
# Current format
|
|
28
|
-
`;
|
|
29
|
-
/** The exact bytes the superseded per-store migration 003 wrote when it created
|
|
30
|
-
* a nested store's synthetic root index. A corpus that already carries one is
|
|
31
|
-
* the second convergence start state, and the identity-only template is the
|
|
32
|
-
* only nested index this cut is allowed to delete. */
|
|
33
|
-
function supersededSyntheticIndex(namespace) {
|
|
34
|
-
return `---
|
|
35
|
-
kind: knowledge
|
|
36
|
-
namespace: ${namespace}
|
|
37
|
-
when-and-why-to-read: When working in \`${namespace}\`, this knowledge should be read because it names the namespace every document in this project answers under.
|
|
38
|
-
surfaces:
|
|
39
|
-
- on: workspace-open
|
|
40
|
-
at: content
|
|
41
|
-
- on: read
|
|
42
|
-
match: "./**"
|
|
43
|
-
at: content
|
|
44
|
-
---
|
|
45
|
-
# ${namespace}
|
|
46
|
-
|
|
47
|
-
This project's memory store. Every document here answers at \`${namespace}/<local name>\`.
|
|
48
|
-
`;
|
|
49
|
-
}
|
|
50
|
-
function write(path, content) {
|
|
51
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
52
|
-
writeFileSync(path, content);
|
|
53
|
-
}
|
|
54
|
-
/** Store keys and target ids are realpaths, so the fixture must be one too:
|
|
55
|
-
* macOS hands `mkdtemp` a `/var/folders` path whose realpath is `/private/...`. */
|
|
56
|
-
const migrateCanvasHomes = new Map();
|
|
57
|
-
function fixtureHome(prefix) {
|
|
58
|
-
const home = realpathSync(mkdtempSync(join(tmpdir(), prefix)));
|
|
59
|
-
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
60
|
-
const root = mkdtempSync(join(tmpdir(), 'crtr-sys-migrate-daemon-'));
|
|
61
|
-
migrateCanvasHomes.set(home, join(root, 'canvas'));
|
|
62
|
-
return home;
|
|
63
|
-
}
|
|
64
|
-
function writeUserConfig(home, raw) {
|
|
65
|
-
const store = userStore(join(home, '.crouter'));
|
|
66
|
-
writeRawSettings({ store, key: 'user', kind: 'user', root: store.root }, raw);
|
|
67
|
-
}
|
|
68
|
-
/** Fixture git, with identity and signing pinned so the ambient user's global
|
|
69
|
-
* config cannot fail a commit this test needs. */
|
|
70
|
-
function git(cwd, ...args) {
|
|
71
|
-
const result = spawnSync('git', ['-c', 'user.email=test@example.com', '-c', 'user.name=Test', '-c', 'commit.gpgsign=false', ...args], { cwd, encoding: 'utf8' });
|
|
72
|
-
assert.equal(result.status, 0, `git ${args.join(' ')} in ${cwd}: ${result.stderr}`);
|
|
73
|
-
}
|
|
74
|
-
/** A git checkout with one commit — the minimum `git worktree add` needs. */
|
|
75
|
-
function initRepo(dir) {
|
|
76
|
-
mkdirSync(dir, { recursive: true });
|
|
77
|
-
git(dir, 'init', '-b', 'main');
|
|
78
|
-
writeFileSync(join(dir, 'README.md'), '# fixture\n');
|
|
79
|
-
git(dir, 'add', 'README.md');
|
|
80
|
-
git(dir, 'commit', '-m', 'fixture');
|
|
81
|
-
}
|
|
82
|
-
function canvasHomeFor(home) {
|
|
83
|
-
return migrateDaemons.get(home)?.fixture.canvasHome ?? migrateCanvasHomes.get(home) ?? join(home, '.crouter', 'canvas');
|
|
84
|
-
}
|
|
85
|
-
function markerPath(home) {
|
|
86
|
-
return join(canvasHomeFor(home), 'on-disk-migrations.json');
|
|
87
|
-
}
|
|
88
|
-
function readMarker(home) {
|
|
89
|
-
return JSON.parse(readFileSync(markerPath(home), 'utf8'));
|
|
90
|
-
}
|
|
91
|
-
/** Every file under `dir`, by path, so a run that must write NOTHING can be
|
|
92
|
-
* proved byte for byte rather than by a changed counter. */
|
|
93
|
-
function snapshotTree(dir) {
|
|
94
|
-
const files = new Map();
|
|
95
|
-
const walk = (current) => {
|
|
96
|
-
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
97
|
-
const path = join(current, entry.name);
|
|
98
|
-
if (entry.isDirectory())
|
|
99
|
-
walk(path);
|
|
100
|
-
else if (entry.isFile())
|
|
101
|
-
files.set(path, readFileSync(path, 'utf8'));
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
walk(dir);
|
|
105
|
-
return files;
|
|
106
|
-
}
|
|
107
|
-
/** The same tree keyed by home-relative path, with the home's own absolute path
|
|
108
|
-
* replaced by a token in every file's bytes — a profile manifest stores project
|
|
109
|
-
* paths absolutely — so two fixtures seeded in two temp homes can be compared
|
|
110
|
-
* byte for byte. */
|
|
111
|
-
function relativeTree(dir) {
|
|
112
|
-
const rebased = new Map();
|
|
113
|
-
for (const [path, content] of snapshotTree(dir))
|
|
114
|
-
rebased.set(relative(dir, path), content.split(dir).join('<home>'));
|
|
115
|
-
return rebased;
|
|
116
|
-
}
|
|
117
|
-
function assertTreeUnchanged(before, after) {
|
|
118
|
-
assert.deepEqual([...after.keys()].sort(), [...before.keys()].sort());
|
|
119
|
-
for (const [path, content] of before)
|
|
120
|
-
assert.equal(after.get(path), content, `${path} changed`);
|
|
121
|
-
}
|
|
122
|
-
/** A home the ambient node's own CRTR_* environment cannot leak into: every
|
|
123
|
-
* crtr variable is dropped, so the fixture's canvas/profile/node state is the
|
|
124
|
-
* only state the run can see. */
|
|
125
|
-
function migrateEnv(home, profileId) {
|
|
126
|
-
const env = { ...process.env, HOME: home };
|
|
127
|
-
for (const key of Object.keys(env)) {
|
|
128
|
-
if (key.startsWith('CRTR_'))
|
|
129
|
-
delete env[key];
|
|
130
|
-
}
|
|
131
|
-
env['CRTR_HOME'] = canvasHomeFor(home);
|
|
132
|
-
env['CRTR_PROFILE_ID'] = profileId;
|
|
133
|
-
env['CRTR_NO_DAEMON_AUTOSTART'] = '1';
|
|
134
|
-
env['CRTR_NO_AUTO_INIT'] = '1';
|
|
135
|
-
env['CRTR_NO_AUTO_UPDATE'] = '1';
|
|
136
|
-
return env;
|
|
137
|
-
}
|
|
138
|
-
const migrateDaemons = new Map();
|
|
139
|
-
async function startMigrateDaemon(home) {
|
|
140
|
-
const canvasHome = migrateCanvasHomes.get(home);
|
|
141
|
-
assert.ok(canvasHome, `fixture has no canvas home: ${home}`);
|
|
142
|
-
const fixture = await createSourceDaemonFixture({
|
|
143
|
-
root: dirname(canvasHome),
|
|
144
|
-
home,
|
|
145
|
-
cwd: home,
|
|
146
|
-
canvasHome,
|
|
147
|
-
});
|
|
148
|
-
const process = startSourceDaemon(fixture, { CRTR_PROFILE_ID: 'root-00000000' });
|
|
149
|
-
try {
|
|
150
|
-
await waitForHealth(process, fixture.tcpPort);
|
|
151
|
-
}
|
|
152
|
-
catch (error) {
|
|
153
|
-
await process.stop();
|
|
154
|
-
fixture.dispose();
|
|
155
|
-
throw error;
|
|
156
|
-
}
|
|
157
|
-
migrateDaemons.set(home, { fixture, process });
|
|
158
|
-
}
|
|
159
|
-
async function stopMigrateDaemon(home) {
|
|
160
|
-
const daemon = migrateDaemons.get(home);
|
|
161
|
-
if (daemon === undefined)
|
|
162
|
-
return;
|
|
163
|
-
migrateDaemons.delete(home);
|
|
164
|
-
const exit = await daemon.process.stop();
|
|
165
|
-
daemon.fixture.dispose();
|
|
166
|
-
migrateCanvasHomes.delete(home);
|
|
167
|
-
assert.deepEqual(exit, { code: 0, signal: null }, `migration daemon must stop cleanly; stderr:\n${daemon.process.stderr()}`);
|
|
168
|
-
}
|
|
169
|
-
function seedNodeMemoryTarget(home, target) {
|
|
170
|
-
const canvas = pathToFileURL(join(HERE, '../../../core/canvas/canvas.ts')).href;
|
|
171
|
-
const program = `
|
|
172
|
-
import { createNode } from ${JSON.stringify(canvas)};
|
|
173
|
-
const target = JSON.parse(process.argv[1]);
|
|
174
|
-
createNode({
|
|
175
|
-
node_id: target.nodeId,
|
|
176
|
-
name: target.nodeId,
|
|
177
|
-
created: new Date().toISOString(),
|
|
178
|
-
cwd: target.cwd,
|
|
179
|
-
kind: 'developer',
|
|
180
|
-
mode: 'base',
|
|
181
|
-
lifecycle: 'terminal',
|
|
182
|
-
status: 'done',
|
|
183
|
-
profile_id: target.profileId,
|
|
184
|
-
});
|
|
185
|
-
`;
|
|
186
|
-
const result = spawnSync(process.execPath, ['--conditions=crtr-src', '--import', TSX_LOADER, '--input-type=module', '--eval', program, JSON.stringify(target)], { cwd: home, env: migrateEnv(home, target.profileId ?? 'root-00000000'), encoding: 'utf8' });
|
|
187
|
-
assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`);
|
|
188
|
-
}
|
|
189
|
-
function runMigrate(home, opts = {}) {
|
|
190
|
-
const result = spawnSync(process.execPath, [
|
|
191
|
-
'--conditions=crtr-src',
|
|
192
|
-
'--import',
|
|
193
|
-
TSX_LOADER,
|
|
194
|
-
CLI,
|
|
195
|
-
'sys',
|
|
196
|
-
'migrate',
|
|
197
|
-
'--json',
|
|
198
|
-
...(opts.dryRun === true ? ['--dry-run'] : []),
|
|
199
|
-
...(opts.dirs ?? []).flatMap((dir) => ['--dir', dir]),
|
|
200
|
-
], { cwd: home, env: migrateEnv(home, opts.profileId ?? 'root-00000000'), encoding: 'utf8' });
|
|
201
|
-
return { status: result.status, stdout: result.stdout, stderr: result.stderr };
|
|
202
|
-
}
|
|
203
|
-
function migrateJson(home, opts = {}) {
|
|
204
|
-
const result = runMigrate(home, opts);
|
|
205
|
-
assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`);
|
|
206
|
-
const output = JSON.parse(result.stdout);
|
|
207
|
-
assertReportInvariants(output);
|
|
208
|
-
return output;
|
|
209
|
-
}
|
|
210
|
-
/** The report-schema rules every run obeys: a declaration is always the
|
|
211
|
-
* repository root's own INDEX.md, a nested store's effective prefix is never
|
|
212
|
-
* reported as one, and only a repository-root row can carry a front door. */
|
|
213
|
-
function assertReportInvariants(output) {
|
|
214
|
-
const declarationRoots = new Set();
|
|
215
|
-
for (const row of output.repository_namespaces) {
|
|
216
|
-
assert.equal(row.declaration_path, join(row.repository_root, '.crouter', 'memory', 'INDEX.md'), 'a declaration path is always the repository root\'s own INDEX.md');
|
|
217
|
-
assert.equal(declarationRoots.has(row.repository_root), false, `two decisions for ${row.repository_root}`);
|
|
218
|
-
declarationRoots.add(row.repository_root);
|
|
219
|
-
}
|
|
220
|
-
const declaredNamespaces = new Set(output.repository_namespaces.map((row) => row.namespace));
|
|
221
|
-
for (const row of output.store_prefixes) {
|
|
222
|
-
if (row.owner_relative_path === '') {
|
|
223
|
-
assert.equal(row.owner_dir, row.repository_root);
|
|
224
|
-
continue;
|
|
225
|
-
}
|
|
226
|
-
assert.equal(row.front_door_action, 'none', `${row.store_root} is nested and cannot own a front door`);
|
|
227
|
-
assert.equal(declarationRoots.has(row.owner_dir), false, `${row.owner_dir} is nested, not a repository root`);
|
|
228
|
-
assert.equal(row.effective_prefix.endsWith(`/${row.owner_relative_path}`), true, `${row.effective_prefix} must compose the owner path`);
|
|
229
|
-
assert.equal(declaredNamespaces.has(row.effective_prefix), false, `${row.effective_prefix} is derived from a path, never a declaration`);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
function repositoryRow(output, repositoryRoot) {
|
|
233
|
-
const row = output.repository_namespaces.find((candidate) => candidate.repository_root === repositoryRoot);
|
|
234
|
-
assert.ok(row, `no repository decision for ${repositoryRoot} in ${JSON.stringify(output.repository_namespaces)}`);
|
|
235
|
-
return row;
|
|
236
|
-
}
|
|
237
|
-
function prefixRow(output, ownerDir) {
|
|
238
|
-
const row = output.store_prefixes.find((candidate) => candidate.owner_dir === ownerDir);
|
|
239
|
-
assert.ok(row, `no store prefix for ${ownerDir} in ${JSON.stringify(output.store_prefixes)}`);
|
|
240
|
-
return row;
|
|
241
|
-
}
|
|
242
|
-
function migrateBlocked(home, opts = {}) {
|
|
243
|
-
const result = runMigrate(home, opts);
|
|
244
|
-
assert.notEqual(result.status, 0, `${result.stdout}\n${result.stderr}`);
|
|
245
|
-
return JSON.parse(result.stdout);
|
|
246
|
-
}
|
|
247
|
-
function manifest(name, projects) {
|
|
248
|
-
const first = projects[0];
|
|
249
|
-
return JSON.stringify({
|
|
250
|
-
schema_version: 1,
|
|
251
|
-
name,
|
|
252
|
-
projects,
|
|
253
|
-
home: (typeof first === 'string' ? first : first?.path) ?? null,
|
|
254
|
-
created_at: '2026-01-01T00:00:00.000Z',
|
|
255
|
-
last_used_at: null,
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
test('sys migrate converges manifests, documents, and the whole repository-root corpus', async () => {
|
|
259
|
-
const home = fixtureHome('crtr-sys-migrate-');
|
|
260
|
-
const userRoot = join(home, '.crouter');
|
|
261
|
-
const rootProfile = join(userRoot, 'profiles', 'root-00000000');
|
|
262
|
-
const appletProfile = join(userRoot, 'profiles', 'applet-deadbeef');
|
|
263
|
-
const appletProject = join(home, 'inactive-applet-project');
|
|
264
|
-
const nestedOnlyProject = join(home, 'nested-only-project');
|
|
265
|
-
const extraProject = join(home, 'extra-dir-project');
|
|
266
|
-
const deepOwner = join(appletProject, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
|
|
267
|
-
const deepRoot = join(deepOwner, '.crouter');
|
|
268
|
-
const pluginRoot = join(deepRoot, 'plugins', 'deep-memory');
|
|
269
|
-
const embeddedPluginRoot = join(nestedOnlyProject, 'embedded', '.crouter', 'plugins', 'embedded-memory');
|
|
270
|
-
const disabledPluginRoot = join(userRoot, 'plugins', 'disabled-memory');
|
|
271
|
-
const nodeId = 'node-aaaa1111';
|
|
272
|
-
const nodeStore = join(canvasHomeFor(home), 'nodes', nodeId, 'context', 'memory');
|
|
273
|
-
const userDoc = join(userRoot, 'memory', 'user-link.md');
|
|
274
|
-
const rootDoc = join(rootProfile, 'memory', 'root.md');
|
|
275
|
-
const appletDoc = join(appletProfile, 'memory', 'identity.md');
|
|
276
|
-
const projectIndex = join(appletProject, '.crouter', 'memory', 'INDEX.md');
|
|
277
|
-
const projectDoc = join(appletProject, '.crouter', 'memory', 'project.md');
|
|
278
|
-
const projectPlain = join(appletProject, '.crouter', 'memory', 'plain.md');
|
|
279
|
-
const projectReference = join(appletProject, '.crouter', 'memory', 'notes', 'reference.md');
|
|
280
|
-
const deepDoc = join(deepRoot, 'memory', 'deep.md');
|
|
281
|
-
const deepIndex = join(deepRoot, 'memory', 'INDEX.md');
|
|
282
|
-
const pluginDoc = join(pluginRoot, 'memory', 'plugin.md');
|
|
283
|
-
const embeddedPluginDoc = join(embeddedPluginRoot, 'memory', 'plugin.md');
|
|
284
|
-
const disabledPluginDoc = join(disabledPluginRoot, 'memory', 'guide.md');
|
|
285
|
-
const nodeDoc = join(nodeStore, 'note.md');
|
|
286
|
-
try {
|
|
287
|
-
await startMigrateDaemon(home);
|
|
288
|
-
seedNodeMemoryTarget(home, { nodeId, cwd: appletProject, profileId: 'applet-deadbeef' });
|
|
289
|
-
// Root's string entries migrate to `preview`; every other profile's to
|
|
290
|
-
// `content`. The applet manifest is mixed: its already-current entry must
|
|
291
|
-
// survive untouched while the string beside it converts.
|
|
292
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [appletProject]));
|
|
293
|
-
write(join(appletProfile, 'profile.json'), manifest('applet-inactive', [{ path: appletProject, memory: 'name' }, nestedOnlyProject]));
|
|
294
|
-
// User store: `[[user/scoped]]` names no document under either identity
|
|
295
|
-
// rule, so it is a pre-existing dangling link the cut never touches.
|
|
296
|
-
write(userDoc, `${OLD_DOC}\nSee [[user/scoped]].\n`);
|
|
297
|
-
write(join(userRoot, 'memory', 'scoped', 'INDEX.md'), CURRENT_DOC);
|
|
298
|
-
// Root profile store: an INDEX spelling to collapse, an unqualified project
|
|
299
|
-
// name outside its own target stack, and a name its own target stack cannot see.
|
|
300
|
-
write(rootDoc, `${OLD_DOC}\nSee [[notes/INDEX]], [[project]], and [[shared]].\n`);
|
|
301
|
-
write(join(rootProfile, 'memory', 'notes', 'INDEX.md'), CURRENT_DOC);
|
|
302
|
-
write(appletDoc, `${OLD_DOC}\nSee [[shared]].\n`);
|
|
303
|
-
write(join(appletProfile, 'memory', 'shared', 'INDEX.md'), CURRENT_DOC);
|
|
304
|
-
// Repository-root store: a root document that gains the repository
|
|
305
|
-
// declaration AND carries both a link and a route rewrite, so one file
|
|
306
|
-
// lands in both write phases; an explicit name to strip; a redundant
|
|
307
|
-
// explicit name to drop. The route's `match:` is a BLOCK SEQUENCE: this root
|
|
308
|
-
// owes a front door, and completing one re-renders the whole `surfaces:`
|
|
309
|
-
// list, so the translated glob must survive that round trip.
|
|
310
|
-
write(projectIndex, `---
|
|
311
|
-
kind: knowledge
|
|
312
|
-
surfaces:
|
|
313
|
-
- on: memory-read
|
|
314
|
-
match:
|
|
315
|
-
- topics/*
|
|
316
|
-
at: content
|
|
317
|
-
---
|
|
318
|
-
# Applet Project
|
|
319
|
-
|
|
320
|
-
See [[project]].
|
|
321
|
-
`);
|
|
322
|
-
write(projectDoc, OLD_DOC);
|
|
323
|
-
write(join(appletProject, '.crouter', 'memory', 'scoped', 'INDEX.md'), CURRENT_DOC);
|
|
324
|
-
write(projectPlain, `---\nkind: knowledge\nname: plain\n---\n# Redundant name\n`);
|
|
325
|
-
// A FOLDED explicit name: its value spans two lines, so rewriting it must
|
|
326
|
-
// stop at the value's last character and leave the next key standing.
|
|
327
|
-
write(projectReference, `---\nname: >-\n applet-project/reference\nkind: knowledge\n---\n# Namespaced name\n`);
|
|
328
|
-
write(join(appletProject, '.crouter', 'memory', 'topics', 'one.md'), CURRENT_DOC);
|
|
329
|
-
write(join(appletProject, '.crouter', 'memory', 'topics', 'two.md'), CURRENT_DOC);
|
|
330
|
-
// A nested store eight directories below the repository root: it declares
|
|
331
|
-
// nothing, needs no root index, and answers under the repository namespace
|
|
332
|
-
// composed with its own path.
|
|
333
|
-
write(deepDoc, OLD_DOC);
|
|
334
|
-
write(join(pluginRoot, '.crouter-plugin', 'plugin.json'), JSON.stringify({ name: 'deep-memory', version: '1.0.0' }));
|
|
335
|
-
write(pluginDoc, OLD_DOC);
|
|
336
|
-
write(join(embeddedPluginRoot, '.crouter-plugin', 'plugin.json'), JSON.stringify({ name: 'embedded-memory', version: '1.0.0' }));
|
|
337
|
-
write(join(nestedOnlyProject, 'embedded', '.git', 'HEAD'), 'ref: refs/heads/main\n');
|
|
338
|
-
write(embeddedPluginDoc, OLD_DOC);
|
|
339
|
-
// A DISABLED plugin: no target mounts it, so its references resolve against
|
|
340
|
-
// its own store alone — and it is still migrated.
|
|
341
|
-
writeUserConfig(home, { plugins: { 'disabled-memory': { enabled: false } } });
|
|
342
|
-
write(join(disabledPluginRoot, '.crouter-plugin', 'plugin.json'), JSON.stringify({ name: 'disabled-memory', version: '1.0.0' }));
|
|
343
|
-
write(join(disabledPluginRoot, 'memory', 'notes', 'INDEX.md'), CURRENT_DOC);
|
|
344
|
-
write(disabledPluginDoc, `${CURRENT_DOC}\nSee [[disabled-memory/notes/INDEX]].\n`);
|
|
345
|
-
// A node store whose SQL row was seeded before its documents. No meta.json
|
|
346
|
-
// exists: corpus discovery must use the daemon-owned roster.
|
|
347
|
-
write(nodeDoc, `${CURRENT_DOC}\nSee [[project]].\n`);
|
|
348
|
-
// Reached by --dir only: no manifest names it and it is under no discovered
|
|
349
|
-
// project root. Its `name:` is the FIRST frontmatter key, so the removal and
|
|
350
|
-
// the `namespace:` insert share one offset — the shape that corrupts the
|
|
351
|
-
// file if the two splices apply in the wrong order.
|
|
352
|
-
write(join(extraProject, '.crouter', 'memory', 'INDEX.md'), `---\nname: extra-dir-project\nkind: knowledge\n---\n# Extra Dir Project\n`);
|
|
353
|
-
write(join(extraProject, '.crouter', 'memory', 'topic.md'), CURRENT_DOC);
|
|
354
|
-
const invisible = migrateJson(home, { dryRun: true });
|
|
355
|
-
assert.deepEqual(readMarker(home), onDiskMigrationIdentity(), 'the daemon completed its empty-corpus startup before fixture bytes were seeded');
|
|
356
|
-
assert.equal(invisible.discovered_stores.some((row) => row.store.startsWith(extraProject)), false, 'the --dir project must be outside the ambient discovery frontier');
|
|
357
|
-
const output = migrateJson(home, { dirs: [extraProject] });
|
|
358
|
-
assert.deepEqual(readMarker(home), onDiskMigrationIdentity());
|
|
359
|
-
assert.equal(output.profiles, 2);
|
|
360
|
-
assert.equal(output.stores, 11);
|
|
361
|
-
assert.equal(output.blockers.length, 0);
|
|
362
|
-
// 002 — profile manifests.
|
|
363
|
-
const readProjects = (dir) => JSON.parse(readFileSync(join(dir, 'profile.json'), 'utf8')).projects;
|
|
364
|
-
assert.deepEqual(readProjects(rootProfile), [{ path: appletProject, memory: 'preview' }]);
|
|
365
|
-
assert.deepEqual(readProjects(appletProfile), [
|
|
366
|
-
{ path: appletProject, memory: 'name' },
|
|
367
|
-
{ path: nestedOnlyProject, memory: 'content' },
|
|
368
|
-
]);
|
|
369
|
-
// 001 — every old-format document, in every store kind, converged.
|
|
370
|
-
for (const path of [userDoc, rootDoc, appletDoc, projectDoc, deepDoc, pluginDoc, embeddedPluginDoc]) {
|
|
371
|
-
const migrated = readFileSync(path, 'utf8');
|
|
372
|
-
assert.doesNotMatch(migrated, /system-prompt-visibility|file-read-visibility/);
|
|
373
|
-
assert.match(migrated, /surfaces:\n - on: boot\n at: content/);
|
|
374
|
-
}
|
|
375
|
-
const nodeTarget = output.discovered_targets.find((row) => row.kind === 'node');
|
|
376
|
-
assert.equal(nodeTarget?.node_id, nodeId);
|
|
377
|
-
assert.equal(nodeTarget?.origin, nodeId);
|
|
378
|
-
// A disabled plugin: discovered, mounted by no target, migrated anyway.
|
|
379
|
-
const disabledStore = output.discovered_stores.find((row) => row.store.startsWith(disabledPluginRoot));
|
|
380
|
-
assert.equal(disabledStore?.writable, true);
|
|
381
|
-
assert.deepEqual(disabledStore?.targets, []);
|
|
382
|
-
assert.match(readFileSync(disabledPluginDoc, 'utf8'), /\[\[disabled-memory\/notes\]\]/);
|
|
383
|
-
// The --dir project entered discovery as an explicit root, and is its own
|
|
384
|
-
// repository: home is fenced out of the non-git ancestor walk.
|
|
385
|
-
const extraStore = output.discovered_stores.find((row) => row.store.startsWith(extraProject));
|
|
386
|
-
assert.equal(extraStore?.reasons.includes('explicit-dir'), true);
|
|
387
|
-
assert.deepEqual(repositoryRow(output, extraProject), {
|
|
388
|
-
repository_root: extraProject,
|
|
389
|
-
repository_key: `path:${extraProject}`,
|
|
390
|
-
declaration_path: join(extraProject, '.crouter', 'memory', 'INDEX.md'),
|
|
391
|
-
namespace: 'extra-dir-project',
|
|
392
|
-
source: 'root-name',
|
|
393
|
-
action: 'kept',
|
|
394
|
-
});
|
|
395
|
-
// The declaration replaces the first-key `name:`, byte for byte, and the
|
|
396
|
-
// root gains the front door the repository owes.
|
|
397
|
-
assert.equal(readFileSync(join(extraProject, '.crouter', 'memory', 'INDEX.md'), 'utf8'), `---
|
|
398
|
-
namespace: extra-dir-project
|
|
399
|
-
kind: knowledge
|
|
400
|
-
surfaces:
|
|
401
|
-
- on: workspace-open
|
|
402
|
-
at: content
|
|
403
|
-
- on: read
|
|
404
|
-
match: ./**
|
|
405
|
-
at: content
|
|
406
|
-
---
|
|
407
|
-
# Extra Dir Project
|
|
408
|
-
`);
|
|
409
|
-
// ONE repository decision for the applet repository, derived from the root
|
|
410
|
-
// guide's H1 — the eight-deep descendant store adds no second decision.
|
|
411
|
-
assert.deepEqual(output.repository_namespaces.filter((row) => row.repository_root.startsWith(appletProject)), [
|
|
412
|
-
{
|
|
413
|
-
repository_root: appletProject,
|
|
414
|
-
repository_key: `path:${appletProject}`,
|
|
415
|
-
declaration_path: projectIndex,
|
|
416
|
-
namespace: 'applet-project',
|
|
417
|
-
source: 'root-guide-h1',
|
|
418
|
-
action: 'kept',
|
|
419
|
-
},
|
|
420
|
-
]);
|
|
421
|
-
// One store-prefix row per project store: the repository root at `''`, the
|
|
422
|
-
// descendant at its normalized path under it. Plugin, user, profile, and
|
|
423
|
-
// node stores are not project stores and carry no row.
|
|
424
|
-
assert.deepEqual(output.store_prefixes.map((row) => [row.owner_dir, row.owner_relative_path, row.effective_prefix, row.front_door_action]).sort(), [
|
|
425
|
-
[appletProject, '', 'applet-project', 'created-root'],
|
|
426
|
-
[deepOwner, 'a/b/c/d/e/f/g/h', 'applet-project/a/b/c/d/e/f/g/h', 'none'],
|
|
427
|
-
[extraProject, '', 'extra-dir-project', 'created-root'],
|
|
428
|
-
].sort());
|
|
429
|
-
assert.equal(prefixRow(output, deepOwner).nested_declaration_action, 'none');
|
|
430
|
-
assert.equal(prefixRow(output, deepOwner).old_rule, 'pre-003');
|
|
431
|
-
// A nested store owes no root index and is never handed a synthetic one.
|
|
432
|
-
assert.equal(existsSync(deepIndex), false);
|
|
433
|
-
// Discovery reports each store as the run FOUND it: before this cut nothing
|
|
434
|
-
// up the tree declares a namespace, so the deep store mounts nowhere.
|
|
435
|
-
const deepStoreBefore = output.discovered_stores.find((row) => row.store === join(deepRoot, 'memory'));
|
|
436
|
-
assert.equal(deepStoreBefore?.namespace, '');
|
|
437
|
-
assert.equal(deepStoreBefore?.mount_status, 'undeclared');
|
|
438
|
-
assert.equal(output.renames.some((row) => row.path === deepDoc && row.from === 'deep' && row.to === 'applet-project/a/b/c/d/e/f/g/h/deep'), true, JSON.stringify(output.renames));
|
|
439
|
-
// Identity rewrites in the repository-root store.
|
|
440
|
-
const projectIndexText = readFileSync(projectIndex, 'utf8');
|
|
441
|
-
assert.match(projectIndexText, /^---\nnamespace: applet-project\n/);
|
|
442
|
-
assert.equal(readFileSync(projectPlain, 'utf8'), `---\nkind: knowledge\n---\n# Redundant name\n`);
|
|
443
|
-
assert.equal(readFileSync(projectReference, 'utf8'), `---\nname: reference\nkind: knowledge\n---\n# Namespaced name\n`);
|
|
444
|
-
assert.equal(output.renames.some((row) => row.path === projectDoc && row.from === 'project' && row.to === 'applet-project/project'), true);
|
|
445
|
-
// Reference rewrites: qualification across stores, one INDEX collapse, and
|
|
446
|
-
// an absolute memory-read route split-proof — the route and the link ride
|
|
447
|
-
// the same file as its own identity rewrite and its own front-door
|
|
448
|
-
// completion.
|
|
449
|
-
const rootDocText = readFileSync(rootDoc, 'utf8');
|
|
450
|
-
assert.match(rootDocText, /\[\[notes\]\]/);
|
|
451
|
-
assert.match(rootDocText, /\[\[project\]\]/);
|
|
452
|
-
assert.match(rootDocText, /\[\[shared\]\]/);
|
|
453
|
-
assert.match(readFileSync(userDoc, 'utf8'), /\[\[user\/scoped\]\]/);
|
|
454
|
-
assert.match(readFileSync(appletDoc, 'utf8'), /\[\[shared\]\]/);
|
|
455
|
-
assert.match(readFileSync(nodeDoc, 'utf8'), /\[\[applet-project\/project\]\]/);
|
|
456
|
-
assert.equal(projectIndexText, `---
|
|
457
|
-
namespace: applet-project
|
|
458
|
-
kind: knowledge
|
|
459
|
-
surfaces:
|
|
460
|
-
- on: memory-read
|
|
461
|
-
match: applet-project/topics/*
|
|
462
|
-
at: content
|
|
463
|
-
- on: workspace-open
|
|
464
|
-
at: content
|
|
465
|
-
- on: read
|
|
466
|
-
match: ./**
|
|
467
|
-
at: content
|
|
468
|
-
---
|
|
469
|
-
# Applet Project
|
|
470
|
-
|
|
471
|
-
See [[applet-project/project]].
|
|
472
|
-
`);
|
|
473
|
-
assert.equal(output.references.some((row) => row.kind === 'memory-read' && row.from === 'topics/*' && row.to === 'applet-project/topics/*'), true);
|
|
474
|
-
// A second run over converged state writes nothing.
|
|
475
|
-
const converged = snapshotTree(home);
|
|
476
|
-
// A no-change forced run still replaces an outdated completion marker.
|
|
477
|
-
writeFileSync(markerPath(home), JSON.stringify([{ id: 'older-migration', lane: 'convergent' }]));
|
|
478
|
-
const second = migrateJson(home, { dirs: [extraProject] });
|
|
479
|
-
assert.equal(second.changed, 0);
|
|
480
|
-
assert.deepEqual(readMarker(home), onDiskMigrationIdentity());
|
|
481
|
-
assert.deepEqual(second.applied, []);
|
|
482
|
-
assert.deepEqual(second.references, []);
|
|
483
|
-
// The old side is reconstructed from FILE TRUTH alone, and a cut corpus is
|
|
484
|
-
// final authority, not old authority: the repository root's kept declaration
|
|
485
|
-
// is what the deep store already answers under, and no document there
|
|
486
|
-
// carries an explicit name this cut would rewrite. So the deep store's row
|
|
487
|
-
// reports that same prefix as its old one and NOTHING moves — no rename, no
|
|
488
|
-
// reference rewrite, no splice, and a byte-identical tree.
|
|
489
|
-
assert.deepEqual(second.renames, []);
|
|
490
|
-
assert.equal(prefixRow(second, deepOwner).old_rule, 'per-store-declaration');
|
|
491
|
-
assert.equal(prefixRow(second, deepOwner).old_prefix, 'applet-project/a/b/c/d/e/f/g/h');
|
|
492
|
-
assert.equal(repositoryRow(second, appletProject).source, 'declared');
|
|
493
|
-
assert.equal(prefixRow(second, appletProject).front_door_action, 'kept-root');
|
|
494
|
-
// The runtime resolver composes exactly the prefix the migration reported:
|
|
495
|
-
// the deep store now mounts under the repository namespace plus its path.
|
|
496
|
-
const deepStoreAfter = second.discovered_stores.find((row) => row.store === join(deepRoot, 'memory'));
|
|
497
|
-
assert.equal(deepStoreAfter?.namespace, 'applet-project/a/b/c/d/e/f/g/h');
|
|
498
|
-
assert.equal(deepStoreAfter?.mount_status, 'ready');
|
|
499
|
-
assertTreeUnchanged(converged, snapshotTree(home));
|
|
500
|
-
const currentMarker = readFileSync(markerPath(home), 'utf8');
|
|
501
|
-
const preview = migrateJson(home, { dirs: [extraProject], dryRun: true });
|
|
502
|
-
assert.equal(preview.changed, 0);
|
|
503
|
-
assert.equal(readFileSync(markerPath(home), 'utf8'), currentMarker);
|
|
504
|
-
// Interruption-shaped state under a current marker: the explicit command
|
|
505
|
-
// must still finish the cut from file truth alone.
|
|
506
|
-
writeFileSync(projectIndex, projectIndexText.replace('namespace: applet-project\n', ''));
|
|
507
|
-
writeFileSync(projectPlain, readFileSync(projectPlain, 'utf8').replace('kind: knowledge\n', 'kind: knowledge\nname: plain\n'));
|
|
508
|
-
const resumed = migrateJson(home, { dirs: [extraProject] });
|
|
509
|
-
assert.equal(resumed.blockers.length, 0);
|
|
510
|
-
assert.deepEqual(readMarker(home), onDiskMigrationIdentity());
|
|
511
|
-
assertTreeUnchanged(converged, snapshotTree(home));
|
|
512
|
-
}
|
|
513
|
-
finally {
|
|
514
|
-
await stopMigrateDaemon(home);
|
|
515
|
-
rmSync(home, { recursive: true, force: true });
|
|
516
|
-
}
|
|
517
|
-
});
|
|
518
|
-
/** The identity state a corpus can start from: never migrated at all, or
|
|
519
|
-
* carrying the superseded per-store 003 output plus its completion marker. */
|
|
520
|
-
function seedConvergenceFixture(home, start) {
|
|
521
|
-
const userRoot = join(home, '.crouter');
|
|
522
|
-
const rootProfile = join(userRoot, 'profiles', 'root-00000000');
|
|
523
|
-
const project = join(home, 'conv-project');
|
|
524
|
-
const nestedOwner = join(project, 'pkg');
|
|
525
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
|
|
526
|
-
write(join(project, '.crouter', 'memory', 'guide.md'), CURRENT_DOC);
|
|
527
|
-
write(join(nestedOwner, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
|
|
528
|
-
if (start === 'pre-003') {
|
|
529
|
-
// Nothing declares a namespace, so both documents answer under their own
|
|
530
|
-
// local names and the user store's links name them that way.
|
|
531
|
-
write(join(userRoot, 'memory', 'pointer.md'), `${CURRENT_DOC}\nSee [[guide]] and [[note]].\n`);
|
|
532
|
-
write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Conv Project\n`);
|
|
533
|
-
return;
|
|
534
|
-
}
|
|
535
|
-
// Exactly what the superseded migration wrote: a per-store declaration on the
|
|
536
|
-
// repository root, a synthetic identity-only index on the nested store whose
|
|
537
|
-
// namespace is its own bare directory name, the links it translated to those
|
|
538
|
-
// two per-store prefixes, and the old id in the completion marker.
|
|
539
|
-
write(join(userRoot, 'memory', 'pointer.md'), `${CURRENT_DOC}\nSee [[conv-project/guide]] and [[pkg/note]].\n`);
|
|
540
|
-
write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: conv-project\nkind: knowledge\n---\n# Conv Project\n`);
|
|
541
|
-
write(join(nestedOwner, '.crouter', 'memory', 'INDEX.md'), supersededSyntheticIndex('pkg'));
|
|
542
|
-
write(markerPath(home), JSON.stringify([{ id: '003-workspace-qualified-memory-identity', lane: 'corpus' }]));
|
|
543
|
-
}
|
|
544
|
-
test('pre-003 and superseded-003 corpora converge to the same bytes and the same current marker', async () => {
|
|
545
|
-
const preHome = fixtureHome('crtr-sys-migrate-conv-pre-');
|
|
546
|
-
const oldHome = fixtureHome('crtr-sys-migrate-conv-old-');
|
|
547
|
-
try {
|
|
548
|
-
await startMigrateDaemon(preHome);
|
|
549
|
-
await startMigrateDaemon(oldHome);
|
|
550
|
-
seedConvergenceFixture(preHome, 'pre-003');
|
|
551
|
-
seedConvergenceFixture(oldHome, 'superseded-003');
|
|
552
|
-
const fromPre = migrateJson(preHome);
|
|
553
|
-
const fromOld = migrateJson(oldHome);
|
|
554
|
-
assert.deepEqual(fromPre.blockers, []);
|
|
555
|
-
assert.deepEqual(fromOld.blockers, []);
|
|
556
|
-
assert.deepEqual(readMarker(preHome), onDiskMigrationIdentity());
|
|
557
|
-
assert.deepEqual(readMarker(oldHome), onDiskMigrationIdentity());
|
|
558
|
-
// The superseded run's synthetic nested index is identity-only and is
|
|
559
|
-
// deleted, not emptied — so both corpora hold the same files.
|
|
560
|
-
assert.equal(existsSync(join(oldHome, 'conv-project', 'pkg', '.crouter', 'memory', 'INDEX.md')), false);
|
|
561
|
-
assertTreeUnchanged(relativeTree(preHome), relativeTree(oldHome));
|
|
562
|
-
// Both start states' links land on the one composed name: the local name the
|
|
563
|
-
// pre-003 corpus used and the bare per-store prefix the superseded one used
|
|
564
|
-
// are the SAME document, and it now answers under the repository.
|
|
565
|
-
assert.equal(readFileSync(join(preHome, '.crouter', 'memory', 'pointer.md'), 'utf8'), `${CURRENT_DOC}\nSee [[conv-project/guide]] and [[conv-project/pkg/note]].\n`);
|
|
566
|
-
// Both report the same identity facts even though they started differently,
|
|
567
|
-
// and each proves the move its own legacy state owed: the nested document
|
|
568
|
-
// answered at a bare local name pre-003 and at its own per-store declaration
|
|
569
|
-
// after the superseded run, and lands on the repository-composed name from
|
|
570
|
-
// either. The second run over that finished corpus is the convergence proof
|
|
571
|
-
// — nothing moved, so nothing is renamed or rewritten.
|
|
572
|
-
for (const [home, output, oldRule, nestedOldName] of [
|
|
573
|
-
[preHome, fromPre, 'pre-003', 'note'],
|
|
574
|
-
[oldHome, fromOld, 'per-store-declaration', 'pkg/note'],
|
|
575
|
-
]) {
|
|
576
|
-
const project = join(home, 'conv-project');
|
|
577
|
-
assert.equal(repositoryRow(output, project).namespace, 'conv-project');
|
|
578
|
-
assert.equal(prefixRow(output, join(project, 'pkg')).effective_prefix, 'conv-project/pkg');
|
|
579
|
-
assert.equal(prefixRow(output, join(project, 'pkg')).old_rule, oldRule);
|
|
580
|
-
assert.equal(output.renames.some((row) => row.path === join(project, 'pkg', '.crouter', 'memory', 'note.md') &&
|
|
581
|
-
row.from === nestedOldName &&
|
|
582
|
-
row.to === 'conv-project/pkg/note'), true, JSON.stringify(output.renames));
|
|
583
|
-
const converged = snapshotTree(home);
|
|
584
|
-
const secondRun = migrateJson(home);
|
|
585
|
-
assert.equal(secondRun.changed, 0);
|
|
586
|
-
assert.deepEqual(secondRun.renames, []);
|
|
587
|
-
assert.deepEqual(secondRun.references, []);
|
|
588
|
-
assertTreeUnchanged(converged, snapshotTree(home));
|
|
589
|
-
}
|
|
590
|
-
assert.equal(prefixRow(fromOld, join(oldHome, 'conv-project', 'pkg')).nested_declaration_action, 'synthetic-index-removed');
|
|
591
|
-
assert.equal(prefixRow(fromPre, join(preHome, 'conv-project', 'pkg')).nested_declaration_action, 'none');
|
|
592
|
-
}
|
|
593
|
-
finally {
|
|
594
|
-
await stopMigrateDaemon(preHome);
|
|
595
|
-
await stopMigrateDaemon(oldHome);
|
|
596
|
-
rmSync(preHome, { recursive: true, force: true });
|
|
597
|
-
rmSync(oldHome, { recursive: true, force: true });
|
|
598
|
-
}
|
|
599
|
-
});
|
|
600
|
-
test('a repository declaration is kept when declared, derived from the root guide, or created when no root index exists', async () => {
|
|
601
|
-
const home = fixtureHome('crtr-sys-migrate-decisions-');
|
|
602
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
603
|
-
const kept = join(home, 'kept-project');
|
|
604
|
-
const derived = join(home, 'derived-project');
|
|
605
|
-
const created = join(home, 'created-project');
|
|
606
|
-
try {
|
|
607
|
-
await startMigrateDaemon(home);
|
|
608
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [kept, derived, created].map((path) => ({ path, memory: 'content' }))));
|
|
609
|
-
write(join(kept, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: kept-ns\nkind: knowledge\n---\n# Kept\n`);
|
|
610
|
-
write(join(kept, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
|
|
611
|
-
write(join(derived, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Derived Title\n`);
|
|
612
|
-
// No root index at all: the declaration is created rather than edited.
|
|
613
|
-
write(join(created, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
|
|
614
|
-
const output = migrateJson(home);
|
|
615
|
-
assert.deepEqual(output.blockers, []);
|
|
616
|
-
assert.deepEqual(output.repository_namespaces.map((row) => [row.repository_root, row.namespace, row.source, row.action]).sort(), [
|
|
617
|
-
[created, 'created-project', 'owner-basename', 'created'],
|
|
618
|
-
[derived, 'derived-title', 'root-guide-h1', 'kept'],
|
|
619
|
-
[kept, 'kept-ns', 'declared', 'kept'],
|
|
620
|
-
].sort());
|
|
621
|
-
assert.equal(readFileSync(join(kept, '.crouter', 'memory', 'INDEX.md'), 'utf8').startsWith('---\nnamespace: kept-ns\n'), true, 'a valid declaration is never rewritten');
|
|
622
|
-
assert.equal(readFileSync(join(created, '.crouter', 'memory', 'INDEX.md'), 'utf8'), `---
|
|
623
|
-
namespace: "created-project"
|
|
624
|
-
kind: knowledge
|
|
625
|
-
when-and-why-to-read: When working in \`created-project\`, this knowledge should be read because it names the namespace every document in this repository answers under.
|
|
626
|
-
surfaces:
|
|
627
|
-
- on: workspace-open
|
|
628
|
-
at: content
|
|
629
|
-
- on: read
|
|
630
|
-
match: "./**"
|
|
631
|
-
at: content
|
|
632
|
-
---
|
|
633
|
-
|
|
634
|
-
# created-project
|
|
635
|
-
|
|
636
|
-
This project's memory store. Every document here answers at \`created-project/<local name>\`.
|
|
637
|
-
`);
|
|
638
|
-
assert.equal(migrateJson(home).changed, 0);
|
|
639
|
-
}
|
|
640
|
-
finally {
|
|
641
|
-
await stopMigrateDaemon(home);
|
|
642
|
-
rmSync(home, { recursive: true, force: true });
|
|
643
|
-
}
|
|
644
|
-
});
|
|
645
|
-
test('a git repository whose only stores are descendants gets its repository-root declaration created', async () => {
|
|
646
|
-
const home = fixtureHome('crtr-sys-migrate-git-descendant-');
|
|
647
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
648
|
-
const repo = join(home, 'pkg-repo');
|
|
649
|
-
const nestedOwner = join(repo, 'pkg');
|
|
650
|
-
try {
|
|
651
|
-
await startMigrateDaemon(home);
|
|
652
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: repo, memory: 'content' }]));
|
|
653
|
-
initRepo(repo);
|
|
654
|
-
write(join(nestedOwner, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
|
|
655
|
-
const output = migrateJson(home);
|
|
656
|
-
assert.deepEqual(output.blockers, []);
|
|
657
|
-
assert.deepEqual(output.repository_namespaces, [
|
|
658
|
-
{
|
|
659
|
-
repository_root: repo,
|
|
660
|
-
repository_key: `git:${join(repo, '.git')}`,
|
|
661
|
-
declaration_path: join(repo, '.crouter', 'memory', 'INDEX.md'),
|
|
662
|
-
namespace: 'pkg-repo',
|
|
663
|
-
source: 'git-worktree',
|
|
664
|
-
action: 'created',
|
|
665
|
-
},
|
|
666
|
-
]);
|
|
667
|
-
assert.deepEqual(output.store_prefixes.map((row) => [row.owner_dir, row.owner_relative_path, row.effective_prefix]), [[nestedOwner, 'pkg', 'pkg-repo/pkg']]);
|
|
668
|
-
assert.match(readFileSync(join(repo, '.crouter', 'memory', 'INDEX.md'), 'utf8'), /^---\nnamespace: "pkg-repo"\n/);
|
|
669
|
-
assert.equal(output.renames.some((row) => row.from === 'note' && row.to === 'pkg-repo/pkg/note'), true, JSON.stringify(output.renames));
|
|
670
|
-
const second = migrateJson(home);
|
|
671
|
-
assert.equal(second.changed, 0, JSON.stringify(second.applied));
|
|
672
|
-
}
|
|
673
|
-
finally {
|
|
674
|
-
await stopMigrateDaemon(home);
|
|
675
|
-
rmSync(home, { recursive: true, force: true });
|
|
676
|
-
}
|
|
677
|
-
});
|
|
678
|
-
test('linked worktrees agree on one declaration, and a linked root missing one is filled from it', async () => {
|
|
679
|
-
for (const mode of ['agree', 'fill']) {
|
|
680
|
-
const home = fixtureHome(`crtr-sys-migrate-worktree-${mode}-`);
|
|
681
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
682
|
-
const main = join(home, 'shared-main');
|
|
683
|
-
const linked = join(home, 'shared-linked');
|
|
684
|
-
try {
|
|
685
|
-
await startMigrateDaemon(home);
|
|
686
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [main, linked].map((path) => ({ path, memory: 'content' }))));
|
|
687
|
-
initRepo(main);
|
|
688
|
-
git(main, 'worktree', 'add', linked, '-b', 'linked');
|
|
689
|
-
// Written after the worktree exists, so each checkout carries its own
|
|
690
|
-
// untracked declaration rather than a copy of the other's.
|
|
691
|
-
write(join(main, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: shared-code\nkind: knowledge\n---\n# Shared\n`);
|
|
692
|
-
write(join(main, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
|
|
693
|
-
write(join(linked, '.crouter', 'memory', 'INDEX.md'), mode === 'agree'
|
|
694
|
-
? `---\nnamespace: shared-code\nkind: knowledge\n---\n# Shared\n`
|
|
695
|
-
: `---\nkind: knowledge\n---\n# Shared\n`);
|
|
696
|
-
const output = migrateJson(home);
|
|
697
|
-
assert.deepEqual(output.blockers, []);
|
|
698
|
-
const mainRow = repositoryRow(output, main);
|
|
699
|
-
const linkedRow = repositoryRow(output, linked);
|
|
700
|
-
// One repository key, two physical roots, one namespace.
|
|
701
|
-
assert.equal(mainRow.repository_key, `git:${join(main, '.git')}`);
|
|
702
|
-
assert.equal(linkedRow.repository_key, mainRow.repository_key);
|
|
703
|
-
assert.equal(mainRow.namespace, 'shared-code');
|
|
704
|
-
assert.equal(linkedRow.namespace, 'shared-code');
|
|
705
|
-
assert.equal(mainRow.action, 'kept');
|
|
706
|
-
assert.equal(linkedRow.action, mode === 'agree' ? 'kept' : 'filled-linked-root');
|
|
707
|
-
assert.match(readFileSync(join(linked, '.crouter', 'memory', 'INDEX.md'), 'utf8'), /^---\nnamespace: shared-code\n/);
|
|
708
|
-
assert.equal(migrateJson(home).changed, 0);
|
|
709
|
-
}
|
|
710
|
-
finally {
|
|
711
|
-
await stopMigrateDaemon(home);
|
|
712
|
-
rmSync(home, { recursive: true, force: true });
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
});
|
|
716
|
-
test('linked worktree roots declaring different namespaces block the corpus', async () => {
|
|
717
|
-
const home = fixtureHome('crtr-sys-migrate-worktree-conflict-');
|
|
718
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
719
|
-
const main = join(home, 'shared-main');
|
|
720
|
-
const linked = join(home, 'shared-linked');
|
|
721
|
-
try {
|
|
722
|
-
await startMigrateDaemon(home);
|
|
723
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [main, linked].map((path) => ({ path, memory: 'content' }))));
|
|
724
|
-
initRepo(main);
|
|
725
|
-
git(main, 'worktree', 'add', linked, '-b', 'linked');
|
|
726
|
-
write(join(main, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: main-ns\nkind: knowledge\n---\n# Shared\n`);
|
|
727
|
-
write(join(linked, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: linked-ns\nkind: knowledge\n---\n# Shared\n`);
|
|
728
|
-
const before = snapshotTree(main);
|
|
729
|
-
const payload = migrateBlocked(home);
|
|
730
|
-
const blocker = payload.received.blockers.find((row) => /declare different namespaces/.test(row.message));
|
|
731
|
-
assert.ok(blocker, JSON.stringify(payload.received.blockers));
|
|
732
|
-
assert.equal(blocker.kind, 'namespace');
|
|
733
|
-
assert.deepEqual(blocker.paths?.sort(), [
|
|
734
|
-
join(linked, '.crouter', 'memory', 'INDEX.md'),
|
|
735
|
-
join(main, '.crouter', 'memory', 'INDEX.md'),
|
|
736
|
-
].sort());
|
|
737
|
-
assert.equal(payload.received.corpus_phase, 'not-started');
|
|
738
|
-
assertTreeUnchanged(before, snapshotTree(main));
|
|
739
|
-
}
|
|
740
|
-
finally {
|
|
741
|
-
await stopMigrateDaemon(home);
|
|
742
|
-
rmSync(home, { recursive: true, force: true });
|
|
743
|
-
}
|
|
744
|
-
});
|
|
745
|
-
test('a nested declaration is removed, an exact synthetic index is deleted, and a substantive one is kept', async () => {
|
|
746
|
-
const home = fixtureHome('crtr-sys-migrate-nested-declarations-');
|
|
747
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
748
|
-
const project = join(home, 'nest-repo');
|
|
749
|
-
const syntheticOwner = join(project, 'syn');
|
|
750
|
-
const substantiveOwner = join(project, 'sub');
|
|
751
|
-
const syntheticIndex = join(syntheticOwner, '.crouter', 'memory', 'INDEX.md');
|
|
752
|
-
const substantiveIndex = join(substantiveOwner, '.crouter', 'memory', 'INDEX.md');
|
|
753
|
-
try {
|
|
754
|
-
await startMigrateDaemon(home);
|
|
755
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
|
|
756
|
-
write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nnamespace: nest-repo\nkind: knowledge\n---\n# Nest Repo\n`);
|
|
757
|
-
write(syntheticIndex, supersededSyntheticIndex('syn'));
|
|
758
|
-
write(join(syntheticOwner, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
|
|
759
|
-
write(substantiveIndex, `---\nnamespace: sub\nkind: knowledge\n---\n# Sub package\n\nReal guidance a reader loses if this file is deleted.\n`);
|
|
760
|
-
const output = migrateJson(home);
|
|
761
|
-
assert.deepEqual(output.blockers, []);
|
|
762
|
-
assert.equal(prefixRow(output, syntheticOwner).nested_declaration_action, 'synthetic-index-removed');
|
|
763
|
-
assert.equal(prefixRow(output, substantiveOwner).nested_declaration_action, 'removed');
|
|
764
|
-
assert.equal(existsSync(syntheticIndex), false, 'the identity-only template is deleted, not emptied');
|
|
765
|
-
assert.equal(readFileSync(substantiveIndex, 'utf8'), `---\nkind: knowledge\n---\n# Sub package\n\nReal guidance a reader loses if this file is deleted.\n`);
|
|
766
|
-
assert.equal(output.renames.some((row) => row.from === 'syn/note' && row.to === 'nest-repo/syn/note'), true, JSON.stringify(output.renames));
|
|
767
|
-
assert.equal(output.renames.some((row) => row.path === substantiveIndex && row.from === 'sub' && row.to === 'nest-repo/sub'), true, JSON.stringify(output.renames));
|
|
768
|
-
assert.equal(migrateJson(home).changed, 0);
|
|
769
|
-
}
|
|
770
|
-
finally {
|
|
771
|
-
await stopMigrateDaemon(home);
|
|
772
|
-
rmSync(home, { recursive: true, force: true });
|
|
773
|
-
}
|
|
774
|
-
});
|
|
775
|
-
test('a rootless repository takes its front door from the one legacy guide that owns it', async () => {
|
|
776
|
-
const home = fixtureHome('crtr-sys-migrate-front-door-');
|
|
777
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
778
|
-
const project = join(home, 'fd-root');
|
|
779
|
-
const guide = join(project, '.crouter', 'memory', 'guide.md');
|
|
780
|
-
const rootIndex = join(project, '.crouter', 'memory', 'INDEX.md');
|
|
781
|
-
try {
|
|
782
|
-
await startMigrateDaemon(home);
|
|
783
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
|
|
784
|
-
write(guide, `---
|
|
785
|
-
kind: knowledge
|
|
786
|
-
name: project-guide
|
|
787
|
-
surfaces:
|
|
788
|
-
- on: workspace-open
|
|
789
|
-
at: content
|
|
790
|
-
- on: read
|
|
791
|
-
match: "./**"
|
|
792
|
-
at: content
|
|
793
|
-
---
|
|
794
|
-
# FD Root guide
|
|
795
|
-
|
|
796
|
-
The authored body, preserved byte for byte.
|
|
797
|
-
`);
|
|
798
|
-
const output = migrateJson(home);
|
|
799
|
-
assert.deepEqual(output.blockers, []);
|
|
800
|
-
assert.equal(repositoryRow(output, project).action, 'created');
|
|
801
|
-
assert.equal(prefixRow(output, project).front_door_action, 'transferred-from:.crouter/memory/guide.md');
|
|
802
|
-
// The created root links the leaf's FINAL canonical name.
|
|
803
|
-
assert.equal(readFileSync(rootIndex, 'utf8'), `---
|
|
804
|
-
namespace: "fd-root"
|
|
805
|
-
kind: knowledge
|
|
806
|
-
when-and-why-to-read: When working in \`fd-root\`, this knowledge should be read because it names the namespace every document in this repository answers under.
|
|
807
|
-
surfaces:
|
|
808
|
-
- on: workspace-open
|
|
809
|
-
at: content
|
|
810
|
-
- on: read
|
|
811
|
-
match: "./**"
|
|
812
|
-
at: content
|
|
813
|
-
---
|
|
814
|
-
|
|
815
|
-
# fd-root
|
|
816
|
-
|
|
817
|
-
This project's memory store. Every document here answers at \`fd-root/<local name>\`. Read [[fd-root/project-guide]] for the detailed project guide.
|
|
818
|
-
`);
|
|
819
|
-
// The leaf keeps its path, local name, read route, and body — only the
|
|
820
|
-
// workspace-open entry leaves.
|
|
821
|
-
assert.equal(readFileSync(guide, 'utf8'), `---
|
|
822
|
-
kind: knowledge
|
|
823
|
-
name: project-guide
|
|
824
|
-
surfaces:
|
|
825
|
-
- on: read
|
|
826
|
-
match: "./**"
|
|
827
|
-
at: content
|
|
828
|
-
---
|
|
829
|
-
# FD Root guide
|
|
830
|
-
|
|
831
|
-
The authored body, preserved byte for byte.
|
|
832
|
-
`);
|
|
833
|
-
const converged = snapshotTree(home);
|
|
834
|
-
const second = migrateJson(home);
|
|
835
|
-
assert.equal(second.changed, 0);
|
|
836
|
-
assert.equal(prefixRow(second, project).front_door_action, 'kept-root');
|
|
837
|
-
assertTreeUnchanged(converged, snapshotTree(home));
|
|
838
|
-
}
|
|
839
|
-
finally {
|
|
840
|
-
await stopMigrateDaemon(home);
|
|
841
|
-
rmSync(home, { recursive: true, force: true });
|
|
842
|
-
}
|
|
843
|
-
});
|
|
844
|
-
test('repository-relative ordering prefixes do not block migration and derive canonical owner paths', async () => {
|
|
845
|
-
const home = fixtureHome('crtr-sys-migrate-ordering-prefix-');
|
|
846
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
847
|
-
const repository = join(home, 'ordered-repository');
|
|
848
|
-
const nestedOwner = join(repository, '01-api');
|
|
849
|
-
const rootIndex = join(repository, '.crouter', 'memory', 'INDEX.md');
|
|
850
|
-
const nestedDoc = join(nestedOwner, '.crouter', 'memory', 'guide.md');
|
|
851
|
-
try {
|
|
852
|
-
await startMigrateDaemon(home);
|
|
853
|
-
initRepo(repository);
|
|
854
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: repository, memory: 'content' }]));
|
|
855
|
-
write(rootIndex, '---\nnamespace: acme\nkind: knowledge\n---\n# Repository\n');
|
|
856
|
-
write(nestedDoc, '---\nkind: knowledge\n---\n# API guide\n');
|
|
857
|
-
const output = migrateJson(home);
|
|
858
|
-
assert.deepEqual(output.blockers, []);
|
|
859
|
-
assert.equal(prefixRow(output, nestedOwner).owner_relative_path, 'api');
|
|
860
|
-
assert.equal(prefixRow(output, nestedOwner).effective_prefix, 'acme/api');
|
|
861
|
-
}
|
|
862
|
-
finally {
|
|
863
|
-
await stopMigrateDaemon(home);
|
|
864
|
-
rmSync(home, { recursive: true, force: true });
|
|
865
|
-
}
|
|
866
|
-
});
|
|
867
|
-
test('the legacy front door is found in a nested store of the same repository, and a half-done transfer finishes', async () => {
|
|
868
|
-
const home = fixtureHome('crtr-sys-migrate-front-door-nested-');
|
|
869
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
870
|
-
const project = join(home, 'fd-nested');
|
|
871
|
-
const nestedOwner = join(project, 'pkg');
|
|
872
|
-
const rootIndex = join(project, '.crouter', 'memory', 'INDEX.md');
|
|
873
|
-
const guide = join(nestedOwner, '.crouter', 'memory', 'guide.md');
|
|
874
|
-
const legacyNamed = join(nestedOwner, '.crouter', 'memory', 'deep-note.md');
|
|
875
|
-
try {
|
|
876
|
-
await startMigrateDaemon(home);
|
|
877
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
|
|
878
|
-
write(rootIndex, `---\nnamespace: fd-nested\nkind: knowledge\n---\n# FD Nested\n`);
|
|
879
|
-
write(guide, `---
|
|
880
|
-
kind: knowledge
|
|
881
|
-
surfaces:
|
|
882
|
-
- on: workspace-open
|
|
883
|
-
at: content
|
|
884
|
-
- on: read
|
|
885
|
-
match: "./**"
|
|
886
|
-
at: content
|
|
887
|
-
---
|
|
888
|
-
# Nested guide
|
|
889
|
-
`);
|
|
890
|
-
// The nested store declares nothing under a root that already does — the
|
|
891
|
-
// shape a cut corpus is also in. This fully qualified `name:` is one this
|
|
892
|
-
// cut never leaves behind, so it proves the store is still pre-003 and its
|
|
893
|
-
// documents answered at bare local names.
|
|
894
|
-
write(legacyNamed, `---\nname: fd-nested/pkg/legacy-note\nkind: knowledge\n---\n# Legacy named\n`);
|
|
895
|
-
const output = migrateJson(home);
|
|
896
|
-
assert.deepEqual(output.blockers, []);
|
|
897
|
-
assert.equal(prefixRow(output, project).front_door_action, 'transferred-from:pkg/.crouter/memory/guide.md');
|
|
898
|
-
assert.equal(prefixRow(output, nestedOwner).front_door_action, 'none');
|
|
899
|
-
assert.equal(prefixRow(output, nestedOwner).old_rule, 'pre-003');
|
|
900
|
-
assert.equal(output.renames.some((row) => row.path === guide && row.from === 'guide' && row.to === 'fd-nested/pkg/guide'), true, JSON.stringify(output.renames));
|
|
901
|
-
// Its address never moved — only the spelling of the name that carried it.
|
|
902
|
-
assert.equal(output.renames.some((row) => row.path === legacyNamed), false, JSON.stringify(output.renames));
|
|
903
|
-
assert.equal(readFileSync(legacyNamed, 'utf8'), `---\nname: legacy-note\nkind: knowledge\n---\n# Legacy named\n`);
|
|
904
|
-
// The repository root now carries the door; the nested leaf keeps its own
|
|
905
|
-
// owner-anchored read route.
|
|
906
|
-
assert.match(readFileSync(rootIndex, 'utf8'), /surfaces:\n {2}- on: workspace-open\n {4}at: content\n/);
|
|
907
|
-
assert.equal(readFileSync(guide, 'utf8'), `---
|
|
908
|
-
kind: knowledge
|
|
909
|
-
surfaces:
|
|
910
|
-
- on: read
|
|
911
|
-
match: "./**"
|
|
912
|
-
at: content
|
|
913
|
-
---
|
|
914
|
-
# Nested guide
|
|
915
|
-
`);
|
|
916
|
-
// Nothing legacy is left in the nested store, so the second run reads the
|
|
917
|
-
// root declaration it already answers under as its old prefix too.
|
|
918
|
-
const second = migrateJson(home);
|
|
919
|
-
assert.equal(second.changed, 0);
|
|
920
|
-
assert.deepEqual(second.renames, []);
|
|
921
|
-
assert.equal(prefixRow(second, nestedOwner).old_rule, 'per-store-declaration');
|
|
922
|
-
assert.equal(prefixRow(second, nestedOwner).old_prefix, 'fd-nested/pkg');
|
|
923
|
-
// Interruption shape: the root already owns the pair while the leaf still
|
|
924
|
-
// carries workspace-open. State is read from the two documents alone, so
|
|
925
|
-
// the run re-detects the transfer and finishes it.
|
|
926
|
-
write(guide, `---
|
|
927
|
-
kind: knowledge
|
|
928
|
-
surfaces:
|
|
929
|
-
- on: workspace-open
|
|
930
|
-
at: content
|
|
931
|
-
- on: read
|
|
932
|
-
match: "./**"
|
|
933
|
-
at: content
|
|
934
|
-
---
|
|
935
|
-
# Nested guide
|
|
936
|
-
`);
|
|
937
|
-
const resumed = migrateJson(home);
|
|
938
|
-
assert.deepEqual(resumed.blockers, []);
|
|
939
|
-
assert.equal(prefixRow(resumed, project).front_door_action, 'transferred-from:pkg/.crouter/memory/guide.md');
|
|
940
|
-
assert.doesNotMatch(readFileSync(guide, 'utf8'), /workspace-open/);
|
|
941
|
-
}
|
|
942
|
-
finally {
|
|
943
|
-
await stopMigrateDaemon(home);
|
|
944
|
-
rmSync(home, { recursive: true, force: true });
|
|
945
|
-
}
|
|
946
|
-
});
|
|
947
|
-
test('two legacy front doors, and a root workspace-open that is not at content, each block the corpus', async () => {
|
|
948
|
-
for (const shape of ['two-leaves', 'root-predicate']) {
|
|
949
|
-
const home = fixtureHome(`crtr-sys-migrate-front-door-${shape}-`);
|
|
950
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
951
|
-
const project = join(home, 'fd-blocked');
|
|
952
|
-
const rootIndex = join(project, '.crouter', 'memory', 'INDEX.md');
|
|
953
|
-
const frontDoor = `surfaces:
|
|
954
|
-
- on: workspace-open
|
|
955
|
-
at: content
|
|
956
|
-
- on: read
|
|
957
|
-
match: "./**"
|
|
958
|
-
at: content`;
|
|
959
|
-
try {
|
|
960
|
-
await startMigrateDaemon(home);
|
|
961
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
|
|
962
|
-
if (shape === 'two-leaves') {
|
|
963
|
-
write(rootIndex, `---\nnamespace: fd-blocked\nkind: knowledge\n---\n# FD Blocked\n`);
|
|
964
|
-
write(join(project, '.crouter', 'memory', 'one.md'), `---\nkind: knowledge\n${frontDoor}\n---\n# One\n`);
|
|
965
|
-
write(join(project, 'pkg', '.crouter', 'memory', 'two.md'), `---\nkind: knowledge\n${frontDoor}\n---\n# Two\n`);
|
|
966
|
-
}
|
|
967
|
-
else {
|
|
968
|
-
write(rootIndex, `---\nnamespace: fd-blocked\nkind: knowledge\nsurfaces:\n - on: workspace-open\n at: preview\n---\n# FD Blocked\n`);
|
|
969
|
-
write(join(project, '.crouter', 'memory', 'note.md'), CURRENT_DOC);
|
|
970
|
-
}
|
|
971
|
-
const before = snapshotTree(project);
|
|
972
|
-
const payload = migrateBlocked(home);
|
|
973
|
-
const blocker = payload.received.blockers.find((row) => row.kind === 'front-door');
|
|
974
|
-
assert.ok(blocker, JSON.stringify(payload.received.blockers));
|
|
975
|
-
if (shape === 'two-leaves') {
|
|
976
|
-
assert.match(blocker.message, /more than one non-root document carrying the complete workspace front door/);
|
|
977
|
-
assert.deepEqual(blocker.paths?.sort(), [
|
|
978
|
-
join(project, '.crouter', 'memory', 'one.md'),
|
|
979
|
-
join(project, 'pkg', '.crouter', 'memory', 'two.md'),
|
|
980
|
-
].sort());
|
|
981
|
-
}
|
|
982
|
-
else {
|
|
983
|
-
assert.match(blocker.message, /workspace-open route that migration cannot make authoritative/);
|
|
984
|
-
assert.deepEqual(blocker.paths, [rootIndex]);
|
|
985
|
-
}
|
|
986
|
-
assert.equal(payload.received.corpus_phase, 'not-started');
|
|
987
|
-
assert.equal(existsSync(markerPath(home)), false);
|
|
988
|
-
assertTreeUnchanged(before, snapshotTree(project));
|
|
989
|
-
}
|
|
990
|
-
finally {
|
|
991
|
-
await stopMigrateDaemon(home);
|
|
992
|
-
rmSync(home, { recursive: true, force: true });
|
|
993
|
-
}
|
|
994
|
-
}
|
|
995
|
-
});
|
|
996
|
-
test('a leaf carrying both the legacy front door and a translated route keeps every retained authored byte', async () => {
|
|
997
|
-
const home = fixtureHome('crtr-sys-migrate-front-door-compose-');
|
|
998
|
-
const rootProfile = join(home, '.crouter', 'profiles', 'root-00000000');
|
|
999
|
-
const project = join(home, 'compose-repo');
|
|
1000
|
-
const workspaceDoc = join(project, '.crouter', 'memory', 'workspace.md');
|
|
1001
|
-
try {
|
|
1002
|
-
await startMigrateDaemon(home);
|
|
1003
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
|
|
1004
|
-
// Pre-003 identity: nothing declares a namespace, so `topics/*` still names
|
|
1005
|
-
// the store's own documents and must be translated in the same pass that
|
|
1006
|
-
// strips this document's workspace-open entry.
|
|
1007
|
-
write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Compose Repo\n`);
|
|
1008
|
-
write(join(project, '.crouter', 'memory', 'topics', 'one.md'), CURRENT_DOC);
|
|
1009
|
-
write(join(project, '.crouter', 'memory', 'topics', 'two.md'), CURRENT_DOC);
|
|
1010
|
-
write(join(project, '.crouter', 'memory', 'guides', 'setup.md'), CURRENT_DOC);
|
|
1011
|
-
write(workspaceDoc, `---
|
|
1012
|
-
kind: knowledge
|
|
1013
|
-
name: project-guide
|
|
1014
|
-
surfaces:
|
|
1015
|
-
- on: workspace-open
|
|
1016
|
-
at: content
|
|
1017
|
-
- on: read
|
|
1018
|
-
match: "./**"
|
|
1019
|
-
at: content
|
|
1020
|
-
- on: memory-read
|
|
1021
|
-
match:
|
|
1022
|
-
- topics/*
|
|
1023
|
-
- guides/*
|
|
1024
|
-
at: content
|
|
1025
|
-
---
|
|
1026
|
-
# Compose workspace
|
|
1027
|
-
|
|
1028
|
-
Body bytes that must survive both transforms.
|
|
1029
|
-
`);
|
|
1030
|
-
const output = migrateJson(home);
|
|
1031
|
-
assert.deepEqual(output.blockers, []);
|
|
1032
|
-
assert.equal(prefixRow(output, project).front_door_action, 'transferred-from:.crouter/memory/workspace.md');
|
|
1033
|
-
// The front-door removal and the consumer route rewrite compose: the
|
|
1034
|
-
// workspace-open entry is gone, the route is translated, the read route and
|
|
1035
|
-
// the body are untouched.
|
|
1036
|
-
assert.equal(readFileSync(workspaceDoc, 'utf8'), `---
|
|
1037
|
-
kind: knowledge
|
|
1038
|
-
name: project-guide
|
|
1039
|
-
surfaces:
|
|
1040
|
-
- on: read
|
|
1041
|
-
match: "./**"
|
|
1042
|
-
at: content
|
|
1043
|
-
- on: memory-read
|
|
1044
|
-
match:
|
|
1045
|
-
["compose-repo/topics/*", "compose-repo/guides/*"]
|
|
1046
|
-
at: content
|
|
1047
|
-
---
|
|
1048
|
-
# Compose workspace
|
|
1049
|
-
|
|
1050
|
-
Body bytes that must survive both transforms.
|
|
1051
|
-
`);
|
|
1052
|
-
// Those bytes are YAML the runtime can read, not just text that looks right.
|
|
1053
|
-
assert.deepEqual(parseYaml(readFileSync(workspaceDoc, 'utf8').split('---\n')[1] ?? '')?.surfaces, [
|
|
1054
|
-
{ on: 'read', match: './**', at: 'content' },
|
|
1055
|
-
{ on: 'memory-read', match: ['compose-repo/topics/*', 'compose-repo/guides/*'], at: 'content' },
|
|
1056
|
-
]);
|
|
1057
|
-
for (const [from, to] of [['topics/*', 'compose-repo/topics/*'], ['guides/*', 'compose-repo/guides/*']]) {
|
|
1058
|
-
assert.equal(output.references.some((row) => row.path === workspaceDoc && row.kind === 'memory-read' && row.from === from && row.to === to), true, JSON.stringify(output.references));
|
|
1059
|
-
}
|
|
1060
|
-
assert.equal(migrateJson(home).changed, 0);
|
|
1061
|
-
}
|
|
1062
|
-
finally {
|
|
1063
|
-
await stopMigrateDaemon(home);
|
|
1064
|
-
rmSync(home, { recursive: true, force: true });
|
|
1065
|
-
}
|
|
1066
|
-
});
|
|
1067
|
-
test('an unreadable profile manifest blocks forced completion and remains in skipped output', async () => {
|
|
1068
|
-
const home = fixtureHome('crtr-sys-migrate-unreadable-profile-');
|
|
1069
|
-
const userRoot = join(home, '.crouter');
|
|
1070
|
-
const profileId = 'bad-deadbeef';
|
|
1071
|
-
const profilePath = join(userRoot, 'profiles', profileId, 'profile.json');
|
|
1072
|
-
try {
|
|
1073
|
-
await startMigrateDaemon(home);
|
|
1074
|
-
write(profilePath, '{not json');
|
|
1075
|
-
write(markerPath(home), JSON.stringify(onDiskMigrationIdentity()));
|
|
1076
|
-
const payload = migrateBlocked(home);
|
|
1077
|
-
assert.equal(payload.received.blockers.length, 1);
|
|
1078
|
-
assert.equal(payload.received.blockers[0]?.kind, 'parse-failure');
|
|
1079
|
-
assert.equal(payload.received.blockers[0]?.path, profilePath);
|
|
1080
|
-
assert.match(payload.received.blockers[0]?.message ?? '', /profile manifest is not valid JSON/);
|
|
1081
|
-
assert.match(payload.received.blockers[0]?.message ?? '', /crtr sys migrate/);
|
|
1082
|
-
assert.equal(payload.received.skipped.length, 1);
|
|
1083
|
-
assert.equal(payload.received.skipped[0]?.store, join(userRoot, 'profiles'));
|
|
1084
|
-
assert.equal(payload.received.skipped[0]?.relPath, `${profileId}/profile.json`);
|
|
1085
|
-
assert.ok(payload.received.skipped[0]?.error);
|
|
1086
|
-
assert.match(payload.next, /crtr sys migrate/);
|
|
1087
|
-
assert.equal(existsSync(markerPath(home)), false);
|
|
1088
|
-
}
|
|
1089
|
-
finally {
|
|
1090
|
-
await stopMigrateDaemon(home);
|
|
1091
|
-
rmSync(home, { recursive: true, force: true });
|
|
1092
|
-
}
|
|
1093
|
-
});
|
|
1094
|
-
test('sys migrate blocks the whole corpus when one link names different documents per target, and writes nothing', async () => {
|
|
1095
|
-
const home = fixtureHome('crtr-sys-migrate-divergent-');
|
|
1096
|
-
const userRoot = join(home, '.crouter');
|
|
1097
|
-
const rootProfile = join(userRoot, 'profiles', 'root-00000000');
|
|
1098
|
-
const alpha = join(home, 'alpha-project');
|
|
1099
|
-
const beta = join(home, 'beta-project');
|
|
1100
|
-
try {
|
|
1101
|
-
await startMigrateDaemon(home);
|
|
1102
|
-
// Already current for the manifest and document lanes: the only thing this
|
|
1103
|
-
// run could write is the corpus cut, so "nothing was written" is provable
|
|
1104
|
-
// byte for byte.
|
|
1105
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: alpha, memory: 'content' }, { path: beta, memory: 'content' }]));
|
|
1106
|
-
write(join(userRoot, 'memory', 'pointer.md'), `${CURRENT_DOC}\nSee [[guide]].\n`);
|
|
1107
|
-
for (const [project, title] of [[alpha, 'Alpha Project'], [beta, 'Beta Project']]) {
|
|
1108
|
-
write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# ${title}\n`);
|
|
1109
|
-
write(join(project, '.crouter', 'memory', 'guide.md'), CURRENT_DOC);
|
|
1110
|
-
}
|
|
1111
|
-
const before = snapshotTree(home);
|
|
1112
|
-
const payload = migrateBlocked(home);
|
|
1113
|
-
assert.match(payload.message, /corpus migration blocked by 1 finding\(s\) — nothing was written/);
|
|
1114
|
-
assert.equal(payload.received.blockers.length, 1);
|
|
1115
|
-
assert.equal(payload.received.blockers[0]?.kind, 'divergent-reference');
|
|
1116
|
-
assert.equal(payload.received.blockers[0]?.name, 'guide');
|
|
1117
|
-
assert.match(payload.received.blockers[0]?.message ?? '', /different documents depending on the target view/);
|
|
1118
|
-
// The claim in the message is the claim in the payload: nothing on disk.
|
|
1119
|
-
assert.equal(payload.received.corpus_phase, 'not-started');
|
|
1120
|
-
assert.equal(payload.received.changed, 0);
|
|
1121
|
-
assert.deepEqual(payload.received.wrote, {
|
|
1122
|
-
profile_manifests: [],
|
|
1123
|
-
documents: [],
|
|
1124
|
-
corpus_consumers: [],
|
|
1125
|
-
corpus_identities: [],
|
|
1126
|
-
});
|
|
1127
|
-
assert.deepEqual(payload.received.applied, []);
|
|
1128
|
-
assert.equal(existsSync(markerPath(home)), false);
|
|
1129
|
-
assertTreeUnchanged(before, snapshotTree(home));
|
|
1130
|
-
// A blocked planner stays inspectable: the failure payload carries the same
|
|
1131
|
-
// report body a converged run returns, so the plan that WOULD have been
|
|
1132
|
-
// written can be read straight off the blocker.
|
|
1133
|
-
assertReportInvariants(payload.received);
|
|
1134
|
-
assert.equal(payload.received.dryRun, false);
|
|
1135
|
-
assert.ok(payload.received.discovery_roots.length > 0, JSON.stringify(payload.received.discovery_roots));
|
|
1136
|
-
assert.equal(payload.received.stores, payload.received.discovered_stores.length);
|
|
1137
|
-
for (const project of [alpha, beta]) {
|
|
1138
|
-
const store = join(project, '.crouter', 'memory');
|
|
1139
|
-
assert.ok(payload.received.discovered_stores.some((row) => row.store === store), JSON.stringify(payload.received.discovered_stores));
|
|
1140
|
-
assert.ok(payload.received.discovered_targets.some((row) => row.stores.includes(store)));
|
|
1141
|
-
assert.equal(repositoryRow(payload.received, project).namespace, relative(home, project));
|
|
1142
|
-
assert.equal(prefixRow(payload.received, project).effective_prefix, relative(home, project));
|
|
1143
|
-
assert.ok(payload.received.renames.some((row) => row.store_root === store && row.to.startsWith(`${relative(home, project)}/`)), JSON.stringify(payload.received.renames));
|
|
1144
|
-
}
|
|
1145
|
-
assert.ok(Array.isArray(payload.received.references));
|
|
1146
|
-
}
|
|
1147
|
-
finally {
|
|
1148
|
-
await stopMigrateDaemon(home);
|
|
1149
|
-
rmSync(home, { recursive: true, force: true });
|
|
1150
|
-
}
|
|
1151
|
-
});
|
|
1152
|
-
test('a corpus blocker never claims nothing was written when the earlier lanes already wrote', async () => {
|
|
1153
|
-
const home = fixtureHome('crtr-sys-migrate-earlier-writes-');
|
|
1154
|
-
const userRoot = join(home, '.crouter');
|
|
1155
|
-
const rootProfile = join(userRoot, 'profiles', 'root-00000000');
|
|
1156
|
-
const alpha = join(home, 'alpha-project');
|
|
1157
|
-
const beta = join(home, 'beta-project');
|
|
1158
|
-
const userDoc = join(userRoot, 'memory', 'pointer.md');
|
|
1159
|
-
try {
|
|
1160
|
-
await startMigrateDaemon(home);
|
|
1161
|
-
// A PRE-migration manifest and an old-format document, so the manifest and
|
|
1162
|
-
// convergent lanes both write before the corpus lane plans — and then one
|
|
1163
|
-
// `[[guide]]` naming a different document per target blocks that lane.
|
|
1164
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [alpha, beta]));
|
|
1165
|
-
write(userDoc, `${OLD_DOC}\nSee [[guide]].\n`);
|
|
1166
|
-
for (const [project, title] of [[alpha, 'Alpha Project'], [beta, 'Beta Project']]) {
|
|
1167
|
-
write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# ${title}\n`);
|
|
1168
|
-
write(join(project, '.crouter', 'memory', 'guide.md'), CURRENT_DOC);
|
|
1169
|
-
}
|
|
1170
|
-
const projectsBefore = snapshotTree(alpha);
|
|
1171
|
-
const payload = migrateBlocked(home);
|
|
1172
|
-
assert.match(payload.message, /corpus migration blocked by 1 finding\(s\) before any corpus write/);
|
|
1173
|
-
assert.match(payload.message, /the corpus is unchanged, but 2 earlier manifest\/document rewrite\(s\) are already on disk/);
|
|
1174
|
-
assert.equal(payload.received.corpus_phase, 'not-started');
|
|
1175
|
-
assert.equal(payload.received.changed, 2);
|
|
1176
|
-
assert.deepEqual(payload.received.wrote.profile_manifests, [join(rootProfile, 'profile.json')]);
|
|
1177
|
-
assert.deepEqual(payload.received.wrote.documents, [userDoc]);
|
|
1178
|
-
assert.deepEqual(payload.received.wrote.corpus_consumers, []);
|
|
1179
|
-
assert.deepEqual(payload.received.wrote.corpus_identities, []);
|
|
1180
|
-
// Every file the payload names as written really did change, and every file
|
|
1181
|
-
// only the corpus lane could have touched did not.
|
|
1182
|
-
assert.doesNotMatch(readFileSync(userDoc, 'utf8'), /system-prompt-visibility/);
|
|
1183
|
-
assert.match(readFileSync(userDoc, 'utf8'), /See \[\[guide\]\]\.\n/);
|
|
1184
|
-
assert.deepEqual(JSON.parse(readFileSync(join(rootProfile, 'profile.json'), 'utf8')).projects, [{ path: alpha, memory: 'preview' }, { path: beta, memory: 'preview' }]);
|
|
1185
|
-
assertTreeUnchanged(projectsBefore, snapshotTree(alpha));
|
|
1186
|
-
}
|
|
1187
|
-
finally {
|
|
1188
|
-
await stopMigrateDaemon(home);
|
|
1189
|
-
rmSync(home, { recursive: true, force: true });
|
|
1190
|
-
}
|
|
1191
|
-
});
|
|
1192
|
-
test('a verification failure after both write phases reports the rewrites that are on disk', async () => {
|
|
1193
|
-
const home = fixtureHome('crtr-sys-migrate-verification-');
|
|
1194
|
-
const userRoot = join(home, '.crouter');
|
|
1195
|
-
const rootProfile = join(userRoot, 'profiles', 'root-00000000');
|
|
1196
|
-
const project = join(home, 'verify-project');
|
|
1197
|
-
const projectIndex = join(project, '.crouter', 'memory', 'INDEX.md');
|
|
1198
|
-
const strayDoc = join(project, '.crouter', 'memory', 'stray.md');
|
|
1199
|
-
try {
|
|
1200
|
-
await startMigrateDaemon(home);
|
|
1201
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
|
|
1202
|
-
write(projectIndex, `---\nkind: knowledge\n---\n# Verify Project\n`);
|
|
1203
|
-
// `namespace:` on a NON-root document: not an identity field this lane
|
|
1204
|
-
// rewrites, so the plan is clean and the writes land — and the post-write
|
|
1205
|
-
// lint against file truth then refuses the store.
|
|
1206
|
-
write(strayDoc, `---\nkind: knowledge\nnamespace: verify-project\n---\n# Stray declaration\n`);
|
|
1207
|
-
const payload = migrateBlocked(home);
|
|
1208
|
-
assert.match(payload.message, /corpus migration verification failed with 1 finding\(s\) after both write phases/);
|
|
1209
|
-
assert.match(payload.message, /identity rewrite\(s\) are on disk and are NOT rolled back/);
|
|
1210
|
-
assert.equal(payload.received.blockers[0]?.kind, 'verification');
|
|
1211
|
-
assert.match(payload.received.blockers[0]?.message ?? '', /namespace-placement/);
|
|
1212
|
-
assert.equal(payload.received.corpus_phase, 'written');
|
|
1213
|
-
assert.deepEqual(payload.received.wrote.corpus_identities, [projectIndex]);
|
|
1214
|
-
assert.equal(payload.received.changed, 1);
|
|
1215
|
-
assert.equal(payload.received.applied.some((row) => row.lane === 'corpus' && row.files.includes(projectIndex)), true);
|
|
1216
|
-
assert.match(payload.next, /re-run `crtr sys migrate`/);
|
|
1217
|
-
assert.equal(existsSync(markerPath(home)), false);
|
|
1218
|
-
// The inventory is true of the bytes: the declaration and the repository's
|
|
1219
|
-
// front door really are on disk.
|
|
1220
|
-
assert.equal(readFileSync(projectIndex, 'utf8'), `---
|
|
1221
|
-
namespace: verify-project
|
|
1222
|
-
kind: knowledge
|
|
1223
|
-
surfaces:
|
|
1224
|
-
- on: workspace-open
|
|
1225
|
-
at: content
|
|
1226
|
-
- on: read
|
|
1227
|
-
match: ./**
|
|
1228
|
-
at: content
|
|
1229
|
-
---
|
|
1230
|
-
# Verify Project
|
|
1231
|
-
`);
|
|
1232
|
-
}
|
|
1233
|
-
finally {
|
|
1234
|
-
await stopMigrateDaemon(home);
|
|
1235
|
-
rmSync(home, { recursive: true, force: true });
|
|
1236
|
-
}
|
|
1237
|
-
});
|
|
1238
|
-
test('a nested store reached only through a node target inherits the ancestor repository declaration', async () => {
|
|
1239
|
-
const home = fixtureHome('crtr-sys-migrate-node-nested-');
|
|
1240
|
-
const userRoot = join(home, '.crouter');
|
|
1241
|
-
const rootProfile = join(userRoot, 'profiles', 'root-00000000');
|
|
1242
|
-
const nodeId = 'node-bbbb2222';
|
|
1243
|
-
const nodeStore = join(canvasHomeFor(home), 'nodes', nodeId, 'context', 'memory');
|
|
1244
|
-
const nodeProject = join(home, 'node-cwd-project');
|
|
1245
|
-
const nestedOwner = join(nodeProject, 'nested');
|
|
1246
|
-
try {
|
|
1247
|
-
await startMigrateDaemon(home);
|
|
1248
|
-
seedNodeMemoryTarget(home, { nodeId, cwd: nodeProject, profileId: 'root-00000000' });
|
|
1249
|
-
// No project in any manifest and none above the cwd: the daemon's SQL row
|
|
1250
|
-
// is the ONLY path to this project root.
|
|
1251
|
-
write(join(rootProfile, 'profile.json'), manifest('root', []));
|
|
1252
|
-
write(join(nodeStore, 'note.md'), CURRENT_DOC);
|
|
1253
|
-
write(join(nodeProject, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Node Cwd Project\n`);
|
|
1254
|
-
write(join(nestedOwner, '.crouter', 'memory', 'topic.md'), CURRENT_DOC);
|
|
1255
|
-
const output = migrateJson(home, { dryRun: true });
|
|
1256
|
-
const storeRoots = output.discovered_stores.map((row) => row.store);
|
|
1257
|
-
assert.equal(storeRoots.includes(join(nodeProject, '.crouter', 'memory')), true, JSON.stringify(storeRoots));
|
|
1258
|
-
assert.equal(storeRoots.includes(join(nestedOwner, '.crouter', 'memory')), true, JSON.stringify(storeRoots));
|
|
1259
|
-
// The nested owner takes the ancestor repository's namespace composed with
|
|
1260
|
-
// its own path — and declares nothing of its own.
|
|
1261
|
-
assert.deepEqual(output.repository_namespaces.map((row) => row.repository_root), [nodeProject], JSON.stringify(output.repository_namespaces));
|
|
1262
|
-
const nested = prefixRow(output, nestedOwner);
|
|
1263
|
-
assert.equal(nested.repository_root, nodeProject);
|
|
1264
|
-
assert.equal(nested.owner_relative_path, 'nested');
|
|
1265
|
-
assert.equal(nested.effective_prefix, 'node-cwd-project/nested');
|
|
1266
|
-
assert.equal(nested.nested_declaration_action, 'none');
|
|
1267
|
-
assert.equal(nested.front_door_action, 'none');
|
|
1268
|
-
assert.equal(output.discovered_targets.some((row) => row.kind === 'project' && row.origin === nestedOwner), true);
|
|
1269
|
-
}
|
|
1270
|
-
finally {
|
|
1271
|
-
await stopMigrateDaemon(home);
|
|
1272
|
-
rmSync(home, { recursive: true, force: true });
|
|
1273
|
-
}
|
|
1274
|
-
});
|
|
1275
|
-
test('a memory-read route translates through an INDEX collapse and a root-plus-descendant split', async () => {
|
|
1276
|
-
const home = fixtureHome('crtr-sys-migrate-routes-');
|
|
1277
|
-
const userRoot = join(home, '.crouter');
|
|
1278
|
-
const rootProfile = join(userRoot, 'profiles', 'root-00000000');
|
|
1279
|
-
const project = join(home, 'route-project');
|
|
1280
|
-
const carrier = join(project, '.crouter', 'memory', 'carrier.md');
|
|
1281
|
-
try {
|
|
1282
|
-
await startMigrateDaemon(home);
|
|
1283
|
-
write(join(rootProfile, 'profile.json'), manifest('root', [{ path: project, memory: 'content' }]));
|
|
1284
|
-
write(join(project, '.crouter', 'memory', 'INDEX.md'), `---\nkind: knowledge\n---\n# Route Project\n`);
|
|
1285
|
-
// `topics/INDEX` collapses onto `route-project/topics`, and `topics/**`
|
|
1286
|
-
// named that same directory document plus its leaf — post-cut the leaf is
|
|
1287
|
-
// under `route-project/topics/**` and the directory document is not, so the
|
|
1288
|
-
// one entry splits into the exact pair.
|
|
1289
|
-
write(join(project, '.crouter', 'memory', 'topics', 'INDEX.md'), CURRENT_DOC);
|
|
1290
|
-
write(join(project, '.crouter', 'memory', 'topics', 'one.md'), CURRENT_DOC);
|
|
1291
|
-
write(carrier, `---
|
|
1292
|
-
kind: knowledge
|
|
1293
|
-
surfaces:
|
|
1294
|
-
- on: memory-read
|
|
1295
|
-
match: topics/INDEX
|
|
1296
|
-
at: content
|
|
1297
|
-
- on: memory-read
|
|
1298
|
-
match: topics/**
|
|
1299
|
-
at: content
|
|
1300
|
-
---
|
|
1301
|
-
# Carrier
|
|
1302
|
-
`);
|
|
1303
|
-
const output = migrateJson(home);
|
|
1304
|
-
assert.deepEqual(output.blockers, []);
|
|
1305
|
-
assert.equal(readFileSync(carrier, 'utf8'), `---
|
|
1306
|
-
kind: knowledge
|
|
1307
|
-
surfaces:
|
|
1308
|
-
- on: memory-read
|
|
1309
|
-
match: "route-project/topics"
|
|
1310
|
-
at: content
|
|
1311
|
-
- on: memory-read
|
|
1312
|
-
match: ["route-project/topics/**", "route-project/topics"]
|
|
1313
|
-
at: content
|
|
1314
|
-
---
|
|
1315
|
-
# Carrier
|
|
1316
|
-
`);
|
|
1317
|
-
assert.equal(output.references.some((row) => row.kind === 'memory-read' && row.from === 'topics/INDEX' && row.to === 'route-project/topics'), true, JSON.stringify(output.references));
|
|
1318
|
-
assert.equal(output.references.some((row) => row.kind === 'memory-read' &&
|
|
1319
|
-
row.from === 'topics/**' &&
|
|
1320
|
-
row.to === 'route-project/topics/**, route-project/topics'), true, JSON.stringify(output.references));
|
|
1321
|
-
// A second run over the translated routes plans nothing.
|
|
1322
|
-
const second = migrateJson(home);
|
|
1323
|
-
assert.equal(second.changed, 0);
|
|
1324
|
-
assert.deepEqual(second.references, []);
|
|
1325
|
-
}
|
|
1326
|
-
finally {
|
|
1327
|
-
await stopMigrateDaemon(home);
|
|
1328
|
-
rmSync(home, { recursive: true, force: true });
|
|
1329
|
-
}
|
|
1330
|
-
});
|