@codefast/cli 0.3.14 → 0.3.15

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.
Files changed (205) hide show
  1. package/README.md +8 -3
  2. package/dist/bootstrap/cli-application.module.mjs +18 -0
  3. package/dist/bootstrap/composition-root.mjs +14 -0
  4. package/dist/bootstrap/register-cli-command-trees.mjs +7 -0
  5. package/dist/{lib → domains}/arrange/application/use-cases/analyze-directory.use-case.mjs +12 -12
  6. package/dist/{lib → domains}/arrange/application/use-cases/prepare-arrange-workspace.use-case.mjs +19 -18
  7. package/dist/{lib → domains}/arrange/application/use-cases/run-arrange-sync.use-case.mjs +18 -18
  8. package/dist/{lib → domains}/arrange/application/use-cases/suggest-cn-groups.use-case.mjs +5 -5
  9. package/dist/domains/arrange/arrange.module.mjs +38 -0
  10. package/dist/domains/arrange/composition/tokens.mjs +17 -0
  11. package/dist/{lib/arrange/domain/arrange-analyze.service.mjs → domains/arrange/domain/arrange-analyze.domain-service.mjs} +1 -1
  12. package/dist/{lib/arrange/domain/arrange-grouping.service.mjs → domains/arrange/domain/arrange-grouping.domain-service.mjs} +2 -2
  13. package/dist/{lib → domains}/arrange/domain/ast/ast-helpers.helper.mjs +2 -2
  14. package/dist/{lib → domains}/arrange/domain/ast/ast-node.model.mjs +1 -1
  15. package/dist/{lib → domains}/arrange/domain/ast/collectors-cn.collector.mjs +1 -1
  16. package/dist/{lib → domains}/arrange/domain/ast/collectors-jsx.collector.mjs +1 -1
  17. package/dist/{lib → domains}/arrange/domain/ast/collectors-tv.collector.mjs +1 -1
  18. package/dist/{lib → domains}/arrange/domain/ast/targets.model.mjs +2 -2
  19. package/dist/{lib → domains}/arrange/domain/constants.domain.mjs +1 -1
  20. package/dist/{lib → domains}/arrange/domain/grouping.domain.mjs +1 -1
  21. package/dist/{lib → domains}/arrange/domain/imports.domain.mjs +1 -1
  22. package/dist/{lib → domains}/arrange/domain/source-text-formatters.formatter.mjs +2 -2
  23. package/dist/{lib/arrange/domain/tailwind-grouping.service.mjs → domains/arrange/domain/tailwind-grouping.domain-service.mjs} +5 -5
  24. package/dist/{lib → domains}/arrange/domain/tailwind-token-classifier.domain-service.mjs +1 -1
  25. package/dist/{lib → domains}/arrange/domain/tailwind-token.value-object.mjs +1 -1
  26. package/dist/{lib/arrange/application/services/arrange-file-processor.service.mjs → domains/arrange/infrastructure/adapters/arrange-file-processor.adapter.mjs} +8 -8
  27. package/dist/domains/arrange/infrastructure/adapters/arrange-target-path-resolver.adapter.mjs +247 -0
  28. package/dist/{lib/arrange/application/services/arrange-target-scanner.service.mjs → domains/arrange/infrastructure/adapters/arrange-target-scanner.adapter.mjs} +8 -8
  29. package/dist/{lib/arrange/adapters/secondary → domains/arrange/infrastructure/adapters}/domain-source-parser.adapter.mjs +10 -8
  30. package/dist/{lib/arrange/adapters/secondary → domains/arrange/infrastructure/adapters}/file-walker.adapter.mjs +8 -9
  31. package/dist/domains/arrange/infrastructure/typescript-ast-translator.mjs +580 -0
  32. package/dist/{lib/arrange/adapters/primary → domains/arrange/presentation}/cli/arrange.command.mjs +195 -54
  33. package/dist/{lib/arrange/presentation → domains/arrange/presentation/presenters}/arrange-analyze.presenter.mjs +26 -33
  34. package/dist/{lib/arrange/presentation → domains/arrange/presentation/presenters}/arrange-cli.schema.mjs +1 -1
  35. package/dist/{lib/tag/presentation/present-tag-sync-result.presenter.mjs → domains/arrange/presentation/presenters/arrange-sync.presenter.mjs} +12 -9
  36. package/dist/{lib/arrange/presentation → domains/arrange/presentation/presenters}/group-file-preview.presenter.mjs +46 -46
  37. package/dist/domains/config/composition/tokens.mjs +7 -0
  38. package/dist/{lib/config/infrastructure/config-schema.adapter.mjs → domains/config/domain/codefast-config.schema.mjs} +6 -6
  39. package/dist/{lib/config/infrastructure → domains/config/infrastructure/adapters}/config-loader.adapter.mjs +76 -77
  40. package/dist/{lib/config/infrastructure → domains/config/infrastructure/adapters}/config-warning-reporter.adapter.mjs +6 -6
  41. package/dist/domains/config/infrastructure/adapters/zod-codefast-config-schema.adapter.mjs +236 -0
  42. package/dist/domains/mirror/application/mirror-sync-cli-result.mjs +15 -0
  43. package/dist/{lib → domains}/mirror/application/use-cases/prepare-mirror-sync.use-case.mjs +14 -15
  44. package/dist/{lib → domains}/mirror/application/use-cases/run-mirror-sync.use-case.mjs +69 -54
  45. package/dist/{lib/mirror/contracts → domains/mirror/composition}/tokens.mjs +4 -3
  46. package/dist/{lib → domains}/mirror/domain/constants.domain.mjs +1 -1
  47. package/dist/{lib → domains}/mirror/domain/errors.domain.mjs +1 -1
  48. package/dist/{lib/mirror/application/services/generate-mirror-exports.service.mjs → domains/mirror/domain/generate-mirror-exports.domain-service.mjs} +2 -2
  49. package/dist/{lib → domains}/mirror/domain/package-display-name.policy.mjs +1 -1
  50. package/dist/{lib → domains}/mirror/domain/path-normalizer.value-object.mjs +1 -1
  51. package/dist/{lib/mirror/adapters/secondary → domains/mirror/infrastructure/adapters}/file-system-service.adapter.mjs +8 -8
  52. package/dist/domains/mirror/infrastructure/adapters/mirror-package-path-resolver.adapter.mjs +252 -0
  53. package/dist/{lib/mirror/adapters/secondary → domains/mirror/infrastructure/adapters}/mirror-sync-reporter.adapter.mjs +94 -15
  54. package/dist/{lib/mirror/adapters/secondary → domains/mirror/infrastructure/adapters}/package-repository.adapter.mjs +4 -4
  55. package/dist/{lib/mirror/adapters/secondary → domains/mirror/infrastructure/adapters}/sync-workspace-package.adapter.mjs +23 -46
  56. package/dist/{lib/mirror/infrastructure → domains/mirror/infrastructure/guards}/dirent-list.guard.mjs +1 -1
  57. package/dist/{lib → domains}/mirror/infrastructure/package-json-exports.repository.mjs +27 -27
  58. package/dist/domains/mirror/mirror.module.mjs +26 -0
  59. package/dist/{lib/mirror/adapters/primary → domains/mirror/presentation}/cli/mirror.command.mjs +83 -27
  60. package/dist/{lib/mirror/presentation → domains/mirror/presentation/presenters}/mirror-cli.schema.mjs +1 -4
  61. package/dist/domains/mirror/presentation/presenters/present-mirror-sync-progress.presenter.mjs +265 -0
  62. package/dist/domains/tag/application/ports/outbound/tag-eligible-workspace-paths.port.mjs +1 -0
  63. package/dist/domains/tag/application/ports/outbound/tag-since-writer.port.mjs +1 -0
  64. package/dist/domains/tag/application/ports/outbound/tag-target-path-resolver.port.mjs +1 -0
  65. package/dist/domains/tag/application/ports/outbound/tag-target-runner.port.mjs +1 -0
  66. package/dist/domains/tag/application/ports/outbound/tag-version-resolver.port.mjs +1 -0
  67. package/dist/domains/tag/application/ports/presenting/present-tag-sync-progress.presenter.mjs +1 -0
  68. package/dist/domains/tag/application/ports/presenting/present-tag-sync-result.presenter.mjs +1 -0
  69. package/dist/domains/tag/application/requests/tag-sync-execution-input.mjs +1 -0
  70. package/dist/domains/tag/application/requests/tag-sync.request.mjs +1 -0
  71. package/dist/{lib → domains}/tag/application/tag-sync-cli-result.mjs +3 -3
  72. package/dist/{lib → domains}/tag/application/use-cases/prepare-tag-sync.use-case.mjs +20 -24
  73. package/dist/{lib → domains}/tag/application/use-cases/run-tag-sync.use-case.mjs +123 -129
  74. package/dist/domains/tag/composition/tokens.mjs +13 -0
  75. package/dist/domains/tag/contracts/models.mjs +1 -0
  76. package/dist/domains/tag/domain/types.domain.mjs +1 -0
  77. package/dist/{lib/tag/adapters/secondary → domains/tag/infrastructure/adapters}/tag-since-writer.adapter.mjs +105 -105
  78. package/dist/{lib/tag/adapters/secondary/typescript-tree-walk.adapter.mjs → domains/tag/infrastructure/adapters/tag-target-path-resolver.adapter.mjs} +11 -9
  79. package/dist/domains/tag/infrastructure/adapters/tag-target-resolver.adapter.mjs +302 -0
  80. package/dist/domains/tag/infrastructure/adapters/tag-target-runner.adapter.mjs +259 -0
  81. package/dist/{lib/tag/adapters/secondary → domains/tag/infrastructure/adapters}/tag-version-resolver.adapter.mjs +6 -6
  82. package/dist/{lib/tag/adapters/primary → domains/tag/presentation}/cli/tag.command.mjs +67 -27
  83. package/dist/{lib/tag/presentation/tag-sync-progress-listener.presenter.mjs → domains/tag/presentation/presenters/present-tag-sync-progress.presenter.mjs} +14 -9
  84. package/dist/domains/tag/presentation/presenters/present-tag-sync-result.presenter.mjs +290 -0
  85. package/dist/{lib/tag/presentation → domains/tag/presentation/presenters}/tag-cli.schema.mjs +1 -1
  86. package/dist/domains/tag/tag.module.mjs +28 -0
  87. package/dist/program.mjs +3 -2
  88. package/dist/shell/application/cli-runtime.tokens.mjs +18 -0
  89. package/dist/shell/application/coordination/cli-executor.coordination.mjs +1 -0
  90. package/dist/shell/application/coordination/cli-schema-parsing.coordination.mjs +1 -0
  91. package/dist/shell/application/global-cli-options.model.mjs +5 -0
  92. package/dist/shell/application/ports/inbound/load-codefast-config.port.mjs +1 -0
  93. package/dist/shell/application/ports/outbound/cli-fs.port.mjs +1 -0
  94. package/dist/shell/application/ports/outbound/cli-logger.port.mjs +1 -0
  95. package/dist/shell/application/ports/outbound/cli-path.port.mjs +1 -0
  96. package/dist/shell/application/ports/outbound/cli-runtime.port.mjs +1 -0
  97. package/dist/shell/application/ports/outbound/cli-telemetry.port.mjs +1 -0
  98. package/dist/shell/application/ports/outbound/cli-verbose-diagnostics.port.mjs +1 -0
  99. package/dist/shell/application/ports/outbound/format-app-error.port.mjs +1 -0
  100. package/dist/shell/application/ports/outbound/global-cli-options-parse.port.mjs +1 -0
  101. package/dist/shell/application/ports/outbound/repo-root-resolver.port.mjs +1 -0
  102. package/dist/shell/application/ports/outbound/typescript-source-file-walker.port.mjs +1 -0
  103. package/dist/shell/application/ports/outbound/workspace-package-layout.port.mjs +1 -0
  104. package/dist/shell/application/ports/primary/command.port.mjs +1 -0
  105. package/dist/shell/application/services/cli-executor.service.mjs +267 -0
  106. package/dist/shell/application/services/schema-validator.service.mjs +236 -0
  107. package/dist/{lib/core/application → shell/application/use-cases}/load-codefast-config.use-case.mjs +11 -13
  108. package/dist/shell/composition/tokens.mjs +5 -0
  109. package/dist/shell/contracts/cli-command-slots.mjs +11 -0
  110. package/dist/{lib/core → shell}/domain/caught-unknown-message.value-object.mjs +1 -1
  111. package/dist/{lib/core → shell}/domain/cli-exit-codes.domain.mjs +1 -1
  112. package/dist/shell/domain/cli-positional-arg.value-object.mjs +6 -0
  113. package/dist/{lib/core → shell}/domain/errors.domain.mjs +1 -1
  114. package/dist/{lib/core → shell}/domain/result.model.mjs +1 -1
  115. package/dist/{lib/shared/source-code/domain/text-edit.model.mjs → shell/domain/source-text-edit.support.mjs} +2 -2
  116. package/dist/shell/infrastructure/adapters/cli-verbose-diagnostics.adapter.mjs +228 -0
  117. package/dist/{lib/tag/adapters/secondary/tag-target-resolver.adapter.mjs → shell/infrastructure/adapters/format-app-error.adapter.mjs} +16 -13
  118. package/dist/shell/infrastructure/adapters/global-cli-options-parser.adapter.mjs +233 -0
  119. package/dist/{lib/mirror/adapters/secondary/workspace-service.adapter.mjs → shell/infrastructure/adapters/repo-root-resolver.adapter.mjs} +20 -13
  120. package/dist/shell/infrastructure/adapters/typescript-source-file-walker.adapter.mjs +259 -0
  121. package/dist/shell/infrastructure/commander/commander-cli-host.adapter.mjs +69 -0
  122. package/dist/{lib/infrastructure/node-io.adapter.mjs → shell/infrastructure/node/node-cli-fs.adapter.mjs} +11 -47
  123. package/dist/{lib/arrange/adapters/secondary/workspace-resolver.adapter.mjs → shell/infrastructure/node/node-cli-logger.adapter.mjs} +11 -13
  124. package/dist/{lib/core/infrastructure/path.adapter.mjs → shell/infrastructure/node/node-cli-path.adapter.mjs} +1 -1
  125. package/dist/{lib/core/infrastructure/repo-root-resolver.adapter.mjs → shell/infrastructure/node/node-cli-runtime.adapter.mjs} +14 -13
  126. package/dist/shell/infrastructure/telemetry/cli-telemetry.adapter.mjs +280 -0
  127. package/dist/shell/infrastructure/workspace/node-pnpm-workspace-package-layout.adapter.mjs +385 -0
  128. package/dist/shell/shell.module.mjs +43 -0
  129. package/dist/shell/wiring/optional-cli-port-telemetry-activation.mjs +13 -0
  130. package/package.json +9 -7
  131. package/dist/lib/arrange/adapters/primary/cli/arrange.presentation.module.mjs +0 -14
  132. package/dist/lib/arrange/adapters/primary/cli/presentation.tokens.mjs +0 -5
  133. package/dist/lib/arrange/application/services/arrange-target-path-resolver.service.mjs +0 -21
  134. package/dist/lib/arrange/arrange.module.mjs +0 -31
  135. package/dist/lib/arrange/contracts/tokens.mjs +0 -15
  136. package/dist/lib/arrange/infrastructure/typescript-ast-translator.adapter.mjs +0 -355
  137. package/dist/lib/arrange/presentation/arrange-sync.presenter.mjs +0 -33
  138. package/dist/lib/bootstrap/composition-root.mjs +0 -33
  139. package/dist/lib/config/application/services/load-config.service.mjs +0 -17
  140. package/dist/lib/config/contracts/tokens.mjs +0 -6
  141. package/dist/lib/core/application/services/global-cli-options-parser.service.mjs +0 -9
  142. package/dist/lib/core/application/services/schema-validator.service.mjs +0 -17
  143. package/dist/lib/core/contracts/tokens.mjs +0 -10
  144. package/dist/lib/core/core.module.mjs +0 -9
  145. package/dist/lib/core/infrastructure/infrastructure.module.mjs +0 -30
  146. package/dist/lib/core/infrastructure/port-telemetry.decorator.mjs +0 -62
  147. package/dist/lib/core/infrastructure/verbose-diagnostics.policy.mjs +0 -9
  148. package/dist/lib/core/presentation/cli-executor.presenter.mjs +0 -42
  149. package/dist/lib/core/presentation/cli-schema.parser.mjs +0 -7
  150. package/dist/lib/core/presentation/format-app-error.presenter.mjs +0 -17
  151. package/dist/lib/core/presentation/presentation.module.mjs +0 -5
  152. package/dist/lib/infrastructure/workspace/repo-root-resolver.service.mjs +0 -21
  153. package/dist/lib/kernel/contracts/tokens.mjs +0 -5
  154. package/dist/lib/mirror/application/mirror-sync-json.format.mjs +0 -12
  155. package/dist/lib/mirror/application/services/mirror-package-arg-resolver.service.mjs +0 -20
  156. package/dist/lib/mirror/infrastructure/mirror-console-reporter.presenter.mjs +0 -99
  157. package/dist/lib/mirror/infrastructure/package-filter-resolver.service.mjs +0 -25
  158. package/dist/lib/mirror/infrastructure/workspace-packages.service.mjs +0 -158
  159. package/dist/lib/mirror/mirror.module.mjs +0 -25
  160. package/dist/lib/shared/source-code/infrastructure/typescript-source-file-walker.service.mjs +0 -33
  161. package/dist/lib/tag/adapters/primary/cli/presentation.tokens.mjs +0 -6
  162. package/dist/lib/tag/adapters/primary/cli/tag.presentation.module.mjs +0 -13
  163. package/dist/lib/tag/application/services/tag-cli-target-path-resolver.service.mjs +0 -9
  164. package/dist/lib/tag/application/services/tag-target-runner.service.mjs +0 -21
  165. package/dist/lib/tag/application/tag-sync-json.format.mjs +0 -14
  166. package/dist/lib/tag/contracts/tokens.mjs +0 -10
  167. package/dist/lib/tag/infrastructure/tag-target-candidates.adapter.mjs +0 -170
  168. package/dist/lib/tag/presentation/colors.presenter.mjs +0 -12
  169. package/dist/lib/tag/presentation/tag-sync.presenter.mjs +0 -61
  170. package/dist/lib/tag/tag.module.mjs +0 -23
  171. /package/dist/{lib/arrange/application/ports/domain-source-parser.port.mjs → domains/arrange/application/ports/inbound/analyze-directory.port.mjs} +0 -0
  172. /package/dist/{lib/arrange/application/ports/file-walker.port.mjs → domains/arrange/application/ports/inbound/prepare-arrange-workspace.port.mjs} +0 -0
  173. /package/dist/{lib/arrange/application/ports/group-file-preview.port.mjs → domains/arrange/application/ports/inbound/run-arrange-sync.port.mjs} +0 -0
  174. /package/dist/{lib/arrange/application/ports/workspace-resolver.port.mjs → domains/arrange/application/ports/inbound/suggest-cn-groups.port.mjs} +0 -0
  175. /package/dist/{lib/arrange/application/requests/analyze-directory.request.mjs → domains/arrange/application/ports/outbound/arrange-file-processor.port.mjs} +0 -0
  176. /package/dist/{lib/arrange/application/requests/arrange-sync.request.mjs → domains/arrange/application/ports/outbound/arrange-target-path-resolver.port.mjs} +0 -0
  177. /package/dist/{lib/arrange/application/requests/suggest-groups.request.mjs → domains/arrange/application/ports/outbound/arrange-target-scanner.port.mjs} +0 -0
  178. /package/dist/{lib/arrange/contracts/analyze-report-presenter.contract.mjs → domains/arrange/application/ports/outbound/domain-source-parser.port.mjs} +0 -0
  179. /package/dist/{lib/arrange/contracts/models.mjs → domains/arrange/application/ports/outbound/file-walker.port.mjs} +0 -0
  180. /package/dist/{lib/arrange/contracts/services.contract.mjs → domains/arrange/application/ports/presenting/present-analyze-report.presenter.mjs} +0 -0
  181. /package/dist/{lib/arrange/domain/types.domain.mjs → domains/arrange/application/ports/presenting/present-arrange-sync-result.presenter.mjs} +0 -0
  182. /package/dist/{lib/config/application/ports/config-loader.port.mjs → domains/arrange/application/ports/presenting/present-group-file-preview.presenter.mjs} +0 -0
  183. /package/dist/{lib/config/application/ports/config-warning-reporter.port.mjs → domains/arrange/application/requests/analyze-directory.request.mjs} +0 -0
  184. /package/dist/{lib/config/domain/schema.domain.mjs → domains/arrange/application/requests/arrange-sync.request.mjs} +0 -0
  185. /package/dist/{lib/core/application/ports/cli-io.port.mjs → domains/arrange/application/requests/suggest-groups.request.mjs} +0 -0
  186. /package/dist/{lib/mirror → domains/arrange}/contracts/models.mjs +0 -0
  187. /package/dist/{lib/mirror → domains/arrange}/domain/types.domain.mjs +0 -0
  188. /package/dist/{lib/core/application/ports/path.port.mjs → domains/config/application/ports/outbound/codefast-config-schema.port.mjs} +0 -0
  189. /package/dist/{lib/core/application/ports/repo-root-resolver.port.mjs → domains/config/application/ports/outbound/config-loader.port.mjs} +0 -0
  190. /package/dist/{lib/core/application/ports/runtime.port.mjs → domains/config/application/ports/outbound/config-warning-reporter.port.mjs} +0 -0
  191. /package/dist/{lib/kernel/contracts/cli-command.contract.mjs → domains/config/domain/schema.domain.mjs} +0 -0
  192. /package/dist/{lib/mirror/application/ports/file-system-service.port.mjs → domains/mirror/application/ports/inbound/prepare-mirror-sync.port.mjs} +0 -0
  193. /package/dist/{lib/mirror/application/ports/mirror-sync-reporter.port.mjs → domains/mirror/application/ports/inbound/run-mirror-sync.port.mjs} +0 -0
  194. /package/dist/{lib/mirror/application/ports/package-repository.port.mjs → domains/mirror/application/ports/outbound/file-system-service.port.mjs} +0 -0
  195. /package/dist/{lib/mirror/application/ports/sync-workspace-package.port.mjs → domains/mirror/application/ports/outbound/mirror-package-path.port.mjs} +0 -0
  196. /package/dist/{lib/mirror/application/ports/workspace-service.port.mjs → domains/mirror/application/ports/outbound/mirror-sync-reporter.port.mjs} +0 -0
  197. /package/dist/{lib/mirror/application/requests/mirror-sync.request.mjs → domains/mirror/application/ports/outbound/package-repository.port.mjs} +0 -0
  198. /package/dist/{lib/tag/application/ports/tag-since-writer.port.mjs → domains/mirror/application/ports/outbound/sync-workspace-package.port.mjs} +0 -0
  199. /package/dist/{lib/tag/application/ports/tag-version-resolver.port.mjs → domains/mirror/application/ports/presenting/present-mirror-sync-progress.presenter.mjs} +0 -0
  200. /package/dist/{lib/tag/application/ports/target-resolver.port.mjs → domains/mirror/application/requests/mirror-sync-execution-input.mjs} +0 -0
  201. /package/dist/{lib/tag/application/ports/typescript-tree-walk.port.mjs → domains/mirror/application/requests/mirror-sync.request.mjs} +0 -0
  202. /package/dist/{lib/tag → domains/mirror}/contracts/models.mjs +0 -0
  203. /package/dist/{lib/tag → domains/mirror}/domain/types.domain.mjs +0 -0
  204. /package/dist/{lib/tag/application/requests/tag-sync.request.mjs → domains/tag/application/ports/inbound/prepare-tag-sync.port.mjs} +0 -0
  205. /package/dist/{lib/tag/contracts/tag-sync-result-presenter.contract.mjs → domains/tag/application/ports/inbound/run-tag-sync.port.mjs} +0 -0
