@runcofactor/cli 0.13.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account-62I7FG5G.js +255 -0
- package/dist/account-62I7FG5G.js.map +1 -0
- package/dist/{api-catalog-7HLEN7C2.js → api-catalog-CAJUASVC.js} +5 -5
- package/dist/{attachment-OVNQD6Z2.js → attachment-RL4AZUJE.js} +5 -5
- package/dist/augmentor-GAF3MFY6.js +198 -0
- package/dist/augmentor-GAF3MFY6.js.map +1 -0
- package/dist/{auth-VUHL74FH.js → auth-DURHUZDW.js} +3 -3
- package/dist/{chunk-YN763NWQ.js → chunk-26U3DGUM.js} +10 -4
- package/dist/chunk-26U3DGUM.js.map +1 -0
- package/dist/{chunk-JZMJUPZP.js → chunk-32P26BZT.js} +3 -3
- package/dist/chunk-32P26BZT.js.map +1 -0
- package/dist/{chunk-QQVWGWPI.js → chunk-5R4HMSNX.js} +8561 -1511
- package/dist/chunk-5R4HMSNX.js.map +1 -0
- package/dist/{chunk-VGTKUOYS.js → chunk-AQPJQ5AE.js} +2 -2
- package/dist/{chunk-CQE46HSM.js → chunk-CFJXYPTF.js} +14 -8
- package/dist/chunk-CFJXYPTF.js.map +1 -0
- package/dist/{chunk-NL7CVG56.js → chunk-CJEKEW7R.js} +57 -10
- package/dist/chunk-CJEKEW7R.js.map +1 -0
- package/dist/{chunk-Z5LUTUDN.js → chunk-G5SXUXSU.js} +3 -3
- package/dist/{chunk-ZTOE3ND3.js → chunk-HKQ5XQAQ.js} +4 -4
- package/dist/{chunk-PZ4LCN6K.js → chunk-IGHDIWZU.js} +2 -2
- package/dist/{chunk-QGI4UCJX.js → chunk-IWKJQZJQ.js} +124 -74
- package/dist/chunk-IWKJQZJQ.js.map +1 -0
- package/dist/{chunk-ZD3KHESI.js → chunk-KRWRUU6R.js} +27 -7
- package/dist/chunk-KRWRUU6R.js.map +1 -0
- package/dist/{chunk-CRHPDPRS.js → chunk-PXFDH6YL.js} +63 -8
- package/dist/{chunk-CRHPDPRS.js.map → chunk-PXFDH6YL.js.map} +1 -1
- package/dist/{chunk-EJ4U242G.js → chunk-UZ2ZA5A6.js} +2 -2
- package/dist/{chunk-EEN2TZUQ.js → chunk-VKBTI5EF.js} +3 -3
- package/dist/{chunk-ENDHMYEJ.js → chunk-ZXRVFFCY.js} +3 -3
- package/dist/{credential-LO2SEEHU.js → credential-JGVSEGVH.js} +5 -5
- package/dist/{credential-template-ZN7W7734.js → credential-template-CWWMOKB2.js} +5 -5
- package/dist/{debug-workflow-R3RYYAXK.js → debug-workflow-BXRU72YZ.js} +5 -5
- package/dist/{docs-DIAFBDXQ.js → docs-PVBXPTGR.js} +95 -11
- package/dist/docs-PVBXPTGR.js.map +1 -0
- package/dist/{doctor-NZPUSCRE.js → doctor-RHMKD4W5.js} +3 -3
- package/dist/{environment-RQVU4P5M.js → environment-WZKIO3R3.js} +5 -5
- package/dist/{feature-flag-XG26RURR.js → feature-flag-K5REGGDY.js} +98 -12
- package/dist/feature-flag-K5REGGDY.js.map +1 -0
- package/dist/index.js +107 -51
- package/dist/index.js.map +1 -1
- package/dist/{init-EDNLKGPT.js → init-FFUZO5D7.js} +5 -5
- package/dist/{install-FYZ3HNZK.js → install-XRKEQAFZ.js} +5 -5
- package/dist/{issues-NNRVTJ4L.js → issues-I3V6GEXU.js} +5 -5
- package/dist/{knobs-A2BOBH22.js → knobs-6WLJMB44.js} +7 -6
- package/dist/knobs-6WLJMB44.js.map +1 -0
- package/dist/{list-F33VZ4BJ.js → list-PHC7VYNS.js} +5 -5
- package/dist/{local-DQDTM3XA.js → local-VGYRSW22.js} +7 -7
- package/dist/{login-BUMVIB36.js → login-QPU2BKG2.js} +5 -5
- package/dist/{mcp-B5Y5CDMQ.js → mcp-LA452TOA.js} +9 -9
- package/dist/{mcp-B5Y5CDMQ.js.map → mcp-LA452TOA.js.map} +1 -1
- package/dist/{pdf-extract-ABWV3L5X.js → pdf-extract-YHE54XU4.js} +2 -2
- package/dist/product-RSZV5HMB.js +346 -0
- package/dist/product-RSZV5HMB.js.map +1 -0
- package/dist/{property-NJ4SRXQG.js → property-YP4GHQAR.js} +5 -5
- package/dist/{psql-VBZFCMNR.js → psql-XGLBI6T7.js} +3 -3
- package/dist/{record-WAO36O7G.js → record-KWKHP2ZY.js} +6 -6
- package/dist/{redis-DHZXHL4S.js → redis-VJGCUJPV.js} +3 -3
- package/dist/redis-VJGCUJPV.js.map +1 -0
- package/dist/{release-STJKUKTE.js → release-NDRHPW6V.js} +5 -5
- package/dist/{sandbox-DWSGLY7B.js → sandbox-OOCANWOG.js} +51 -7
- package/dist/sandbox-OOCANWOG.js.map +1 -0
- package/dist/{scenarios-HCIDY725.js → scenarios-2HRLCGFY.js} +5 -5
- package/dist/{session-Y5RHU54D.js → session-M4ULYDYP.js} +8 -9
- package/dist/session-M4ULYDYP.js.map +1 -0
- package/dist/{skill-23WAHUOB.js → skill-4DGPRDUC.js} +10 -10
- package/dist/{skill-23WAHUOB.js.map → skill-4DGPRDUC.js.map} +1 -1
- package/dist/skills/debug-run/SKILL.md +7 -1
- package/dist/skills/debug-run/history/1.3.1.md +279 -0
- package/dist/skills/debug-run/version.json +1 -1
- package/dist/skills/optimize-cache/SKILL.md +41 -4
- package/dist/{spec-LM5XHOQ5.js → spec-XZ2TKUFZ.js} +5 -5
- package/dist/{src-BGDRMOKC.js → src-2FK3JHGW.js} +315 -104
- package/dist/src-2FK3JHGW.js.map +1 -0
- package/dist/{src-NCJPUAE6.js → src-CV57ZD6I.js} +10 -8
- package/dist/{src-22RI5VP2.js → src-HL7HEJIW.js} +2 -2
- package/dist/{src-Y3K7UJEF.js → src-OU7544PM.js} +6 -4
- package/dist/{start-SWY55CZX.js → start-IYKF3C3X.js} +5 -5
- package/dist/{tag-YSU2XXPI.js → tag-T45MMSCH.js} +6 -6
- package/dist/{task-NLBKLD7D.js → task-MCUHAVTD.js} +5 -5
- package/dist/{test-suite-QCPWZ2LS.js → test-suite-BICBRSBP.js} +10 -8
- package/dist/{test-suite-QCPWZ2LS.js.map → test-suite-BICBRSBP.js.map} +1 -1
- package/dist/trace-2BAPMYAS.js +16 -0
- package/dist/{triage-TT4BMDBU.js → triage-M3RZ2ASB.js} +6 -6
- package/dist/{upgrade-6ZUFETKX.js → upgrade-4QCRAUHP.js} +3 -3
- package/dist/{workflow-2CX3ZNOQ.js → workflow-4J23FV7K.js} +86 -15
- package/dist/workflow-4J23FV7K.js.map +1 -0
- package/dist/{workflow-cache-GXNE6SU2.js → workflow-cache-XPSK6KC7.js} +26 -13
- package/dist/workflow-cache-XPSK6KC7.js.map +1 -0
- package/dist/{workflow-debug-PRX3DWGD.js → workflow-debug-W4USZH35.js} +9 -9
- package/dist/{workflow-proposals-BW327WGL.js → workflow-proposals-5E3DTYZB.js} +5 -7
- package/dist/workflow-proposals-5E3DTYZB.js.map +1 -0
- package/package.json +5 -1
- package/dist/chunk-CQE46HSM.js.map +0 -1
- package/dist/chunk-JZMJUPZP.js.map +0 -1
- package/dist/chunk-NL7CVG56.js.map +0 -1
- package/dist/chunk-QGI4UCJX.js.map +0 -1
- package/dist/chunk-QQVWGWPI.js.map +0 -1
- package/dist/chunk-YN763NWQ.js.map +0 -1
- package/dist/chunk-ZD3KHESI.js.map +0 -1
- package/dist/docs-DIAFBDXQ.js.map +0 -1
- package/dist/feature-flag-XG26RURR.js.map +0 -1
- package/dist/knobs-A2BOBH22.js.map +0 -1
- package/dist/redis-DHZXHL4S.js.map +0 -1
- package/dist/sandbox-DWSGLY7B.js.map +0 -1
- package/dist/session-Y5RHU54D.js.map +0 -1
- package/dist/src-BGDRMOKC.js.map +0 -1
- package/dist/trace-A3ZY6K26.js +0 -16
- package/dist/workflow-2CX3ZNOQ.js.map +0 -1
- package/dist/workflow-cache-GXNE6SU2.js.map +0 -1
- package/dist/workflow-proposals-BW327WGL.js.map +0 -1
- /package/dist/{api-catalog-7HLEN7C2.js.map → api-catalog-CAJUASVC.js.map} +0 -0
- /package/dist/{attachment-OVNQD6Z2.js.map → attachment-RL4AZUJE.js.map} +0 -0
- /package/dist/{auth-VUHL74FH.js.map → auth-DURHUZDW.js.map} +0 -0
- /package/dist/{chunk-VGTKUOYS.js.map → chunk-AQPJQ5AE.js.map} +0 -0
- /package/dist/{chunk-Z5LUTUDN.js.map → chunk-G5SXUXSU.js.map} +0 -0
- /package/dist/{chunk-ZTOE3ND3.js.map → chunk-HKQ5XQAQ.js.map} +0 -0
- /package/dist/{chunk-PZ4LCN6K.js.map → chunk-IGHDIWZU.js.map} +0 -0
- /package/dist/{chunk-EJ4U242G.js.map → chunk-UZ2ZA5A6.js.map} +0 -0
- /package/dist/{chunk-EEN2TZUQ.js.map → chunk-VKBTI5EF.js.map} +0 -0
- /package/dist/{chunk-ENDHMYEJ.js.map → chunk-ZXRVFFCY.js.map} +0 -0
- /package/dist/{credential-LO2SEEHU.js.map → credential-JGVSEGVH.js.map} +0 -0
- /package/dist/{credential-template-ZN7W7734.js.map → credential-template-CWWMOKB2.js.map} +0 -0
- /package/dist/{debug-workflow-R3RYYAXK.js.map → debug-workflow-BXRU72YZ.js.map} +0 -0
- /package/dist/{doctor-NZPUSCRE.js.map → doctor-RHMKD4W5.js.map} +0 -0
- /package/dist/{environment-RQVU4P5M.js.map → environment-WZKIO3R3.js.map} +0 -0
- /package/dist/{init-EDNLKGPT.js.map → init-FFUZO5D7.js.map} +0 -0
- /package/dist/{install-FYZ3HNZK.js.map → install-XRKEQAFZ.js.map} +0 -0
- /package/dist/{issues-NNRVTJ4L.js.map → issues-I3V6GEXU.js.map} +0 -0
- /package/dist/{list-F33VZ4BJ.js.map → list-PHC7VYNS.js.map} +0 -0
- /package/dist/{local-DQDTM3XA.js.map → local-VGYRSW22.js.map} +0 -0
- /package/dist/{login-BUMVIB36.js.map → login-QPU2BKG2.js.map} +0 -0
- /package/dist/{pdf-extract-ABWV3L5X.js.map → pdf-extract-YHE54XU4.js.map} +0 -0
- /package/dist/{property-NJ4SRXQG.js.map → property-YP4GHQAR.js.map} +0 -0
- /package/dist/{psql-VBZFCMNR.js.map → psql-XGLBI6T7.js.map} +0 -0
- /package/dist/{record-WAO36O7G.js.map → record-KWKHP2ZY.js.map} +0 -0
- /package/dist/{release-STJKUKTE.js.map → release-NDRHPW6V.js.map} +0 -0
- /package/dist/{scenarios-HCIDY725.js.map → scenarios-2HRLCGFY.js.map} +0 -0
- /package/dist/{spec-LM5XHOQ5.js.map → spec-XZ2TKUFZ.js.map} +0 -0
- /package/dist/{src-NCJPUAE6.js.map → src-CV57ZD6I.js.map} +0 -0
- /package/dist/{src-22RI5VP2.js.map → src-HL7HEJIW.js.map} +0 -0
- /package/dist/{src-Y3K7UJEF.js.map → src-OU7544PM.js.map} +0 -0
- /package/dist/{start-SWY55CZX.js.map → start-IYKF3C3X.js.map} +0 -0
- /package/dist/{tag-YSU2XXPI.js.map → tag-T45MMSCH.js.map} +0 -0
- /package/dist/{task-NLBKLD7D.js.map → task-MCUHAVTD.js.map} +0 -0
- /package/dist/{trace-A3ZY6K26.js.map → trace-2BAPMYAS.js.map} +0 -0
- /package/dist/{triage-TT4BMDBU.js.map → triage-M3RZ2ASB.js.map} +0 -0
- /package/dist/{upgrade-6ZUFETKX.js.map → upgrade-4QCRAUHP.js.map} +0 -0
- /package/dist/{workflow-debug-PRX3DWGD.js.map → workflow-debug-W4USZH35.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/feature-flag.ts"],"sourcesContent":["/**\n * CLI Feature Flag Management\n *\n * Allows superadmins to manage feature flags via the CLI.\n */\n\nimport process from \"node:process\";\nimport { readFileSync } from \"node:fs\";\nimport { resolveConfig, getArgValue, hasFlag } from \"./auth.js\";\nimport {\n type LifecycleStage,\n toLifecycleLabel,\n parseLifecycleStage,\n apiRequest,\n fetchList,\n} from \"./cli-helpers.js\";\n\n/** Resolve a `--plan @file.md` (read file) or inline string value. */\nfunction readContent(value: string): string {\n if (value.startsWith(\"@\")) {\n return readFileSync(value.slice(1), \"utf8\");\n }\n return value;\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_REVIEW_INTERVAL_DAYS = 7;\nconst DEFAULT_MAX_WINDOW_DAYS = 30;\n\n/** Bake age (days) + burning state from a flag's bake metadata. */\nfunction bakeStatus(flag: {\n bakeStartedAt?: string | null;\n bakeMaxWindowDays?: number | null;\n}): { ageDays: number; burning: boolean } {\n if (!flag.bakeStartedAt) return { ageDays: 0, burning: false };\n const startedMs = new Date(flag.bakeStartedAt).getTime();\n const ageMs = Date.now() - startedMs;\n const maxWindow = flag.bakeMaxWindowDays ?? DEFAULT_MAX_WINDOW_DAYS;\n return { ageDays: Math.floor(ageMs / DAY_MS), burning: ageMs > maxWindow * DAY_MS };\n}\n\n/** ` baking 4d 🔥` style suffix for list rows. */\nfunction formatBakeSuffix(flag: {\n bakeStartedAt?: string | null;\n bakeMaxWindowDays?: number | null;\n}): string {\n const { ageDays, burning } = bakeStatus(flag);\n return ` baked=${ageDays}d${burning ? \" 🔥BURNING\" : \"\"}`;\n}\n\ntype FeatureFlag = {\n id: string;\n name: string;\n description: string | null;\n lifecycleStage: LifecycleStage;\n finalValue: boolean | null;\n bakeMonitoringPlan?: string | null;\n bakeStartedAt?: string | null;\n bakeReviewIntervalDays?: number | null;\n bakeMaxWindowDays?: number | null;\n createdAt: string;\n lastToggledAt: string;\n isStale: boolean;\n productCardId: string | null;\n productTitle: string | null;\n organizations?: Array<{\n gateId: string;\n orgId: string;\n orgName: string;\n createdAt: string;\n }>;\n users?: Array<{\n gateId: string;\n userId: string;\n userEmail: string | null;\n createdAt: string;\n }>;\n};\n\ntype FlagApiResponse = {\n ok: boolean;\n error?: string;\n flag?: FeatureFlag;\n};\n\ntype ProductCard = {\n id: string;\n title: string;\n stage: string;\n orgId: string;\n orgName: string;\n};\n\nfunction fetchFlags(apiUrl: string, token: string): Promise<FeatureFlag[]> {\n return fetchList<FeatureFlag>(apiUrl, token, \"/superadmin/feature-flags\", \"flags\");\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, \"--json\");\n const flags = await fetchFlags(apiUrl, token);\n\n if (jsonOutput) {\n console.log(JSON.stringify(flags, null, 2));\n return;\n }\n\n if (flags.length === 0) {\n console.log(\"No feature flags found.\");\n return;\n }\n\n for (const flag of flags) {\n const orgCount = flag.organizations?.length ?? 0;\n const userCount = flag.users?.length ?? 0;\n const lifecycle = `lifecycle=${toLifecycleLabel(flag.lifecycleStage)}`;\n // baking is gate-driven like active — no final value.\n const finalValue =\n flag.lifecycleStage === \"active\" || flag.lifecycleStage === \"baking\"\n ? \"\"\n : ` final=${flag.finalValue === true ? \"true\" : \"false\"}`;\n const bake = flag.lifecycleStage === \"baking\" ? formatBakeSuffix(flag) : \"\";\n const stale = flag.isStale ? \" [STALE]\" : \"\";\n const product = flag.productCardId\n ? ` product=${flag.productTitle ?? flag.productCardId}`\n : \"\";\n console.log(` ${flag.name} ${flag.description ?? \"\"} (${lifecycle}${finalValue})${bake} [orgs=${orgCount}, users=${userCount}]${product}${stale}`);\n }\n}\n\nasync function handleCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag create <name> [--description <text>] [--product <productCardId>]\");\n process.exit(1);\n }\n\n const description = getArgValue(argv, \"--description\") ?? null;\n const productCardId = getArgValue(argv, \"--product\") ?? null;\n const result = await apiRequest<FlagApiResponse>(apiUrl, token, \"POST\", \"/superadmin/feature-flags\", {\n name,\n description,\n productCardId,\n });\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Created feature flag: ${name}${productCardId ? ` (product ${productCardId})` : \"\"}`);\n}\n\nasync function handleProduct(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const productCardId = getArgValue(argv, \"--product\");\n const clear = hasFlag(argv, \"--clear\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag product <name> (--product <productCardId> | --clear)\");\n process.exit(1);\n }\n\n if ((productCardId && clear) || (!productCardId && !clear)) {\n console.error(\"Error: Provide either --product <productCardId> or --clear.\");\n process.exit(1);\n }\n\n const result = await apiRequest<FlagApiResponse & { flag?: { productTitle?: string | null } }>(\n apiUrl, token, \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/product`,\n { productCardId: clear ? null : productCardId }\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(\n clear\n ? `Cleared product link for ${name}`\n : `Linked ${name} to product ${result.flag?.productTitle ?? productCardId}`\n );\n}\n\nasync function handleProducts(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, \"--json\");\n const search = getArgValue(argv, \"--search\");\n const path = search\n ? `/superadmin/product-cards?search=${encodeURIComponent(search)}`\n : \"/superadmin/product-cards\";\n const products = await fetchList<ProductCard>(apiUrl, token, path, \"products\");\n\n if (jsonOutput) {\n console.log(JSON.stringify(products, null, 2));\n return;\n }\n\n if (products.length === 0) {\n console.log(\"No product cards found.\");\n return;\n }\n\n for (const product of products) {\n console.log(` ${product.id} ${product.title} (stage=${product.stage}, org=${product.orgName})`);\n }\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag delete <name>\");\n process.exit(1);\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"DELETE\", `/superadmin/feature-flags/${encodeURIComponent(name)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Deleted feature flag: ${name}`);\n}\n\nasync function handleEnable(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const orgId = getArgValue(argv, \"--org\");\n const userId = getArgValue(argv, \"--user\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag enable <name> (--org <orgId> | --user <userId>)\");\n process.exit(1);\n }\n\n if (orgId && userId) {\n console.error(\"Error: Provide either --org or --user, not both.\");\n process.exit(1);\n }\n\n if (!orgId && !userId) {\n console.error(\"Error: Provide either --org <orgId> or --user <userId>.\");\n console.error(\"Usage: canary feature-flag enable <name> (--org <orgId> | --user <userId>)\");\n process.exit(1);\n }\n\n if (orgId) {\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Enabled ${name} for org ${orgId}`);\n } else {\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/users/${encodeURIComponent(userId!)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Enabled ${name} for user ${userId}`);\n }\n}\n\nasync function handleDisable(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const orgId = getArgValue(argv, \"--org\");\n const userId = getArgValue(argv, \"--user\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag disable <name> (--org <orgId> | --user <userId>)\");\n process.exit(1);\n }\n\n if (orgId && userId) {\n console.error(\"Error: Provide either --org or --user, not both.\");\n process.exit(1);\n }\n\n if (!orgId && !userId) {\n console.error(\"Error: Provide either --org <orgId> or --user <userId>.\");\n console.error(\"Usage: canary feature-flag disable <name> (--org <orgId> | --user <userId>)\");\n process.exit(1);\n }\n\n if (orgId) {\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"DELETE\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Disabled ${name} for org ${orgId}`);\n } else {\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"DELETE\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/users/${encodeURIComponent(userId!)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Disabled ${name} for user ${userId}`);\n }\n}\n\nasync function handleLifecycle(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag lifecycle <name> --stage <active|baking|deprecated|ready_for_cleanup> [--final-value true|false] [--plan @file|\\\"text\\\"] [--review-interval <days>] [--max-window <days>]\");\n process.exit(1);\n }\n\n const stage = parseLifecycleStage(argv);\n const rawFinalValue = getArgValue(argv, \"--final-value\");\n const clearFinalValue = hasFlag(argv, \"--clear-final-value\");\n\n // baking and active are gate-driven (no final value); deprecated and\n // ready_for_cleanup carry a forced final value.\n const gateDriven = stage === \"active\" || stage === \"baking\";\n\n if (rawFinalValue !== undefined && clearFinalValue) {\n console.error(\"Error: use either --final-value or --clear-final-value, not both.\");\n process.exit(1);\n }\n\n let finalValue: boolean | undefined = undefined;\n\n if (gateDriven) {\n if (rawFinalValue !== undefined) {\n console.error(`Error: ${stage} stage does not accept --final-value.`);\n process.exit(1);\n }\n finalValue = undefined;\n } else {\n if (clearFinalValue) {\n console.error(\"Error: --clear-final-value can only be used with --stage active.\");\n process.exit(1);\n }\n if (!rawFinalValue) {\n console.error(\"Error: --final-value true|false is required for deprecated or ready_for_cleanup.\");\n process.exit(1);\n }\n if (rawFinalValue !== \"true\" && rawFinalValue !== \"false\") {\n console.error(\"Error: --final-value must be true or false.\");\n process.exit(1);\n }\n finalValue = rawFinalValue === \"true\";\n }\n\n // Oven (baking) options: monitoring plan + review cadence.\n let monitoringPlan: string | undefined;\n let reviewIntervalDays: number | undefined;\n let maxWindowDays: number | undefined;\n if (stage === \"baking\") {\n const rawPlan = getArgValue(argv, \"--plan\");\n if (rawPlan !== undefined) monitoringPlan = readContent(rawPlan);\n const rawInterval = getArgValue(argv, \"--review-interval\");\n if (rawInterval !== undefined) {\n reviewIntervalDays = Number.parseInt(rawInterval, 10);\n if (!Number.isInteger(reviewIntervalDays) || reviewIntervalDays <= 0) {\n console.error(\"Error: --review-interval must be a positive integer (days).\");\n process.exit(1);\n }\n }\n const rawWindow = getArgValue(argv, \"--max-window\");\n if (rawWindow !== undefined) {\n maxWindowDays = Number.parseInt(rawWindow, 10);\n if (!Number.isInteger(maxWindowDays) || maxWindowDays <= 0) {\n console.error(\"Error: --max-window must be a positive integer (days).\");\n process.exit(1);\n }\n }\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/lifecycle`,\n { stage, finalValue, monitoringPlan, reviewIntervalDays, maxWindowDays }\n );\n\n if (!result.ok || !result.flag) {\n console.error(`Error: ${result.error ?? \"Failed to update lifecycle\"}`);\n process.exit(1);\n }\n\n if (result.flag.lifecycleStage === \"baking\") {\n const { ageDays } = bakeStatus(result.flag);\n console.log(\n `Put ${name} in the oven: stage=baking, baked=${ageDays}d, review every ${result.flag.bakeReviewIntervalDays ?? DEFAULT_REVIEW_INTERVAL_DAYS}d, burns after ${result.flag.bakeMaxWindowDays ?? DEFAULT_MAX_WINDOW_DAYS}d.`\n );\n return;\n }\n\n const final =\n result.flag.lifecycleStage === \"active\"\n ? \"(none)\"\n : result.flag.finalValue === true\n ? \"true\"\n : \"false\";\n console.log(`Updated lifecycle for ${name}: stage=${toLifecycleLabel(result.flag.lifecycleStage)}, final=${final}`);\n}\n\ntype OvenFlag = {\n id: string;\n name: string;\n description: string | null;\n productCardId: string | null;\n productTitle: string | null;\n bakeMonitoringPlan: string | null;\n bakeStartedAt: string | null;\n bakeReviewIntervalDays: number;\n bakeMaxWindowDays: number;\n bakeAgeDays: number;\n burning: boolean;\n};\n\nasync function handleOven(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, \"--json\");\n const flags = await fetchList<OvenFlag>(apiUrl, token, \"/superadmin/feature-flags/oven\", \"flags\");\n\n if (jsonOutput) {\n console.log(JSON.stringify(flags, null, 2));\n return;\n }\n\n if (flags.length === 0) {\n console.log(\"The oven is empty — no flags are baking.\");\n return;\n }\n\n console.log(`In the oven (${flags.length}):`);\n for (const flag of flags) {\n const burn = flag.burning ? \" 🔥BURNING\" : \"\";\n const product = flag.productCardId ? ` product=${flag.productTitle ?? flag.productCardId}` : \"\";\n console.log(\n ` ${flag.name} baked=${flag.bakeAgeDays}d (review ${flag.bakeReviewIntervalDays}d / burns ${flag.bakeMaxWindowDays}d)${burn}${product}`\n );\n if (flag.bakeMonitoringPlan) {\n const firstLine = flag.bakeMonitoringPlan.split(\"\\n\")[0]?.slice(0, 100) ?? \"\";\n console.log(` plan: ${firstLine}`);\n }\n }\n}\n\nfunction printFeatureFlagHelp(): void {\n console.log(\n [\n \"Usage: canary feature-flag <sub-command> [options]\",\n \"\",\n \"Sub-commands:\",\n \" list List all feature flags\",\n \" create <name> [--description <text>] [--product <productCardId>]\",\n \" Create a new flag (optionally linked to a product)\",\n \" delete <name> Delete a flag and all its gates\",\n \" enable <name> (--org <orgId> | --user <userId>)\",\n \" Enable a flag for an org or user\",\n \" disable <name> (--org <orgId> | --user <userId>)\",\n \" Disable a flag for an org or user (kept as 'was enabled' history)\",\n \" lifecycle <name> --stage <stage> [--final-value true|false]\",\n \" Mark lifecycle + final value\",\n \" --stage baking --plan @file [--review-interval <days>] [--max-window <days>]\",\n \" Put a flag in the oven (requires a linked product card)\",\n \" product <name> (--product <productCardId> | --clear)\",\n \" Link/unlink a flag to a product board item\",\n \" products [--search <text>] List product board items (find product card ids)\",\n \" oven [--json] List flags currently baking (age + burning state)\",\n \"\",\n \"Stages: active, baking, deprecated, ready_for_cleanup\",\n \"\",\n \"Options:\",\n \" --org <orgId> Target organization\",\n \" --user <userId> Target user\",\n \" --product <productCardId> Product board item (cards.id) to link\",\n \" --clear Clear the product link (product sub-command only)\",\n \" --search <text> Filter product cards by title (products sub-command only)\",\n \" --final-value <true|false> Final value for deprecated/ready_for_cleanup\",\n \" --clear-final-value Clear final value (only valid with --stage active)\",\n \" --plan @file|\\\"text\\\" Monitoring/telemetry plan (required to enter baking)\",\n \" --review-interval <days> Days between oven-check reviews (baking; default 7)\",\n \" --max-window <days> Days before a baking flag 'burns' (default 30)\",\n \" --env <env> Target environment (prod, dev, local)\",\n \" --json Output as JSON (list only)\",\n \" --api-url <url> API URL override (takes precedence over --env)\",\n \" --token <key> API token override\",\n ].join(\"\\n\")\n );\n}\n\nexport async function runFeatureFlag(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === \"help\" || hasFlag(argv, \"--help\", \"-h\")) {\n printFeatureFlagHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n switch (subCommand) {\n case \"list\":\n await handleList(rest, apiUrl, token);\n break;\n case \"create\":\n await handleCreate(rest, apiUrl, token);\n break;\n case \"delete\":\n await handleDelete(rest, apiUrl, token);\n break;\n case \"enable\":\n await handleEnable(rest, apiUrl, token);\n break;\n case \"disable\":\n await handleDisable(rest, apiUrl, token);\n break;\n case \"lifecycle\":\n await handleLifecycle(rest, apiUrl, token);\n break;\n case \"product\":\n await handleProduct(rest, apiUrl, token);\n break;\n case \"products\":\n await handleProducts(rest, apiUrl, token);\n break;\n case \"oven\":\n await handleOven(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printFeatureFlagHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
runRemoteTest
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-CJEKEW7R.js";
|
|
5
5
|
import {
|
|
6
6
|
runLogin
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-G5SXUXSU.js";
|
|
8
8
|
import {
|
|
9
9
|
checkForUpdate
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-AQPJQ5AE.js";
|
|
11
|
+
import "./chunk-ZXRVFFCY.js";
|
|
12
|
+
import "./chunk-CFJXYPTF.js";
|
|
13
13
|
import {
|
|
14
14
|
fetchOrExit,
|
|
15
15
|
isSuperadminToken
|
|
@@ -22,15 +22,15 @@ import {
|
|
|
22
22
|
readStoredAuth,
|
|
23
23
|
resolveConfig,
|
|
24
24
|
resolveOptionalConfig
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-IGHDIWZU.js";
|
|
26
26
|
import {
|
|
27
27
|
installConsoleBranding,
|
|
28
28
|
readBrandEnv,
|
|
29
29
|
specExtension,
|
|
30
30
|
version
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-32P26BZT.js";
|
|
32
32
|
import "./chunk-JWHYXEA2.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-IWKJQZJQ.js";
|
|
34
34
|
import "./chunk-VKVL7WBN.js";
|
|
35
35
|
|
|
36
36
|
// src/index.ts
|
|
@@ -392,6 +392,10 @@ function errorMetadata(error) {
|
|
|
392
392
|
errorMessage: error instanceof Error ? error.message : String(error)
|
|
393
393
|
};
|
|
394
394
|
}
|
|
395
|
+
function isExpectedCliInputError(error) {
|
|
396
|
+
if (!(error instanceof Error)) return false;
|
|
397
|
+
return /^Action index \d+ out of range \(0-\d+\)$/.test(error.message);
|
|
398
|
+
}
|
|
395
399
|
async function createCliUserEventRecorder(argv, cliVersion) {
|
|
396
400
|
if (!shouldTrack(argv)) return null;
|
|
397
401
|
const config = await resolveOptionalConfig(argv);
|
|
@@ -438,11 +442,11 @@ async function recordCliInstrumentationFailure(argv, cliVersion, stage, error) {
|
|
|
438
442
|
}
|
|
439
443
|
|
|
440
444
|
// src/index.ts
|
|
441
|
-
var loadMcp = () => import("./mcp-
|
|
442
|
-
var loadDebugWorkflow = () => import("./debug-workflow-
|
|
443
|
-
var loadRecord = () => import("./record-
|
|
444
|
-
var loadSession = () => import("./session-
|
|
445
|
-
var loadLocal = () => import("./local-
|
|
445
|
+
var loadMcp = () => import("./mcp-LA452TOA.js").then((m) => m.runMcp);
|
|
446
|
+
var loadDebugWorkflow = () => import("./debug-workflow-BXRU72YZ.js").then((m) => m.runDebugWorkflow);
|
|
447
|
+
var loadRecord = () => import("./record-KWKHP2ZY.js").then((m) => m.runRecord);
|
|
448
|
+
var loadSession = () => import("./session-M4ULYDYP.js").then((m) => m.runSession);
|
|
449
|
+
var loadLocal = () => import("./local-VGYRSW22.js").then((m) => m.runLocal);
|
|
446
450
|
function printVersion() {
|
|
447
451
|
console.log(`canary v${version}`);
|
|
448
452
|
}
|
|
@@ -485,7 +489,9 @@ function printHelp({ isSuperadmin }) {
|
|
|
485
489
|
" canary redis <command> [--json] Execute read-only Redis commands",
|
|
486
490
|
" canary docs <sub-command> Manage documentation pages",
|
|
487
491
|
" canary feature-flag <sub-command> Manage feature flags",
|
|
488
|
-
" canary knobs <sub-command> Manage knobs (global config)"
|
|
492
|
+
" canary knobs <sub-command> Manage knobs (global config)",
|
|
493
|
+
" canary product <sub-command> Manage the Product board (cards, fields, flag links)",
|
|
494
|
+
" canary account <sub-command> Manage the Accounts board (accounts, org links)"
|
|
489
495
|
);
|
|
490
496
|
}
|
|
491
497
|
lines.push(
|
|
@@ -581,7 +587,27 @@ function printHelp({ isSuperadmin }) {
|
|
|
581
587
|
" delete <key> Delete a knob",
|
|
582
588
|
" toggle <key> Toggle a boolean knob",
|
|
583
589
|
" lifecycle <key> --stage <stage> [--final-value <value>]",
|
|
584
|
-
" Set lifecycle metadata"
|
|
590
|
+
" Set lifecycle metadata",
|
|
591
|
+
"",
|
|
592
|
+
"Product board sub-commands (org you are logged into):",
|
|
593
|
+
" list [--search <t>] [--priority p0,p1] [--include-deprecated] List items",
|
|
594
|
+
" create <title> [--description <t>] [--stage <s>] [--priority <p0-p3>] Create item",
|
|
595
|
+
" set <id> [--title <t>] [--description <t>] [--priority <p0-p3|null>] Update fields",
|
|
596
|
+
" move <id> --stage <s> [--before <id>] [--after <id>] Move card to a column",
|
|
597
|
+
" delete <id> Delete item",
|
|
598
|
+
" customer add <id> (--account-card <id> | --org <orgId>) [--name <t>] Link customer",
|
|
599
|
+
" customer remove <id> <customerId> Unlink customer",
|
|
600
|
+
" link-flag <cardId> --flag <name> | --flag <name> --clear Link/unlink a feature flag",
|
|
601
|
+
" flags <cardId> List flags linked to a card",
|
|
602
|
+
"",
|
|
603
|
+
"Account board sub-commands (org you are logged into):",
|
|
604
|
+
" list [--search <t>] [--stage <s>] List accounts",
|
|
605
|
+
" create <name> [--description <t>] [--stage <s>] Create account (default stage=prospect)",
|
|
606
|
+
" set <id> [--title <t>] [--description <t>] [--stage <s>] Update fields",
|
|
607
|
+
" delete <id> Delete account",
|
|
608
|
+
" link-org <id> --org <customerOrgId> Bind account to a customer org",
|
|
609
|
+
" unlink-org <id> Remove org link",
|
|
610
|
+
" linked-org <id> Show linked org"
|
|
585
611
|
);
|
|
586
612
|
}
|
|
587
613
|
lines.push("", "Flags:", " -h, --help Show help", " -V, --version Show version");
|
|
@@ -674,7 +700,7 @@ function normalizeExitCode(value) {
|
|
|
674
700
|
}
|
|
675
701
|
async function executeCommand(command, rest) {
|
|
676
702
|
if (command === "upgrade") {
|
|
677
|
-
const { runUpgrade } = await import("./upgrade-
|
|
703
|
+
const { runUpgrade } = await import("./upgrade-4QCRAUHP.js");
|
|
678
704
|
await runUpgrade();
|
|
679
705
|
return;
|
|
680
706
|
}
|
|
@@ -703,7 +729,7 @@ async function executeCommand(command, rest) {
|
|
|
703
729
|
return;
|
|
704
730
|
}
|
|
705
731
|
if (command === "install") {
|
|
706
|
-
const { runInstall } = await import("./install-
|
|
732
|
+
const { runInstall } = await import("./install-XRKEQAFZ.js");
|
|
707
733
|
await runInstall(rest);
|
|
708
734
|
return;
|
|
709
735
|
}
|
|
@@ -740,64 +766,74 @@ async function executeCommand(command, rest) {
|
|
|
740
766
|
return;
|
|
741
767
|
}
|
|
742
768
|
if (command === "psql") {
|
|
743
|
-
const { runPsql } = await import("./psql-
|
|
769
|
+
const { runPsql } = await import("./psql-XGLBI6T7.js");
|
|
744
770
|
await runPsql(rest);
|
|
745
771
|
return;
|
|
746
772
|
}
|
|
747
773
|
if (command === "redis") {
|
|
748
|
-
const { runRedis } = await import("./redis-
|
|
774
|
+
const { runRedis } = await import("./redis-VJGCUJPV.js");
|
|
749
775
|
await runRedis(rest);
|
|
750
776
|
return;
|
|
751
777
|
}
|
|
752
778
|
if (command === "release") {
|
|
753
|
-
const { runRelease } = await import("./release-
|
|
779
|
+
const { runRelease } = await import("./release-NDRHPW6V.js");
|
|
754
780
|
await runRelease(rest);
|
|
755
781
|
return;
|
|
756
782
|
}
|
|
757
783
|
if (command === "docs") {
|
|
758
|
-
const { runDocs } = await import("./docs-
|
|
784
|
+
const { runDocs } = await import("./docs-PVBXPTGR.js");
|
|
759
785
|
await runDocs(rest);
|
|
760
786
|
return;
|
|
761
787
|
}
|
|
762
788
|
if (command === "feature-flag") {
|
|
763
|
-
const { runFeatureFlag } = await import("./feature-flag-
|
|
789
|
+
const { runFeatureFlag } = await import("./feature-flag-K5REGGDY.js");
|
|
764
790
|
await runFeatureFlag(rest);
|
|
765
791
|
return;
|
|
766
792
|
}
|
|
793
|
+
if (command === "product") {
|
|
794
|
+
const { runProduct } = await import("./product-RSZV5HMB.js");
|
|
795
|
+
await runProduct(rest);
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
if (command === "account") {
|
|
799
|
+
const { runAccount } = await import("./account-62I7FG5G.js");
|
|
800
|
+
await runAccount(rest);
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
767
803
|
if (command === "scenarios" || command === "scenario") {
|
|
768
|
-
const { runScenarios } = await import("./scenarios-
|
|
804
|
+
const { runScenarios } = await import("./scenarios-2HRLCGFY.js");
|
|
769
805
|
await runScenarios(rest);
|
|
770
806
|
return;
|
|
771
807
|
}
|
|
772
808
|
if (command === "knobs") {
|
|
773
|
-
const { runKnobs } = await import("./knobs-
|
|
809
|
+
const { runKnobs } = await import("./knobs-6WLJMB44.js");
|
|
774
810
|
await runKnobs(rest);
|
|
775
811
|
return;
|
|
776
812
|
}
|
|
777
813
|
if (command === "issues") {
|
|
778
|
-
const { runIssues } = await import("./issues-
|
|
814
|
+
const { runIssues } = await import("./issues-I3V6GEXU.js");
|
|
779
815
|
await runIssues(rest);
|
|
780
816
|
return;
|
|
781
817
|
}
|
|
782
818
|
if (command === "credential") {
|
|
783
|
-
const { runCredential } = await import("./credential-
|
|
819
|
+
const { runCredential } = await import("./credential-JGVSEGVH.js");
|
|
784
820
|
await runCredential(rest);
|
|
785
821
|
return;
|
|
786
822
|
}
|
|
787
823
|
if (command === "persona" || command === "personas" || // Backwards-compat aliases for the former "credential template" name.
|
|
788
824
|
command === "credential-template" || command === "credential-templates") {
|
|
789
|
-
const { runCredentialTemplate } = await import("./credential-template-
|
|
825
|
+
const { runCredentialTemplate } = await import("./credential-template-CWWMOKB2.js");
|
|
790
826
|
await runCredentialTemplate(rest);
|
|
791
827
|
return;
|
|
792
828
|
}
|
|
793
829
|
if (command === "workflow") {
|
|
794
|
-
const { runWorkflow } = await import("./workflow-
|
|
830
|
+
const { runWorkflow } = await import("./workflow-4J23FV7K.js");
|
|
795
831
|
await runWorkflow(rest);
|
|
796
832
|
return;
|
|
797
833
|
}
|
|
798
834
|
if (command === "spec") {
|
|
799
|
-
const { resolveConfig: resolveConfig2 } = await import("./auth-
|
|
800
|
-
const { handleSpec } = await import("./spec-
|
|
835
|
+
const { resolveConfig: resolveConfig2 } = await import("./auth-DURHUZDW.js");
|
|
836
|
+
const { handleSpec } = await import("./spec-XZ2TKUFZ.js");
|
|
801
837
|
const wantsAuth = rest[0] === "compile" || rest[0] === "pull" || rest[0] === "diff";
|
|
802
838
|
if (wantsAuth) {
|
|
803
839
|
const { apiUrl, token } = await resolveConfig2(rest);
|
|
@@ -807,67 +843,78 @@ async function executeCommand(command, rest) {
|
|
|
807
843
|
}
|
|
808
844
|
return;
|
|
809
845
|
}
|
|
846
|
+
if (command === "augmentor" || command === "augmentors") {
|
|
847
|
+
const { resolveConfig: resolveConfig2 } = await import("./auth-DURHUZDW.js");
|
|
848
|
+
const { runAugmentor } = await import("./augmentor-GAF3MFY6.js");
|
|
849
|
+
if (rest[0] === void 0 || rest[0] === "help" || rest[0] === "--help") {
|
|
850
|
+
await runAugmentor(rest, "", "");
|
|
851
|
+
} else {
|
|
852
|
+
const { apiUrl, token } = await resolveConfig2(rest);
|
|
853
|
+
await runAugmentor(rest, apiUrl, token);
|
|
854
|
+
}
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
810
857
|
if (command === "api-catalog") {
|
|
811
|
-
const { resolveConfig: resolveConfig2 } = await import("./auth-
|
|
812
|
-
const { runApiCatalog } = await import("./api-catalog-
|
|
858
|
+
const { resolveConfig: resolveConfig2 } = await import("./auth-DURHUZDW.js");
|
|
859
|
+
const { runApiCatalog } = await import("./api-catalog-CAJUASVC.js");
|
|
813
860
|
const { apiUrl, token } = await resolveConfig2(rest);
|
|
814
861
|
await runApiCatalog(rest, apiUrl, token);
|
|
815
862
|
return;
|
|
816
863
|
}
|
|
817
864
|
if (command === "skill" || command === "skills") {
|
|
818
|
-
const { runSkill } = await import("./skill-
|
|
865
|
+
const { runSkill } = await import("./skill-4DGPRDUC.js");
|
|
819
866
|
await runSkill(rest);
|
|
820
867
|
return;
|
|
821
868
|
}
|
|
822
869
|
if (command === "task") {
|
|
823
|
-
const { runTask } = await import("./task-
|
|
870
|
+
const { runTask } = await import("./task-MCUHAVTD.js");
|
|
824
871
|
await runTask(rest);
|
|
825
872
|
return;
|
|
826
873
|
}
|
|
827
874
|
if (command === "test-suite") {
|
|
828
|
-
const { runTestSuite } = await import("./test-suite-
|
|
875
|
+
const { runTestSuite } = await import("./test-suite-BICBRSBP.js");
|
|
829
876
|
await runTestSuite(rest);
|
|
830
877
|
return;
|
|
831
878
|
}
|
|
832
879
|
if (command === "triage") {
|
|
833
|
-
const { runTriage } = await import("./triage-
|
|
880
|
+
const { runTriage } = await import("./triage-M3RZ2ASB.js");
|
|
834
881
|
await runTriage(rest);
|
|
835
882
|
return;
|
|
836
883
|
}
|
|
837
884
|
if (command === "application" || command === "applications" || command === "property" || command === "properties") {
|
|
838
|
-
const { runProperty } = await import("./property-
|
|
885
|
+
const { runProperty } = await import("./property-YP4GHQAR.js");
|
|
839
886
|
await runProperty(rest);
|
|
840
887
|
return;
|
|
841
888
|
}
|
|
842
889
|
if (command === "environment" || command === "env") {
|
|
843
|
-
const { runEnvironment } = await import("./environment-
|
|
890
|
+
const { runEnvironment } = await import("./environment-WZKIO3R3.js");
|
|
844
891
|
await runEnvironment(rest);
|
|
845
892
|
return;
|
|
846
893
|
}
|
|
847
894
|
if (command === "sandbox") {
|
|
848
|
-
const { runSandbox } = await import("./sandbox-
|
|
895
|
+
const { runSandbox } = await import("./sandbox-OOCANWOG.js");
|
|
849
896
|
await runSandbox(rest);
|
|
850
897
|
return;
|
|
851
898
|
}
|
|
852
899
|
if (command === "attachment" || command === "attachments") {
|
|
853
|
-
const { runAttachment } = await import("./attachment-
|
|
900
|
+
const { runAttachment } = await import("./attachment-RL4AZUJE.js");
|
|
854
901
|
await runAttachment(rest);
|
|
855
902
|
return;
|
|
856
903
|
}
|
|
857
904
|
if (command === "tag" || command === "tags") {
|
|
858
|
-
const { runTag } = await import("./tag-
|
|
905
|
+
const { runTag } = await import("./tag-T45MMSCH.js");
|
|
859
906
|
await runTag(rest);
|
|
860
907
|
return;
|
|
861
908
|
}
|
|
862
909
|
if (command === "trace") {
|
|
863
|
-
const { runTrace } = await import("./trace-
|
|
910
|
+
const { runTrace } = await import("./trace-2BAPMYAS.js");
|
|
864
911
|
await runTrace(rest);
|
|
865
912
|
return;
|
|
866
913
|
}
|
|
867
914
|
if (command === "auth") {
|
|
868
915
|
const sub = rest[0];
|
|
869
916
|
if (sub === "doctor") {
|
|
870
|
-
const { runAuthDoctor } = await import("./doctor-
|
|
917
|
+
const { runAuthDoctor } = await import("./doctor-RHMKD4W5.js");
|
|
871
918
|
await runAuthDoctor(rest.slice(1));
|
|
872
919
|
return;
|
|
873
920
|
}
|
|
@@ -913,6 +960,7 @@ async function main(argv) {
|
|
|
913
960
|
const startedAt = Date.now();
|
|
914
961
|
const originalExit = process4.exit.bind(process4);
|
|
915
962
|
let finalExitCode = 0;
|
|
963
|
+
let handledExpectedInputError = false;
|
|
916
964
|
if (tracking) {
|
|
917
965
|
await tracking.recorder.recordCommandStarted(tracking.metadata);
|
|
918
966
|
}
|
|
@@ -957,6 +1005,7 @@ async function main(argv) {
|
|
|
957
1005
|
}
|
|
958
1006
|
} else {
|
|
959
1007
|
finalExitCode = normalizeExitCode(process4.exitCode) || 1;
|
|
1008
|
+
const expectedInputError = isExpectedCliInputError(error);
|
|
960
1009
|
if (tracking) {
|
|
961
1010
|
await tracking.recorder.recordCommandFailed({
|
|
962
1011
|
...tracking.metadata,
|
|
@@ -965,20 +1014,27 @@ async function main(argv) {
|
|
|
965
1014
|
errorKind: error instanceof Error ? error.name : typeof error,
|
|
966
1015
|
errorName: error instanceof Error ? error.name : void 0,
|
|
967
1016
|
errorMessage: error instanceof Error ? error.message : String(error),
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
1017
|
+
...expectedInputError ? {} : {
|
|
1018
|
+
reportToSentry: true,
|
|
1019
|
+
sentryFingerprint: [
|
|
1020
|
+
"canary-cli",
|
|
1021
|
+
tracking.metadata.commandPath,
|
|
1022
|
+
error instanceof Error ? error.name : typeof error
|
|
1023
|
+
]
|
|
1024
|
+
}
|
|
974
1025
|
});
|
|
975
1026
|
}
|
|
976
|
-
|
|
1027
|
+
if (expectedInputError) {
|
|
1028
|
+
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
1029
|
+
handledExpectedInputError = true;
|
|
1030
|
+
} else {
|
|
1031
|
+
throw error;
|
|
1032
|
+
}
|
|
977
1033
|
}
|
|
978
1034
|
} finally {
|
|
979
1035
|
process4.exit = originalExit;
|
|
980
1036
|
}
|
|
981
|
-
if (finalExitCode !== 0) {
|
|
1037
|
+
if (finalExitCode !== 0 || handledExpectedInputError) {
|
|
982
1038
|
originalExit(finalExitCode);
|
|
983
1039
|
}
|
|
984
1040
|
}
|