@runcofactor/cli 0.15.1 → 0.16.0
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 → account-ZMV7NEFM.js} +4 -4
- package/dist/account-ZMV7NEFM.js.map +1 -0
- package/dist/{api-catalog-CAJUASVC.js → api-catalog-6HNOGVPA.js} +3 -3
- package/dist/{attachment-RL4AZUJE.js → attachment-QAHR54HQ.js} +3 -3
- package/dist/{augmentor-GAF3MFY6.js → augmentor-7T3L6ZR4.js} +3 -3
- package/dist/{chunk-26U3DGUM.js → chunk-7YJTQCPX.js} +3 -5
- package/dist/chunk-7YJTQCPX.js.map +1 -0
- package/dist/{chunk-PXFDH6YL.js → chunk-A4ISG3VX.js} +55 -15
- package/dist/{chunk-PXFDH6YL.js.map → chunk-A4ISG3VX.js.map} +1 -1
- package/dist/{chunk-5R4HMSNX.js → chunk-AI3Y3AZH.js} +24834 -24813
- package/dist/chunk-AI3Y3AZH.js.map +1 -0
- package/dist/{chunk-HKQ5XQAQ.js → chunk-CEXV3MOC.js} +3 -3
- package/dist/{chunk-VKBTI5EF.js → chunk-D6AVOPOS.js} +2 -2
- package/dist/{chunk-ZXRVFFCY.js → chunk-DT2CEH2V.js} +2 -2
- package/dist/{chunk-IWKJQZJQ.js → chunk-GZVCNYR4.js} +55 -55
- package/dist/chunk-GZVCNYR4.js.map +1 -0
- package/dist/{chunk-CJEKEW7R.js → chunk-LFFWD5JZ.js} +2 -2
- package/dist/{chunk-UZ2ZA5A6.js → chunk-RGDIVW3O.js} +2 -2
- package/dist/{chunk-CFJXYPTF.js → chunk-UAJUZLDE.js} +11 -3
- package/dist/chunk-UAJUZLDE.js.map +1 -0
- package/dist/{credential-JGVSEGVH.js → credential-X6QKX473.js} +3 -3
- package/dist/{credential-template-CWWMOKB2.js → credential-template-GD3D4MBI.js} +3 -3
- package/dist/{debug-workflow-BXRU72YZ.js → debug-workflow-AAEOAME2.js} +6 -6
- package/dist/{src-CV57ZD6I.js → dist-QLTVBUMD.js} +7 -9
- package/dist/{docs-PVBXPTGR.js → docs-BVUEXBY3.js} +3 -3
- package/dist/{environment-WZKIO3R3.js → environment-WE7VVE6I.js} +3 -3
- package/dist/{feature-flag-K5REGGDY.js → feature-flag-VJO2TJFT.js} +9 -8
- package/dist/feature-flag-VJO2TJFT.js.map +1 -0
- package/dist/index.js +129 -44
- package/dist/index.js.map +1 -1
- package/dist/{init-FFUZO5D7.js → init-RQHHKJJD.js} +8 -8
- package/dist/{install-XRKEQAFZ.js → install-CQLHNZ6U.js} +3 -3
- package/dist/{issues-I3V6GEXU.js → issues-HK2JA5JS.js} +3 -3
- package/dist/{knobs-6WLJMB44.js → knobs-ETJAV6YM.js} +3 -3
- package/dist/{list-PHC7VYNS.js → list-F6DGGW3Z.js} +3 -3
- package/dist/{local-VGYRSW22.js → local-CMAY54I5.js} +5 -5
- package/dist/{login-QPU2BKG2.js → login-6CKG664C.js} +8 -8
- package/dist/{mcp-LA452TOA.js → mcp-GC2WOOZO.js} +5 -6
- package/dist/{mcp-LA452TOA.js.map → mcp-GC2WOOZO.js.map} +1 -1
- package/dist/metrics-IXICURAA.js +367 -0
- package/dist/metrics-IXICURAA.js.map +1 -0
- package/dist/{product-RSZV5HMB.js → product-BUJWPYKB.js} +4 -3
- package/dist/product-BUJWPYKB.js.map +1 -0
- package/dist/{property-YP4GHQAR.js → property-4EXPWRNT.js} +3 -3
- package/dist/{record-KWKHP2ZY.js → record-HL4QA7OX.js} +4 -4
- package/dist/{record-KWKHP2ZY.js.map → record-HL4QA7OX.js.map} +1 -1
- package/dist/{release-NDRHPW6V.js → release-2SMK5Y3V.js} +3 -3
- package/dist/{sandbox-OOCANWOG.js → sandbox-ORAPKOH3.js} +3 -3
- package/dist/{scenarios-2HRLCGFY.js → scenarios-DM5FDCAF.js} +3 -3
- package/dist/{session-M4ULYDYP.js → session-X6IYGWYG.js} +14 -16
- package/dist/{session-M4ULYDYP.js.map → session-X6IYGWYG.js.map} +1 -1
- package/dist/{skill-4DGPRDUC.js → skill-ZU5V2EE5.js} +24 -14
- package/dist/skill-ZU5V2EE5.js.map +1 -0
- package/dist/skills/optimize-cache/SKILL.md +9 -3
- package/dist/{spec-XZ2TKUFZ.js → spec-KO5QD6AY.js} +3 -3
- package/dist/{src-HL7HEJIW.js → src-DSD34JIX.js} +2 -2
- package/dist/{src-2FK3JHGW.js → src-HTGNKBUF.js} +15 -7
- package/dist/{src-2FK3JHGW.js.map → src-HTGNKBUF.js.map} +1 -1
- package/dist/{src-OU7544PM.js → src-PDYXACRP.js} +2 -2
- package/dist/{start-IYKF3C3X.js → start-2ECN4LX5.js} +6 -6
- package/dist/{tag-T45MMSCH.js → tag-R5I72HJ6.js} +4 -4
- package/dist/{task-MCUHAVTD.js → task-V3JMSJIM.js} +3 -3
- package/dist/{test-suite-BICBRSBP.js → test-suite-NOYVK6YX.js} +5 -5
- package/dist/{trace-2BAPMYAS.js → trace-NOYEKNO4.js} +4 -5
- package/dist/{triage-M3RZ2ASB.js → triage-4RFATHBE.js} +4 -4
- package/dist/utilities-3WMXE743.js +441 -0
- package/dist/utilities-3WMXE743.js.map +1 -0
- package/dist/{workflow-4J23FV7K.js → workflow-DC7WOTTW.js} +13 -17
- package/dist/workflow-DC7WOTTW.js.map +1 -0
- package/dist/{workflow-cache-XPSK6KC7.js → workflow-cache-SDSI6SMF.js} +6 -6
- package/dist/{workflow-cache-XPSK6KC7.js.map → workflow-cache-SDSI6SMF.js.map} +1 -1
- package/dist/{workflow-debug-W4USZH35.js → workflow-debug-6UQYP67Q.js} +6 -7
- package/dist/{workflow-debug-W4USZH35.js.map → workflow-debug-6UQYP67Q.js.map} +1 -1
- package/dist/{workflow-proposals-5E3DTYZB.js → workflow-proposals-67AVGMHX.js} +6 -6
- package/package.json +1 -1
- package/dist/account-62I7FG5G.js.map +0 -1
- package/dist/chunk-26U3DGUM.js.map +0 -1
- package/dist/chunk-5R4HMSNX.js.map +0 -1
- package/dist/chunk-CFJXYPTF.js.map +0 -1
- package/dist/chunk-IWKJQZJQ.js.map +0 -1
- package/dist/chunk-KRWRUU6R.js +0 -114
- package/dist/chunk-KRWRUU6R.js.map +0 -1
- package/dist/feature-flag-K5REGGDY.js.map +0 -1
- package/dist/pdf-extract-YHE54XU4.js +0 -13
- package/dist/product-RSZV5HMB.js.map +0 -1
- package/dist/skill-4DGPRDUC.js.map +0 -1
- package/dist/triage-M3RZ2ASB.js.map +0 -1
- package/dist/workflow-4J23FV7K.js.map +0 -1
- /package/dist/{api-catalog-CAJUASVC.js.map → api-catalog-6HNOGVPA.js.map} +0 -0
- /package/dist/{attachment-RL4AZUJE.js.map → attachment-QAHR54HQ.js.map} +0 -0
- /package/dist/{augmentor-GAF3MFY6.js.map → augmentor-7T3L6ZR4.js.map} +0 -0
- /package/dist/{chunk-HKQ5XQAQ.js.map → chunk-CEXV3MOC.js.map} +0 -0
- /package/dist/{chunk-VKBTI5EF.js.map → chunk-D6AVOPOS.js.map} +0 -0
- /package/dist/{chunk-ZXRVFFCY.js.map → chunk-DT2CEH2V.js.map} +0 -0
- /package/dist/{chunk-CJEKEW7R.js.map → chunk-LFFWD5JZ.js.map} +0 -0
- /package/dist/{chunk-UZ2ZA5A6.js.map → chunk-RGDIVW3O.js.map} +0 -0
- /package/dist/{credential-JGVSEGVH.js.map → credential-X6QKX473.js.map} +0 -0
- /package/dist/{credential-template-CWWMOKB2.js.map → credential-template-GD3D4MBI.js.map} +0 -0
- /package/dist/{debug-workflow-BXRU72YZ.js.map → debug-workflow-AAEOAME2.js.map} +0 -0
- /package/dist/{pdf-extract-YHE54XU4.js.map → dist-QLTVBUMD.js.map} +0 -0
- /package/dist/{docs-PVBXPTGR.js.map → docs-BVUEXBY3.js.map} +0 -0
- /package/dist/{environment-WZKIO3R3.js.map → environment-WE7VVE6I.js.map} +0 -0
- /package/dist/{init-FFUZO5D7.js.map → init-RQHHKJJD.js.map} +0 -0
- /package/dist/{install-XRKEQAFZ.js.map → install-CQLHNZ6U.js.map} +0 -0
- /package/dist/{issues-I3V6GEXU.js.map → issues-HK2JA5JS.js.map} +0 -0
- /package/dist/{knobs-6WLJMB44.js.map → knobs-ETJAV6YM.js.map} +0 -0
- /package/dist/{list-PHC7VYNS.js.map → list-F6DGGW3Z.js.map} +0 -0
- /package/dist/{local-VGYRSW22.js.map → local-CMAY54I5.js.map} +0 -0
- /package/dist/{login-QPU2BKG2.js.map → login-6CKG664C.js.map} +0 -0
- /package/dist/{property-YP4GHQAR.js.map → property-4EXPWRNT.js.map} +0 -0
- /package/dist/{release-NDRHPW6V.js.map → release-2SMK5Y3V.js.map} +0 -0
- /package/dist/{sandbox-OOCANWOG.js.map → sandbox-ORAPKOH3.js.map} +0 -0
- /package/dist/{scenarios-2HRLCGFY.js.map → scenarios-DM5FDCAF.js.map} +0 -0
- /package/dist/{spec-XZ2TKUFZ.js.map → spec-KO5QD6AY.js.map} +0 -0
- /package/dist/{src-HL7HEJIW.js.map → src-DSD34JIX.js.map} +0 -0
- /package/dist/{src-CV57ZD6I.js.map → src-PDYXACRP.js.map} +0 -0
- /package/dist/{start-IYKF3C3X.js.map → start-2ECN4LX5.js.map} +0 -0
- /package/dist/{src-OU7544PM.js.map → tag-R5I72HJ6.js.map} +0 -0
- /package/dist/{task-MCUHAVTD.js.map → task-V3JMSJIM.js.map} +0 -0
- /package/dist/{test-suite-BICBRSBP.js.map → test-suite-NOYVK6YX.js.map} +0 -0
- /package/dist/{tag-T45MMSCH.js.map → trace-NOYEKNO4.js.map} +0 -0
- /package/dist/{trace-2BAPMYAS.js.map → triage-4RFATHBE.js.map} +0 -0
- /package/dist/{workflow-proposals-5E3DTYZB.js.map → workflow-proposals-67AVGMHX.js.map} +0 -0
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
apiRequest,
|
|
4
4
|
fetchProperties,
|
|
5
5
|
getApplicationArg
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-UAJUZLDE.js";
|
|
7
7
|
import "./chunk-3CZU7XCS.js";
|
|
8
8
|
import {
|
|
9
9
|
getArgValue,
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
} from "./chunk-IGHDIWZU.js";
|
|
13
13
|
import "./chunk-32P26BZT.js";
|
|
14
14
|
import "./chunk-JWHYXEA2.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-GZVCNYR4.js";
|
|
16
16
|
import "./chunk-VKVL7WBN.js";
|
|
17
17
|
|
|
18
18
|
// src/credential-template.ts
|
|
@@ -290,4 +290,4 @@ async function runCredentialTemplate(argv) {
|
|
|
290
290
|
export {
|
|
291
291
|
runCredentialTemplate
|
|
292
292
|
};
|
|
293
|
-
//# sourceMappingURL=credential-template-
|
|
293
|
+
//# sourceMappingURL=credential-template-GD3D4MBI.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
downloadStorageState
|
|
4
|
+
} from "./chunk-UAJUZLDE.js";
|
|
5
|
+
import "./chunk-3CZU7XCS.js";
|
|
2
6
|
import {
|
|
3
7
|
acquireCloudLock,
|
|
4
8
|
createSessionWithRelay,
|
|
5
9
|
deleteSession,
|
|
6
10
|
releaseCloudLock
|
|
7
11
|
} from "./chunk-J6SH7GQT.js";
|
|
8
|
-
import {
|
|
9
|
-
downloadStorageState
|
|
10
|
-
} from "./chunk-CFJXYPTF.js";
|
|
11
|
-
import "./chunk-3CZU7XCS.js";
|
|
12
12
|
import {
|
|
13
13
|
getArgValue,
|
|
14
14
|
hasFlag,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "./chunk-IGHDIWZU.js";
|
|
17
17
|
import "./chunk-32P26BZT.js";
|
|
18
18
|
import "./chunk-JWHYXEA2.js";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-GZVCNYR4.js";
|
|
20
20
|
import "./chunk-VKVL7WBN.js";
|
|
21
21
|
|
|
22
22
|
// src/debug-workflow.ts
|
|
@@ -257,4 +257,4 @@ async function runDebugWorkflow(argv) {
|
|
|
257
257
|
export {
|
|
258
258
|
runDebugWorkflow
|
|
259
259
|
};
|
|
260
|
-
//# sourceMappingURL=debug-workflow-
|
|
260
|
+
//# sourceMappingURL=debug-workflow-AAEOAME2.js.map
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
compareEditingContexts,
|
|
35
35
|
compareSnapshots,
|
|
36
36
|
computeFingerprint,
|
|
37
|
+
consoleLogger,
|
|
37
38
|
cropImage,
|
|
38
39
|
decodeV2Value,
|
|
39
40
|
detectGrid,
|
|
@@ -60,6 +61,8 @@ import {
|
|
|
60
61
|
extractIndexedDB,
|
|
61
62
|
extractLinks,
|
|
62
63
|
extractLinksFromTree,
|
|
64
|
+
extractPdfText,
|
|
65
|
+
extractPdfTextFromBuffer,
|
|
63
66
|
extractSemanticHint,
|
|
64
67
|
extractSnapshotYaml,
|
|
65
68
|
extractTablesFromSnapshot,
|
|
@@ -107,22 +110,17 @@ import {
|
|
|
107
110
|
restoreIndexedDB,
|
|
108
111
|
searchElements,
|
|
109
112
|
setCdpScreencastLogger,
|
|
113
|
+
setPdfExtractLogger,
|
|
110
114
|
setSnapshotAnalyzerLogger,
|
|
111
115
|
sortMatchesByContext,
|
|
112
116
|
withBrowserLaunchRetry,
|
|
113
117
|
withRecoveryNotice,
|
|
114
118
|
withRecoveryNoticeMCP,
|
|
115
119
|
withToolTimeout
|
|
116
|
-
} from "./chunk-
|
|
120
|
+
} from "./chunk-AI3Y3AZH.js";
|
|
117
121
|
import "./chunk-JWHYXEA2.js";
|
|
118
|
-
import "./chunk-
|
|
122
|
+
import "./chunk-GZVCNYR4.js";
|
|
119
123
|
import "./chunk-6LEZCKKV.js";
|
|
120
|
-
import {
|
|
121
|
-
consoleLogger,
|
|
122
|
-
extractPdfText,
|
|
123
|
-
extractPdfTextFromBuffer,
|
|
124
|
-
setPdfExtractLogger
|
|
125
|
-
} from "./chunk-KRWRUU6R.js";
|
|
126
124
|
import "./chunk-VKVL7WBN.js";
|
|
127
125
|
export {
|
|
128
126
|
BROWSER_LIFECYCLE_TOOLS,
|
|
@@ -244,4 +242,4 @@ export {
|
|
|
244
242
|
withRecoveryNoticeMCP,
|
|
245
243
|
withToolTimeout
|
|
246
244
|
};
|
|
247
|
-
//# sourceMappingURL=
|
|
245
|
+
//# sourceMappingURL=dist-QLTVBUMD.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
apiRequest
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-UAJUZLDE.js";
|
|
5
5
|
import "./chunk-3CZU7XCS.js";
|
|
6
6
|
import {
|
|
7
7
|
getArgValue,
|
|
@@ -12,7 +12,7 @@ import "./chunk-32P26BZT.js";
|
|
|
12
12
|
import {
|
|
13
13
|
getSubDir
|
|
14
14
|
} from "./chunk-JWHYXEA2.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-GZVCNYR4.js";
|
|
16
16
|
import "./chunk-VKVL7WBN.js";
|
|
17
17
|
|
|
18
18
|
// src/docs.ts
|
|
@@ -448,4 +448,4 @@ async function runDocs(argv) {
|
|
|
448
448
|
export {
|
|
449
449
|
runDocs
|
|
450
450
|
};
|
|
451
|
-
//# sourceMappingURL=docs-
|
|
451
|
+
//# sourceMappingURL=docs-BVUEXBY3.js.map
|
|
@@ -2,7 +2,7 @@ import { createRequire as __cr } from "module"; const require = __cr(import.meta
|
|
|
2
2
|
import {
|
|
3
3
|
apiRequest,
|
|
4
4
|
fetchProperties
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-UAJUZLDE.js";
|
|
6
6
|
import "./chunk-3CZU7XCS.js";
|
|
7
7
|
import {
|
|
8
8
|
getArgValue,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from "./chunk-IGHDIWZU.js";
|
|
12
12
|
import "./chunk-32P26BZT.js";
|
|
13
13
|
import "./chunk-JWHYXEA2.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-GZVCNYR4.js";
|
|
15
15
|
import "./chunk-VKVL7WBN.js";
|
|
16
16
|
|
|
17
17
|
// src/environment.ts
|
|
@@ -218,4 +218,4 @@ async function runEnvironment(argv) {
|
|
|
218
218
|
export {
|
|
219
219
|
runEnvironment
|
|
220
220
|
};
|
|
221
|
-
//# sourceMappingURL=environment-
|
|
221
|
+
//# sourceMappingURL=environment-WE7VVE6I.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
fetchList,
|
|
5
5
|
parseLifecycleStage,
|
|
6
6
|
toLifecycleLabel
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-UAJUZLDE.js";
|
|
8
8
|
import "./chunk-3CZU7XCS.js";
|
|
9
9
|
import {
|
|
10
10
|
getArgValue,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from "./chunk-IGHDIWZU.js";
|
|
14
14
|
import "./chunk-32P26BZT.js";
|
|
15
15
|
import "./chunk-JWHYXEA2.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-GZVCNYR4.js";
|
|
17
17
|
import "./chunk-VKVL7WBN.js";
|
|
18
18
|
|
|
19
19
|
// src/feature-flag.ts
|
|
@@ -57,7 +57,7 @@ async function handleList(argv, apiUrl, token) {
|
|
|
57
57
|
const orgCount = flag.organizations?.length ?? 0;
|
|
58
58
|
const userCount = flag.users?.length ?? 0;
|
|
59
59
|
const lifecycle = `lifecycle=${toLifecycleLabel(flag.lifecycleStage)}`;
|
|
60
|
-
const finalValue = flag.lifecycleStage === "active" || flag.lifecycleStage === "baking" ? "" : ` final=${flag.finalValue === true ? "true" : "false"}`;
|
|
60
|
+
const finalValue = flag.lifecycleStage === "active" || flag.lifecycleStage === "baking" || flag.lifecycleStage === "internal" ? "" : ` final=${flag.finalValue === true ? "true" : "false"}`;
|
|
61
61
|
const bake = flag.lifecycleStage === "baking" ? formatBakeSuffix(flag) : "";
|
|
62
62
|
const stale = flag.isStale ? " [STALE]" : "";
|
|
63
63
|
const product = flag.productCardId ? ` product=${flag.productTitle ?? flag.productCardId}` : "";
|
|
@@ -240,13 +240,13 @@ async function handleLifecycle(argv, apiUrl, token) {
|
|
|
240
240
|
const name = argv[0];
|
|
241
241
|
if (!name || name.startsWith("--")) {
|
|
242
242
|
console.error("Error: Missing flag name.");
|
|
243
|
-
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>]');
|
|
243
|
+
console.error('Usage: canary feature-flag lifecycle <name> --stage <active|baking|internal|deprecated|ready_for_cleanup> [--final-value true|false] [--plan @file|"text"] [--review-interval <days>] [--max-window <days>]');
|
|
244
244
|
process.exit(1);
|
|
245
245
|
}
|
|
246
246
|
const stage = parseLifecycleStage(argv);
|
|
247
247
|
const rawFinalValue = getArgValue(argv, "--final-value");
|
|
248
248
|
const clearFinalValue = hasFlag(argv, "--clear-final-value");
|
|
249
|
-
const gateDriven = stage === "active" || stage === "baking";
|
|
249
|
+
const gateDriven = stage === "active" || stage === "baking" || stage === "internal";
|
|
250
250
|
if (rawFinalValue !== void 0 && clearFinalValue) {
|
|
251
251
|
console.error("Error: use either --final-value or --clear-final-value, not both.");
|
|
252
252
|
process.exit(1);
|
|
@@ -314,7 +314,7 @@ async function handleLifecycle(argv, apiUrl, token) {
|
|
|
314
314
|
);
|
|
315
315
|
return;
|
|
316
316
|
}
|
|
317
|
-
const final = result.flag.lifecycleStage === "active" ? "(none)" : result.flag.finalValue === true ? "true" : "false";
|
|
317
|
+
const final = result.flag.lifecycleStage === "active" || result.flag.lifecycleStage === "internal" ? "(none)" : result.flag.finalValue === true ? "true" : "false";
|
|
318
318
|
console.log(`Updated lifecycle for ${name}: stage=${toLifecycleLabel(result.flag.lifecycleStage)}, final=${final}`);
|
|
319
319
|
}
|
|
320
320
|
async function handleOven(argv, apiUrl, token) {
|
|
@@ -364,7 +364,8 @@ function printFeatureFlagHelp() {
|
|
|
364
364
|
" products [--search <text>] List product board items (find product card ids)",
|
|
365
365
|
" oven [--json] List flags currently baking (age + burning state)",
|
|
366
366
|
"",
|
|
367
|
-
"Stages: active, baking, deprecated, ready_for_cleanup",
|
|
367
|
+
"Stages: active, baking, internal, deprecated, ready_for_cleanup",
|
|
368
|
+
" internal: long-lived internal-only product (gated to internal orgs only; drives the Internal board column)",
|
|
368
369
|
"",
|
|
369
370
|
"Options:",
|
|
370
371
|
" --org <orgId> Target organization",
|
|
@@ -428,4 +429,4 @@ async function runFeatureFlag(argv) {
|
|
|
428
429
|
export {
|
|
429
430
|
runFeatureFlag
|
|
430
431
|
};
|
|
431
|
-
//# sourceMappingURL=feature-flag-
|
|
432
|
+
//# sourceMappingURL=feature-flag-VJO2TJFT.js.map
|
|
@@ -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 and internal are gate-driven like active — no final value.\n const finalValue =\n flag.lifecycleStage === \"active\" ||\n flag.lifecycleStage === \"baking\" ||\n flag.lifecycleStage === \"internal\"\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|internal|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 // active, baking and internal are gate-driven (no final value); deprecated\n // and ready_for_cleanup carry a forced final value.\n const gateDriven = stage === \"active\" || stage === \"baking\" || stage === \"internal\";\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\" || result.flag.lifecycleStage === \"internal\"\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, internal, deprecated, ready_for_cleanup\",\n \" internal: long-lived internal-only product (gated to internal orgs only; drives the Internal board column)\",\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":[]}
|