@@ -1,14 +1,11 @@
1
- import { AnalyzeDirectoryUseCaseToken, GroupFilePreviewPortToken, PrepareArrangeWorkspaceUseCaseToken, RunArrangeSyncUseCaseToken, SuggestCnGroupsUseCaseToken } from "../../../contracts/tokens.mjs";
2
- import { PresentAnalyzeReportPresenterToken } from "./presentation.tokens.mjs";
3
- import { arrangeAnalyzeDirectoryRequestSchema, arrangeSuggestGroupsRequestSchema, arrangeSyncRunRequestSchema } from "../../../presentation/arrange-cli.schema.mjs";
4
- import { exitCodeForArrangeSyncResult, formatArrangeGroupJsonOutput, formatArrangeSyncJsonOutput, presentArrangeSyncResult } from "../../../presentation/arrange-sync.presenter.mjs";
5
- import { CliLoggerToken, CliRuntimeToken } from "../../../../core/contracts/tokens.mjs";
6
- import { formatArrangeAnalyzeJsonOutput } from "../../../presentation/arrange-analyze.presenter.mjs";
7
- import { parseWithCliSchema } from "../../../../core/presentation/cli-schema.parser.mjs";
8
- import { consumeCliAppError } from "../../../../core/presentation/cli-executor.presenter.mjs";
9
- import { Option } from "commander";
1
+ import { AnalyzeDirectoryUseCaseToken, PrepareArrangeWorkspaceUseCaseToken, PresentAnalyzeReportPresenterToken, PresentArrangeSyncResultPresenterToken, PresentGroupFilePreviewPresenterToken, RunArrangeSyncUseCaseToken, SuggestCnGroupsUseCaseToken } from "../../composition/tokens.mjs";
2
+ import { CliExecutorToken, CliLoggerPortToken, CliRuntimeToken, CliSchemaParsingToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
3
+ import "../../../../shell/domain/cli-exit-codes.domain.mjs";
4
+ import { arrangeAnalyzeDirectoryRequestSchema, arrangeSuggestGroupsRequestSchema, arrangeSyncRunRequestSchema } from "../presenters/arrange-cli.schema.mjs";
5
+ import { CLI_COMMAND_SLOT_NAME } from "../../../../shell/contracts/cli-command-slots.mjs";
6
+ import { readOptionalPositionalArg } from "../../../../shell/domain/cli-positional-arg.value-object.mjs";
10
7
  import { inject, injectable } from "@codefast/di";
11
- //#region src/lib/arrange/adapters/primary/cli/arrange.command.ts
8
+ //#region src/domains/arrange/presentation/cli/arrange.command.ts
12
9
  function toPrimitive(input, hint) {
13
10
  if (typeof input !== "object" || input === null) return input;
14
11
  var prim = input[Symbol.toPrimitive];
@@ -219,18 +216,18 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
219
216
  };
220
217
  }
