@coze-arch/cli 0.0.12-alpha.e3bedc → 0.0.13

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.
@@ -0,0 +1,43 @@
1
+ import { useEffect, ReactNode } from 'react';
2
+ import { Platform } from 'react-native';
3
+
4
+ const STYLE_ID = 'coze-pretty-scrollbar';
5
+
6
+ function WebOnlyPrettyScrollbar({ children }: { children: ReactNode }) {
7
+ useEffect(() => {
8
+ if (Platform.OS === 'web') {
9
+ let style = document.getElementById(STYLE_ID);
10
+ if (!style) {
11
+ style = document.createElement('style');
12
+ style.id = STYLE_ID;
13
+ style.textContent = `
14
+ ::-webkit-scrollbar {
15
+ width: 4px;
16
+ height: 4px;
17
+ }
18
+
19
+ ::-webkit-scrollbar-track {
20
+ background: transparent;
21
+ }
22
+
23
+ ::-webkit-scrollbar-thumb {
24
+ background: rgba(0, 0, 0, 0.2);
25
+ border-radius: 2px;
26
+ }
27
+ `;
28
+ document.head.appendChild(style);
29
+ }
30
+
31
+ return () => {
32
+ const existingStyle = document.getElementById(STYLE_ID);
33
+ if (existingStyle) {
34
+ existingStyle.remove();
35
+ }
36
+ }
37
+ }
38
+ }, []);
39
+
40
+ return <>{children}</>
41
+ }
42
+
43
+ export { WebOnlyPrettyScrollbar }
@@ -2,17 +2,20 @@ import { AuthProvider } from '@/contexts/AuthContext';
2
2
  import { type ReactNode } from 'react';
3
3
  import { GestureHandlerRootView } from 'react-native-gesture-handler';
4
4
  import { WebOnlyColorSchemeUpdater } from './ColorSchemeUpdater';
5
+ import { WebOnlyPrettyScrollbar } from './PrettyScrollbar'
5
6
  import { HeroUINativeProvider } from '@/heroui';
6
7
 
7
8
  function Provider({ children }: { children: ReactNode }) {
8
9
  return <WebOnlyColorSchemeUpdater>
9
- <AuthProvider>
10
- <GestureHandlerRootView style={{ flex: 1 }}>
11
- <HeroUINativeProvider>
12
- {children}
13
- </HeroUINativeProvider>
14
- </GestureHandlerRootView>
15
- </AuthProvider>
10
+ <WebOnlyPrettyScrollbar>
11
+ <AuthProvider>
12
+ <GestureHandlerRootView style={{ flex: 1 }}>
13
+ <HeroUINativeProvider>
14
+ {children}
15
+ </HeroUINativeProvider>
16
+ </GestureHandlerRootView>
17
+ </AuthProvider>
18
+ </WebOnlyPrettyScrollbar>
16
19
  </WebOnlyColorSchemeUpdater>
17
20
  }
18
21
 
package/lib/cli.js CHANGED
@@ -2107,7 +2107,7 @@ const EventBuilder = {
2107
2107
  };
2108
2108
 
2109
2109
  var name = "@coze-arch/cli";
2110
- var version = "0.0.12-alpha.e3bedc";
2110
+ var version = "0.0.13";
2111
2111
  var description = "coze coding devtools cli";
2112
2112
  var license = "MIT";
2113
2113
  var author = "fanwenjie.fe@bytedance.com";
@@ -6037,9 +6037,115 @@ const detectTemplateKey = async (
6037
6037
  }
6038
6038
  };
6039
6039
 
