@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
package/README.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  A small developer CLI for maintenance tasks in a TypeScript monorepo — Tailwind class arranging, `package.json` `exports` mirroring, and `@since` JSDoc tagging.
4
4
 
5
+ [![CI](https://github.com/codefastlabs/codefast/actions/workflows/release.yml/badge.svg)](https://github.com/codefastlabs/codefast/actions/workflows/release.yml)
6
+ [![npm version](https://img.shields.io/npm/v/@codefast/cli.svg)](https://www.npmjs.com/package/@codefast/cli)
7
+ [![npm downloads](https://img.shields.io/npm/dm/@codefast/cli.svg)](https://www.npmjs.com/package/@codefast/cli)
8
+ [![license](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
+
5
10
  ---
6
11
 
7
12
  ## Table of Contents
@@ -9,7 +14,7 @@ A small developer CLI for maintenance tasks in a TypeScript monorepo — Tailwin
9
14
  - [Why @codefast/cli](#why-codefastcli)
10
15
  - [Requirements](#requirements)
11
16
  - [Installation](#installation)
12
- - [Quick start](#quick-start)
17
+ - [Quick Start](#quick-start)
13
18
  - [Global options](#global-options)
14
19
  - [Exit codes](#exit-codes)
15
20
  - [`arrange`](#arrange)
@@ -75,7 +80,7 @@ npx @codefast/cli --help
75
80
 
76
81
  ---
77
82
 
78
- ## Quick start
83
+ ## Quick Start
79
84
 
80
85
  ```bash
81
86
  # Analyze Tailwind classes in the nearest package
@@ -334,7 +339,7 @@ Contract:
334
339
 
335
340
  Adjacent buckets may be merged into a single string literal when declared _compatible_ (e.g. Layout + Sizing), which keeps `cn()` calls readable without flattening unrelated concerns.
336
341
 
337
- To change placement, edit `classifyBareUtility` in `src/lib/arrange/domain/tokenizer.util.ts` and add a matching case in `tokenizer.util.test.ts`.
342
+ To change placement, extend `classifyBareUtility` in `src/domains/arrange/domain/tailwind-token-classifier.domain-service.ts` (and cover the new rule with arrange tests if you introduce a new bucket).
338
343
 
339
344
  ---
340
345
 
@@ -0,0 +1,18 @@
1
+ import { ArrangeModule } from "../domains/arrange/arrange.module.mjs";
2
+ import { MirrorModule } from "../domains/mirror/mirror.module.mjs";
3
+ import { TagModule } from "../domains/tag/tag.module.mjs";
4
+ import { CLI_COMMAND_SLOT_NAME } from "../shell/contracts/cli-command-slots.mjs";
5
+ import { ArrangeCommand as _ArrangeCommand } from "../domains/arrange/presentation/cli/arrange.command.mjs";
6
+ import { MirrorCommand as _MirrorCommand } from "../domains/mirror/presentation/cli/mirror.command.mjs";
7
+ import { TagCommand as _TagCommand } from "../domains/tag/presentation/cli/tag.command.mjs";
8
+ import { CommandPortToken } from "../shell/composition/tokens.mjs";
9
+ import { Module } from "@codefast/di";
10
+ //#region src/bootstrap/cli-application.module.ts
11
+ /** Root module: domain wiring plus `CommandPortToken` slots (single place for command registration). */ const CliApplicationModule = Module.create("cli-application", (moduleBuilder) => {
12
+ moduleBuilder.import(ArrangeModule, MirrorModule, TagModule);
13
+ moduleBuilder.bind(CommandPortToken).to(_ArrangeCommand).whenNamed(CLI_COMMAND_SLOT_NAME.arrange).singleton();
14
+ moduleBuilder.bind(CommandPortToken).to(_MirrorCommand).whenNamed(CLI_COMMAND_SLOT_NAME.mirror).singleton();
15
+ moduleBuilder.bind(CommandPortToken).to(_TagCommand).whenNamed(CLI_COMMAND_SLOT_NAME.tag).singleton();
16
+ });
17
+ //#endregion
18
+ export { CliApplicationModule };
@@ -0,0 +1,14 @@
1
+ import { CommandPortToken } from "../shell/composition/tokens.mjs";
2
+ import { CliApplicationModule } from "./cli-application.module.mjs";
3
+ import { Container } from "@codefast/di";
4
+ //#region src/bootstrap/composition-root.ts
5
+ function createCliRuntimeContainer() {
6
+ const runtimeContainer = Container.create();
7
+ runtimeContainer.load(CliApplicationModule);
8
+ return runtimeContainer;
9
+ }
10
+ function resolveCliCommands(runtimeContainer) {
11
+ return [...runtimeContainer.resolveAll(CommandPortToken)].sort((left, right) => left.definition.name.localeCompare(right.definition.name));
12
+ }
13
+ //#endregion
14
+ export { createCliRuntimeContainer, resolveCliCommands };
@@ -0,0 +1,7 @@
1
+ import { CommanderCliHostAdapter } from "../shell/infrastructure/commander/commander-cli-host.adapter.mjs";
2
+ //#region src/bootstrap/register-cli-command-trees.ts
3
+ /** Composition root: attach declarative CLI trees from the container onto the Commander program. */ function registerCliCommandTreesOnProgram(programRoot, commands) {
4
+ CommanderCliHostAdapter.registerTrees(programRoot, commands.map((cliEntry) => cliEntry.definition));
5
+ }
6
+ //#endregion
7
+ export { registerCliCommandTreesOnProgram };
@@ -1,11 +1,11 @@
1
- import { ArrangeTargetScannerServiceToken, DomainSourceParserPortToken } from "../../contracts/tokens.mjs";
2
- import { CliFsToken } from "../../../core/contracts/tokens.mjs";
3
- import { AppError } from "../../../core/domain/errors.domain.mjs";
4
- import { err, ok } from "../../../core/domain/result.model.mjs";
5
- import { messageFromCaughtUnknown } from "../../../core/domain/caught-unknown-message.value-object.mjs";
6
- import { accumulateAnalyzeReportForSourceFile, createEmptyAnalyzeReport } from "../../domain/arrange-analyze.service.mjs";
1
+ import { ArrangeTargetScannerPortToken, DomainSourceParserPortToken } from "../../composition/tokens.mjs";
2
+ import { CliFilesystemPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
3
+ import { AppError } from "../../../../shell/domain/errors.domain.mjs";
4
+ import { err, ok } from "../../../../shell/domain/result.model.mjs";
5
+ import { messageFromCaughtUnknown } from "../../../../shell/domain/caught-unknown-message.value-object.mjs";
6
+ import { accumulateAnalyzeReportForSourceFile, createEmptyAnalyzeReport } from "../../domain/arrange-analyze.domain-service.mjs";
7
7
  import { inject, injectable } from "@codefast/di";
8
- //#region src/lib/arrange/application/use-cases/analyze-directory.use-case.ts
8
+ //#region src/domains/arrange/application/use-cases/analyze-directory.use-case.ts
9
9
  function toPrimitive(input, hint) {
10
10
  if (typeof input !== "object" || input === null) return input;
11
11
  var prim = input[Symbol.toPrimitive];
@@ -217,17 +217,17 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
217
217
  }
218
218
  let _dec, _initClass;
219
219
  _dec = injectable([
220
- inject(CliFsToken),
221
- inject(ArrangeTargetScannerServiceToken),
220
+ inject(CliFilesystemPortToken),
221
+ inject(ArrangeTargetScannerPortToken),
222
222
  inject(DomainSourceParserPortToken)
223
223
  ]);
224
- let _AnalyzeDirectoryUseCaseImpl;
224
+ let _AnalyzeDirectoryUseCase;
225
225
  (class {
226
226
  fs;
227
227
  targetScanner;
228
228
  domainSourceParser;
229
229
  static {
230
- ({c: [_AnalyzeDirectoryUseCaseImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
230
+ ({c: [_AnalyzeDirectoryUseCase, _initClass]} = _apply_decs_2311(this, [_dec], []));
231
231
  }
232
232
  constructor(fs, targetScanner, domainSourceParser) {
233
233
  this.fs = fs;
@@ -252,4 +252,4 @@ let _AnalyzeDirectoryUseCaseImpl;
252
252
  }
253
253
  });
254
254
  //#endregion
255
- export { _AnalyzeDirectoryUseCaseImpl as AnalyzeDirectoryUseCaseImpl };
255
+ export { _AnalyzeDirectoryUseCase as AnalyzeDirectoryUseCase };
@@ -1,11 +1,10 @@
1
- import { WorkspaceResolverPortToken } from "../../contracts/tokens.mjs";
2
- import { CliFsToken, LoadCodefastConfigUseCaseToken } from "../../../core/contracts/tokens.mjs";
3
- import { AppError } from "../../../core/domain/errors.domain.mjs";
4
- import { err, ok } from "../../../core/domain/result.model.mjs";
5
- import { messageFromCaughtUnknown } from "../../../core/domain/caught-unknown-message.value-object.mjs";
6
- import { resolveArrangeTargetPath } from "../services/arrange-target-path-resolver.service.mjs";
1
+ import { ArrangeTargetPathResolverPortToken } from "../../composition/tokens.mjs";
2
+ import { CliFilesystemPortToken, LoadCodefastConfigUseCaseToken, RepoRootResolverPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
3
+ import { AppError } from "../../../../shell/domain/errors.domain.mjs";
4
+ import { err, ok } from "../../../../shell/domain/result.model.mjs";
5
+ import { messageFromCaughtUnknown } from "../../../../shell/domain/caught-unknown-message.value-object.mjs";
7
6
  import { inject, injectable } from "@codefast/di";
8
- //#region src/lib/arrange/application/use-cases/prepare-arrange-workspace.use-case.ts
7
+ //#region src/domains/arrange/application/use-cases/prepare-arrange-workspace.use-case.ts
9
8
  function toPrimitive(input, hint) {
10
9
  if (typeof input !== "object" || input === null) return input;
11
10
  var prim = input[Symbol.toPrimitive];
@@ -217,33 +216,35 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
217
216
  }
218
217
  let _dec, _initClass;
219
218
  _dec = injectable([
220
- inject(CliFsToken),
219
+ inject(ArrangeTargetPathResolverPortToken),
220
+ inject(CliFilesystemPortToken),
221
221
  inject(LoadCodefastConfigUseCaseToken),
222
- inject(WorkspaceResolverPortToken)
222
+ inject(RepoRootResolverPortToken)
223
223
  ]);
224
- let _PrepareArrangeWorkspaceUseCaseImpl;
224
+ let _PrepareArrangeWorkspaceUseCase;
225
225
  (class {
226
+ arrangeTargetPathResolver;
226
227
  fs;
227
228
  loadCodefastConfig;
228
- workspaceResolver;
229
+ repoRootResolver;
229
230
  static {
230
- ({c: [_PrepareArrangeWorkspaceUseCaseImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
231
+ ({c: [_PrepareArrangeWorkspaceUseCase, _initClass]} = _apply_decs_2311(this, [_dec], []));
231
232
  }
232
- constructor(fs, loadCodefastConfig, workspaceResolver) {
233
+ constructor(arrangeTargetPathResolver, fs, loadCodefastConfig, repoRootResolver) {
234
+ this.arrangeTargetPathResolver = arrangeTargetPathResolver;
233
235
  this.fs = fs;
234
236
  this.loadCodefastConfig = loadCodefastConfig;
235
- this.workspaceResolver = workspaceResolver;
237
+ this.repoRootResolver = repoRootResolver;
236
238
  }
237
239
  async execute(args) {
238
- const resolvedTarget = resolveArrangeTargetPath({
239
- fs: this.fs,
240
+ const resolvedTarget = this.arrangeTargetPathResolver.resolveTargetPath({
240
241
  currentWorkingDirectory: args.currentWorkingDirectory,
241
242
  rawTarget: args.rawTarget
242
243
  });
243
244
  if (!this.fs.existsSync(resolvedTarget)) return err(new AppError("NOT_FOUND", `Not found: ${resolvedTarget}`));
244
245
  let rootDir;
245
246
  try {
246
- rootDir = this.workspaceResolver.findRepoRoot(args.currentWorkingDirectory);
247
+ rootDir = this.repoRootResolver.findRepoRoot(args.currentWorkingDirectory);
247
248
  } catch (caughtError) {
248
249
  return err(new AppError("INFRA_FAILURE", messageFromCaughtUnknown(caughtError), caughtError));
249
250
  }
@@ -260,4 +261,4 @@ let _PrepareArrangeWorkspaceUseCaseImpl;
260
261
  }
261
262
  });
262
263
  //#endregion
263
- export { _PrepareArrangeWorkspaceUseCaseImpl as PrepareArrangeWorkspaceUseCaseImpl };
264
+ export { _PrepareArrangeWorkspaceUseCase as PrepareArrangeWorkspaceUseCase };
@@ -1,8 +1,8 @@
1
- import { ArrangeFileProcessorServiceToken, ArrangeTargetScannerServiceToken } from "../../contracts/tokens.mjs";
2
- import { ok } from "../../../core/domain/result.model.mjs";
3
- import { messageFromCaughtUnknown } from "../../../core/domain/caught-unknown-message.value-object.mjs";
1
+ import { ArrangeFileProcessorPortToken, ArrangeTargetScannerPortToken } from "../../composition/tokens.mjs";
2
+ import { ok } from "../../../../shell/domain/result.model.mjs";
3
+ import { messageFromCaughtUnknown } from "../../../../shell/domain/caught-unknown-message.value-object.mjs";
4
4
  import { inject, injectable } from "@codefast/di";
5
- //#region src/lib/arrange/application/use-cases/run-arrange-sync.use-case.ts
5
+ //#region src/domains/arrange/application/use-cases/run-arrange-sync.use-case.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,27 +213,27 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
213
213
  };
214
214
  }
215
215
  let _dec, _initClass;
216
- async function runOnAfterWriteHook(hook, modifiedFiles) {
217
- if (!hook || modifiedFiles.length === 0) return null;
218
- try {
219
- await hook({ files: modifiedFiles });
220
- return null;
221
- } catch (caughtHookError) {
222
- return `[arrange] onAfterWrite hook failed: ${messageFromCaughtUnknown(caughtHookError)}`;
223
- }
224
- }
225
- _dec = injectable([inject(ArrangeTargetScannerServiceToken), inject(ArrangeFileProcessorServiceToken)]);
226
- let _RunArrangeSyncUseCaseImpl;
216
+ _dec = injectable([inject(ArrangeTargetScannerPortToken), inject(ArrangeFileProcessorPortToken)]);
217
+ let _RunArrangeSyncUseCase;
227
218
  (class {
228
219
  targetScanner;
229
220
  fileProcessor;
230
221
  static {
231
- ({c: [_RunArrangeSyncUseCaseImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
222
+ ({c: [_RunArrangeSyncUseCase, _initClass]} = _apply_decs_2311(this, [_dec], []));
232
223
  }
233
224
  constructor(targetScanner, fileProcessor) {
234
225
  this.targetScanner = targetScanner;
235
226
  this.fileProcessor = fileProcessor;
236
227
  }
228
+ async runOnAfterWriteHook(hook, modifiedFiles) {
229
+ if (!hook || modifiedFiles.length === 0) return null;
230
+ try {
231
+ await hook({ files: modifiedFiles });
232
+ return null;
233
+ } catch (caughtHookError) {
234
+ return `[arrange] onAfterWrite hook failed: ${messageFromCaughtUnknown(caughtHookError)}`;
235
+ }
236
+ }
237
237
  async execute(request) {
238
238
  const filePaths = this.targetScanner.scanTarget({ targetPath: request.targetPath });
239
239
  const modifiedFiles = [];
@@ -256,7 +256,7 @@ let _RunArrangeSyncUseCaseImpl;
256
256
  if (fileProcessResult.workPlan) previewPlans.push(fileProcessResult.workPlan);
257
257
  }
258
258
  const arrangeConfig = request.config;
259
- const hookError = request.write && modifiedFiles.length > 0 ? await runOnAfterWriteHook(arrangeConfig?.onAfterWrite, modifiedFiles) : null;
259
+ const hookError = request.write && modifiedFiles.length > 0 ? await this.runOnAfterWriteHook(arrangeConfig?.onAfterWrite, modifiedFiles) : null;
260
260
  return ok({
261
261
  filePaths,
262
262
  modifiedFiles,
@@ -271,4 +271,4 @@ let _RunArrangeSyncUseCaseImpl;
271
271
  }
272
272
  });
273
273
  //#endregion
274
- export { _RunArrangeSyncUseCaseImpl as RunArrangeSyncUseCaseImpl };
274
+ export { _RunArrangeSyncUseCase as RunArrangeSyncUseCase };
@@ -1,7 +1,7 @@
1
- import { TailwindGroupingServiceToken } from "../../contracts/tokens.mjs";
1
+ import { TailwindGroupingServiceToken } from "../../composition/tokens.mjs";
2
2
  import { formatArray, formatCnCall } from "../../domain/source-text-formatters.formatter.mjs";
3
3
  import { inject, injectable } from "@codefast/di";
4
- //#region src/lib/arrange/application/use-cases/suggest-cn-groups.use-case.ts
4
+ //#region src/domains/arrange/application/use-cases/suggest-cn-groups.use-case.ts
5
5
  function toPrimitive(input, hint) {
6
6
  if (typeof input !== "object" || input === null) return input;
7
7
  var prim = input[Symbol.toPrimitive];
@@ -213,11 +213,11 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
213
213
  }
214
214
  let _dec, _initClass;
215
215
  _dec = injectable([inject(TailwindGroupingServiceToken)]);
216
- let _SuggestCnGroupsUseCaseImpl;
216
+ let _SuggestCnGroupsUseCase;
217
217
  (class {
218
218
  grouping;
219
219
  static {
220
- ({c: [_SuggestCnGroupsUseCaseImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
220
+ ({c: [_SuggestCnGroupsUseCase, _initClass]} = _apply_decs_2311(this, [_dec], []));
221
221
  }
222
222
  constructor(grouping) {
223
223
  this.grouping = grouping;
@@ -234,4 +234,4 @@ let _SuggestCnGroupsUseCaseImpl;
234
234
  }
235
235
  });
236
236
  //#endregion
237
- export { _SuggestCnGroupsUseCaseImpl as SuggestCnGroupsUseCaseImpl };
237
+ export { _SuggestCnGroupsUseCase as SuggestCnGroupsUseCase };
@@ -0,0 +1,38 @@
1
+ import { AnalyzeDirectoryUseCaseToken, ArrangeFileProcessorPortToken, ArrangeTargetPathResolverPortToken, ArrangeTargetScannerPortToken, DomainSourceParserPortToken, FileWalkerPortToken, PrepareArrangeWorkspaceUseCaseToken, PresentAnalyzeReportPresenterToken, PresentArrangeSyncResultPresenterToken, PresentGroupFilePreviewPresenterToken, RunArrangeSyncUseCaseToken, SuggestCnGroupsUseCaseToken, TailwindGroupingServiceToken } from "./composition/tokens.mjs";
2
+ import { ArrangeFileProcessorAdapter as _ArrangeFileProcessorAdapter } from "./infrastructure/adapters/arrange-file-processor.adapter.mjs";
3
+ import { ArrangeTargetPathResolverAdapter as _ArrangeTargetPathResolverAdapter } from "./infrastructure/adapters/arrange-target-path-resolver.adapter.mjs";
4
+ import { ArrangeTargetScannerAdapter as _ArrangeTargetScannerAdapter } from "./infrastructure/adapters/arrange-target-scanner.adapter.mjs";
5
+ import { AnalyzeDirectoryUseCase as _AnalyzeDirectoryUseCase } from "./application/use-cases/analyze-directory.use-case.mjs";
6
+ import { PrepareArrangeWorkspaceUseCase as _PrepareArrangeWorkspaceUseCase } from "./application/use-cases/prepare-arrange-workspace.use-case.mjs";
7
+ import { RunArrangeSyncUseCase as _RunArrangeSyncUseCase } from "./application/use-cases/run-arrange-sync.use-case.mjs";
8
+ import { SuggestCnGroupsUseCase as _SuggestCnGroupsUseCase } from "./application/use-cases/suggest-cn-groups.use-case.mjs";
9
+ import { TypeScriptAstTranslator as _TypeScriptAstTranslator } from "./infrastructure/typescript-ast-translator.mjs";
10
+ import { DomainSourceParserAdapter as _DomainSourceParserAdapter } from "./infrastructure/adapters/domain-source-parser.adapter.mjs";
11
+ import { FileWalkerAdapter as _FileWalkerAdapter } from "./infrastructure/adapters/file-walker.adapter.mjs";
12
+ import { TailwindGroupingDomainService as _TailwindGroupingDomainService } from "./domain/tailwind-grouping.domain-service.mjs";
13
+ import { PresentAnalyzeReportPresenter as _PresentAnalyzeReportPresenter } from "./presentation/presenters/arrange-analyze.presenter.mjs";
14
+ import { PresentGroupFilePreviewPresenter as _PresentGroupFilePreviewPresenter } from "./presentation/presenters/group-file-preview.presenter.mjs";
15
+ import { PresentArrangeSyncResultPresenter as _PresentArrangeSyncResultPresenter } from "./presentation/presenters/arrange-sync.presenter.mjs";
16
+ import { createOptionalCliPortTelemetryActivation } from "../../shell/wiring/optional-cli-port-telemetry-activation.mjs";
17
+ import { ShellInfrastructureModule } from "../../shell/shell.module.mjs";
18
+ import { Module } from "@codefast/di";
19
+ //#region src/domains/arrange/arrange.module.ts
20
+ const ArrangeModule = Module.create("cli-arrange", (moduleBuilder) => {
21
+ moduleBuilder.import(ShellInfrastructureModule);
22
+ moduleBuilder.bind(FileWalkerPortToken).to(_FileWalkerAdapter).singleton().onActivation(createOptionalCliPortTelemetryActivation(FileWalkerPortToken));
23
+ moduleBuilder.bind(_TypeScriptAstTranslator).toSelf().singleton().onActivation(createOptionalCliPortTelemetryActivation(_TypeScriptAstTranslator));
24
+ moduleBuilder.bind(DomainSourceParserPortToken).to(_DomainSourceParserAdapter).singleton().onActivation(createOptionalCliPortTelemetryActivation(DomainSourceParserPortToken));
25
+ moduleBuilder.bind(ArrangeTargetPathResolverPortToken).to(_ArrangeTargetPathResolverAdapter).singleton();
26
+ moduleBuilder.bind(TailwindGroupingServiceToken).to(_TailwindGroupingDomainService).singleton();
27
+ moduleBuilder.bind(AnalyzeDirectoryUseCaseToken).to(_AnalyzeDirectoryUseCase).singleton();
28
+ moduleBuilder.bind(ArrangeTargetScannerPortToken).to(_ArrangeTargetScannerAdapter).singleton();
29
+ moduleBuilder.bind(ArrangeFileProcessorPortToken).to(_ArrangeFileProcessorAdapter).singleton();
30
+ moduleBuilder.bind(RunArrangeSyncUseCaseToken).to(_RunArrangeSyncUseCase).singleton();
31
+ moduleBuilder.bind(SuggestCnGroupsUseCaseToken).to(_SuggestCnGroupsUseCase).singleton();
32
+ moduleBuilder.bind(PrepareArrangeWorkspaceUseCaseToken).to(_PrepareArrangeWorkspaceUseCase).singleton();
33
+ moduleBuilder.bind(PresentAnalyzeReportPresenterToken).to(_PresentAnalyzeReportPresenter).singleton();
34
+ moduleBuilder.bind(PresentGroupFilePreviewPresenterToken).to(_PresentGroupFilePreviewPresenter).singleton();
35
+ moduleBuilder.bind(PresentArrangeSyncResultPresenterToken).to(_PresentArrangeSyncResultPresenter).singleton();
36
+ });
37
+ //#endregion
38
+ export { ArrangeModule };
@@ -0,0 +1,17 @@
1
+ import { token } from "@codefast/di";
2
+ //#region src/domains/arrange/composition/tokens.ts
3
+ const FileWalkerPortToken = token("FileWalkerPort");
4
+ const DomainSourceParserPortToken = token("DomainSourceParserPort");
5
+ const PresentGroupFilePreviewPresenterToken = token("PresentGroupFilePreviewPresenter");
6
+ const PresentAnalyzeReportPresenterToken = token("PresentAnalyzeReportPresenter");
7
+ const PresentArrangeSyncResultPresenterToken = token("PresentArrangeSyncResultPresenter");
8
+ const ArrangeTargetScannerPortToken = token("ArrangeTargetScannerPort");
9
+ const ArrangeFileProcessorPortToken = token("ArrangeFileProcessorPort");
10
+ const AnalyzeDirectoryUseCaseToken = token("AnalyzeDirectoryUseCase");
11
+ const ArrangeTargetPathResolverPortToken = token("ArrangeTargetPathResolverPort");
12
+ const RunArrangeSyncUseCaseToken = token("RunArrangeSyncUseCase");
13
+ const SuggestCnGroupsUseCaseToken = token("SuggestCnGroupsUseCase");
14
+ const PrepareArrangeWorkspaceUseCaseToken = token("PrepareArrangeWorkspaceUseCase");
15
+ const TailwindGroupingServiceToken = token("TailwindGroupingService");
16
+ //#endregion
17
+ export { AnalyzeDirectoryUseCaseToken, ArrangeFileProcessorPortToken, ArrangeTargetPathResolverPortToken, ArrangeTargetScannerPortToken, DomainSourceParserPortToken, FileWalkerPortToken, PrepareArrangeWorkspaceUseCaseToken, PresentAnalyzeReportPresenterToken, PresentArrangeSyncResultPresenterToken, PresentGroupFilePreviewPresenterToken, RunArrangeSyncUseCaseToken, SuggestCnGroupsUseCaseToken, TailwindGroupingServiceToken };
@@ -5,7 +5,7 @@ import { forEachStringLiteralInClassExpression } from "./ast/collectors-cn.colle
5
5
  import { tokenizeClassString } from "./tailwind-token.value-object.mjs";
6
6
  import { collectCnCallsInsideTv, traverseTvObject } from "./ast/collectors-tv.collector.mjs";
7
7
  import { jsxClassNameStaticLiteral } from "./ast/collectors-jsx.collector.mjs";
8
- //#region src/lib/arrange/domain/arrange-analyze.service.ts
8
+ //#region src/domains/arrange/domain/arrange-analyze.domain-service.ts
9
9
  /**
10
10
  * Rich domain: Tailwind/cn/tv analysis rules (counts, long literals, nested cn in tv).
11
11
  * Pure orchestration of domain collectors and invariants — no I/O.
@@ -1,8 +1,8 @@
1
- import { applyEditsDescending } from "../../shared/source-code/domain/text-edit.model.mjs";
1
+ import { applyEditsDescending } from "../../../shell/domain/source-text-edit.support.mjs";
2
2
  import { buildKnownCnTvBindings, unwrapCnInsideTvCallReplacement } from "./ast/ast-helpers.helper.mjs";
3
3
  import { listAllCnCallsInsideTvInSourceFile } from "./ast/collectors-tv.collector.mjs";
4
4
  import { collectGroupTargets, planGroupEditForTarget, targetReplaceStart } from "./ast/targets.model.mjs";
5
- //#region src/lib/arrange/domain/arrange-grouping.service.ts
5
+ //#region src/domains/arrange/domain/arrange-grouping.domain-service.ts
6
6
  /**
7
7
  * Rich domain: plan Tailwind class grouping / cn-in-tv unwrap for a single file.
8
8
  * Pure: only DomainSourceFile, source strings, and options — no I/O.
@@ -1,7 +1,7 @@
1
1
  import { EMPTY_CN_TV_BINDINGS } from "../constants.domain.mjs";
2
- import { applyEditsDescending, indentOfLineContaining } from "../../../shared/source-code/domain/text-edit.model.mjs";
2
+ import { applyEditsDescending, indentOfLineContaining } from "../../../../shell/domain/source-text-edit.support.mjs";
3
3
  import { isDomainIdentifier, isDomainImportDeclaration, isDomainNamedImports, isDomainNamespaceImport, isDomainPropertyAccessExpression, isDomainStringLiteral, lineOfSourcePosition } from "./ast-node.model.mjs";
4
- //#region src/lib/arrange/domain/ast/ast-helpers.helper.ts
4
+ //#region src/domains/arrange/domain/ast/ast-helpers.helper.ts
5
5
  /**
6
6
  * Known module specifiers that export `cn` / `tv`.
7
7
  */ const KNOWN_CN_TV_MODULES = new Set([
@@ -1,4 +1,4 @@
1
- //#region src/lib/arrange/domain/ast/ast-node.model.ts
1
+ //#region src/domains/arrange/domain/ast/ast-node.model.ts
2
2
  /**
3
3
  * Pure-domain AST shapes for arrange analysis. No TypeScript compiler types.
4
4
  * Positions mirror `getStart(sourceFile)` / `getEnd()` semantics from translation.
@@ -1,6 +1,6 @@
1
1
  import "../constants.domain.mjs";
2
2
  import { DomainBinaryOperator, DomainSyntaxKind, isDomainArrayLiteralExpression, isDomainTailwindClassLiteral } from "./ast-node.model.mjs";
3
- //#region src/lib/arrange/domain/ast/collectors-cn.collector.ts
3
+ //#region src/domains/arrange/domain/ast/collectors-cn.collector.ts
4
4
  function forEachStringLiteralInClassExpression(expr, sink, depth = 0, options) {
5
5
  if (depth > 12) return;
6
6
  if (isDomainTailwindClassLiteral(expr)) {
@@ -1,5 +1,5 @@
1
1
  import { isDomainIdentifier, isDomainJsxExpression, isDomainTailwindClassLiteral } from "./ast-node.model.mjs";
2
- //#region src/lib/arrange/domain/ast/collectors-jsx.collector.ts
2
+ //#region src/domains/arrange/domain/ast/collectors-jsx.collector.ts
3
3
  function jsxClassNameStaticLiteral(jsxClassNameAttribute) {
4
4
  if (!isDomainIdentifier(jsxClassNameAttribute.name) || jsxClassNameAttribute.name.text !== "className") return;
5
5
  const init = jsxClassNameAttribute.initializer;
@@ -3,7 +3,7 @@ import { forEachDomainChild, isDomainArrayLiteralExpression, isDomainCallExpress
3
3
  import { buildKnownCnTvBindings, isCnOrTvIdentifier, propertyAssignmentNameText } from "./ast-helpers.helper.mjs";
4
4
  import { CN_APPLY_LITERAL_WALK_OPTS, collectUnconditionalTailwindLiteralsFromCnArguments, forEachStringLiteralInClassExpression, isUnsafeLiteralForCnStyleApplySplit } from "./collectors-cn.collector.mjs";
5
5
  import { tokenizeClassString } from "../tailwind-token.value-object.mjs";
6
- //#region src/lib/arrange/domain/ast/collectors-tv.collector.ts
6
+ //#region src/domains/arrange/domain/ast/collectors-tv.collector.ts
7
7
  function traverseTvObject(sourceFile, obj, visitor, depth = 0, knownBindings) {
8
8
  if (depth > 12) return;
9
9
  for (const prop of obj.properties) {
@@ -1,5 +1,5 @@
1
1
  import "../constants.domain.mjs";
2
- import { endAfterOptionalCommaFollowingInSource, indentOfLineContaining, textPrefixFromLineStartToPosition } from "../../../shared/source-code/domain/text-edit.model.mjs";
2
+ import { endAfterOptionalCommaFollowingInSource, indentOfLineContaining, textPrefixFromLineStartToPosition } from "../../../../shell/domain/source-text-edit.support.mjs";
3
3
  import { forEachDomainChild, isDomainArrayLiteralExpression, isDomainJsxAttribute, isDomainTailwindClassLiteral } from "./ast-node.model.mjs";
4
4
  import { isUnsafeLiteralForCnStyleApplySplit } from "./collectors-cn.collector.mjs";
5
5
  import { tokenizeClassString } from "../tailwind-token.value-object.mjs";
@@ -7,7 +7,7 @@ import { collectGroupableStringNodes, slotClassString } from "./collectors-tv.co
7
7
  import { areCnTailwindPartitionsEquivalent, suggestCnGroups, summarizeGroupBucketLabels } from "../grouping.domain.mjs";
8
8
  import { escapeTsStringLiteralContent, formatArray, formatArrayElementsAsSiblingLines, formatJsxCnAttributeValue } from "../source-text-formatters.formatter.mjs";
9
9
  import { jsxClassNameStaticLiteral } from "./collectors-jsx.collector.mjs";
10
- //#region src/lib/arrange/domain/ast/targets.model.ts
10
+ //#region src/domains/arrange/domain/ast/targets.model.ts
11
11
  function targetReplaceStart(target) {
12
12
  if (target.kind === "cnArg") return target.item.cnCall ? target.item.cnCall.pos : target.item.primaryClassLiteral.pos;
13
13
  return target.valueNode.pos;
@@ -1,4 +1,4 @@
1
- //#region src/lib/arrange/domain/constants.domain.ts
1
+ //#region src/domains/arrange/domain/constants.domain.ts
2
2
  /**
3
3
  * Analyze report: long literal threshold (token count).
4
4
  */ const LONG_STRING_TOKEN_THRESHOLD = 18;
@@ -1,7 +1,7 @@
1
1
  import { BUCKET_ORDER } from "./constants.domain.mjs";
2
2
  import { stripVariants, tokenizeClassString } from "./tailwind-token.value-object.mjs";
3
3
  import { bucketsCompatible, bucketsMergeCompatible, classifyToken, compositeSecondaryOrder, selectorKey, stateKey } from "./tailwind-token-classifier.domain-service.mjs";
4
- //#region src/lib/arrange/domain/grouping.domain.ts
4
+ //#region src/domains/arrange/domain/grouping.domain.ts
5
5
  /**
6
6
  * `cn()` grouping: bucket sequence is {@link BUCKET_ORDER} only; tokens are classified with
7
7
  * {@link classifyToken}. Comparators here (`compareClassifiedTailwindTokensForCnGrouping`, …)
@@ -1,5 +1,5 @@
1
1
  import { isDomainImportDeclaration, isDomainNamedImports, isDomainStringLiteral } from "./ast/ast-node.model.mjs";
2
- //#region src/lib/arrange/domain/imports.domain.ts
2
+ //#region src/domains/arrange/domain/imports.domain.ts
3
3
  function sourceFileImportsCn(sourceFile) {
4
4
  for (const statement of sourceFile.statements) {
5
5
  if (!isDomainImportDeclaration(statement) || !statement.importClause) continue;
@@ -1,5 +1,5 @@
1
- import { indentOfLineContaining } from "../../shared/source-code/domain/text-edit.model.mjs";
2
- //#region src/lib/arrange/domain/source-text-formatters.formatter.ts
1
+ import { indentOfLineContaining } from "../../../shell/domain/source-text-edit.support.mjs";
2
+ //#region src/domains/arrange/domain/source-text-formatters.formatter.ts
3
3
  function escapeTsStringLiteralContent(group) {
4
4
  return group.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"");
5
5
  }
@@ -1,6 +1,6 @@
1
1
  import { suggestCnGroups, summarizeGroupBucketLabels } from "./grouping.domain.mjs";
2
2
  import { injectable } from "@codefast/di";
3
- //#region src/lib/arrange/domain/tailwind-grouping.service.ts
3
+ //#region src/domains/arrange/domain/tailwind-grouping.domain-service.ts
4
4
  function toPrimitive(input, hint) {
5
5
  if (typeof input !== "object" || input === null) return input;
6
6
  var prim = input[Symbol.toPrimitive];
@@ -211,11 +211,11 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
211
211
  };
212
212
  }
213
213
  let _dec, _initClass;
214
- _dec = injectable([]);
215
- let _TailwindGroupingServiceImpl;
214
+ _dec = injectable();
215
+ let _TailwindGroupingDomainService;
216
216
  (class {
217
217
  static {
218
- ({c: [_TailwindGroupingServiceImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
218
+ ({c: [_TailwindGroupingDomainService, _initClass]} = _apply_decs_2311(this, [_dec], []));
219
219
  }
220
220
  suggestGroups(classString) {
221
221
  return suggestCnGroups(classString);
@@ -228,4 +228,4 @@ let _TailwindGroupingServiceImpl;
228
228
  }
229
229
  });
230
230
  //#endregion
231
- export { _TailwindGroupingServiceImpl as TailwindGroupingServiceImpl };
231
+ export { _TailwindGroupingDomainService as TailwindGroupingDomainService };
@@ -1,6 +1,6 @@
1
1
  import { COMPATIBLE_BUCKET_SETS, RESPONSIVE_PREFIX, STATE_PREFIXES } from "./constants.domain.mjs";
2
2
  import { indexOfFirstVariantColon, stripVariants } from "./tailwind-token.value-object.mjs";
3
- //#region src/lib/arrange/domain/tailwind-token-classifier.domain-service.ts
3
+ //#region src/domains/arrange/domain/tailwind-token-classifier.domain-service.ts
4
4
  /**
5
5
  * Bare-token classification is **total** (always returns a {@link Bucket}). The `Result` pattern
6
6
  * (`isOk` / `isErr`) belongs at arrange use-case / I/O boundaries, not on this hot path.
@@ -1,5 +1,5 @@
1
1
  import "./constants.domain.mjs";
2
- //#region src/lib/arrange/domain/tailwind-token.value-object.ts
2
+ //#region src/domains/arrange/domain/tailwind-token.value-object.ts
3
3
  function tokenizeClassString(classString) {
4
4
  return classString.trim().split(/\s+/).filter(Boolean);
5
5
  }
@@ -1,9 +1,9 @@
1
- import { DomainSourceParserPortToken } from "../../contracts/tokens.mjs";
2
- import { CliFsToken } from "../../../core/contracts/tokens.mjs";
3
- import { buildGroupFileUnwrapState, countPersistedGroupFileEdits, groupFileDryRunNoEdits, groupFileEditsTouchJsxCn, groupFilePreviewTotals, groupFileWorkHasNothingToReport, mergeGroupFileBodyText, tryBuildGroupFileWorkPlan } from "../../domain/arrange-grouping.service.mjs";
1
+ import { DomainSourceParserPortToken } from "../../composition/tokens.mjs";
2
+ import { CliFilesystemPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
3
+ import { buildGroupFileUnwrapState, countPersistedGroupFileEdits, groupFileDryRunNoEdits, groupFileEditsTouchJsxCn, groupFilePreviewTotals, groupFileWorkHasNothingToReport, mergeGroupFileBodyText, tryBuildGroupFileWorkPlan } from "../../domain/arrange-grouping.domain-service.mjs";
4
4
  import { ensureCnImport } from "../../domain/imports.domain.mjs";
5
5
  import { inject, injectable } from "@codefast/di";
6
- //#region src/lib/arrange/application/services/arrange-file-processor.service.ts
6
+ //#region src/domains/arrange/infrastructure/adapters/arrange-file-processor.adapter.ts
7
7
  function toPrimitive(input, hint) {
8
8
  if (typeof input !== "object" || input === null) return input;
9
9
  var prim = input[Symbol.toPrimitive];
@@ -214,13 +214,13 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
214
214
  };
215
215
  }
216
216
  let _dec, _initClass;
217
- _dec = injectable([inject(CliFsToken), inject(DomainSourceParserPortToken)]);
218
- let _ArrangeFileProcessorServiceImpl;
217
+ _dec = injectable([inject(CliFilesystemPortToken), inject(DomainSourceParserPortToken)]);
218
+ let _ArrangeFileProcessorAdapter;
219
219
  (class {
220
220
  fs;
221
221
  domainSourceParser;
222
222
  static {
223
- ({c: [_ArrangeFileProcessorServiceImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
223
+ ({c: [_ArrangeFileProcessorAdapter, _initClass]} = _apply_decs_2311(this, [_dec], []));
224
224
  }
225
225
  constructor(fs, domainSourceParser) {
226
226
  this.fs = fs;
@@ -264,4 +264,4 @@ let _ArrangeFileProcessorServiceImpl;
264
264
  }
265
265
  });
266
266
  //#endregion
267
- export { _ArrangeFileProcessorServiceImpl as ArrangeFileProcessorServiceImpl };
267
+ export { _ArrangeFileProcessorAdapter as ArrangeFileProcessorAdapter };