221
218
  let _dec, _initClass;
222
- function withClassNameOption() {
223
- return new Option("--with-classname, --with-class-name", "Append className as final cn() argument").default(false);
224
- }
225
219
  _dec = injectable([
226
- inject(CliLoggerToken),
220
+ inject(CliLoggerPortToken),
227
221
  inject(CliRuntimeToken),
228
222
  inject(PrepareArrangeWorkspaceUseCaseToken),
229
223
  inject(AnalyzeDirectoryUseCaseToken),
230
224
  inject(RunArrangeSyncUseCaseToken),
231
225
  inject(SuggestCnGroupsUseCaseToken),
232
226
  inject(PresentAnalyzeReportPresenterToken),
233
- inject(GroupFilePreviewPortToken)
227
+ inject(PresentGroupFilePreviewPresenterToken),
228
+ inject(PresentArrangeSyncResultPresenterToken),
229
+ inject(CliSchemaParsingToken),
230
+ inject(CliExecutorToken)
234
231
  ]);
235
232
  let _ArrangeCommand;
236
233
  (class {
@@ -241,11 +238,14 @@ let _ArrangeCommand;
241
238
  runArrangeSync;
242
239
  suggestCnGroups;
243
240
  presentAnalyzeReport;
244
- groupFilePreview;
241
+ presentGroupFilePreview;
242
+ presentArrangeSyncResult;
243
+ schemaValidation;
244
+ cliExecutor;
245
245
  static {
246
246
  ({c: [_ArrangeCommand, _initClass]} = _apply_decs_2311(this, [_dec], []));
247
247
  }
248
- constructor(logger, runtime, prepareWorkspace, analyzeDirectory, runArrangeSync, suggestCnGroups, presentAnalyzeReport, groupFilePreview) {
248
+ constructor(logger, runtime, prepareWorkspace, analyzeDirectory, runArrangeSync, suggestCnGroups, presentAnalyzeReport, presentGroupFilePreview, presentArrangeSyncResult, schemaValidation, cliExecutor) {
249
249
  this.logger = logger;
250
250
  this.runtime = runtime;
251
251
  this.prepareWorkspace = prepareWorkspace;
@@ -253,69 +253,210 @@ let _ArrangeCommand;
253
253
  this.runArrangeSync = runArrangeSync;
254
254
  this.suggestCnGroups = suggestCnGroups;
255
255
  this.presentAnalyzeReport = presentAnalyzeReport;
256
- this.groupFilePreview = groupFilePreview;
256
+ this.presentGroupFilePreview = presentGroupFilePreview;
257
+ this.presentArrangeSyncResult = presentArrangeSyncResult;
258
+ this.schemaValidation = schemaValidation;
259
+ this.cliExecutor = cliExecutor;
257
260
  }
258
- name = "arrange";
259
- description = "Analyze and regroup Tailwind classes in cn() / tv() calls (Tailwind v4)";
260
- register(program) {
261
- const arrange = program.command(this.name).description(this.description);
262
- arrange.command("analyze").description("Report long strings, nested cn in tv(), and related findings").argument("[target]", "Directory or file (default: nearest package directory from cwd)").option("--json", "Print one JSON object on stdout instead of a human report", false).action((target, options) => this.executeAnalyze(target, options));
263
- arrange.command("preview").description("Dry-run: print suggested replacements without writing files").argument("[target]", "Directory or file (default: nearest package directory from cwd)").addOption(withClassNameOption()).option("--cn-import <spec>", "Override module specifier when adding cn import").option("--json", "Print one JSON object on stdout (suppresses human progress)", false).action((target, opts) => this.executePreviewOrApply(false, target, opts));
264
- arrange.command("apply").description("Apply grouping and cn-in-tv unwrap edits to files").argument("[target]", "Directory or file (default: nearest package directory from cwd)").addOption(withClassNameOption()).option("--cn-import <spec>", "Override module specifier when adding cn import").option("--json", "Print one JSON object on stdout (suppresses human progress)", false).action((target, opts) => this.executePreviewOrApply(true, target, opts));
265
- arrange.command("group").description("Try grouping on a pasted class string (stdout: cn(...) or tv array with --tv)").argument("[tokens...]", "Class tokens (quote a single string if it contains spaces)").option("--tv", "Emit tv()-style array instead of cn() call", false).addOption(withClassNameOption()).option("--json", "Print one JSON object on stdout instead of plain lines", false).action((tokens, opts) => this.executeGroup(tokens, opts));
261
+ get definition() {
262
+ return {
263
+ name: CLI_COMMAND_SLOT_NAME.arrange,
264
+ description: "Analyze and regroup Tailwind classes in cn() / tv() calls (Tailwind v4)",
265
+ children: [
266
+ {
267
+ name: "analyze",
268
+ description: "Report long strings, nested cn in tv(), and related findings",
269
+ route: [{
270
+ kind: "optionalPositional",
271
+ argumentTemplate: "[target]",
272
+ helpBlurb: "Directory or file (default: nearest package directory from cwd)"
273
+ }, {
274
+ kind: "booleanFlag",
275
+ flagPhrase: "--json",
276
+ helpBlurb: "Print one JSON object on stdout instead of a human report",
277
+ whenUnsetUses: false
278
+ }],
279
+ action: async (positionalPieces, typedLocalCarrier) => {
280
+ await this.performAnalyzeSubtree(readOptionalPositionalArg(positionalPieces[0]), { jsonCandidate: typedLocalCarrier.json });
281
+ }
282
+ },
283
+ {
284
+ name: "preview",
285
+ description: "Dry-run: print suggested replacements without writing files",
286
+ route: [
287
+ {
288
+ kind: "optionalPositional",
289
+ argumentTemplate: "[target]",
290
+ helpBlurb: "Directory or file (default: nearest package directory from cwd)"
291
+ },
292
+ {
293
+ kind: "synonymousBooleanAliases",
294
+ commaJoinedFlags: "--with-classname, --with-class-name",
295
+ helpBlurb: "Append className as final cn() argument"
296
+ },
297
+ {
298
+ kind: "stringPlaceholderFlag",
299
+ flagPhraseWithPlaceholder: "--cn-import <spec>",
300
+ helpBlurb: "Override module specifier when adding cn import"
301
+ },
302
+ {
303
+ kind: "booleanFlag",
304
+ flagPhrase: "--json",
305
+ helpBlurb: "Print one JSON object on stdout (suppresses human progress)",
306
+ whenUnsetUses: false
307
+ }
308
+ ],
309
+ action: async (positionalPieces, typedLocalCarrier) => {
310
+ await this.performApplyOrPreviewSubtree(false, readOptionalPositionalArg(positionalPieces[0]), typedLocalCarrier);
311
+ }
312
+ },
313
+ {
314
+ name: "apply",
315
+ description: "Apply grouping and cn-in-tv unwrap edits to files",
316
+ route: [
317
+ {
318
+ kind: "optionalPositional",
319
+ argumentTemplate: "[target]",
320
+ helpBlurb: "Directory or file (default: nearest package directory from cwd)"
321
+ },
322
+ {
323
+ kind: "synonymousBooleanAliases",
324
+ commaJoinedFlags: "--with-classname, --with-class-name",
325
+ helpBlurb: "Append className as final cn() argument"
326
+ },
327
+ {
328
+ kind: "stringPlaceholderFlag",
329
+ flagPhraseWithPlaceholder: "--cn-import <spec>",
330
+ helpBlurb: "Override module specifier when adding cn import"
331
+ },
332
+ {
333
+ kind: "booleanFlag",
334
+ flagPhrase: "--json",
335
+ helpBlurb: "Print one JSON object on stdout (suppresses human progress)",
336
+ whenUnsetUses: false
337
+ }
338
+ ],
339
+ action: async (positionalPieces, typedLocalCarrier) => {
340
+ await this.performApplyOrPreviewSubtree(true, readOptionalPositionalArg(positionalPieces[0]), typedLocalCarrier);
341
+ }
342
+ },
343
+ {
344
+ name: "group",
345
+ description: "Try grouping on a pasted class string (stdout: cn(...) or tv array with --tv)",
346
+ route: [
347
+ {
348
+ kind: "greedyPositional",
349
+ argumentTemplate: "[tokens...]",
350
+ helpBlurb: "Class tokens (quote a single string if it contains spaces)"
351
+ },
352
+ {
353
+ kind: "booleanFlag",
354
+ flagPhrase: "--tv",
355
+ helpBlurb: "Emit tv()-style array instead of cn() call",
356
+ whenUnsetUses: false
357
+ },
358
+ {
359
+ kind: "synonymousBooleanAliases",
360
+ commaJoinedFlags: "--with-classname, --with-class-name",
361
+ helpBlurb: "Append className as final cn() argument"
362
+ },
363
+ {
364
+ kind: "booleanFlag",
365
+ flagPhrase: "--json",
366
+ helpBlurb: "Print one JSON object on stdout instead of plain lines",
367
+ whenUnsetUses: false
368
+ }
369
+ ],
370
+ action: async (positionalPieces, typedLocalCarrier) => {
371
+ const rawTokenSeries = positionalPieces[0];
372
+ const classTokenSeries = Array.isArray(rawTokenSeries) ? rawTokenSeries.filter((segment) => typeof segment === "string") : [];
373
+ await this.performGroupSubtree(classTokenSeries, typedLocalCarrier);
374
+ }
375
+ }
376
+ ]
377
+ };
266
378
  }
267
- async executeAnalyze(target, options) {
379
+ async performAnalyzeSubtree(targetSlice, optionCarrier) {
268
380
  const prelude = await this.prepareWorkspace.execute({
269
381
  currentWorkingDirectory: this.runtime.cwd(),
270
- rawTarget: target
382
+ rawTarget: targetSlice
271
383
  });
272
- if (!consumeCliAppError(this.logger, prelude)) return;
384
+ if (!this.cliExecutor.consumeCliAppError(prelude)) return;
273
385
  const { resolvedTarget } = prelude.value;
274
- const parsed = parseWithCliSchema(arrangeAnalyzeDirectoryRequestSchema, { analyzeRootPath: resolvedTarget });
275
- if (!consumeCliAppError(this.logger, parsed)) return;
386
+ const parsed = this.schemaValidation.parseWithSchema(arrangeAnalyzeDirectoryRequestSchema, { analyzeRootPath: resolvedTarget });
387
+ if (!this.cliExecutor.consumeCliAppError(parsed)) return;
276
388
  const outcome = this.analyzeDirectory.execute(parsed.value);
277
- if (!consumeCliAppError(this.logger, outcome)) return;
278
- if (options?.json) this.logger.out(formatArrangeAnalyzeJsonOutput(resolvedTarget, outcome.value));
389
+ if (!this.cliExecutor.consumeCliAppError(outcome)) return;
390
+ if (optionCarrier.jsonCandidate) this.logger.out(this.formatArrangeAnalyzeJsonOutput(resolvedTarget, outcome.value));
279
391
  else this.presentAnalyzeReport.present(resolvedTarget, outcome.value);
280
392
  }
281
- async executePreviewOrApply(write, target, opts) {
393
+ async performApplyOrPreviewSubtree(writeCandidate, targetSlice, typedLocalCarrier) {
282
394
  const prelude = await this.prepareWorkspace.execute({
283
395
  currentWorkingDirectory: this.runtime.cwd(),
284
- rawTarget: target
396
+ rawTarget: targetSlice
285
397
  });
286
- if (!consumeCliAppError(this.logger, prelude)) return;
398
+ if (!this.cliExecutor.consumeCliAppError(prelude)) return;
287
399
  const { resolvedTarget, rootDir, config } = prelude.value;
288
- const parsed = parseWithCliSchema(arrangeSyncRunRequestSchema, {
400
+ const parsed = this.schemaValidation.parseWithSchema(arrangeSyncRunRequestSchema, {
289
401
  rootDir,
290
402
  targetPath: resolvedTarget,
291
- write,
292
- withClassName: opts.withClassName,
293
- cnImport: opts.cnImport,
403
+ write: writeCandidate,
404
+ withClassName: typedLocalCarrier.withClassName,
405
+ cnImport: typedLocalCarrier.cnImport,
294
406
  config: config.arrange ?? {}
295
407
  });
296
- if (!consumeCliAppError(this.logger, parsed)) return;
408
+ if (!this.cliExecutor.consumeCliAppError(parsed)) return;
297
409
  const outcome = await this.runArrangeSync.execute(parsed.value);
298
- if (!consumeCliAppError(this.logger, outcome)) return;
299
- if (!write) for (const plan of outcome.value.previewPlans) this.groupFilePreview.printGroupFilePreviewFromWork(plan);
300
- if (opts.json) {
301
- this.logger.out(formatArrangeSyncJsonOutput(outcome.value, write));
302
- this.runtime.setExitCode(exitCodeForArrangeSyncResult(outcome.value));
303
- } else this.runtime.setExitCode(presentArrangeSyncResult(this.logger, outcome.value, write));
410
+ if (!this.cliExecutor.consumeCliAppError(outcome)) return;
411
+ if (!writeCandidate) for (const plan of outcome.value.previewPlans) this.presentGroupFilePreview.printGroupFilePreviewFromWork(plan);
412
+ if (typedLocalCarrier.json) {
413
+ this.logger.out(this.formatArrangeSyncJsonOutput(outcome.value, writeCandidate));
414
+ this.runtime.setExitCode(this.exitCodeForArrangeSyncResult(outcome.value));
415
+ } else {
416
+ this.presentArrangeSyncResult.present(outcome.value, writeCandidate);
417
+ this.runtime.setExitCode(this.exitCodeForArrangeSyncResult(outcome.value));
418
+ }
304
419
  }
305
- async executeGroup(tokens, opts) {
306
- const parsed = parseWithCliSchema(arrangeSuggestGroupsRequestSchema, {
307
- inlineClasses: tokens.join(" ").trim(),
308
- emitTvStyleArray: !!opts.tv,
309
- trailingClassName: !!opts.withClassName
420
+ async performGroupSubtree(classTokenSeries, typedLocalCarrier) {
421
+ const parsed = this.schemaValidation.parseWithSchema(arrangeSuggestGroupsRequestSchema, {
422
+ inlineClasses: classTokenSeries.join(" ").trim(),
423
+ emitTvStyleArray: !!typedLocalCarrier.tv,
424
+ trailingClassName: !!typedLocalCarrier.withClassName
310
425
  });
311
- if (!consumeCliAppError(this.logger, parsed)) return;
426
+ if (!this.cliExecutor.consumeCliAppError(parsed)) return;
312
427
  const output = this.suggestCnGroups.execute(parsed.value);
313
- if (opts.json) this.logger.out(formatArrangeGroupJsonOutput(output));
428
+ if (typedLocalCarrier.json) this.logger.out(this.formatArrangeGroupJsonOutput(output));
314
429
  else {
315
430
  this.logger.out(output.primaryLine);
316
431
  this.logger.out(output.bucketsCommentLine);
317
432
  }
318
433
  }
434
+ formatArrangeAnalyzeJsonOutput(analyzeRootPath, report) {
435
+ return JSON.stringify({
436
+ schemaVersion: 1,
437
+ analyzeRootPath,
438
+ report
439
+ });
440
+ }
441
+ formatArrangeSyncJsonOutput(result, write) {
442
+ const { previewPlans: _plans, ...serializableResult } = result;
443
+ return JSON.stringify({
444
+ schemaVersion: 1,
445
+ ok: result.hookError === null,
446
+ write,
447
+ result: serializableResult
448
+ });
449
+ }
450
+ formatArrangeGroupJsonOutput(output) {
451
+ return JSON.stringify({
452
+ schemaVersion: 1,
453
+ primaryLine: output.primaryLine,
454
+ bucketsCommentLine: output.bucketsCommentLine
455
+ });
456
+ }
457
+ exitCodeForArrangeSyncResult(result) {
458
+ return result.hookError !== null ? 1 : 0;
459
+ }
319
460
  static {
320
461
  _initClass();
321
462
  }
@@ -1,8 +1,8 @@
1
- import "../domain/constants.domain.mjs";
2
- import { CliLoggerToken } from "../../core/contracts/tokens.mjs";
1
+ import { CliLoggerPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
2
+ import "../../domain/constants.domain.mjs";
3
3
  import path from "node:path";
4
4
  import { inject, injectable } from "@codefast/di";
5
- //#region src/lib/arrange/presentation/arrange-analyze.presenter.ts
5
+ //#region src/domains/arrange/presentation/presenters/arrange-analyze.presenter.ts
6
6
  function toPrimitive(input, hint) {
7
7
  if (typeof input !== "object" || input === null) return input;
8
8
  var prim = input[Symbol.toPrimitive];
@@ -213,47 +213,40 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
213
213
  };
214
214
  }
215
215
  let _dec, _initClass;
216
- function printAnalyzeReport(analyzeRootDirectoryPath, analyzeReport, logger) {
217
- logger.out(`Path: ${path.resolve(analyzeRootDirectoryPath)}`);
218
- logger.out(`.ts/.tsx files: ${analyzeReport.files}`);
219
- logger.out(`cn(...) call sites: ${analyzeReport.cnCallExpressions}`);
220
- logger.out(`tv(...) call sites: ${analyzeReport.tvCallExpressions}`);
221
- logger.out(`\nLong cn(...) string literals (≥18 tokens — consider splitting arguments): ${analyzeReport.longCnStringLiterals.length}`);
222
- for (const findingEntry of analyzeReport.longCnStringLiterals.slice(0, 40)) logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
223
- if (analyzeReport.longCnStringLiterals.length > 40) logger.out(` … and ${analyzeReport.longCnStringLiterals.length - 40} more`);
224
- logger.out(`\nLong tv({...}) string literals in base/variants/… (≥18 tokens): ${analyzeReport.longTvStringLiterals.length}`);
225
- for (const findingEntry of analyzeReport.longTvStringLiterals.slice(0, 40)) logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
226
- if (analyzeReport.longTvStringLiterals.length > 40) logger.out(` … and ${analyzeReport.longTvStringLiterals.length - 40} more`);
227
- logger.out(`\nJSX className="..." or className={'...'} (static strings, ≥18 tokens): ${analyzeReport.longJsxClassNameLiterals.length}`);
228
- for (const findingEntry of analyzeReport.longJsxClassNameLiterals.slice(0, 40)) logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
229
- if (analyzeReport.longJsxClassNameLiterals.length > 40) logger.out(` … and ${analyzeReport.longJsxClassNameLiterals.length - 40} more`);
230
- logger.out(`\ncn(...) nested inside tv({...}) (prefer a string or array — preview/apply can rewrite): ${analyzeReport.cnInsideTvCalls.length}`);
231
- for (const findingEntry of analyzeReport.cnInsideTvCalls.slice(0, 40)) logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.argCount} args) ${findingEntry.preview}`);
232
- if (analyzeReport.cnInsideTvCalls.length > 40) logger.out(` … and ${analyzeReport.cnInsideTvCalls.length - 40} more`);
233
- }
234
- _dec = injectable([inject(CliLoggerToken)]);
235
- let _PresentAnalyzeReportPresenterImpl;
216
+ _dec = injectable([inject(CliLoggerPortToken)]);
217
+ let _PresentAnalyzeReportPresenter;
236
218
  (class {
237
219
  logger;
238
220
  static {
239
- ({c: [_PresentAnalyzeReportPresenterImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
221
+ ({c: [_PresentAnalyzeReportPresenter, _initClass]} = _apply_decs_2311(this, [_dec], []));
240
222
  }
241
223
  constructor(logger) {
242
224
  this.logger = logger;
243
225
  }
244
226
  present(resolvedTargetPath, report) {
245
- printAnalyzeReport(resolvedTargetPath, report, this.logger);
227
+ this.printAnalyzeReport(resolvedTargetPath, report);
228
+ }
229
+ printAnalyzeReport(analyzeRootDirectoryPath, analyzeReport) {
230
+ this.logger.out(`Path: ${path.resolve(analyzeRootDirectoryPath)}`);
231
+ this.logger.out(`.ts/.tsx files: ${analyzeReport.files}`);
232
+ this.logger.out(`cn(...) call sites: ${analyzeReport.cnCallExpressions}`);
233
+ this.logger.out(`tv(...) call sites: ${analyzeReport.tvCallExpressions}`);
234
+ this.logger.out(`\nLong cn(...) string literals (≥18 tokens — consider splitting arguments): ${analyzeReport.longCnStringLiterals.length}`);
235
+ for (const findingEntry of analyzeReport.longCnStringLiterals.slice(0, 40)) this.logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
236
+ if (analyzeReport.longCnStringLiterals.length > 40) this.logger.out(` … and ${analyzeReport.longCnStringLiterals.length - 40} more`);
237
+ this.logger.out(`\nLong tv({...}) string literals in base/variants/… (≥18 tokens): ${analyzeReport.longTvStringLiterals.length}`);
238
+ for (const findingEntry of analyzeReport.longTvStringLiterals.slice(0, 40)) this.logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
239
+ if (analyzeReport.longTvStringLiterals.length > 40) this.logger.out(` … and ${analyzeReport.longTvStringLiterals.length - 40} more`);
240
+ this.logger.out(`\nJSX className="..." or className={'...'} (static strings, ≥18 tokens): ${analyzeReport.longJsxClassNameLiterals.length}`);
241
+ for (const findingEntry of analyzeReport.longJsxClassNameLiterals.slice(0, 40)) this.logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
242
+ if (analyzeReport.longJsxClassNameLiterals.length > 40) this.logger.out(` … and ${analyzeReport.longJsxClassNameLiterals.length - 40} more`);
243
+ this.logger.out(`\ncn(...) nested inside tv({...}) (prefer a string or array — preview/apply can rewrite): ${analyzeReport.cnInsideTvCalls.length}`);
244
+ for (const findingEntry of analyzeReport.cnInsideTvCalls.slice(0, 40)) this.logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.argCount} args) ${findingEntry.preview}`);
245
+ if (analyzeReport.cnInsideTvCalls.length > 40) this.logger.out(` … and ${analyzeReport.cnInsideTvCalls.length - 40} more`);
246
246
  }
247
247
  static {
248
248
  _initClass();
249
249
  }
250
250
  });
251
- function formatArrangeAnalyzeJsonOutput(analyzeRootPath, report) {
252
- return JSON.stringify({
253
- schemaVersion: 1,
254
- analyzeRootPath,
255
- report
256
- });
257
- }
258
251
  //#endregion
259
- export { _PresentAnalyzeReportPresenterImpl as PresentAnalyzeReportPresenterImpl, formatArrangeAnalyzeJsonOutput };
252
+ export { _PresentAnalyzeReportPresenter as PresentAnalyzeReportPresenter };
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- //#region src/lib/arrange/presentation/arrange-cli.schema.ts
2
+ //#region src/domains/arrange/presentation/presenters/arrange-cli.schema.ts
3
3
  const arrangeAnalyzeDirectoryRequestSchema = z.object({ analyzeRootPath: z.string().min(1, "analyzeRootPath is required") });
4
4
  const arrangeSyncRunRequestSchema = z.object({
5
5
  rootDir: z.string().min(1),
@@ -1,7 +1,6 @@
1
- import { CliLoggerToken } from "../../core/contracts/tokens.mjs";
2
- import { presentTagSyncCliResult } from "./tag-sync.presenter.mjs";
1
+ import { CliLoggerPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
3
2
  import { inject, injectable } from "@codefast/di";
4
- //#region src/lib/tag/presentation/present-tag-sync-result.presenter.ts
3
+ //#region src/domains/arrange/presentation/presenters/arrange-sync.presenter.ts
5
4
  function toPrimitive(input, hint) {
6
5
  if (typeof input !== "object" || input === null) return input;
7
6
  var prim = input[Symbol.toPrimitive];
@@ -212,22 +211,26 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
212
211
  };
213
212
  }
214
213
  let _dec, _initClass;
215
- _dec = injectable([inject(CliLoggerToken)]);
216
- let _PresentTagSyncResultPresenterImpl;
214
+ _dec = injectable([inject(CliLoggerPortToken)]);
215
+ let _PresentArrangeSyncResultPresenter;
217
216
  (class {
218
217
  logger;
219
218
  static {
220
- ({c: [_PresentTagSyncResultPresenterImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
219
+ ({c: [_PresentArrangeSyncResultPresenter, _initClass]} = _apply_decs_2311(this, [_dec], []));
221
220
  }
222
221
  constructor(logger) {
223
222
  this.logger = logger;
224
223
  }
225
- present(result, rootDir) {
226
- return presentTagSyncCliResult(this.logger, result, rootDir);
224
+ present(result, write) {
225
+ this.logger.out(`\nTotal: ${result.filePaths.length} file(s), ${result.totalFound} site(s) (cn/tv/JSX className) to review.`);
226
+ if (write) this.logger.out(`Applied: ${result.totalChanged} site(s) updated.`);
227
+ else this.logger.out(`(Run "apply" to write changes, or "pnpm cli:arrange-apply" / "pnpm exec codefast arrange apply")`);
228
+ if (write ? result.totalChanged > 0 : result.totalFound > 0) this.logger.out("Note: class order may change across concern groups — smoke-test the UI if you rely on cascade order.");
229
+ if (result.hookError !== null) this.logger.err(result.hookError);
227
230
  }
228
231
  static {
229
232
  _initClass();
230
233
  }
231
234
  });
232
235
  //#endregion
233
- export { _PresentTagSyncResultPresenterImpl as PresentTagSyncResultPresenterImpl };
236
+ export { _PresentArrangeSyncResultPresenter as PresentArrangeSyncResultPresenter };
@@ -1,7 +1,7 @@
1
- import { CliLoggerToken } from "../../core/contracts/tokens.mjs";
2
- import { lineOf } from "../domain/ast/ast-helpers.helper.mjs";
1
+ import { CliLoggerPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
2
+ import { lineOf } from "../../domain/ast/ast-helpers.helper.mjs";
3
3
  import { inject, injectable } from "@codefast/di";
4
- //#region src/lib/arrange/presentation/group-file-preview.presenter.ts
4
+ //#region src/domains/arrange/presentation/presenters/group-file-preview.presenter.ts
5
5
  function toPrimitive(input, hint) {
6
6
  if (typeof input !== "object" || input === null) return input;
7
7
  var prim = input[Symbol.toPrimitive];
@@ -212,60 +212,60 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
212
212
  };
213
213
  }
214
214
  let _dec, _initClass;
215
- function printGroupFilePreview(logger, args) {
216
- const { filePath, reportTotal, cnInTvNoReplacement, cnInTvCalls, unwrapReplacementByCall, sourceText, domainSf, unwrapEdits, plannedGroupEdits } = args;
217
- let header = `\n── ${filePath} (${reportTotal} site(s)`;
218
- if (cnInTvNoReplacement > 0) header += `; plus ${cnInTvNoReplacement} cn() inside tv left unchanged (0 args)`;
219
- header += `) ──`;
220
- logger.out(header);
221
- for (const call of cnInTvCalls) {
222
- const replacement = unwrapReplacementByCall.get(call);
223
- if (replacement === void 0) {
224
- logger.out(` Line ${lineOf(domainSf, call)} [tv ⊃ cn]: cn(...) has no arguments — skipped`);
225
- continue;
226
- }
227
- const start = call.pos;
228
- const end = call.end;
229
- if (sourceText.slice(start, end) === replacement) continue;
230
- logger.out(` Line ${lineOf(domainSf, call)} [tv ⊃ cn → string/array]:`);
231
- logger.out(` ${replacement.split("\n").join("\n ")}`);
232
- }
233
- if (unwrapEdits.length > 0 && plannedGroupEdits.length > 0) logger.out(" ([cn] / [tv] / [JSX className] lines below reflect content after unwrap of cn inside tv.)");
234
- for (const plan of plannedGroupEdits) {
235
- logger.out(` Line ${lineOf(plan.lineSf, plan.reportNode)} [${plan.label}]:`);
236
- logger.out(` ${plan.replacement.split("\n").join("\n ")}`);
237
- logger.out(` // Buckets: ${JSON.stringify(plan.bucketSummary)}`);
238
- }
239
- }
240
- function printGroupFilePreviewFromWork(logger, work) {
241
- printGroupFilePreview(logger, {
242
- filePath: work.filePath,
243
- reportTotal: work.reportTotal,
244
- cnInTvNoReplacement: work.cnInTvNoReplacement,
245
- cnInTvCalls: work.cnInTvCalls,
246
- unwrapReplacementByCall: work.unwrapReplacementByCall,
247
- sourceText: work.sourceText,
248
- domainSf: work.domainSfForLineNumbers,
249
- unwrapEdits: work.unwrapEdits,
250
- plannedGroupEdits: work.plannedGroupEdits
251
- });
252
- }
253
- _dec = injectable([inject(CliLoggerToken)]);
254
- let _GroupFilePreviewPresenterAdapter;
215
+ _dec = injectable([inject(CliLoggerPortToken)]);
216
+ let _PresentGroupFilePreviewPresenter;
255
217
  (class {
256
218
  logger;
257
219
  static {
258
- ({c: [_GroupFilePreviewPresenterAdapter, _initClass]} = _apply_decs_2311(this, [_dec], []));
220
+ ({c: [_PresentGroupFilePreviewPresenter, _initClass]} = _apply_decs_2311(this, [_dec], []));
259
221
  }
260
222
  constructor(logger) {
261
223
  this.logger = logger;
262
224
  }
263
225
  printGroupFilePreviewFromWork(work) {
264
- printGroupFilePreviewFromWork(this.logger, work);
226
+ this.printGroupFilePreviewFromPlan(work);
227
+ }
228
+ printGroupFilePreviewFromPlan(work) {
229
+ this.printGroupFilePreviewBody({
230
+ filePath: work.filePath,
231
+ reportTotal: work.reportTotal,
232
+ cnInTvNoReplacement: work.cnInTvNoReplacement,
233
+ cnInTvCalls: work.cnInTvCalls,
234
+ unwrapReplacementByCall: work.unwrapReplacementByCall,
235
+ sourceText: work.sourceText,
236
+ domainSf: work.domainSfForLineNumbers,
237
+ unwrapEdits: work.unwrapEdits,
238
+ plannedGroupEdits: work.plannedGroupEdits
239
+ });
240
+ }
241
+ printGroupFilePreviewBody(args) {
242
+ const { filePath, reportTotal, cnInTvNoReplacement, cnInTvCalls, unwrapReplacementByCall, sourceText, domainSf, unwrapEdits, plannedGroupEdits } = args;
243
+ let header = `\n── ${filePath} (${reportTotal} site(s)`;
244
+ if (cnInTvNoReplacement > 0) header += `; plus ${cnInTvNoReplacement} cn() inside tv left unchanged (0 args)`;
245
+ header += `) ──`;
246
+ this.logger.out(header);
247
+ for (const call of cnInTvCalls) {
248
+ const replacement = unwrapReplacementByCall.get(call);
249
+ if (replacement === void 0) {
250
+ this.logger.out(` Line ${lineOf(domainSf, call)} [tv ⊃ cn]: cn(...) has no arguments — skipped`);
251
+ continue;
252
+ }
253
+ const start = call.pos;
254
+ const end = call.end;
255
+ if (sourceText.slice(start, end) === replacement) continue;
256
+ this.logger.out(` Line ${lineOf(domainSf, call)} [tv ⊃ cn → string/array]:`);
257
+ this.logger.out(` ${replacement.split("\n").join("\n ")}`);
258
+ }
259
+ if (unwrapEdits.length > 0 && plannedGroupEdits.length > 0) this.logger.out(" ([cn] / [tv] / [JSX className] lines below reflect content after unwrap of cn inside tv.)");
260
+ for (const plan of plannedGroupEdits) {
261
+ this.logger.out(` Line ${lineOf(plan.lineSf, plan.reportNode)} [${plan.label}]:`);
262
+ this.logger.out(` ${plan.replacement.split("\n").join("\n ")}`);
263
+ this.logger.out(` // Buckets: ${JSON.stringify(plan.bucketSummary)}`);
264
+ }
265
265
  }
266
266
  static {
267
267
  _initClass();
268
268
  }
269
269
  });
270
270
  //#endregion
271
- export { _GroupFilePreviewPresenterAdapter as GroupFilePreviewPresenterAdapter };
271
+ export { _PresentGroupFilePreviewPresenter as PresentGroupFilePreviewPresenter };
@@ -0,0 +1,7 @@
1
+ import { token } from "@codefast/di";
2
+ //#region src/domains/config/composition/tokens.ts
3
+ const CodefastConfigSchemaPortToken = token("CodefastConfigSchemaPort");
4
+ const ConfigLoaderPortToken = token("ConfigLoaderPort");
5
+ const ConfigWarningReporterPortToken = token("ConfigWarningReporterPort");
6
+ //#endregion
7
+ export { CodefastConfigSchemaPortToken, ConfigLoaderPortToken, ConfigWarningReporterPortToken };
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
- //#region src/lib/config/infrastructure/config-schema.adapter.ts
3
- const hookSchema = z.custom((value) => typeof value === "function", { message: "Expected a function" });
2
+ //#region src/domains/config/domain/codefast-config.schema.ts
3
+ const afterWriteHookSchema = z.custom((value) => typeof value === "function", { message: "Expected a function" });
4
4
  const mirrorConfigSchema = z.object({
5
5
  skipPackages: z.array(z.string()).optional(),
6
6
  pathTransformations: z.record(z.string(), z.object({ removePrefix: z.string().optional() }).strict()).optional(),
@@ -13,13 +13,13 @@ const mirrorConfigSchema = z.object({
13
13
  }).strict();
14
14
  const codefastTagConfigSchema = z.object({
15
15
  skipPackages: z.array(z.string()).optional(),
16
- onAfterWrite: hookSchema.optional()
16
+ onAfterWrite: afterWriteHookSchema.optional()
17
17
  }).strict();
18
- const codefastArrangeConfigSchema = z.object({ onAfterWrite: hookSchema.optional() }).strict();
19
- const codefastConfigSchema = z.object({
18
+ const codefastArrangeConfigSchema = z.object({ onAfterWrite: afterWriteHookSchema.optional() }).strict();
19
+ /** Root `codefast.config` Zod schema — single source of truth for both validation and TS types. */ const codefastConfigRootSchema = z.object({
20
20
  mirror: mirrorConfigSchema.optional(),
21
21
  tag: codefastTagConfigSchema.optional(),
22
22
  arrange: codefastArrangeConfigSchema.optional()
23
23
  }).strict();
24
24
  //#endregion
25
- export { codefastConfigSchema };
25
+ export { codefastArrangeConfigSchema, codefastConfigRootSchema, codefastTagConfigSchema, mirrorConfigSchema };