@coodra/cli 0.2.0-beta.6 → 0.2.0-beta.8
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/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +69 -2
- package/dist/commands/start.js.map +1 -1
- package/dist/index.js +41 -3
- package/dist/index.js.map +3 -3
- package/dist/runtime/web/apps/web-v2/.next/BUILD_ID +1 -1
- package/dist/runtime/web/apps/web-v2/.next/app-build-manifest.json +132 -132
- package/dist/runtime/web/apps/web-v2/.next/app-path-routes-manifest.json +20 -20
- package/dist/runtime/web/apps/web-v2/.next/build-manifest.json +5 -5
- package/dist/runtime/web/apps/web-v2/.next/prerender-manifest.json +3 -3
- package/dist/runtime/web/apps/web-v2/.next/react-loadable-manifest.json +3 -3
- package/dist/runtime/web/apps/web-v2/.next/server/app/_not-found/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/api/healthz/route_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/api/install/[token]/route.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/api/install/[token]/route_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/api/runs/[id]/state/route_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/cli-login/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/cli-login/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/cli-login/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/sign-in/[[...sign-in]]/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/sign-up/[[...sign-up]]/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/sign-up/[[...sign-up]]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/auth/sign-up/[[...sign-up]]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/context-packs/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/context-packs/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/context-packs/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/decisions/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/decisions/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/decisions/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/features/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/features/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/forbidden/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/forbidden/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/graph/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/graph/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/graph/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/init/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/init/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/init/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/install/[token]/cli.sh/route.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/install/[token]/cli.sh/route_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/install/[token]/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/install/[token]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/install/[token]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/kill-switches/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/kill-switches/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/kill-switches/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/solo/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/solo/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/solo/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/team/join/page.js +4 -4
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/team/join/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/team/join/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/team/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/team/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/onboarding/team/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/[slug]/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/[slug]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/[slug]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/new/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/new/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/new/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/packs/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/policies/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/policies/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/policy/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/policy/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/policy/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/edit/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/edit/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/edit/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/files/[...path]/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/files/[...path]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/[fslug]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/import/page.js +15 -15
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/import/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/import/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/new/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/new/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/new/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/features/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/packs/new/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/packs/new/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/packs/new/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/diff/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/diff/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/diff/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/live/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/live/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/live/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/[id]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/account/[[...rest]]/page.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/account/[[...rest]]/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/account/[[...rest]]/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/team/invite/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/team/invite/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/team/invite/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/team/page.js +3 -3
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/team/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/settings/team/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/sync/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/sync/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/sync/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/templates/page.js +3 -3
- package/dist/runtime/web/apps/web-v2/.next/server/app/templates/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/templates/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/welcome/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/welcome/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/welcome/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/workspace/page.js +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/app/workspace/page.js.nft.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/app-paths-manifest.json +20 -20
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/{3367.js → 3088.js} +18 -13
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/3616.js +4 -4
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/4527.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/4914.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/{4305.js → 7012.js} +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/7385.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/{411.js → 9621.js} +2 -2
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/9822.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/middleware-build-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/middleware-manifest.json +5 -5
- package/dist/runtime/web/apps/web-v2/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/next-font-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/next-font-manifest.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/pages/500.html +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/server-reference-manifest.js +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/server-reference-manifest.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/2794.01065593ccddcb8e.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/4057.50023974d3e12253.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/{8285-7ee171134d83e929.js → 8285-db15ca2f7eefbbbd.js} +2 -2
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/auth/sign-in/[[...sign-in]]/page-2ff580e3b1799ae2.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/auth/sign-up/[[...sign-up]]/page-2ff580e3b1799ae2.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/forbidden/page-ac794448932caae3.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/layout-bce8e3b0207fc8ca.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/projects/[slug]/features/import/{page-f6d5a0afc99c2146.js → page-82b1a8257d4c6843.js} +1 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/runs/[id]/live/page-adb64eb042a70714.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/settings/account/[[...rest]]/page-ac794448932caae3.js +1 -0
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/{webpack-a41be9ea9785afc4.js → webpack-d0d56a0b91f01cd3.js} +1 -1
- package/dist/runtime/web/packages/cli/package.json +3 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/370.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/server/chunks/573.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/1877.87d50208a6a54cde.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/2794.e3621ea090f6362b.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/auth/sign-in/[[...sign-in]]/page-67e91ce4dd5652fc.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/auth/sign-up/[[...sign-up]]/page-67e91ce4dd5652fc.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/forbidden/page-e272b356a5051322.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/layout-b6e54745c1181b00.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/runs/[id]/live/page-8596dcb65057572e.js +0 -1
- package/dist/runtime/web/apps/web-v2/.next/static/chunks/app/settings/account/[[...rest]]/page-e272b356a5051322.js +0 -1
- /package/dist/runtime/web/apps/web-v2/.next/static/{kHcM6UaOoBnXN8M59NqMB → i1gnsMuVXYcnTChbZTtUC}/_buildManifest.js +0 -0
- /package/dist/runtime/web/apps/web-v2/.next/static/{kHcM6UaOoBnXN8M59NqMB → i1gnsMuVXYcnTChbZTtUC}/_ssgManifest.js +0 -0
|
@@ -13,4 +13,4 @@ ${b}
|
|
|
13
13
|
`),a.exit(c)}g.resolve;class x extends Error{constructor(a){super(`pack-cmd exit ${a}`),this.code=a,this.name="ExitSentinel"}}function y(){let a=[],b=[];return{io:{writeStdout:b=>{a.push(b)},writeStderr:a=>{b.push(a)},exit:a=>{throw new x(a)}},stdout:a,stderr:b}}async function z(a){if(0===a.slug.trim().length)return{ok:!1,error:"slug_required",howToFix:"Provide a non-empty pack slug.",exitCode:64,stdout:"",stderr:""};let b=y(),c={...void 0!==a.cwd?{cwd:a.cwd}:{},...void 0!==a.mode?{mode:a.mode}:{},...void 0!==a.force?{force:a.force}:{}},d=0;try{await t(a.slug,c,b.io)}catch(a){a instanceof x?d=a.code:(b.stderr.push(a.message),d=1)}let e=C(b.stdout.join("")),f=C(b.stderr.join(""));return 0===d?{ok:!0,slug:a.slug,stdout:e,stderr:f}:f.includes("no pack at")||f.includes("pack not found")?{ok:!1,error:"pack_not_found",howToFix:`No pack at docs/feature-packs/${a.slug}/. Verify the slug or scaffold one with \`coodra pack new ${a.slug}\`.`,exitCode:d,stdout:e,stderr:f}:{ok:!1,error:"unknown_failure",howToFix:f.split("\n").slice(0,3).join(" ").slice(0,240)||"Pack regenerate failed; check ~/.coodra/logs/.",exitCode:d,stdout:e,stderr:f}}async function A(a){if(0===a.slug.trim().length)return{ok:!1,error:"slug_required",howToFix:"Provide a non-empty pack slug.",exitCode:64,stdout:"",stderr:""};let b=y(),c={force:!0,...void 0!==a.cwd?{cwd:a.cwd}:{}},d=0;try{await u(a.slug,c,b.io)}catch(a){a instanceof x?d=a.code:(b.stderr.push(a.message),d=1)}let e=C(b.stdout.join("")),f=C(b.stderr.join(""));return 0===d?{ok:!0,slug:a.slug,dirRemoved:e.includes("Deleted"),dbRowDeactivated:e.includes("flipped to false"),stdout:e,stderr:f}:f.includes("no pack at")?{ok:!1,error:"pack_not_found",howToFix:`No pack at docs/feature-packs/${a.slug}/.`,exitCode:d,stdout:e,stderr:f}:{ok:!1,error:"unknown_failure",howToFix:f.split("\n").slice(0,3).join(" ").slice(0,240)||"Pack delete failed; check ~/.coodra/logs/.",exitCode:d,stdout:e,stderr:f}}let B=/\x1b\[[0-9;]*[a-zA-Z]/g;function C(a){return a.replace(B,"")}var D=c(4781),E=c(40647),F=c(34017),G=c(23185),H=c(38092),I=c(80554),J=c(58671),K=c(94404),L=c(3068),M=c(10728),N=c(77829);let O=/^[a-z0-9_-]+$/,P=G.Ik({projectSlug:G.Yj().min(1).regex(O),packSlug:G.Yj().min(1).regex(O),cwd:G.Yj().min(1,"cwd is required").refine(a=>a.startsWith("/"),"cwd must be an absolute path")}),Q=P.extend({confirm:G.Yj().refine(a=>"yes"===a,"Tick the confirm box to regenerate.")}),R=P.extend({confirmation:G.Yj().min(1,"Type the confirmation phrase to delete.")}),S=P.extend({templateName:G.Yj().min(1,"Pick a template to install.").regex(/^[a-z0-9-]+$/,"Template name must be lowercase letters, digits, hyphens."),confirmation:G.Yj().min(1,"Type the confirmation phrase to install.")});async function T(a){(0,I._o)("regeneratePackAction"),await (0,I.Yn)("admin");let b={projectSlug:String(a.get("projectSlug")??""),packSlug:String(a.get("packSlug")??""),cwd:String(a.get("cwd")??""),confirm:String(a.get("confirm")??"")},c=Q.safeParse(b);c.success||(0,F.redirect)(Z(b.projectSlug,b.packSlug,"regen_validation_failed",$(c.error)));let d=await z({slug:c.data.packSlug,cwd:c.data.cwd,mode:"default"});d.ok||(0,F.redirect)(Z(c.data.projectSlug,c.data.packSlug,d.error,d.howToFix)),(0,F.redirect)(`${Y(c.data.projectSlug,c.data.packSlug)}?regenerated=1`)}async function U(a){(0,I._o)("deletePackAction"),await (0,I.Yn)("admin");let b={projectSlug:String(a.get("projectSlug")??""),packSlug:String(a.get("packSlug")??""),cwd:String(a.get("cwd")??""),confirmation:String(a.get("confirmation")??"")},c=R.safeParse(b);c.success||(0,F.redirect)(Z(b.projectSlug,b.packSlug,"delete_validation_failed",$(c.error)));let d=`delete ${c.data.packSlug}`;c.data.confirmation!==d&&(0,F.redirect)(Z(c.data.projectSlug,c.data.packSlug,"delete_confirmation_mismatch",`Confirmation phrase must be "${d}" exactly.`));let e=await A({slug:c.data.packSlug,cwd:c.data.cwd});e.ok||(0,F.redirect)(Z(c.data.projectSlug,c.data.packSlug,e.error,e.howToFix)),(0,F.redirect)(`/packs?deleted=${encodeURIComponent(c.data.packSlug)}`)}let V=/^\/projects\/[a-z0-9_-]+$/;async function W(a){(0,I._o)("installTemplateAction"),await (0,I.Yn)("admin");let b={projectSlug:String(a.get("projectSlug")??""),packSlug:String(a.get("packSlug")??""),cwd:String(a.get("cwd")??""),templateName:String(a.get("templateName")??""),confirmation:String(a.get("confirmation")??"")},c=String(a.get("returnTo")??""),d=V.test(c)?c:null,e=S.safeParse(b);e.success||(0,F.redirect)(X(d,b.projectSlug,b.packSlug,"install_validation_failed",$(e.error)));let f=`install ${e.data.templateName}`;e.data.confirmation!==f&&(0,F.redirect)(X(d,e.data.projectSlug,e.data.packSlug,"install_confirmation_mismatch",`Confirmation phrase must be "${f}" exactly.`));let g=await (0,h.E)({cwd:e.data.cwd,projectSlug:e.data.packSlug,ide:"claude",noGraphify:!0,template:e.data.templateName,mode:"default",force:!0});if(g.ok||(0,F.redirect)(X(d,e.data.projectSlug,e.data.packSlug,g.error,g.howToFix)),null!==d){let a=new URLSearchParams;a.set("templateInstalled",e.data.templateName),(0,F.redirect)(`${d}?${a.toString()}`)}(0,F.redirect)(`${Y(e.data.projectSlug,e.data.packSlug)}?installed=${encodeURIComponent(e.data.templateName)}`)}function X(a,b,c,d,e){if(null!==a){let b=new URLSearchParams;return b.set("error",d),b.set("errorMessage",e),`${a}?${b.toString()}`}return Z(b,c,d,e)}function Y(a,b){return`/packs/${encodeURIComponent(b)}`}function Z(a,b,c,d){let e=new URLSearchParams;return e.set("error",c),e.set("errorMessage",d),`${Y(a,b)}?${e.toString()}`}function $(a){let b=a.issues[0];if(void 0===b)return"invalid form data";let c=b.path.length>0?`${b.path.join(".")}: `:"";return`${c}${b.message}`}let _=P.extend({fileName:G.k5(["spec.md","implementation.md","techstack.md"]),mtimeMs:H.ai().int().nonnegative(),content:G.Yj().max(1e6,"content exceeds 1MB")});async function aa(a){let b;(0,I._o)("saveFeaturePackAction"),await (0,I.Yn)("member");let c={projectSlug:String(a.get("projectSlug")??""),packSlug:String(a.get("packSlug")??""),cwd:String(a.get("cwd")??""),fileName:String(a.get("fileName")??""),mtimeMs:String(a.get("mtimeMs")??"0"),content:String(a.get("content")??"")},d=_.safeParse(c);d.success||(0,F.redirect)(ab(c.projectSlug,c.packSlug,c.fileName,"save_validation_failed",$(d.error)));let{projectSlug:e,packSlug:h,cwd:i,fileName:j,mtimeMs:k,content:l}=d.data,m=await (0,M.S$)(h,i);null===m&&(0,F.redirect)(ab(e,h,j,"pack_not_found",`No pack at docs/feature-packs/${h}/.`));let n=(0,g.join)(m.dir,j);try{b=(0,f.statSync)(n).mtimeMs}catch{(0,F.redirect)(ab(e,h,j,"file_missing",`File ${j} no longer exists on disk.`))}Math.floor(b)!==Math.floor(k)&&(0,F.redirect)(ab(e,h,j,"concurrent_edit",`${j} changed on disk since you opened the editor. Reload to pick up the latest version, then re-apply your edit.`));let o=function(a){try{return(0,f.readFileSync)(a,"utf8")}catch{return""}}(n),p=(0,L.V)(o),q=(0,L.V)(l);q.errors.length>0&&(0,F.redirect)(ab(e,h,j,"parse_failed",function(a){if(0===a.length)return"";let b=a.slice(0,3).map(a=>`line ${a.line}: ${a.code} — ${a.message}`),c=a.length>3?` (+${a.length-3} more)`:"";return b.join(" | ")+c}(q.errors)));let r=function(a,b){let c=a.sections.map(a=>a.name),d=b.sections.map(a=>a.name),e=new Set(c),f=new Set(d),g=d.filter(a=>!e.has(a)),h=c.filter(a=>!f.has(a)),i=c.filter(a=>f.has(a)),j=d.filter(a=>e.has(a)),k=[];for(let a=0;a<i.length;a++)if(i[a]!==j[a]){let b=i[a];"string"==typeof b&&k.push(b)}return{added:g,removed:h,reordered:k}}(p,q);(0!==r.added.length||0!==r.removed.length||0!==r.reordered.length)&&(0,F.redirect)(ab(e,h,j,"markers_tampered",`Auto-marker set must remain unchanged. ${function(a){let b=[];return a.removed.length>0&&b.push(`removed: ${a.removed.join(", ")}`),a.added.length>0&&b.push(`added: ${a.added.join(", ")}`),a.reordered.length>0&&b.push(`reordered: ${a.reordered.join(", ")}`),0===b.length?"no changes":b.join(" / ")}(r)}. Use "Regenerate" or "Install template" to add/remove sections.`));try{(0,f.writeFileSync)(n,l,"utf8")}catch(a){(0,F.redirect)(ab(e,h,j,"write_failed",a.message))}(0,F.redirect)(`${Y(e,h)}?edited=${encodeURIComponent(j)}`)}function ab(a,b,c,d,e){let f=new URLSearchParams;return f.set("file",c),f.set("error",d),f.set("errorMessage",e),`/packs/${encodeURIComponent(b)}/edit?${f.toString()}`}let ac=/^[a-z0-9_-]+$/,ad=G.Ik({slug:G.Yj().min(1,"slug is required").max(64,"slug is too long").regex(ac,"slug must be lowercase letters, digits, hyphens or underscores"),parentSlug:G.Yj().regex(ac,"parentSlug must be lowercase letters, digits, hyphens or underscores").optional(),content:G.Yj().min(1,"paste markdown body or attach a .md file").max(2e6,"content exceeds 2MB"),force:G.zM().optional(),projectSlug:G.Yj().regex(ac,"projectSlug must be lowercase letters, digits, hyphens or underscores").optional(),linkAsParent:G.zM().optional()}).refine(a=>a.parentSlug!==a.slug,{message:"a pack cannot be its own parent",path:["parentSlug"]});async function ae(a){await (0,I.Yn)("member");let b="team-hosted"===(0,K.resolveDeploymentMode)(),c=String(a.get("content")??""),d=a.get("file"),e=String(a.get("projectSlug")??"").trim(),h=e.length>0?e:void 0,i=String(a.get("projectCwd")??"").trim(),j=i.length>0&&i.startsWith("/")?i:process.cwd();d instanceof File&&d.size>0&&(d.size>2e6&&(0,F.redirect)(ag(h,"upload_too_large",`File ${d.name} exceeds 2MB.`)),c=await d.text());let k=String(a.get("slug")??"").trim(),l=String(a.get("parentSlug")??"").trim(),m="on"===a.get("force")||"true"===a.get("force"),n="on"===a.get("linkAsParent")||"true"===a.get("linkAsParent"),o=ad.safeParse({slug:k,...l.length>0?{parentSlug:l}:{},content:c,force:m,...void 0!==h?{projectSlug:h}:{},linkAsParent:n});o.success||(0,F.redirect)(ag(h,"upload_validation_failed",$(o.error)));let{slug:p,parentSlug:q,content:r,force:s,linkAsParent:t}=o.data,u=(0,M.jp)(j),v=(0,g.join)(u,p),w=(0,g.join)(v,"spec.md"),x=(0,g.join)(v,"meta.json"),y=void 0!==h&&t&&p!==h;if(y&&void 0!==h){let a=(0,g.join)(u,h,"meta.json");(0,f.existsSync)(a)||(0,F.redirect)(ag(h,"primary_pack_missing",`Project '${h}' has no primary pack to link onto. Submit again with slug=${h} (replace primary directly), or run /init to bootstrap with a template.`)),q===h&&(0,F.redirect)(ag(h,"parent_cycle",`Cannot link: pack '${p}' already has parentSlug='${h}', and auto-link would point '${h}'→'${p}'. Drop the parentSlug field, or untick auto-link.`))}let z=!1;if((0,f.existsSync)(v)&&!s){let a=(await (0,M.Xj)(j)).find(a=>a.slug===p);void 0!==a&&a.isTemplateStub?z=!0:(0,F.redirect)(ag(h,"pack_exists",`Pack '${p}' already exists at ${v}. Tick "overwrite" to replace its spec.md, or pick a different slug.`))}if(!b)try{(0,f.mkdirSync)(v,{recursive:!0}),(0,f.writeFileSync)(w,r,"utf8"),(0,f.writeFileSync)(x,`${JSON.stringify({slug:p,parentSlug:q??null,sourceFiles:[],isActive:!0,kind:"freeform",status:"published"},null,2)}
|
|
14
14
|
`,"utf8")}catch(a){(0,F.redirect)(ag(h,"write_failed",a.message))}try{await ah({slug:p,parentSlug:q??null,content:{spec:r,implementation:"",techstack:"",meta:{slug:p,parentSlug:q??null,sourceFiles:[],isActive:!0,kind:"freeform"},sourceFiles:[]}})}catch(a){b&&(0,F.redirect)(ag(h,"cloud_write_failed",a.message)),console.warn("uploadPackAction: cloud-sync mirror failed",a)}if(y&&void 0!==h&&!b){let a=(0,g.join)(u,h,"meta.json");try{let b=(0,f.readFileSync)(a,"utf8"),c=M.YG.safeParse(JSON.parse(b));c.success||(0,F.redirect)(ag(h,"primary_meta_invalid",`Primary pack's meta.json failed validation: ${c.error.issues.map(a=>a.message).join("; ")}.`));let d={...c.data,parentSlug:p};(0,f.writeFileSync)(a,`${JSON.stringify(d,null,2)}
|
|
15
15
|
`,"utf8")}catch(a){(0,F.redirect)(ag(h,"link_write_failed",a.message))}}if(void 0!==h){let a=new URLSearchParams;a.set("packUploaded",p),a.set("linked",y?"1":"0"),z&&a.set("replaced","stub"),(0,F.redirect)(`/projects/${encodeURIComponent(h)}?${a.toString()}`)}(0,F.redirect)(`/packs/${encodeURIComponent(p)}?uploaded=1${z?"&replaced=stub":""}`)}async function af(a){let b,{assertCanEditKnowledge:d}=await Promise.resolve().then(c.bind(c,23265));d(await (await Promise.resolve().then(c.bind(c,14320))).getActor(),{createdByUserId:null},{allowOwner:!1});let e=String(a.get("slug")??"").trim();0!==e.length&&ac.test(e)||(0,F.redirect)("/packs?error=invalid_slug");let h=(0,J.f)();if("sqlite"===h.kind){let a=(await h.db.select().from(D.GB.featurePacks).where((0,E.eq)(D.GB.featurePacks.slug,e)).limit(1))[0];void 0===a&&(0,F.redirect)(`/packs/${encodeURIComponent(e)}?error=pack_not_found`),b="published"===a.status?"draft":"published",await h.db.update(D.GB.featurePacks).set({status:b,updatedAt:new Date}).where((0,E.eq)(D.GB.featurePacks.slug,e))}else{let a=(await h.db.select().from(D.bx.featurePacks).where((0,E.eq)(D.bx.featurePacks.slug,e)).limit(1))[0];void 0===a&&(0,F.redirect)(`/packs/${encodeURIComponent(e)}?error=pack_not_found`),b="published"===a.status?"draft":"published",await h.db.update(D.bx.featurePacks).set({status:b,updatedAt:new Date}).where((0,E.eq)(D.bx.featurePacks.slug,e))}if("sqlite"===h.kind)try{let a=[];for(let b of h.raw.prepare("SELECT cwd FROM projects WHERE cwd IS NOT NULL AND slug NOT LIKE '\\_\\_%' ESCAPE '\\'").all())a.push((0,g.join)((0,M.jp)(b.cwd),e,"meta.json"));a.push((0,g.join)((0,M.jp)(process.cwd()),e,"meta.json"));let c=new Set;for(let d of a)if(!c.has(d)&&(c.add(d),(0,f.existsSync)(d)))try{let a=(0,f.readFileSync)(d,"utf8"),c=JSON.parse(a);c.status=b,(0,f.writeFileSync)(d,`${JSON.stringify(c,null,2)}
|
|
16
|
-
`,"utf8")}catch(a){console.warn("togglePackStatusAction: meta.json parse/write failed at",d,a)}}catch(a){console.warn("togglePackStatusAction: meta.json sync skipped",a)}if("sqlite"===h.kind&&"team"===process.env.COODRA_MODE)try{await (0,D.s0)(h,{queue:"sync_to_cloud",payload:{v:1,table:"feature_packs",lookup:{kind:"idempotency_key",value:e}}})}catch(a){console.warn("togglePackStatusAction: sync enqueue failed",a)}(0,F.redirect)(`/packs/${encodeURIComponent(e)}?statusFlipped=${b}`)}function ag(a,b,c){let d=new URLSearchParams;return(d.set("error",b),d.set("errorMessage",c),void 0!==a)?`/projects/${encodeURIComponent(a)}/packs/new?${d.toString()}`:`/packs/new?${d.toString()}`}async function ah(a){let b=(0,J.f)(),c=`sha256:${(0,e.createHash)("sha256").update(a.content.spec).update(a.content.implementation).update(a.content.techstack).digest("hex")}`,d=JSON.stringify({spec:a.content.spec,implementation:a.content.implementation,techstack:a.content.techstack,meta:a.content.meta,sourceFiles:[...a.content.sourceFiles]}),f=new Date;if("postgres"===b.kind){let g=(await b.db.select().from(D.bx.featurePacks).where((0,E.eq)(D.bx.featurePacks.slug,a.slug)).limit(1))[0],h=g?.id??`fp_${(0,e.randomUUID)()}`,i=g?.isActive??!0;await b.db.insert(D.bx.featurePacks).values({id:h,slug:a.slug,parentSlug:a.parentSlug,isActive:i,checksum:c,contentJson:d,status:g?.status??"published",updatedAt:f}).onConflictDoUpdate({target:D.bx.featurePacks.slug,set:{parentSlug:a.parentSlug,checksum:c,contentJson:d,updatedAt:f}});return}let g=(await b.db.select().from(D.GB.featurePacks).where((0,E.eq)(D.GB.featurePacks.slug,a.slug)).limit(1))[0],h=g?.id??`fp_${(0,e.randomUUID)()}`,i=g?.isActive??!0;if(await b.db.insert(D.GB.featurePacks).values({id:h,slug:a.slug,parentSlug:a.parentSlug,isActive:i,checksum:c,contentJson:d,status:g?.status??"published",updatedAt:f}).onConflictDoUpdate({target:D.GB.featurePacks.slug,set:{parentSlug:a.parentSlug,checksum:c,contentJson:d,updatedAt:f}}),"team"===process.env.COODRA_MODE)try{await (0,D.s0)(b,{queue:"sync_to_cloud",payload:{v:1,table:"feature_packs",lookup:{kind:"idempotency_key",value:a.slug}}})}catch(a){console.warn("mirrorPackToDbAndEnqueue: sync_to_cloud enqueue failed (will retry on next pack mutation)",a)}}(0,N.D)([T,U,W,aa,ae,af]),(0,d.A)(T,"
|
|
16
|
+
`,"utf8")}catch(a){console.warn("togglePackStatusAction: meta.json parse/write failed at",d,a)}}catch(a){console.warn("togglePackStatusAction: meta.json sync skipped",a)}if("sqlite"===h.kind&&"team"===process.env.COODRA_MODE)try{await (0,D.s0)(h,{queue:"sync_to_cloud",payload:{v:1,table:"feature_packs",lookup:{kind:"idempotency_key",value:e}}})}catch(a){console.warn("togglePackStatusAction: sync enqueue failed",a)}(0,F.redirect)(`/packs/${encodeURIComponent(e)}?statusFlipped=${b}`)}function ag(a,b,c){let d=new URLSearchParams;return(d.set("error",b),d.set("errorMessage",c),void 0!==a)?`/projects/${encodeURIComponent(a)}/packs/new?${d.toString()}`:`/packs/new?${d.toString()}`}async function ah(a){let b=(0,J.f)(),c=`sha256:${(0,e.createHash)("sha256").update(a.content.spec).update(a.content.implementation).update(a.content.techstack).digest("hex")}`,d=JSON.stringify({spec:a.content.spec,implementation:a.content.implementation,techstack:a.content.techstack,meta:a.content.meta,sourceFiles:[...a.content.sourceFiles]}),f=new Date;if("postgres"===b.kind){let g=(await b.db.select().from(D.bx.featurePacks).where((0,E.eq)(D.bx.featurePacks.slug,a.slug)).limit(1))[0],h=g?.id??`fp_${(0,e.randomUUID)()}`,i=g?.isActive??!0;await b.db.insert(D.bx.featurePacks).values({id:h,slug:a.slug,parentSlug:a.parentSlug,isActive:i,checksum:c,contentJson:d,status:g?.status??"published",updatedAt:f}).onConflictDoUpdate({target:D.bx.featurePacks.slug,set:{parentSlug:a.parentSlug,checksum:c,contentJson:d,updatedAt:f}});return}let g=(await b.db.select().from(D.GB.featurePacks).where((0,E.eq)(D.GB.featurePacks.slug,a.slug)).limit(1))[0],h=g?.id??`fp_${(0,e.randomUUID)()}`,i=g?.isActive??!0;if(await b.db.insert(D.GB.featurePacks).values({id:h,slug:a.slug,parentSlug:a.parentSlug,isActive:i,checksum:c,contentJson:d,status:g?.status??"published",updatedAt:f}).onConflictDoUpdate({target:D.GB.featurePacks.slug,set:{parentSlug:a.parentSlug,checksum:c,contentJson:d,updatedAt:f}}),"team"===process.env.COODRA_MODE)try{await (0,D.s0)(b,{queue:"sync_to_cloud",payload:{v:1,table:"feature_packs",lookup:{kind:"idempotency_key",value:a.slug}}})}catch(a){console.warn("mirrorPackToDbAndEnqueue: sync_to_cloud enqueue failed (will retry on next pack mutation)",a)}}(0,N.D)([T,U,W,aa,ae,af]),(0,d.A)(T,"40e74157c0ddaa5411d4cb7647055de837dd3b512f",null),(0,d.A)(U,"40e20e4d87e1c8f66555f672a65ddafe0909a4fd21",null),(0,d.A)(W,"40e925e2a966694719b1082b7f28e13251a9f44246",null),(0,d.A)(aa,"40dbfec2432ba3c6bde0798ff5e0b5065e83e33ea8",null),(0,d.A)(ae,"4064cbdf3ba1d011846a8c8b7f7052bcac451ed39e",null),(0,d.A)(af,"405e75bb549f10f48d91f81fc538fd8388c8a56db4",null)}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports.id=4914,exports.ids=[4914],exports.modules={15666:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,57345,23))},32524:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"003d61628a725ad59e477db320f0ad341115f2c639":()=>f.Fu,"00916480eb919672fdd17de845bb84240342ad2dd7":()=>f.CO,"40428d9616f282774be2df0136e9d4016d978a703b":()=>f.tN,"40508ad409c4a106f7516a55d60d1872e0e2bd2aa1":()=>g.KH,"40aacf0f0682a043437d56f06ee9f8a3415bc6a5aa":()=>g.Qn,"40e19c14fae3278d8efbeac51682cb1ea350eef79c":()=>g.n0,"40fddfa25fb7ce0478bd780d21836ec83f8e311689":()=>f.tq,"7f2749d032f0afec62b21938650725da230c9ddb55":()=>e.AZ,"7f39cf1936cdea607f9634f63903e1638838bec4ef":()=>e.ot,"7f3bacf1b5be428b6de0e21c225852d5e445f32fa2":()=>e.at,"7f42572b80e21ebb4088d8083f7f110428fc0bed52":()=>e.ai,"7fd9acc10a0b938c95f2683ddf67602bd5d8b3f7c2":()=>d.i,"7fe9be32f34a22960c3599590a321cb6bc1ffa8285":()=>d.$});var d=c(36388),e=c(72610),f=c(44574),g=c(86043)},39226:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,90919,23))},39355:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"7f3ad27032b60fdc621e9c3aeb59027dcbe2ffbc6a":()=>d.y});var d=c(47421)},60338:(a,b,c)=>{"use strict";c.d(b,{CF:()=>i,Ss:()=>g,jm:()=>f,nq:()=>h});var d=c(4781),e=c(58671);async function f(a=null){let b=(0,e.f)();return(0,d.jm)(b,a)}async function g(a){let b=(0,e.f)();return(0,d.Ss)(b,a)}async function h(a,b,c){let f=(0,e.f)();return(0,d.nq)(f,a,b,void 0===c?{}:{projectId:c})}async function i(a){let b=(0,e.f)();return(0,d.CF)(b,a)}},86043:(a,b,c)=>{"use strict";c.d(b,{KH:()=>n,Qn:()=>l,n0:()=>m});var d=c(38679);c(60681);var e=c(89244),f=c(34017),g=c(23185),h=c(80554),i=c(60338),j=c(77829);let k=g.Ik({projectId:g.Yj().min(1),policyName:g.Yj().optional(),matchToolName:g.Yj().min(1,"tool name is required"),matchPathGlob:g.Yj().optional(),matchAgentType:g.Yj().optional(),matchEventType:g.k5(["PreToolUse","PostToolUse"]).optional(),decision:g.k5(["allow","deny","ask"]),reason:g.Yj().min(1,"reason is required"),priority:g.Yj().optional().transform(a=>void 0===a||""===a?void 0:Number.parseInt(a,10))});async function l(a){await (0,h.Yn)("admin");let b=k.safeParse({projectId:a.get("projectId")??"",policyName:a.get("policyName")??void 0,matchToolName:a.get("matchToolName")??"",matchPathGlob:a.get("matchPathGlob")??void 0,matchAgentType:a.get("matchAgentType")??void 0,matchEventType:a.get("matchEventType")??void 0,decision:a.get("decision")??"",reason:a.get("reason")??"",priority:a.get("priority")??void 0});if(!b.success){let a=b.error.issues.map(a=>`${a.path.join(".")}: ${a.message}`).join("; ");(0,f.redirect)(`/policies?error=${encodeURIComponent(a)}`)}let c=b.data;try{let a=await (0,i.Ss)({projectId:c.projectId,matchToolName:c.matchToolName,decision:c.decision,reason:c.reason,...void 0!==c.policyName&&""!==c.policyName?{policyName:c.policyName}:{},...void 0!==c.matchPathGlob&&""!==c.matchPathGlob?{matchPathGlob:c.matchPathGlob}:{},...void 0!==c.matchAgentType&&""!==c.matchAgentType?{matchAgentType:c.matchAgentType}:{},...void 0!==c.matchEventType?{matchEventType:c.matchEventType}:{},...void 0!==c.priority?{priority:c.priority}:{}});(0,e.revalidatePath)("/policies"),(0,f.redirect)(`/policies?added=${encodeURIComponent(a.ruleId)}`)}catch(a){if(a instanceof Error&&"NEXT_REDIRECT"===a.message)throw a;(0,f.redirect)(`/policies?error=${encodeURIComponent(a.message)}`)}}async function m(a){await (0,h.Yn)("admin");let b=String(a.get("identifier")??""),c="true"===a.get("active"),d=a.get("projectId");0===b.length&&(0,f.redirect)("/policies?error=missing_identifier"),await (0,i.nq)(b,c,"string"==typeof d&&d.length>0?d:void 0),(0,e.revalidatePath)("/policies"),(0,f.redirect)(`/policies?toggled=${c?"enabled":"disabled"}`)}async function n(a){await (0,h.Yn)("admin");let b=String(a.get("ruleId")??""),c=String(a.get("returnTo")??"/policies");0===b.length&&(0,f.redirect)(`${c}?error=missing_rule_id`);try{let a=await (0,i.CF)(b);(0,e.revalidatePath)("/policies"),a&&(0,f.redirect)(`${c}?deleted=${encodeURIComponent(b.slice(0,12))}`),(0,f.redirect)(`${c}?error=rule_not_found`)}catch(a){if(a instanceof Error&&"NEXT_REDIRECT"===a.message)throw a;(0,f.redirect)(`${c}?error=${encodeURIComponent(a.message)}`)}}(0,j.D)([l,m,n]),(0,d.A)(l,"40aacf0f0682a043437d56f06ee9f8a3415bc6a5aa",null),(0,d.A)(m,"40e19c14fae3278d8efbeac51682cb1ea350eef79c",null),(0,d.A)(n,"40508ad409c4a106f7516a55d60d1872e0e2bd2aa1",null)},89855:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>l,dynamic:()=>k});var d=c(18234),e=c(57345),f=c.n(e),g=c(77716),h=c(86043),i=c(60338),j=c(21074);let k="force-dynamic";async function l({searchParams:a}){let b=await a,c=await (0,j.hF)(),e=void 0!==b.project&&""!==b.project?await (0,j.getProject)(b.project):null,k=await (0,i.jm)(e?.id??null),l=new Map(c.map(a=>[a.id,a.slug])),r=k.flatMap(a=>a.rules.map(b=>({ruleId:b.id,policyName:a.name,policyId:a.id,projectId:a.projectId,decision:b.decision,matchEventType:b.matchEventType,matchToolName:b.matchToolName,matchPathGlob:b.matchPathGlob,reason:b.reason,priority:b.priority,active:a.isActive}))),s=null!==e?r.map(a=>({signature:a.ruleId,decision:a.decision,matchEventType:a.matchEventType,matchToolName:a.matchToolName,matchPathGlob:a.matchPathGlob,reason:a.reason,priority:a.priority,appliesTo:[{projectId:a.projectId,slug:l.get(a.projectId)??a.projectId.slice(0,8)}],ruleIds:[a.ruleId]})):function(a,b){let c=new Map;for(let d of a){let a=`${d.matchEventType}|${d.matchToolName}|${d.matchPathGlob??"_"}|${d.decision}|${d.reason}`,e=c.get(a);void 0===e&&(e={signature:a,decision:d.decision,matchEventType:d.matchEventType,matchToolName:d.matchToolName,matchPathGlob:d.matchPathGlob,reason:d.reason,priority:d.priority,appliesTo:[],ruleIds:[],_appliesTo:new Map},c.set(a,e)),e._appliesTo.has(d.projectId)||e._appliesTo.set(d.projectId,{projectId:d.projectId,slug:b.get(d.projectId)??d.projectId.slice(0,8)}),e.ruleIds.push(d.ruleId)}let d=[];for(let a of c.values()){let b=[...a._appliesTo.values()].sort((a,b)=>a.slug.localeCompare(b.slug));d.push({signature:a.signature,decision:a.decision,matchEventType:a.matchEventType,matchToolName:a.matchToolName,matchPathGlob:a.matchPathGlob,reason:a.reason,priority:a.priority,appliesTo:b,ruleIds:a.ruleIds})}return d.sort((a,b)=>{if(a.priority!==b.priority)return a.priority-b.priority;let c=a=>"deny"===a?0:"ask"===a?1:2;return c(a.decision)-c(b.decision)}),d}(r,l),t=r.length,u=k.length,v=null===e&&s.length<r.length;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(g.b,{crumb:"Policies",crumbPrefix:null!==e?`coodra / ${e.slug}`:"coodra"}),(0,d.jsxs)("section",{className:"screen",children:[(0,d.jsxs)("div",{className:"head",children:[(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"head__num",children:["/03 \xb7 GOVERN \xb7 POLICIES",null!==e?` \xb7 ${e.slug.toUpperCase()}`:""]}),(0,d.jsxs)("h1",{className:"head__title",children:[(0,d.jsx)("em",{children:"Policies"}),", by the rule."]}),(0,d.jsxs)("p",{className:"head__lede",children:["Deny lists are loud, allow lists are quiet. Every tool call passes through the chain in order; first match wins.",null!==e?(0,d.jsxs)(d.Fragment,{children:[" Scoped to ",(0,d.jsx)("span",{style:{fontFamily:"var(--mono)",color:"var(--accent)"},children:e.slug})," — ",(0,d.jsx)(f(),{href:"/policies",style:{textDecoration:"underline",color:"var(--ink-dim)"},children:"show all"}),"."]}):null]})]}),(0,d.jsx)("div",{children:(0,d.jsxs)("div",{className:"head__meta",children:[(0,d.jsxs)("strong",{children:[t," rules"]}),(0,d.jsx)("br",{}),v?(0,d.jsxs)(d.Fragment,{children:[s.length," unique \xb7 ",(0,d.jsx)("em",{style:{color:"var(--ink-dim)"},children:"collapsed"})]}):(0,d.jsxs)(d.Fragment,{children:[u," ",1===u?"policy":"policies"]}),(0,d.jsx)("br",{}),null!==e?e.slug:"all projects"]})})]}),void 0!==b.added?(0,d.jsxs)(m,{tone:"ok",children:["Rule added \xb7 ",b.added.slice(0,8)]}):null,void 0!==b.toggled?(0,d.jsxs)(m,{tone:"ok",children:["Policy ",b.toggled]}):null,void 0!==b.deleted?(0,d.jsxs)(m,{tone:"ok",children:["Rule deleted \xb7 ",b.deleted]}):null,void 0!==b.error?(0,d.jsxs)(m,{tone:"warn",children:["Error: ",b.error]}):null,(0,d.jsxs)("div",{className:"card",style:{padding:28,marginBottom:24},children:[(0,d.jsxs)("div",{className:"card__head",children:[(0,d.jsxs)("h2",{className:"card__title",children:["Rule ",(0,d.jsx)("em",{children:"chain"})]}),(0,d.jsx)("span",{className:"card__role",children:v?`unique signatures \xb7 ${s.length} of ${t} rules \xb7 scope a project to expand`:"priority \xb7 top to bottom"})]}),0===s.length?(0,d.jsxs)("div",{className:"empty",children:[(0,d.jsxs)("strong",{children:["No rules ",(0,d.jsx)("em",{children:"yet"}),"."]}),"Add one below or run"," ",(0,d.jsx)("span",{style:{fontFamily:"var(--mono)",color:"var(--accent)"},children:"coodra init"})," to seed the default chain."]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"policy-row",style:{background:"transparent",border:"none",borderBottom:"1px solid var(--rule)",paddingLeft:0,paddingRight:0,color:"var(--ink-mute)",fontSize:9,letterSpacing:"0.2em",textTransform:"uppercase",fontWeight:500},children:[(0,d.jsx)("div",{children:"Verdict"}),(0,d.jsx)("div",{children:"Tool \xb7 path"}),(0,d.jsx)("div",{children:"Reason"}),(0,d.jsx)("div",{children:v?"Applies to":"Policy"}),(0,d.jsx)("div",{style:{textAlign:"right"},children:"Priority"})]}),s.map(a=>(0,d.jsxs)("div",{className:"policy-row",children:[(0,d.jsx)("div",{className:"policy-row__verdict",style:{color:"deny"===a.decision?"var(--warn)":"ask"===a.decision?"var(--caution)":"var(--accent)"},children:a.decision.toUpperCase()}),(0,d.jsxs)("div",{className:"policy-row__pattern",children:[a.matchToolName,null!==a.matchPathGlob?` \xb7 ${a.matchPathGlob}`:""]}),(0,d.jsx)("div",{className:"policy-row__reason",children:a.reason}),(0,d.jsx)("div",{style:{fontFamily:"var(--mono)",fontSize:10,color:"var(--ink-dim)",letterSpacing:"0.04em",display:"flex",flexWrap:"wrap",gap:4},children:v?a.appliesTo.length===c.length?(0,d.jsxs)("span",{style:{color:"var(--accent)"},children:["all ",a.appliesTo.length," projects"]}):a.appliesTo.length>4?(0,d.jsxs)("span",{title:a.appliesTo.map(a=>a.slug).join(", "),children:[a.appliesTo.length," projects"]}):a.appliesTo.map(a=>(0,d.jsx)(f(),{href:`/policies?project=${encodeURIComponent(a.slug)}`,style:{color:"var(--ink-dim)",textDecoration:"none"},children:a.slug},a.projectId)):a.appliesTo[0]?.slug??"—"}),(0,d.jsxs)("div",{className:"policy-row__hits",style:{display:"flex",alignItems:"center",gap:12,justifyContent:"flex-end"},children:[(0,d.jsx)("span",{children:a.priority}),v||void 0===a.ruleIds[0]?null:(0,d.jsxs)("form",{action:h.KH,style:{display:"inline"},children:[(0,d.jsx)("input",{type:"hidden",name:"ruleId",value:a.ruleIds[0]}),(0,d.jsx)("input",{type:"hidden",name:"returnTo",value:null!==e?`/policies?project=${encodeURIComponent(e.slug)}`:"/policies"}),(0,d.jsx)("button",{type:"submit",title:`Delete rule (${a.ruleIds[0].slice(0,8)}) — applies immediately, no undo`,style:{background:"transparent",border:"1px solid var(--rule-strong)",color:"var(--ink-mute)",fontFamily:"var(--mono)",fontSize:9,letterSpacing:"0.18em",textTransform:"uppercase",padding:"4px 8px",cursor:"pointer"},children:"\xd7"})]})]})]},a.signature))]})]}),(0,d.jsxs)("div",{className:"dash-grid",children:[(0,d.jsxs)("div",{className:"aside-card",children:[(0,d.jsxs)("h3",{className:"aside-card__title",style:{marginBottom:14},children:["Add a ",(0,d.jsx)("em",{children:"rule"})]}),(0,d.jsxs)("form",{action:h.Qn,children:[c.length>1?(0,d.jsxs)("div",{className:"field",style:{marginBottom:14},children:[(0,d.jsx)("label",{htmlFor:"policy-project",className:"field__label",style:p,children:"Project"}),(0,d.jsx)("select",{id:"policy-project",name:"projectId",defaultValue:c[0]?.id??"",style:q,required:!0,children:c.map(a=>(0,d.jsx)("option",{value:a.id,children:a.slug},a.id))})]}):(0,d.jsx)("input",{type:"hidden",name:"projectId",value:c[0]?.id??"__global__"}),(0,d.jsx)(n,{label:"Tool name",name:"matchToolName",placeholder:"edit \xb7 read \xb7 bash",required:!0}),(0,d.jsx)(n,{label:"Path glob (optional)",name:"matchPathGlob",placeholder:"prod/.env"}),(0,d.jsx)(o,{label:"Decision",name:"decision",options:["deny","allow","ask"]}),(0,d.jsx)(n,{label:"Reason",name:"reason",placeholder:"Production secrets — never edit.",required:!0,textarea:!0}),(0,d.jsx)(n,{label:"Priority (optional)",name:"priority",placeholder:"100"}),(0,d.jsx)("button",{className:"btn btn--accent",style:{width:"100%"},type:"submit",children:"Add rule"})]})]}),(0,d.jsxs)("div",{className:"aside-card",children:[(0,d.jsxs)("h3",{className:"aside-card__title",style:{marginBottom:14},children:["Active ",(0,d.jsx)("em",{children:"policies"})]}),0===k.length?(0,d.jsx)("div",{style:{fontSize:13,color:"var(--ink-dim)"},children:"None."}):k.map(a=>(0,d.jsxs)("form",{action:h.n0,style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"14px 0",borderBottom:"1px solid var(--rule)",gap:12},children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{style:{fontFamily:"var(--serif)",fontSize:18},children:a.name}),(0,d.jsxs)("div",{style:{fontFamily:"var(--mono)",fontSize:10,color:"var(--ink-mute)",letterSpacing:"0.06em",marginTop:3},children:[a.rules.length," rules \xb7 ",a.id.slice(0,8)]})]}),(0,d.jsx)("input",{type:"hidden",name:"identifier",value:a.id}),(0,d.jsx)("input",{type:"hidden",name:"active",value:a.isActive?"false":"true"}),(0,d.jsxs)("button",{className:`badge ${a.isActive?"badge--ok":""}`,type:"submit",children:[(0,d.jsx)("span",{className:"badge__dot"}),a.isActive?"ON":"OFF"]})]},a.id))]})]})]})]})}function m({children:a,tone:b}){return(0,d.jsx)("div",{style:{padding:"12px 16px",marginBottom:24,border:`1px solid ${"warn"===b?"var(--warn)":"var(--accent)"}`,background:"warn"===b?"var(--warn-glow)":"var(--accent-glow)",fontFamily:"var(--mono)",fontSize:11,color:"warn"===b?"var(--warn)":"var(--accent)",letterSpacing:"0.08em"},children:a})}function n({label:a,name:b,placeholder:c,required:e,textarea:f}){let g=`policy-field-${b}`;return(0,d.jsxs)("div",{className:"field",style:{marginBottom:14},children:[(0,d.jsx)("label",{htmlFor:g,className:"field__label",style:{fontFamily:"var(--mono)",fontSize:9,letterSpacing:"0.2em",textTransform:"uppercase",color:"var(--ink-mute)",marginBottom:6,display:"block"},children:a}),f?(0,d.jsx)("textarea",{id:g,name:b,placeholder:c,required:e,style:q,rows:2}):(0,d.jsx)("input",{id:g,name:b,placeholder:c,required:e,style:q})]})}function o({label:a,name:b,options:c}){let e=`policy-select-${b}`;return(0,d.jsxs)("div",{className:"field",style:{marginBottom:14},children:[(0,d.jsx)("label",{htmlFor:e,className:"field__label",style:p,children:a}),(0,d.jsx)("select",{id:e,name:b,style:q,children:c.map(a=>(0,d.jsx)("option",{value:a,children:a},a))})]})}let p={fontFamily:"var(--mono)",fontSize:9,letterSpacing:"0.2em",textTransform:"uppercase",color:"var(--ink-mute)",marginBottom:6,display:"block"},q={width:"100%",padding:"10px 12px",background:"var(--bg)",border:"1px solid var(--rule-strong)",color:"var(--ink)",fontFamily:"var(--mono)",fontSize:12,letterSpacing:"0.04em"}}};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=
|
|
1
|
+
"use strict";exports.id=7012,exports.ids=[7012],exports.modules={3068:(a,b,c)=>{c.d(b,{V:()=>g});let d=/^<!--\s*@auto:\s*([a-z0-9-]+)\s*-->$/,e=/^<!--\s*\/@auto\s*-->$/,f=/^[a-z0-9][a-z0-9-]{0,63}$/;function g(a){let b=a.split("\n"),c=[],g=[],h=new Map,i=null,j=!1;for(let a=0;a<b.length;a++){let k=b[a]??"",l=k.trim();if(l.startsWith("```")){j=!j,null!==i&&i.innerLines.push(k);continue}if(j){null!==i&&i.innerLines.push(k);continue}let m=l.match(d),n=l.match(e);if(null!==m){let b=m[1]??"";if(!f.test(b)){g.push({code:"invalid_section_name",line:a+1,message:`section name "${b}" does not match grammar [a-z0-9][a-z0-9-]{0,63}`});continue}if(null!==i){g.push({code:"nested_open_tag",line:a+1,message:`nested <!-- @auto:${b} --> inside active section "${i.name}" (opened at line ${i.openLine})`}),i.innerLines.push(k);continue}let c=h.get(b);if(void 0!==c){g.push({code:"duplicate_section_name",line:a+1,message:`section "${b}" already opened at line ${c}`});continue}i={name:b,openLine:a+1,innerLines:[]},h.set(b,a+1);continue}if(null!==n){if(null===i){g.push({code:"unmatched_close_tag",line:a+1,message:"close tag without preceding open"});continue}c.push({name:i.name,openLine:i.openLine,closeLine:a+1,innerLines:[...i.innerLines]}),i=null;continue}null!==i&&i.innerLines.push(k)}return null!==i&&g.push({code:"missing_close_tag",line:i.openLine,message:`open tag for "${i.name}" at line ${i.openLine} has no matching <!-- /@auto -->`}),{sections:c,errors:g}}},9641:(a,b,c)=>{c.d(b,{S:()=>f});var d=c(73024),e=c(76760);function f(a,b){let c=[],f=null,g=function(a){let b=(0,e.join)(a,"package.json");if(!(0,d.existsSync)(b))return new Set;try{if(!(0,d.statSync)(b).isFile())return new Set;let a=(0,d.readFileSync)(b,"utf8"),c=JSON.parse(a),e=new Set;for(let a of Object.keys(c.dependencies??{}))e.add(a);for(let a of Object.keys(c.devDependencies??{}))e.add(a);return e}catch{return new Set}}(a);for(let h of b){let b=function(a,b,c){let f=b.meta.detect;if("generic"===b.meta.name&&0===f.files.length&&0===f.packageJsonDeps.length&&!f.cargoTomlPresent&&!f.goModPresent&&!f.pyprojectTomlPresent)return{matched:!0,reason:"fallback (generic)"};for(let b of f.files)if((0,d.existsSync)((0,e.join)(a,b)))return{matched:!0,reason:`file exists: ${b}`};for(let a of f.packageJsonDeps)if(c.has(a))return{matched:!0,reason:`package.json dep: ${a}`};return f.cargoTomlPresent&&(0,d.existsSync)((0,e.join)(a,"Cargo.toml"))?{matched:!0,reason:"Cargo.toml present"}:f.goModPresent&&(0,d.existsSync)((0,e.join)(a,"go.mod"))?{matched:!0,reason:"go.mod present"}:f.pyprojectTomlPresent&&(0,d.existsSync)((0,e.join)(a,"pyproject.toml"))?{matched:!0,reason:"pyproject.toml present"}:{matched:!1,reason:"no detection rule matched"}}(a,h,g);c.push({name:h.meta.name,matched:b.matched,reason:b.reason}),null===f&&b.matched&&(f=h)}return{chosen:f,considered:c}}},11086:(a,b,c)=>{c.d(b,{E:()=>aq});var d=c(77598),e=c(51455),f=c(48161),g=c(76760),h=c(4781),i=c(23265),j=c(40647),k=c(56589),l=c(14820),m=c(79766),n=c(23185);let o=["package.json","pyproject.toml","Cargo.toml",".git"];async function p(a,b={}){let c=await w(b.homeDir??(0,f.homedir)()),d=(0,g.resolve)(a),h=[];for(let a=0;a<12;a++){let a=[];for(let b of o)try{await (0,e.access)((0,g.join)(d,b)),a.push(b)}catch{}if(a.length>0){let b=await w(d);h.push({rootLex:d,rootCanonical:b,markers:a})}let b=(0,g.dirname)(d);if(b===d)break;d=b}let i=h.filter(a=>a.rootCanonical!==c),j=h.find(a=>a.rootCanonical===c);if(0===i.length){let b={root:(0,g.resolve)(a),markers:[]};return void 0!==j?{...b,skippedHomeMatch:{homeDir:j.rootLex,markers:j.markers}}:b}let k=i[0];return{root:k.rootLex,markers:k.markers}}let q=[{language:"typescript",patterns:["**/*.ts","**/*.tsx"]},{language:"javascript",patterns:["**/*.js","**/*.jsx","**/*.mjs","**/*.cjs"]},{language:"python",patterns:["**/*.py"]},{language:"rust",patterns:["**/*.rs"]},{language:"go",patterns:["**/*.go"]},{language:"java",patterns:["**/*.java"]},{language:"ruby",patterns:["**/*.rb"]}],r=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.turbo/**","**/coverage/**","**/__pycache__/**","**/.venv/**","**/target/**"];async function s(a){let b=new Map;for(let{language:c,patterns:d}of q){let e=0;for(let b of d)e+=(await (0,m.TI)(b,{cwd:a,ignore:r,nodir:!0,dot:!1})).length;e>0&&b.set(c,e)}return[...b.entries()].sort((a,b)=>b[1]-a[1]).map(([a])=>a)}let t=["claude","cursor","windsurf","codex"];async function u(a={}){let b=a.homeDir??(0,f.homedir)(),c=[];for(let{ide:a,dir:d}of[{ide:"claude",dir:".claude"},{ide:"cursor",dir:".cursor"},{ide:"windsurf",dir:".windsurf"},{ide:"codex",dir:".codex"}])try{await (0,e.access)((0,g.join)(b,d)),c.push(a)}catch{}return c}let v=n.Ik({command:n.Yj(),args:n.YO(n.Yj()).optional(),env:n.g1(n.Yj(),n.Yj()).optional()}).strict();async function w(a){let b=(0,g.resolve)(a);try{return await (0,e.realpath)(b)}catch{return b}}n.Ik({mcpServers:n.g1(n.Yj(),v).optional()}).passthrough();let x="Write|Edit|MultiEdit|NotebookEdit|Bash",y=["SessionStart","PreToolUse","PostToolUse","Stop","SessionEnd"],z=new Set(["PreToolUse","PostToolUse"]);function A(a=(0,f.homedir)(),b=process.env){let c=b.CLAUDE_SETTINGS_PATH;return"string"==typeof c&&c.length>0?c:(0,g.join)(a,".claude","settings.json")}function B(a,b){return z.has(a)?{matcher:x,hooks:[b]}:{hooks:[b]}}function C(a,b){return!!Array.isArray(a.hooks)&&a.hooks.some(a=>a&&"object"==typeof a&&"string"==typeof a.url&&a.url.startsWith(b))}function D(a){if(Array.isArray(a))return a.map(D);if(null!==a&&"object"==typeof a){let b={};for(let c of Object.keys(a).sort())b[c]=D(a[c]);return b}return a}async function E(a){let b=a.settingsPath??A(),c=function(a){let b=a.bridgeHost??"127.0.0.1",c="string"==typeof a.localHookSecret&&a.localHookSecret.length>0?a.localHookSecret:"$LOCAL_HOOK_SECRET";return{type:"http",url:`http://${b}:${a.bridgePort}/v1/hooks/claude-code`,headers:{"X-Local-Hook-Secret":c},allowedEnvVars:["LOCAL_HOOK_SECRET"],timeout:a.timeoutSec??10}}(a),d=a.bridgeHost??"127.0.0.1",f=`http://${d}:${a.bridgePort}/v1/hooks/claude-code`,h=null;try{h=await (0,e.readFile)(b,"utf8")}catch(a){if("ENOENT"!==a.code)throw a}let i={};if(null!==h)try{let a=JSON.parse(h);if("object"!=typeof a||null===a)throw Error(`${b} is not a JSON object`);i=a}catch(a){throw Error(`Cannot parse ${b}: ${a.message}`)}let j=i.hooks??{},k=!1,l={};for(let a of y){let b=function(a,b,c,d){let e=B(a,c),f=Array.isArray(b)?b.slice():[],g=[];for(let a=0;a<f.length;a++){let b=f[a];void 0!==b&&C(b,d)&&g.push(a)}if(0===g.length)return{entries:[...f,e],changed:!0};if(1===g.length){let b=g[0];if(void 0!==b){let d=f[b];if(void 0!==d&&function(a,b,c){if(z.has(b)){if(a.matcher!==x)return!1}else if(void 0!==a.matcher)return!1;if(!Array.isArray(a.hooks)||1!==a.hooks.length)return!1;let d=a.hooks[0];return void 0!==d&&JSON.stringify(D(d))===JSON.stringify(D(c))}(d,a,c))return{entries:f,changed:!1}}}let h=new Set(g),i=[];for(let a=0;a<f.length;a++)if(!h.has(a)){let b=f[a];void 0!==b&&i.push(b)}return i.push(e),{entries:i,changed:!0}}(a,j[a],c,f);l[a]=b.entries,b.changed&&(k=!0)}if(!k&&!a.force)return{path:b,outcome:{path:b,action:"unchanged",notes:"all Coodra hook entries already match Phase 4 Fix F baseline"}};if(!k&&a.force)for(let a of y){let b=B(a,c);l[a]=[...(j[a]??[]).filter(a=>!C(a,f)),b]}let m={...i,hooks:{...j,...l}},n=`${JSON.stringify(m,null,2)}
|
|
2
2
|
`;if(a.dryRun)return{path:b,outcome:{path:b,action:k?null===h?"wrote":"merged":"forced",notes:"dry-run: no write performed"}};if(await (0,e.mkdir)((0,g.dirname)(b),{recursive:!0,mode:448}),null!==h){let a=`${b}.coodra-backup-${new Date().toISOString().replace(/[:.]/g,"-")}`;try{await (0,e.writeFile)(a,h,"utf8")}catch{}}let o=`${b}.coodra.tmp`;return await (0,e.writeFile)(o,n,"utf8"),await (0,e.rename)(o,b),{path:b,outcome:{path:b,action:null===h?"wrote":a.force?"forced":"merged",notes:null===h?"created baseline ~/.claude/settings.json with Coodra hook entries (Phase 4 Fix F matcher)":a.force?"overwrote Coodra hook entries with Phase 4 Fix F baseline":"updated Coodra hook entries (existing user hooks preserved; legacy __coodra__ matcher migrated)"}}}var F=c(49117);function G(a){if(Array.isArray(a))return a.map(G);if(null!==a&&"object"==typeof a){let b={};for(let c of Object.keys(a).sort())b[c]=G(a[c]);return b}return a}async function H(a){var b;let c,d=(0,g.join)(a.cwd,".codex","config.toml"),f=await I(d),h={command:a.entry.command};if(void 0!==a.entry.args&&(h.args=a.entry.args),void 0!==a.entry.env&&(h.env=a.entry.env),!f)return a.dryRun||(await (0,e.mkdir)((0,g.dirname)(d),{recursive:!0}),await (0,e.writeFile)(d,`${(0,F.As)({mcp_servers:{coodra:h}})}
|
|
3
3
|
`,"utf8")),{path:d,action:"wrote",notes:"created baseline .codex/config.toml with coodra MCP entry"};let i=await (0,e.readFile)(d,"utf8");try{c=(0,F.qg)(i)}catch(a){throw Error(`Cannot parse existing .codex/config.toml: ${a.message}`)}let j=c.mcp_servers??{},k=j.coodra;return a.force?(c.mcp_servers={...j,coodra:h},a.dryRun||await (0,e.writeFile)(d,`${(0,F.As)(c)}
|
|
4
4
|
`,"utf8"),{path:d,action:"forced",notes:"overwrote .codex/config.toml coodra entry with baseline"}):void 0===k?(c.mcp_servers={...j,coodra:h},a.dryRun||await (0,e.writeFile)(d,`${(0,F.As)(c)}
|
|
@@ -177,4 +177,4 @@ ${al.pc.bold("Register this project as:")}
|
|
|
177
177
|
`),b.writeStdout(`${(0,al.ab)(" → Run `coodra doctor` to verify the install.")}
|
|
178
178
|
`),b.writeStdout(`${(0,al.ab)(" → Run `coodra start` to launch the MCP server + Hooks Bridge daemons.")}
|
|
179
179
|
`),v&&b.writeStdout(`${al.pc.yellow("Note")}: --dry-run was set; no files were actually written.
|
|
180
|
-
`),k.xV,k.Gi,b.exit(k.Ij)}class ap extends Error{constructor(a){super(`init exit ${a}`),this.code=a,this.name="ExitSentinel"}}async function aq(a){let b=[],c=[],d={...void 0!==a.projectSlug?{projectSlug:a.projectSlug}:{},...void 0!==a.ide?{ide:a.ide}:{},...void 0!==a.noGraphify?{graphify:!a.noGraphify}:{},...void 0!==a.template?{template:a.template}:{},...void 0!==a.mode?{mode:a.mode}:{},...void 0!==a.cwd?{cwd:a.cwd}:{},...void 0!==a.home?{home:a.home}:{},...void 0!==a.userHome?{userHome:a.userHome}:{},...void 0!==a.env?{env:a.env}:{},...void 0!==a.force?{force:a.force}:{},...void 0!==a.dryRun?{dryRun:a.dryRun}:{}},e=0;try{await ao(d,{writeStdout:a=>{b.push(a)},writeStderr:a=>{c.push(a)},exit:a=>{throw new ap(a)}}),e=0}catch(a){a instanceof ap?e=a.code:(c.push(a.message),e=1)}let f=ar(b.join("")),g=ar(c.join(""));if(0===e){let b=f.match(/registered project ['`"]([a-z0-9_-]+)['`"]/i);return{ok:!0,projectSlug:b?.[1]??a.projectSlug??"unknown",stdout:f,stderr:g}}return g.includes("no project root marker found")?{ok:!1,error:"no_project_root_marker",howToFix:"Run /init from inside a project directory that contains package.json, pyproject.toml, Cargo.toml, or .git.",exitCode:e,stdout:f,stderr:g}:g.includes("could not derive a usable project slug")?{ok:!1,error:"slug_unsanitisable",howToFix:"The project root's basename has no usable characters after sanitisation. Pass an explicit project slug.",exitCode:e,stdout:f,stderr:g}:g.includes("mcp-server")||g.includes("runtime")?{ok:!1,error:"mcp_runtime_unavailable",howToFix:"The bundled mcp-server runtime could not be resolved. Reinstall @coodra/cli or run `pnpm --filter @coodra/cli build`.",exitCode:e,stdout:f,stderr:g}:{ok:!1,error:"unknown_failure",howToFix:g.split("\n").slice(0,3).join(" ").slice(0,240),exitCode:e,stdout:f,stderr:g}}function ar(a){return a.replace(/\[[0-9;]*[ -/]*[@-~]/g,"")}},12189:(a,b,c)=>{c.d(b,{P:()=>j,l:()=>h});var d=c(51455),e=c(76760),f=c(23185);let g=f.Ik({name:f.Yj().min(1).max(64).regex(/^[a-z0-9][a-z0-9-]*$/),description:f.Yj().min(1).max(500),version:f.Yj().regex(/^\d+\.\d+\.\d+/).default("1.0.0"),author:f.Yj().optional(),languages:f.YO(f.Yj().min(1)).default([]),detect:f.Ik({files:f.YO(f.Yj()).default([]),packageJsonDeps:f.YO(f.Yj()).default([]),cargoTomlPresent:f.zM().default(!1),goModPresent:f.zM().default(!1),pyprojectTomlPresent:f.zM().default(!1)}).default({files:[],packageJsonDeps:[],cargoTomlPresent:!1,goModPresent:!1,pyprojectTomlPresent:!1}),autoSections:f.YO(f.Yj().regex(/^[a-z0-9][a-z0-9-]*$/)).default([])}).strict();class h extends Error{constructor(a,b,c){super(b),this.name="TemplateLoadError",this.code=a,void 0!==c&&(this.details=c)}}let i=["spec.md.tmpl","implementation.md.tmpl","techstack.md.tmpl","meta.json.tmpl"];async function j(a){let b,c;try{b=await (0,d.readFile)((0,e.join)(a,"template.json"),"utf8")}catch(b){throw new h("missing_template_json",`template.json not found in ${a}: ${b instanceof Error?b.message:String(b)}`,{path:(0,e.join)(a,"template.json")})}try{c=JSON.parse(b)}catch(b){throw new h("invalid_template_json",`template.json is not valid JSON: ${b instanceof Error?b.message:String(b)}`,{path:(0,e.join)(a,"template.json")})}let f=g.safeParse(c);if(!f.success)throw new h("invalid_template_json",`template.json failed schema validation: ${f.error.issues.map(a=>`${a.path.join(".")}: ${a.message}`).join("; ")}`,{path:(0,e.join)(a,"template.json"),issues:f.error.issues});let j={"spec.md.tmpl":"","implementation.md.tmpl":"","techstack.md.tmpl":"","meta.json.tmpl":""};for(let b of i)try{j[b]=await (0,d.readFile)((0,e.join)(a,b),"utf8")}catch(c){throw new h("missing_tmpl_file",`${b} not found in ${a}: ${c instanceof Error?c.message:String(c)}`,{path:(0,e.join)(a,b)})}return{dir:a,meta:f.data,sources:{spec:j["spec.md.tmpl"],implementation:j["implementation.md.tmpl"],techstack:j["techstack.md.tmpl"],meta:j["meta.json.tmpl"]}}}},19501:(a,b,c)=>{c.d(b,{B:()=>l,E:()=>k});var d=c(73024),e=c(76760),f=c(73136),g=c(14820);let h=(0,e.dirname)((0,f.fileURLToPath)("file:///Users/abishaikc/Coodra/packages/cli/dist/lib/template-paths.js"));function i(){let a=(0,e.resolve)(h,"..","templates");return(0,d.existsSync)(a)?a:(0,e.resolve)(h,"..","..","templates")}function j(a=process.env){return(0,e.join)((0,g.Ok)({env:a}),"templates")}function k(a,b={}){let c=b.cwd??process.cwd(),d=a.trim();if(0===d.length)return null;if(d.startsWith("/")||d.startsWith("./")||d.startsWith("../")||d.startsWith("~/")||d.includes("/")){let b=d.startsWith("~/")?(0,e.join)(process.env.HOME??"",d.slice(2)):d.startsWith("/")?d:(0,e.resolve)(c,d);return m(b)?{name:a,source:"path",dir:b}:null}let f=void 0!==b.coodraHome?(0,e.join)(b.coodraHome,"templates"):j(),g=(0,e.join)(f,d);if(m(g))return{name:d,source:"user",dir:g};let h=b.bundledDir??i(),l=(0,e.join)(h,d);return m(l)?{name:d,source:"bundled",dir:l}:null}function l(a={}){let b=new Set,c=[],f=void 0!==a.coodraHome?(0,e.join)(a.coodraHome,"templates"):j();if((0,d.existsSync)(f)){let{readdirSync:a}=require("node:fs");for(let d of a(f)){let a=(0,e.join)(f,d);m(a)&&(b.add(d),c.push({name:d,source:"user",dir:a}))}}let g=a.bundledDir??i();if((0,d.existsSync)(g)){let{readdirSync:a}=require("node:fs");for(let d of a(g)){if(b.has(d))continue;let a=(0,e.join)(g,d);m(a)&&c.push({name:d,source:"bundled",dir:a})}}return c.sort((a,b)=>a.name.localeCompare(b.name))}function m(a){try{if(!(0,d.statSync)(a).isDirectory())return!1;return(0,d.existsSync)((0,e.join)(a,"template.json"))}catch{return!1}}},24052:(a,b,c)=>{c.r(b),c.d(b,{"7fa5b113f2c8c89cb3537a690f0ac79857793e3f80":()=>d.y});var d=c(47421)},29791:(a,b,c)=>{c.d(b,{s:()=>h});var d=c(73024),e=c(76760);let f={dependencies:"_No dependencies detected (no package.json / pyproject.toml / Cargo.toml / go.mod found at the project root)._","directory-structure":"_Project root is empty._",scripts:"_No scripts detected (no package.json / Makefile / pyproject.toml [project.scripts] found)._","entry-points":"_No entry points detected._",services:"_No Coodra services running on this machine._",overview:"_(write a short overview of what this project does)_"},g={dependencies:function(a){let b=[],c=i((0,e.join)(a,"package.json"));if(null!==c){let a={...c.dependencies??{}},d={...c.devDependencies??{}};if(Object.keys(a).length>0||Object.keys(d).length>0){for(let[c,d]of(b.push("| Library | Version | Kind |"),b.push("|---|---|---|"),Object.entries(a).sort(([a],[b])=>a.localeCompare(b))))b.push(`| \`${c}\` | \`${d}\` | dependency |`);for(let[a,c]of Object.entries(d).sort(([a],[b])=>a.localeCompare(b)))b.push(`| \`${a}\` | \`${c}\` | devDependency |`)}}let d=j((0,e.join)(a,"pyproject.toml"));if(null!==d)for(let a of(0===b.length||(b.push(""),b.push("### Python (`pyproject.toml`):")),b.push("| Library | Version | Source |"),b.push("|---|---|---|"),[...d.matchAll(/^"?([a-zA-Z0-9_.-]+)"?\s*=\s*"([^"]+)"/gm)]))b.push(`| \`${a[1]}\` | \`${a[2]}\` | pyproject.toml |`);let f=j((0,e.join)(a,"Cargo.toml"));if(null!==f){0===b.length||(b.push(""),b.push("### Rust (`Cargo.toml`):")),b.push("| Crate | Version | Source |"),b.push("|---|---|---|");let a=f.match(/\[dependencies\]([\s\S]*?)(?=\n\[|$)/);if(null!==a&&void 0!==a[1])for(let c of[...a[1].matchAll(/^([a-zA-Z0-9_-]+)\s*=\s*"([^"]+)"/gm)])b.push(`| \`${c[1]}\` | \`${c[2]}\` | Cargo.toml |`)}let g=j((0,e.join)(a,"go.mod"));if(null!==g){0===b.length||(b.push(""),b.push("### Go (`go.mod`):")),b.push("| Module | Version | Source |"),b.push("|---|---|---|");let a=g.match(/require\s*\(\s*([\s\S]*?)\s*\)/);for(let c of null!==a&&void 0!==a[1]?a[1].split("\n").map(a=>a.trim()).filter(a=>a.length>0&&!a.startsWith("//")):[...g.matchAll(/^require\s+(\S+)\s+(\S+)/gm)].map(a=>`${a[1]} ${a[2]}`)){let a=c.split(/\s+/);a.length>=2&&b.push(`| \`${a[0]}\` | \`${a[1]}\` | go.mod |`)}}return 0===b.length?"":b.join("\n")},"directory-structure":function(a){let b=[];return(function a(b,c,f,g){if(f<0)return;let h=""===c?b:(0,e.join)(b,c),i=[];try{i=(0,d.readdirSync)(h)}catch{return}let j=new Set(["node_modules",".git",".coodra","dist","build",".next",".cache","__pycache__","target",".venv","venv",".turbo"]);for(let h of i.sort()){if(h.startsWith(".")&&".coodra.json"!==h&&".mcp.json"!==h||j.has(h))continue;let i=""===c?h:`${c}/${h}`,k=!1;try{k=(0,d.statSync)((0,e.join)(b,i)).isDirectory()}catch{continue}if(g.push(`${""===c?"":" ".repeat(c.split("/").length)}${h}${k?"/":""}`),k&&f>0&&a(b,i,f-1,g),g.length>200)return void g.push("… (output truncated at 200 entries)")}}(a,"",3,b),0===b.length)?"":["```",...b,"```"].join("\n")},scripts:function(a){let b=[],c=i((0,e.join)(a,"package.json"));if(null!==c&&void 0!==c.scripts){let a=c.scripts;if(Object.keys(a).length>0)for(let[c,d]of(b.push("### npm scripts (`package.json#scripts`):"),b.push(""),b.push("| Script | Command |"),b.push("|---|---|"),Object.entries(a).sort(([a],[b])=>a.localeCompare(b))))b.push(`| \`pnpm run ${c}\` | \`${d.replaceAll("|","\\|")}\` |`)}let d=j((0,e.join)(a,"Makefile"));if(null!==d)for(let a of(b.length>0&&b.push(""),b.push("### Makefile targets:"),b.push(""),[...d.matchAll(/^([a-zA-Z0-9_.-]+):/gm)].map(a=>a[1])))b.push(`- \`make ${a}\``);return 0===b.length?"":b.join("\n")},"entry-points":function(a){let b=[];for(let c of["src/index.ts","src/index.js","src/main.ts","src/main.js","index.ts","index.js","main.py","app/main.py","src/main.py","src/__init__.py","cmd/server/main.go","cmd/main.go","main.go","src/main.rs","src/lib.rs","app/layout.tsx","app/page.tsx"])(0,d.existsSync)((0,e.join)(a,c))&&b.push(c);return 0===b.length?"":b.map(a=>`- \`${a}\``).join("\n")},services:function(a){return"_Run `coodra status` for live service health (this section will populate from pid-status in a future refresh)._"},overview:()=>f.overview??""};function h(a,b,c={}){let d={};for(let c of b){let b=g[c];if(void 0!==b){let e=b(a).trim();d[c]=0===e.length?f[c]??`_(no data for ${c})_`:e}else d[c]=f[c]??`_(no generator registered for "${c}" — populate manually)_`}return d}function i(a){if(!(0,d.existsSync)(a))return null;try{return JSON.parse((0,d.readFileSync)(a,"utf8"))}catch{return null}}function j(a){if(!(0,d.existsSync)(a))return null;try{return(0,d.readFileSync)(a,"utf8")}catch{return null}}e.relative},38831:(a,b,c)=>{c.d(b,{u:()=>e});var d=c(3068);function e(a,b,c={}){let{sections:f}=(0,d.V)(a),g=a.split("\n"),h=[],i=[],j=new Set;for(let a=0;a<g.length;a++){let c=g[a]??"",d=f.find(b=>b.openLine===a+1);if(void 0!==d){h.push(c);let e=b[d.name];if(void 0!==e){for(let a of(e.content.endsWith("\n")?e.content.slice(0,-1):e.content).split("\n"))h.push(a);j.add(d.name)}else{for(let a of d.innerLines)h.push(a);i.push(d.name)}a=d.closeLine-1,h.push(g[a]??"");continue}h.push(c)}let k=[];if(!0===c.appendNewSections){let a=c.appendDate??new Date().toISOString().slice(0,10),d=Object.keys(b).filter(a=>!j.has(a)&&!i.includes(a));if(d.length>0){for(;h.length>0&&""===h[h.length-1];)h.pop();for(let c of(h.push(""),h.push(`## Auto-generated (${a})`),h.push(""),d)){let a=b[c];if(void 0!==a){for(let b of(h.push(`<!-- @auto:${c} -->`),(a.content.endsWith("\n")?a.content.slice(0,-1):a.content).split("\n")))h.push(b);h.push("\x3c!-- /@auto --\x3e"),h.push(""),k.push(c)}}}}return{markdown:h.join("\n"),orphans:i,appended:k}}}};
|
|
180
|
+
`),k.xV,k.Gi,b.exit(k.Ij)}class ap extends Error{constructor(a){super(`init exit ${a}`),this.code=a,this.name="ExitSentinel"}}async function aq(a){let b=[],c=[],d={...void 0!==a.projectSlug?{projectSlug:a.projectSlug}:{},...void 0!==a.ide?{ide:a.ide}:{},...void 0!==a.noGraphify?{graphify:!a.noGraphify}:{},...void 0!==a.template?{template:a.template}:{},...void 0!==a.mode?{mode:a.mode}:{},...void 0!==a.cwd?{cwd:a.cwd}:{},...void 0!==a.home?{home:a.home}:{},...void 0!==a.userHome?{userHome:a.userHome}:{},...void 0!==a.env?{env:a.env}:{},...void 0!==a.force?{force:a.force}:{},...void 0!==a.dryRun?{dryRun:a.dryRun}:{}},e=0;try{await ao(d,{writeStdout:a=>{b.push(a)},writeStderr:a=>{c.push(a)},exit:a=>{throw new ap(a)}}),e=0}catch(a){a instanceof ap?e=a.code:(c.push(a.message),e=1)}let f=ar(b.join("")),g=ar(c.join(""));if(0===e){let b=f.match(/registered project ['`"]([a-z0-9_-]+)['`"]/i);return{ok:!0,projectSlug:b?.[1]??a.projectSlug??"unknown",stdout:f,stderr:g}}return g.includes("no project root marker found")?{ok:!1,error:"no_project_root_marker",howToFix:"Run /init from inside a project directory that contains package.json, pyproject.toml, Cargo.toml, or .git.",exitCode:e,stdout:f,stderr:g}:g.includes("could not derive a usable project slug")?{ok:!1,error:"slug_unsanitisable",howToFix:"The project root's basename has no usable characters after sanitisation. Pass an explicit project slug.",exitCode:e,stdout:f,stderr:g}:g.includes("mcp-server")||g.includes("runtime")?{ok:!1,error:"mcp_runtime_unavailable",howToFix:"The bundled mcp-server runtime could not be resolved. Reinstall @coodra/cli or run `pnpm --filter @coodra/cli build`.",exitCode:e,stdout:f,stderr:g}:{ok:!1,error:"unknown_failure",howToFix:g.split("\n").slice(0,3).join(" ").slice(0,240),exitCode:e,stdout:f,stderr:g}}function ar(a){return a.replace(/\[[0-9;]*[ -/]*[@-~]/g,"")}},12189:(a,b,c)=>{c.d(b,{P:()=>j,l:()=>h});var d=c(51455),e=c(76760),f=c(23185);let g=f.Ik({name:f.Yj().min(1).max(64).regex(/^[a-z0-9][a-z0-9-]*$/),description:f.Yj().min(1).max(500),version:f.Yj().regex(/^\d+\.\d+\.\d+/).default("1.0.0"),author:f.Yj().optional(),languages:f.YO(f.Yj().min(1)).default([]),detect:f.Ik({files:f.YO(f.Yj()).default([]),packageJsonDeps:f.YO(f.Yj()).default([]),cargoTomlPresent:f.zM().default(!1),goModPresent:f.zM().default(!1),pyprojectTomlPresent:f.zM().default(!1)}).default({files:[],packageJsonDeps:[],cargoTomlPresent:!1,goModPresent:!1,pyprojectTomlPresent:!1}),autoSections:f.YO(f.Yj().regex(/^[a-z0-9][a-z0-9-]*$/)).default([])}).strict();class h extends Error{constructor(a,b,c){super(b),this.name="TemplateLoadError",this.code=a,void 0!==c&&(this.details=c)}}let i=["spec.md.tmpl","implementation.md.tmpl","techstack.md.tmpl","meta.json.tmpl"];async function j(a){let b,c;try{b=await (0,d.readFile)((0,e.join)(a,"template.json"),"utf8")}catch(b){throw new h("missing_template_json",`template.json not found in ${a}: ${b instanceof Error?b.message:String(b)}`,{path:(0,e.join)(a,"template.json")})}try{c=JSON.parse(b)}catch(b){throw new h("invalid_template_json",`template.json is not valid JSON: ${b instanceof Error?b.message:String(b)}`,{path:(0,e.join)(a,"template.json")})}let f=g.safeParse(c);if(!f.success)throw new h("invalid_template_json",`template.json failed schema validation: ${f.error.issues.map(a=>`${a.path.join(".")}: ${a.message}`).join("; ")}`,{path:(0,e.join)(a,"template.json"),issues:f.error.issues});let j={"spec.md.tmpl":"","implementation.md.tmpl":"","techstack.md.tmpl":"","meta.json.tmpl":""};for(let b of i)try{j[b]=await (0,d.readFile)((0,e.join)(a,b),"utf8")}catch(c){throw new h("missing_tmpl_file",`${b} not found in ${a}: ${c instanceof Error?c.message:String(c)}`,{path:(0,e.join)(a,b)})}return{dir:a,meta:f.data,sources:{spec:j["spec.md.tmpl"],implementation:j["implementation.md.tmpl"],techstack:j["techstack.md.tmpl"],meta:j["meta.json.tmpl"]}}}},19501:(a,b,c)=>{c.d(b,{B:()=>l,E:()=>k});var d=c(73024),e=c(76760),f=c(73136),g=c(14820);let h=(0,e.dirname)((0,f.fileURLToPath)("file:///Users/abishaikc/Coodra/packages/cli/dist/lib/template-paths.js"));function i(){let a=(0,e.resolve)(h,"..","templates");return(0,d.existsSync)(a)?a:(0,e.resolve)(h,"..","..","templates")}function j(a=process.env){return(0,e.join)((0,g.Ok)({env:a}),"templates")}function k(a,b={}){let c=b.cwd??process.cwd(),d=a.trim();if(0===d.length)return null;if(d.startsWith("/")||d.startsWith("./")||d.startsWith("../")||d.startsWith("~/")||d.includes("/")){let b=d.startsWith("~/")?(0,e.join)(process.env.HOME??"",d.slice(2)):d.startsWith("/")?d:(0,e.resolve)(c,d);return m(b)?{name:a,source:"path",dir:b}:null}let f=void 0!==b.coodraHome?(0,e.join)(b.coodraHome,"templates"):j(),g=(0,e.join)(f,d);if(m(g))return{name:d,source:"user",dir:g};let h=b.bundledDir??i(),l=(0,e.join)(h,d);return m(l)?{name:d,source:"bundled",dir:l}:null}function l(a={}){let b=new Set,c=[],f=void 0!==a.coodraHome?(0,e.join)(a.coodraHome,"templates"):j();if((0,d.existsSync)(f)){let{readdirSync:a}=require("node:fs");for(let d of a(f)){let a=(0,e.join)(f,d);m(a)&&(b.add(d),c.push({name:d,source:"user",dir:a}))}}let g=a.bundledDir??i();if((0,d.existsSync)(g)){let{readdirSync:a}=require("node:fs");for(let d of a(g)){if(b.has(d))continue;let a=(0,e.join)(g,d);m(a)&&c.push({name:d,source:"bundled",dir:a})}}return c.sort((a,b)=>a.name.localeCompare(b.name))}function m(a){try{if(!(0,d.statSync)(a).isDirectory())return!1;return(0,d.existsSync)((0,e.join)(a,"template.json"))}catch{return!1}}},29791:(a,b,c)=>{c.d(b,{s:()=>h});var d=c(73024),e=c(76760);let f={dependencies:"_No dependencies detected (no package.json / pyproject.toml / Cargo.toml / go.mod found at the project root)._","directory-structure":"_Project root is empty._",scripts:"_No scripts detected (no package.json / Makefile / pyproject.toml [project.scripts] found)._","entry-points":"_No entry points detected._",services:"_No Coodra services running on this machine._",overview:"_(write a short overview of what this project does)_"},g={dependencies:function(a){let b=[],c=i((0,e.join)(a,"package.json"));if(null!==c){let a={...c.dependencies??{}},d={...c.devDependencies??{}};if(Object.keys(a).length>0||Object.keys(d).length>0){for(let[c,d]of(b.push("| Library | Version | Kind |"),b.push("|---|---|---|"),Object.entries(a).sort(([a],[b])=>a.localeCompare(b))))b.push(`| \`${c}\` | \`${d}\` | dependency |`);for(let[a,c]of Object.entries(d).sort(([a],[b])=>a.localeCompare(b)))b.push(`| \`${a}\` | \`${c}\` | devDependency |`)}}let d=j((0,e.join)(a,"pyproject.toml"));if(null!==d)for(let a of(0===b.length||(b.push(""),b.push("### Python (`pyproject.toml`):")),b.push("| Library | Version | Source |"),b.push("|---|---|---|"),[...d.matchAll(/^"?([a-zA-Z0-9_.-]+)"?\s*=\s*"([^"]+)"/gm)]))b.push(`| \`${a[1]}\` | \`${a[2]}\` | pyproject.toml |`);let f=j((0,e.join)(a,"Cargo.toml"));if(null!==f){0===b.length||(b.push(""),b.push("### Rust (`Cargo.toml`):")),b.push("| Crate | Version | Source |"),b.push("|---|---|---|");let a=f.match(/\[dependencies\]([\s\S]*?)(?=\n\[|$)/);if(null!==a&&void 0!==a[1])for(let c of[...a[1].matchAll(/^([a-zA-Z0-9_-]+)\s*=\s*"([^"]+)"/gm)])b.push(`| \`${c[1]}\` | \`${c[2]}\` | Cargo.toml |`)}let g=j((0,e.join)(a,"go.mod"));if(null!==g){0===b.length||(b.push(""),b.push("### Go (`go.mod`):")),b.push("| Module | Version | Source |"),b.push("|---|---|---|");let a=g.match(/require\s*\(\s*([\s\S]*?)\s*\)/);for(let c of null!==a&&void 0!==a[1]?a[1].split("\n").map(a=>a.trim()).filter(a=>a.length>0&&!a.startsWith("//")):[...g.matchAll(/^require\s+(\S+)\s+(\S+)/gm)].map(a=>`${a[1]} ${a[2]}`)){let a=c.split(/\s+/);a.length>=2&&b.push(`| \`${a[0]}\` | \`${a[1]}\` | go.mod |`)}}return 0===b.length?"":b.join("\n")},"directory-structure":function(a){let b=[];return(function a(b,c,f,g){if(f<0)return;let h=""===c?b:(0,e.join)(b,c),i=[];try{i=(0,d.readdirSync)(h)}catch{return}let j=new Set(["node_modules",".git",".coodra","dist","build",".next",".cache","__pycache__","target",".venv","venv",".turbo"]);for(let h of i.sort()){if(h.startsWith(".")&&".coodra.json"!==h&&".mcp.json"!==h||j.has(h))continue;let i=""===c?h:`${c}/${h}`,k=!1;try{k=(0,d.statSync)((0,e.join)(b,i)).isDirectory()}catch{continue}if(g.push(`${""===c?"":" ".repeat(c.split("/").length)}${h}${k?"/":""}`),k&&f>0&&a(b,i,f-1,g),g.length>200)return void g.push("… (output truncated at 200 entries)")}}(a,"",3,b),0===b.length)?"":["```",...b,"```"].join("\n")},scripts:function(a){let b=[],c=i((0,e.join)(a,"package.json"));if(null!==c&&void 0!==c.scripts){let a=c.scripts;if(Object.keys(a).length>0)for(let[c,d]of(b.push("### npm scripts (`package.json#scripts`):"),b.push(""),b.push("| Script | Command |"),b.push("|---|---|"),Object.entries(a).sort(([a],[b])=>a.localeCompare(b))))b.push(`| \`pnpm run ${c}\` | \`${d.replaceAll("|","\\|")}\` |`)}let d=j((0,e.join)(a,"Makefile"));if(null!==d)for(let a of(b.length>0&&b.push(""),b.push("### Makefile targets:"),b.push(""),[...d.matchAll(/^([a-zA-Z0-9_.-]+):/gm)].map(a=>a[1])))b.push(`- \`make ${a}\``);return 0===b.length?"":b.join("\n")},"entry-points":function(a){let b=[];for(let c of["src/index.ts","src/index.js","src/main.ts","src/main.js","index.ts","index.js","main.py","app/main.py","src/main.py","src/__init__.py","cmd/server/main.go","cmd/main.go","main.go","src/main.rs","src/lib.rs","app/layout.tsx","app/page.tsx"])(0,d.existsSync)((0,e.join)(a,c))&&b.push(c);return 0===b.length?"":b.map(a=>`- \`${a}\``).join("\n")},services:function(a){return"_Run `coodra status` for live service health (this section will populate from pid-status in a future refresh)._"},overview:()=>f.overview??""};function h(a,b,c={}){let d={};for(let c of b){let b=g[c];if(void 0!==b){let e=b(a).trim();d[c]=0===e.length?f[c]??`_(no data for ${c})_`:e}else d[c]=f[c]??`_(no generator registered for "${c}" — populate manually)_`}return d}function i(a){if(!(0,d.existsSync)(a))return null;try{return JSON.parse((0,d.readFileSync)(a,"utf8"))}catch{return null}}function j(a){if(!(0,d.existsSync)(a))return null;try{return(0,d.readFileSync)(a,"utf8")}catch{return null}}e.relative},38831:(a,b,c)=>{c.d(b,{u:()=>e});var d=c(3068);function e(a,b,c={}){let{sections:f}=(0,d.V)(a),g=a.split("\n"),h=[],i=[],j=new Set;for(let a=0;a<g.length;a++){let c=g[a]??"",d=f.find(b=>b.openLine===a+1);if(void 0!==d){h.push(c);let e=b[d.name];if(void 0!==e){for(let a of(e.content.endsWith("\n")?e.content.slice(0,-1):e.content).split("\n"))h.push(a);j.add(d.name)}else{for(let a of d.innerLines)h.push(a);i.push(d.name)}a=d.closeLine-1,h.push(g[a]??"");continue}h.push(c)}let k=[];if(!0===c.appendNewSections){let a=c.appendDate??new Date().toISOString().slice(0,10),d=Object.keys(b).filter(a=>!j.has(a)&&!i.includes(a));if(d.length>0){for(;h.length>0&&""===h[h.length-1];)h.pop();for(let c of(h.push(""),h.push(`## Auto-generated (${a})`),h.push(""),d)){let a=b[c];if(void 0!==a){for(let b of(h.push(`<!-- @auto:${c} -->`),(a.content.endsWith("\n")?a.content.slice(0,-1):a.content).split("\n")))h.push(b);h.push("\x3c!-- /@auto --\x3e"),h.push(""),k.push(c)}}}}return{markdown:h.join("\n"),orphans:i,appended:k}}},39355:(a,b,c)=>{c.r(b),c.d(b,{"7f3ad27032b60fdc621e9c3aeb59027dcbe2ffbc6a":()=>d.y});var d=c(47421)}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=7385,exports.ids=[7385],exports.modules={37385:(a,b,c)=>{c.r(b),c.d(b,{createOrReadKeylessAction:()=>h.a,deleteKeylessAction:()=>g,detectKeylessEnvDriftAction:()=>d.A,syncKeylessConfigAction:()=>f});var d=c(76629),e=c(4892);let f=(0,e.createServerReference)("7f39cf1936cdea607f9634f63903e1638838bec4ef",e.callServer,void 0,e.findSourceMapURL,"syncKeylessConfigAction"),g=(0,e.createServerReference)("7f3bacf1b5be428b6de0e21c225852d5e445f32fa2",e.callServer,void 0,e.findSourceMapURL,"deleteKeylessAction");var h=c(85157)},85157:(a,b,c)=>{c.d(b,{a:()=>e});var d=c(4892);let e=(0,d.createServerReference)("7f42572b80e21ebb4088d8083f7f110428fc0bed52",d.callServer,void 0,d.findSourceMapURL,"createOrReadKeylessAction")}};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=
|
|
1
|
+
"use strict";exports.id=9621,exports.ids=[9621],exports.modules={12369:(a,b,c)=>{c.r(b),c.d(b,{"003d61628a725ad59e477db320f0ad341115f2c639":()=>f.Fu,"00916480eb919672fdd17de845bb84240342ad2dd7":()=>f.CO,"403fde4b6fc7c562aadc2d31cacb39058652169971":()=>g.nL,"40428d9616f282774be2df0136e9d4016d978a703b":()=>f.tN,"404da3e7014f07a50f0cfc818d3bb821a8a87fa187":()=>g.dW,"40566d72c500c41afff4d362e2cb943cd168b706f1":()=>g.wI,"405ade3d2de20a9188b81e36a62ba3bdc0a00e924e":()=>g.XI,"409b299518ee775e2c2ed7c9f0e1f556d4c0298305":()=>g.dN,"40a16694ec684b8c013a4e1b1873af73acf3c7b936":()=>g.KP,"40fddfa25fb7ce0478bd780d21836ec83f8e311689":()=>f.tq,"7f2749d032f0afec62b21938650725da230c9ddb55":()=>e.AZ,"7f39cf1936cdea607f9634f63903e1638838bec4ef":()=>e.ot,"7f3bacf1b5be428b6de0e21c225852d5e445f32fa2":()=>e.at,"7f42572b80e21ebb4088d8083f7f110428fc0bed52":()=>e.ai,"7fd9acc10a0b938c95f2683ddf67602bd5d8b3f7c2":()=>d.i,"7fe9be32f34a22960c3599590a321cb6bc1ffa8285":()=>d.$});var d=c(36388),e=c(72610),f=c(44574),g=c(62422)},39355:(a,b,c)=>{c.r(b),c.d(b,{"7f3ad27032b60fdc621e9c3aeb59027dcbe2ffbc6a":()=>d.y});var d=c(47421)},51063:(a,b,c)=>{c.d(b,{Q4:()=>i,ib:()=>j,oE:()=>h,vC:()=>g});var d=c(73024),e=c(76760),f=c(53160);function g(a){let b=(0,f.I8)(a.projectCwd);if(!((0,d.existsSync)(b)&&(0,d.statSync)(b).isDirectory()))return{featuresRoot:b,rootExists:!1,features:[],slugsWithWarnings:[]};let c=(0,f.LI)({projectCwd:a.projectCwd,projectSlug:a.projectSlug});return{featuresRoot:b,rootExists:!0,features:c.index.features.map(a=>({slug:a.slug,name:a.name,description:a.description,whenNotToUse:a.whenNotToUse,maturity:a.maturity,tags:[...a.tags],owners:[...a.owners],fileCount:a.fileCount,totalBytes:a.totalBytes,lastUpdatedAt:a.lastUpdatedAt,hasWarnings:a.hasWarnings})),slugsWithWarnings:[...c.slugsWithWarnings]}}function h(a){let b=(0,f.I8)(a.projectCwd);if(!(0,d.existsSync)(b))return null;let c=(0,e.join)(b,a.slug);return(0,d.existsSync)(c)?(0,f.bK)(a.slug,c):null}function i(a){return(0,f.I8)(a)}function j(a){return(0,f.X_)(a)}},62422:(a,b,c)=>{c.d(b,{KP:()=>w,XI:()=>A,dN:()=>u,dW:()=>D,nL:()=>E,wI:()=>y});var d=c(38679);c(60681);var e=c(73024),f=c(76760),g=c(53160),h=c(34017),i=c(23185),j=c(80554),k=c(21074),l=c(77829);let m=/^[a-z0-9_-]+$/,n=/^[a-z0-9_-]+$/,o=new Set([".md",".markdown",".txt",".json",".yaml",".yml",".toml",".csv",".tsv",".sql",".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".rs",".go",".java",".rb",".sh",".bash",".zsh",".html",".css",".xml"]);function p(a){let b=a.issues[0];if(void 0===b)return"invalid form data";let c=b.path.length>0?`${b.path.join(".")}: `:"";return`${c}${b.message}`}function q(a,b={}){let c=new URLSearchParams(b).toString();return`/projects/${encodeURIComponent(a)}/features${c?`?${c}`:""}`}function r(a,b,c={}){let d=new URLSearchParams(c).toString();return`/projects/${encodeURIComponent(a)}/features/${encodeURIComponent(b)}${d?`?${d}`:""}`}async function s(a){let b=await (0,k.getProject)(a);return null===b&&(0,h.notFound)(),{cwd:b.cwd??process.cwd()}}let t=i.Ik({projectSlug:i.Yj().min(1).regex(n),slug:i.Yj().min(1,"slug is required").max(64,"slug must be ≤ 64 chars").regex(m,"slug must be lowercase letters, digits, hyphens or underscores"),description:i.Yj().min(1,"description is required").max(2e3,"description must be ≤ 2000 chars"),whenNotToUse:i.Yj().max(2e3).optional(),maturity:i.k5(["draft","beta","stable","deprecated"]).optional(),body:i.Yj().max(1e6).optional(),force:i.zM().optional()});async function u(a){(0,j._o)("feature action"),await (0,j.Yn)("member");let b=String(a.get("projectSlug")??"").trim(),c={projectSlug:b,slug:String(a.get("slug")??"").trim(),description:String(a.get("description")??"").trim(),whenNotToUse:String(a.get("whenNotToUse")??"").trim()||void 0,maturity:String(a.get("maturity")??"").trim()||void 0,body:String(a.get("body")??"").trim()||void 0,force:"on"===a.get("force")||"true"===a.get("force")},d=t.safeParse(c);d.success||(0,h.redirect)(`/projects/${encodeURIComponent(b)}/features/new?error=create_validation_failed&errorMessage=${encodeURIComponent(p(d.error))}`);let{cwd:i}=await s(d.data.projectSlug),k=(0,f.join)((0,g.I8)(i),d.data.slug),l=(0,f.join)(k,"feature.md");(0,e.existsSync)(l)&&!0!==d.data.force&&(0,h.redirect)(`/projects/${encodeURIComponent(d.data.projectSlug)}/features/new?error=feature_exists&errorMessage=${encodeURIComponent(`Feature "${d.data.slug}" already exists. Tick "force overwrite" or pick a different slug.`)}`);let m=a.getAll("files").filter(a=>a instanceof File&&a.size>0).filter(a=>o.has((0,f.extname)(a.name).toLowerCase())).filter(a=>a.size<=262144);try{var n;(0,e.mkdirSync)(k,{recursive:!0});let a=(0,g.qI)({frontmatter:{name:d.data.slug,description:d.data.description,...void 0!==d.data.whenNotToUse&&d.data.whenNotToUse.length>0?{whenNotToUse:d.data.whenNotToUse}:{},...void 0!==d.data.maturity?{maturity:d.data.maturity}:{}},body:d.data.body??(n=d.data.slug,`# ${n}
|
|
2
2
|
|
|
3
3
|
## What this feature is
|
|
4
4
|
|
|
@@ -12,4 +12,4 @@ TODO
|
|
|
12
12
|
## Things to watch out for
|
|
13
13
|
|
|
14
14
|
TODO
|
|
15
|
-
`)});for(let b of((0,e.writeFileSync)(l,a,"utf8"),m)){let a=F(b.name),c=(0,f.join)(k,a),d=Buffer.from(await b.arrayBuffer());(0,e.writeFileSync)(c,d)}}catch(a){(0,h.redirect)(`/projects/${encodeURIComponent(d.data.projectSlug)}/features/new?error=write_failed&errorMessage=${encodeURIComponent(a.message)}`)}try{(0,g.LI)({projectCwd:i,projectSlug:d.data.projectSlug})}catch{}(0,h.redirect)(r(d.data.projectSlug,d.data.slug,{saved:"1"}))}let v=i.Ik({projectSlug:i.Yj().min(1).regex(n),fslug:i.Yj().min(1).regex(m)});async function w(a){(0,j._o)("feature action"),await (0,j.Yn)("member");let b=String(a.get("projectSlug")??"").trim(),c=String(a.get("fslug")??"").trim(),d=v.safeParse({projectSlug:b,fslug:c});d.success||(0,h.redirect)(r(b,c,{error:"upload_validation_failed",errorMessage:p(d.error)}));let i=a.get("file");i instanceof File&&0!==i.size||(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"no_file",errorMessage:"Pick a file to upload."})),i.size>262144&&(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"file_too_large",errorMessage:`File is ${i.size} bytes; cap is 262144.`}));let k=(0,f.extname)(i.name).toLowerCase();o.has(k)||(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"extension_blocked",errorMessage:`Files with extension ${k} are not allowed. See the MCP get_feature_file tool docs for the full allowlist.`}));let{cwd:l}=await s(d.data.projectSlug),m=(0,f.join)((0,g.I8)(l),d.data.fslug);(0,e.existsSync)(m)&&(0,e.statSync)(m).isDirectory()||(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"feature_not_found",errorMessage:`No feature at ${m}.`}));try{let a=F(i.name),b=(0,f.join)(m,a),c=Buffer.from(await i.arrayBuffer());(0,e.writeFileSync)(b,c)}catch(a){(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"write_failed",errorMessage:a.message}))}try{(0,g.LI)({projectCwd:l,projectSlug:d.data.projectSlug})}catch{}(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{uploaded:i.name}))}let x=i.Ik({projectSlug:i.Yj().min(1).regex(n),fslug:i.Yj().min(1).regex(m),description:i.Yj().min(1).max(2e3),whenNotToUse:i.Yj().max(2e3).optional(),maturity:i.k5(["draft","beta","stable","deprecated"]).optional(),body:i.Yj().max(1e6).optional()});async function y(a){(0,j._o)("feature action"),await (0,j.Yn)("member");let b=String(a.get("projectSlug")??"").trim(),c=String(a.get("fslug")??"").trim(),d={projectSlug:b,fslug:c,description:String(a.get("description")??"").trim(),whenNotToUse:String(a.get("whenNotToUse")??"").trim()||void 0,maturity:String(a.get("maturity")??"").trim()||void 0,body:String(a.get("body")??"").trim()||void 0},i=x.safeParse(d);i.success||(0,h.redirect)(`/projects/${encodeURIComponent(b)}/features/${encodeURIComponent(c)}/edit?error=edit_validation_failed&errorMessage=${encodeURIComponent(p(i.error))}`);let{cwd:k}=await s(i.data.projectSlug),l=(0,f.join)((0,g.I8)(k),i.data.fslug),m=(0,f.join)(l,"feature.md");(0,e.existsSync)(m)||(0,h.redirect)(r(i.data.projectSlug,i.data.fslug,{error:"feature_not_found",errorMessage:`No feature.md at ${m}.`}));let n=i.data.body;if(void 0===n)try{let a=(0,e.readFileSync)(m,"utf8");n=(0,g.Xu)(a).body}catch{n=""}let o=(0,g.qI)({frontmatter:{name:i.data.fslug,description:i.data.description,...void 0!==i.data.whenNotToUse&&i.data.whenNotToUse.length>0?{whenNotToUse:i.data.whenNotToUse}:{},...void 0!==i.data.maturity?{maturity:i.data.maturity}:{}},body:n??""}),q=(0,g.Xu)(o);q.errors.length>0&&(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/${encodeURIComponent(i.data.fslug)}/edit?error=render_failed&errorMessage=${encodeURIComponent(q.errors[0]??"rendered feature.md does not round-trip")}`);try{(0,e.writeFileSync)(m,o,"utf8")}catch(a){(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/${encodeURIComponent(i.data.fslug)}/edit?error=write_failed&errorMessage=${encodeURIComponent(a.message)}`)}try{(0,g.LI)({projectCwd:k,projectSlug:i.data.projectSlug})}catch{}(0,h.redirect)(r(i.data.projectSlug,i.data.fslug,{saved:"1"}))}let z=i.Ik({projectSlug:i.Yj().min(1).regex(n),fslug:i.Yj().min(1).regex(m),confirmation:i.Yj().min(1,"Type the confirmation phrase to remove.")});async function A(a){(0,j._o)("feature action"),await (0,j.Yn)("member");let b=String(a.get("projectSlug")??"").trim(),c=String(a.get("fslug")??"").trim(),d={projectSlug:b,fslug:c,confirmation:String(a.get("confirmation")??"").trim()},i=z.safeParse(d);i.success||(0,h.redirect)(r(b,c,{error:"remove_validation_failed",errorMessage:p(i.error)}));let k=`remove ${i.data.fslug}`;i.data.confirmation!==k&&(0,h.redirect)(r(i.data.projectSlug,i.data.fslug,{error:"remove_confirmation_mismatch",errorMessage:`Confirmation phrase must be "${k}" exactly.`}));let{cwd:l}=await s(i.data.projectSlug),m=(0,f.join)((0,g.I8)(l),i.data.fslug);(0,e.existsSync)(m)||(0,h.redirect)(q(i.data.projectSlug,{error:"feature_not_found",errorMessage:`No feature at ${m}.`}));try{(0,e.rmSync)(m,{recursive:!0,force:!0})}catch(a){(0,h.redirect)(r(i.data.projectSlug,i.data.fslug,{error:"remove_failed",errorMessage:a.message}))}try{(0,g.LI)({projectCwd:l,projectSlug:i.data.projectSlug})}catch{}(0,h.redirect)(q(i.data.projectSlug,{removed:i.data.fslug}))}let B=i.Ik({projectSlug:i.Yj().min(1).regex(n),payload:i.Yj().min(1)}),C=i.YO(i.Ik({absPath:i.Yj().min(1),slug:i.Yj().regex(m).min(1).max(64),description:i.Yj().min(1).max(2e3)}).strict());async function D(a){let b;(0,j._o)("feature action"),await (0,j.Yn)("member");let c=String(a.get("projectSlug")??"").trim(),d=String(a.get("payload")??"").trim(),i=B.safeParse({projectSlug:c,payload:d});i.success||(0,h.redirect)(`/projects/${encodeURIComponent(c)}/features/import?error=import_validation_failed&errorMessage=${encodeURIComponent(p(i.error))}`);try{b=C.parse(JSON.parse(i.data.payload))}catch(a){(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/import?error=import_payload_invalid&errorMessage=${encodeURIComponent(a.message)}`)}0===b.length&&(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/import?error=no_items&errorMessage=${encodeURIComponent("Pick at least one file to import.")}`);let{cwd:k}=await s(i.data.projectSlug),l=(0,g.I8)(k),m=[],n=[];for(let a of b){let b;if(!a.absPath.startsWith(k)){n.push({slug:a.slug,reason:`source path ${a.absPath} is outside the project root`});continue}let c=(0,f.join)(l,a.slug),d=(0,f.join)(c,"feature.md");if((0,e.existsSync)(d)){n.push({slug:a.slug,reason:`feature ${a.slug} already exists`});continue}try{b=(0,e.readFileSync)(a.absPath,"utf8")}catch(b){n.push({slug:a.slug,reason:`read failed: ${b.message}`});continue}let h=b.match(/^---[ \t]*\r?\n[\s\S]*?\r?\n---[ \t]*(\r?\n|$)/),i=null!==h?b.slice(h[0].length):b,j=(0,g.qI)({frontmatter:{name:a.slug,description:a.description,maturity:"draft",tags:["imported"]},body:i.replace(/^\s+/,"")});try{(0,e.mkdirSync)(c,{recursive:!0}),(0,e.writeFileSync)(d,j,"utf8"),m.push(a.slug)}catch(b){n.push({slug:a.slug,reason:`write failed: ${b.message}`})}}try{(0,g.LI)({projectCwd:k,projectSlug:i.data.projectSlug})}catch{}if(0===m.length&&n.length>0){let a=n.map(a=>`${a.slug}: ${a.reason}`).join(" \xb7 ");(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/import?error=all_imports_failed&errorMessage=${encodeURIComponent(a)}`)}let o=new URLSearchParams;o.set("imported",m.join(",")),n.length>0&&(o.set("failed",n.map(a=>a.slug).join(",")),o.set("errorMessage",n.map(a=>`${a.slug}: ${a.reason}`).join(" \xb7 "))),(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features?${o.toString()}`)}async function E(a){let b;(0,j._o)("feature action"),await (0,j.Yn)("member");let c=String(a.get("projectSlug")??"").trim();n.test(c)||(0,h.redirect)("/projects?error=invalid_project_slug");let{cwd:d}=await s(c);try{b=(0,g.LI)({projectCwd:d,projectSlug:c})}catch(a){(0,h.redirect)(q(c,{error:"reindex_failed",errorMessage:a.message}))}(0,h.redirect)(q(c,{reindexed:b.changed?"updated":"unchanged"}))}function F(a){let b=(a.split(/[\\/]/).pop()??"").replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return 0===b.length||b.startsWith(".")?`upload-${Date.now()}`:b}(0,l.D)([u,w,y,A,D,E]),(0,d.A)(u,"
|
|
15
|
+
`)});for(let b of((0,e.writeFileSync)(l,a,"utf8"),m)){let a=F(b.name),c=(0,f.join)(k,a),d=Buffer.from(await b.arrayBuffer());(0,e.writeFileSync)(c,d)}}catch(a){(0,h.redirect)(`/projects/${encodeURIComponent(d.data.projectSlug)}/features/new?error=write_failed&errorMessage=${encodeURIComponent(a.message)}`)}try{(0,g.LI)({projectCwd:i,projectSlug:d.data.projectSlug})}catch{}(0,h.redirect)(r(d.data.projectSlug,d.data.slug,{saved:"1"}))}let v=i.Ik({projectSlug:i.Yj().min(1).regex(n),fslug:i.Yj().min(1).regex(m)});async function w(a){(0,j._o)("feature action"),await (0,j.Yn)("member");let b=String(a.get("projectSlug")??"").trim(),c=String(a.get("fslug")??"").trim(),d=v.safeParse({projectSlug:b,fslug:c});d.success||(0,h.redirect)(r(b,c,{error:"upload_validation_failed",errorMessage:p(d.error)}));let i=a.get("file");i instanceof File&&0!==i.size||(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"no_file",errorMessage:"Pick a file to upload."})),i.size>262144&&(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"file_too_large",errorMessage:`File is ${i.size} bytes; cap is 262144.`}));let k=(0,f.extname)(i.name).toLowerCase();o.has(k)||(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"extension_blocked",errorMessage:`Files with extension ${k} are not allowed. See the MCP get_feature_file tool docs for the full allowlist.`}));let{cwd:l}=await s(d.data.projectSlug),m=(0,f.join)((0,g.I8)(l),d.data.fslug);(0,e.existsSync)(m)&&(0,e.statSync)(m).isDirectory()||(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"feature_not_found",errorMessage:`No feature at ${m}.`}));try{let a=F(i.name),b=(0,f.join)(m,a),c=Buffer.from(await i.arrayBuffer());(0,e.writeFileSync)(b,c)}catch(a){(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{error:"write_failed",errorMessage:a.message}))}try{(0,g.LI)({projectCwd:l,projectSlug:d.data.projectSlug})}catch{}(0,h.redirect)(r(d.data.projectSlug,d.data.fslug,{uploaded:i.name}))}let x=i.Ik({projectSlug:i.Yj().min(1).regex(n),fslug:i.Yj().min(1).regex(m),description:i.Yj().min(1).max(2e3),whenNotToUse:i.Yj().max(2e3).optional(),maturity:i.k5(["draft","beta","stable","deprecated"]).optional(),body:i.Yj().max(1e6).optional()});async function y(a){(0,j._o)("feature action"),await (0,j.Yn)("member");let b=String(a.get("projectSlug")??"").trim(),c=String(a.get("fslug")??"").trim(),d={projectSlug:b,fslug:c,description:String(a.get("description")??"").trim(),whenNotToUse:String(a.get("whenNotToUse")??"").trim()||void 0,maturity:String(a.get("maturity")??"").trim()||void 0,body:String(a.get("body")??"").trim()||void 0},i=x.safeParse(d);i.success||(0,h.redirect)(`/projects/${encodeURIComponent(b)}/features/${encodeURIComponent(c)}/edit?error=edit_validation_failed&errorMessage=${encodeURIComponent(p(i.error))}`);let{cwd:k}=await s(i.data.projectSlug),l=(0,f.join)((0,g.I8)(k),i.data.fslug),m=(0,f.join)(l,"feature.md");(0,e.existsSync)(m)||(0,h.redirect)(r(i.data.projectSlug,i.data.fslug,{error:"feature_not_found",errorMessage:`No feature.md at ${m}.`}));let n=i.data.body;if(void 0===n)try{let a=(0,e.readFileSync)(m,"utf8");n=(0,g.Xu)(a).body}catch{n=""}let o=(0,g.qI)({frontmatter:{name:i.data.fslug,description:i.data.description,...void 0!==i.data.whenNotToUse&&i.data.whenNotToUse.length>0?{whenNotToUse:i.data.whenNotToUse}:{},...void 0!==i.data.maturity?{maturity:i.data.maturity}:{}},body:n??""}),q=(0,g.Xu)(o);q.errors.length>0&&(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/${encodeURIComponent(i.data.fslug)}/edit?error=render_failed&errorMessage=${encodeURIComponent(q.errors[0]??"rendered feature.md does not round-trip")}`);try{(0,e.writeFileSync)(m,o,"utf8")}catch(a){(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/${encodeURIComponent(i.data.fslug)}/edit?error=write_failed&errorMessage=${encodeURIComponent(a.message)}`)}try{(0,g.LI)({projectCwd:k,projectSlug:i.data.projectSlug})}catch{}(0,h.redirect)(r(i.data.projectSlug,i.data.fslug,{saved:"1"}))}let z=i.Ik({projectSlug:i.Yj().min(1).regex(n),fslug:i.Yj().min(1).regex(m),confirmation:i.Yj().min(1,"Type the confirmation phrase to remove.")});async function A(a){(0,j._o)("feature action"),await (0,j.Yn)("member");let b=String(a.get("projectSlug")??"").trim(),c=String(a.get("fslug")??"").trim(),d={projectSlug:b,fslug:c,confirmation:String(a.get("confirmation")??"").trim()},i=z.safeParse(d);i.success||(0,h.redirect)(r(b,c,{error:"remove_validation_failed",errorMessage:p(i.error)}));let k=`remove ${i.data.fslug}`;i.data.confirmation!==k&&(0,h.redirect)(r(i.data.projectSlug,i.data.fslug,{error:"remove_confirmation_mismatch",errorMessage:`Confirmation phrase must be "${k}" exactly.`}));let{cwd:l}=await s(i.data.projectSlug),m=(0,f.join)((0,g.I8)(l),i.data.fslug);(0,e.existsSync)(m)||(0,h.redirect)(q(i.data.projectSlug,{error:"feature_not_found",errorMessage:`No feature at ${m}.`}));try{(0,e.rmSync)(m,{recursive:!0,force:!0})}catch(a){(0,h.redirect)(r(i.data.projectSlug,i.data.fslug,{error:"remove_failed",errorMessage:a.message}))}try{(0,g.LI)({projectCwd:l,projectSlug:i.data.projectSlug})}catch{}(0,h.redirect)(q(i.data.projectSlug,{removed:i.data.fslug}))}let B=i.Ik({projectSlug:i.Yj().min(1).regex(n),payload:i.Yj().min(1)}),C=i.YO(i.Ik({absPath:i.Yj().min(1),slug:i.Yj().regex(m).min(1).max(64),description:i.Yj().min(1).max(2e3)}).strict());async function D(a){let b;(0,j._o)("feature action"),await (0,j.Yn)("member");let c=String(a.get("projectSlug")??"").trim(),d=String(a.get("payload")??"").trim(),i=B.safeParse({projectSlug:c,payload:d});i.success||(0,h.redirect)(`/projects/${encodeURIComponent(c)}/features/import?error=import_validation_failed&errorMessage=${encodeURIComponent(p(i.error))}`);try{b=C.parse(JSON.parse(i.data.payload))}catch(a){(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/import?error=import_payload_invalid&errorMessage=${encodeURIComponent(a.message)}`)}0===b.length&&(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/import?error=no_items&errorMessage=${encodeURIComponent("Pick at least one file to import.")}`);let{cwd:k}=await s(i.data.projectSlug),l=(0,g.I8)(k),m=[],n=[];for(let a of b){let b;if(!a.absPath.startsWith(k)){n.push({slug:a.slug,reason:`source path ${a.absPath} is outside the project root`});continue}let c=(0,f.join)(l,a.slug),d=(0,f.join)(c,"feature.md");if((0,e.existsSync)(d)){n.push({slug:a.slug,reason:`feature ${a.slug} already exists`});continue}try{b=(0,e.readFileSync)(a.absPath,"utf8")}catch(b){n.push({slug:a.slug,reason:`read failed: ${b.message}`});continue}let h=b.match(/^---[ \t]*\r?\n[\s\S]*?\r?\n---[ \t]*(\r?\n|$)/),i=null!==h?b.slice(h[0].length):b,j=(0,g.qI)({frontmatter:{name:a.slug,description:a.description,maturity:"draft",tags:["imported"]},body:i.replace(/^\s+/,"")});try{(0,e.mkdirSync)(c,{recursive:!0}),(0,e.writeFileSync)(d,j,"utf8"),m.push(a.slug)}catch(b){n.push({slug:a.slug,reason:`write failed: ${b.message}`})}}try{(0,g.LI)({projectCwd:k,projectSlug:i.data.projectSlug})}catch{}if(0===m.length&&n.length>0){let a=n.map(a=>`${a.slug}: ${a.reason}`).join(" \xb7 ");(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features/import?error=all_imports_failed&errorMessage=${encodeURIComponent(a)}`)}let o=new URLSearchParams;o.set("imported",m.join(",")),n.length>0&&(o.set("failed",n.map(a=>a.slug).join(",")),o.set("errorMessage",n.map(a=>`${a.slug}: ${a.reason}`).join(" \xb7 "))),(0,h.redirect)(`/projects/${encodeURIComponent(i.data.projectSlug)}/features?${o.toString()}`)}async function E(a){let b;(0,j._o)("feature action"),await (0,j.Yn)("member");let c=String(a.get("projectSlug")??"").trim();n.test(c)||(0,h.redirect)("/projects?error=invalid_project_slug");let{cwd:d}=await s(c);try{b=(0,g.LI)({projectCwd:d,projectSlug:c})}catch(a){(0,h.redirect)(q(c,{error:"reindex_failed",errorMessage:a.message}))}(0,h.redirect)(q(c,{reindexed:b.changed?"updated":"unchanged"}))}function F(a){let b=(a.split(/[\\/]/).pop()??"").replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return 0===b.length||b.startsWith(".")?`upload-${Date.now()}`:b}(0,l.D)([u,w,y,A,D,E]),(0,d.A)(u,"409b299518ee775e2c2ed7c9f0e1f556d4c0298305",null),(0,d.A)(w,"40a16694ec684b8c013a4e1b1873af73acf3c7b936",null),(0,d.A)(y,"40566d72c500c41afff4d362e2cb943cd168b706f1",null),(0,d.A)(A,"405ade3d2de20a9188b81e36a62ba3bdc0a00e924e",null),(0,d.A)(D,"404da3e7014f07a50f0cfc818d3bb821a8a87fa187",null),(0,d.A)(E,"403fde4b6fc7c562aadc2d31cacb39058652169971",null)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=9822,exports.ids=[9822],exports.modules={
|
|
1
|
+
"use strict";exports.id=9822,exports.ids=[9822],exports.modules={69822:(a,b,c)=>{c.r(b),c.d(b,{KeylessCreatorOrReader:()=>h});var d=c(90554),e=c(33997),f=c.n(e),g=c(85157);let h=a=>{var b;let{children:c}=a,h=(null==(b=(0,d.useSelectedLayoutSegments)()[0])?void 0:b.startsWith("/_not-found"))||!1,[i,j]=f().useActionState(g.a,null);return((0,e.useEffect)(()=>{h||f().startTransition(()=>{j()})},[h]),f().isValidElement(c))?f().cloneElement(c,{key:null==i?void 0:i.publishableKey,publishableKey:null==i?void 0:i.publishableKey,__internal_keyless_claimKeylessApplicationUrl:null==i?void 0:i.claimUrl,__internal_keyless_copyInstanceKeysUrl:null==i?void 0:i.apiKeysUrl,__internal_bypassMissingPublishableKey:!0}):c}},85157:(a,b,c)=>{c.d(b,{a:()=>e});var d=c(4892);let e=(0,d.createServerReference)("7f42572b80e21ebb4088d8083f7f110428fc0bed52",d.callServer,void 0,d.findSourceMapURL,"createOrReadKeylessAction")}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-
|
|
1
|
+
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-d0d56a0b91f01cd3.js","static/chunks/1403cfaa-23a60f24679b747b.js","static/chunks/5159-6ab0adfaac39b73f.js","static/chunks/main-app-a2612c9f1cba6be3.js"],rootMainFilesTree:{},pages:{"/_app":["static/chunks/webpack-d0d56a0b91f01cd3.js","static/chunks/framework-b630860915f78484.js","static/chunks/main-376cab886f98cda8.js","static/chunks/pages/_app-8eabba11c41039f2.js"],"/_error":["static/chunks/webpack-d0d56a0b91f01cd3.js","static/chunks/framework-b630860915f78484.js","static/chunks/main-376cab886f98cda8.js","static/chunks/pages/_error-20063159b68f1cd0.js"]},ampFirstPages:[]},globalThis.__BUILD_MANIFEST.lowPriorityFiles=["/static/"+process.env.__NEXT_BUILD_ID+"/_buildManifest.js",,"/static/"+process.env.__NEXT_BUILD_ID+"/_ssgManifest.js"];
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
"wasm": [],
|
|
22
22
|
"assets": [],
|
|
23
23
|
"env": {
|
|
24
|
-
"__NEXT_BUILD_ID": "
|
|
25
|
-
"NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "
|
|
26
|
-
"__NEXT_PREVIEW_MODE_ID": "
|
|
27
|
-
"__NEXT_PREVIEW_MODE_SIGNING_KEY": "
|
|
28
|
-
"__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "
|
|
24
|
+
"__NEXT_BUILD_ID": "i1gnsMuVXYcnTChbZTtUC",
|
|
25
|
+
"NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "XKGvEl+TYElhzAzC3kI4mKNUI3IduURMfu3OSWCiVDk=",
|
|
26
|
+
"__NEXT_PREVIEW_MODE_ID": "24214b694dca2e5730905c9f091a3db5",
|
|
27
|
+
"__NEXT_PREVIEW_MODE_SIGNING_KEY": "b39d4fed28fe5dc3c7b2f42ad6ccb7083b51a047d5a1f8ddb0937b4e842c483e",
|
|
28
|
+
"__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "b87f7b36749acde2a69cfb050f9a91fb2628a37ad32fc844e19792788a15a3af"
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__REACT_LOADABLE_MANIFEST='{"../../node_modules/.pnpm/@clerk+nextjs@6.39.3_next@15.5.18_react-dom@19.2.6_react@19.2.6__react@19.2.6__react-do_d24b847cfc394d97af1af4820c151e7c/node_modules/@clerk/nextjs/dist/esm/app-router/client/ClerkProvider.js -> ./keyless-creator-reader.js":{"id":2794,"files":["static/chunks/2794.
|
|
1
|
+
self.__REACT_LOADABLE_MANIFEST='{"../../node_modules/.pnpm/@clerk+nextjs@6.39.3_next@15.5.18_react-dom@19.2.6_react@19.2.6__react@19.2.6__react-do_d24b847cfc394d97af1af4820c151e7c/node_modules/@clerk/nextjs/dist/esm/app-router/client/ClerkProvider.js -> ./keyless-creator-reader.js":{"id":2794,"files":["static/chunks/2794.01065593ccddcb8e.js"]},"../../node_modules/.pnpm/@clerk+nextjs@6.39.3_next@15.5.18_react-dom@19.2.6_react@19.2.6__react@19.2.6__react-do_d24b847cfc394d97af1af4820c151e7c/node_modules/@clerk/nextjs/dist/esm/app-router/client/keyless-cookie-sync.js -> ../keyless-actions.js":{"id":4057,"files":["static/chunks/4057.50023974d3e12253.js"]}}';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__NEXT_FONT_MANIFEST='{"pages":{},"app":{"/Users/abishaikc/Coodra/apps/web-v2/app/layout":["static/media/
|
|
1
|
+
self.__NEXT_FONT_MANIFEST='{"pages":{},"app":{"/Users/abishaikc/Coodra/apps/web-v2/app/layout":["static/media/e18f83c737786aa7-s.p.woff2","static/media/7b89a4fd5e90ede0-s.p.woff2","static/media/bb3ef058b751a6ad-s.p.woff2","static/media/103fc5fac08dcb15-s.p.woff2"]},"appUsingSizeAdjust":true,"pagesUsingSizeAdjust":false}';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"pages":{},"app":{"/Users/abishaikc/Coodra/apps/web-v2/app/layout":["static/media/
|
|
1
|
+
{"pages":{},"app":{"/Users/abishaikc/Coodra/apps/web-v2/app/layout":["static/media/e18f83c737786aa7-s.p.woff2","static/media/7b89a4fd5e90ede0-s.p.woff2","static/media/bb3ef058b751a6ad-s.p.woff2","static/media/103fc5fac08dcb15-s.p.woff2"]},"appUsingSizeAdjust":true,"pagesUsingSizeAdjust":false}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-d0d56a0b91f01cd3.js" defer=""></script><script src="/_next/static/chunks/framework-b630860915f78484.js" defer=""></script><script src="/_next/static/chunks/main-376cab886f98cda8.js" defer=""></script><script src="/_next/static/chunks/pages/_app-8eabba11c41039f2.js" defer=""></script><script src="/_next/static/chunks/pages/_error-20063159b68f1cd0.js" defer=""></script><script src="/_next/static/i1gnsMuVXYcnTChbZTtUC/_buildManifest.js" defer=""></script><script src="/_next/static/i1gnsMuVXYcnTChbZTtUC/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"i1gnsMuVXYcnTChbZTtUC","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|