kodi-dev 0.1.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -13
- package/board-dist/.next/BUILD_ID +1 -0
- package/board-dist/.next/app-path-routes-manifest.json +6 -0
- package/board-dist/.next/build-manifest.json +21 -0
- package/board-dist/.next/package.json +1 -0
- package/board-dist/.next/prerender-manifest.json +61 -0
- package/board-dist/.next/required-server-files.json +334 -0
- package/board-dist/.next/routes-manifest.json +69 -0
- package/board-dist/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
- package/board-dist/.next/server/app/_global-error/page/build-manifest.json +17 -0
- package/board-dist/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
- package/board-dist/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
- package/board-dist/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
- package/board-dist/.next/server/app/_global-error/page.js +9 -0
- package/board-dist/.next/server/app/_global-error/page.js.map +5 -0
- package/board-dist/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/board-dist/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
- package/board-dist/.next/server/app/_global-error.html +1 -0
- package/board-dist/.next/server/app/_global-error.meta +15 -0
- package/board-dist/.next/server/app/_global-error.rsc +14 -0
- package/board-dist/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
- package/board-dist/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
- package/board-dist/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
- package/board-dist/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
- package/board-dist/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/board-dist/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/board-dist/.next/server/app/_not-found/page/build-manifest.json +17 -0
- package/board-dist/.next/server/app/_not-found/page/next-font-manifest.json +6 -0
- package/board-dist/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/board-dist/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
- package/board-dist/.next/server/app/_not-found/page.js +14 -0
- package/board-dist/.next/server/app/_not-found/page.js.map +5 -0
- package/board-dist/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/board-dist/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
- package/board-dist/.next/server/app/_not-found.html +1 -0
- package/board-dist/.next/server/app/_not-found.meta +16 -0
- package/board-dist/.next/server/app/_not-found.rsc +19 -0
- package/board-dist/.next/server/app/_not-found.segments/_full.segment.rsc +19 -0
- package/board-dist/.next/server/app/_not-found.segments/_head.segment.rsc +5 -0
- package/board-dist/.next/server/app/_not-found.segments/_index.segment.rsc +7 -0
- package/board-dist/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
- package/board-dist/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
- package/board-dist/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
- package/board-dist/.next/server/app/events/route/app-paths-manifest.json +3 -0
- package/board-dist/.next/server/app/events/route/build-manifest.json +9 -0
- package/board-dist/.next/server/app/events/route/server-reference-manifest.json +4 -0
- package/board-dist/.next/server/app/events/route.js +6 -0
- package/board-dist/.next/server/app/events/route.js.map +5 -0
- package/board-dist/.next/server/app/events/route.js.nft.json +1 -0
- package/board-dist/.next/server/app/events/route_client-reference-manifest.js +3 -0
- package/board-dist/.next/server/app/page/app-paths-manifest.json +3 -0
- package/board-dist/.next/server/app/page/build-manifest.json +17 -0
- package/board-dist/.next/server/app/page/next-font-manifest.json +6 -0
- package/board-dist/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/board-dist/.next/server/app/page/server-reference-manifest.json +17 -0
- package/board-dist/.next/server/app/page.js +16 -0
- package/board-dist/.next/server/app/page.js.map +5 -0
- package/board-dist/.next/server/app/page.js.nft.json +1 -0
- package/board-dist/.next/server/app/page_client-reference-manifest.js +3 -0
- package/board-dist/.next/server/app-paths-manifest.json +6 -0
- package/board-dist/.next/server/chunks/[externals]__1ss5vg_._.js +3 -0
- package/board-dist/.next/server/chunks/[root-of-the-server]__1ru180x._.js +7 -0
- package/board-dist/.next/server/chunks/[turbopack]_runtime.js +903 -0
- package/board-dist/.next/server/chunks/_next-internal_server_app_events_route_actions_0od5_fv.js +3 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__02c5_l-._.js +33 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__02l7d_r._.js +19 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__0_2b22l._.js +28 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__0eauvyk._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__0ln09ua._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__0z_68tr._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js +33 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__1hyno69._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/[root-of-the-server]__1q4kwtw._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
- package/board-dist/.next/server/chunks/ssr/_1wslo41._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +3 -0
- package/board-dist/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +3 -0
- package/board-dist/.next/server/chunks/ssr/app_error_tsx_1zds1ns._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/app_error_tsx_20-epnw._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/app_layout_tsx_2144vk_._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/app_loading_tsx_0a1flg9._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_0h91jdk._.js +33 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_next_dist_03ioewi._.js +6 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +3 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +3 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0-o-goa.js +3 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +3 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1-4fbk_.js +4 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19--w_z.js +4 -0
- package/board-dist/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1hhqf9y.js +4 -0
- package/board-dist/.next/server/functions-config-manifest.json +6 -0
- package/board-dist/.next/server/middleware-build-manifest.js +21 -0
- package/board-dist/.next/server/middleware-manifest.json +6 -0
- package/board-dist/.next/server/next-font-manifest.js +1 -0
- package/board-dist/.next/server/next-font-manifest.json +6 -0
- package/board-dist/.next/server/pages/404.html +1 -0
- package/board-dist/.next/server/pages/500.html +1 -0
- package/board-dist/.next/server/pages-manifest.json +4 -0
- package/board-dist/.next/server/prefetch-hints.json +1 -0
- package/board-dist/.next/server/server-reference-manifest.js +1 -0
- package/board-dist/.next/server/server-reference-manifest.json +18 -0
- package/board-dist/.next/static/chunks/0245a4ypel7xx.js +1 -0
- package/board-dist/.next/static/chunks/0cz1d0mv5g_q7.js +1 -0
- package/board-dist/.next/static/chunks/0dw6y-0ffla71.js +5 -0
- package/board-dist/.next/static/chunks/158myu8e_yme3.js +1 -0
- package/board-dist/.next/static/chunks/1jq4o6yq14o4c.js +31 -0
- package/board-dist/.next/static/chunks/2b8wyk_yjz96q.js +1 -0
- package/board-dist/.next/static/chunks/2gkbk2qdsow-j.js +1 -0
- package/board-dist/.next/static/chunks/3rm_a_257myov.css +1 -0
- package/board-dist/.next/static/chunks/3rxl-jt3pdxgx.js +1 -0
- package/board-dist/.next/static/chunks/turbopack-3ec-4w_qyxb-d.js +1 -0
- package/board-dist/.next/static/jxv0GcmWplyzie2rdOiIo/_buildManifest.js +11 -0
- package/board-dist/.next/static/jxv0GcmWplyzie2rdOiIo/_clientMiddlewareManifest.js +1 -0
- package/board-dist/.next/static/jxv0GcmWplyzie2rdOiIo/_ssgManifest.js +1 -0
- package/board-dist/lib/tickets/board.ts +154 -0
- package/board-dist/lib/tickets/frontmatter.ts +114 -0
- package/board-dist/lib/tickets/status-index.ts +184 -0
- package/board-dist/lib/tickets/types.ts +69 -0
- package/board-dist/node_modules/@img/colour/color.cjs +1596 -0
- package/board-dist/node_modules/@img/colour/index.cjs +1 -0
- package/board-dist/node_modules/@img/colour/package.json +58 -0
- package/board-dist/node_modules/@img/sharp-libvips-linux-x64/README.md +46 -0
- package/board-dist/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +221 -0
- package/board-dist/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +1 -0
- package/board-dist/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/board-dist/node_modules/@img/sharp-libvips-linux-x64/package.json +42 -0
- package/board-dist/node_modules/@img/sharp-libvips-linux-x64/versions.json +30 -0
- package/board-dist/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/board-dist/node_modules/@img/sharp-linux-x64/package.json +46 -0
- package/board-dist/node_modules/@next/env/dist/index.js +1 -0
- package/board-dist/node_modules/@next/env/package.json +35 -0
- package/board-dist/node_modules/@swc/helpers/cjs/_interop_require_default.cjs +6 -0
- package/board-dist/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs +38 -0
- package/board-dist/node_modules/@swc/helpers/package.json +471 -0
- package/board-dist/node_modules/client-only/index.js +0 -0
- package/board-dist/node_modules/client-only/package.json +19 -0
- package/board-dist/node_modules/detect-libc/lib/detect-libc.js +313 -0
- package/board-dist/node_modules/detect-libc/lib/elf.js +39 -0
- package/board-dist/node_modules/detect-libc/lib/filesystem.js +51 -0
- package/board-dist/node_modules/detect-libc/lib/process.js +24 -0
- package/board-dist/node_modules/detect-libc/package.json +44 -0
- package/board-dist/node_modules/next/dist/build/adapter/setup-node-env.external.js +15 -0
- package/board-dist/node_modules/next/dist/build/define-env.js +255 -0
- package/board-dist/node_modules/next/dist/build/duration-to-string.js +99 -0
- package/board-dist/node_modules/next/dist/build/get-supported-browsers.js +38 -0
- package/board-dist/node_modules/next/dist/build/next-config-ts/require-hook.js +85 -0
- package/board-dist/node_modules/next/dist/build/next-config-ts/transpile-config.js +251 -0
- package/board-dist/node_modules/next/dist/build/output/format.js +84 -0
- package/board-dist/node_modules/next/dist/build/output/log.js +135 -0
- package/board-dist/node_modules/next/dist/build/segment-config/app/app-segment-config.js +162 -0
- package/board-dist/node_modules/next/dist/build/segment-config/app/app-segments.js +137 -0
- package/board-dist/node_modules/next/dist/build/segment-config/app/collect-root-param-keys.js +52 -0
- package/board-dist/node_modules/next/dist/build/static-paths/app/extract-pathname-route-param-segments-from-loader-tree.js +137 -0
- package/board-dist/node_modules/next/dist/build/static-paths/app.js +736 -0
- package/board-dist/node_modules/next/dist/build/static-paths/pages.js +169 -0
- package/board-dist/node_modules/next/dist/build/static-paths/utils.js +119 -0
- package/board-dist/node_modules/next/dist/build/swc/helpers.js +15 -0
- package/board-dist/node_modules/next/dist/build/swc/index.js +1348 -0
- package/board-dist/node_modules/next/dist/build/swc/install-bindings.js +30 -0
- package/board-dist/node_modules/next/dist/build/swc/jest-transformer.js +76 -0
- package/board-dist/node_modules/next/dist/build/swc/loaderWorkerPool.js +40 -0
- package/board-dist/node_modules/next/dist/build/swc/options.js +403 -0
- package/board-dist/node_modules/next/dist/build/swc/types.js +6 -0
- package/board-dist/node_modules/next/dist/build/utils.js +1216 -0
- package/board-dist/node_modules/next/dist/cli/next-test.js +170 -0
- package/board-dist/node_modules/next/dist/client/add-base-path.js +24 -0
- package/board-dist/node_modules/next/dist/client/app-call-server.js +34 -0
- package/board-dist/node_modules/next/dist/client/app-find-source-map-url.js +39 -0
- package/board-dist/node_modules/next/dist/client/assign-location.js +29 -0
- package/board-dist/node_modules/next/dist/client/components/app-router-announcer.js +78 -0
- package/board-dist/node_modules/next/dist/client/components/app-router-headers.js +138 -0
- package/board-dist/node_modules/next/dist/client/components/app-router-instance.js +397 -0
- package/board-dist/node_modules/next/dist/client/components/app-router-utils.js +62 -0
- package/board-dist/node_modules/next/dist/client/components/app-router.js +514 -0
- package/board-dist/node_modules/next/dist/client/components/builtin/default.js +35 -0
- package/board-dist/node_modules/next/dist/client/components/builtin/error-styles.js +165 -0
- package/board-dist/node_modules/next/dist/client/components/builtin/global-error.js +100 -0
- package/board-dist/node_modules/next/dist/client/components/dev-root-http-access-fallback-boundary.js +52 -0
- package/board-dist/node_modules/next/dist/client/components/error-boundary.js +144 -0
- package/board-dist/node_modules/next/dist/client/components/errors/graceful-degrade-boundary.js +86 -0
- package/board-dist/node_modules/next/dist/client/components/errors/root-error-boundary.js +41 -0
- package/board-dist/node_modules/next/dist/client/components/forbidden.js +48 -0
- package/board-dist/node_modules/next/dist/client/components/handle-isr-error.js +30 -0
- package/board-dist/node_modules/next/dist/client/components/hooks-server-context.js +42 -0
- package/board-dist/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js +125 -0
- package/board-dist/node_modules/next/dist/client/components/http-access-fallback/http-access-fallback.js +72 -0
- package/board-dist/node_modules/next/dist/client/components/is-next-router-error.js +23 -0
- package/board-dist/node_modules/next/dist/client/components/links.js +299 -0
- package/board-dist/node_modules/next/dist/client/components/match-segments.js +32 -0
- package/board-dist/node_modules/next/dist/client/components/nav-failure-handler.js +61 -0
- package/board-dist/node_modules/next/dist/client/components/navigation-devtools.js +126 -0
- package/board-dist/node_modules/next/dist/client/components/navigation-untracked.js +67 -0
- package/board-dist/node_modules/next/dist/client/components/navigation.js +225 -0
- package/board-dist/node_modules/next/dist/client/components/navigation.react-server.js +75 -0
- package/board-dist/node_modules/next/dist/client/components/not-found.js +42 -0
- package/board-dist/node_modules/next/dist/client/components/readonly-url-search-params.js +41 -0
- package/board-dist/node_modules/next/dist/client/components/redirect-boundary.js +107 -0
- package/board-dist/node_modules/next/dist/client/components/redirect-error.js +43 -0
- package/board-dist/node_modules/next/dist/client/components/redirect-status-code.js +24 -0
- package/board-dist/node_modules/next/dist/client/components/redirect.js +91 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/compute-changed-path.js +201 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/create-href-from-url.js +21 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/create-initial-router-state.js +153 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/create-router-cache-key.js +32 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/fetch-server-response.js +457 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/is-navigating-to-new-root-layout.js +59 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/ppr-navigations.js +1341 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/committed-state.js +49 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/find-head-in-cache.js +63 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/has-interception-route-in-current-tree.js +38 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/hmr-refresh-reducer.js +23 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/navigate-reducer.js +56 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/refresh-reducer.js +83 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/restore-reducer.js +62 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/server-action-reducer.js +320 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/reducers/server-patch-reducer.js +58 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/router-reducer-types.js +70 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/router-reducer.js +66 -0
- package/board-dist/node_modules/next/dist/client/components/router-reducer/set-cache-busting-search-param.js +66 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/bfcache.js +128 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/cache-key.js +28 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/cache-map.js +305 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/cache.js +1933 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/lru.js +152 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/navigation-testing-lock.js +194 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/navigation.js +597 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/optimistic-routes.js +543 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/prefetch.js +31 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/scheduler.js +1249 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/types.js +69 -0
- package/board-dist/node_modules/next/dist/client/components/segment-cache/vary-path.js +278 -0
- package/board-dist/node_modules/next/dist/client/components/static-generation-bailout.js +42 -0
- package/board-dist/node_modules/next/dist/client/components/unauthorized.js +49 -0
- package/board-dist/node_modules/next/dist/client/components/unrecognized-action-error.js +39 -0
- package/board-dist/node_modules/next/dist/client/components/unresolved-thenable.js +23 -0
- package/board-dist/node_modules/next/dist/client/components/unstable-rethrow.browser.js +28 -0
- package/board-dist/node_modules/next/dist/client/components/unstable-rethrow.js +25 -0
- package/board-dist/node_modules/next/dist/client/components/unstable-rethrow.server.js +32 -0
- package/board-dist/node_modules/next/dist/client/components/use-action-queue.js +148 -0
- package/board-dist/node_modules/next/dist/client/dev/debug-channel.js +172 -0
- package/board-dist/node_modules/next/dist/client/flight-data-helpers.js +232 -0
- package/board-dist/node_modules/next/dist/client/has-base-path.js +23 -0
- package/board-dist/node_modules/next/dist/client/lib/console.js +177 -0
- package/board-dist/node_modules/next/dist/client/lib/javascript-url.js +32 -0
- package/board-dist/node_modules/next/dist/client/navigation-build-id.js +53 -0
- package/board-dist/node_modules/next/dist/client/normalize-trailing-slash.js +36 -0
- package/board-dist/node_modules/next/dist/client/remove-base-path.js +32 -0
- package/board-dist/node_modules/next/dist/client/route-params.js +247 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/cookies/index.js +339 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/cookies/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/ponyfill/index.js +46 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/ponyfill/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/abort-controller.js.text.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/console.js.text.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/events.js.text.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/index.js +5 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/load.js +18713 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/stream.js +44 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/timers.js.text.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@edge-runtime/primitives/url.js.text.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@hapi/accept/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@hapi/accept/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/@mswjs/interceptors/ClientRequest/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@mswjs/interceptors/ClientRequest/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/@napi-rs/triples/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@napi-rs/triples/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/@opentelemetry/api/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/@opentelemetry/api/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/async-retry/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/async-retry/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/async-sema/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/async-sema/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/busboy/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/busboy/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/bytes/index.js +8 -0
- package/board-dist/node_modules/next/dist/compiled/bytes/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/ci-info/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/ci-info/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/commander/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/commander/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/comment-json/index.js +7 -0
- package/board-dist/node_modules/next/dist/compiled/comment-json/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/compression/index.js +58 -0
- package/board-dist/node_modules/next/dist/compiled/compression/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/conf/index.js +15 -0
- package/board-dist/node_modules/next/dist/compiled/conf/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/content-disposition/index.js +6 -0
- package/board-dist/node_modules/next/dist/compiled/content-disposition/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/cookie/index.js +7 -0
- package/board-dist/node_modules/next/dist/compiled/cookie/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/cross-spawn/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/cross-spawn/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/debug/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/debug/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/edge-runtime/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/edge-runtime/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/find-up/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/find-up/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/fresh/index.js +8 -0
- package/board-dist/node_modules/next/dist/compiled/fresh/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/http-proxy/index.js +34 -0
- package/board-dist/node_modules/next/dist/compiled/http-proxy/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/image-detector/detector.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/image-size/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/image-size/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/ipaddr.js/ipaddr.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/ipaddr.js/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/is-animated/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/is-animated/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/is-docker/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/is-docker/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/is-wsl/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/is-wsl/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/jsonwebtoken/index.js +11 -0
- package/board-dist/node_modules/next/dist/compiled/jsonwebtoken/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/nanoid/index.cjs +1 -0
- package/board-dist/node_modules/next/dist/compiled/nanoid/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +54 -0
- package/board-dist/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +54 -0
- package/board-dist/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +6 -0
- package/board-dist/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +20 -0
- package/board-dist/node_modules/next/dist/compiled/p-limit/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/p-limit/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/p-queue/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/p-queue/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/path-browserify/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/path-browserify/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/path-to-regexp/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/path-to-regexp/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/picomatch/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/picomatch/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/react-is/cjs/react-is.development.js +133 -0
- package/board-dist/node_modules/next/dist/compiled/react-is/cjs/react-is.production.js +130 -0
- package/board-dist/node_modules/next/dist/compiled/react-is/index.js +7 -0
- package/board-dist/node_modules/next/dist/compiled/react-is/package.json +26 -0
- package/board-dist/node_modules/next/dist/compiled/regenerator-runtime/package.json +19 -0
- package/board-dist/node_modules/next/dist/compiled/regenerator-runtime/runtime.js +729 -0
- package/board-dist/node_modules/next/dist/compiled/semver/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/semver/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/send/index.js +70 -0
- package/board-dist/node_modules/next/dist/compiled/send/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/source-map/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/source-map/source-map.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/stacktrace-parser/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/stacktrace-parser/stack-trace-parser.cjs.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/string-hash/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/string-hash/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/strip-ansi/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/strip-ansi/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/superstruct/index.cjs +1 -0
- package/board-dist/node_modules/next/dist/compiled/superstruct/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/tar/index.min.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/tar/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/text-table/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/text-table/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/watchpack/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/watchpack/watchpack.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/ws/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/ws/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/zod/index.cjs +1 -0
- package/board-dist/node_modules/next/dist/compiled/zod/package.json +1 -0
- package/board-dist/node_modules/next/dist/compiled/zod-validation-error/index.js +1 -0
- package/board-dist/node_modules/next/dist/compiled/zod-validation-error/package.json +1 -0
- package/board-dist/node_modules/next/dist/experimental/testmode/context.js +57 -0
- package/board-dist/node_modules/next/dist/experimental/testmode/fetch.js +142 -0
- package/board-dist/node_modules/next/dist/experimental/testmode/httpget.js +26 -0
- package/board-dist/node_modules/next/dist/experimental/testmode/server-edge.js +32 -0
- package/board-dist/node_modules/next/dist/experimental/testmode/server.js +62 -0
- package/board-dist/node_modules/next/dist/export/helpers/create-incremental-cache.js +61 -0
- package/board-dist/node_modules/next/dist/lib/batcher.js +65 -0
- package/board-dist/node_modules/next/dist/lib/build-custom-route.js +46 -0
- package/board-dist/node_modules/next/dist/lib/bundler.js +97 -0
- package/board-dist/node_modules/next/dist/lib/client-and-server-references.js +54 -0
- package/board-dist/node_modules/next/dist/lib/coalesced-function.js +39 -0
- package/board-dist/node_modules/next/dist/lib/compile-error.js +14 -0
- package/board-dist/node_modules/next/dist/lib/constants.js +420 -0
- package/board-dist/node_modules/next/dist/lib/create-client-router-filter.js +67 -0
- package/board-dist/node_modules/next/dist/lib/default-transpiled-packages.json +1 -0
- package/board-dist/node_modules/next/dist/lib/detached-promise.js +32 -0
- package/board-dist/node_modules/next/dist/lib/detect-typo.js +51 -0
- package/board-dist/node_modules/next/dist/lib/download-swc.js +183 -0
- package/board-dist/node_modules/next/dist/lib/error-telemetry-utils.js +42 -0
- package/board-dist/node_modules/next/dist/lib/fallback.js +100 -0
- package/board-dist/node_modules/next/dist/lib/fatal-error.js +14 -0
- package/board-dist/node_modules/next/dist/lib/file-exists.js +53 -0
- package/board-dist/node_modules/next/dist/lib/find-config.js +102 -0
- package/board-dist/node_modules/next/dist/lib/find-pages-dir.js +65 -0
- package/board-dist/node_modules/next/dist/lib/find-root.js +126 -0
- package/board-dist/node_modules/next/dist/lib/format-cli-help-output.js +84 -0
- package/board-dist/node_modules/next/dist/lib/format-dynamic-import-path.js +24 -0
- package/board-dist/node_modules/next/dist/lib/format-server-error.js +75 -0
- package/board-dist/node_modules/next/dist/lib/framework/boundary-components.js +62 -0
- package/board-dist/node_modules/next/dist/lib/framework/boundary-constants.js +36 -0
- package/board-dist/node_modules/next/dist/lib/fs/rename.js +87 -0
- package/board-dist/node_modules/next/dist/lib/fs/write-atomic.js +28 -0
- package/board-dist/node_modules/next/dist/lib/generate-interception-routes-rewrites.js +52 -0
- package/board-dist/node_modules/next/dist/lib/get-files-in-dir.js +33 -0
- package/board-dist/node_modules/next/dist/lib/get-network-host.js +44 -0
- package/board-dist/node_modules/next/dist/lib/get-package-version.js +118 -0
- package/board-dist/node_modules/next/dist/lib/get-project-dir.js +51 -0
- package/board-dist/node_modules/next/dist/lib/has-necessary-dependencies.js +49 -0
- package/board-dist/node_modules/next/dist/lib/helpers/get-cache-directory.js +66 -0
- package/board-dist/node_modules/next/dist/lib/helpers/get-npx-command.js +29 -0
- package/board-dist/node_modules/next/dist/lib/helpers/get-online.js +50 -0
- package/board-dist/node_modules/next/dist/lib/helpers/get-pkg-manager.js +63 -0
- package/board-dist/node_modules/next/dist/lib/helpers/get-registry.js +45 -0
- package/board-dist/node_modules/next/dist/lib/helpers/get-reserved-port.js +116 -0
- package/board-dist/node_modules/next/dist/lib/helpers/install.js +83 -0
- package/board-dist/node_modules/next/dist/lib/import-next-warning.js +50 -0
- package/board-dist/node_modules/next/dist/lib/inline-static-env.js +112 -0
- package/board-dist/node_modules/next/dist/lib/install-dependencies.js +40 -0
- package/board-dist/node_modules/next/dist/lib/interop-default.js +16 -0
- package/board-dist/node_modules/next/dist/lib/is-api-route.js +15 -0
- package/board-dist/node_modules/next/dist/lib/is-app-page-route.js +15 -0
- package/board-dist/node_modules/next/dist/lib/is-app-route-route.js +15 -0
- package/board-dist/node_modules/next/dist/lib/is-edge-runtime.js +16 -0
- package/board-dist/node_modules/next/dist/lib/is-error.js +78 -0
- package/board-dist/node_modules/next/dist/lib/is-interception-route-rewrite.js +18 -0
- package/board-dist/node_modules/next/dist/lib/is-internal-component.js +36 -0
- package/board-dist/node_modules/next/dist/lib/is-serializable-props.js +106 -0
- package/board-dist/node_modules/next/dist/lib/known-edge-safe-packages.json +1 -0
- package/board-dist/node_modules/next/dist/lib/load-custom-routes.js +594 -0
- package/board-dist/node_modules/next/dist/lib/memory/gc-observer.js +53 -0
- package/board-dist/node_modules/next/dist/lib/memory/shutdown.js +29 -0
- package/board-dist/node_modules/next/dist/lib/memory/startup.js +47 -0
- package/board-dist/node_modules/next/dist/lib/memory/trace.js +109 -0
- package/board-dist/node_modules/next/dist/lib/metadata/constants.js +40 -0
- package/board-dist/node_modules/next/dist/lib/metadata/default-metadata.js +82 -0
- package/board-dist/node_modules/next/dist/lib/metadata/generate/icon-mark.js +22 -0
- package/board-dist/node_modules/next/dist/lib/metadata/generate/utils.js +52 -0
- package/board-dist/node_modules/next/dist/lib/metadata/get-metadata-route.js +123 -0
- package/board-dist/node_modules/next/dist/lib/metadata/is-metadata-route.js +221 -0
- package/board-dist/node_modules/next/dist/lib/metadata/metadata-context.js +18 -0
- package/board-dist/node_modules/next/dist/lib/metadata/metadata.js +1686 -0
- package/board-dist/node_modules/next/dist/lib/metadata/resolve-metadata.js +884 -0
- package/board-dist/node_modules/next/dist/lib/metadata/resolvers/resolve-basics.js +232 -0
- package/board-dist/node_modules/next/dist/lib/metadata/resolvers/resolve-icons.js +56 -0
- package/board-dist/node_modules/next/dist/lib/metadata/resolvers/resolve-opengraph.js +199 -0
- package/board-dist/node_modules/next/dist/lib/metadata/resolvers/resolve-title.js +40 -0
- package/board-dist/node_modules/next/dist/lib/metadata/resolvers/resolve-url.js +135 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/alternative-urls-types.js +7 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/extra-types.js +9 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/icons.js +6 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/manifest-types.js +6 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/metadata-interface.js +18 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/metadata-types.js +10 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/opengraph-types.js +6 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/resolvers.js +6 -0
- package/board-dist/node_modules/next/dist/lib/metadata/types/twitter-types.js +7 -0
- package/board-dist/node_modules/next/dist/lib/mime-type.js +20 -0
- package/board-dist/node_modules/next/dist/lib/mkcert.js +204 -0
- package/board-dist/node_modules/next/dist/lib/multi-file-writer.js +75 -0
- package/board-dist/node_modules/next/dist/lib/needs-experimental-react.js +16 -0
- package/board-dist/node_modules/next/dist/lib/non-nullable.js +15 -0
- package/board-dist/node_modules/next/dist/lib/normalize-path.js +21 -0
- package/board-dist/node_modules/next/dist/lib/oxford-comma-list.js +15 -0
- package/board-dist/node_modules/next/dist/lib/page-types.js +18 -0
- package/board-dist/node_modules/next/dist/lib/patch-incorrect-lockfile.js +185 -0
- package/board-dist/node_modules/next/dist/lib/pick.js +19 -0
- package/board-dist/node_modules/next/dist/lib/picocolors.js +177 -0
- package/board-dist/node_modules/next/dist/lib/pretty-bytes.js +74 -0
- package/board-dist/node_modules/next/dist/lib/realpath.js +20 -0
- package/board-dist/node_modules/next/dist/lib/recursive-copy.js +76 -0
- package/board-dist/node_modules/next/dist/lib/recursive-delete.js +137 -0
- package/board-dist/node_modules/next/dist/lib/recursive-readdir.js +124 -0
- package/board-dist/node_modules/next/dist/lib/redirect-status.js +46 -0
- package/board-dist/node_modules/next/dist/lib/require-instrumentation-client.js +26 -0
- package/board-dist/node_modules/next/dist/lib/resolve-build-paths.js +154 -0
- package/board-dist/node_modules/next/dist/lib/resolve-from.js +65 -0
- package/board-dist/node_modules/next/dist/lib/route-pattern-normalizer.js +107 -0
- package/board-dist/node_modules/next/dist/lib/scheduler.js +64 -0
- package/board-dist/node_modules/next/dist/lib/semver-noop.js +18 -0
- package/board-dist/node_modules/next/dist/lib/server-external-packages.jsonc +103 -0
- package/board-dist/node_modules/next/dist/lib/setup-exception-listeners.js +11 -0
- package/board-dist/node_modules/next/dist/lib/static-env.js +92 -0
- package/board-dist/node_modules/next/dist/lib/try-to-parse-path.js +67 -0
- package/board-dist/node_modules/next/dist/lib/turbopack-warning.js +185 -0
- package/board-dist/node_modules/next/dist/lib/typescript/diagnosticFormatter.js +243 -0
- package/board-dist/node_modules/next/dist/lib/typescript/getTypeScriptConfiguration.js +153 -0
- package/board-dist/node_modules/next/dist/lib/typescript/getTypeScriptIntent.js +52 -0
- package/board-dist/node_modules/next/dist/lib/typescript/missingDependencyError.js +27 -0
- package/board-dist/node_modules/next/dist/lib/typescript/runTypeCheck.js +149 -0
- package/board-dist/node_modules/next/dist/lib/typescript/type-paths.js +51 -0
- package/board-dist/node_modules/next/dist/lib/typescript/writeAppTypeDeclarations.js +75 -0
- package/board-dist/node_modules/next/dist/lib/typescript/writeConfigurationDefaults.js +395 -0
- package/board-dist/node_modules/next/dist/lib/url.js +75 -0
- package/board-dist/node_modules/next/dist/lib/verify-partytown-setup.js +115 -0
- package/board-dist/node_modules/next/dist/lib/verify-root-layout.js +165 -0
- package/board-dist/node_modules/next/dist/lib/verify-typescript-setup.js +228 -0
- package/board-dist/node_modules/next/dist/lib/wait.js +19 -0
- package/board-dist/node_modules/next/dist/lib/with-promise-cache.js +24 -0
- package/board-dist/node_modules/next/dist/lib/worker.js +234 -0
- package/board-dist/node_modules/next/dist/server/ReactDOMServerPages.js +16 -0
- package/board-dist/node_modules/next/dist/server/accept-header.js +132 -0
- package/board-dist/node_modules/next/dist/server/after/after-context.js +140 -0
- package/board-dist/node_modules/next/dist/server/after/after.js +26 -0
- package/board-dist/node_modules/next/dist/server/after/awaiter.js +74 -0
- package/board-dist/node_modules/next/dist/server/after/builtin-request-context.js +38 -0
- package/board-dist/node_modules/next/dist/server/after/index.js +21 -0
- package/board-dist/node_modules/next/dist/server/after/run-with-after.js +35 -0
- package/board-dist/node_modules/next/dist/server/api-utils/get-cookie-parser.js +22 -0
- package/board-dist/node_modules/next/dist/server/api-utils/index.js +201 -0
- package/board-dist/node_modules/next/dist/server/api-utils/node/api-resolver.js +395 -0
- package/board-dist/node_modules/next/dist/server/api-utils/node/parse-body.js +79 -0
- package/board-dist/node_modules/next/dist/server/api-utils/node/try-get-preview-data.js +86 -0
- package/board-dist/node_modules/next/dist/server/api-utils/web.js +17 -0
- package/board-dist/node_modules/next/dist/server/app-render/action-async-storage-instance.js +14 -0
- package/board-dist/node_modules/next/dist/server/app-render/action-async-storage.external.js +13 -0
- package/board-dist/node_modules/next/dist/server/app-render/action-handler.js +1027 -0
- package/board-dist/node_modules/next/dist/server/app-render/after-task-async-storage-instance.js +14 -0
- package/board-dist/node_modules/next/dist/server/app-render/after-task-async-storage.external.js +13 -0
- package/board-dist/node_modules/next/dist/server/app-render/app-render-prerender-utils.js +167 -0
- package/board-dist/node_modules/next/dist/server/app-render/app-render-render-utils.js +76 -0
- package/board-dist/node_modules/next/dist/server/app-render/app-render-scheduling.js +188 -0
- package/board-dist/node_modules/next/dist/server/app-render/app-render.js +4522 -0
- package/board-dist/node_modules/next/dist/server/app-render/async-local-storage.js +76 -0
- package/board-dist/node_modules/next/dist/server/app-render/cache-signal.js +181 -0
- package/board-dist/node_modules/next/dist/server/app-render/collect-segment-data.js +616 -0
- package/board-dist/node_modules/next/dist/server/app-render/console-async-storage-instance.js +14 -0
- package/board-dist/node_modules/next/dist/server/app-render/console-async-storage.external.js +13 -0
- package/board-dist/node_modules/next/dist/server/app-render/create-component-styles-and-scripts.js +33 -0
- package/board-dist/node_modules/next/dist/server/app-render/create-component-tree.js +870 -0
- package/board-dist/node_modules/next/dist/server/app-render/create-error-handler.js +189 -0
- package/board-dist/node_modules/next/dist/server/app-render/create-flight-router-state-from-loader-tree.js +102 -0
- package/board-dist/node_modules/next/dist/server/app-render/csrf-protection.js +86 -0
- package/board-dist/node_modules/next/dist/server/app-render/debug-channel-server.js +30 -0
- package/board-dist/node_modules/next/dist/server/app-render/debug-channel-server.web.js +71 -0
- package/board-dist/node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js +14 -0
- package/board-dist/node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js +13 -0
- package/board-dist/node_modules/next/dist/server/app-render/dynamic-rendering.js +1144 -0
- package/board-dist/node_modules/next/dist/server/app-render/encryption-utils-server.js +114 -0
- package/board-dist/node_modules/next/dist/server/app-render/encryption-utils.js +93 -0
- package/board-dist/node_modules/next/dist/server/app-render/encryption.js +259 -0
- package/board-dist/node_modules/next/dist/server/app-render/entry-base.js +256 -0
- package/board-dist/node_modules/next/dist/server/app-render/flight-render-result.js +28 -0
- package/board-dist/node_modules/next/dist/server/app-render/get-asset-query-string.js +29 -0
- package/board-dist/node_modules/next/dist/server/app-render/get-css-inlined-link-tags.js +49 -0
- package/board-dist/node_modules/next/dist/server/app-render/get-layer-assets.js +65 -0
- package/board-dist/node_modules/next/dist/server/app-render/get-preloadable-fonts.js +39 -0
- package/board-dist/node_modules/next/dist/server/app-render/get-script-nonce-from-header.js +32 -0
- package/board-dist/node_modules/next/dist/server/app-render/get-short-dynamic-param-type.js +25 -0
- package/board-dist/node_modules/next/dist/server/app-render/has-loading-component-in-tree.js +19 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/boundary-constants.js +13 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/boundary-impl.js +103 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.js +18 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/instant-config.js +181 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/instant-samples-client.js +128 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/instant-samples.js +432 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.js +33 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/instant-validation.js +713 -0
- package/board-dist/node_modules/next/dist/server/app-render/instant-validation/stream-utils.js +96 -0
- package/board-dist/node_modules/next/dist/server/app-render/interop-default.js +17 -0
- package/board-dist/node_modules/next/dist/server/app-render/make-get-server-inserted-html.js +92 -0
- package/board-dist/node_modules/next/dist/server/app-render/manifests-singleton.js +264 -0
- package/board-dist/node_modules/next/dist/server/app-render/metadata-insertion/create-server-inserted-metadata.js +29 -0
- package/board-dist/node_modules/next/dist/server/app-render/module-loading/track-dynamic-import.js +57 -0
- package/board-dist/node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js +32 -0
- package/board-dist/node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js +66 -0
- package/board-dist/node_modules/next/dist/server/app-render/parse-and-validate-flight-router-state.js +49 -0
- package/board-dist/node_modules/next/dist/server/app-render/postponed-state.js +157 -0
- package/board-dist/node_modules/next/dist/server/app-render/prospective-render-utils.js +74 -0
- package/board-dist/node_modules/next/dist/server/app-render/react-large-shell-error.js +17 -0
- package/board-dist/node_modules/next/dist/server/app-render/react-server.node.js +39 -0
- package/board-dist/node_modules/next/dist/server/app-render/render-css-resource.js +52 -0
- package/board-dist/node_modules/next/dist/server/app-render/required-scripts.js +76 -0
- package/board-dist/node_modules/next/dist/server/app-render/rsc/postpone.js +18 -0
- package/board-dist/node_modules/next/dist/server/app-render/rsc/preloads.js +74 -0
- package/board-dist/node_modules/next/dist/server/app-render/rsc/taint.js +79 -0
- package/board-dist/node_modules/next/dist/server/app-render/segment-explorer-path.js +128 -0
- package/board-dist/node_modules/next/dist/server/app-render/server-inserted-html.js +77 -0
- package/board-dist/node_modules/next/dist/server/app-render/staged-rendering.js +343 -0
- package/board-dist/node_modules/next/dist/server/app-render/stale-time.js +111 -0
- package/board-dist/node_modules/next/dist/server/app-render/stream-ops.js +106 -0
- package/board-dist/node_modules/next/dist/server/app-render/stream-ops.web.js +163 -0
- package/board-dist/node_modules/next/dist/server/app-render/strip-flight-headers.js +18 -0
- package/board-dist/node_modules/next/dist/server/app-render/types.js +65 -0
- package/board-dist/node_modules/next/dist/server/app-render/use-flight-response.js +214 -0
- package/board-dist/node_modules/next/dist/server/app-render/vary-params.js +336 -0
- package/board-dist/node_modules/next/dist/server/app-render/walk-tree-with-flight-router-state.js +232 -0
- package/board-dist/node_modules/next/dist/server/app-render/work-async-storage-instance.js +14 -0
- package/board-dist/node_modules/next/dist/server/app-render/work-async-storage.external.js +13 -0
- package/board-dist/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js +14 -0
- package/board-dist/node_modules/next/dist/server/app-render/work-unit-async-storage.external.js +280 -0
- package/board-dist/node_modules/next/dist/server/async-storage/draft-mode-provider.js +62 -0
- package/board-dist/node_modules/next/dist/server/async-storage/request-store.js +144 -0
- package/board-dist/node_modules/next/dist/server/async-storage/with-store.js +6 -0
- package/board-dist/node_modules/next/dist/server/async-storage/work-store.js +92 -0
- package/board-dist/node_modules/next/dist/server/base-http/helpers.js +36 -0
- package/board-dist/node_modules/next/dist/server/base-http/index.js +54 -0
- package/board-dist/node_modules/next/dist/server/base-http/node.js +147 -0
- package/board-dist/node_modules/next/dist/server/base-http/web.js +124 -0
- package/board-dist/node_modules/next/dist/server/base-server.js +1882 -0
- package/board-dist/node_modules/next/dist/server/body-streams.js +114 -0
- package/board-dist/node_modules/next/dist/server/cache-dir.js +26 -0
- package/board-dist/node_modules/next/dist/server/capsize-font-metrics.json +181516 -0
- package/board-dist/node_modules/next/dist/server/ci-info.js +41 -0
- package/board-dist/node_modules/next/dist/server/client-component-renderer-logger.js +70 -0
- package/board-dist/node_modules/next/dist/server/config-schema.js +727 -0
- package/board-dist/node_modules/next/dist/server/config-shared.js +369 -0
- package/board-dist/node_modules/next/dist/server/config-utils.js +185 -0
- package/board-dist/node_modules/next/dist/server/config.js +1545 -0
- package/board-dist/node_modules/next/dist/server/create-deduped-by-callsite-server-error-logger.js +96 -0
- package/board-dist/node_modules/next/dist/server/crypto-utils.js +70 -0
- package/board-dist/node_modules/next/dist/server/dev/browser-logs/file-logger.js +186 -0
- package/board-dist/node_modules/next/dist/server/dev/browser-logs/receive-logs.js +558 -0
- package/board-dist/node_modules/next/dist/server/dev/browser-logs/source-map.js +222 -0
- package/board-dist/node_modules/next/dist/server/dev/debug-channel.js +87 -0
- package/board-dist/node_modules/next/dist/server/dev/dev-indicator-server-state.js +15 -0
- package/board-dist/node_modules/next/dist/server/dev/get-source-map-from-file.js +100 -0
- package/board-dist/node_modules/next/dist/server/dev/hot-middleware.js +274 -0
- package/board-dist/node_modules/next/dist/server/dev/hot-reloader-rspack.js +171 -0
- package/board-dist/node_modules/next/dist/server/dev/hot-reloader-shared-utils.js +56 -0
- package/board-dist/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +1480 -0
- package/board-dist/node_modules/next/dist/server/dev/hot-reloader-types.js +58 -0
- package/board-dist/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1386 -0
- package/board-dist/node_modules/next/dist/server/dev/log-requests.js +149 -0
- package/board-dist/node_modules/next/dist/server/dev/messages.js +74 -0
- package/board-dist/node_modules/next/dist/server/dev/middleware-turbopack.js +403 -0
- package/board-dist/node_modules/next/dist/server/dev/middleware-webpack.js +483 -0
- package/board-dist/node_modules/next/dist/server/dev/node-stack-frames.js +72 -0
- package/board-dist/node_modules/next/dist/server/dev/on-demand-entry-handler.js +773 -0
- package/board-dist/node_modules/next/dist/server/dev/parse-version-info.js +108 -0
- package/board-dist/node_modules/next/dist/server/dev/require-cache.js +79 -0
- package/board-dist/node_modules/next/dist/server/dev/serialized-errors.js +67 -0
- package/board-dist/node_modules/next/dist/server/dev/server-action-logger.js +37 -0
- package/board-dist/node_modules/next/dist/server/dev/static-paths-worker.js +105 -0
- package/board-dist/node_modules/next/dist/server/dev/turbopack-utils.js +687 -0
- package/board-dist/node_modules/next/dist/server/dynamic-rendering-utils.js +108 -0
- package/board-dist/node_modules/next/dist/server/font-utils.js +43 -0
- package/board-dist/node_modules/next/dist/server/get-app-route-from-entrypoint.js +30 -0
- package/board-dist/node_modules/next/dist/server/get-page-files.js +23 -0
- package/board-dist/node_modules/next/dist/server/get-route-from-entrypoint.js +35 -0
- package/board-dist/node_modules/next/dist/server/image-optimizer.js +1240 -0
- package/board-dist/node_modules/next/dist/server/instrumentation/types.js +6 -0
- package/board-dist/node_modules/next/dist/server/instrumentation/utils.js +21 -0
- package/board-dist/node_modules/next/dist/server/internal-utils.js +39 -0
- package/board-dist/node_modules/next/dist/server/is-private-ip.js +36 -0
- package/board-dist/node_modules/next/dist/server/lib/app-dir-module.js +59 -0
- package/board-dist/node_modules/next/dist/server/lib/app-info-log.js +132 -0
- package/board-dist/node_modules/next/dist/server/lib/async-callback-set.js +29 -0
- package/board-dist/node_modules/next/dist/server/lib/cache-control.js +22 -0
- package/board-dist/node_modules/next/dist/server/lib/cache-handlers/default.external.js +18 -0
- package/board-dist/node_modules/next/dist/server/lib/cache-handlers/default.js +160 -0
- package/board-dist/node_modules/next/dist/server/lib/cache-handlers/types.js +8 -0
- package/board-dist/node_modules/next/dist/server/lib/chrome-devtools-workspace.js +116 -0
- package/board-dist/node_modules/next/dist/server/lib/clone-response.js +77 -0
- package/board-dist/node_modules/next/dist/server/lib/cpu-profile.js +59 -0
- package/board-dist/node_modules/next/dist/server/lib/decode-query-path-parameter.js +26 -0
- package/board-dist/node_modules/next/dist/server/lib/dedupe-fetch.js +163 -0
- package/board-dist/node_modules/next/dist/server/lib/dev-bundler-service.js +95 -0
- package/board-dist/node_modules/next/dist/server/lib/disk-lru-cache.external.js +57 -0
- package/board-dist/node_modules/next/dist/server/lib/encode-cache-tag.js +45 -0
- package/board-dist/node_modules/next/dist/server/lib/etag.js +56 -0
- package/board-dist/node_modules/next/dist/server/lib/experimental/create-env-definitions.js +48 -0
- package/board-dist/node_modules/next/dist/server/lib/experimental/ppr.js +47 -0
- package/board-dist/node_modules/next/dist/server/lib/find-page-file.js +147 -0
- package/board-dist/node_modules/next/dist/server/lib/fix-mojibake.js +25 -0
- package/board-dist/node_modules/next/dist/server/lib/format-hostname.js +16 -0
- package/board-dist/node_modules/next/dist/server/lib/i18n-provider.js +129 -0
- package/board-dist/node_modules/next/dist/server/lib/implicit-tags.js +80 -0
- package/board-dist/node_modules/next/dist/server/lib/incremental-cache/file-system-cache.js +335 -0
- package/board-dist/node_modules/next/dist/server/lib/incremental-cache/index.js +501 -0
- package/board-dist/node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js +57 -0
- package/board-dist/node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js +73 -0
- package/board-dist/node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js +55 -0
- package/board-dist/node_modules/next/dist/server/lib/install-code-frame.js +22 -0
- package/board-dist/node_modules/next/dist/server/lib/is-ipv6.js +41 -0
- package/board-dist/node_modules/next/dist/server/lib/is-rsc-request.js +18 -0
- package/board-dist/node_modules/next/dist/server/lib/lazy-result.js +46 -0
- package/board-dist/node_modules/next/dist/server/lib/lru-cache.js +191 -0
- package/board-dist/node_modules/next/dist/server/lib/match-next-data-pathname.js +18 -0
- package/board-dist/node_modules/next/dist/server/lib/mock-request.js +441 -0
- package/board-dist/node_modules/next/dist/server/lib/module-loader/module-loader.js +8 -0
- package/board-dist/node_modules/next/dist/server/lib/module-loader/node-module-loader.js +25 -0
- package/board-dist/node_modules/next/dist/server/lib/module-loader/route-module-loader.js +26 -0
- package/board-dist/node_modules/next/dist/server/lib/node-fs-methods.js +28 -0
- package/board-dist/node_modules/next/dist/server/lib/parse-stack.js +46 -0
- package/board-dist/node_modules/next/dist/server/lib/patch-fetch.js +982 -0
- package/board-dist/node_modules/next/dist/server/lib/patch-set-header.js +45 -0
- package/board-dist/node_modules/next/dist/server/lib/postponed-request-body.js +64 -0
- package/board-dist/node_modules/next/dist/server/lib/render-server.js +155 -0
- package/board-dist/node_modules/next/dist/server/lib/router-server.js +699 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/block-cross-site-dev.js +110 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/build-data-route.js +48 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.js +50 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/cache-life-type-utils.js +211 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/decode-path-params.js +42 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/filesystem.js +591 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js +89 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js +96 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/is-postpone.js +16 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/proxy-request.js +118 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/resolve-routes.js +643 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/route-types-utils.js +286 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/router-server-context.js +26 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/typegen.js +858 -0
- package/board-dist/node_modules/next/dist/server/lib/router-utils/types.js +6 -0
- package/board-dist/node_modules/next/dist/server/lib/server-action-request-meta.js +53 -0
- package/board-dist/node_modules/next/dist/server/lib/server-ipc/utils.js +83 -0
- package/board-dist/node_modules/next/dist/server/lib/source-maps.js +196 -0
- package/board-dist/node_modules/next/dist/server/lib/start-server.js +494 -0
- package/board-dist/node_modules/next/dist/server/lib/streaming-metadata.js +38 -0
- package/board-dist/node_modules/next/dist/server/lib/to-route.js +37 -0
- package/board-dist/node_modules/next/dist/server/lib/trace/constants.js +203 -0
- package/board-dist/node_modules/next/dist/server/lib/trace/tracer.js +280 -0
- package/board-dist/node_modules/next/dist/server/lib/trace/utils.js +16 -0
- package/board-dist/node_modules/next/dist/server/lib/types.js +6 -0
- package/board-dist/node_modules/next/dist/server/lib/utils.js +278 -0
- package/board-dist/node_modules/next/dist/server/lib/worker-utils.js +36 -0
- package/board-dist/node_modules/next/dist/server/load-components.js +179 -0
- package/board-dist/node_modules/next/dist/server/load-default-error-components.js +41 -0
- package/board-dist/node_modules/next/dist/server/load-manifest.external.js +117 -0
- package/board-dist/node_modules/next/dist/server/match-bundle.js +25 -0
- package/board-dist/node_modules/next/dist/server/mcp/get-mcp-middleware.js +49 -0
- package/board-dist/node_modules/next/dist/server/mcp/get-or-create-mcp-server.js +41 -0
- package/board-dist/node_modules/next/dist/server/mcp/mcp-telemetry-tracker.js +82 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/get-errors.js +114 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/get-logs.js +67 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/get-page-metadata.js +188 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/get-project-metadata.js +59 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/get-routes.js +136 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/get-server-action-by-id.js +121 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/next-instance-error-state.js +31 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/utils/browser-communication.js +90 -0
- package/board-dist/node_modules/next/dist/server/mcp/tools/utils/format-errors.js +137 -0
- package/board-dist/node_modules/next/dist/server/next-server.js +1429 -0
- package/board-dist/node_modules/next/dist/server/next-typescript.js +13 -0
- package/board-dist/node_modules/next/dist/server/next.js +455 -0
- package/board-dist/node_modules/next/dist/server/node-environment-baseline.js +25 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/console-dim.external.js +301 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/console-exit.js +49 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/console-file.js +56 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/date.js +52 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/error-inspect.js +8 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.js +577 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/global-behaviors.js +33 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/io-utils.js +195 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/node-crypto.js +103 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/process-error-handlers.js +91 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/random.js +28 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.js +508 -0
- package/board-dist/node_modules/next/dist/server/node-environment-extensions/web-crypto.js +45 -0
- package/board-dist/node_modules/next/dist/server/node-environment.js +19 -0
- package/board-dist/node_modules/next/dist/server/node-polyfill-crypto.js +21 -0
- package/board-dist/node_modules/next/dist/server/normalizers/absolute-filename-normalizer.js +33 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/app/app-bundle-path-normalizer.js +54 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/app/app-filename-normalizer.js +22 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/app/app-page-normalizer.js +40 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/app/app-pathname-normalizer.js +55 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/app/index.js +42 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/pages/index.js +44 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/pages/pages-bundle-path-normalizer.js +55 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/pages/pages-filename-normalizer.js +22 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/pages/pages-page-normalizer.js +19 -0
- package/board-dist/node_modules/next/dist/server/normalizers/built/pages/pages-pathname-normalizer.js +19 -0
- package/board-dist/node_modules/next/dist/server/normalizers/locale-route-normalizer.js +26 -0
- package/board-dist/node_modules/next/dist/server/normalizers/normalizer.js +6 -0
- package/board-dist/node_modules/next/dist/server/normalizers/normalizers.js +23 -0
- package/board-dist/node_modules/next/dist/server/normalizers/prefixing-normalizer.js +26 -0
- package/board-dist/node_modules/next/dist/server/normalizers/request/base-path.js +25 -0
- package/board-dist/node_modules/next/dist/server/normalizers/request/next-data.js +38 -0
- package/board-dist/node_modules/next/dist/server/normalizers/request/pathname-normalizer.js +6 -0
- package/board-dist/node_modules/next/dist/server/normalizers/request/prefix.js +39 -0
- package/board-dist/node_modules/next/dist/server/normalizers/request/rsc.js +19 -0
- package/board-dist/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.js +33 -0
- package/board-dist/node_modules/next/dist/server/normalizers/request/suffix.js +27 -0
- package/board-dist/node_modules/next/dist/server/normalizers/underscore-normalizer.js +17 -0
- package/board-dist/node_modules/next/dist/server/normalizers/wrap-normalizer-fn.js +17 -0
- package/board-dist/node_modules/next/dist/server/og/image-response.js +53 -0
- package/board-dist/node_modules/next/dist/server/patch-error-inspect.js +453 -0
- package/board-dist/node_modules/next/dist/server/pipe-readable.js +140 -0
- package/board-dist/node_modules/next/dist/server/post-process.js +39 -0
- package/board-dist/node_modules/next/dist/server/render-result.js +204 -0
- package/board-dist/node_modules/next/dist/server/render.js +1148 -0
- package/board-dist/node_modules/next/dist/server/request/connection.js +133 -0
- package/board-dist/node_modules/next/dist/server/request/cookies.js +235 -0
- package/board-dist/node_modules/next/dist/server/request/draft-mode.js +230 -0
- package/board-dist/node_modules/next/dist/server/request/fallback-params.js +95 -0
- package/board-dist/node_modules/next/dist/server/request/headers.js +229 -0
- package/board-dist/node_modules/next/dist/server/request/params.js +527 -0
- package/board-dist/node_modules/next/dist/server/request/pathname.js +119 -0
- package/board-dist/node_modules/next/dist/server/request/root-params.js +194 -0
- package/board-dist/node_modules/next/dist/server/request/search-params.js +526 -0
- package/board-dist/node_modules/next/dist/server/request/utils.js +51 -0
- package/board-dist/node_modules/next/dist/server/request-meta.js +55 -0
- package/board-dist/node_modules/next/dist/server/require-hook.js +82 -0
- package/board-dist/node_modules/next/dist/server/require.js +109 -0
- package/board-dist/node_modules/next/dist/server/response-cache/index.js +311 -0
- package/board-dist/node_modules/next/dist/server/response-cache/types.js +41 -0
- package/board-dist/node_modules/next/dist/server/response-cache/utils.js +104 -0
- package/board-dist/node_modules/next/dist/server/response-cache/web.js +101 -0
- package/board-dist/node_modules/next/dist/server/resume-data-cache/cache-store.js +96 -0
- package/board-dist/node_modules/next/dist/server/resume-data-cache/resume-data-cache.js +124 -0
- package/board-dist/node_modules/next/dist/server/revalidation-utils.js +157 -0
- package/board-dist/node_modules/next/dist/server/route-definitions/app-page-route-definition.js +16 -0
- package/board-dist/node_modules/next/dist/server/route-definitions/app-route-route-definition.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-definitions/locale-route-definition.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-definitions/pages-api-route-definition.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-definitions/pages-route-definition.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-definitions/route-definition.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-kind.js +32 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-managers/default-route-matcher-manager.js +239 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-managers/dev-route-matcher-manager.js +120 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/app-page-route-matcher-provider.js +55 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/app-route-route-matcher-provider.js +43 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/dev/dev-app-page-route-matcher-provider.js +91 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/dev/dev-app-route-route-matcher-provider.js +112 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/dev/dev-pages-api-route-matcher-provider.js +77 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/dev/dev-pages-route-matcher-provider.js +77 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/dev/file-cache-route-matcher-provider.js +28 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/batched-file-reader.js +106 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/default-file-reader.js +42 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/dev/helpers/file-reader/file-reader.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/helpers/cached-route-matcher-provider.js +30 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/manifest-loader.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/node-manifest-loader.js +34 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/helpers/manifest-loaders/server-manifest-loader.js +20 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/manifest-route-matcher-provider.js +21 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/pages-api-route-matcher-provider.js +55 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/pages-route-matcher-provider.js +64 -0
- package/board-dist/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-matchers/app-page-route-matcher.js +18 -0
- package/board-dist/node_modules/next/dist/server/route-matchers/app-route-route-matcher.js +15 -0
- package/board-dist/node_modules/next/dist/server/route-matchers/locale-route-matcher.js +68 -0
- package/board-dist/node_modules/next/dist/server/route-matchers/pages-api-route-matcher.js +30 -0
- package/board-dist/node_modules/next/dist/server/route-matchers/pages-route-matcher.js +30 -0
- package/board-dist/node_modules/next/dist/server/route-matchers/route-matcher.js +54 -0
- package/board-dist/node_modules/next/dist/server/route-matches/app-page-route-match.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-matches/app-route-route-match.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-matches/locale-route-match.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-matches/pages-api-route-match.js +16 -0
- package/board-dist/node_modules/next/dist/server/route-matches/pages-route-match.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-matches/route-match.js +6 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/helpers/prerender-manifest-matcher.js +51 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/module.compiled.js +36 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/module.js +162 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/module.render.js +24 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/normalize-request-url.js +25 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/app-router-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.js +87 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/head-manager-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/hooks-client-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/image-config-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/router-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/server-inserted-html.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.js +140 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-compiler-runtime.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-dom.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-runtime.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-static.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-static.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.js +125 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-compiler-runtime.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-dom-server.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-dom.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/react.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-route/helpers/auto-implement-methods.js +85 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-route/helpers/clean-url.js +24 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-route/helpers/get-pathname-from-absolute-path.js +29 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-route/helpers/is-static-gen-enabled.js +15 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-route/helpers/parsed-url-query-to-params.js +20 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-route/module.compiled.js +36 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-route/module.js +915 -0
- package/board-dist/node_modules/next/dist/server/route-modules/app-route/shared-modules.js +56 -0
- package/board-dist/node_modules/next/dist/server/route-modules/checks.js +45 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/builtin/_error.js +100 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/module.compiled.js +20 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/module.js +92 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/module.render.js +24 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/pages-handler.js +545 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/app-router-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.js +102 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/head-manager-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/hooks-client-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/html-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/image-config-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/loadable-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/loadable.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/router-context.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages/vendored/contexts/server-inserted-html.js +4 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages-api/module.compiled.js +20 -0
- package/board-dist/node_modules/next/dist/server/route-modules/pages-api/module.js +58 -0
- package/board-dist/node_modules/next/dist/server/route-modules/route-module.js +660 -0
- package/board-dist/node_modules/next/dist/server/runtime-reacts.external.js +46 -0
- package/board-dist/node_modules/next/dist/server/send-payload.js +88 -0
- package/board-dist/node_modules/next/dist/server/send-response.js +70 -0
- package/board-dist/node_modules/next/dist/server/serve-static.js +66 -0
- package/board-dist/node_modules/next/dist/server/server-route-utils.js +30 -0
- package/board-dist/node_modules/next/dist/server/server-utils.js +340 -0
- package/board-dist/node_modules/next/dist/server/setup-http-agent-env.js +31 -0
- package/board-dist/node_modules/next/dist/server/stream-utils/encoded-tags.js +122 -0
- package/board-dist/node_modules/next/dist/server/stream-utils/node-web-streams-helper.js +918 -0
- package/board-dist/node_modules/next/dist/server/stream-utils/uint8array-helpers.js +74 -0
- package/board-dist/node_modules/next/dist/server/typescript/constant.js +98 -0
- package/board-dist/node_modules/next/dist/server/typescript/index.js +199 -0
- package/board-dist/node_modules/next/dist/server/typescript/rules/client-boundary.js +97 -0
- package/board-dist/node_modules/next/dist/server/typescript/rules/config.js +512 -0
- package/board-dist/node_modules/next/dist/server/typescript/rules/entry.js +149 -0
- package/board-dist/node_modules/next/dist/server/typescript/rules/error.js +38 -0
- package/board-dist/node_modules/next/dist/server/typescript/rules/metadata.js +234 -0
- package/board-dist/node_modules/next/dist/server/typescript/rules/server-boundary.js +115 -0
- package/board-dist/node_modules/next/dist/server/typescript/rules/server.js +79 -0
- package/board-dist/node_modules/next/dist/server/typescript/utils.js +212 -0
- package/board-dist/node_modules/next/dist/server/use-cache/cache-life.js +163 -0
- package/board-dist/node_modules/next/dist/server/use-cache/cache-tag.js +52 -0
- package/board-dist/node_modules/next/dist/server/use-cache/constants.js +28 -0
- package/board-dist/node_modules/next/dist/server/use-cache/handlers.js +121 -0
- package/board-dist/node_modules/next/dist/server/use-cache/use-cache-errors.js +36 -0
- package/board-dist/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1588 -0
- package/board-dist/node_modules/next/dist/server/utils.js +73 -0
- package/board-dist/node_modules/next/dist/server/web/adapter.js +395 -0
- package/board-dist/node_modules/next/dist/server/web/edge-route-module-wrapper.js +124 -0
- package/board-dist/node_modules/next/dist/server/web/error.js +54 -0
- package/board-dist/node_modules/next/dist/server/web/exports/index.js +56 -0
- package/board-dist/node_modules/next/dist/server/web/get-edge-preview-props.js +23 -0
- package/board-dist/node_modules/next/dist/server/web/globals.js +128 -0
- package/board-dist/node_modules/next/dist/server/web/http.js +39 -0
- package/board-dist/node_modules/next/dist/server/web/internal-edge-wait-until.js +64 -0
- package/board-dist/node_modules/next/dist/server/web/next-url.js +199 -0
- package/board-dist/node_modules/next/dist/server/web/sandbox/context.js +462 -0
- package/board-dist/node_modules/next/dist/server/web/sandbox/fetch-inline-assets.js +35 -0
- package/board-dist/node_modules/next/dist/server/web/sandbox/index.js +28 -0
- package/board-dist/node_modules/next/dist/server/web/sandbox/resource-managers.js +88 -0
- package/board-dist/node_modules/next/dist/server/web/sandbox/sandbox.js +137 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/adapters/headers.js +192 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/adapters/next-request.js +142 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/adapters/reflect.js +30 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.js +211 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/cookies.js +29 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/fetch-event.js +98 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/image-response.js +22 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/request.js +99 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/response.js +136 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/revalidate.js +215 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +293 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/unstable-no-store.js +51 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/url-pattern.js +14 -0
- package/board-dist/node_modules/next/dist/server/web/spec-extension/user-agent.js +46 -0
- package/board-dist/node_modules/next/dist/server/web/types.js +6 -0
- package/board-dist/node_modules/next/dist/server/web/utils.js +151 -0
- package/board-dist/node_modules/next/dist/server/web/web-on-close.js +87 -0
- package/board-dist/node_modules/next/dist/shared/lib/action-revalidation-kind.js +31 -0
- package/board-dist/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.js +50 -0
- package/board-dist/node_modules/next/dist/shared/lib/app-router-types.js +46 -0
- package/board-dist/node_modules/next/dist/shared/lib/constants.js +448 -0
- package/board-dist/node_modules/next/dist/shared/lib/deep-freeze.js +30 -0
- package/board-dist/node_modules/next/dist/shared/lib/deployment-id.js +63 -0
- package/board-dist/node_modules/next/dist/shared/lib/dset.js +34 -0
- package/board-dist/node_modules/next/dist/shared/lib/encode-uri-path.js +15 -0
- package/board-dist/node_modules/next/dist/shared/lib/entry-constants.js +36 -0
- package/board-dist/node_modules/next/dist/shared/lib/error-source.js +36 -0
- package/board-dist/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +39 -0
- package/board-dist/node_modules/next/dist/shared/lib/errors/code-frame.js +20 -0
- package/board-dist/node_modules/next/dist/shared/lib/errors/constants.js +19 -0
- package/board-dist/node_modules/next/dist/shared/lib/errors/empty-generate-static-params-error.js +24 -0
- package/board-dist/node_modules/next/dist/shared/lib/errors/hard-deprecated-config-error.js +20 -0
- package/board-dist/node_modules/next/dist/shared/lib/escape-regexp.js +22 -0
- package/board-dist/node_modules/next/dist/shared/lib/get-hostname.js +23 -0
- package/board-dist/node_modules/next/dist/shared/lib/hash.js +42 -0
- package/board-dist/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.js +18 -0
- package/board-dist/node_modules/next/dist/shared/lib/head.js +163 -0
- package/board-dist/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.js +60 -0
- package/board-dist/node_modules/next/dist/shared/lib/html-context.shared-runtime.js +40 -0
- package/board-dist/node_modules/next/dist/shared/lib/htmlescape.js +52 -0
- package/board-dist/node_modules/next/dist/shared/lib/i18n/detect-domain-locale.js +25 -0
- package/board-dist/node_modules/next/dist/shared/lib/i18n/get-locale-redirect.js +59 -0
- package/board-dist/node_modules/next/dist/shared/lib/i18n/normalize-locale-path.js +54 -0
- package/board-dist/node_modules/next/dist/shared/lib/image-blur-svg.js +22 -0
- package/board-dist/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.js +19 -0
- package/board-dist/node_modules/next/dist/shared/lib/image-config.js +77 -0
- package/board-dist/node_modules/next/dist/shared/lib/invariant-error.js +18 -0
- package/board-dist/node_modules/next/dist/shared/lib/is-plain-object.js +42 -0
- package/board-dist/node_modules/next/dist/shared/lib/is-thenable.js +20 -0
- package/board-dist/node_modules/next/dist/shared/lib/isomorphic/path.js +14 -0
- package/board-dist/node_modules/next/dist/shared/lib/lazy-dynamic/bailout-to-csr.js +37 -0
- package/board-dist/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.js +19 -0
- package/board-dist/node_modules/next/dist/shared/lib/loadable.shared-runtime.js +246 -0
- package/board-dist/node_modules/next/dist/shared/lib/match-local-pattern.js +46 -0
- package/board-dist/node_modules/next/dist/shared/lib/match-remote-pattern.js +63 -0
- package/board-dist/node_modules/next/dist/shared/lib/modern-browserslist-target.js +15 -0
- package/board-dist/node_modules/next/dist/shared/lib/no-fallback-error.external.js +18 -0
- package/board-dist/node_modules/next/dist/shared/lib/normalized-asset-prefix.js +28 -0
- package/board-dist/node_modules/next/dist/shared/lib/page-path/absolute-path-to-page.js +26 -0
- package/board-dist/node_modules/next/dist/shared/lib/page-path/denormalize-page-path.js +18 -0
- package/board-dist/node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js +18 -0
- package/board-dist/node_modules/next/dist/shared/lib/page-path/get-page-paths.js +40 -0
- package/board-dist/node_modules/next/dist/shared/lib/page-path/normalize-data-path.js +23 -0
- package/board-dist/node_modules/next/dist/shared/lib/page-path/normalize-page-path.js +26 -0
- package/board-dist/node_modules/next/dist/shared/lib/page-path/normalize-path-sep.js +19 -0
- package/board-dist/node_modules/next/dist/shared/lib/page-path/remove-page-path-tail.js +20 -0
- package/board-dist/node_modules/next/dist/shared/lib/promise-with-resolvers.js +26 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/adapters.js +136 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/routes/app.js +134 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/add-locale.js +28 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/add-path-prefix.js +20 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/add-path-suffix.js +20 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/app-paths.js +62 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/as-path-to-search-params.js +17 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/cache-busting-search-param.js +70 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/escape-path-delimiters.js +16 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/format-next-pathname-info.js +27 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/format-url.js +111 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/get-dynamic-param.js +174 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/get-next-pathname-info.js +52 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/get-route-from-asset-path.js +25 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/get-segment-param.js +90 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/html-bots.js +17 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/index.js +30 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/interception-prefix-from-param-type.js +33 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/interception-routes.js +108 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/is-bot.js +57 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/is-dynamic.js +26 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.js +31 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/parse-loader-tree.js +30 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/parse-path.js +33 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.js +43 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/parse-url.js +38 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/path-has-prefix.js +20 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/path-match.js +49 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/prepare-destination.js +292 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/querystring.js +79 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/relativize-url.js +40 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/remove-path-prefix.js +39 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/remove-trailing-slash.js +21 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/resolve-param-value.js +116 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/route-match-utils.js +113 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/route-matcher.js +45 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/route-regex.js +256 -0
- package/board-dist/node_modules/next/dist/shared/lib/router/utils/sorted-routes.js +244 -0
- package/board-dist/node_modules/next/dist/shared/lib/router-context.shared-runtime.js +18 -0
- package/board-dist/node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.js +99 -0
- package/board-dist/node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.js +32 -0
- package/board-dist/node_modules/next/dist/shared/lib/segment.js +102 -0
- package/board-dist/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.js +35 -0
- package/board-dist/node_modules/next/dist/shared/lib/server-reference-info.js +56 -0
- package/board-dist/node_modules/next/dist/shared/lib/side-effect.js +63 -0
- package/board-dist/node_modules/next/dist/shared/lib/size-limit.js +40 -0
- package/board-dist/node_modules/next/dist/shared/lib/turbopack/internal-error.js +53 -0
- package/board-dist/node_modules/next/dist/shared/lib/utils/reflect-utils.js +69 -0
- package/board-dist/node_modules/next/dist/shared/lib/utils/warn-once.js +22 -0
- package/board-dist/node_modules/next/dist/shared/lib/utils.js +207 -0
- package/board-dist/node_modules/next/dist/shared/lib/zod.js +101 -0
- package/board-dist/node_modules/next/dist/telemetry/anonymous-meta.js +89 -0
- package/board-dist/node_modules/next/dist/telemetry/detached-flush.js +56 -0
- package/board-dist/node_modules/next/dist/telemetry/events/build.js +174 -0
- package/board-dist/node_modules/next/dist/telemetry/events/index.js +41 -0
- package/board-dist/node_modules/next/dist/telemetry/events/plugins.js +51 -0
- package/board-dist/node_modules/next/dist/telemetry/events/swc-load-failure.js +55 -0
- package/board-dist/node_modules/next/dist/telemetry/events/version.js +66 -0
- package/board-dist/node_modules/next/dist/telemetry/flush-telemetry.js +19 -0
- package/board-dist/node_modules/next/dist/telemetry/post-telemetry-payload.js +48 -0
- package/board-dist/node_modules/next/dist/telemetry/project-id.js +48 -0
- package/board-dist/node_modules/next/dist/telemetry/storage.js +301 -0
- package/board-dist/node_modules/next/dist/trace/index.js +58 -0
- package/board-dist/node_modules/next/dist/trace/report/index.js +37 -0
- package/board-dist/node_modules/next/dist/trace/report/to-json-build.js +40 -0
- package/board-dist/node_modules/next/dist/trace/report/to-json.js +165 -0
- package/board-dist/node_modules/next/dist/trace/report/to-telemetry.js +36 -0
- package/board-dist/node_modules/next/dist/trace/shared.js +39 -0
- package/board-dist/node_modules/next/dist/trace/trace.js +211 -0
- package/board-dist/node_modules/next/package.json +136 -0
- package/board-dist/node_modules/react/cjs/react-compiler-runtime.production.js +16 -0
- package/board-dist/node_modules/react/cjs/react-jsx-dev-runtime.production.js +14 -0
- package/board-dist/node_modules/react/cjs/react-jsx-runtime.production.js +34 -0
- package/board-dist/node_modules/react/cjs/react.development.js +1284 -0
- package/board-dist/node_modules/react/cjs/react.production.js +542 -0
- package/board-dist/node_modules/react/compiler-runtime.js +14 -0
- package/board-dist/node_modules/react/index.js +7 -0
- package/board-dist/node_modules/react/jsx-dev-runtime.js +7 -0
- package/board-dist/node_modules/react/jsx-runtime.js +7 -0
- package/board-dist/node_modules/react/package.json +51 -0
- package/board-dist/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +6603 -0
- package/board-dist/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +6692 -0
- package/board-dist/node_modules/react-dom/cjs/react-dom-server.browser.production.js +7410 -0
- package/board-dist/node_modules/react-dom/cjs/react-dom-server.edge.production.js +7512 -0
- package/board-dist/node_modules/react-dom/cjs/react-dom-server.node.production.js +7707 -0
- package/board-dist/node_modules/react-dom/cjs/react-dom.production.js +210 -0
- package/board-dist/node_modules/react-dom/index.js +38 -0
- package/board-dist/node_modules/react-dom/package.json +117 -0
- package/board-dist/node_modules/react-dom/server.browser.js +16 -0
- package/board-dist/node_modules/react-dom/server.edge.js +17 -0
- package/board-dist/node_modules/react-dom/server.node.js +18 -0
- package/board-dist/node_modules/react-dom/static.node.js +14 -0
- package/board-dist/node_modules/sharp/lib/channel.js +177 -0
- package/board-dist/node_modules/sharp/lib/colour.js +195 -0
- package/board-dist/node_modules/sharp/lib/composite.js +212 -0
- package/board-dist/node_modules/sharp/lib/constructor.js +499 -0
- package/board-dist/node_modules/sharp/lib/index.js +16 -0
- package/board-dist/node_modules/sharp/lib/input.js +809 -0
- package/board-dist/node_modules/sharp/lib/is.js +143 -0
- package/board-dist/node_modules/sharp/lib/libvips.js +207 -0
- package/board-dist/node_modules/sharp/lib/operation.js +1016 -0
- package/board-dist/node_modules/sharp/lib/output.js +1666 -0
- package/board-dist/node_modules/sharp/lib/resize.js +595 -0
- package/board-dist/node_modules/sharp/lib/sharp.js +121 -0
- package/board-dist/node_modules/sharp/lib/utility.js +291 -0
- package/board-dist/node_modules/sharp/node_modules/semver/classes/comparator.js +143 -0
- package/board-dist/node_modules/sharp/node_modules/semver/classes/range.js +577 -0
- package/board-dist/node_modules/sharp/node_modules/semver/classes/semver.js +350 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/cmp.js +54 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/coerce.js +62 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/compare.js +7 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/eq.js +5 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/gt.js +5 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/gte.js +5 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/lt.js +5 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/lte.js +5 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/neq.js +5 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/parse.js +18 -0
- package/board-dist/node_modules/sharp/node_modules/semver/functions/satisfies.js +12 -0
- package/board-dist/node_modules/sharp/node_modules/semver/internal/constants.js +37 -0
- package/board-dist/node_modules/sharp/node_modules/semver/internal/debug.js +11 -0
- package/board-dist/node_modules/sharp/node_modules/semver/internal/identifiers.js +29 -0
- package/board-dist/node_modules/sharp/node_modules/semver/internal/lrucache.js +42 -0
- package/board-dist/node_modules/sharp/node_modules/semver/internal/parse-options.js +17 -0
- package/board-dist/node_modules/sharp/node_modules/semver/internal/re.js +223 -0
- package/board-dist/node_modules/sharp/node_modules/semver/package.json +78 -0
- package/board-dist/node_modules/sharp/package.json +202 -0
- package/board-dist/node_modules/styled-jsx/dist/index/index.js +499 -0
- package/board-dist/node_modules/styled-jsx/index.js +1 -0
- package/board-dist/node_modules/styled-jsx/package.json +132 -0
- package/board-dist/node_modules/styled-jsx/style.js +1 -0
- package/board-dist/package.json +40 -0
- package/board-dist/server.js +44 -0
- package/dist/index.js +1039 -342
- package/package.json +17 -5
package/dist/index.js
CHANGED
|
@@ -66,7 +66,9 @@ ${close}`;
|
|
|
66
66
|
return (base ? base + "\n\n" : "") + block + "\n";
|
|
67
67
|
}
|
|
68
68
|
function installPack(root, packDir, force = false) {
|
|
69
|
-
const manifest = PackManifestSchema.parse(
|
|
69
|
+
const manifest = PackManifestSchema.parse(
|
|
70
|
+
parseYaml(readFileSync(join(packDir, "manifest.yaml"), "utf-8"))
|
|
71
|
+
);
|
|
70
72
|
const skills = copyTree(join(packDir, "skills"), join(root, ".claude", "skills"), force);
|
|
71
73
|
let claudeMdMerged = false;
|
|
72
74
|
if (manifest.claude_md) {
|
|
@@ -158,21 +160,252 @@ function registerHookCommand(program2) {
|
|
|
158
160
|
// src/commands/init.ts
|
|
159
161
|
import {
|
|
160
162
|
copyFileSync as copyFileSync2,
|
|
161
|
-
existsSync as
|
|
162
|
-
mkdirSync as
|
|
163
|
+
existsSync as existsSync4,
|
|
164
|
+
mkdirSync as mkdirSync3,
|
|
163
165
|
readdirSync as readdirSync2,
|
|
164
|
-
readFileSync as
|
|
166
|
+
readFileSync as readFileSync4,
|
|
165
167
|
statSync as statSync2,
|
|
166
|
-
writeFileSync as
|
|
168
|
+
writeFileSync as writeFileSync3
|
|
167
169
|
} from "fs";
|
|
168
|
-
import { dirname as
|
|
170
|
+
import { dirname as dirname4, join as join3, relative as relative2 } from "path";
|
|
169
171
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
170
|
-
import { stringify as
|
|
172
|
+
import { stringify as stringifyYaml2 } from "yaml";
|
|
173
|
+
|
|
174
|
+
// src/config.ts
|
|
175
|
+
import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
|
|
176
|
+
import { dirname as dirname3, join as join2 } from "path";
|
|
177
|
+
import { parse as parseYaml3 } from "yaml";
|
|
178
|
+
|
|
179
|
+
// src/providers/status-index.ts
|
|
180
|
+
import {
|
|
181
|
+
existsSync as existsSync2,
|
|
182
|
+
mkdirSync as mkdirSync2,
|
|
183
|
+
readFileSync as readFileSync2,
|
|
184
|
+
renameSync,
|
|
185
|
+
unlinkSync,
|
|
186
|
+
writeFileSync as writeFileSync2
|
|
187
|
+
} from "fs";
|
|
188
|
+
import { randomBytes } from "crypto";
|
|
189
|
+
import { dirname as dirname2, isAbsolute, relative, resolve, sep } from "path";
|
|
190
|
+
import { parse as parseYaml2, stringify as stringifyYaml } from "yaml";
|
|
191
|
+
|
|
192
|
+
// src/templates/ticket.ts
|
|
193
|
+
import { z as z2 } from "zod";
|
|
194
|
+
var TICKET_STATUSES = ["Pending", "In progress", "To review", "Done"];
|
|
195
|
+
var TicketStatusSchema = z2.enum(TICKET_STATUSES);
|
|
196
|
+
var TicketDriversSchema = z2.object({
|
|
197
|
+
/** PRD this ticket advances, e.g. "docs/prd/0001". */
|
|
198
|
+
prd: z2.string().optional(),
|
|
199
|
+
/** Governing ADR(s), e.g. ["docs/adr/0003"]. */
|
|
200
|
+
adr: z2.array(z2.string()).default([]),
|
|
201
|
+
/** Security finding remediated, e.g. "docs/security/AUTH-014". */
|
|
202
|
+
security: z2.string().optional()
|
|
203
|
+
});
|
|
204
|
+
var TicketSchema = z2.object({
|
|
205
|
+
key: z2.string().regex(/^[A-Z][A-Z0-9]*-\d+$/, "key must look like PREFIX-123").optional(),
|
|
206
|
+
title: z2.string().min(3, "title must be at least 3 characters"),
|
|
207
|
+
slug: z2.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "slug must be kebab-case").optional(),
|
|
208
|
+
status: TicketStatusSchema.default("Pending"),
|
|
209
|
+
summary: z2.string().min(1, "summary is required"),
|
|
210
|
+
acceptanceCriteria: z2.array(z2.string().min(1)).min(1, "at least one acceptance criterion is required"),
|
|
211
|
+
nonGoals: z2.array(z2.string().min(1)).default([]),
|
|
212
|
+
/** Ticket keys that must reach Done before this one can start. */
|
|
213
|
+
dependencies: z2.array(z2.string()).default([]),
|
|
214
|
+
drivers: TicketDriversSchema.default({}),
|
|
215
|
+
/** Linked pull request (branch, URL, or id) — set by `link-pr` / `hand-off`. */
|
|
216
|
+
prUrl: z2.string().optional(),
|
|
217
|
+
notes: z2.string().optional()
|
|
218
|
+
});
|
|
219
|
+
function slugify(title) {
|
|
220
|
+
return title.toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60).replace(/-+$/g, "");
|
|
221
|
+
}
|
|
222
|
+
function renderTicketMarkdown(t) {
|
|
223
|
+
const lines = [];
|
|
224
|
+
lines.push(`# ${t.key} \u2014 ${t.title}`, "");
|
|
225
|
+
lines.push(`**Status:** ${t.status}`);
|
|
226
|
+
if (t.dependencies.length) {
|
|
227
|
+
lines.push(`**Depends on:** ${t.dependencies.join(", ")}`);
|
|
228
|
+
}
|
|
229
|
+
const drivers = [];
|
|
230
|
+
if (t.drivers.prd) drivers.push(`PRD ${t.drivers.prd}`);
|
|
231
|
+
if (t.drivers.adr.length) drivers.push(`ADR ${t.drivers.adr.join(", ")}`);
|
|
232
|
+
if (t.drivers.security) drivers.push(`Security ${t.drivers.security}`);
|
|
233
|
+
if (drivers.length) lines.push(`**Drivers:** ${drivers.join(" \xB7 ")}`);
|
|
234
|
+
if (t.prUrl) lines.push(`**PR:** ${t.prUrl}`);
|
|
235
|
+
lines.push("", "## Summary", "", t.summary, "");
|
|
236
|
+
lines.push("## Acceptance criteria", "");
|
|
237
|
+
for (const ac of t.acceptanceCriteria) lines.push(`- [ ] ${ac}`);
|
|
238
|
+
lines.push("");
|
|
239
|
+
if (t.nonGoals.length) {
|
|
240
|
+
lines.push("## Non-goals", "");
|
|
241
|
+
for (const ng of t.nonGoals) lines.push(`- ${ng}`);
|
|
242
|
+
lines.push("");
|
|
243
|
+
}
|
|
244
|
+
if (t.notes) lines.push("## Notes", "", t.notes, "");
|
|
245
|
+
return lines.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// src/providers/status-index.ts
|
|
249
|
+
var SCHEMA_VERSION = 1;
|
|
250
|
+
var STATUS_TO_SLUG = {
|
|
251
|
+
Pending: "pending",
|
|
252
|
+
"In progress": "in-progress",
|
|
253
|
+
"To review": "to-review",
|
|
254
|
+
Done: "done"
|
|
255
|
+
};
|
|
256
|
+
var SLUG_TO_STATUS = new Map(
|
|
257
|
+
TICKET_STATUSES.map((status) => [STATUS_TO_SLUG[status], status])
|
|
258
|
+
);
|
|
259
|
+
var KEY_RE = /^[A-Z][A-Z0-9]*-\d+$/;
|
|
260
|
+
var SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
261
|
+
var FILE_RE = /^([A-Z][A-Z0-9]*-\d+)-([a-z0-9]+(?:-[a-z0-9]+)*)\.md$/;
|
|
262
|
+
function slugForStatus(status) {
|
|
263
|
+
const slug = STATUS_TO_SLUG[status];
|
|
264
|
+
if (slug === void 0) {
|
|
265
|
+
throw new Error(`unknown ticket status: ${String(status)}`);
|
|
266
|
+
}
|
|
267
|
+
return slug;
|
|
268
|
+
}
|
|
269
|
+
function assertKey(key) {
|
|
270
|
+
if (!KEY_RE.test(key)) {
|
|
271
|
+
throw new Error(`invalid ticket key ${JSON.stringify(key)}: must match ${KEY_RE.source}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function assertSlug(slug) {
|
|
275
|
+
if (!SLUG_RE.test(slug)) {
|
|
276
|
+
throw new Error(
|
|
277
|
+
`invalid slug ${JSON.stringify(slug)}: must be strict kebab-case (${SLUG_RE.source})`
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
function isTicketStatus(value) {
|
|
282
|
+
return TICKET_STATUSES.includes(value);
|
|
283
|
+
}
|
|
284
|
+
function freshTickets() {
|
|
285
|
+
return /* @__PURE__ */ Object.create(null);
|
|
286
|
+
}
|
|
287
|
+
function composeFile(status, key, slug) {
|
|
288
|
+
assertKey(key);
|
|
289
|
+
assertSlug(slug);
|
|
290
|
+
return `${slugForStatus(status)}/${key}-${slug}.md`;
|
|
291
|
+
}
|
|
292
|
+
function emptyDocument() {
|
|
293
|
+
return {
|
|
294
|
+
version: SCHEMA_VERSION,
|
|
295
|
+
columns: [...TICKET_STATUSES],
|
|
296
|
+
tickets: freshTickets()
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function serialize(doc) {
|
|
300
|
+
const tickets = {};
|
|
301
|
+
for (const key of Object.keys(doc.tickets).sort()) {
|
|
302
|
+
const entry = doc.tickets[key];
|
|
303
|
+
tickets[key] = { column: entry.column, file: entry.file };
|
|
304
|
+
}
|
|
305
|
+
const out2 = {
|
|
306
|
+
version: doc.version,
|
|
307
|
+
columns: [...TICKET_STATUSES],
|
|
308
|
+
tickets
|
|
309
|
+
};
|
|
310
|
+
const text = stringifyYaml(out2, { lineWidth: 0 });
|
|
311
|
+
return text.endsWith("\n") ? text : `${text}
|
|
312
|
+
`;
|
|
313
|
+
}
|
|
314
|
+
function parse(text) {
|
|
315
|
+
const raw = parseYaml2(text);
|
|
316
|
+
const tickets = freshTickets();
|
|
317
|
+
if (raw === null || typeof raw !== "object") {
|
|
318
|
+
return { version: SCHEMA_VERSION, columns: [...TICKET_STATUSES], tickets };
|
|
319
|
+
}
|
|
320
|
+
const obj = raw;
|
|
321
|
+
const version2 = typeof obj.version === "number" ? obj.version : SCHEMA_VERSION;
|
|
322
|
+
const rawTickets = obj.tickets;
|
|
323
|
+
if (rawTickets !== null && typeof rawTickets === "object") {
|
|
324
|
+
for (const [key, value] of Object.entries(rawTickets)) {
|
|
325
|
+
if (!KEY_RE.test(key)) continue;
|
|
326
|
+
if (value === null || typeof value !== "object") continue;
|
|
327
|
+
const entry = value;
|
|
328
|
+
const { column, file } = entry;
|
|
329
|
+
if (typeof column !== "string" || typeof file !== "string") continue;
|
|
330
|
+
if (!isTicketStatus(column)) continue;
|
|
331
|
+
tickets[key] = { column, file };
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return { version: version2, columns: [...TICKET_STATUSES], tickets };
|
|
335
|
+
}
|
|
336
|
+
function load(statusYamlPath) {
|
|
337
|
+
if (!existsSync2(statusYamlPath)) return emptyDocument();
|
|
338
|
+
return parse(readFileSync2(statusYamlPath, "utf-8"));
|
|
339
|
+
}
|
|
340
|
+
function save(statusYamlPath, doc) {
|
|
341
|
+
const dir = dirname2(statusYamlPath);
|
|
342
|
+
mkdirSync2(dir, { recursive: true });
|
|
343
|
+
const tmp = `${statusYamlPath}.${randomBytes(6).toString("hex")}.tmp`;
|
|
344
|
+
try {
|
|
345
|
+
writeFileSync2(tmp, serialize(doc), { encoding: "utf-8", flag: "wx", mode: 384 });
|
|
346
|
+
renameSync(tmp, statusYamlPath);
|
|
347
|
+
} catch (err) {
|
|
348
|
+
try {
|
|
349
|
+
if (existsSync2(tmp)) unlinkSync(tmp);
|
|
350
|
+
} catch {
|
|
351
|
+
}
|
|
352
|
+
throw err;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function assertMutableVersion(doc) {
|
|
356
|
+
if (doc.version !== SCHEMA_VERSION) {
|
|
357
|
+
throw new Error(
|
|
358
|
+
`status.yaml schema version ${doc.version} is unsupported (expected ${SCHEMA_VERSION}); refusing to mutate`
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
function upsert(doc, input) {
|
|
363
|
+
assertMutableVersion(doc);
|
|
364
|
+
const file = composeFile(input.column, input.key, input.slug);
|
|
365
|
+
doc.tickets[input.key] = { column: input.column, file };
|
|
366
|
+
}
|
|
367
|
+
function remove(doc, key) {
|
|
368
|
+
assertMutableVersion(doc);
|
|
369
|
+
delete doc.tickets[key];
|
|
370
|
+
}
|
|
371
|
+
function resolveFile(statusYamlPath, key, entry) {
|
|
372
|
+
assertKey(key);
|
|
373
|
+
const file = entry.file;
|
|
374
|
+
if (file.length === 0 || isAbsolute(file) || file.includes("\\") || // backslash / UNC
|
|
375
|
+
/^[A-Za-z]:/.test(file)) {
|
|
376
|
+
throw new Error(`unsafe index file pointer ${JSON.stringify(file)}`);
|
|
377
|
+
}
|
|
378
|
+
const segments = file.split("/");
|
|
379
|
+
if (segments.some((segment) => segment === ".." || segment === "")) {
|
|
380
|
+
throw new Error(`unsafe index file pointer ${JSON.stringify(file)}`);
|
|
381
|
+
}
|
|
382
|
+
if (segments.length !== 2) {
|
|
383
|
+
throw new Error(`malformed index file pointer ${JSON.stringify(file)}: expected <slug>/<file>`);
|
|
384
|
+
}
|
|
385
|
+
const [folder, filename] = segments;
|
|
386
|
+
const expectedSlug = slugForStatus(entry.column);
|
|
387
|
+
if (folder !== expectedSlug) {
|
|
388
|
+
throw new Error(
|
|
389
|
+
`index/folder disagreement for ${key}: file folder ${JSON.stringify(folder)} != slug(${entry.column})=${JSON.stringify(expectedSlug)}`
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
const match = FILE_RE.exec(filename);
|
|
393
|
+
if (!match || match[1] !== key) {
|
|
394
|
+
throw new Error(
|
|
395
|
+
`index key mismatch: file ${JSON.stringify(filename)} does not belong to key ${JSON.stringify(key)}`
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
const root = dirname2(statusYamlPath);
|
|
399
|
+
const resolved = resolve(root, file);
|
|
400
|
+
const rel = relative(root, resolved);
|
|
401
|
+
const contained = resolved === root || rel !== "" && rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
|
|
402
|
+
if (!contained || !(resolved === root || resolved.startsWith(root + sep))) {
|
|
403
|
+
throw new Error(`index file pointer escapes tickets root: ${JSON.stringify(file)}`);
|
|
404
|
+
}
|
|
405
|
+
return resolved;
|
|
406
|
+
}
|
|
171
407
|
|
|
172
408
|
// src/config.ts
|
|
173
|
-
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
|
|
174
|
-
import { dirname as dirname2, join as join2 } from "path";
|
|
175
|
-
import { parse as parseYaml2 } from "yaml";
|
|
176
409
|
var DEFAULTS = { provider: "local", prefix: "KODI" };
|
|
177
410
|
var STATE_FILE = "kodi-dev.yaml";
|
|
178
411
|
function stateFilePath(root) {
|
|
@@ -181,17 +414,17 @@ function stateFilePath(root) {
|
|
|
181
414
|
function findProjectRoot(cwd = process.cwd()) {
|
|
182
415
|
let dir = cwd;
|
|
183
416
|
while (true) {
|
|
184
|
-
if (
|
|
185
|
-
const parent =
|
|
417
|
+
if (existsSync3(stateFilePath(dir))) return dir;
|
|
418
|
+
const parent = dirname3(dir);
|
|
186
419
|
if (parent === dir) return cwd;
|
|
187
420
|
dir = parent;
|
|
188
421
|
}
|
|
189
422
|
}
|
|
190
423
|
function loadBoardConfig(cwd = process.cwd()) {
|
|
191
424
|
const path = stateFilePath(findProjectRoot(cwd));
|
|
192
|
-
if (!
|
|
425
|
+
if (!existsSync3(path)) return { ...DEFAULTS };
|
|
193
426
|
try {
|
|
194
|
-
const raw =
|
|
427
|
+
const raw = parseYaml3(readFileSync3(path, "utf-8")) ?? {};
|
|
195
428
|
return { ...DEFAULTS, ...raw };
|
|
196
429
|
} catch {
|
|
197
430
|
return { ...DEFAULTS };
|
|
@@ -201,9 +434,12 @@ function localPaths(cwd = process.cwd()) {
|
|
|
201
434
|
const root = join2(findProjectRoot(cwd), "docs", "tickets");
|
|
202
435
|
return {
|
|
203
436
|
root,
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
437
|
+
/** Absolute path to the authoritative `status.yaml` index (data-model §2). */
|
|
438
|
+
statusYaml: join2(root, "status.yaml"),
|
|
439
|
+
/** Absolute on-disk folder a ticket in `status` is filed under (data-model §3). */
|
|
440
|
+
folderFor(status) {
|
|
441
|
+
return join2(root, slugForStatus(status));
|
|
442
|
+
}
|
|
207
443
|
};
|
|
208
444
|
}
|
|
209
445
|
|
|
@@ -233,7 +469,13 @@ function execMutate(args, dryRun) {
|
|
|
233
469
|
if (r.status !== 0) {
|
|
234
470
|
throw new Error(`\`${command}\` failed (exit ${r.status}): ${r.stderr?.trim() || ""}`);
|
|
235
471
|
}
|
|
236
|
-
return {
|
|
472
|
+
return {
|
|
473
|
+
command,
|
|
474
|
+
ran: true,
|
|
475
|
+
stdout: r.stdout ?? "",
|
|
476
|
+
stderr: r.stderr ?? "",
|
|
477
|
+
code: r.status ?? 0
|
|
478
|
+
};
|
|
237
479
|
}
|
|
238
480
|
|
|
239
481
|
// src/html.ts
|
|
@@ -286,68 +528,6 @@ function mdToHtml(md) {
|
|
|
286
528
|
return out2.join("\n");
|
|
287
529
|
}
|
|
288
530
|
|
|
289
|
-
// src/templates/ticket.ts
|
|
290
|
-
import { z as z2 } from "zod";
|
|
291
|
-
var TICKET_STATUSES = [
|
|
292
|
-
"Pending",
|
|
293
|
-
"In progress",
|
|
294
|
-
"To review",
|
|
295
|
-
"Done",
|
|
296
|
-
"Blocked"
|
|
297
|
-
];
|
|
298
|
-
var TicketStatusSchema = z2.enum(TICKET_STATUSES);
|
|
299
|
-
var TicketDriversSchema = z2.object({
|
|
300
|
-
/** PRD this ticket advances, e.g. "docs/prd/0001". */
|
|
301
|
-
prd: z2.string().optional(),
|
|
302
|
-
/** Governing ADR(s), e.g. ["docs/adr/0003"]. */
|
|
303
|
-
adr: z2.array(z2.string()).default([]),
|
|
304
|
-
/** Security finding remediated, e.g. "docs/security/AUTH-014". */
|
|
305
|
-
security: z2.string().optional()
|
|
306
|
-
});
|
|
307
|
-
var TicketSchema = z2.object({
|
|
308
|
-
key: z2.string().regex(/^[A-Z][A-Z0-9]*-\d+$/, "key must look like PREFIX-123").optional(),
|
|
309
|
-
title: z2.string().min(3, "title must be at least 3 characters"),
|
|
310
|
-
slug: z2.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "slug must be kebab-case").optional(),
|
|
311
|
-
status: TicketStatusSchema.default("Pending"),
|
|
312
|
-
summary: z2.string().min(1, "summary is required"),
|
|
313
|
-
acceptanceCriteria: z2.array(z2.string().min(1)).min(1, "at least one acceptance criterion is required"),
|
|
314
|
-
nonGoals: z2.array(z2.string().min(1)).default([]),
|
|
315
|
-
/** Ticket keys that must reach Done before this one can start. */
|
|
316
|
-
dependencies: z2.array(z2.string()).default([]),
|
|
317
|
-
drivers: TicketDriversSchema.default({}),
|
|
318
|
-
/** Linked pull request (branch, URL, or id) — set by `link-pr` / `hand-off`. */
|
|
319
|
-
prUrl: z2.string().optional(),
|
|
320
|
-
notes: z2.string().optional()
|
|
321
|
-
});
|
|
322
|
-
function slugify(title) {
|
|
323
|
-
return title.toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60).replace(/-+$/g, "");
|
|
324
|
-
}
|
|
325
|
-
function renderTicketMarkdown(t) {
|
|
326
|
-
const lines = [];
|
|
327
|
-
lines.push(`# ${t.key} \u2014 ${t.title}`, "");
|
|
328
|
-
lines.push(`**Status:** ${t.status}`);
|
|
329
|
-
if (t.dependencies.length) {
|
|
330
|
-
lines.push(`**Depends on:** ${t.dependencies.join(", ")}`);
|
|
331
|
-
}
|
|
332
|
-
const drivers = [];
|
|
333
|
-
if (t.drivers.prd) drivers.push(`PRD ${t.drivers.prd}`);
|
|
334
|
-
if (t.drivers.adr.length) drivers.push(`ADR ${t.drivers.adr.join(", ")}`);
|
|
335
|
-
if (t.drivers.security) drivers.push(`Security ${t.drivers.security}`);
|
|
336
|
-
if (drivers.length) lines.push(`**Drivers:** ${drivers.join(" \xB7 ")}`);
|
|
337
|
-
if (t.prUrl) lines.push(`**PR:** ${t.prUrl}`);
|
|
338
|
-
lines.push("", "## Summary", "", t.summary, "");
|
|
339
|
-
lines.push("## Acceptance criteria", "");
|
|
340
|
-
for (const ac of t.acceptanceCriteria) lines.push(`- [ ] ${ac}`);
|
|
341
|
-
lines.push("");
|
|
342
|
-
if (t.nonGoals.length) {
|
|
343
|
-
lines.push("## Non-goals", "");
|
|
344
|
-
for (const ng of t.nonGoals) lines.push(`- ${ng}`);
|
|
345
|
-
lines.push("");
|
|
346
|
-
}
|
|
347
|
-
if (t.notes) lines.push("## Notes", "", t.notes, "");
|
|
348
|
-
return lines.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
349
|
-
}
|
|
350
|
-
|
|
351
531
|
// src/providers/azure.ts
|
|
352
532
|
var MARKER_RE = /kodi:ticket:([A-Za-z0-9+/=]+)/;
|
|
353
533
|
var DEFAULT_COLUMNS = {
|
|
@@ -394,7 +574,12 @@ function parseWorkItem(fields, id, cols = DEFAULT_COLUMNS) {
|
|
|
394
574
|
if (!parsed.success) return null;
|
|
395
575
|
const column = fields["System.State"] ?? fields["System.BoardColumn"] ?? "";
|
|
396
576
|
const status = statusFromColumn(column, cols) ?? parsed.data.status;
|
|
397
|
-
return {
|
|
577
|
+
return {
|
|
578
|
+
...parsed.data,
|
|
579
|
+
key: String(id),
|
|
580
|
+
slug: parsed.data.slug ?? slugify(parsed.data.title),
|
|
581
|
+
status
|
|
582
|
+
};
|
|
398
583
|
}
|
|
399
584
|
function createArgs(coords, title, html, column) {
|
|
400
585
|
const args = [
|
|
@@ -454,13 +639,32 @@ var AzureTicketProvider = class {
|
|
|
454
639
|
return { ...draft, key: String(id) };
|
|
455
640
|
}
|
|
456
641
|
async get(key) {
|
|
457
|
-
const out2 = execRead([
|
|
642
|
+
const out2 = execRead([
|
|
643
|
+
"az",
|
|
644
|
+
"boards",
|
|
645
|
+
"work-item",
|
|
646
|
+
"show",
|
|
647
|
+
"--id",
|
|
648
|
+
key,
|
|
649
|
+
"--output",
|
|
650
|
+
"json",
|
|
651
|
+
...this.orgArgs()
|
|
652
|
+
]);
|
|
458
653
|
const wi = JSON.parse(out2);
|
|
459
654
|
return parseWorkItem(wi.fields ?? {}, wi.id, this.columns);
|
|
460
655
|
}
|
|
461
656
|
async list() {
|
|
462
657
|
const wiql = "SELECT [System.Id] FROM WorkItems WHERE [System.WorkItemType] = 'Issue' ORDER BY [System.Id]";
|
|
463
|
-
const out2 = execRead([
|
|
658
|
+
const out2 = execRead([
|
|
659
|
+
"az",
|
|
660
|
+
"boards",
|
|
661
|
+
"query",
|
|
662
|
+
"--wiql",
|
|
663
|
+
wiql,
|
|
664
|
+
"--output",
|
|
665
|
+
"json",
|
|
666
|
+
...this.scopeArgs()
|
|
667
|
+
]);
|
|
464
668
|
const rows = JSON.parse(out2);
|
|
465
669
|
const refs = [];
|
|
466
670
|
for (const row of rows) {
|
|
@@ -488,7 +692,17 @@ var AzureTicketProvider = class {
|
|
|
488
692
|
const current = await this.get(key);
|
|
489
693
|
if (!current) throw new Error(`work-item ${key} not found`);
|
|
490
694
|
execMutate(
|
|
491
|
-
[
|
|
695
|
+
[
|
|
696
|
+
"az",
|
|
697
|
+
"boards",
|
|
698
|
+
"work-item",
|
|
699
|
+
"update",
|
|
700
|
+
"--id",
|
|
701
|
+
key,
|
|
702
|
+
"--fields",
|
|
703
|
+
`System.State=${columnForStatus(status, this.columns)}`,
|
|
704
|
+
...this.orgArgs()
|
|
705
|
+
],
|
|
492
706
|
this.opts.dryRun
|
|
493
707
|
);
|
|
494
708
|
return { ...current, status };
|
|
@@ -508,11 +722,20 @@ var AzureTicketProvider = class {
|
|
|
508
722
|
return merged;
|
|
509
723
|
}
|
|
510
724
|
async delete(key) {
|
|
511
|
-
execMutate(
|
|
725
|
+
execMutate(
|
|
726
|
+
["az", "boards", "work-item", "delete", "--id", key, "--yes", ...this.scopeArgs()],
|
|
727
|
+
this.opts.dryRun
|
|
728
|
+
);
|
|
512
729
|
}
|
|
513
730
|
};
|
|
514
731
|
function toRef(t) {
|
|
515
|
-
return {
|
|
732
|
+
return {
|
|
733
|
+
key: t.key,
|
|
734
|
+
title: t.title,
|
|
735
|
+
status: t.status,
|
|
736
|
+
slug: t.slug,
|
|
737
|
+
dependencies: t.dependencies
|
|
738
|
+
};
|
|
516
739
|
}
|
|
517
740
|
|
|
518
741
|
// src/providers/azure-discovery.ts
|
|
@@ -540,7 +763,18 @@ function parseProjectInfo(json) {
|
|
|
540
763
|
function getProjectInfo(org, project, run = defaultRunner) {
|
|
541
764
|
try {
|
|
542
765
|
return parseProjectInfo(
|
|
543
|
-
run([
|
|
766
|
+
run([
|
|
767
|
+
"az",
|
|
768
|
+
"devops",
|
|
769
|
+
"project",
|
|
770
|
+
"show",
|
|
771
|
+
"--project",
|
|
772
|
+
project,
|
|
773
|
+
"--org",
|
|
774
|
+
org,
|
|
775
|
+
"--output",
|
|
776
|
+
"json"
|
|
777
|
+
])
|
|
544
778
|
);
|
|
545
779
|
} catch {
|
|
546
780
|
return null;
|
|
@@ -587,7 +821,17 @@ function parseProjects2(json) {
|
|
|
587
821
|
return items.map((p) => ({ number: p?.number, title: p?.title ?? "", id: p?.id ?? "" })).filter((p) => typeof p.number === "number");
|
|
588
822
|
}
|
|
589
823
|
function listProjects2(owner, run = defaultRunner2) {
|
|
590
|
-
const out2 = run([
|
|
824
|
+
const out2 = run([
|
|
825
|
+
"gh",
|
|
826
|
+
"project",
|
|
827
|
+
"list",
|
|
828
|
+
"--owner",
|
|
829
|
+
owner,
|
|
830
|
+
"--format",
|
|
831
|
+
"json",
|
|
832
|
+
"--limit",
|
|
833
|
+
"100"
|
|
834
|
+
]);
|
|
591
835
|
return parseProjects2(out2);
|
|
592
836
|
}
|
|
593
837
|
function resolveViewerLogin(run = defaultRunner2) {
|
|
@@ -628,7 +872,9 @@ function parseStatusField(json) {
|
|
|
628
872
|
(f) => typeof f?.name === "string" && f.name.toLowerCase() === "status" && Array.isArray(f?.options)
|
|
629
873
|
);
|
|
630
874
|
if (!status) return null;
|
|
631
|
-
const options = status.options.map((o) => ({ id: o?.id, name: o?.name })).filter(
|
|
875
|
+
const options = status.options.map((o) => ({ id: o?.id, name: o?.name })).filter(
|
|
876
|
+
(o) => typeof o.id === "string" && typeof o.name === "string"
|
|
877
|
+
);
|
|
632
878
|
return { id: status.id, options };
|
|
633
879
|
}
|
|
634
880
|
function listStatusField(owner, number, run = defaultRunner2) {
|
|
@@ -670,7 +916,9 @@ function readlinePrompter() {
|
|
|
670
916
|
async select(message, choices) {
|
|
671
917
|
if (choices.length === 0) throw new Error(`${message}: no choices available`);
|
|
672
918
|
if (!process.stdin.isTTY) {
|
|
673
|
-
throw new Error(
|
|
919
|
+
throw new Error(
|
|
920
|
+
`cannot prompt "${message}" in non-interactive mode \u2014 pass the corresponding flag`
|
|
921
|
+
);
|
|
674
922
|
}
|
|
675
923
|
return inqSelect({
|
|
676
924
|
message,
|
|
@@ -707,17 +955,17 @@ function defaultAssetsDir() {
|
|
|
707
955
|
}
|
|
708
956
|
function copyTree2(srcRoot, destRoot, force, reportBase) {
|
|
709
957
|
const written = [];
|
|
710
|
-
if (!
|
|
958
|
+
if (!existsSync4(srcRoot)) return written;
|
|
711
959
|
const walk = (src, dest) => {
|
|
712
960
|
for (const entry of readdirSync2(src)) {
|
|
713
961
|
const s = join3(src, entry);
|
|
714
962
|
const d = join3(dest, entry);
|
|
715
963
|
if (statSync2(s).isDirectory()) walk(s, d);
|
|
716
964
|
else {
|
|
717
|
-
if (
|
|
718
|
-
|
|
965
|
+
if (existsSync4(d) && !force) continue;
|
|
966
|
+
mkdirSync3(dirname4(d), { recursive: true });
|
|
719
967
|
copyFileSync2(s, d);
|
|
720
|
-
written.push(join3(reportBase,
|
|
968
|
+
written.push(join3(reportBase, relative2(destRoot, d)));
|
|
721
969
|
}
|
|
722
970
|
}
|
|
723
971
|
};
|
|
@@ -726,15 +974,15 @@ function copyTree2(srcRoot, destRoot, force, reportBase) {
|
|
|
726
974
|
}
|
|
727
975
|
function copyMarkdownFlat(srcRoot, destDir, force, reportBase) {
|
|
728
976
|
const written = [];
|
|
729
|
-
if (!
|
|
977
|
+
if (!existsSync4(srcRoot)) return written;
|
|
730
978
|
const walk = (dir) => {
|
|
731
979
|
for (const entry of readdirSync2(dir)) {
|
|
732
980
|
const s = join3(dir, entry);
|
|
733
981
|
if (statSync2(s).isDirectory()) walk(s);
|
|
734
982
|
else if (entry.endsWith(".md") && entry !== "README.md") {
|
|
735
983
|
const d = join3(destDir, entry);
|
|
736
|
-
if (
|
|
737
|
-
|
|
984
|
+
if (existsSync4(d) && !force) continue;
|
|
985
|
+
mkdirSync3(destDir, { recursive: true });
|
|
738
986
|
copyFileSync2(s, d);
|
|
739
987
|
written.push(join3(reportBase, entry));
|
|
740
988
|
}
|
|
@@ -748,11 +996,11 @@ function installHarness(root, opts = {}) {
|
|
|
748
996
|
const assetsDir = opts.assetsDir ?? defaultAssetsDir();
|
|
749
997
|
const claude = join3(root, ".claude");
|
|
750
998
|
const changed = [];
|
|
751
|
-
|
|
999
|
+
mkdirSync3(claude, { recursive: true });
|
|
752
1000
|
const settingsPath = join3(claude, "settings.json");
|
|
753
|
-
const settings =
|
|
1001
|
+
const settings = existsSync4(settingsPath) ? JSON.parse(readFileSync4(settingsPath, "utf-8")) : {};
|
|
754
1002
|
if (mergeSessionStartHook(settings)) {
|
|
755
|
-
|
|
1003
|
+
writeFileSync3(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
|
|
756
1004
|
changed.push(".claude/settings.json (SessionStart hook)");
|
|
757
1005
|
}
|
|
758
1006
|
changed.push(
|
|
@@ -760,8 +1008,11 @@ function installHarness(root, opts = {}) {
|
|
|
760
1008
|
...copyMarkdownFlat(join3(assetsDir, "agents"), join3(claude, "agents"), force, ".claude/agents"),
|
|
761
1009
|
...copyTree2(join3(assetsDir, "rules"), join3(claude, "rules"), force, ".claude/rules")
|
|
762
1010
|
);
|
|
763
|
-
|
|
764
|
-
|
|
1011
|
+
const provider = opts.provider ?? "local";
|
|
1012
|
+
const docsSubs = ["prd", "adr", "diagrams", "plan", "security"];
|
|
1013
|
+
if (provider === "local") docsSubs.push("tickets");
|
|
1014
|
+
for (const sub of docsSubs) {
|
|
1015
|
+
mkdirSync3(join3(root, "docs", sub), { recursive: true });
|
|
765
1016
|
}
|
|
766
1017
|
return changed;
|
|
767
1018
|
}
|
|
@@ -791,7 +1042,9 @@ async function configureBoard(prompter, opts = {}) {
|
|
|
791
1042
|
let project = opts.project;
|
|
792
1043
|
if (project) {
|
|
793
1044
|
if (!projects.includes(project)) {
|
|
794
|
-
throw new InitAbort(
|
|
1045
|
+
throw new InitAbort(
|
|
1046
|
+
`project "${project}" not found in ${org} (found: ${projects.join(", ")}).`
|
|
1047
|
+
);
|
|
795
1048
|
}
|
|
796
1049
|
} else {
|
|
797
1050
|
project = await prompter.select("Select a project", projects);
|
|
@@ -827,13 +1080,26 @@ async function configureBoard(prompter, opts = {}) {
|
|
|
827
1080
|
} else if (proposed.length > 0) {
|
|
828
1081
|
todo = proposed.length === 1 ? proposed[0] : await prompter.select("To Do column (where new issues are created)", proposed);
|
|
829
1082
|
} else {
|
|
830
|
-
todo = await prompter.input(
|
|
1083
|
+
todo = await prompter.input(
|
|
1084
|
+
"To Do column (where new issues are created)",
|
|
1085
|
+
DEFAULT_COLUMNS.todo
|
|
1086
|
+
);
|
|
831
1087
|
if (!todo) throw new InitAbort("missing: the To Do column.");
|
|
832
1088
|
}
|
|
833
1089
|
const columns = {
|
|
834
1090
|
todo,
|
|
835
|
-
inProgress: await pick(
|
|
836
|
-
|
|
1091
|
+
inProgress: await pick(
|
|
1092
|
+
opts.inProgressColumn,
|
|
1093
|
+
"In Progress column",
|
|
1094
|
+
inProg,
|
|
1095
|
+
DEFAULT_COLUMNS.inProgress
|
|
1096
|
+
),
|
|
1097
|
+
toReview: await pick(
|
|
1098
|
+
opts.toReviewColumn,
|
|
1099
|
+
"To Review column",
|
|
1100
|
+
inProg,
|
|
1101
|
+
DEFAULT_COLUMNS.toReview
|
|
1102
|
+
),
|
|
837
1103
|
done: await pick(opts.doneColumn, "Done column", completed, DEFAULT_COLUMNS.done)
|
|
838
1104
|
};
|
|
839
1105
|
const repository = opts.repository ?? (await prompter.input("Repository name for pull requests", project) || project);
|
|
@@ -847,7 +1113,10 @@ async function configureGithub(prompter, opts) {
|
|
|
847
1113
|
}
|
|
848
1114
|
let owner = opts.projectOwner;
|
|
849
1115
|
if (!owner) {
|
|
850
|
-
const ownerType = opts.ownerType ?? await prompter.select("Is the board owned by an organization or a user?", [
|
|
1116
|
+
const ownerType = opts.ownerType ?? await prompter.select("Is the board owned by an organization or a user?", [
|
|
1117
|
+
"organization",
|
|
1118
|
+
"user"
|
|
1119
|
+
]);
|
|
851
1120
|
if (ownerType === "user") {
|
|
852
1121
|
let login = "";
|
|
853
1122
|
try {
|
|
@@ -890,7 +1159,8 @@ async function configureGithub(prompter, opts) {
|
|
|
890
1159
|
);
|
|
891
1160
|
}
|
|
892
1161
|
const options = statusField.options.map((o) => o.name);
|
|
893
|
-
if (options.length === 0)
|
|
1162
|
+
if (options.length === 0)
|
|
1163
|
+
throw new InitAbort(`the Status field on project #${number} has no options.`);
|
|
894
1164
|
const pick = async (flag, message) => {
|
|
895
1165
|
if (flag) return flag;
|
|
896
1166
|
return options.length === 1 ? options[0] : prompter.select(message, options);
|
|
@@ -914,19 +1184,27 @@ async function configureGithub(prompter, opts) {
|
|
|
914
1184
|
} catch {
|
|
915
1185
|
}
|
|
916
1186
|
if (repos.length > 0) {
|
|
917
|
-
if (detected && repos.includes(detected))
|
|
1187
|
+
if (detected && repos.includes(detected))
|
|
1188
|
+
repos = [detected, ...repos.filter((r) => r !== detected)];
|
|
918
1189
|
repository = await prompter.select("Repository for issues", repos);
|
|
919
1190
|
} else {
|
|
920
1191
|
repository = await prompter.input("Repository for issues (owner/repo)", detected) || detected;
|
|
921
1192
|
}
|
|
922
1193
|
}
|
|
923
1194
|
if (!repository) throw new InitAbort("missing: repository (owner/repo).");
|
|
924
|
-
return {
|
|
1195
|
+
return {
|
|
1196
|
+
provider: "github",
|
|
1197
|
+
prefix: "KODI",
|
|
1198
|
+
repository,
|
|
1199
|
+
projectOwner: owner,
|
|
1200
|
+
projectNumber: number,
|
|
1201
|
+
columns
|
|
1202
|
+
};
|
|
925
1203
|
}
|
|
926
1204
|
function writeState(root, config) {
|
|
927
1205
|
const path = stateFilePath(root);
|
|
928
|
-
|
|
929
|
-
|
|
1206
|
+
mkdirSync3(dirname4(path), { recursive: true });
|
|
1207
|
+
writeFileSync3(path, stringifyYaml2(config), "utf-8");
|
|
930
1208
|
return path;
|
|
931
1209
|
}
|
|
932
1210
|
function registerInitCommand(program2) {
|
|
@@ -963,13 +1241,13 @@ kodi init aborted \u2014 ${e.message}
|
|
|
963
1241
|
} finally {
|
|
964
1242
|
prompter.close();
|
|
965
1243
|
}
|
|
966
|
-
const changed = installHarness(root, { force: o.force });
|
|
1244
|
+
const changed = installHarness(root, { force: o.force, provider: config.provider });
|
|
967
1245
|
const statePath = writeState(root, config);
|
|
968
1246
|
process.stdout.write(
|
|
969
1247
|
`
|
|
970
1248
|
kodi init: installed
|
|
971
1249
|
${changed.map((c) => ` + ${c}`).join("\n")}
|
|
972
|
-
+ ${
|
|
1250
|
+
+ ${relative2(root, statePath)} (provider: ${config.provider})
|
|
973
1251
|
|
|
974
1252
|
SessionStart wired to \`${HOOK_COMMAND}\` (matchers: ${SESSION_MATCHER}).
|
|
975
1253
|
`
|
|
@@ -978,7 +1256,7 @@ SessionStart wired to \`${HOOK_COMMAND}\` (matchers: ${SESSION_MATCHER}).
|
|
|
978
1256
|
}
|
|
979
1257
|
|
|
980
1258
|
// src/commands/pr.ts
|
|
981
|
-
import { mkdtempSync, readFileSync as
|
|
1259
|
+
import { mkdtempSync, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "fs";
|
|
982
1260
|
import { tmpdir } from "os";
|
|
983
1261
|
import { join as join4 } from "path";
|
|
984
1262
|
|
|
@@ -1023,7 +1301,7 @@ function resolveTarget(explicit) {
|
|
|
1023
1301
|
);
|
|
1024
1302
|
}
|
|
1025
1303
|
function draftFromOptions(o) {
|
|
1026
|
-
if (o.file) return PrSchema.parse(JSON.parse(
|
|
1304
|
+
if (o.file) return PrSchema.parse(JSON.parse(readFileSync5(String(o.file), "utf-8")));
|
|
1027
1305
|
return PrSchema.parse({
|
|
1028
1306
|
title: o.title,
|
|
1029
1307
|
summary: o.summary,
|
|
@@ -1037,7 +1315,19 @@ function draftFromOptions(o) {
|
|
|
1037
1315
|
});
|
|
1038
1316
|
}
|
|
1039
1317
|
function githubCreateArgs(pr, bodyFile, source, target, repo) {
|
|
1040
|
-
const args = [
|
|
1318
|
+
const args = [
|
|
1319
|
+
"gh",
|
|
1320
|
+
"pr",
|
|
1321
|
+
"create",
|
|
1322
|
+
"--title",
|
|
1323
|
+
pr.title,
|
|
1324
|
+
"--body-file",
|
|
1325
|
+
bodyFile,
|
|
1326
|
+
"--base",
|
|
1327
|
+
target,
|
|
1328
|
+
"--head",
|
|
1329
|
+
source
|
|
1330
|
+
];
|
|
1041
1331
|
for (const r of pr.reviewers) args.push("--reviewer", r);
|
|
1042
1332
|
if (repo) args.push("--repo", repo);
|
|
1043
1333
|
return args;
|
|
@@ -1069,7 +1359,7 @@ function registerPrCommand(program2) {
|
|
|
1069
1359
|
let args;
|
|
1070
1360
|
if (target === "github") {
|
|
1071
1361
|
const bodyFile = join4(mkdtempSync(join4(tmpdir(), "kodi-pr-")), "body.md");
|
|
1072
|
-
|
|
1362
|
+
writeFileSync4(bodyFile, renderPrMarkdown(draft), "utf-8");
|
|
1073
1363
|
args = githubCreateArgs(draft, bodyFile, o.source, o.target, repo);
|
|
1074
1364
|
} else {
|
|
1075
1365
|
args = azureCreateArgs(draft, renderPrHtml(draft), o.source, o.target, repo);
|
|
@@ -1095,47 +1385,561 @@ function collect(value, previous) {
|
|
|
1095
1385
|
return previous.concat([value]);
|
|
1096
1386
|
}
|
|
1097
1387
|
|
|
1098
|
-
// src/commands/
|
|
1099
|
-
import {
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
import {
|
|
1103
|
-
import {
|
|
1104
|
-
|
|
1105
|
-
var
|
|
1106
|
-
var
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1388
|
+
// src/commands/serve.ts
|
|
1389
|
+
import { spawn } from "child_process";
|
|
1390
|
+
import { existsSync as existsSync5 } from "fs";
|
|
1391
|
+
import net from "net";
|
|
1392
|
+
import { dirname as dirname5, resolve as resolve2 } from "path";
|
|
1393
|
+
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
1394
|
+
var LISTEN_TIMEOUT_MS = 15e3;
|
|
1395
|
+
var PROBE_INTERVAL_MS = 200;
|
|
1396
|
+
var KILL_GRACE_MS = 2500;
|
|
1397
|
+
function resolveBoardServer() {
|
|
1398
|
+
const moduleDir = dirname5(fileURLToPath3(import.meta.url));
|
|
1399
|
+
const candidates = [
|
|
1400
|
+
resolve2(moduleDir, "..", "board-dist", "server.js"),
|
|
1401
|
+
resolve2(moduleDir, "..", "..", "board-dist", "server.js")
|
|
1402
|
+
];
|
|
1403
|
+
for (const candidate of candidates) {
|
|
1404
|
+
if (existsSync5(candidate)) return candidate;
|
|
1405
|
+
}
|
|
1406
|
+
throw new Error("board not built \u2014 run `pnpm build` before `kodi tickets serve`");
|
|
1407
|
+
}
|
|
1408
|
+
function pickFreePort() {
|
|
1409
|
+
return new Promise((resolvePort, reject) => {
|
|
1410
|
+
const probe = net.createServer();
|
|
1411
|
+
probe.unref();
|
|
1412
|
+
probe.once("error", reject);
|
|
1413
|
+
probe.listen(0, "127.0.0.1", () => {
|
|
1414
|
+
const addr = probe.address();
|
|
1415
|
+
if (addr && typeof addr === "object") {
|
|
1416
|
+
const { port } = addr;
|
|
1417
|
+
probe.close(() => resolvePort(port));
|
|
1418
|
+
} else {
|
|
1419
|
+
probe.close(() => reject(new Error("could not determine a free port")));
|
|
1420
|
+
}
|
|
1421
|
+
});
|
|
1422
|
+
});
|
|
1123
1423
|
}
|
|
1124
|
-
function
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1424
|
+
function waitForListen(port, timeoutMs, shouldStop) {
|
|
1425
|
+
const deadline = Date.now() + timeoutMs;
|
|
1426
|
+
return new Promise((resolveReady, reject) => {
|
|
1427
|
+
const attempt = () => {
|
|
1428
|
+
if (shouldStop()) {
|
|
1429
|
+
reject(new Error("aborted: board exited before it started listening"));
|
|
1430
|
+
return;
|
|
1431
|
+
}
|
|
1432
|
+
const socket = net.connect({ host: "127.0.0.1", port });
|
|
1433
|
+
socket.once("connect", () => {
|
|
1434
|
+
socket.destroy();
|
|
1435
|
+
resolveReady();
|
|
1436
|
+
});
|
|
1437
|
+
socket.once("error", () => {
|
|
1438
|
+
socket.destroy();
|
|
1439
|
+
if (Date.now() >= deadline) {
|
|
1440
|
+
reject(new Error("board server did not start listening within timeout"));
|
|
1441
|
+
return;
|
|
1442
|
+
}
|
|
1443
|
+
const timer = setTimeout(attempt, PROBE_INTERVAL_MS);
|
|
1444
|
+
timer.unref();
|
|
1445
|
+
});
|
|
1446
|
+
};
|
|
1447
|
+
attempt();
|
|
1448
|
+
});
|
|
1130
1449
|
}
|
|
1131
|
-
function
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1450
|
+
function openBrowser(url) {
|
|
1451
|
+
let child;
|
|
1452
|
+
try {
|
|
1453
|
+
if (process.platform === "darwin") {
|
|
1454
|
+
child = spawn("open", [url], { stdio: "ignore" });
|
|
1455
|
+
} else if (process.platform === "win32") {
|
|
1456
|
+
child = spawn("cmd", ["/c", "start", "", url], { stdio: "ignore" });
|
|
1457
|
+
} else {
|
|
1458
|
+
child = spawn("xdg-open", [url], { stdio: "ignore" });
|
|
1459
|
+
}
|
|
1460
|
+
child.once("error", () => {
|
|
1461
|
+
});
|
|
1462
|
+
child.unref();
|
|
1463
|
+
} catch {
|
|
1464
|
+
}
|
|
1136
1465
|
}
|
|
1137
|
-
function
|
|
1138
|
-
const
|
|
1466
|
+
function buildBoardEnv(port, ticketsDir) {
|
|
1467
|
+
const env = {
|
|
1468
|
+
// Minimal base so node can locate itself and its user dirs.
|
|
1469
|
+
PATH: process.env.PATH,
|
|
1470
|
+
HOME: process.env.HOME,
|
|
1471
|
+
// Loopback ONLY. The standalone server binds HOSTNAME (default 0.0.0.0), so
|
|
1472
|
+
// this literal is what actually keeps the board off the network. HOST is set
|
|
1473
|
+
// too for good measure — HOSTNAME alone is what Next standalone honors.
|
|
1474
|
+
HOSTNAME: "127.0.0.1",
|
|
1475
|
+
HOST: "127.0.0.1",
|
|
1476
|
+
PORT: String(port),
|
|
1477
|
+
KODI_TICKETS_DIR: ticketsDir,
|
|
1478
|
+
NODE_ENV: "production"
|
|
1479
|
+
};
|
|
1480
|
+
if (process.platform === "win32") {
|
|
1481
|
+
if (process.env.SystemRoot) env.SystemRoot = process.env.SystemRoot;
|
|
1482
|
+
if (process.env.APPDATA) env.APPDATA = process.env.APPDATA;
|
|
1483
|
+
}
|
|
1484
|
+
return env;
|
|
1485
|
+
}
|
|
1486
|
+
function parsePortOption(raw) {
|
|
1487
|
+
const n = Number(raw);
|
|
1488
|
+
if (!Number.isInteger(n) || n < 1 || n > 65535) {
|
|
1489
|
+
throw new Error(`invalid --port "${raw}" (expected an integer 1..65535)`);
|
|
1490
|
+
}
|
|
1491
|
+
return n;
|
|
1492
|
+
}
|
|
1493
|
+
function registerServeCommand(program2) {
|
|
1494
|
+
const tickets = program2.commands.find((c) => c.name() === "tickets");
|
|
1495
|
+
if (!tickets) {
|
|
1496
|
+
throw new Error("internal: `tickets` command must be registered before `serve`");
|
|
1497
|
+
}
|
|
1498
|
+
tickets.command("serve").alias("open").description("Launch the local board UI in the browser (read-only view of docs/tickets)").option("--port <n>", "bind the board to a specific port (default: an OS-picked free port)").action(async (o) => {
|
|
1499
|
+
const ticketsDir = resolve2(localPaths(process.cwd()).root);
|
|
1500
|
+
let serverJs;
|
|
1501
|
+
try {
|
|
1502
|
+
serverJs = resolveBoardServer();
|
|
1503
|
+
} catch (err) {
|
|
1504
|
+
process.stderr.write(`${err instanceof Error ? err.message : String(err)}
|
|
1505
|
+
`);
|
|
1506
|
+
process.exitCode = 1;
|
|
1507
|
+
return;
|
|
1508
|
+
}
|
|
1509
|
+
const port = o.port !== void 0 ? parsePortOption(String(o.port)) : await pickFreePort();
|
|
1510
|
+
const env = buildBoardEnv(port, ticketsDir);
|
|
1511
|
+
const child = spawn(process.execPath, [serverJs], {
|
|
1512
|
+
env,
|
|
1513
|
+
stdio: ["ignore", "ignore", "inherit"]
|
|
1514
|
+
});
|
|
1515
|
+
await new Promise((resolveAction) => {
|
|
1516
|
+
let settled = false;
|
|
1517
|
+
let shuttingDown = false;
|
|
1518
|
+
let overrideCode = null;
|
|
1519
|
+
let forceTimer;
|
|
1520
|
+
const detachSignals = () => {
|
|
1521
|
+
process.off("SIGINT", onSignal);
|
|
1522
|
+
process.off("SIGTERM", onSignal);
|
|
1523
|
+
process.off("exit", onProcessExit);
|
|
1524
|
+
};
|
|
1525
|
+
const finish = (code) => {
|
|
1526
|
+
if (settled) return;
|
|
1527
|
+
settled = true;
|
|
1528
|
+
if (forceTimer) clearTimeout(forceTimer);
|
|
1529
|
+
detachSignals();
|
|
1530
|
+
process.exitCode = code;
|
|
1531
|
+
resolveAction();
|
|
1532
|
+
};
|
|
1533
|
+
const shutdown = (code) => {
|
|
1534
|
+
if (code !== void 0) overrideCode = code;
|
|
1535
|
+
if (shuttingDown) return;
|
|
1536
|
+
shuttingDown = true;
|
|
1537
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
1538
|
+
child.kill("SIGTERM");
|
|
1539
|
+
forceTimer = setTimeout(() => {
|
|
1540
|
+
child.kill("SIGKILL");
|
|
1541
|
+
}, KILL_GRACE_MS);
|
|
1542
|
+
forceTimer.unref();
|
|
1543
|
+
} else {
|
|
1544
|
+
finish(overrideCode ?? 0);
|
|
1545
|
+
}
|
|
1546
|
+
};
|
|
1547
|
+
const onSignal = () => shutdown();
|
|
1548
|
+
const onProcessExit = () => {
|
|
1549
|
+
if (child.exitCode === null && child.signalCode === null) child.kill("SIGKILL");
|
|
1550
|
+
};
|
|
1551
|
+
process.on("SIGINT", onSignal);
|
|
1552
|
+
process.on("SIGTERM", onSignal);
|
|
1553
|
+
process.on("exit", onProcessExit);
|
|
1554
|
+
child.on("error", (err) => {
|
|
1555
|
+
process.stderr.write(`failed to start board server: ${err.message}
|
|
1556
|
+
`);
|
|
1557
|
+
finish(1);
|
|
1558
|
+
});
|
|
1559
|
+
child.on("exit", (code, signal) => {
|
|
1560
|
+
const resolved = overrideCode ?? (code == null ? signal ? 0 : 1 : code);
|
|
1561
|
+
finish(resolved);
|
|
1562
|
+
});
|
|
1563
|
+
waitForListen(port, LISTEN_TIMEOUT_MS, () => settled).then(() => {
|
|
1564
|
+
if (settled) return;
|
|
1565
|
+
const url = `http://127.0.0.1:${port}`;
|
|
1566
|
+
process.stdout.write(`Board running at ${url}. To stop the server, press Ctrl+C.
|
|
1567
|
+
`);
|
|
1568
|
+
if (process.env.KODI_NO_OPEN) {
|
|
1569
|
+
process.stdout.write("KODI_NO_OPEN set \u2014 not opening a browser.\n");
|
|
1570
|
+
return;
|
|
1571
|
+
}
|
|
1572
|
+
openBrowser(url);
|
|
1573
|
+
}).catch(() => {
|
|
1574
|
+
if (settled) return;
|
|
1575
|
+
process.stderr.write("board server did not become ready \u2014 shutting down.\n");
|
|
1576
|
+
shutdown(1);
|
|
1577
|
+
});
|
|
1578
|
+
});
|
|
1579
|
+
});
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1582
|
+
// src/commands/tickets.ts
|
|
1583
|
+
import { readFileSync as readFileSync7 } from "fs";
|
|
1584
|
+
|
|
1585
|
+
// src/providers/local.ts
|
|
1586
|
+
import { randomBytes as randomBytes2 } from "crypto";
|
|
1587
|
+
import {
|
|
1588
|
+
existsSync as existsSync6,
|
|
1589
|
+
lstatSync,
|
|
1590
|
+
mkdirSync as mkdirSync4,
|
|
1591
|
+
readdirSync as readdirSync3,
|
|
1592
|
+
readFileSync as readFileSync6,
|
|
1593
|
+
renameSync as renameSync2,
|
|
1594
|
+
unlinkSync as unlinkSync2,
|
|
1595
|
+
writeFileSync as writeFileSync5
|
|
1596
|
+
} from "fs";
|
|
1597
|
+
import { basename as basename2, join as join5 } from "path";
|
|
1598
|
+
import { parse as parseYaml4, stringify as stringifyYaml3 } from "yaml";
|
|
1599
|
+
var FRONTMATTER = /^---\n([\s\S]*?)\n---\n?/;
|
|
1600
|
+
var LEGACY_FOLDERS = ["backlog", "done"];
|
|
1601
|
+
var LEGACY_FILENAME_RE = /^[A-Z][A-Z0-9]*-\d+-.*\.md$/;
|
|
1602
|
+
var LegacyDataError = class extends Error {
|
|
1603
|
+
report;
|
|
1604
|
+
constructor(folders, ticketCount) {
|
|
1605
|
+
super(
|
|
1606
|
+
`legacy ticket data present under docs/tickets/{${folders.join(", ")}} (${ticketCount} ticket-shaped file(s)); clean-start refuses to migrate`
|
|
1607
|
+
);
|
|
1608
|
+
this.name = "LegacyDataError";
|
|
1609
|
+
this.report = { ok: false, reason: "legacy-data-present", folders: [...folders], ticketCount };
|
|
1610
|
+
}
|
|
1611
|
+
};
|
|
1612
|
+
var LocalTicketProvider = class {
|
|
1613
|
+
name = "local";
|
|
1614
|
+
prefix;
|
|
1615
|
+
paths;
|
|
1616
|
+
constructor(prefix, cwd = process.cwd()) {
|
|
1617
|
+
this.prefix = prefix;
|
|
1618
|
+
this.paths = localPaths(cwd);
|
|
1619
|
+
}
|
|
1620
|
+
/**
|
|
1621
|
+
* Lazy idempotent scaffold (R-003, ADR-0001 §2.3): ensure `status.yaml` and
|
|
1622
|
+
* the four status folders exist. A valid pre-existing `status.yaml`
|
|
1623
|
+
* short-circuits the fresh-index write, so re-running never duplicates or
|
|
1624
|
+
* corrupts an existing index. `mkdirSync({recursive:true})` is itself
|
|
1625
|
+
* idempotent for the folders.
|
|
1626
|
+
*/
|
|
1627
|
+
scaffold() {
|
|
1628
|
+
this.detectLegacyData();
|
|
1629
|
+
if (!existsSync6(this.paths.statusYaml)) {
|
|
1630
|
+
save(this.paths.statusYaml, emptyDocument());
|
|
1631
|
+
}
|
|
1632
|
+
for (const status of TICKET_STATUSES) {
|
|
1633
|
+
mkdirSync4(this.paths.folderFor(status), { recursive: true });
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
/**
|
|
1637
|
+
* Evaluate the data-model §5 legacy predicate and throw {@link LegacyDataError}
|
|
1638
|
+
* when it holds — non-destructively, before any scaffold write:
|
|
1639
|
+
*
|
|
1640
|
+
* legacyPresent := !exists(status.yaml)
|
|
1641
|
+
* AND (exists(backlog/) OR exists(done/))
|
|
1642
|
+
* AND countTicketShapedMd(backlog/, done/) >= 1
|
|
1643
|
+
*
|
|
1644
|
+
* Security posture (guidance pass): zero writes on this path (SR-A); FAILS SAFE
|
|
1645
|
+
* — any error while *determining* presence aborts-and-reports rather than
|
|
1646
|
+
* falling through to scaffold writes (SR-B); a per-file parse/read failure is a
|
|
1647
|
+
* legitimate "not ticket-shaped" and never crashes (SR-C). It short-circuits at
|
|
1648
|
+
* the first confirmed ticket-shaped file (SR-H).
|
|
1649
|
+
*/
|
|
1650
|
+
detectLegacyData() {
|
|
1651
|
+
if (existsSync6(this.paths.statusYaml)) return;
|
|
1652
|
+
const states = LEGACY_FOLDERS.map((name2) => ({ name: name2, state: this.legacyDirState(name2) }));
|
|
1653
|
+
const present = states.filter((s) => s.state !== "absent");
|
|
1654
|
+
if (present.length === 0) return;
|
|
1655
|
+
const folders = present.map((s) => s.name);
|
|
1656
|
+
if (present.some((s) => s.state === "unsafe")) {
|
|
1657
|
+
throw new LegacyDataError(folders, 1);
|
|
1658
|
+
}
|
|
1659
|
+
for (const { name: name2, state } of states) {
|
|
1660
|
+
if (state !== "dir") continue;
|
|
1661
|
+
const dir = join5(this.paths.root, name2);
|
|
1662
|
+
let entries;
|
|
1663
|
+
try {
|
|
1664
|
+
entries = readdirSync3(dir, { withFileTypes: true });
|
|
1665
|
+
} catch {
|
|
1666
|
+
throw new LegacyDataError(folders, 1);
|
|
1667
|
+
}
|
|
1668
|
+
for (const dirent of entries) {
|
|
1669
|
+
if (!dirent.isFile()) continue;
|
|
1670
|
+
if (!LEGACY_FILENAME_RE.test(dirent.name)) continue;
|
|
1671
|
+
if (legacyFileHasKey(join5(dir, dirent.name))) {
|
|
1672
|
+
throw new LegacyDataError(folders, 1);
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1677
|
+
/**
|
|
1678
|
+
* Classify a candidate legacy folder without following symlinks (SR-E). Uses
|
|
1679
|
+
* `lstat` so a symlinked `backlog/`/`done/` is flagged `unsafe` (never followed
|
|
1680
|
+
* out of tree); a missing folder is `absent`; a stat/permission failure is
|
|
1681
|
+
* `unsafe` (SR-B fail-safe); a real directory is `dir`.
|
|
1682
|
+
*/
|
|
1683
|
+
legacyDirState(name2) {
|
|
1684
|
+
const dir = join5(this.paths.root, name2);
|
|
1685
|
+
let st;
|
|
1686
|
+
try {
|
|
1687
|
+
st = lstatSync(dir);
|
|
1688
|
+
} catch (err) {
|
|
1689
|
+
if (err.code === "ENOENT") return "absent";
|
|
1690
|
+
return "unsafe";
|
|
1691
|
+
}
|
|
1692
|
+
if (st.isSymbolicLink()) return "unsafe";
|
|
1693
|
+
if (!st.isDirectory()) return "absent";
|
|
1694
|
+
return "dir";
|
|
1695
|
+
}
|
|
1696
|
+
parseFile(path) {
|
|
1697
|
+
let raw;
|
|
1698
|
+
try {
|
|
1699
|
+
raw = readFileSync6(path, "utf-8");
|
|
1700
|
+
} catch {
|
|
1701
|
+
return null;
|
|
1702
|
+
}
|
|
1703
|
+
const m = FRONTMATTER.exec(raw);
|
|
1704
|
+
if (!m) return null;
|
|
1705
|
+
const meta = parseYaml4(m[1]) ?? {};
|
|
1706
|
+
const parsed = TicketSchema.safeParse(meta);
|
|
1707
|
+
if (!parsed.success || !parsed.data.key || !parsed.data.slug) return null;
|
|
1708
|
+
return parsed.data;
|
|
1709
|
+
}
|
|
1710
|
+
/**
|
|
1711
|
+
* Resolve a ticket through the index (index-wins). Returns the absolute file
|
|
1712
|
+
* path, the index entry (authoritative column), and the parsed ticket, or
|
|
1713
|
+
* null when the key is not indexed / the pointer does not resolve.
|
|
1714
|
+
*/
|
|
1715
|
+
locate(key) {
|
|
1716
|
+
const doc = load(this.paths.statusYaml);
|
|
1717
|
+
const entry = doc.tickets[key];
|
|
1718
|
+
if (!entry) return null;
|
|
1719
|
+
let path;
|
|
1720
|
+
try {
|
|
1721
|
+
path = resolveFile(this.paths.statusYaml, key, entry);
|
|
1722
|
+
} catch {
|
|
1723
|
+
return null;
|
|
1724
|
+
}
|
|
1725
|
+
const ticket = this.parseFile(path);
|
|
1726
|
+
if (!ticket) return null;
|
|
1727
|
+
return { path, entry, ticket };
|
|
1728
|
+
}
|
|
1729
|
+
/**
|
|
1730
|
+
* Write a ticket markdown file for its `ticket.status` column: render the body
|
|
1731
|
+
* (frontmatter `status` mirrors the column) and land it via a random-suffixed,
|
|
1732
|
+
* exclusively-opened temp file IN THE SAME target folder, then an intra-folder
|
|
1733
|
+
* atomic rename over the final `<KEY>-<slug>.md` (ADR-0001 §2.4; SR-4/SR-5).
|
|
1734
|
+
* Returns the final absolute path. `sortTicket()` output is byte-identical to
|
|
1735
|
+
* the previous model (R-005).
|
|
1736
|
+
*/
|
|
1737
|
+
writeTicketFile(ticket) {
|
|
1738
|
+
const dir = this.paths.folderFor(ticket.status);
|
|
1739
|
+
mkdirSync4(dir, { recursive: true });
|
|
1740
|
+
const finalName = basename2(composeFile(ticket.status, ticket.key, ticket.slug));
|
|
1741
|
+
const finalPath = join5(dir, finalName);
|
|
1742
|
+
const body = `---
|
|
1743
|
+
${stringifyYaml3(sortTicket(ticket)).trimEnd()}
|
|
1744
|
+
---
|
|
1745
|
+
|
|
1746
|
+
` + renderTicketMarkdown(ticket);
|
|
1747
|
+
const tmp = join5(dir, `.${finalName}.${randomBytes2(6).toString("hex")}.tmp`);
|
|
1748
|
+
try {
|
|
1749
|
+
writeFileSync5(tmp, body, { encoding: "utf-8", flag: "wx", mode: 384 });
|
|
1750
|
+
renameSync2(tmp, finalPath);
|
|
1751
|
+
} catch (err) {
|
|
1752
|
+
try {
|
|
1753
|
+
if (existsSync6(tmp)) unlinkSync2(tmp);
|
|
1754
|
+
} catch {
|
|
1755
|
+
}
|
|
1756
|
+
throw err;
|
|
1757
|
+
}
|
|
1758
|
+
return finalPath;
|
|
1759
|
+
}
|
|
1760
|
+
/** Index-driven enumeration: one ref per `status.yaml` entry, column-authoritative. */
|
|
1761
|
+
collectRefs() {
|
|
1762
|
+
const doc = load(this.paths.statusYaml);
|
|
1763
|
+
const refs = [];
|
|
1764
|
+
for (const [key, entry] of Object.entries(doc.tickets)) {
|
|
1765
|
+
let path;
|
|
1766
|
+
try {
|
|
1767
|
+
path = resolveFile(this.paths.statusYaml, key, entry);
|
|
1768
|
+
} catch {
|
|
1769
|
+
continue;
|
|
1770
|
+
}
|
|
1771
|
+
const t = this.parseFile(path);
|
|
1772
|
+
if (t) refs.push(toRef2({ ...t, status: entry.column }));
|
|
1773
|
+
}
|
|
1774
|
+
return refs.sort((a, b) => a.key.localeCompare(b.key, void 0, { numeric: true }));
|
|
1775
|
+
}
|
|
1776
|
+
async nextId(prefix = this.prefix) {
|
|
1777
|
+
const doc = load(this.paths.statusYaml);
|
|
1778
|
+
let max = 0;
|
|
1779
|
+
for (const key of Object.keys(doc.tickets)) {
|
|
1780
|
+
const m = /^([A-Z][A-Z0-9]*)-(\d+)$/.exec(key);
|
|
1781
|
+
if (m && m[1] === prefix) max = Math.max(max, Number(m[2]));
|
|
1782
|
+
}
|
|
1783
|
+
return `${prefix}-${String(max + 1).padStart(3, "0")}`;
|
|
1784
|
+
}
|
|
1785
|
+
async create(input) {
|
|
1786
|
+
this.scaffold();
|
|
1787
|
+
const key = input.key ?? await this.nextId(this.prefix);
|
|
1788
|
+
if (load(this.paths.statusYaml).tickets[key]) {
|
|
1789
|
+
throw new Error(`ticket ${key} already exists`);
|
|
1790
|
+
}
|
|
1791
|
+
const slug = input.slug ?? slugify(input.title);
|
|
1792
|
+
const ticket = { ...input, key, slug };
|
|
1793
|
+
this.writeTicketFile(ticket);
|
|
1794
|
+
const doc = load(this.paths.statusYaml);
|
|
1795
|
+
upsert(doc, { key, column: ticket.status, slug });
|
|
1796
|
+
save(this.paths.statusYaml, doc);
|
|
1797
|
+
return ticket;
|
|
1798
|
+
}
|
|
1799
|
+
async get(key) {
|
|
1800
|
+
const found = this.locate(key);
|
|
1801
|
+
if (!found) return null;
|
|
1802
|
+
return { ...found.ticket, status: found.entry.column };
|
|
1803
|
+
}
|
|
1804
|
+
async list() {
|
|
1805
|
+
return this.collectRefs();
|
|
1806
|
+
}
|
|
1807
|
+
async listReady() {
|
|
1808
|
+
const all = await this.list();
|
|
1809
|
+
const doneKeys = new Set(all.filter((t) => t.status === "Done").map((t) => t.key));
|
|
1810
|
+
const ready = [];
|
|
1811
|
+
const blocked = [];
|
|
1812
|
+
for (const t of all) {
|
|
1813
|
+
if (t.status !== "Pending") continue;
|
|
1814
|
+
const unmet = t.dependencies.filter((d) => !doneKeys.has(d));
|
|
1815
|
+
if (unmet.length === 0) ready.push(t);
|
|
1816
|
+
else blocked.push({ ticket: t, blockedBy: unmet });
|
|
1817
|
+
}
|
|
1818
|
+
return { ready, blocked };
|
|
1819
|
+
}
|
|
1820
|
+
async setStatus(key, status) {
|
|
1821
|
+
const found = this.locate(key);
|
|
1822
|
+
if (!found) throw new Error(`ticket ${key} not found`);
|
|
1823
|
+
const oldPath = found.path;
|
|
1824
|
+
const ticket = { ...found.ticket, status };
|
|
1825
|
+
const newPath = this.writeTicketFile(ticket);
|
|
1826
|
+
const doc = load(this.paths.statusYaml);
|
|
1827
|
+
upsert(doc, { key, column: status, slug: ticket.slug });
|
|
1828
|
+
save(this.paths.statusYaml, doc);
|
|
1829
|
+
if (oldPath !== newPath) unlinkSync2(oldPath);
|
|
1830
|
+
return ticket;
|
|
1831
|
+
}
|
|
1832
|
+
async start(key, _provenance) {
|
|
1833
|
+
return this.setStatus(key, "In progress");
|
|
1834
|
+
}
|
|
1835
|
+
async amend(key, patch) {
|
|
1836
|
+
const found = this.locate(key);
|
|
1837
|
+
if (!found) throw new Error(`ticket ${key} not found`);
|
|
1838
|
+
const column = found.entry.column;
|
|
1839
|
+
const ticket = {
|
|
1840
|
+
...found.ticket,
|
|
1841
|
+
...patch,
|
|
1842
|
+
key,
|
|
1843
|
+
slug: found.ticket.slug,
|
|
1844
|
+
status: column
|
|
1845
|
+
};
|
|
1846
|
+
this.writeTicketFile(ticket);
|
|
1847
|
+
const doc = load(this.paths.statusYaml);
|
|
1848
|
+
upsert(doc, { key, column, slug: ticket.slug });
|
|
1849
|
+
save(this.paths.statusYaml, doc);
|
|
1850
|
+
return ticket;
|
|
1851
|
+
}
|
|
1852
|
+
async delete(key) {
|
|
1853
|
+
const found = this.locate(key);
|
|
1854
|
+
if (!found) throw new Error(`ticket ${key} not found`);
|
|
1855
|
+
const doc = load(this.paths.statusYaml);
|
|
1856
|
+
remove(doc, key);
|
|
1857
|
+
save(this.paths.statusYaml, doc);
|
|
1858
|
+
unlinkSync2(found.path);
|
|
1859
|
+
}
|
|
1860
|
+
};
|
|
1861
|
+
function legacyFileHasKey(path) {
|
|
1862
|
+
let raw;
|
|
1863
|
+
try {
|
|
1864
|
+
raw = readFileSync6(path, "utf-8");
|
|
1865
|
+
} catch {
|
|
1866
|
+
return false;
|
|
1867
|
+
}
|
|
1868
|
+
const m = FRONTMATTER.exec(raw);
|
|
1869
|
+
if (!m) return false;
|
|
1870
|
+
let meta;
|
|
1871
|
+
try {
|
|
1872
|
+
meta = parseYaml4(m[1]);
|
|
1873
|
+
} catch {
|
|
1874
|
+
return false;
|
|
1875
|
+
}
|
|
1876
|
+
if (meta === null || typeof meta !== "object") return false;
|
|
1877
|
+
const key = meta.key;
|
|
1878
|
+
return typeof key === "string" && KEY_RE.test(key);
|
|
1879
|
+
}
|
|
1880
|
+
function toRef2(t) {
|
|
1881
|
+
return {
|
|
1882
|
+
key: t.key,
|
|
1883
|
+
title: t.title,
|
|
1884
|
+
status: t.status,
|
|
1885
|
+
slug: t.slug,
|
|
1886
|
+
dependencies: t.dependencies
|
|
1887
|
+
};
|
|
1888
|
+
}
|
|
1889
|
+
function sortTicket(t) {
|
|
1890
|
+
return {
|
|
1891
|
+
key: t.key,
|
|
1892
|
+
title: t.title,
|
|
1893
|
+
slug: t.slug,
|
|
1894
|
+
status: t.status,
|
|
1895
|
+
dependencies: t.dependencies,
|
|
1896
|
+
drivers: t.drivers,
|
|
1897
|
+
summary: t.summary,
|
|
1898
|
+
acceptanceCriteria: t.acceptanceCriteria,
|
|
1899
|
+
nonGoals: t.nonGoals,
|
|
1900
|
+
...t.prUrl ? { prUrl: t.prUrl } : {},
|
|
1901
|
+
...t.notes ? { notes: t.notes } : {}
|
|
1902
|
+
};
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
// src/providers/github.ts
|
|
1906
|
+
import { mkdtempSync as mkdtempSync2, writeFileSync as writeFileSync6 } from "fs";
|
|
1907
|
+
import { tmpdir as tmpdir2 } from "os";
|
|
1908
|
+
import { join as join6 } from "path";
|
|
1909
|
+
var MARKER_RE2 = /<!--\s*kodi:ticket\s+(\{[\s\S]*?\})\s*-->/;
|
|
1910
|
+
var DEFAULT_COLUMNS2 = {
|
|
1911
|
+
todo: "Todo",
|
|
1912
|
+
inProgress: "In Progress",
|
|
1913
|
+
toReview: "In Progress",
|
|
1914
|
+
done: "Done"
|
|
1915
|
+
};
|
|
1916
|
+
function columnForStatus2(status, cols) {
|
|
1917
|
+
switch (status) {
|
|
1918
|
+
case "In progress":
|
|
1919
|
+
return cols.inProgress ?? DEFAULT_COLUMNS2.inProgress;
|
|
1920
|
+
case "To review":
|
|
1921
|
+
return cols.toReview ?? DEFAULT_COLUMNS2.toReview;
|
|
1922
|
+
case "Done":
|
|
1923
|
+
return cols.done ?? DEFAULT_COLUMNS2.done;
|
|
1924
|
+
default:
|
|
1925
|
+
return cols.todo;
|
|
1926
|
+
}
|
|
1927
|
+
}
|
|
1928
|
+
function statusFromColumn2(column, cols) {
|
|
1929
|
+
if (column === cols.todo) return "Pending";
|
|
1930
|
+
if (column === (cols.inProgress ?? DEFAULT_COLUMNS2.inProgress)) return "In progress";
|
|
1931
|
+
if (column === (cols.toReview ?? DEFAULT_COLUMNS2.toReview)) return "To review";
|
|
1932
|
+
if (column === (cols.done ?? DEFAULT_COLUMNS2.done)) return "Done";
|
|
1933
|
+
return void 0;
|
|
1934
|
+
}
|
|
1935
|
+
function serializeBody(t) {
|
|
1936
|
+
const canonical = JSON.stringify({ ...t, key: void 0 });
|
|
1937
|
+
return `${renderTicketMarkdown(t)}
|
|
1938
|
+
<!-- kodi:ticket ${canonical} -->
|
|
1939
|
+
`;
|
|
1940
|
+
}
|
|
1941
|
+
function parseMarker(body) {
|
|
1942
|
+
const m = body ? MARKER_RE2.exec(body) : null;
|
|
1139
1943
|
if (!m) return null;
|
|
1140
1944
|
const parsed = TicketSchema.safeParse(JSON.parse(m[1]));
|
|
1141
1945
|
return parsed.success ? parsed.data : null;
|
|
@@ -1146,7 +1950,8 @@ function parseItems(json) {
|
|
|
1146
1950
|
const out2 = [];
|
|
1147
1951
|
for (const it of items) {
|
|
1148
1952
|
const content = it?.content ?? {};
|
|
1149
|
-
if (content.type !== "Issue" || typeof content.number !== "number" || typeof it?.id !== "string")
|
|
1953
|
+
if (content.type !== "Issue" || typeof content.number !== "number" || typeof it?.id !== "string")
|
|
1954
|
+
continue;
|
|
1150
1955
|
out2.push({
|
|
1151
1956
|
itemId: it.id,
|
|
1152
1957
|
issueNumber: content.number,
|
|
@@ -1162,7 +1967,18 @@ function createIssueArgs(repo, title, bodyFile) {
|
|
|
1162
1967
|
return args;
|
|
1163
1968
|
}
|
|
1164
1969
|
function itemAddArgs(owner, number, issueUrl) {
|
|
1165
|
-
return [
|
|
1970
|
+
return [
|
|
1971
|
+
"gh",
|
|
1972
|
+
"project",
|
|
1973
|
+
"item-add",
|
|
1974
|
+
String(number),
|
|
1975
|
+
"--owner",
|
|
1976
|
+
owner,
|
|
1977
|
+
"--url",
|
|
1978
|
+
issueUrl,
|
|
1979
|
+
"--format",
|
|
1980
|
+
"json"
|
|
1981
|
+
];
|
|
1166
1982
|
}
|
|
1167
1983
|
function itemEditArgs(projectId, itemId, fieldId, optionId) {
|
|
1168
1984
|
return [
|
|
@@ -1216,7 +2032,17 @@ var GithubTicketProvider = class {
|
|
|
1216
2032
|
/** Body for an item — from item-list when present, else a per-issue fallback fetch. */
|
|
1217
2033
|
bodyFor(item) {
|
|
1218
2034
|
if (item.body != null) return item.body;
|
|
1219
|
-
return execRead([
|
|
2035
|
+
return execRead([
|
|
2036
|
+
"gh",
|
|
2037
|
+
"issue",
|
|
2038
|
+
"view",
|
|
2039
|
+
String(item.issueNumber),
|
|
2040
|
+
"--json",
|
|
2041
|
+
"body",
|
|
2042
|
+
"-q",
|
|
2043
|
+
".body",
|
|
2044
|
+
...this.repoArgs()
|
|
2045
|
+
]);
|
|
1220
2046
|
}
|
|
1221
2047
|
toStored(item) {
|
|
1222
2048
|
const t = parseMarker(this.bodyFor(item));
|
|
@@ -1235,7 +2061,10 @@ var GithubTicketProvider = class {
|
|
|
1235
2061
|
const r1 = execMutate(createIssueArgs(this.opts.repo, input.title, bodyFile), this.opts.dryRun);
|
|
1236
2062
|
if (!r1.ran) {
|
|
1237
2063
|
execMutate(itemAddArgs(this.opts.owner, this.opts.number, "<issue-url>"), this.opts.dryRun);
|
|
1238
|
-
execMutate(
|
|
2064
|
+
execMutate(
|
|
2065
|
+
itemEditArgs("<project-id>", "<item-id>", "<status-field-id>", "<option-id>"),
|
|
2066
|
+
this.opts.dryRun
|
|
2067
|
+
);
|
|
1239
2068
|
return { ...draft, key: "(dry-run)" };
|
|
1240
2069
|
}
|
|
1241
2070
|
const url = r1.stdout.trim().split("\n").pop() ?? "";
|
|
@@ -1245,7 +2074,8 @@ var GithubTicketProvider = class {
|
|
|
1245
2074
|
const itemId = JSON.parse(add.stdout).id;
|
|
1246
2075
|
const meta = this.projectMeta();
|
|
1247
2076
|
const optionId = optionIdFor(meta.statusField, columnForStatus2(input.status, this.columns));
|
|
1248
|
-
if (optionId)
|
|
2077
|
+
if (optionId)
|
|
2078
|
+
execMutate(itemEditArgs(meta.projectId, itemId, meta.statusField.id, optionId), false);
|
|
1249
2079
|
} catch (e) {
|
|
1250
2080
|
throw new Error(
|
|
1251
2081
|
`issue #${num} was created (${url}) but could not be added to project #${this.opts.number}: ${e instanceof Error ? e.message : String(e)}
|
|
@@ -1260,7 +2090,7 @@ If your gh token lacks the \`project\` scope, run \`gh auth refresh -s project -
|
|
|
1260
2090
|
return item ? this.toStored(item) : null;
|
|
1261
2091
|
}
|
|
1262
2092
|
async list() {
|
|
1263
|
-
return this.items().map((i) => this.toStored(i)).filter((t) => t !== null).map(
|
|
2093
|
+
return this.items().map((i) => this.toStored(i)).filter((t) => t !== null).map(toRef3);
|
|
1264
2094
|
}
|
|
1265
2095
|
async listReady() {
|
|
1266
2096
|
const all = await this.list();
|
|
@@ -1282,8 +2112,12 @@ If your gh token lacks the \`project\` scope, run \`gh auth refresh -s project -
|
|
|
1282
2112
|
if (!current) throw new Error(`issue ${key} has no kodi marker`);
|
|
1283
2113
|
const meta = this.projectMeta();
|
|
1284
2114
|
const optionId = optionIdFor(meta.statusField, columnForStatus2(status, this.columns));
|
|
1285
|
-
if (!optionId)
|
|
1286
|
-
|
|
2115
|
+
if (!optionId)
|
|
2116
|
+
throw new Error(`no Status option maps to "${status}" on project #${this.opts.number}`);
|
|
2117
|
+
execMutate(
|
|
2118
|
+
itemEditArgs(meta.projectId, item.itemId, meta.statusField.id, optionId),
|
|
2119
|
+
this.opts.dryRun
|
|
2120
|
+
);
|
|
1287
2121
|
return { ...current, status };
|
|
1288
2122
|
}
|
|
1289
2123
|
async start(key, _p) {
|
|
@@ -1303,183 +2137,20 @@ If your gh token lacks the \`project\` scope, run \`gh auth refresh -s project -
|
|
|
1303
2137
|
execMutate(["gh", "issue", "delete", key, "--yes", ...this.repoArgs()], this.opts.dryRun);
|
|
1304
2138
|
}
|
|
1305
2139
|
};
|
|
1306
|
-
function toRef2(t) {
|
|
1307
|
-
return { key: t.key, title: t.title, status: t.status, slug: t.slug, dependencies: t.dependencies };
|
|
1308
|
-
}
|
|
1309
|
-
function writeTempBody(body) {
|
|
1310
|
-
const file = join5(mkdtempSync2(join5(tmpdir2(), "kodi-gh-")), "body.md");
|
|
1311
|
-
writeFileSync4(file, body, "utf-8");
|
|
1312
|
-
return file;
|
|
1313
|
-
}
|
|
1314
|
-
|
|
1315
|
-
// src/providers/local.ts
|
|
1316
|
-
import {
|
|
1317
|
-
existsSync as existsSync4,
|
|
1318
|
-
mkdirSync as mkdirSync3,
|
|
1319
|
-
readdirSync as readdirSync3,
|
|
1320
|
-
readFileSync as readFileSync5,
|
|
1321
|
-
rmSync,
|
|
1322
|
-
writeFileSync as writeFileSync5
|
|
1323
|
-
} from "fs";
|
|
1324
|
-
import { join as join6 } from "path";
|
|
1325
|
-
import { parse as parseYaml3, stringify as stringifyYaml2 } from "yaml";
|
|
1326
|
-
var FRONTMATTER = /^---\n([\s\S]*?)\n---\n?/;
|
|
1327
|
-
var LocalTicketProvider = class {
|
|
1328
|
-
name = "local";
|
|
1329
|
-
prefix;
|
|
1330
|
-
paths;
|
|
1331
|
-
constructor(prefix, cwd = process.cwd()) {
|
|
1332
|
-
this.prefix = prefix;
|
|
1333
|
-
this.paths = localPaths(cwd);
|
|
1334
|
-
}
|
|
1335
|
-
ensureDirs() {
|
|
1336
|
-
mkdirSync3(this.paths.backlog, { recursive: true });
|
|
1337
|
-
mkdirSync3(this.paths.done, { recursive: true });
|
|
1338
|
-
}
|
|
1339
|
-
fileName(t) {
|
|
1340
|
-
return `${t.key}-${t.slug}.md`;
|
|
1341
|
-
}
|
|
1342
|
-
/** Directory a ticket file lives in for a given status. */
|
|
1343
|
-
dirFor(status) {
|
|
1344
|
-
return status === "Done" ? this.paths.done : this.paths.backlog;
|
|
1345
|
-
}
|
|
1346
|
-
allFiles() {
|
|
1347
|
-
const out2 = [];
|
|
1348
|
-
for (const dir of [this.paths.backlog, this.paths.done]) {
|
|
1349
|
-
if (!existsSync4(dir)) continue;
|
|
1350
|
-
for (const file of readdirSync3(dir)) {
|
|
1351
|
-
if (file.endsWith(".md")) out2.push({ dir, file });
|
|
1352
|
-
}
|
|
1353
|
-
}
|
|
1354
|
-
return out2;
|
|
1355
|
-
}
|
|
1356
|
-
parseFile(dir, file) {
|
|
1357
|
-
const raw = readFileSync5(join6(dir, file), "utf-8");
|
|
1358
|
-
const m = FRONTMATTER.exec(raw);
|
|
1359
|
-
if (!m) return null;
|
|
1360
|
-
const meta = parseYaml3(m[1]) ?? {};
|
|
1361
|
-
const parsed = TicketSchema.safeParse(meta);
|
|
1362
|
-
if (!parsed.success || !parsed.data.key || !parsed.data.slug) return null;
|
|
1363
|
-
return parsed.data;
|
|
1364
|
-
}
|
|
1365
|
-
locate(key) {
|
|
1366
|
-
for (const { dir, file } of this.allFiles()) {
|
|
1367
|
-
const ticket = this.parseFile(dir, file);
|
|
1368
|
-
if (ticket && ticket.key === key) return { dir, file, ticket };
|
|
1369
|
-
}
|
|
1370
|
-
return null;
|
|
1371
|
-
}
|
|
1372
|
-
persist(ticket) {
|
|
1373
|
-
this.ensureDirs();
|
|
1374
|
-
const existing = this.locate(ticket.key);
|
|
1375
|
-
if (existing) rmSync(join6(existing.dir, existing.file));
|
|
1376
|
-
const dir = this.dirFor(ticket.status);
|
|
1377
|
-
const body = `---
|
|
1378
|
-
${stringifyYaml2(sortTicket(ticket)).trimEnd()}
|
|
1379
|
-
---
|
|
1380
|
-
|
|
1381
|
-
` + renderTicketMarkdown(ticket);
|
|
1382
|
-
writeFileSync5(join6(dir, this.fileName(ticket)), body, "utf-8");
|
|
1383
|
-
this.writeIndex();
|
|
1384
|
-
}
|
|
1385
|
-
async nextId(prefix = this.prefix) {
|
|
1386
|
-
let max = 0;
|
|
1387
|
-
for (const { dir, file } of this.allFiles()) {
|
|
1388
|
-
const t = this.parseFile(dir, file);
|
|
1389
|
-
if (!t) continue;
|
|
1390
|
-
const m = /^([A-Z][A-Z0-9]*)-(\d+)$/.exec(t.key);
|
|
1391
|
-
if (m && m[1] === prefix) max = Math.max(max, Number(m[2]));
|
|
1392
|
-
}
|
|
1393
|
-
return `${prefix}-${String(max + 1).padStart(3, "0")}`;
|
|
1394
|
-
}
|
|
1395
|
-
async create(input) {
|
|
1396
|
-
const key = input.key ?? await this.nextId(this.prefix);
|
|
1397
|
-
if (this.locate(key)) throw new Error(`ticket ${key} already exists`);
|
|
1398
|
-
const slug = input.slug ?? slugify(input.title);
|
|
1399
|
-
const ticket = { ...input, key, slug };
|
|
1400
|
-
this.persist(ticket);
|
|
1401
|
-
return ticket;
|
|
1402
|
-
}
|
|
1403
|
-
async get(key) {
|
|
1404
|
-
return this.locate(key)?.ticket ?? null;
|
|
1405
|
-
}
|
|
1406
|
-
async list() {
|
|
1407
|
-
const refs = [];
|
|
1408
|
-
for (const { dir, file } of this.allFiles()) {
|
|
1409
|
-
const t = this.parseFile(dir, file);
|
|
1410
|
-
if (t) refs.push(toRef3(t));
|
|
1411
|
-
}
|
|
1412
|
-
return refs.sort((a, b) => a.key.localeCompare(b.key, void 0, { numeric: true }));
|
|
1413
|
-
}
|
|
1414
|
-
async listReady() {
|
|
1415
|
-
const all = await this.list();
|
|
1416
|
-
const doneKeys = new Set(all.filter((t) => t.status === "Done").map((t) => t.key));
|
|
1417
|
-
const ready = [];
|
|
1418
|
-
const blocked = [];
|
|
1419
|
-
for (const t of all) {
|
|
1420
|
-
if (t.status !== "Pending") continue;
|
|
1421
|
-
const unmet = t.dependencies.filter((d) => !doneKeys.has(d));
|
|
1422
|
-
if (unmet.length === 0) ready.push(t);
|
|
1423
|
-
else blocked.push({ ticket: t, blockedBy: unmet });
|
|
1424
|
-
}
|
|
1425
|
-
return { ready, blocked };
|
|
1426
|
-
}
|
|
1427
|
-
async setStatus(key, status) {
|
|
1428
|
-
const found = this.locate(key);
|
|
1429
|
-
if (!found) throw new Error(`ticket ${key} not found`);
|
|
1430
|
-
const ticket = { ...found.ticket, status };
|
|
1431
|
-
this.persist(ticket);
|
|
1432
|
-
return ticket;
|
|
1433
|
-
}
|
|
1434
|
-
async start(key, _provenance) {
|
|
1435
|
-
return this.setStatus(key, "In progress");
|
|
1436
|
-
}
|
|
1437
|
-
async amend(key, patch) {
|
|
1438
|
-
const found = this.locate(key);
|
|
1439
|
-
if (!found) throw new Error(`ticket ${key} not found`);
|
|
1440
|
-
const ticket = { ...found.ticket, ...patch, key, slug: found.ticket.slug };
|
|
1441
|
-
this.persist(ticket);
|
|
1442
|
-
return ticket;
|
|
1443
|
-
}
|
|
1444
|
-
async delete(key) {
|
|
1445
|
-
const found = this.locate(key);
|
|
1446
|
-
if (!found) throw new Error(`ticket ${key} not found`);
|
|
1447
|
-
rmSync(join6(found.dir, found.file));
|
|
1448
|
-
this.writeIndex();
|
|
1449
|
-
}
|
|
1450
|
-
writeIndex() {
|
|
1451
|
-
const refs = [];
|
|
1452
|
-
for (const { dir, file } of this.allFiles()) {
|
|
1453
|
-
const t = this.parseFile(dir, file);
|
|
1454
|
-
if (t) refs.push(toRef3(t));
|
|
1455
|
-
}
|
|
1456
|
-
refs.sort((a, b) => a.key.localeCompare(b.key, void 0, { numeric: true }));
|
|
1457
|
-
const lines = ["# Tickets", "", "| Key | Title | Status | Depends on |", "|---|---|---|---|"];
|
|
1458
|
-
for (const t of refs) {
|
|
1459
|
-
lines.push(`| ${t.key} | ${t.title} | ${t.status} | ${t.dependencies.join(", ") || "\u2014"} |`);
|
|
1460
|
-
}
|
|
1461
|
-
lines.push("");
|
|
1462
|
-
writeFileSync5(this.paths.index, lines.join("\n"), "utf-8");
|
|
1463
|
-
}
|
|
1464
|
-
};
|
|
1465
2140
|
function toRef3(t) {
|
|
1466
|
-
return { key: t.key, title: t.title, status: t.status, slug: t.slug, dependencies: t.dependencies };
|
|
1467
|
-
}
|
|
1468
|
-
function sortTicket(t) {
|
|
1469
2141
|
return {
|
|
1470
2142
|
key: t.key,
|
|
1471
2143
|
title: t.title,
|
|
1472
|
-
slug: t.slug,
|
|
1473
2144
|
status: t.status,
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
summary: t.summary,
|
|
1477
|
-
acceptanceCriteria: t.acceptanceCriteria,
|
|
1478
|
-
nonGoals: t.nonGoals,
|
|
1479
|
-
...t.prUrl ? { prUrl: t.prUrl } : {},
|
|
1480
|
-
...t.notes ? { notes: t.notes } : {}
|
|
2145
|
+
slug: t.slug,
|
|
2146
|
+
dependencies: t.dependencies
|
|
1481
2147
|
};
|
|
1482
2148
|
}
|
|
2149
|
+
function writeTempBody(body) {
|
|
2150
|
+
const file = join6(mkdtempSync2(join6(tmpdir2(), "kodi-gh-")), "body.md");
|
|
2151
|
+
writeFileSync6(file, body, "utf-8");
|
|
2152
|
+
return file;
|
|
2153
|
+
}
|
|
1483
2154
|
|
|
1484
2155
|
// src/providers/index.ts
|
|
1485
2156
|
function resolveProvider(cwd = process.cwd(), opts = {}) {
|
|
@@ -1516,7 +2187,7 @@ function out(data, json, human) {
|
|
|
1516
2187
|
}
|
|
1517
2188
|
function draftFromOptions2(o) {
|
|
1518
2189
|
if (o.file) {
|
|
1519
|
-
const raw = JSON.parse(
|
|
2190
|
+
const raw = JSON.parse(readFileSync7(String(o.file), "utf-8"));
|
|
1520
2191
|
return TicketSchema.parse(raw);
|
|
1521
2192
|
}
|
|
1522
2193
|
return TicketSchema.parse({
|
|
@@ -1537,8 +2208,17 @@ function registerTicketsCommand(program2) {
|
|
|
1537
2208
|
const tickets = program2.command("tickets").description("Manage tickets across the active provider (local / github / azure)");
|
|
1538
2209
|
tickets.command("create").description("Create a ticket (validates the template)").option("-f, --file <path>", "JSON draft file (validated against the ticket template)").option("-t, --title <title>").option("-s, --summary <summary>").option("--ac <criterion>", "acceptance criterion (repeatable)", collect2, []).option("--non-goal <text>", "non-goal (repeatable)", collect2, []).option("--dep <key>", "dependency ticket key (repeatable)", collect2, []).option("--prd <ref>", "PRD driver").option("--adr <ref>", "ADR driver (repeatable)", collect2, []).option("--security <ref>", "security driver").option("--notes <text>").option("--yes", "execute remote mutations (default: dry-run)", false).option("--json", "machine-readable output", false).action(async (o) => {
|
|
1539
2210
|
const draft = draftFromOptions2(o);
|
|
1540
|
-
|
|
1541
|
-
|
|
2211
|
+
try {
|
|
2212
|
+
const created = await resolveProvider(process.cwd(), { yes: o.yes }).create(draft);
|
|
2213
|
+
out(created, o.json, () => `Created ${created.key} (${created.status}) \u2014 ${created.title}`);
|
|
2214
|
+
} catch (err) {
|
|
2215
|
+
if (err instanceof LegacyDataError) {
|
|
2216
|
+
out(err.report, o.json, () => renderLegacyRefusal(err.report));
|
|
2217
|
+
process.exitCode = 1;
|
|
2218
|
+
return;
|
|
2219
|
+
}
|
|
2220
|
+
throw err;
|
|
2221
|
+
}
|
|
1542
2222
|
});
|
|
1543
2223
|
tickets.command("list").description("List all tickets").option("--json", "machine-readable output", false).action(async (o) => {
|
|
1544
2224
|
const refs = await resolveProvider().list();
|
|
@@ -1577,11 +2257,16 @@ ${blocked}`;
|
|
|
1577
2257
|
process.exitCode = 1;
|
|
1578
2258
|
return;
|
|
1579
2259
|
}
|
|
1580
|
-
const t = await resolveProvider(process.cwd(), { yes: o.yes }).setStatus(
|
|
2260
|
+
const t = await resolveProvider(process.cwd(), { yes: o.yes }).setStatus(
|
|
2261
|
+
key,
|
|
2262
|
+
status
|
|
2263
|
+
);
|
|
1581
2264
|
out(t, o.json, () => `${t.key} \u2192 ${t.status}`);
|
|
1582
2265
|
});
|
|
1583
2266
|
tickets.command("start <key>").description("Mark a ticket started (In progress)").option("--branch <name>").option("--yes", "execute remote mutations (default: dry-run)", false).option("--json", "machine-readable output", false).action(async (key, o) => {
|
|
1584
|
-
const t = await resolveProvider(process.cwd(), { yes: o.yes }).start(key, {
|
|
2267
|
+
const t = await resolveProvider(process.cwd(), { yes: o.yes }).start(key, {
|
|
2268
|
+
branch: o.branch
|
|
2269
|
+
});
|
|
1585
2270
|
out(t, o.json, () => `${t.key} \u2192 ${t.status}`);
|
|
1586
2271
|
});
|
|
1587
2272
|
tickets.command("delete <key>").description("Delete a ticket").option("--yes", "execute remote mutations (default: dry-run)", false).option("--json", "machine-readable output", false).action(async (key, o) => {
|
|
@@ -1593,7 +2278,7 @@ ${blocked}`;
|
|
|
1593
2278
|
out({ nextId: id }, o.json, () => id);
|
|
1594
2279
|
});
|
|
1595
2280
|
tickets.command("amend <key>").description("Edit a ticket (from --file patch or flags)").option("-f, --file <path>", "JSON patch (validated against the template)").option("-s, --summary <text>").option("--notes <text>").option("--ac <criterion>", "replace acceptance criteria (repeatable)", collect2, []).option("--dep <key>", "replace dependencies (repeatable)", collect2, []).option("--pr <ref>", "link a PR").option("--yes", "execute remote mutations (default: dry-run)", false).option("--json", "machine-readable output", false).action(async (key, o) => {
|
|
1596
|
-
const patch = o.file ? TicketSchema.partial().parse(JSON.parse(
|
|
2281
|
+
const patch = o.file ? TicketSchema.partial().parse(JSON.parse(readFileSync7(String(o.file), "utf-8"))) : buildPatch(o);
|
|
1597
2282
|
const t = await resolveProvider(process.cwd(), { yes: o.yes }).amend(key, patch);
|
|
1598
2283
|
out(t, o.json, () => `Amended ${t.key}`);
|
|
1599
2284
|
});
|
|
@@ -1615,7 +2300,11 @@ ${blocked}`;
|
|
|
1615
2300
|
const t = await provider.amend(key, { dependencies: deps });
|
|
1616
2301
|
out(t.dependencies, o.json, () => `${key} deps: ${t.dependencies.join(", ") || "(none)"}`);
|
|
1617
2302
|
} else {
|
|
1618
|
-
out(
|
|
2303
|
+
out(
|
|
2304
|
+
current.dependencies,
|
|
2305
|
+
o.json,
|
|
2306
|
+
() => `${key} deps: ${current.dependencies.join(", ") || "(none)"}`
|
|
2307
|
+
);
|
|
1619
2308
|
}
|
|
1620
2309
|
});
|
|
1621
2310
|
tickets.command("hand-off <key>").description("End of slice: move to To review and optionally link the PR").option("--pr <ref>", "link the PR at hand-off").option("--yes", "execute remote mutations (default: dry-run)", false).option("--json", "machine-readable output", false).action(async (key, o) => {
|
|
@@ -1629,6 +2318,13 @@ ${blocked}`;
|
|
|
1629
2318
|
function collect2(value, previous) {
|
|
1630
2319
|
return previous.concat([value]);
|
|
1631
2320
|
}
|
|
2321
|
+
function renderLegacyRefusal(report) {
|
|
2322
|
+
const list = report.folders.map((f) => `docs/tickets/${f}`).join(" and ");
|
|
2323
|
+
const files = `${report.ticketCount} ticket file${report.ticketCount === 1 ? "" : "s"}`;
|
|
2324
|
+
return `Refusing to create: legacy ticket data detected under ${list} (at least ${files}).
|
|
2325
|
+
kodi uses a clean-start model and will not migrate, move, or modify legacy tickets.
|
|
2326
|
+
Move or remove the legacy tickets under ${list}, then re-run.`;
|
|
2327
|
+
}
|
|
1632
2328
|
function buildPatch(o) {
|
|
1633
2329
|
const patch = {};
|
|
1634
2330
|
if (o.summary !== void 0) patch.summary = o.summary;
|
|
@@ -1641,13 +2337,14 @@ function buildPatch(o) {
|
|
|
1641
2337
|
|
|
1642
2338
|
// package.json
|
|
1643
2339
|
var name = "kodi-dev";
|
|
1644
|
-
var version = "0.1
|
|
2340
|
+
var version = "1.0.1";
|
|
1645
2341
|
var description = "kodi.dev \u2014 Claude Code-native agent orchestrator CLI";
|
|
1646
2342
|
|
|
1647
2343
|
// src/index.ts
|
|
1648
2344
|
var program = new Command();
|
|
1649
2345
|
program.name(name).description(description).version(version, "-v, --version", "output the current version");
|
|
1650
2346
|
registerTicketsCommand(program);
|
|
2347
|
+
registerServeCommand(program);
|
|
1651
2348
|
registerPrCommand(program);
|
|
1652
2349
|
registerHookCommand(program);
|
|
1653
2350
|
registerInitCommand(program);
|