wiki-viewer 1.14.1 → 1.14.2
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/agent/activity/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/internal/span/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/assets/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/share/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/set-root/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/upload/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/app/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/content/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/download/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/file/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/folder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-history/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/new-file/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/page/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/presence/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/slugs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/watch/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/package.json +1 -1
- package/bin/postbuild.js +21 -0
- package/package.json +1 -1
- package/.next/standalone/.github/workflows/publish.yml +0 -37
- package/.next/standalone/.handoffs/archive/handoff-20260612-113332.md +0 -98
- package/.next/standalone/.handoffs/archive/handoff-20260612-141032.md +0 -73
- package/.next/standalone/.pi/ownership.json +0 -3
- package/.next/standalone/AGENTS.md +0 -114
- package/.next/standalone/DESIGN.md +0 -521
- package/.next/standalone/README.md +0 -821
- package/.next/standalone/TODO.md +0 -20
- package/.next/standalone/agents/bootstrap-prompt.md +0 -14
- package/.next/standalone/agents/wiki-viewer-skill/SKILL.md +0 -456
- package/.next/standalone/bin/postbuild.js +0 -78
- package/.next/standalone/bin/wiki-viewer.js +0 -922
- package/.next/standalone/certificates/localhost-key.pem +0 -28
- package/.next/standalone/certificates/localhost.pem +0 -24
- package/.next/standalone/docs/agent-collab-plan.md +0 -1615
- package/.next/standalone/docs/agent-collab-v2-plan.md +0 -771
- package/.next/standalone/docs/agent-fs-plan.md +0 -232
- package/.next/standalone/docs/editorial-skin-spec.md +0 -242
- package/.next/standalone/docs/file-vs-collab-authority.md +0 -124
- package/.next/standalone/docs/mobile-readiness-spec.md +0 -229
- package/.next/standalone/docs/workspacing-plan.md +0 -364
- package/.next/standalone/packages/wiki-viewer-mcp/README.md +0 -195
- package/.next/standalone/packages/wiki-viewer-mcp/bench-e2e.mjs +0 -166
- package/.next/standalone/packages/wiki-viewer-mcp/bench-latency.mjs +0 -87
- package/.next/standalone/packages/wiki-viewer-mcp/bench-payload.mjs +0 -45
- package/.next/standalone/packages/wiki-viewer-mcp/dist/http-client.js +0 -331
- package/.next/standalone/packages/wiki-viewer-mcp/dist/index.js +0 -531
- package/.next/standalone/packages/wiki-viewer-mcp/dist/register.js +0 -94
- package/.next/standalone/packages/wiki-viewer-mcp/dist/state-cache.js +0 -28
- package/.next/standalone/packages/wiki-viewer-mcp/package-lock.json +0 -1716
- package/.next/standalone/packages/wiki-viewer-mcp/package.json +0 -41
- package/.next/standalone/packages/wiki-viewer-mcp/src/http-client.ts +0 -459
- package/.next/standalone/packages/wiki-viewer-mcp/src/index.ts +0 -638
- package/.next/standalone/packages/wiki-viewer-mcp/src/register.ts +0 -144
- package/.next/standalone/packages/wiki-viewer-mcp/src/state-cache.ts +0 -55
- package/.next/standalone/packages/wiki-viewer-mcp/tsconfig.json +0 -19
- package/.next/standalone/pnpm-lock.yaml +0 -6697
- package/.next/standalone/pnpm-workspace.yaml +0 -8
- package/.next/standalone/postcss.config.mjs +0 -2
- package/.next/standalone/src/app/api/agent/activity/route.ts +0 -59
- package/.next/standalone/src/app/api/agent/admin/agents/[agentId]/revoke/route.ts +0 -40
- package/.next/standalone/src/app/api/agent/admin/agents/route.ts +0 -33
- package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/approve/route.ts +0 -83
- package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/deny/route.ts +0 -36
- package/.next/standalone/src/app/api/agent/admin/registrations/route.ts +0 -27
- package/.next/standalone/src/app/api/agent/events/[...path]/route.ts +0 -148
- package/.next/standalone/src/app/api/agent/files/[...path]/route.ts +0 -219
- package/.next/standalone/src/app/api/agent/fs/file/[...path]/route.ts +0 -446
- package/.next/standalone/src/app/api/agent/fs/ls/[[...path]]/route.ts +0 -152
- package/.next/standalone/src/app/api/agent/fs/move/route.ts +0 -130
- package/.next/standalone/src/app/api/agent/fs/search/route.ts +0 -272
- package/.next/standalone/src/app/api/agent/internal/span/route.ts +0 -121
- package/.next/standalone/src/app/api/agent/register/[regId]/route.ts +0 -50
- package/.next/standalone/src/app/api/agent/register/route.ts +0 -118
- package/.next/standalone/src/app/api/agent/settings/route.ts +0 -34
- package/.next/standalone/src/app/api/agent/settings/token/regenerate/route.ts +0 -20
- package/.next/standalone/src/app/api/agent/sidecar/[...path]/route.ts +0 -53
- package/.next/standalone/src/app/api/agents/install/route.ts +0 -143
- package/.next/standalone/src/app/api/agents/skill/route.ts +0 -20
- package/.next/standalone/src/app/api/agents/skill.tar.gz/route.ts +0 -87
- package/.next/standalone/src/app/api/app-proxy/[...path]/route.ts +0 -247
- package/.next/standalone/src/app/api/assets/[...path]/route.ts +0 -75
- package/.next/standalone/src/app/api/auth/[...all]/route.ts +0 -7
- package/.next/standalone/src/app/api/owner/init/route.ts +0 -14
- package/.next/standalone/src/app/api/share/[token]/route.ts +0 -269
- package/.next/standalone/src/app/api/share/route.ts +0 -127
- package/.next/standalone/src/app/api/system/admins/route.ts +0 -103
- package/.next/standalone/src/app/api/system/auth-config/route.ts +0 -22
- package/.next/standalone/src/app/api/system/auth-settings/route.ts +0 -86
- package/.next/standalone/src/app/api/system/browse/route.ts +0 -82
- package/.next/standalone/src/app/api/system/clear-root/route.ts +0 -16
- package/.next/standalone/src/app/api/system/config/route.ts +0 -14
- package/.next/standalone/src/app/api/system/pins/route.ts +0 -38
- package/.next/standalone/src/app/api/system/reveal/route.ts +0 -36
- package/.next/standalone/src/app/api/system/root-status/route.ts +0 -13
- package/.next/standalone/src/app/api/system/set-root/route.ts +0 -53
- package/.next/standalone/src/app/api/system/users/route.ts +0 -120
- package/.next/standalone/src/app/api/system/workspaces/[id]/open/route.ts +0 -34
- package/.next/standalone/src/app/api/system/workspaces/[id]/refresh/route.ts +0 -32
- package/.next/standalone/src/app/api/system/workspaces/[id]/route.ts +0 -78
- package/.next/standalone/src/app/api/system/workspaces/route.ts +0 -128
- package/.next/standalone/src/app/api/upload/[...path]/route.ts +0 -85
- package/.next/standalone/src/app/api/wiki/app/route.ts +0 -60
- package/.next/standalone/src/app/api/wiki/backlinks/route.ts +0 -29
- package/.next/standalone/src/app/api/wiki/content/route.ts +0 -159
- package/.next/standalone/src/app/api/wiki/download/route.ts +0 -100
- package/.next/standalone/src/app/api/wiki/file/route.ts +0 -57
- package/.next/standalone/src/app/api/wiki/folder/route.ts +0 -34
- package/.next/standalone/src/app/api/wiki/git-branches/route.ts +0 -32
- package/.next/standalone/src/app/api/wiki/git-checkout/route.ts +0 -45
- package/.next/standalone/src/app/api/wiki/git-diff/route.ts +0 -33
- package/.next/standalone/src/app/api/wiki/git-file-info/route.ts +0 -27
- package/.next/standalone/src/app/api/wiki/git-history/route.ts +0 -27
- package/.next/standalone/src/app/api/wiki/git-pull/route.ts +0 -48
- package/.next/standalone/src/app/api/wiki/move/route.ts +0 -61
- package/.next/standalone/src/app/api/wiki/new-file/route.ts +0 -56
- package/.next/standalone/src/app/api/wiki/outlinks/route.ts +0 -76
- package/.next/standalone/src/app/api/wiki/page/route.ts +0 -92
- package/.next/standalone/src/app/api/wiki/presence/route.ts +0 -56
- package/.next/standalone/src/app/api/wiki/route.ts +0 -116
- package/.next/standalone/src/app/api/wiki/search/route.ts +0 -44
- package/.next/standalone/src/app/api/wiki/slugs/route.ts +0 -54
- package/.next/standalone/src/app/api/wiki/upload/route.ts +0 -95
- package/.next/standalone/src/app/api/wiki/watch/route.ts +0 -67
- package/.next/standalone/src/app/globals.css +0 -1249
- package/.next/standalone/src/app/icon.svg +0 -11
- package/.next/standalone/src/app/layout.tsx +0 -78
- package/.next/standalone/src/app/manifest.ts +0 -30
- package/.next/standalone/src/app/page.tsx +0 -3260
- package/.next/standalone/src/app/s/[token]/page.tsx +0 -357
- package/.next/standalone/src/app/signin/page.tsx +0 -16
- package/.next/standalone/src/app/signin/signin-form.tsx +0 -238
- package/.next/standalone/src/components/ai-panel/activity-row.tsx +0 -284
- package/.next/standalone/src/components/ai-panel/ai-panel.tsx +0 -311
- package/.next/standalone/src/components/ai-panel/token-section.tsx +0 -313
- package/.next/standalone/src/components/auth-settings-sheet.tsx +0 -474
- package/.next/standalone/src/components/confirm-dialog.tsx +0 -56
- package/.next/standalone/src/components/dir-picker.tsx +0 -606
- package/.next/standalone/src/components/editor/backlinks-panel.tsx +0 -139
- package/.next/standalone/src/components/editor/bubble-menu.tsx +0 -346
- package/.next/standalone/src/components/editor/callout-extension.ts +0 -36
- package/.next/standalone/src/components/editor/comment-pip.tsx +0 -56
- package/.next/standalone/src/components/editor/comment-thread.tsx +0 -254
- package/.next/standalone/src/components/editor/csv-viewer.tsx +0 -379
- package/.next/standalone/src/components/editor/document-outline.tsx +0 -230
- package/.next/standalone/src/components/editor/editor-toolbar.tsx +0 -564
- package/.next/standalone/src/components/editor/editor.tsx +0 -1327
- package/.next/standalone/src/components/editor/extensions/drag-handle.ts +0 -325
- package/.next/standalone/src/components/editor/extensions/heading-anchors.ts +0 -55
- package/.next/standalone/src/components/editor/extensions/proof-span.ts +0 -60
- package/.next/standalone/src/components/editor/extensions/resizable-image.tsx +0 -159
- package/.next/standalone/src/components/editor/extensions.ts +0 -150
- package/.next/standalone/src/components/editor/file-fallback-viewer.tsx +0 -75
- package/.next/standalone/src/components/editor/folder-index.tsx +0 -236
- package/.next/standalone/src/components/editor/google-doc-viewer.tsx +0 -73
- package/.next/standalone/src/components/editor/image-viewer.tsx +0 -57
- package/.next/standalone/src/components/editor/large-file-gate.tsx +0 -108
- package/.next/standalone/src/components/editor/link-popover.tsx +0 -111
- package/.next/standalone/src/components/editor/media-popover.tsx +0 -212
- package/.next/standalone/src/components/editor/media-viewer.tsx +0 -70
- package/.next/standalone/src/components/editor/mermaid-viewer.tsx +0 -286
- package/.next/standalone/src/components/editor/node-app-viewer.tsx +0 -328
- package/.next/standalone/src/components/editor/notebook-viewer.tsx +0 -371
- package/.next/standalone/src/components/editor/office/docx-viewer.tsx +0 -93
- package/.next/standalone/src/components/editor/office/office-chrome.tsx +0 -83
- package/.next/standalone/src/components/editor/office/pptx-viewer.tsx +0 -104
- package/.next/standalone/src/components/editor/office/xlsx-viewer.tsx +0 -192
- package/.next/standalone/src/components/editor/pdf-viewer.tsx +0 -32
- package/.next/standalone/src/components/editor/proof-span-popover.tsx +0 -162
- package/.next/standalone/src/components/editor/slash-commands.tsx +0 -629
- package/.next/standalone/src/components/editor/source-viewer.tsx +0 -289
- package/.next/standalone/src/components/editor/suggest-edit-popover.tsx +0 -229
- package/.next/standalone/src/components/editor/suggestion-card.tsx +0 -206
- package/.next/standalone/src/components/editor/table-menu.tsx +0 -232
- package/.next/standalone/src/components/editor/view-mode-comment-button.tsx +0 -77
- package/.next/standalone/src/components/editor/website-viewer.tsx +0 -75
- package/.next/standalone/src/components/editor/wiki-link-create-dialog.tsx +0 -189
- package/.next/standalone/src/components/editor/wiki-link-decorator.ts +0 -79
- package/.next/standalone/src/components/editor/wiki-link-extension.ts +0 -120
- package/.next/standalone/src/components/editor/wiki-link-picker.tsx +0 -250
- package/.next/standalone/src/components/layout/viewer-toolbar.tsx +0 -54
- package/.next/standalone/src/components/search/search-command-dialog.tsx +0 -246
- package/.next/standalone/src/components/search/sidebar-search-box.tsx +0 -121
- package/.next/standalone/src/components/search/snippet-text.tsx +0 -48
- package/.next/standalone/src/components/share-dialog.tsx +0 -307
- package/.next/standalone/src/components/theme-provider.tsx +0 -16
- package/.next/standalone/src/components/theme-toggle.tsx +0 -24
- package/.next/standalone/src/components/ui/badge.tsx +0 -35
- package/.next/standalone/src/components/ui/button.tsx +0 -56
- package/.next/standalone/src/components/ui/card.tsx +0 -63
- package/.next/standalone/src/components/ui/collapsible.tsx +0 -9
- package/.next/standalone/src/components/ui/command.tsx +0 -151
- package/.next/standalone/src/components/ui/context-menu.tsx +0 -191
- package/.next/standalone/src/components/ui/dialog.tsx +0 -119
- package/.next/standalone/src/components/ui/dropdown-menu.tsx +0 -194
- package/.next/standalone/src/components/ui/input.tsx +0 -22
- package/.next/standalone/src/components/ui/label.tsx +0 -25
- package/.next/standalone/src/components/ui/popover.tsx +0 -33
- package/.next/standalone/src/components/ui/scroll-area.tsx +0 -47
- package/.next/standalone/src/components/ui/select.tsx +0 -156
- package/.next/standalone/src/components/ui/separator.tsx +0 -30
- package/.next/standalone/src/components/ui/sheet.tsx +0 -140
- package/.next/standalone/src/components/ui/skeleton.tsx +0 -15
- package/.next/standalone/src/components/ui/switch.tsx +0 -28
- package/.next/standalone/src/components/ui/tabs.tsx +0 -54
- package/.next/standalone/src/components/ui/textarea.tsx +0 -21
- package/.next/standalone/src/components/ui/tip.tsx +0 -23
- package/.next/standalone/src/components/ui/toggle-group.tsx +0 -41
- package/.next/standalone/src/components/ui/tooltip.tsx +0 -27
- package/.next/standalone/src/components/view-width-toggle.tsx +0 -70
- package/.next/standalone/src/components/wiki/frontmatter-header.tsx +0 -164
- package/.next/standalone/src/hooks/use-is-mobile.ts +0 -14
- package/.next/standalone/src/lib/app-runner.ts +0 -272
- package/.next/standalone/src/lib/auth/admin.ts +0 -120
- package/.next/standalone/src/lib/auth/allowlist.ts +0 -50
- package/.next/standalone/src/lib/auth/client.ts +0 -4
- package/.next/standalone/src/lib/auth/csrf.ts +0 -68
- package/.next/standalone/src/lib/auth/server.ts +0 -215
- package/.next/standalone/src/lib/cabinets/tree.ts +0 -75
- package/.next/standalone/src/lib/config.ts +0 -114
- package/.next/standalone/src/lib/embeds/detect.ts +0 -142
- package/.next/standalone/src/lib/git-secrets.ts +0 -65
- package/.next/standalone/src/lib/git.ts +0 -503
- package/.next/standalone/src/lib/google/detect.ts +0 -107
- package/.next/standalone/src/lib/markdown/parse-frontmatter.ts +0 -104
- package/.next/standalone/src/lib/markdown/remark-wikilinks.ts +0 -100
- package/.next/standalone/src/lib/markdown/sanitize-schema.ts +0 -106
- package/.next/standalone/src/lib/markdown/to-html.ts +0 -282
- package/.next/standalone/src/lib/markdown/to-markdown.ts +0 -252
- package/.next/standalone/src/lib/proof/activity-shared.ts +0 -31
- package/.next/standalone/src/lib/proof/activity.ts +0 -74
- package/.next/standalone/src/lib/proof/audit.ts +0 -88
- package/.next/standalone/src/lib/proof/auth.ts +0 -143
- package/.next/standalone/src/lib/proof/block-refs.ts +0 -133
- package/.next/standalone/src/lib/proof/blocks.ts +0 -73
- package/.next/standalone/src/lib/proof/client-auth.ts +0 -23
- package/.next/standalone/src/lib/proof/collab-state.ts +0 -81
- package/.next/standalone/src/lib/proof/event-bus.ts +0 -47
- package/.next/standalone/src/lib/proof/file-lock.ts +0 -43
- package/.next/standalone/src/lib/proof/glob.ts +0 -51
- package/.next/standalone/src/lib/proof/idempotency.ts +0 -37
- package/.next/standalone/src/lib/proof/lease.ts +0 -117
- package/.next/standalone/src/lib/proof/mutex.ts +0 -36
- package/.next/standalone/src/lib/proof/ops-applier.ts +0 -727
- package/.next/standalone/src/lib/proof/owner-auth.ts +0 -2
- package/.next/standalone/src/lib/proof/pending.ts +0 -97
- package/.next/standalone/src/lib/proof/proof-span.ts +0 -141
- package/.next/standalone/src/lib/proof/rate-limit.ts +0 -53
- package/.next/standalone/src/lib/proof/raw-fs.ts +0 -197
- package/.next/standalone/src/lib/proof/register-rate-limit.ts +0 -53
- package/.next/standalone/src/lib/proof/registry.ts +0 -195
- package/.next/standalone/src/lib/proof/sidecar.ts +0 -103
- package/.next/standalone/src/lib/proof/suggest-capture.ts +0 -69
- package/.next/standalone/src/lib/proof/types.ts +0 -182
- package/.next/standalone/src/lib/proof-config.ts +0 -14
- package/.next/standalone/src/lib/root-dir.ts +0 -35
- package/.next/standalone/src/lib/search/indexable-exts.ts +0 -25
- package/.next/standalone/src/lib/search/indexer.ts +0 -634
- package/.next/standalone/src/lib/search/sanitize.ts +0 -35
- package/.next/standalone/src/lib/search/search-db.ts +0 -57
- package/.next/standalone/src/lib/search/watcher-pool.ts +0 -79
- package/.next/standalone/src/lib/shared-docs/db.ts +0 -177
- package/.next/standalone/src/lib/toast.ts +0 -9
- package/.next/standalone/src/lib/utils.ts +0 -6
- package/.next/standalone/src/lib/wiki-helpers.ts +0 -36
- package/.next/standalone/src/lib/workspace-client.ts +0 -82
- package/.next/standalone/src/lib/workspace-context.ts +0 -173
- package/.next/standalone/src/lib/workspaces.ts +0 -400
- package/.next/standalone/src/middleware.ts +0 -44
- package/.next/standalone/src/stores/ai-panel-store.ts +0 -79
- package/.next/standalone/src/stores/editor-store.ts +0 -439
- package/.next/standalone/src/stores/pin-store.ts +0 -56
- package/.next/standalone/src/stores/proof-store.ts +0 -124
- package/.next/standalone/src/stores/recent-store.ts +0 -51
- package/.next/standalone/src/stores/search-store.ts +0 -104
- package/.next/standalone/src/stores/show-hidden-store.ts +0 -26
- package/.next/standalone/src/stores/sidebar-width-store.ts +0 -39
- package/.next/standalone/src/stores/skin-store.ts +0 -42
- package/.next/standalone/src/stores/tree-store.ts +0 -52
- package/.next/standalone/src/stores/view-width-store.ts +0 -101
- package/.next/standalone/src/stores/wiki-slugs-store.ts +0 -75
- package/.next/standalone/src/tests/proof/activity-aggregator.test.ts +0 -146
- package/.next/standalone/src/tests/proof/admin-create-user.test.ts +0 -43
- package/.next/standalone/src/tests/proof/agent-fs.test.ts +0 -973
- package/.next/standalone/src/tests/proof/agent-ownership.test.ts +0 -140
- package/.next/standalone/src/tests/proof/agent-workspace-scope.test.ts +0 -134
- package/.next/standalone/src/tests/proof/agents-install.test.ts +0 -110
- package/.next/standalone/src/tests/proof/bench-write.ts +0 -179
- package/.next/standalone/src/tests/proof/better-auth.test.ts +0 -68
- package/.next/standalone/src/tests/proof/block-refs.test.ts +0 -108
- package/.next/standalone/src/tests/proof/blocks.test.ts +0 -92
- package/.next/standalone/src/tests/proof/collab-state.test.ts +0 -501
- package/.next/standalone/src/tests/proof/comments-ops.test.ts +0 -177
- package/.next/standalone/src/tests/proof/editor-roundtrip.test.ts +0 -85
- package/.next/standalone/src/tests/proof/external-edit.test.ts +0 -58
- package/.next/standalone/src/tests/proof/file-lock.test.ts +0 -80
- package/.next/standalone/src/tests/proof/git-branches-checkout.test.ts +0 -136
- package/.next/standalone/src/tests/proof/git-read-features.test.ts +0 -473
- package/.next/standalone/src/tests/proof/git-secrets.test.ts +0 -138
- package/.next/standalone/src/tests/proof/git-sparse.test.ts +0 -257
- package/.next/standalone/src/tests/proof/git-workspace.test.ts +0 -135
- package/.next/standalone/src/tests/proof/git.test.ts +0 -243
- package/.next/standalone/src/tests/proof/glob.test.ts +0 -82
- package/.next/standalone/src/tests/proof/helpers/auth-session.ts +0 -27
- package/.next/standalone/src/tests/proof/markdown-to-html.test.ts +0 -46
- package/.next/standalone/src/tests/proof/ops-applier.test.ts +0 -368
- package/.next/standalone/src/tests/proof/owner-init.test.ts +0 -2
- package/.next/standalone/src/tests/proof/parse-frontmatter.test.ts +0 -60
- package/.next/standalone/src/tests/proof/preload.ts +0 -21
- package/.next/standalone/src/tests/proof/proof-span.test.ts +0 -98
- package/.next/standalone/src/tests/proof/rate-limit.test.ts +0 -54
- package/.next/standalone/src/tests/proof/readonly-enforcement.test.ts +0 -161
- package/.next/standalone/src/tests/proof/reconcile-sidecar.test.ts +0 -195
- package/.next/standalone/src/tests/proof/registration-flow.test.ts +0 -330
- package/.next/standalone/src/tests/proof/registry.test.ts +0 -169
- package/.next/standalone/src/tests/proof/routes.test.ts +0 -516
- package/.next/standalone/src/tests/proof/search-index.test.ts +0 -376
- package/.next/standalone/src/tests/proof/sidecar-lifecycle.test.ts +0 -177
- package/.next/standalone/src/tests/proof/sidecar-trim.test.ts +0 -58
- package/.next/standalone/src/tests/proof/suggestion-ops.test.ts +0 -280
- package/.next/standalone/src/tests/proof/wiki-content-put.test.ts +0 -140
- package/.next/standalone/src/tests/proof/wiki-routes-auth.test.ts +0 -208
- package/.next/standalone/src/tests/proof/workspace-isolation.test.ts +0 -87
- package/.next/standalone/src/tests/proof/workspaces-api.test.ts +0 -227
- package/.next/standalone/src/types/index.ts +0 -47
- package/.next/standalone/tailwind.config.ts +0 -191
- package/.next/standalone/tsconfig.json +0 -41
- package/.next/standalone/tsconfig.tsbuildinfo +0 -1
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_ssgManifest.js +0 -0
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* §7.6 Roundtrip fidelity: proof-span survives markdownToHtml → htmlToMarkdown.
|
|
3
|
-
*/
|
|
4
|
-
import assert from "node:assert/strict";
|
|
5
|
-
import { describe, it, test } from "node:test";
|
|
6
|
-
import { markdownToHtml } from "@/lib/markdown/to-html";
|
|
7
|
-
import { htmlToMarkdown } from "@/lib/markdown/to-markdown";
|
|
8
|
-
import { ProofSpan } from "@/components/editor/extensions/proof-span";
|
|
9
|
-
|
|
10
|
-
const SPAN_TAG = "proof-span";
|
|
11
|
-
|
|
12
|
-
/** Collect all attribute key=value pairs from a proof-span tag in a string. */
|
|
13
|
-
function extractSpanAttrs(src: string): Map<string, string> {
|
|
14
|
-
const match = src.match(/<proof-span\b([^>]*)>/);
|
|
15
|
-
if (!match) return new Map();
|
|
16
|
-
const attrsRaw = match[1];
|
|
17
|
-
const map = new Map<string, string>();
|
|
18
|
-
const attrRe = /([a-z-]+)="([^"]*)"/g;
|
|
19
|
-
let m: RegExpExecArray | null;
|
|
20
|
-
while ((m = attrRe.exec(attrsRaw)) !== null) {
|
|
21
|
-
map.set(m[1], m[2]);
|
|
22
|
-
}
|
|
23
|
-
return map;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
describe("editor-roundtrip proof-span", () => {
|
|
27
|
-
it("preserves proof-span tag and inner content through html roundtrip", async () => {
|
|
28
|
-
const md =
|
|
29
|
-
'Hello <proof-span id="p123" origin="ai" by="ai:claude" at="2026-01-01T00:00:00Z" basis="described">hello world</proof-span> end.';
|
|
30
|
-
|
|
31
|
-
const html = await markdownToHtml(md);
|
|
32
|
-
|
|
33
|
-
// The HTML should contain a proof-span element (TipTap schema is client-side;
|
|
34
|
-
// here we verify the remark pipeline preserves raw HTML passthrough).
|
|
35
|
-
assert.ok(html.includes(SPAN_TAG), `HTML should contain <${SPAN_TAG}> tag:\n${html}`);
|
|
36
|
-
assert.ok(html.includes("hello world"), "HTML should contain inner text");
|
|
37
|
-
|
|
38
|
-
const roundtripped = htmlToMarkdown(html);
|
|
39
|
-
|
|
40
|
-
assert.ok(
|
|
41
|
-
roundtripped.includes(`<${SPAN_TAG}`),
|
|
42
|
-
`Roundtripped markdown should contain <${SPAN_TAG}> tag:\n${roundtripped}`,
|
|
43
|
-
);
|
|
44
|
-
assert.ok(
|
|
45
|
-
roundtripped.includes("hello world"),
|
|
46
|
-
"Roundtripped markdown should contain inner text",
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
const origAttrs = extractSpanAttrs(md);
|
|
50
|
-
const rtAttrs = extractSpanAttrs(roundtripped);
|
|
51
|
-
|
|
52
|
-
// Every attr in the original must survive the roundtrip.
|
|
53
|
-
for (const [key, value] of origAttrs) {
|
|
54
|
-
assert.equal(
|
|
55
|
-
rtAttrs.get(key),
|
|
56
|
-
value,
|
|
57
|
-
`Attribute '${key}' should survive roundtrip. Expected '${value}', got '${rtAttrs.get(key)}'`,
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it("TipTap ProofSpan mark schema matches spec", () => {
|
|
63
|
-
const inst = ProofSpan.configure({});
|
|
64
|
-
assert.equal(inst.name, "proofSpan");
|
|
65
|
-
const spec = (inst as { config: { parseHTML?: () => unknown[] } }).config;
|
|
66
|
-
assert.ok(spec.parseHTML, "parseHTML defined");
|
|
67
|
-
const parseRules = (spec.parseHTML as () => Array<{ tag: string }>)();
|
|
68
|
-
assert.equal(parseRules[0].tag, "proof-span");
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it("preserves proof-span with wiki-link child", async () => {
|
|
72
|
-
const md =
|
|
73
|
-
'Text <proof-span id="p456" origin="ai" by="ai:cursor" at="2026-01-01T00:00:00Z" basis="inferred">see [[my-page]]</proof-span>.';
|
|
74
|
-
|
|
75
|
-
const html = await markdownToHtml(md);
|
|
76
|
-
const roundtripped = htmlToMarkdown(html);
|
|
77
|
-
|
|
78
|
-
assert.ok(roundtripped.includes(`<${SPAN_TAG}`), "span tag preserved");
|
|
79
|
-
// Wiki-link should be preserved (either as [[my-page]] or as anchor markup)
|
|
80
|
-
assert.ok(
|
|
81
|
-
roundtripped.includes("my-page"),
|
|
82
|
-
"wiki-link slug preserved inside span",
|
|
83
|
-
);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { test, before, after } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { mkdtemp, writeFile, rm } from "node:fs/promises";
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { readSnapshot } from "../../lib/proof/ops-applier.js";
|
|
7
|
-
import { setRootDir } from "../../lib/root-dir.js";
|
|
8
|
-
|
|
9
|
-
let tmpRoot: string;
|
|
10
|
-
|
|
11
|
-
before(async () => {
|
|
12
|
-
tmpRoot = await mkdtemp(path.join(tmpdir(), "wiki-ext-edit-test-"));
|
|
13
|
-
setRootDir(tmpRoot);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
after(async () => {
|
|
17
|
-
await rm(tmpRoot, { recursive: true, force: true });
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
test("readSnapshot: detects external edit and emits file.externallyEdited event", async () => {
|
|
21
|
-
const mdFile = path.join(tmpRoot, "ext-edit.md");
|
|
22
|
-
const original = "# Title\n\nOriginal content.\n";
|
|
23
|
-
|
|
24
|
-
// Write initial content
|
|
25
|
-
await writeFile(mdFile, original, "utf-8");
|
|
26
|
-
|
|
27
|
-
// Take first snapshot — establishes fingerprint in sidecar
|
|
28
|
-
const snap0 = await readSnapshot(tmpRoot, "ext-edit.md");
|
|
29
|
-
assert.ok(snap0 !== null);
|
|
30
|
-
assert.equal(snap0!.revision, 0);
|
|
31
|
-
|
|
32
|
-
// Externally modify the file on disk (bypass ops-applier)
|
|
33
|
-
const modified = "# Title\n\nExternally modified content.\n";
|
|
34
|
-
await writeFile(mdFile, modified, "utf-8");
|
|
35
|
-
|
|
36
|
-
// readSnapshot should detect the mismatch and bump revision + emit event
|
|
37
|
-
const snap1 = await readSnapshot(tmpRoot, "ext-edit.md");
|
|
38
|
-
assert.ok(snap1 !== null);
|
|
39
|
-
assert.equal(snap1!.revision, 1, "revision should be bumped after external edit");
|
|
40
|
-
|
|
41
|
-
// The last event in the sidecar should be file.externallyEdited
|
|
42
|
-
// We verify via the lastEventId being > the initial snap
|
|
43
|
-
assert.ok(snap1!.lastEventId >= 0, "lastEventId should be set");
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test("readSnapshot: no false positive when file unchanged", async () => {
|
|
47
|
-
const mdFile = path.join(tmpRoot, "no-change.md");
|
|
48
|
-
await writeFile(mdFile, "# Stable\n\nContent.\n", "utf-8");
|
|
49
|
-
|
|
50
|
-
const snap0 = await readSnapshot(tmpRoot, "no-change.md");
|
|
51
|
-
assert.ok(snap0 !== null);
|
|
52
|
-
assert.equal(snap0!.revision, 0);
|
|
53
|
-
|
|
54
|
-
// Read again without any external change
|
|
55
|
-
const snap1 = await readSnapshot(tmpRoot, "no-change.md");
|
|
56
|
-
assert.ok(snap1 !== null);
|
|
57
|
-
assert.equal(snap1!.revision, 0, "revision must not change when file is unmodified");
|
|
58
|
-
});
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Basic tests for withFileLock / withFileMutex cross-process safety layer.
|
|
3
|
-
*/
|
|
4
|
-
import { test, before, after } from "node:test";
|
|
5
|
-
import assert from "node:assert/strict";
|
|
6
|
-
import { mkdtemp, rm } from "node:fs/promises";
|
|
7
|
-
import { tmpdir } from "node:os";
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
|
|
10
|
-
let tmpHome: string;
|
|
11
|
-
|
|
12
|
-
before(async () => {
|
|
13
|
-
tmpHome = await mkdtemp(path.join(tmpdir(), "file-lock-test-"));
|
|
14
|
-
process.env.HOME = tmpHome;
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
after(async () => {
|
|
18
|
-
await rm(tmpHome, { recursive: true, force: true });
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
import { withFileLock } from "../../lib/proof/file-lock.js";
|
|
22
|
-
import { withFileMutex } from "../../lib/proof/mutex.js";
|
|
23
|
-
|
|
24
|
-
test("withFileLock: acquires and releases without deadlock", async () => {
|
|
25
|
-
const result = await withFileLock("test-key-1", async () => {
|
|
26
|
-
return 42;
|
|
27
|
-
});
|
|
28
|
-
assert.equal(result, 42);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
test("withFileLock: sequential calls on same key succeed", async () => {
|
|
32
|
-
const r1 = await withFileLock("test-key-seq", async () => "first");
|
|
33
|
-
const r2 = await withFileLock("test-key-seq", async () => "second");
|
|
34
|
-
assert.equal(r1, "first");
|
|
35
|
-
assert.equal(r2, "second");
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test("withFileLock: propagates errors and releases lock", async () => {
|
|
39
|
-
await assert.rejects(
|
|
40
|
-
() => withFileLock("test-key-err", async () => { throw new Error("boom"); }),
|
|
41
|
-
/boom/,
|
|
42
|
-
);
|
|
43
|
-
// Should be releasable again
|
|
44
|
-
const r = await withFileLock("test-key-err", async () => "ok");
|
|
45
|
-
assert.equal(r, "ok");
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test("withFileMutex: serialises concurrent in-process callers", async () => {
|
|
49
|
-
const results: number[] = [];
|
|
50
|
-
await Promise.all([
|
|
51
|
-
withFileMutex("mutex-concurrent-key", async () => {
|
|
52
|
-
results.push(1);
|
|
53
|
-
await new Promise((r) => setTimeout(r, 10));
|
|
54
|
-
results.push(2);
|
|
55
|
-
}),
|
|
56
|
-
withFileMutex("mutex-concurrent-key", async () => {
|
|
57
|
-
results.push(3);
|
|
58
|
-
}),
|
|
59
|
-
]);
|
|
60
|
-
// Serialised: 1, 2 must appear before 3.
|
|
61
|
-
assert.deepEqual(results, [1, 2, 3]);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("withFileMutex: different keys run concurrently", async () => {
|
|
65
|
-
const log: string[] = [];
|
|
66
|
-
await Promise.all([
|
|
67
|
-
withFileMutex("key-A", async () => {
|
|
68
|
-
log.push("A-start");
|
|
69
|
-
await new Promise((r) => setTimeout(r, 20));
|
|
70
|
-
log.push("A-end");
|
|
71
|
-
}),
|
|
72
|
-
withFileMutex("key-B", async () => {
|
|
73
|
-
log.push("B-start");
|
|
74
|
-
log.push("B-end");
|
|
75
|
-
}),
|
|
76
|
-
]);
|
|
77
|
-
// B can start before A ends (different keys = no contention).
|
|
78
|
-
assert.ok(log.includes("B-start"));
|
|
79
|
-
assert.ok(log.includes("A-end"));
|
|
80
|
-
});
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Focused tests for gitBranches and gitCheckout lib functions.
|
|
3
|
-
* Skips silently if git binary is not available.
|
|
4
|
-
*/
|
|
5
|
-
import { test, before, after, describe } from "node:test";
|
|
6
|
-
import assert from "node:assert/strict";
|
|
7
|
-
import { mkdtemp, rm, writeFile, mkdir } from "node:fs/promises";
|
|
8
|
-
import { execFileSync } from "node:child_process";
|
|
9
|
-
import { tmpdir } from "node:os";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
|
|
12
|
-
import {
|
|
13
|
-
assertGitAvailable,
|
|
14
|
-
gitBranches,
|
|
15
|
-
gitCheckout,
|
|
16
|
-
} from "../../lib/git.js";
|
|
17
|
-
|
|
18
|
-
const gitEnv = {
|
|
19
|
-
...process.env,
|
|
20
|
-
GIT_AUTHOR_NAME: "Test User",
|
|
21
|
-
GIT_AUTHOR_EMAIL: "test@example.com",
|
|
22
|
-
GIT_COMMITTER_NAME: "Test User",
|
|
23
|
-
GIT_COMMITTER_EMAIL: "test@example.com",
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
let gitOk = false;
|
|
27
|
-
let tempRoot: string;
|
|
28
|
-
let repoDir: string;
|
|
29
|
-
let featureBranch: string;
|
|
30
|
-
|
|
31
|
-
before(async () => {
|
|
32
|
-
try {
|
|
33
|
-
await assertGitAvailable();
|
|
34
|
-
gitOk = true;
|
|
35
|
-
} catch {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
tempRoot = await mkdtemp(path.join(tmpdir(), "wiki-branches-ck-"));
|
|
40
|
-
repoDir = path.join(tempRoot, "repo");
|
|
41
|
-
await mkdir(repoDir, { recursive: true });
|
|
42
|
-
|
|
43
|
-
execFileSync("git", ["init"], { cwd: repoDir, env: gitEnv });
|
|
44
|
-
execFileSync("git", ["config", "user.email", "test@example.com"], { cwd: repoDir, env: gitEnv });
|
|
45
|
-
execFileSync("git", ["config", "user.name", "Test User"], { cwd: repoDir, env: gitEnv });
|
|
46
|
-
|
|
47
|
-
await writeFile(path.join(repoDir, "README.md"), "# Hello\n");
|
|
48
|
-
execFileSync("git", ["add", "."], { cwd: repoDir, env: gitEnv });
|
|
49
|
-
execFileSync("git", ["commit", "-m", "Initial commit"], { cwd: repoDir, env: gitEnv });
|
|
50
|
-
|
|
51
|
-
// Create a second branch for checkout tests
|
|
52
|
-
featureBranch = "feature-branch-test";
|
|
53
|
-
execFileSync("git", ["checkout", "-b", featureBranch], { cwd: repoDir, env: gitEnv });
|
|
54
|
-
// Switch back to main/master so we can checkout feature-branch-test
|
|
55
|
-
execFileSync("git", ["checkout", "-"], { cwd: repoDir, env: gitEnv });
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
after(async () => {
|
|
59
|
-
if (tempRoot) await rm(tempRoot, { recursive: true, force: true });
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
|
-
// gitBranches
|
|
64
|
-
// ---------------------------------------------------------------------------
|
|
65
|
-
|
|
66
|
-
describe("gitBranches", () => {
|
|
67
|
-
test("returns array with at least one branch", async () => {
|
|
68
|
-
if (!gitOk) return;
|
|
69
|
-
const branches = await gitBranches(repoDir);
|
|
70
|
-
assert.ok(Array.isArray(branches));
|
|
71
|
-
assert.ok(branches.length >= 1, `expected branches, got ${JSON.stringify(branches)}`);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test("marks exactly one branch as current", async () => {
|
|
75
|
-
if (!gitOk) return;
|
|
76
|
-
const branches = await gitBranches(repoDir);
|
|
77
|
-
const current = branches.filter((b) => b.current);
|
|
78
|
-
assert.equal(current.length, 1, "exactly one branch should be current");
|
|
79
|
-
assert.ok(current[0].name.length > 0, "current branch has non-empty name");
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test("lists all local branches including feature branch", async () => {
|
|
83
|
-
if (!gitOk) return;
|
|
84
|
-
const branches = await gitBranches(repoDir);
|
|
85
|
-
const names = branches.map((b) => b.name);
|
|
86
|
-
assert.ok(names.includes(featureBranch), `expected ${featureBranch} in ${JSON.stringify(names)}`);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// ---------------------------------------------------------------------------
|
|
91
|
-
// gitCheckout
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
|
|
94
|
-
describe("gitCheckout", () => {
|
|
95
|
-
test("throws with invalidBranch=true for invalid branch name format", async () => {
|
|
96
|
-
if (!gitOk) return;
|
|
97
|
-
const err = await gitCheckout(repoDir, "../../evil").catch((e) => e);
|
|
98
|
-
assert.ok(err instanceof Error, "should throw Error");
|
|
99
|
-
assert.equal((err as Error & { invalidBranch?: boolean }).invalidBranch, true);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test("throws with invalidBranch=true for branch name with semicolon", async () => {
|
|
103
|
-
if (!gitOk) return;
|
|
104
|
-
const err = await gitCheckout(repoDir, "main;evil").catch((e) => e);
|
|
105
|
-
assert.ok(err instanceof Error, "should throw Error");
|
|
106
|
-
assert.equal((err as Error & { invalidBranch?: boolean }).invalidBranch, true);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
test("succeeds on clean repo when checking out existing branch", async () => {
|
|
110
|
-
if (!gitOk) return;
|
|
111
|
-
const result = await gitCheckout(repoDir, featureBranch);
|
|
112
|
-
assert.equal(result.branch, featureBranch);
|
|
113
|
-
assert.match(result.sha, /^[0-9a-f]{40}$/);
|
|
114
|
-
// Switch back
|
|
115
|
-
execFileSync("git", ["checkout", "-"], { cwd: repoDir, env: gitEnv });
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test("throws with dirty=true when working tree has uncommitted changes", async () => {
|
|
119
|
-
if (!gitOk) return;
|
|
120
|
-
// Create an untracked file to make repo dirty
|
|
121
|
-
await writeFile(path.join(repoDir, "untracked.txt"), "dirty\n");
|
|
122
|
-
// Stage it to make it appear in porcelain status
|
|
123
|
-
execFileSync("git", ["add", "untracked.txt"], { cwd: repoDir, env: gitEnv });
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
const err = await gitCheckout(repoDir, featureBranch).catch((e) => e);
|
|
127
|
-
assert.ok(err instanceof Error, "should throw Error");
|
|
128
|
-
assert.equal((err as Error & { dirty?: boolean }).dirty, true);
|
|
129
|
-
} finally {
|
|
130
|
-
// Clean up the staged file
|
|
131
|
-
execFileSync("git", ["restore", "--staged", "untracked.txt"], { cwd: repoDir, env: gitEnv });
|
|
132
|
-
const { rm: rmFile } = await import("node:fs/promises");
|
|
133
|
-
await rmFile(path.join(repoDir, "untracked.txt"));
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
});
|