6040
- function _optionalChain$3(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
6040
+ const PATCH_FG_ENDPOINT =
6041
+ 'https://bytegate.zijieapi.com/api/v1/workspace/feature_gates/values?workspace=CozeCoding';
6042
+ const PATCH_FG_TIMEOUT_MS = 2000;
6043
+
6044
+ const PATCH_FG_REQUEST_BODY = {
6045
+ byteGateClientUrl: 'https://bytegate.zijieapi.com',
6046
+ env: 'ONLINE',
6047
+ region: 'CN',
6048
+ workspace_name: 'CozeCoding',
6049
+ project_path: '/',
6050
+ };
6051
+
6052
+
6053
+
6054
+
6055
+
6056
+ const PATCH_CLI_FLAG = 'coding.arch.patch_cli';
6057
+ const PATCH_FLAGS_ENV_KEY = 'COZE_PATCH_FLAGS_JSON';
6058
+
6059
+ const isFlagEnabled = (
6060
+ flags,
6061
+ flag,
6062
+ ) => flags[flag] === true;
6063
+
6064
+ const loadPatchFlags = async () => {
6065
+ const envFlags = process.env[PATCH_FLAGS_ENV_KEY];
6066
+ if (envFlags) {
6067
+ const parsed = safeJsonParse(envFlags, null);
6068
+ if (!parsed) {
6069
+ throw new Error(`Invalid JSON in ${PATCH_FLAGS_ENV_KEY}`);
6070
+ }
6071
+ return Object.entries(parsed).reduce(
6072
+ (acc, [key, value]) => {
6073
+ if (typeof value === 'boolean') {
6074
+ acc[key] = value;
6075
+ }
6076
+ return acc;
6077
+ },
6078
+ {},
6079
+ );
6080
+ }
6081
+
6082
+ const controller = new AbortController();
6083
+ const timeoutId = setTimeout(() => {
6084
+ controller.abort();
6085
+ }, PATCH_FG_TIMEOUT_MS);
6086
+
6087
+ let response;
6088
+ try {
6089
+ response = await fetch(PATCH_FG_ENDPOINT, {
6090
+ method: 'POST',
6091
+ headers: {
6092
+ 'content-type': 'application/json',
6093
+ },
6094
+ body: JSON.stringify(PATCH_FG_REQUEST_BODY),
6095
+ signal: controller.signal,
6096
+ });
6097
+ } catch (error) {
6098
+ if (controller.signal.aborted) {
6099
+ throw new Error(
6100
+ `Failed to load patch flags: request timed out after ${PATCH_FG_TIMEOUT_MS}ms`,
6101
+ );
6102
+ }
6103
+ throw error;
6104
+ } finally {
6105
+ clearTimeout(timeoutId);
6106
+ }
6107
+
6108
+ if (!response.ok) {
6109
+ throw new Error(`Failed to load patch flags: HTTP ${response.status}`);
6110
+ }
6111
+
6112
+ const result = (await response.json())
6113
+
6114
+ ;
6041
6115
 
6116
+ const values =
6117
+ 'data' in result && result.data && typeof result.data === 'object'
6118
+ ? result.data
6119
+ : result;
6120
+
6121
+ if (!values || typeof values !== 'object') {
6122
+ throw new Error('Failed to load patch flags: invalid response shape');
6123
+ }
6124
+
6125
+ return Object.entries(values).reduce(
6126
+ (acc, [key, value]) => {
6127
+ if (typeof value === 'boolean') {
6128
+ acc[key] = value;
6129
+ }
6130
+ return acc;
6131
+ },
6132
+ {},
6133
+ );
6134
+ };
6135
+
6136
+ const byFlag = (flag) => {
6137
+ const predicate = ((context) =>
6138
+ !context.isFlagEnabled(flag)) ;
6139
+ Object.defineProperty(predicate, 'flag', {
6140
+ value: flag,
6141
+ enumerable: true,
6142
+ configurable: false,
6143
+ writable: false,
6144
+ });
6145
+ return predicate;
6146
+ };
6042
6147
 
6148
+ function _optionalChain$3(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
6043
6149
  const PATCH_ID$2 = 'taro/update-pack-script-for-tt-build@0.0.13';
6044
6150
  const PACKAGE_JSON_FILE = 'package.json';
6045
6151
  const PACK_SCRIPT_FILE = '.cozeproj/scripts/pack.sh';
@@ -6139,6 +6245,7 @@ const hasLegacyPackScript = async (projectFolder) => {
6139
6245
  const patchTaroPackScript = {
6140
6246
  id: PATCH_ID$2,
6141
6247
  template: 'taro',
6248
+ disabled: byFlag('coding.arch.patch_taro_update_pack_script_for_tt_build'),
6142
6249
  operations: [
6143
6250
  {
6144
6251
  kind: 'file-patch',
@@ -6205,6 +6312,7 @@ const readTemplateAgentsContent = async () =>
6205
6312
  const patchTaroAgentsMd = {
6206
6313
  id: PATCH_ID$1,
6207
6314
  template: 'taro',
6315
+ disabled: byFlag('coding.arch.patch_taro_add_agents_md'),
6208
6316
  operations: [
6209
6317
  {
6210
6318
  kind: 'create-file',
@@ -6316,6 +6424,13 @@ const createReplaceNpxWithPnpmPatch = (
6316
6424
  ) => ({
6317
6425
  id: `${template}/replace-npx-with-pnpm@0.0.13`,
6318
6426
  template,
6427
+ disabled: byFlag(
6428
+ template === 'nextjs'
6429
+ ? 'coding.arch.patch_nextjs_replace_npx_with_pnpm'
6430
+ : template === 'vite'
6431
+ ? 'coding.arch.patch_vite_replace_npx_with_pnpm'
6432
+ : 'coding.arch.patch_nuxt_vue_replace_npx_with_pnpm',
6433
+ ),
6319
6434
  operations: [
6320
6435
  {
6321
6436
  kind: 'file-patch',
@@ -6398,6 +6513,7 @@ const PATCH_ID = 'nextjs/next-output-tracing-root@0.0.13';
6398
6513
  const patchNextOutputTracingRoot = {
6399
6514
  id: PATCH_ID,
6400
6515
  template: 'nextjs',
6516
+ disabled: byFlag('coding.arch.patch_nextjs_next_output_tracing_root'),
6401
6517
  operations: [
6402
6518
  {
6403
6519
  kind: 'file-patch',
@@ -6465,6 +6581,67 @@ const getTemplatePatches = (
6465
6581
  function _nullishCoalesce$2(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain$2(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
6466
6582
  const DEFAULT_LEGACY_VERSION = 'legacy';
6467
6583
 
6584
+ const loadFlagsWithFallback = async () => {
6585
+ try {
6586
+ return await loadPatchFlags();
6587
+ } catch (error) {
6588
+ logger.warn(
6589
+ `Patch skipped: failed to load feature gates (${
6590
+ error instanceof Error ? error.message : String(error)
6591
+ })`,
6592
+ );
6593
+ return {};
6594
+ }
6595
+ };
6596
+
6597
+ const isPatchDisabled = (
6598
+ patch,
6599
+ context,
6600
+ ) =>
6601
+ typeof patch.disabled === 'function'
6602
+ ? patch.disabled(context)
6603
+ : patch.disabled === true;
6604
+
6605
+ const getPatchFlag = (patch) =>
6606
+ typeof patch.disabled === 'function' &&
6607
+ 'flag' in patch.disabled &&
6608
+ typeof (patch.disabled ).flag === 'string'
6609
+ ? (patch.disabled ).flag
6610
+ : null;
6611
+
6612
+ const showFlags = (
6613
+ template,
6614
+ flags,
6615
+ context,
6616
+ ) => {
6617
+ logger.info('Feature gates:');
6618
+ logger.info(
6619
+ ` ${PATCH_CLI_FLAG} = ${isFlagEnabled(flags, PATCH_CLI_FLAG) ? 'true' : 'false'}`,
6620
+ );
6621
+
6622
+ const templatePatches = getTemplatePatches(template);
6623
+ if (templatePatches.length === 0) {
6624
+ logger.info(`No registered patches for template: ${template}`);
6625
+ return;
6626
+ }
6627
+
6628
+ logger.info('Patch gates:');
6629
+ templatePatches.forEach(patch => {
6630
+ const flag = getPatchFlag(patch);
6631
+ if (!flag) {
6632
+ logger.info(` - ${patch.id}`);
6633
+ logger.info(' gate: (none)');
6634
+ return;
6635
+ }
6636
+
6637
+ const enabled = context.isFlagEnabled(flag);
6638
+ logger.info(` - ${patch.id}`);
6639
+ logger.info(` flag: ${flag}`);
6640
+ logger.info(` value: ${enabled ? 'true' : 'false'}`);
6641
+ logger.info(` status: ${enabled ? 'enabled' : 'disabled by flag'}`);
6642
+ });
6643
+ };
6644
+
6468
6645
  const loadExistingTomlConfig = async (
6469
6646
  projectFolder,
6470
6647
  ) => {
@@ -6540,6 +6717,7 @@ const executePatch = async (
6540
6717
 
6541
6718
  const appliedPatches = [...(_optionalChain$2([config, 'access', _5 => _5.project, 'optionalAccess', _6 => _6.appliedPatches]) || [])];
6542
6719
  const projectVersion = _optionalChain$2([config, 'access', _7 => _7.project, 'optionalAccess', _8 => _8.version]);
6720
+ const flags = await loadFlagsWithFallback();
6543
6721
 
6544
6722
  const context = {
6545
6723
  cwd,
@@ -6548,11 +6726,26 @@ const executePatch = async (
6548
6726
  projectVersion,
6549
6727
  appliedPatches,
6550
6728
  cozeConfig: config,
6729
+ flags,
6730
+ isFlagEnabled: flag => isFlagEnabled(flags, flag),
6551
6731
  };
6552
6732
 
6553
- const candidatePatches = getTemplatePatches(template).filter(
6554
- patch => patch.disabled !== true && !appliedPatches.includes(patch.id),
6555
- );
6733
+ if (options.showFlags) {
6734
+ showFlags(template, flags, context);
6735
+ return;
6736
+ }
6737
+
6738
+ if (!context.isFlagEnabled(PATCH_CLI_FLAG)) {
6739
+ logger.info(`Patch skipped: feature gate ${PATCH_CLI_FLAG} is disabled`);
6740
+ return;
6741
+ }
6742
+
6743
+ const candidatePatches = getTemplatePatches(template).filter(patch => {
6744
+ if (isPatchDisabled(patch, context)) {
6745
+ return false;
6746
+ }
6747
+ return !appliedPatches.includes(patch.id);
6748
+ });
6556
6749
 
6557
6750
  const matchedPatches = [];
6558
6751
  for (const patch of candidatePatches) {
@@ -6618,12 +6811,19 @@ const registerCommand$3 = program => {
6618
6811
  'Target directory to patch (defaults to current directory)',
6619
6812
  )
6620
6813
  .option('--dry-run', 'Show matched patches without modifying files')
6621
- .action(async (directory, command) => {
6622
- await executePatch({
6814
+ .option('--show-flags', 'Show feature gate status for this template')
6815
+ .action(
6816
+ async (
6623
6817
  directory,
6624
- dryRun: _optionalChain$2([command, 'optionalAccess', _9 => _9.dryRun]),
6625
- });
6626
- });
6818
+ command,
6819
+ ) => {
6820
+ await executePatch({
6821
+ directory,
6822
+ dryRun: _optionalChain$2([command, 'optionalAccess', _9 => _9.dryRun]),
6823
+ showFlags: _optionalChain$2([command, 'optionalAccess', _10 => _10.showFlags]),
6824
+ });
6825
+ },
6826
+ );
6627
6827
  };
6628
6828
 
6629
6829
  function _nullishCoalesce$1(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain$1(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coze-arch/cli",
3
- "version": "0.0.12-alpha.e3bedc",
3
+ "version": "0.0.13",
4
4
  "private": false,
5
5
  "description": "coze coding devtools cli",
6
6
  "license": "MIT",