wp-typia 0.20.3 → 0.20.4

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.
@@ -231627,7 +231627,6 @@ async function runAddRestResourceCommand({
231627
231627
  const validatorsFilePath = path52.join(restResourceDir, "api-validators.ts");
231628
231628
  const apiFilePath = path52.join(restResourceDir, "api.ts");
231629
231629
  const dataFilePath = path52.join(restResourceDir, "data.ts");
231630
- const clientFilePath = path52.join(restResourceDir, "api-client.ts");
231631
231630
  const phpFilePath = path52.join(workspace.projectDir, "inc", "rest", `${restResourceSlug}.php`);
231632
231631
  const mutationSnapshot = {
231633
231632
  fileSources: await snapshotWorkspaceFiles([
@@ -231700,6 +231699,50 @@ function escapeRegex5(value2) {
231700
231699
  function quotePhpString3(value2) {
231701
231700
  return `'${value2.replace(/\\/gu, "\\\\").replace(/'/gu, "\\'")}'`;
231702
231701
  }
231702
+ function findPhpFunctionRange2(source, functionName) {
231703
+ const functionPattern = new RegExp(`function\\s+${escapeRegex5(functionName)}\\s*\\([^)]*\\)\\s*\\{`, "u");
231704
+ const match3 = functionPattern.exec(source);
231705
+ if (!match3) {
231706
+ return null;
231707
+ }
231708
+ const openingBraceIndex = match3.index + match3[0].length - 1;
231709
+ let depth = 0;
231710
+ for (let index = openingBraceIndex;index < source.length; index += 1) {
231711
+ const character = source[index];
231712
+ if (character === "{") {
231713
+ depth += 1;
231714
+ } else if (character === "}") {
231715
+ depth -= 1;
231716
+ if (depth === 0) {
231717
+ const end = index + 1;
231718
+ return {
231719
+ end,
231720
+ source: source.slice(match3.index, end),
231721
+ start: match3.index
231722
+ };
231723
+ }
231724
+ }
231725
+ }
231726
+ return null;
231727
+ }
231728
+ function replacePhpFunctionDefinition2(source, functionName, replacement) {
231729
+ const functionRange = findPhpFunctionRange2(source, functionName);
231730
+ if (!functionRange) {
231731
+ return source;
231732
+ }
231733
+ return `${source.slice(0, functionRange.start)}${replacement.trimStart()}${source.slice(functionRange.end)}`;
231734
+ }
231735
+ function resolveManagedDependencyVersion(existingVersion, requiredVersion) {
231736
+ if (!existingVersion) {
231737
+ return requiredVersion;
231738
+ }
231739
+ const existingMinimum = import_semver2.default.minVersion(existingVersion);
231740
+ const requiredMinimum = import_semver2.default.minVersion(requiredVersion);
231741
+ if (!existingMinimum || !requiredMinimum) {
231742
+ return requiredVersion;
231743
+ }
231744
+ return import_semver2.default.gte(existingMinimum, requiredMinimum) ? existingVersion : requiredVersion;
231745
+ }
231703
231746
  function toPascalCaseFromAbilitySlug(abilitySlug) {
231704
231747
  return normalizeBlockSlug(abilitySlug).split("-").filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join("");
231705
231748
  }
@@ -231769,7 +231812,14 @@ export interface ${pascalCase}AbilityOutput {
231769
231812
  function buildAbilityDataSource(abilitySlug) {
231770
231813
  const pascalCase = toPascalCaseFromAbilitySlug(abilitySlug);
231771
231814
  const abilityConstBase = abilitySlug.toUpperCase().replace(/[^A-Z0-9]+/gu, "_").replace(/_{2,}/gu, "_").replace(/^_|_$/gu, "");
231772
- return `import abilityConfig from './ability.config.json';
231815
+ return `import {
231816
+ executeAbility,
231817
+ getAbilities,
231818
+ getAbility as getRegisteredAbility,
231819
+ } from '@wordpress/abilities';
231820
+ import '@wordpress/core-abilities';
231821
+
231822
+ import abilityConfig from './ability.config.json';
231773
231823
 
231774
231824
  import type { ${pascalCase}AbilityInput, ${pascalCase}AbilityOutput } from './types';
231775
231825
 
@@ -231781,55 +231831,56 @@ interface WordPressAbilityDefinition {
231781
231831
  name?: string;
231782
231832
  }
231783
231833
 
231784
- interface WordPressAbilitiesClient {
231785
- executeAbility( name: string, input?: unknown ): Promise< unknown >;
231786
- getAbilities( args?: { category?: string } ): WordPressAbilityDefinition[];
231787
- getAbility( name: string ): WordPressAbilityDefinition | undefined;
231788
- }
231789
-
231790
- const ABILITY_CLIENT_UNAVAILABLE_MESSAGE =
231791
- 'The WordPress abilities client is unavailable on this screen. Ensure the Abilities API and @wordpress/core-abilities integration are loaded before using this scaffold.';
231792
-
231793
231834
  export const ${abilityConstBase}_ABILITY = abilityConfig;
231794
231835
  export const ${abilityConstBase}_ABILITY_CATEGORY = abilityConfig.category;
231795
231836
  export const ${abilityConstBase}_ABILITY_ID = abilityConfig.abilityId;
231796
231837
  export const ${abilityConstBase}_ABILITY_META = abilityConfig.meta;
231838
+ const ABILITY_DISCOVERY_POLL_INTERVAL_MS = 50;
231839
+ const ABILITY_DISCOVERY_TIMEOUT_MS = 5000;
231797
231840
 
231798
231841
  export type {
231799
231842
  ${pascalCase}AbilityInput,
231800
231843
  ${pascalCase}AbilityOutput,
231801
231844
  };
231802
231845
 
231803
- function resolveAbilitiesClient(): WordPressAbilitiesClient {
231804
- const runtime = globalThis as typeof globalThis & {
231805
- window?: {
231806
- wp?: {
231807
- abilities?: WordPressAbilitiesClient;
231808
- };
231809
- };
231810
- };
231811
- const client = runtime.window?.wp?.abilities;
231812
- if ( ! client ) {
231813
- throw new Error( ABILITY_CLIENT_UNAVAILABLE_MESSAGE );
231814
- }
231846
+ function sleep( milliseconds: number ): Promise< void > {
231847
+ return new Promise( ( resolve ) => {
231848
+ setTimeout( resolve, milliseconds );
231849
+ } );
231850
+ }
231851
+
231852
+ async function waitFor${pascalCase}AbilityRegistration(): Promise< void > {
231853
+ const deadline = Date.now() + ABILITY_DISCOVERY_TIMEOUT_MS;
231854
+ while ( ! getRegisteredAbility( ${abilityConstBase}_ABILITY_ID ) ) {
231855
+ if ( Date.now() >= deadline ) {
231856
+ return;
231857
+ }
231815
231858
 
231816
- return client;
231859
+ await sleep( ABILITY_DISCOVERY_POLL_INTERVAL_MS );
231860
+ }
231817
231861
  }
231818
231862
 
231819
- export function list${pascalCase}CategoryAbilities(): WordPressAbilityDefinition[] {
231820
- return resolveAbilitiesClient().getAbilities( {
231863
+ export async function list${pascalCase}CategoryAbilities(): Promise< WordPressAbilityDefinition[] > {
231864
+ await waitFor${pascalCase}AbilityRegistration();
231865
+
231866
+ return getAbilities( {
231821
231867
  category: ${abilityConstBase}_ABILITY_CATEGORY.slug,
231822
- } );
231868
+ } ) as WordPressAbilityDefinition[];
231823
231869
  }
231824
231870
 
231825
- export function get${pascalCase}Ability():
231871
+ export async function get${pascalCase}Ability(): Promise<
231826
231872
  | WordPressAbilityDefinition
231827
- | undefined {
231828
- return resolveAbilitiesClient().getAbility( ${abilityConstBase}_ABILITY_ID );
231873
+ | undefined
231874
+ > {
231875
+ await waitFor${pascalCase}AbilityRegistration();
231876
+
231877
+ return getRegisteredAbility( ${abilityConstBase}_ABILITY_ID ) as
231878
+ | WordPressAbilityDefinition
231879
+ | undefined;
231829
231880
  }
231830
231881
 
231831
- export function require${pascalCase}Ability(): WordPressAbilityDefinition {
231832
- const ability = get${pascalCase}Ability();
231882
+ export async function require${pascalCase}Ability(): Promise< WordPressAbilityDefinition > {
231883
+ const ability = await get${pascalCase}Ability();
231833
231884
  if ( ability ) {
231834
231885
  return ability;
231835
231886
  }
@@ -231845,7 +231896,9 @@ export function require${pascalCase}Ability(): WordPressAbilityDefinition {
231845
231896
  export async function run${pascalCase}Ability(
231846
231897
  input: ${pascalCase}AbilityInput
231847
231898
  ): Promise< ${pascalCase}AbilityOutput > {
231848
- return ( await resolveAbilitiesClient().executeAbility(
231899
+ await waitFor${pascalCase}AbilityRegistration();
231900
+
231901
+ return ( await executeAbility(
231849
231902
  ${abilityConstBase}_ABILITY_ID,
231850
231903
  input
231851
231904
  ) ) as ${pascalCase}AbilityOutput;
@@ -231857,8 +231910,8 @@ function buildAbilityClientSource(abilitySlug) {
231857
231910
  return `/**
231858
231911
  * Re-export the typed ${pascalCase} ability client helpers.
231859
231912
  *
231860
- * The underlying WordPress abilities client is expected to have been hydrated
231861
- * by the site's admin/editor bootstrap before these helpers execute.
231913
+ * The helper methods load the WordPress core abilities integration and wait for
231914
+ * this server-registered ability before reading or executing it.
231862
231915
  */
231863
231916
  export * from './data';
231864
231917
  `;
@@ -232224,22 +232277,31 @@ function ${enqueueFunctionName}() {
232224
232277
  ? $asset['dependencies']
232225
232278
  : array();
232226
232279
 
232227
- foreach ( array( '${WP_CORE_ABILITIES_SCRIPT_HANDLE}', '${WP_ABILITIES_SCRIPT_HANDLE}' ) as $ability_dependency ) {
232228
- if (
232229
- function_exists( 'wp_script_is' ) &&
232230
- wp_script_is( $ability_dependency, 'registered' ) &&
232231
- ! in_array( $ability_dependency, $dependencies, true )
232232
- ) {
232280
+ foreach ( array( '${WP_CORE_ABILITIES_SCRIPT_MODULE_ID}', '${WP_ABILITIES_SCRIPT_MODULE_ID}' ) as $ability_dependency ) {
232281
+ $has_dependency = false;
232282
+ foreach ( $dependencies as $dependency ) {
232283
+ $dependency_id = is_array( $dependency ) && isset( $dependency['id'] )
232284
+ ? $dependency['id']
232285
+ : $dependency;
232286
+ if ( $dependency_id === $ability_dependency ) {
232287
+ $has_dependency = true;
232288
+ break;
232289
+ }
232290
+ }
232291
+ if ( ! $has_dependency ) {
232233
232292
  $dependencies[] = $ability_dependency;
232234
232293
  }
232235
232294
  }
232236
232295
 
232237
- wp_enqueue_script(
232296
+ if ( ! function_exists( 'wp_enqueue_script_module' ) ) {
232297
+ return;
232298
+ }
232299
+
232300
+ wp_enqueue_script_module(
232238
232301
  '${workspaceBaseName}-abilities',
232239
232302
  plugins_url( '${ABILITY_EDITOR_SCRIPT}', __FILE__ ),
232240
232303
  $dependencies,
232241
- isset( $asset['version'] ) ? $asset['version'] : filemtime( $script_path ),
232242
- true
232304
+ isset( $asset['version'] ) ? $asset['version'] : filemtime( $script_path )
232243
232305
  );
232244
232306
  }
232245
232307
  `;
@@ -232277,6 +232339,8 @@ ${snippet}
232277
232339
  }
232278
232340
  if (!hasPhpFunctionDefinition(enqueueFunctionName)) {
232279
232341
  insertPhpSnippet(enqueueFunction);
232342
+ } else if (!findPhpFunctionRange2(nextSource, enqueueFunctionName)?.source.includes("wp_enqueue_script_module")) {
232343
+ nextSource = replacePhpFunctionDefinition2(nextSource, enqueueFunctionName, enqueueFunction);
232280
232344
  }
232281
232345
  if (!nextSource.includes(loadHook)) {
232282
232346
  appendPhpSnippet(loadHook);
@@ -232297,10 +232361,16 @@ async function ensureAbilityPackageScripts(workspace) {
232297
232361
  ...packageJson.scripts ?? {},
232298
232362
  "sync-abilities": packageJson.scripts?.["sync-abilities"] ?? "tsx scripts/sync-abilities.ts"
232299
232363
  };
232300
- if (JSON.stringify(nextScripts) === JSON.stringify(packageJson.scripts ?? {})) {
232364
+ const nextDependencies = {
232365
+ ...packageJson.dependencies ?? {},
232366
+ [WP_ABILITIES_SCRIPT_MODULE_ID]: resolveManagedDependencyVersion(packageJson.dependencies?.[WP_ABILITIES_SCRIPT_MODULE_ID], WP_ABILITIES_PACKAGE_VERSION),
232367
+ [WP_CORE_ABILITIES_SCRIPT_MODULE_ID]: resolveManagedDependencyVersion(packageJson.dependencies?.[WP_CORE_ABILITIES_SCRIPT_MODULE_ID], WP_CORE_ABILITIES_PACKAGE_VERSION)
232368
+ };
232369
+ if (JSON.stringify(nextScripts) === JSON.stringify(packageJson.scripts ?? {}) && JSON.stringify(nextDependencies) === JSON.stringify(packageJson.dependencies ?? {})) {
232301
232370
  return;
232302
232371
  }
232303
232372
  packageJson.scripts = nextScripts;
232373
+ packageJson.dependencies = nextDependencies;
232304
232374
  await fsp19.writeFile(packageJsonPath, `${JSON.stringify(packageJson, null, "\t")}
232305
232375
  `, "utf8");
232306
232376
  }
@@ -232376,6 +232446,28 @@ async function ensureAbilityWebpackAnchors(workspace) {
232376
232446
  if (/['"]abilities\/index['"]/u.test(source)) {
232377
232447
  return source;
232378
232448
  }
232449
+ const optionalModuleReturnPattern = /(function\s+getOptionalModuleEntries\s*\(\)\s*\{[\s\S]*?)(\n\treturn Object\.fromEntries\(\s*entries\s*\);\n\})/u;
232450
+ if (optionalModuleReturnPattern.test(source)) {
232451
+ return source.replace(optionalModuleReturnPattern, `$1
232452
+
232453
+ for ( const [ entryName, candidates ] of [
232454
+ [
232455
+ 'abilities/index',
232456
+ [ 'src/abilities/index.ts', 'src/abilities/index.js' ],
232457
+ ],
232458
+ ] ) {
232459
+ for ( const relativePath of candidates ) {
232460
+ const entryPath = path.resolve( process.cwd(), relativePath );
232461
+ if ( ! fs.existsSync( entryPath ) ) {
232462
+ continue;
232463
+ }
232464
+
232465
+ entries.push( [ entryName, entryPath ] );
232466
+ break;
232467
+ }
232468
+ }
232469
+ $2`);
232470
+ }
232379
232471
  const sharedEntriesPattern = /for\s*\(\s*const\s+\[\s*entryName\s*,\s*candidates\s*\]\s+of\s+\[([\s\S]*?)\]\s*\)\s*\{/u;
232380
232472
  const match3 = source.match(sharedEntriesPattern);
232381
232473
  if (!match3 || !match3[1].includes("bindings/index") || !match3[1].includes("editor-plugins/index")) {
@@ -232479,12 +232571,13 @@ async function runAddAbilityCommand({
232479
232571
  throw error48;
232480
232572
  }
232481
232573
  }
232482
- var ABILITY_SERVER_GLOB = "/inc/abilities/*.php", ABILITY_EDITOR_SCRIPT = "build/abilities/index.js", ABILITY_EDITOR_ASSET = "build/abilities/index.asset.php", ABILITY_REGISTRY_END_MARKER = "// wp-typia add ability entries end", ABILITY_REGISTRY_START_MARKER = "// wp-typia add ability entries start", WP_ABILITIES_SCRIPT_HANDLE = "wp-abilities", WP_CORE_ABILITIES_SCRIPT_HANDLE = "wp-core-abilities";
232574
+ var import_semver2, ABILITY_SERVER_GLOB = "/inc/abilities/*.php", ABILITY_EDITOR_SCRIPT = "build/abilities/index.js", ABILITY_EDITOR_ASSET = "build/abilities/index.asset.php", ABILITY_REGISTRY_END_MARKER = "// wp-typia add ability entries end", ABILITY_REGISTRY_START_MARKER = "// wp-typia add ability entries start", WP_ABILITIES_PACKAGE_VERSION = "^0.10.0", WP_CORE_ABILITIES_PACKAGE_VERSION = "^0.9.0", WP_ABILITIES_SCRIPT_MODULE_ID = "@wordpress/abilities", WP_CORE_ABILITIES_SCRIPT_MODULE_ID = "@wordpress/core-abilities";
232483
232575
  var init_cli_add_workspace_ability = __esm(() => {
232484
232576
  init_workspace_inventory();
232485
232577
  init_workspace_project();
232486
232578
  init_cli_add_shared();
232487
232579
  init_scaffold_compatibility();
232580
+ import_semver2 = __toESM(require_semver2(), 1);
232488
232581
  });
232489
232582
 
232490
232583
  // ../wp-typia-project-tools/src/runtime/schema-core.ts
@@ -234319,7 +234412,8 @@ function checkWorkspaceAbilityBootstrap(projectDir, packageName, phpPrefix) {
234319
234412
  const hasServerGlob = source.includes(WORKSPACE_ABILITY_GLOB);
234320
234413
  const hasEditorScript = source.includes(WORKSPACE_ABILITY_EDITOR_SCRIPT);
234321
234414
  const hasEditorAsset = source.includes(WORKSPACE_ABILITY_EDITOR_ASSET);
234322
- return createDoctorCheck2("Ability bootstrap", hasLoaderHook && hasAdminEnqueueHook && hasEditorEnqueueHook && hasServerGlob && hasEditorScript && hasEditorAsset ? "pass" : "fail", hasLoaderHook && hasAdminEnqueueHook && hasEditorEnqueueHook && hasServerGlob && hasEditorScript && hasEditorAsset ? "Ability loader and admin/editor client bootstrap hooks are present" : "Missing ability loader hook or build/abilities script asset references");
234415
+ const hasScriptModuleEnqueue = source.includes("wp_enqueue_script_module");
234416
+ return createDoctorCheck2("Ability bootstrap", hasLoaderHook && hasAdminEnqueueHook && hasEditorEnqueueHook && hasServerGlob && hasEditorScript && hasEditorAsset && hasScriptModuleEnqueue ? "pass" : "fail", hasLoaderHook && hasAdminEnqueueHook && hasEditorEnqueueHook && hasServerGlob && hasEditorScript && hasEditorAsset && hasScriptModuleEnqueue ? "Ability loader and admin/editor script-module bootstrap hooks are present" : "Missing ability loader hook, script-module enqueue, or build/abilities asset references");
234323
234417
  }
234324
234418
  function checkWorkspaceAbilityIndex(projectDir, abilities) {
234325
234419
  const indexRelativePath = [
@@ -288755,7 +288849,7 @@ import path10 from "path";
288755
288849
  // package.json
288756
288850
  var package_default2 = {
288757
288851
  name: "wp-typia",
288758
- version: "0.20.3",
288852
+ version: "0.20.4",
288759
288853
  description: "Canonical CLI package for wp-typia scaffolding and project workflows",
288760
288854
  packageManager: "bun@1.3.11",
288761
288855
  type: "module",
@@ -288823,7 +288917,7 @@ var package_default2 = {
288823
288917
  "@bunli/tui": "0.6.0",
288824
288918
  "@bunli/utils": "0.6.0",
288825
288919
  "@wp-typia/api-client": "^0.4.5",
288826
- "@wp-typia/project-tools": "0.20.0",
288920
+ "@wp-typia/project-tools": "0.20.1",
288827
288921
  "better-result": "^2.7.0",
288828
288922
  react: "^19.2.5",
288829
288923
  "react-dom": "^19.2.5",
@@ -291482,4 +291576,4 @@ export {
291482
291576
  cli
291483
291577
  };
291484
291578
 
291485
- //# debugId=A86DAAF9631CE27D64756E2164756E21
291579
+ //# debugId=779859C25A157CA464756E2164756E21
@@ -9,7 +9,7 @@ import {
9
9
  // package.json
10
10
  var package_default = {
11
11
  name: "wp-typia",
12
- version: "0.20.3",
12
+ version: "0.20.4",
13
13
  description: "Canonical CLI package for wp-typia scaffolding and project workflows",
14
14
  packageManager: "bun@1.3.11",
15
15
  type: "module",
@@ -77,7 +77,7 @@ var package_default = {
77
77
  "@bunli/tui": "0.6.0",
78
78
  "@bunli/utils": "0.6.0",
79
79
  "@wp-typia/api-client": "^0.4.5",
80
- "@wp-typia/project-tools": "0.20.0",
80
+ "@wp-typia/project-tools": "0.20.1",
81
81
  "better-result": "^2.7.0",
82
82
  react: "^19.2.5",
83
83
  "react-dom": "^19.2.5",
@@ -532,4 +532,4 @@ function createPlugin(input) {
532
532
  }
533
533
  export { createPlugin, package_default, CREATE_OPTION_METADATA, ADD_OPTION_METADATA, MIGRATE_OPTION_METADATA, SYNC_OPTION_METADATA, TEMPLATES_OPTION_METADATA, GLOBAL_OPTION_METADATA, buildCommandOptions, collectOptionNamesByType, buildCommandOptionParser, resolveCommandOptionValues, prefersStructuredCliOutput, emitCliDiagnosticFailure, writeStructuredCliDiagnosticError, WP_TYPIA_CONFIG_SOURCES, mergeWpTypiaUserConfig, loadWpTypiaUserConfigFromSource, loadWpTypiaUserConfig, getCreateDefaults, getAddBlockDefaults, getMcpSchemaSources };
534
534
 
535
- //# debugId=E7CE1D8C99B5584064756E2164756E21
535
+ //# debugId=33737B5BBB1DCAAF64756E2164756E21
@@ -11,6 +11,7 @@ import {
11
11
  parseCompoundInnerBlocksPreset,
12
12
  parseTemplateLocator,
13
13
  renderScaffoldCompatibilityConfig,
14
+ require_semver,
14
15
  resolveExternalTemplateLayers,
15
16
  resolveLocalCliPathOption,
16
17
  resolveOptionalInteractiveExternalLayerId,
@@ -19,7 +20,7 @@ import {
19
20
  scaffoldProject,
20
21
  syncPersistenceRestArtifacts,
21
22
  updatePluginHeaderCompatibility
22
- } from "./cli-8rnhjvb8.js";
23
+ } from "./cli-c5021kqy.js";
23
24
  import {
24
25
  getPackageVersions
25
26
  } from "./cli-tesygdnr.js";
@@ -84,7 +85,8 @@ import {
84
85
  resolveWorkspaceProject
85
86
  } from "./cli-pd5pqgre.js";
86
87
  import {
87
- __reExport
88
+ __reExport,
89
+ __toESM
88
90
  } from "./cli-xnn9xjcy.js";
89
91
  // ../wp-typia-project-tools/src/runtime/cli-add-block.ts
90
92
  import fs2 from "fs";
@@ -2758,7 +2760,6 @@ async function runAddRestResourceCommand({
2758
2760
  const validatorsFilePath = path7.join(restResourceDir, "api-validators.ts");
2759
2761
  const apiFilePath = path7.join(restResourceDir, "api.ts");
2760
2762
  const dataFilePath = path7.join(restResourceDir, "data.ts");
2761
- const clientFilePath = path7.join(restResourceDir, "api-client.ts");
2762
2763
  const phpFilePath = path7.join(workspace.projectDir, "inc", "rest", `${restResourceSlug}.php`);
2763
2764
  const mutationSnapshot = {
2764
2765
  fileSources: await snapshotWorkspaceFiles([
@@ -2811,6 +2812,7 @@ async function runAddRestResourceCommand({
2811
2812
  }
2812
2813
  }
2813
2814
  // ../wp-typia-project-tools/src/runtime/cli-add-workspace-ability.ts
2815
+ var import_semver = __toESM(require_semver(), 1);
2814
2816
  import fs4 from "fs";
2815
2817
  import { promises as fsp5 } from "fs";
2816
2818
  import path8 from "path";
@@ -2820,14 +2822,60 @@ var ABILITY_EDITOR_SCRIPT = "build/abilities/index.js";
2820
2822
  var ABILITY_EDITOR_ASSET = "build/abilities/index.asset.php";
2821
2823
  var ABILITY_REGISTRY_END_MARKER = "// wp-typia add ability entries end";
2822
2824
  var ABILITY_REGISTRY_START_MARKER = "// wp-typia add ability entries start";
2823
- var WP_ABILITIES_SCRIPT_HANDLE = "wp-abilities";
2824
- var WP_CORE_ABILITIES_SCRIPT_HANDLE = "wp-core-abilities";
2825
+ var WP_ABILITIES_PACKAGE_VERSION = "^0.10.0";
2826
+ var WP_CORE_ABILITIES_PACKAGE_VERSION = "^0.9.0";
2827
+ var WP_ABILITIES_SCRIPT_MODULE_ID = "@wordpress/abilities";
2828
+ var WP_CORE_ABILITIES_SCRIPT_MODULE_ID = "@wordpress/core-abilities";
2825
2829
  function escapeRegex3(value) {
2826
2830
  return value.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
2827
2831
  }
2828
2832
  function quotePhpString3(value) {
2829
2833
  return `'${value.replace(/\\/gu, "\\\\").replace(/'/gu, "\\'")}'`;
2830
2834
  }
2835
+ function findPhpFunctionRange2(source, functionName) {
2836
+ const functionPattern = new RegExp(`function\\s+${escapeRegex3(functionName)}\\s*\\([^)]*\\)\\s*\\{`, "u");
2837
+ const match = functionPattern.exec(source);
2838
+ if (!match) {
2839
+ return null;
2840
+ }
2841
+ const openingBraceIndex = match.index + match[0].length - 1;
2842
+ let depth = 0;
2843
+ for (let index = openingBraceIndex;index < source.length; index += 1) {
2844
+ const character = source[index];
2845
+ if (character === "{") {
2846
+ depth += 1;
2847
+ } else if (character === "}") {
2848
+ depth -= 1;
2849
+ if (depth === 0) {
2850
+ const end = index + 1;
2851
+ return {
2852
+ end,
2853
+ source: source.slice(match.index, end),
2854
+ start: match.index
2855
+ };
2856
+ }
2857
+ }
2858
+ }
2859
+ return null;
2860
+ }
2861
+ function replacePhpFunctionDefinition2(source, functionName, replacement) {
2862
+ const functionRange = findPhpFunctionRange2(source, functionName);
2863
+ if (!functionRange) {
2864
+ return source;
2865
+ }
2866
+ return `${source.slice(0, functionRange.start)}${replacement.trimStart()}${source.slice(functionRange.end)}`;
2867
+ }
2868
+ function resolveManagedDependencyVersion(existingVersion, requiredVersion) {
2869
+ if (!existingVersion) {
2870
+ return requiredVersion;
2871
+ }
2872
+ const existingMinimum = import_semver.default.minVersion(existingVersion);
2873
+ const requiredMinimum = import_semver.default.minVersion(requiredVersion);
2874
+ if (!existingMinimum || !requiredMinimum) {
2875
+ return requiredVersion;
2876
+ }
2877
+ return import_semver.default.gte(existingMinimum, requiredMinimum) ? existingVersion : requiredVersion;
2878
+ }
2831
2879
  function toPascalCaseFromAbilitySlug(abilitySlug) {
2832
2880
  return normalizeBlockSlug(abilitySlug).split("-").filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join("");
2833
2881
  }
@@ -2897,7 +2945,14 @@ export interface ${pascalCase}AbilityOutput {
2897
2945
  function buildAbilityDataSource(abilitySlug) {
2898
2946
  const pascalCase = toPascalCaseFromAbilitySlug(abilitySlug);
2899
2947
  const abilityConstBase = abilitySlug.toUpperCase().replace(/[^A-Z0-9]+/gu, "_").replace(/_{2,}/gu, "_").replace(/^_|_$/gu, "");
2900
- return `import abilityConfig from './ability.config.json';
2948
+ return `import {
2949
+ executeAbility,
2950
+ getAbilities,
2951
+ getAbility as getRegisteredAbility,
2952
+ } from '@wordpress/abilities';
2953
+ import '@wordpress/core-abilities';
2954
+
2955
+ import abilityConfig from './ability.config.json';
2901
2956
 
2902
2957
  import type { ${pascalCase}AbilityInput, ${pascalCase}AbilityOutput } from './types';
2903
2958
 
@@ -2909,55 +2964,56 @@ interface WordPressAbilityDefinition {
2909
2964
  name?: string;
2910
2965
  }
2911
2966
 
2912
- interface WordPressAbilitiesClient {
2913
- executeAbility( name: string, input?: unknown ): Promise< unknown >;
2914
- getAbilities( args?: { category?: string } ): WordPressAbilityDefinition[];
2915
- getAbility( name: string ): WordPressAbilityDefinition | undefined;
2916
- }
2917
-
2918
- const ABILITY_CLIENT_UNAVAILABLE_MESSAGE =
2919
- 'The WordPress abilities client is unavailable on this screen. Ensure the Abilities API and @wordpress/core-abilities integration are loaded before using this scaffold.';
2920
-
2921
2967
  export const ${abilityConstBase}_ABILITY = abilityConfig;
2922
2968
  export const ${abilityConstBase}_ABILITY_CATEGORY = abilityConfig.category;
2923
2969
  export const ${abilityConstBase}_ABILITY_ID = abilityConfig.abilityId;
2924
2970
  export const ${abilityConstBase}_ABILITY_META = abilityConfig.meta;
2971
+ const ABILITY_DISCOVERY_POLL_INTERVAL_MS = 50;
2972
+ const ABILITY_DISCOVERY_TIMEOUT_MS = 5000;
2925
2973
 
2926
2974
  export type {
2927
2975
  ${pascalCase}AbilityInput,
2928
2976
  ${pascalCase}AbilityOutput,
2929
2977
  };
2930
2978
 
2931
- function resolveAbilitiesClient(): WordPressAbilitiesClient {
2932
- const runtime = globalThis as typeof globalThis & {
2933
- window?: {
2934
- wp?: {
2935
- abilities?: WordPressAbilitiesClient;
2936
- };
2937
- };
2938
- };
2939
- const client = runtime.window?.wp?.abilities;
2940
- if ( ! client ) {
2941
- throw new Error( ABILITY_CLIENT_UNAVAILABLE_MESSAGE );
2942
- }
2979
+ function sleep( milliseconds: number ): Promise< void > {
2980
+ return new Promise( ( resolve ) => {
2981
+ setTimeout( resolve, milliseconds );
2982
+ } );
2983
+ }
2943
2984
 
2944
- return client;
2985
+ async function waitFor${pascalCase}AbilityRegistration(): Promise< void > {
2986
+ const deadline = Date.now() + ABILITY_DISCOVERY_TIMEOUT_MS;
2987
+ while ( ! getRegisteredAbility( ${abilityConstBase}_ABILITY_ID ) ) {
2988
+ if ( Date.now() >= deadline ) {
2989
+ return;
2990
+ }
2991
+
2992
+ await sleep( ABILITY_DISCOVERY_POLL_INTERVAL_MS );
2993
+ }
2945
2994
  }
2946
2995
 
2947
- export function list${pascalCase}CategoryAbilities(): WordPressAbilityDefinition[] {
2948
- return resolveAbilitiesClient().getAbilities( {
2996
+ export async function list${pascalCase}CategoryAbilities(): Promise< WordPressAbilityDefinition[] > {
2997
+ await waitFor${pascalCase}AbilityRegistration();
2998
+
2999
+ return getAbilities( {
2949
3000
  category: ${abilityConstBase}_ABILITY_CATEGORY.slug,
2950
- } );
3001
+ } ) as WordPressAbilityDefinition[];
2951
3002
  }
2952
3003
 
2953
- export function get${pascalCase}Ability():
3004
+ export async function get${pascalCase}Ability(): Promise<
2954
3005
  | WordPressAbilityDefinition
2955
- | undefined {
2956
- return resolveAbilitiesClient().getAbility( ${abilityConstBase}_ABILITY_ID );
3006
+ | undefined
3007
+ > {
3008
+ await waitFor${pascalCase}AbilityRegistration();
3009
+
3010
+ return getRegisteredAbility( ${abilityConstBase}_ABILITY_ID ) as
3011
+ | WordPressAbilityDefinition
3012
+ | undefined;
2957
3013
  }
2958
3014
 
2959
- export function require${pascalCase}Ability(): WordPressAbilityDefinition {
2960
- const ability = get${pascalCase}Ability();
3015
+ export async function require${pascalCase}Ability(): Promise< WordPressAbilityDefinition > {
3016
+ const ability = await get${pascalCase}Ability();
2961
3017
  if ( ability ) {
2962
3018
  return ability;
2963
3019
  }
@@ -2973,7 +3029,9 @@ export function require${pascalCase}Ability(): WordPressAbilityDefinition {
2973
3029
  export async function run${pascalCase}Ability(
2974
3030
  input: ${pascalCase}AbilityInput
2975
3031
  ): Promise< ${pascalCase}AbilityOutput > {
2976
- return ( await resolveAbilitiesClient().executeAbility(
3032
+ await waitFor${pascalCase}AbilityRegistration();
3033
+
3034
+ return ( await executeAbility(
2977
3035
  ${abilityConstBase}_ABILITY_ID,
2978
3036
  input
2979
3037
  ) ) as ${pascalCase}AbilityOutput;
@@ -2985,8 +3043,8 @@ function buildAbilityClientSource(abilitySlug) {
2985
3043
  return `/**
2986
3044
  * Re-export the typed ${pascalCase} ability client helpers.
2987
3045
  *
2988
- * The underlying WordPress abilities client is expected to have been hydrated
2989
- * by the site's admin/editor bootstrap before these helpers execute.
3046
+ * The helper methods load the WordPress core abilities integration and wait for
3047
+ * this server-registered ability before reading or executing it.
2990
3048
  */
2991
3049
  export * from './data';
2992
3050
  `;
@@ -3352,22 +3410,31 @@ function ${enqueueFunctionName}() {
3352
3410
  ? $asset['dependencies']
3353
3411
  : array();
3354
3412
 
3355
- foreach ( array( '${WP_CORE_ABILITIES_SCRIPT_HANDLE}', '${WP_ABILITIES_SCRIPT_HANDLE}' ) as $ability_dependency ) {
3356
- if (
3357
- function_exists( 'wp_script_is' ) &&
3358
- wp_script_is( $ability_dependency, 'registered' ) &&
3359
- ! in_array( $ability_dependency, $dependencies, true )
3360
- ) {
3413
+ foreach ( array( '${WP_CORE_ABILITIES_SCRIPT_MODULE_ID}', '${WP_ABILITIES_SCRIPT_MODULE_ID}' ) as $ability_dependency ) {
3414
+ $has_dependency = false;
3415
+ foreach ( $dependencies as $dependency ) {
3416
+ $dependency_id = is_array( $dependency ) && isset( $dependency['id'] )
3417
+ ? $dependency['id']
3418
+ : $dependency;
3419
+ if ( $dependency_id === $ability_dependency ) {
3420
+ $has_dependency = true;
3421
+ break;
3422
+ }
3423
+ }
3424
+ if ( ! $has_dependency ) {
3361
3425
  $dependencies[] = $ability_dependency;
3362
3426
  }
3363
3427
  }
3364
3428
 
3365
- wp_enqueue_script(
3429
+ if ( ! function_exists( 'wp_enqueue_script_module' ) ) {
3430
+ return;
3431
+ }
3432
+
3433
+ wp_enqueue_script_module(
3366
3434
  '${workspaceBaseName}-abilities',
3367
3435
  plugins_url( '${ABILITY_EDITOR_SCRIPT}', __FILE__ ),
3368
3436
  $dependencies,
3369
- isset( $asset['version'] ) ? $asset['version'] : filemtime( $script_path ),
3370
- true
3437
+ isset( $asset['version'] ) ? $asset['version'] : filemtime( $script_path )
3371
3438
  );
3372
3439
  }
3373
3440
  `;
@@ -3405,6 +3472,8 @@ ${snippet}
3405
3472
  }
3406
3473
  if (!hasPhpFunctionDefinition(enqueueFunctionName)) {
3407
3474
  insertPhpSnippet(enqueueFunction);
3475
+ } else if (!findPhpFunctionRange2(nextSource, enqueueFunctionName)?.source.includes("wp_enqueue_script_module")) {
3476
+ nextSource = replacePhpFunctionDefinition2(nextSource, enqueueFunctionName, enqueueFunction);
3408
3477
  }
3409
3478
  if (!nextSource.includes(loadHook)) {
3410
3479
  appendPhpSnippet(loadHook);
@@ -3425,10 +3494,16 @@ async function ensureAbilityPackageScripts(workspace) {
3425
3494
  ...packageJson.scripts ?? {},
3426
3495
  "sync-abilities": packageJson.scripts?.["sync-abilities"] ?? "tsx scripts/sync-abilities.ts"
3427
3496
  };
3428
- if (JSON.stringify(nextScripts) === JSON.stringify(packageJson.scripts ?? {})) {
3497
+ const nextDependencies = {
3498
+ ...packageJson.dependencies ?? {},
3499
+ [WP_ABILITIES_SCRIPT_MODULE_ID]: resolveManagedDependencyVersion(packageJson.dependencies?.[WP_ABILITIES_SCRIPT_MODULE_ID], WP_ABILITIES_PACKAGE_VERSION),
3500
+ [WP_CORE_ABILITIES_SCRIPT_MODULE_ID]: resolveManagedDependencyVersion(packageJson.dependencies?.[WP_CORE_ABILITIES_SCRIPT_MODULE_ID], WP_CORE_ABILITIES_PACKAGE_VERSION)
3501
+ };
3502
+ if (JSON.stringify(nextScripts) === JSON.stringify(packageJson.scripts ?? {}) && JSON.stringify(nextDependencies) === JSON.stringify(packageJson.dependencies ?? {})) {
3429
3503
  return;
3430
3504
  }
3431
3505
  packageJson.scripts = nextScripts;
3506
+ packageJson.dependencies = nextDependencies;
3432
3507
  await fsp5.writeFile(packageJsonPath, `${JSON.stringify(packageJson, null, "\t")}
3433
3508
  `, "utf8");
3434
3509
  }
@@ -3504,6 +3579,28 @@ async function ensureAbilityWebpackAnchors(workspace) {
3504
3579
  if (/['"]abilities\/index['"]/u.test(source)) {
3505
3580
  return source;
3506
3581
  }
3582
+ const optionalModuleReturnPattern = /(function\s+getOptionalModuleEntries\s*\(\)\s*\{[\s\S]*?)(\n\treturn Object\.fromEntries\(\s*entries\s*\);\n\})/u;
3583
+ if (optionalModuleReturnPattern.test(source)) {
3584
+ return source.replace(optionalModuleReturnPattern, `$1
3585
+
3586
+ for ( const [ entryName, candidates ] of [
3587
+ [
3588
+ 'abilities/index',
3589
+ [ 'src/abilities/index.ts', 'src/abilities/index.js' ],
3590
+ ],
3591
+ ] ) {
3592
+ for ( const relativePath of candidates ) {
3593
+ const entryPath = path.resolve( process.cwd(), relativePath );
3594
+ if ( ! fs.existsSync( entryPath ) ) {
3595
+ continue;
3596
+ }
3597
+
3598
+ entries.push( [ entryName, entryPath ] );
3599
+ break;
3600
+ }
3601
+ }
3602
+ $2`);
3603
+ }
3507
3604
  const sharedEntriesPattern = /for\s*\(\s*const\s+\[\s*entryName\s*,\s*candidates\s*\]\s+of\s+\[([\s\S]*?)\]\s*\)\s*\{/u;
3508
3605
  const match = source.match(sharedEntriesPattern);
3509
3606
  if (!match || !match[1].includes("bindings/index") || !match[1].includes("editor-plugins/index")) {
@@ -5040,4 +5137,4 @@ export {
5040
5137
  ADD_BLOCK_TEMPLATE_IDS
5041
5138
  };
5042
5139
 
5043
- //# debugId=2B54B495F629D39264756E2164756E21
5140
+ //# debugId=B375BD42A8A3F6C764756E2164756E21
@@ -16557,6 +16557,6 @@ async function resolveOptionalInteractiveExternalLayerId({
16557
16557
  }
16558
16558
  }
16559
16559
 
16560
- export { syncPersistenceRestArtifacts, copyInterpolatedDirectory, listInterpolatedDirectoryOutputs, getPrimaryDevelopmentScript, getOptionalOnboardingSteps, getOptionalOnboardingNote, getOptionalOnboardingShortNote, formatNonEmptyTargetDirectoryError, parseTemplateLocator, resolveExternalTemplateLayers, resolveTemplateSeed, normalizeOptionalCliString, resolveLocalCliPathOption, assertExternalLayerCompositionOptions, assertBuiltInTemplateVariantAllowed, parseAlternateRenderTargets, parseCompoundInnerBlocksPreset, OPTIONAL_WORDPRESS_AI_CLIENT_COMPATIBILITY, REQUIRED_WORKSPACE_ABILITY_COMPATIBILITY, resolveScaffoldCompatibilityPolicy, renderScaffoldCompatibilityConfig, updatePluginHeaderCompatibility, getDefaultAnswers, resolveTemplateId, resolvePackageManagerId, collectScaffoldAnswers, DATA_STORAGE_MODES, PERSISTENCE_POLICIES, isDataStorageMode, isPersistencePolicy, scaffoldProject, resolveOptionalInteractiveExternalLayerId };
16560
+ export { syncPersistenceRestArtifacts, copyInterpolatedDirectory, listInterpolatedDirectoryOutputs, getPrimaryDevelopmentScript, getOptionalOnboardingSteps, getOptionalOnboardingNote, getOptionalOnboardingShortNote, formatNonEmptyTargetDirectoryError, require_semver2 as require_semver, parseTemplateLocator, resolveExternalTemplateLayers, resolveTemplateSeed, normalizeOptionalCliString, resolveLocalCliPathOption, assertExternalLayerCompositionOptions, assertBuiltInTemplateVariantAllowed, parseAlternateRenderTargets, parseCompoundInnerBlocksPreset, OPTIONAL_WORDPRESS_AI_CLIENT_COMPATIBILITY, REQUIRED_WORKSPACE_ABILITY_COMPATIBILITY, resolveScaffoldCompatibilityPolicy, renderScaffoldCompatibilityConfig, updatePluginHeaderCompatibility, getDefaultAnswers, resolveTemplateId, resolvePackageManagerId, collectScaffoldAnswers, DATA_STORAGE_MODES, PERSISTENCE_POLICIES, isDataStorageMode, isPersistencePolicy, scaffoldProject, resolveOptionalInteractiveExternalLayerId };
16561
16561
 
16562
- //# debugId=287134A8F6F7F6FD64756E2164756E21
16562
+ //# debugId=45408AA53A2AA42964756E2164756E21
@@ -391,7 +391,8 @@ function checkWorkspaceAbilityBootstrap(projectDir, packageName, phpPrefix) {
391
391
  const hasServerGlob = source.includes(WORKSPACE_ABILITY_GLOB);
392
392
  const hasEditorScript = source.includes(WORKSPACE_ABILITY_EDITOR_SCRIPT);
393
393
  const hasEditorAsset = source.includes(WORKSPACE_ABILITY_EDITOR_ASSET);
394
- return createDoctorCheck2("Ability bootstrap", hasLoaderHook && hasAdminEnqueueHook && hasEditorEnqueueHook && hasServerGlob && hasEditorScript && hasEditorAsset ? "pass" : "fail", hasLoaderHook && hasAdminEnqueueHook && hasEditorEnqueueHook && hasServerGlob && hasEditorScript && hasEditorAsset ? "Ability loader and admin/editor client bootstrap hooks are present" : "Missing ability loader hook or build/abilities script asset references");
394
+ const hasScriptModuleEnqueue = source.includes("wp_enqueue_script_module");
395
+ return createDoctorCheck2("Ability bootstrap", hasLoaderHook && hasAdminEnqueueHook && hasEditorEnqueueHook && hasServerGlob && hasEditorScript && hasEditorAsset && hasScriptModuleEnqueue ? "pass" : "fail", hasLoaderHook && hasAdminEnqueueHook && hasEditorEnqueueHook && hasServerGlob && hasEditorScript && hasEditorAsset && hasScriptModuleEnqueue ? "Ability loader and admin/editor script-module bootstrap hooks are present" : "Missing ability loader hook, script-module enqueue, or build/abilities asset references");
395
396
  }
396
397
  function checkWorkspaceAbilityIndex(projectDir, abilities) {
397
398
  const indexRelativePath = [
@@ -647,4 +648,4 @@ export {
647
648
  getDoctorChecks
648
649
  };
649
650
 
650
- //# debugId=1F5A1F43481D5B9164756E2164756E21
651
+ //# debugId=DA7EC2F06C52A22464756E2164756E21
@@ -19,7 +19,7 @@ import {
19
19
  resolvePackageManagerId,
20
20
  resolveTemplateId,
21
21
  scaffoldProject
22
- } from "./cli-8rnhjvb8.js";
22
+ } from "./cli-c5021kqy.js";
23
23
  import"./cli-tesygdnr.js";
24
24
  import"./cli-2rev5hqm.js";
25
25
  import"./cli-gcbre1zs.js";
package/dist-bunli/cli.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  mergeWpTypiaUserConfig,
15
15
  package_default,
16
16
  writeStructuredCliDiagnosticError
17
- } from "./cli-z18m4k4g.js";
17
+ } from "./cli-68145vb5.js";
18
18
  import"./cli-03j0axbt.js";
19
19
  import {
20
20
  GLOBAL_FLAGS,
@@ -2539,7 +2539,7 @@ async function formatCliError(error) {
2539
2539
  }
2540
2540
  async function createWpTypiaCli(options = {}) {
2541
2541
  applyStandaloneSupportLayoutEnv();
2542
- const { wpTypiaCommands } = await import("./command-list-g3z86j3x.js");
2542
+ const { wpTypiaCommands } = await import("./command-list-kx7q3f18.js");
2543
2543
  const cli = await createCLI({
2544
2544
  ...bunliConfig,
2545
2545
  description: package_default.description,
@@ -13,7 +13,7 @@ import {
13
13
  package_default,
14
14
  prefersStructuredCliOutput,
15
15
  resolveCommandOptionValues
16
- } from "./cli-z18m4k4g.js";
16
+ } from "./cli-68145vb5.js";
17
17
  import {
18
18
  Result,
19
19
  TaggedError,
@@ -939,12 +939,12 @@ async function executeSyncCommand({
939
939
  }
940
940
 
941
941
  // src/runtime-bridge.ts
942
- var loadCliAddRuntime = () => import("./cli-add-43f9hqev.js");
942
+ var loadCliAddRuntime = () => import("./cli-add-a27wjrk4.js");
943
943
  var loadCliDiagnosticsRuntime = () => import("./cli-diagnostics-db6kxv83.js");
944
- var loadCliDoctorRuntime = () => import("./cli-doctor-wnx8rv84.js");
944
+ var loadCliDoctorRuntime = () => import("./cli-doctor-31djnnxs.js");
945
945
  var loadCliInitRuntime = () => import("./cli-init-gdyp9enw.js");
946
946
  var loadCliPromptRuntime = () => import("./cli-prompt-614tq57c.js");
947
- var loadCliScaffoldRuntime = () => import("./cli-scaffold-nt1fx2f0.js");
947
+ var loadCliScaffoldRuntime = () => import("./cli-scaffold-r0yxfhbq.js");
948
948
  var loadCliTemplatesRuntime = () => import("./cli-templates-9t2a7zqd.js");
949
949
  var loadMigrationsRuntime = () => import("./migrations-1p6mbkyw.js");
950
950
  async function wrapCliCommandError(command, error) {
@@ -2083,7 +2083,7 @@ var doctorCommand = defineCommand({
2083
2083
  const prefersStructuredOutput = prefersStructuredCliOutput(args);
2084
2084
  if (prefersStructuredOutput) {
2085
2085
  const [{ getDoctorChecks }, { getDoctorFailureDetailLines }] = await Promise.all([
2086
- import("./cli-doctor-wnx8rv84.js"),
2086
+ import("./cli-doctor-31djnnxs.js"),
2087
2087
  import("./cli-diagnostics-db6kxv83.js")
2088
2088
  ]);
2089
2089
  const checks = await getDoctorChecks(args.cwd);
@@ -3,7 +3,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
3
  // package.json
4
4
  var package_default = {
5
5
  name: "wp-typia",
6
- version: "0.20.3",
6
+ version: "0.20.4",
7
7
  description: "Canonical CLI package for wp-typia scaffolding and project workflows",
8
8
  packageManager: "bun@1.3.11",
9
9
  type: "module",
@@ -71,7 +71,7 @@ var package_default = {
71
71
  "@bunli/tui": "0.6.0",
72
72
  "@bunli/utils": "0.6.0",
73
73
  "@wp-typia/api-client": "^0.4.5",
74
- "@wp-typia/project-tools": "0.20.0",
74
+ "@wp-typia/project-tools": "0.20.1",
75
75
  "better-result": "^2.7.0",
76
76
  react: "^19.2.5",
77
77
  "react-dom": "^19.2.5",
@@ -2707,4 +2707,4 @@ export {
2707
2707
  hasFlagBeforeTerminator
2708
2708
  };
2709
2709
 
2710
- //# debugId=B39501A37913B3CC64756E2164756E21
2710
+ //# debugId=2B2288BD839BD95964756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wp-typia",
3
- "version": "0.20.3",
3
+ "version": "0.20.4",
4
4
  "description": "Canonical CLI package for wp-typia scaffolding and project workflows",
5
5
  "packageManager": "bun@1.3.11",
6
6
  "type": "module",
@@ -68,7 +68,7 @@
68
68
  "@bunli/tui": "0.6.0",
69
69
  "@bunli/utils": "0.6.0",
70
70
  "@wp-typia/api-client": "^0.4.5",
71
- "@wp-typia/project-tools": "0.20.0",
71
+ "@wp-typia/project-tools": "0.20.1",
72
72
  "better-result": "^2.7.0",
73
73
  "react": "^19.2.5",
74
74
  "react-dom": "^19.2.5",