failproofai 1.0.2-beta.5 → 1.0.2-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +3 -3
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1zkek3z._.js → [root-of-the-server]__1tg4pu6._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +1 -1
- package/.next/standalone/.next/server/chunks/{_12moi5-._.js → _19uwam-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_1ek68ln._.js +7 -7
- package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_hooks_fp-home_ts_09kv0bn._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07gm3zl._.js +5 -5
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s740oi._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0stn0gx._.js → [root-of-the-server]__128se8m._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1km9-gn._.js → _0no96tu._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1kesqs-._.js → _11fc-hb._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +19 -19
- package/.next/standalone/.next/static/chunks/{0tyt-3a5rtzy8.js → 0931avh-06lj5.js} +1 -1
- package/.next/standalone/.next/static/chunks/{36-8i_vbkh85w.js → 0h-3zffoy-_ji.js} +1 -1
- package/.next/standalone/.next/static/chunks/{21r7iw3rmixf5.js → 0p84npzxdgpc5.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2hwc8e923g5df.js → 0sdgnflvw8kta.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2_27jraat038x.js → 0z7au3njlak0j.js} +1 -1
- package/.next/standalone/.next/static/chunks/{391tpdqcas7rq.js → 1id7o44jjegf0.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3_b73tc78jwsq.js → 276n-edifojbd.js} +2 -2
- package/.next/standalone/.next/static/chunks/{26lfjhb2kzzgb.js → 2jfskwd2u8o5r.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3jqm8ubpv3i-4.js → 2pxr7nr1nyotn.js} +1 -1
- package/.next/standalone/.next/static/chunks/{33np9nrh1mvj9.js → 3vu_7_eor1m-k.js} +1 -1
- package/.next/standalone/package.json +9 -9
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai.mjs +93 -26
- package/dist/cli.mjs +791 -588
- package/dist/worker.mjs +2 -2
- package/package.json +9 -9
- package/src/audit/cli.ts +12 -0
- package/src/audit/index.ts +33 -2
- package/src/hooks/configure-wizard.ts +112 -18
- package/src/hooks/fp-reset.ts +1 -1
- package/src/hooks/handler.ts +13 -1
- package/src/hooks/manager.ts +19 -1
- package/src/hooks/onboarding-attempt.ts +4 -4
- package/src/hooks/pack-cli.ts +162 -21
- package/src/hooks/pack-store.ts +21 -8
- package/src/hooks/read-stdin.ts +78 -8
- /package/.next/standalone/.next/static/{59jsH11LoyXu9UBoHvgGM → mAYN9BOxWVFREnVp3yCHp}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{59jsH11LoyXu9UBoHvgGM → mAYN9BOxWVFREnVp3yCHp}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{59jsH11LoyXu9UBoHvgGM → mAYN9BOxWVFREnVp3yCHp}/_ssgManifest.js +0 -0
|
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
9
9
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
10
10
|
|
|
11
11
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
12
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"1.0.2-beta.
|
|
12
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"1.0.2-beta.6"},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"instrumentationClientInject":[],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/failproofai/failproofai","enablePrerenderSourceMaps":true,"cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":true,"coldCacheBadge":false,"devValidationWorker":true,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"dynamicOnHover":false,"useOffline":false,"varyParams":true,"optimisticRouting":true,"instrumentationClientRouterTransitionEvents":false,"prefetchInlining":{"maxSize":2048,"maxBundleSize":10240},"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptOperationCache":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"devMemoryThresholdRestart":true,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"requestInsights":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"useTypeScriptCli":true,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":true,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"serverComponentsHmrCancellation":false,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":true,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","turbopackMemoryEvictionMode":"auto","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"useCacheTimeout":54,"instantInsights":{"validationLevel":"warning"},"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","outputFileTracingExcludes":{"*":["node_modules/@img/**","node_modules/sharp/**"]},"turbopack":{"root":"/home/runner/work/failproofai/failproofai"},"repoRoot":"/home/runner/work/failproofai/failproofai","distDirRoot":".next"}
|
|
13
13
|
|
|
14
14
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
15
15
|
|
package/bin/failproofai.mjs
CHANGED
|
@@ -725,10 +725,10 @@ OPTIONS
|
|
|
725
725
|
failproofai pack — install policy packs published as GitHub releases
|
|
726
726
|
|
|
727
727
|
Usage:
|
|
728
|
-
failproofai
|
|
729
|
-
failproofai
|
|
730
|
-
failproofai
|
|
731
|
-
failproofai
|
|
728
|
+
failproofai policies add FailproofAI/policies the Failproof AI policies
|
|
729
|
+
failproofai policies add FailproofAI/policies --policy <a,b> just these
|
|
730
|
+
failproofai policies add FailproofAI/policies --category <x,y> whole categories
|
|
731
|
+
failproofai policies add FailproofAI/policies --all everything in it
|
|
732
732
|
failproofai pack list packs installed here
|
|
733
733
|
failproofai pack list <source> what a pack out there contains
|
|
734
734
|
failproofai pack add <source> [--policy <a,b>] [--category <x,y>] [--all]
|
|
@@ -739,7 +739,7 @@ A pack is one entry artifact plus a manifest, verified against the release's
|
|
|
739
739
|
SHA256SUMS at install time. The digest is recorded, and re-verified before every
|
|
740
740
|
import — so a pack cannot change under this machine after you installed it.
|
|
741
741
|
|
|
742
|
-
<source> is
|
|
742
|
+
<source> is any GitHub repo publishing a pack — ours included:
|
|
743
743
|
acme/support-agent newest release, pinned to its exact tag
|
|
744
744
|
acme/support-agent@v2.1.0 that release
|
|
745
745
|
github:acme/support-agent@v2.1.0 same, explicit
|
|
@@ -761,7 +761,7 @@ rest back on.
|
|
|
761
761
|
|
|
762
762
|
Examples:
|
|
763
763
|
failproofai pack add FailproofAI/policies
|
|
764
|
-
failproofai
|
|
764
|
+
failproofai policies add FailproofAI/policies --category sanitize,git
|
|
765
765
|
failproofai pack add github:acme/support-agent@v2.1.0 --only block-refunds
|
|
766
766
|
failproofai pack remove acme/support-agent
|
|
767
767
|
|
|
@@ -1371,7 +1371,7 @@ USAGE
|
|
|
1371
1371
|
failproofai policies add Pick from what is installed here
|
|
1372
1372
|
failproofai policies add <name> Turn one policy on
|
|
1373
1373
|
failproofai policies add <owner>/<repo> Install someone's pack
|
|
1374
|
-
failproofai policies add
|
|
1374
|
+
failproofai policies add FailproofAI/policies Our pack, fetched like any other
|
|
1375
1375
|
failproofai policies remove <name> Turn one policy off
|
|
1376
1376
|
failproofai policies remove <pack-id> Uninstall a pack
|
|
1377
1377
|
failproofai policies show <owner>/<repo> What a pack contains, before you take it
|
|
@@ -1404,7 +1404,7 @@ EXAMPLES
|
|
|
1404
1404
|
failproofai policies add
|
|
1405
1405
|
failproofai policies add block-sudo
|
|
1406
1406
|
failproofai policies add sanitize-api-keys --scope project
|
|
1407
|
-
failproofai policies add
|
|
1407
|
+
failproofai policies add FailproofAI/policies --category sanitize,git
|
|
1408
1408
|
failproofai policies add acme/deploy-guard --policy block-prod-deploy
|
|
1409
1409
|
failproofai policies show acme/deploy-guard
|
|
1410
1410
|
failproofai policies remove block-sudo
|
|
@@ -1424,18 +1424,41 @@ keep enforcing. FAILPROOFAI_PACK_BASE_URL points it all at a mirror.
|
|
|
1424
1424
|
// without a slash that is still a source — it is the short spelling of our
|
|
1425
1425
|
// own pack, and is checked by the pack lane itself rather than duplicated
|
|
1426
1426
|
// here.
|
|
1427
|
-
|
|
1427
|
+
// The first positional that is NOT some flag's value.
|
|
1428
|
+
//
|
|
1429
|
+
// A plain `rest.find(a => !a.startsWith("-"))` reads the first VALUE it
|
|
1430
|
+
// meets instead: `policies add --cli claude codex acme/x` picked "claude",
|
|
1431
|
+
// decided that was not a source because it has no slash, and sent the whole
|
|
1432
|
+
// command down the policy lane — where it died on "Unknown flag: --policy".
|
|
1433
|
+
// The same shape works, and misroutes, for --scope and --custom.
|
|
1434
|
+
//
|
|
1435
|
+
// `--cli` takes SEVERAL values, bounded the way pack-cli.ts bounds them: a
|
|
1436
|
+
// pack source always carries a slash and an agent name never does, which
|
|
1437
|
+
// separates the list from what follows it exactly.
|
|
1438
|
+
const VALUE_TAKING = new Set(["--scope", "--policy", "--category", "--only", "--custom", "-c"]);
|
|
1439
|
+
const skip = new Set();
|
|
1440
|
+
for (let i = 0; i < rest.length; i += 1) {
|
|
1441
|
+
if (VALUE_TAKING.has(rest[i])) skip.add(i + 1);
|
|
1442
|
+
if (rest[i] !== "--cli") continue;
|
|
1443
|
+
for (let j = i + 1; j < rest.length && !rest[j].startsWith("-") && !rest[j].includes("/"); j += 1) {
|
|
1444
|
+
skip.add(j);
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
const firstPositional = rest.find((a, i) => !a.startsWith("-") && !skip.has(i));
|
|
1428
1448
|
let looksLikeSource =
|
|
1429
1449
|
!!firstPositional &&
|
|
1430
1450
|
(firstPositional.includes("/") || firstPositional.startsWith("github:"));
|
|
1431
1451
|
if (!looksLikeSource && firstPositional) {
|
|
1432
|
-
//
|
|
1433
|
-
//
|
|
1434
|
-
//
|
|
1435
|
-
//
|
|
1436
|
-
//
|
|
1437
|
-
|
|
1438
|
-
|
|
1452
|
+
// A retired spelling of our own pack — `core` and friends — is still
|
|
1453
|
+
// routed to the pack lane, which is the only layer that can say what to
|
|
1454
|
+
// type instead. Sent anywhere else it reads as an unknown POLICY name and
|
|
1455
|
+
// the reply lists 38 names, none of which is the answer.
|
|
1456
|
+
//
|
|
1457
|
+
// Read from the layer that owns the set rather than restated here, where
|
|
1458
|
+
// the copy would drift. That exact drift already shipped once, when the
|
|
1459
|
+
// dashboard could not resolve a name the CLI could.
|
|
1460
|
+
const { RETIRED_CORE_ALIASES } = await import("../src/hooks/pack-store");
|
|
1461
|
+
looksLikeSource = RETIRED_CORE_ALIASES.has(firstPositional.toLowerCase());
|
|
1439
1462
|
}
|
|
1440
1463
|
|
|
1441
1464
|
if (action === "show" || looksLikeSource) {
|
|
@@ -1665,8 +1688,8 @@ EXAMPLES
|
|
|
1665
1688
|
failproofai policies --uninstall --cli pi
|
|
1666
1689
|
failproofai policies -u
|
|
1667
1690
|
failproofai policies --uninstall --custom
|
|
1668
|
-
failproofai
|
|
1669
|
-
failproofai
|
|
1691
|
+
failproofai policies add FailproofAI/policies
|
|
1692
|
+
failproofai policies add FailproofAI/policies --category git,database
|
|
1670
1693
|
failproofai pack list acme/support-agent
|
|
1671
1694
|
failproofai pack build ./my-policies.mjs --id acme/support --version 1.0.0
|
|
1672
1695
|
`.trimStart());
|
|
@@ -1892,19 +1915,38 @@ EXAMPLES
|
|
|
1892
1915
|
if (args[0] === "config") {
|
|
1893
1916
|
if (args.includes("--help") || args.includes("-h")) {
|
|
1894
1917
|
console.log(`
|
|
1895
|
-
failproofai config —
|
|
1918
|
+
failproofai config — set this machine up
|
|
1896
1919
|
|
|
1897
1920
|
USAGE
|
|
1898
|
-
failproofai config Guided setup
|
|
1921
|
+
failproofai config Guided setup
|
|
1899
1922
|
failproofai configure Alias for config
|
|
1900
1923
|
failproofai setup Alias for config
|
|
1901
1924
|
|
|
1902
1925
|
WHAT IT DOES
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1926
|
+
Installs the failproofaid service (needs root once), wires hooks into every
|
|
1927
|
+
agent CLI it supports, and optionally connects this machine to Cloud. It
|
|
1928
|
+
chooses NO policies — take some with 'failproofai policies add <owner>/<repo>'.
|
|
1929
|
+
|
|
1930
|
+
WITH NO TERMINAL (CI, containers, an agent driving it)
|
|
1931
|
+
It just runs. There is nothing to confirm when nobody is watching, so it
|
|
1932
|
+
applies rather than asking — no flag needed.
|
|
1933
|
+
|
|
1934
|
+
failproofai config set up, stay local
|
|
1935
|
+
failproofai config --token <key> set up and connect to Cloud
|
|
1936
|
+
--url <url> somewhere other than app.befailproof.ai
|
|
1937
|
+
--machine-id <id> defaults to a stable per-machine key
|
|
1938
|
+
--machine-label <name> defaults to this host's name
|
|
1939
|
+
--no-transcripts decisions only, no session transcripts
|
|
1940
|
+
|
|
1941
|
+
The key can come from FAILPROOFAI_CLOUD_TOKEN instead of the command line,
|
|
1942
|
+
and the url from FAILPROOFAI_CLOUD_URL — the same variable the daemon reads.
|
|
1943
|
+
Prefer the environment: an argument is readable from 'ps' by every user on
|
|
1944
|
+
the box, and lands in shell history and CI logs.
|
|
1945
|
+
|
|
1946
|
+
Exit 1 if anything it was asked to do did not happen — including a key the
|
|
1947
|
+
server refused, and a machine that could not reach root. 'sudo' is never
|
|
1948
|
+
prompted for here; it either works without a password or you are told the
|
|
1949
|
+
exact commands to run.
|
|
1908
1950
|
|
|
1909
1951
|
FAILPROOF CLOUD
|
|
1910
1952
|
failproofai config --connect <url> --token <key> [--machine-id <id>]
|
|
@@ -2093,8 +2135,33 @@ PAUSING ENFORCEMENT (one session, always time-boxed)
|
|
|
2093
2135
|
return;
|
|
2094
2136
|
}
|
|
2095
2137
|
|
|
2138
|
+
// Headless setup. `--token` IS the request to connect — there is no other
|
|
2139
|
+
// reason to pass a key — so there is no separate --connect to remember, and
|
|
2140
|
+
// the URL keeps the default the wizard already infers rather than being a
|
|
2141
|
+
// question the flag path alone asks.
|
|
2142
|
+
//
|
|
2143
|
+
// The key is taken from the environment when the flag is absent, because a
|
|
2144
|
+
// secret on argv is readable from `ps` by every user on the box and lands
|
|
2145
|
+
// in shell history and CI logs. FAILPROOFAI_CLOUD_TOKEN is the name the
|
|
2146
|
+
// Rust daemon already reads, so this unifies rather than invents.
|
|
2147
|
+
const valueFor = (flag) => {
|
|
2148
|
+
const i = args.indexOf(flag);
|
|
2149
|
+
if (i < 0) return undefined;
|
|
2150
|
+
const v = args[i + 1];
|
|
2151
|
+
if (!v || v.startsWith("-")) throw new CliError(`Missing value after ${flag}.`);
|
|
2152
|
+
return v;
|
|
2153
|
+
};
|
|
2096
2154
|
const { runConfigureWizard } = await import("../src/hooks/configure-wizard");
|
|
2097
|
-
const result = await runConfigureWizard(
|
|
2155
|
+
const result = await runConfigureWizard(
|
|
2156
|
+
{},
|
|
2157
|
+
{
|
|
2158
|
+
token: valueFor("--token") ?? process.env.FAILPROOFAI_CLOUD_TOKEN,
|
|
2159
|
+
url: valueFor("--url") ?? process.env.FAILPROOFAI_CLOUD_URL,
|
|
2160
|
+
machineId: valueFor("--machine-id"),
|
|
2161
|
+
machineLabel: valueFor("--machine-label"),
|
|
2162
|
+
noTranscripts: args.includes("--no-transcripts"),
|
|
2163
|
+
},
|
|
2164
|
+
);
|
|
2098
2165
|
await track("cli_configure_invoked", {
|
|
2099
2166
|
applied: result.applied,
|
|
2100
2167
|
// `target` and `scopes`, not `scope`: the wizard rework replaced that
|