@ncoderz/awa 1.7.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/LICENSE +23 -16
  2. package/README.md +25 -27
  3. package/dist/{chunk-OQZTQ5ZI.js → chunk-LRQWZCYL.js} +1 -4
  4. package/dist/chunk-LRQWZCYL.js.map +1 -0
  5. package/dist/chunk-WGGMDWBE.js +760 -0
  6. package/dist/chunk-WGGMDWBE.js.map +1 -0
  7. package/dist/{config-WL3SLSP6.js → config-EJIXC7D7.js} +2 -2
  8. package/dist/index.js +1285 -466
  9. package/dist/index.js.map +1 -1
  10. package/dist/renumber-ZCI2H5HZ.js +9 -0
  11. package/dist/renumber-ZCI2H5HZ.js.map +1 -0
  12. package/package.json +13 -6
  13. package/templates/awa/.agent/skills/spec-merge/SKILL.md +3 -0
  14. package/templates/awa/.agent/skills/spec-tidy/SKILL.md +3 -0
  15. package/templates/awa/.agent/workflows/spec-merge.md +3 -0
  16. package/templates/awa/.agent/workflows/spec-tidy.md +3 -0
  17. package/templates/awa/.agents/skills/spec-merge/SKILL.md +3 -0
  18. package/templates/awa/.agents/skills/spec-tidy/SKILL.md +3 -0
  19. package/templates/awa/.awa/.agent/schemas/ALIGN_REPORT.schema.yaml +1 -1
  20. package/templates/awa/.awa/.agent/schemas/API.schema.yaml +1 -1
  21. package/templates/awa/.awa/.agent/schemas/ARCHITECTURE.schema.yaml +7 -0
  22. package/templates/awa/.awa/.agent/schemas/DESIGN.schema.yaml +1 -1
  23. package/templates/awa/.awa/.agent/schemas/{EXAMPLES.schema.yaml → EXAMPLE.schema.yaml} +4 -4
  24. package/templates/awa/.awa/.agent/schemas/FEAT.schema.yaml +8 -1
  25. package/templates/awa/.awa/.agent/schemas/PLAN.schema.yaml +1 -1
  26. package/templates/awa/.awa/.agent/schemas/README.schema.yaml +1 -1
  27. package/templates/awa/.awa/.agent/schemas/REQ.schema.yaml +1 -1
  28. package/templates/awa/.awa/.agent/schemas/TASK.schema.yaml +1 -1
  29. package/templates/awa/.claude/skills/spec-merge/SKILL.md +3 -0
  30. package/templates/awa/.claude/skills/spec-tidy/SKILL.md +3 -0
  31. package/templates/awa/.gemini/commands/spec-merge.md +3 -0
  32. package/templates/awa/.gemini/commands/spec-tidy.md +3 -0
  33. package/templates/awa/.gemini/skills/spec-merge/SKILL.md +3 -0
  34. package/templates/awa/.gemini/skills/spec-tidy/SKILL.md +3 -0
  35. package/templates/awa/.github/prompts/awa.spec-merge.prompt.md +8 -0
  36. package/templates/awa/.github/prompts/awa.spec-tidy.prompt.md +7 -0
  37. package/templates/awa/.github/skills/spec-merge/SKILL.md +3 -0
  38. package/templates/awa/.github/skills/spec-tidy/SKILL.md +3 -0
  39. package/templates/awa/.kilocode/skills/spec-merge/SKILL.md +3 -0
  40. package/templates/awa/.kilocode/skills/spec-tidy/SKILL.md +3 -0
  41. package/templates/awa/.kilocode/workflows/spec-merge.md +3 -0
  42. package/templates/awa/.kilocode/workflows/spec-tidy.md +3 -0
  43. package/templates/awa/.opencode/commands/spec-merge.md +3 -0
  44. package/templates/awa/.opencode/commands/spec-tidy.md +3 -0
  45. package/templates/awa/.opencode/skills/spec-merge/SKILL.md +3 -0
  46. package/templates/awa/.opencode/skills/spec-tidy/SKILL.md +3 -0
  47. package/templates/awa/.qwen/commands/spec-merge.md +3 -0
  48. package/templates/awa/.qwen/commands/spec-tidy.md +3 -0
  49. package/templates/awa/.qwen/skills/spec-merge/SKILL.md +3 -0
  50. package/templates/awa/.qwen/skills/spec-tidy/SKILL.md +3 -0
  51. package/templates/awa/.roo/skills/spec-merge/SKILL.md +3 -0
  52. package/templates/awa/.roo/skills/spec-tidy/SKILL.md +3 -0
  53. package/templates/awa/.windsurf/skills/spec-merge/SKILL.md +3 -0
  54. package/templates/awa/.windsurf/skills/spec-tidy/SKILL.md +3 -0
  55. package/templates/awa/_delete.txt +4 -0
  56. package/templates/awa/_partials/_cmd.spec-merge.md +6 -0
  57. package/templates/awa/_partials/_cmd.spec-tidy.md +5 -0
  58. package/templates/awa/_partials/_skill.spec-merge.md +6 -0
  59. package/templates/awa/_partials/_skill.spec-tidy.md +6 -0
  60. package/templates/awa/_partials/awa.align.md +1 -1
  61. package/templates/awa/_partials/awa.brainstorm.md +1 -1
  62. package/templates/awa/_partials/awa.code.md +1 -1
  63. package/templates/awa/_partials/awa.core.md +8 -4
  64. package/templates/awa/_partials/awa.design.md +3 -2
  65. package/templates/awa/_partials/awa.documentation.md +1 -1
  66. package/templates/awa/_partials/awa.examples.md +4 -4
  67. package/templates/awa/_partials/awa.feature.md +2 -1
  68. package/templates/awa/_partials/awa.plan.md +2 -2
  69. package/templates/awa/_partials/awa.requirements.md +4 -2
  70. package/templates/awa/_partials/awa.spec-merge.md +97 -0
  71. package/templates/awa/_partials/awa.spec.tidy.md +92 -0
  72. package/templates/awa/_partials/awa.tasks.md +1 -1
  73. package/templates/awa/_partials/awa.upgrade.md +3 -3
  74. package/templates/awa/_partials/awa.usage.md +74 -6
  75. package/templates/awa/_partials/awa.vibe.md +1 -1
  76. package/templates/awa/_tests/claude/.awa/.agent/awa.core.md +126 -0
  77. package/templates/awa/_tests/claude/.awa/.agent/schemas/ALIGN_REPORT.schema.yaml +83 -0
  78. package/templates/awa/_tests/claude/.awa/.agent/schemas/API.schema.yaml +7 -0
  79. package/templates/awa/_tests/claude/.awa/.agent/schemas/ARCHITECTURE.schema.yaml +257 -0
  80. package/templates/awa/_tests/claude/.awa/.agent/schemas/DESIGN.schema.yaml +351 -0
  81. package/templates/awa/_tests/claude/.awa/.agent/schemas/EXAMPLE.schema.yaml +89 -0
  82. package/templates/awa/_tests/claude/.awa/.agent/schemas/FEAT.schema.yaml +142 -0
  83. package/templates/awa/_tests/claude/.awa/.agent/schemas/PLAN.schema.yaml +146 -0
  84. package/templates/awa/_tests/claude/.awa/.agent/schemas/README.schema.yaml +137 -0
  85. package/templates/awa/_tests/claude/.awa/.agent/schemas/REQ.schema.yaml +160 -0
  86. package/templates/awa/_tests/claude/.awa/.agent/schemas/TASK.schema.yaml +204 -0
  87. package/templates/awa/_tests/claude/.claude/agents/awa.md +137 -0
  88. package/templates/awa/_tests/claude/.claude/skills/awa-align/SKILL.md +67 -0
  89. package/templates/awa/_tests/claude/.claude/skills/awa-architecture/SKILL.md +50 -0
  90. package/templates/awa/_tests/claude/.claude/skills/awa-brainstorm/SKILL.md +57 -0
  91. package/templates/awa/_tests/claude/.claude/skills/awa-check/SKILL.md +79 -0
  92. package/templates/awa/_tests/claude/.claude/skills/awa-code/SKILL.md +179 -0
  93. package/templates/awa/_tests/claude/.claude/skills/awa-design/SKILL.md +62 -0
  94. package/templates/awa/_tests/claude/.claude/skills/awa-documentation/SKILL.md +91 -0
  95. package/templates/awa/_tests/claude/.claude/skills/awa-examples/SKILL.md +58 -0
  96. package/templates/awa/_tests/claude/.claude/skills/awa-feature/SKILL.md +56 -0
  97. package/templates/awa/_tests/claude/.claude/skills/awa-plan/SKILL.md +53 -0
  98. package/templates/awa/_tests/claude/.claude/skills/awa-refactor/SKILL.md +53 -0
  99. package/templates/awa/_tests/claude/.claude/skills/awa-requirements/SKILL.md +58 -0
  100. package/templates/awa/_tests/claude/.claude/skills/awa-tasks/SKILL.md +158 -0
  101. package/templates/awa/_tests/claude/.claude/skills/awa-upgrade/SKILL.md +68 -0
  102. package/templates/awa/_tests/claude/.claude/skills/awa-usage/SKILL.md +368 -0
  103. package/templates/awa/_tests/claude/.claude/skills/awa-vibe/SKILL.md +72 -0
  104. package/templates/awa/_tests/claude/.claude/skills/spec-merge/SKILL.md +102 -0
  105. package/templates/awa/_tests/claude/.claude/skills/spec-tidy/SKILL.md +97 -0
  106. package/templates/awa/_tests/claude/CLAUDE.md +132 -0
  107. package/templates/awa/_tests/copilot/.awa/.agent/awa.core.md +126 -0
  108. package/templates/awa/_tests/copilot/.awa/.agent/schemas/ALIGN_REPORT.schema.yaml +83 -0
  109. package/templates/awa/_tests/copilot/.awa/.agent/schemas/API.schema.yaml +7 -0
  110. package/templates/awa/_tests/copilot/.awa/.agent/schemas/ARCHITECTURE.schema.yaml +257 -0
  111. package/templates/awa/_tests/copilot/.awa/.agent/schemas/DESIGN.schema.yaml +351 -0
  112. package/templates/awa/_tests/copilot/.awa/.agent/schemas/EXAMPLE.schema.yaml +89 -0
  113. package/templates/awa/_tests/copilot/.awa/.agent/schemas/FEAT.schema.yaml +142 -0
  114. package/templates/awa/_tests/copilot/.awa/.agent/schemas/PLAN.schema.yaml +146 -0
  115. package/templates/awa/_tests/copilot/.awa/.agent/schemas/README.schema.yaml +137 -0
  116. package/templates/awa/_tests/copilot/.awa/.agent/schemas/REQ.schema.yaml +160 -0
  117. package/templates/awa/_tests/copilot/.awa/.agent/schemas/TASK.schema.yaml +204 -0
  118. package/templates/awa/_tests/copilot/.github/agents/awa.agent.md +137 -0
  119. package/templates/awa/_tests/copilot/.github/prompts/awa.align.prompt.md +67 -0
  120. package/templates/awa/_tests/copilot/.github/prompts/awa.architecture.prompt.md +50 -0
  121. package/templates/awa/_tests/copilot/.github/prompts/awa.brainstorm.prompt.md +57 -0
  122. package/templates/awa/_tests/copilot/.github/prompts/awa.check.prompt.md +79 -0
  123. package/templates/awa/_tests/copilot/.github/prompts/awa.code.prompt.md +179 -0
  124. package/templates/awa/_tests/copilot/.github/prompts/awa.design.prompt.md +62 -0
  125. package/templates/awa/_tests/copilot/.github/prompts/awa.documentation.prompt.md +91 -0
  126. package/templates/awa/_tests/copilot/.github/prompts/awa.examples.prompt.md +58 -0
  127. package/templates/awa/_tests/copilot/.github/prompts/awa.feature.prompt.md +56 -0
  128. package/templates/awa/_tests/copilot/.github/prompts/awa.plan.prompt.md +53 -0
  129. package/templates/awa/_tests/copilot/.github/prompts/awa.refactor.prompt.md +53 -0
  130. package/templates/awa/_tests/copilot/.github/prompts/awa.requirements.prompt.md +58 -0
  131. package/templates/awa/_tests/copilot/.github/prompts/awa.spec-merge.prompt.md +102 -0
  132. package/templates/awa/_tests/copilot/.github/prompts/awa.spec-tidy.prompt.md +96 -0
  133. package/templates/awa/_tests/copilot/.github/prompts/awa.tasks.prompt.md +158 -0
  134. package/templates/awa/_tests/copilot/.github/prompts/awa.upgrade.prompt.md +68 -0
  135. package/templates/awa/_tests/copilot/.github/prompts/awa.vibe.prompt.md +72 -0
  136. package/templates/awa/_tests/copilot/.github/skills/awa-align/SKILL.md +67 -0
  137. package/templates/awa/_tests/copilot/.github/skills/awa-architecture/SKILL.md +50 -0
  138. package/templates/awa/_tests/copilot/.github/skills/awa-brainstorm/SKILL.md +57 -0
  139. package/templates/awa/_tests/copilot/.github/skills/awa-check/SKILL.md +79 -0
  140. package/templates/awa/_tests/copilot/.github/skills/awa-code/SKILL.md +179 -0
  141. package/templates/awa/_tests/copilot/.github/skills/awa-design/SKILL.md +62 -0
  142. package/templates/awa/_tests/copilot/.github/skills/awa-documentation/SKILL.md +91 -0
  143. package/templates/awa/_tests/copilot/.github/skills/awa-examples/SKILL.md +58 -0
  144. package/templates/awa/_tests/copilot/.github/skills/awa-feature/SKILL.md +56 -0
  145. package/templates/awa/_tests/copilot/.github/skills/awa-plan/SKILL.md +53 -0
  146. package/templates/awa/_tests/copilot/.github/skills/awa-refactor/SKILL.md +53 -0
  147. package/templates/awa/_tests/copilot/.github/skills/awa-requirements/SKILL.md +58 -0
  148. package/templates/awa/_tests/copilot/.github/skills/awa-tasks/SKILL.md +158 -0
  149. package/templates/awa/_tests/copilot/.github/skills/awa-upgrade/SKILL.md +68 -0
  150. package/templates/awa/_tests/copilot/.github/skills/awa-usage/SKILL.md +368 -0
  151. package/templates/awa/_tests/copilot/.github/skills/awa-vibe/SKILL.md +72 -0
  152. package/templates/awa/_tests/copilot/.github/skills/spec-merge/SKILL.md +102 -0
  153. package/templates/awa/_tests/copilot/.github/skills/spec-tidy/SKILL.md +97 -0
  154. package/dist/chunk-OQZTQ5ZI.js.map +0 -1
  155. /package/dist/{config-WL3SLSP6.js.map → config-EJIXC7D7.js.map} +0 -0
package/LICENSE CHANGED
@@ -1,21 +1,28 @@
1
- MIT License
1
+ BSD 3-Clause License
2
2
 
3
3
  Copyright (c) 2025-26 ncoderz Ltd
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
11
7
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
14
10
 
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/ncoderz/awa/actions/workflows/test.yaml/badge.svg)](https://github.com/ncoderz/awa/actions/workflows/test.yaml)
4
4
  [![npm version](https://img.shields.io/npm/v/@ncoderz/awa.svg)](https://www.npmjs.com/package/@ncoderz/awa)
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
5
+ [![License: BSD-3-Clause](https://img.shields.io/badge/License-BSD--3--Clause-blue.svg)](LICENSE)
6
6
 
7
7
  `Structured, traceable AI development.`
8
8
 
@@ -77,20 +77,19 @@ awa init .
77
77
  awa init . --features copilot claude cursor
78
78
  ```
79
79
 
80
-
81
80
  See the **[Quick Start guide](https://awa.ncoderz.com/guides/quick-start/)** for more.
82
81
 
83
82
  ## Related Tools
84
83
 
85
84
  Several tools address AI-assisted development workflows. Each brings different strengths:
86
85
 
87
- | Tool | Description | Runtime |
88
- |---|---|---|
89
- | **awa** | Templated agent config generation with spec-driven workflow and traceability | Node + CLI |
90
- | **[Kiro](https://kiro.dev)** | IDE with built-in spec-driven development and agent hooks | Standalone IDE + CLI |
91
- | **[Spec Kit](https://github.com/github/spec-kit)** | Python CLI for structured specs with broad agent support (18+) | Python 3.11+ / uv |
92
- | **[BMAD Method](https://github.com/bmad-code-org/BMAD-METHOD)** | Agile workflow with role-based AI personas | Shell / Python / yq |
93
- | **[AI RPI Protocol](https://github.com/MiguelAxcar/ai-rpi-protocol)** | Zero-dependency markdown rules for disciplined AI development | None (markdown only) |
86
+ | Tool | Description | Runtime |
87
+ | --------------------------------------------------------------------- | ---------------------------------------------------------------------------- | -------------------- |
88
+ | **awa** | Templated agent config generation with spec-driven workflow and traceability | Node + CLI |
89
+ | **[Kiro](https://kiro.dev)** | IDE with built-in spec-driven development and agent hooks | Standalone IDE + CLI |
90
+ | **[Spec Kit](https://github.com/github/spec-kit)** | Python CLI for structured specs with broad agent support (18+) | Python 3.11+ / uv |
91
+ | **[BMAD Method](https://github.com/bmad-code-org/BMAD-METHOD)** | Agile workflow with role-based AI personas | Shell / Python / yq |
92
+ | **[AI RPI Protocol](https://github.com/MiguelAxcar/ai-rpi-protocol)** | Zero-dependency markdown rules for disciplined AI development | None (markdown only) |
94
93
 
95
94
  ### What each tool does well
96
95
 
@@ -103,7 +102,6 @@ Several tools address AI-assisted development workflows. Each brings different s
103
102
 
104
103
  awa focuses on two things other tools don't combine: **end-to-end traceability** (every line of code links back to a requirement via `@awa-impl` / `@awa-test` markers, validated by `awa check`) and **templateable agent configuration** (feature flags, presets, overlays, diff detection). It's agent-agnostic — one template set generates config for Copilot, Claude, Cursor, Windsurf, and more.
105
104
 
106
-
107
105
  ## Development
108
106
 
109
107
  ### Prerequisites
@@ -120,22 +118,22 @@ npm run build
120
118
 
121
119
  ### Scripts
122
120
 
123
- | Command | Description |
124
- |---------|-------------|
125
- | `npm run build` | Build for production (`dist/`) |
126
- | `npm run dev` | Run CLI in development mode |
127
- | `npm test` | Run tests |
128
- | `npm run test:watch` | Run tests in watch mode |
129
- | `npm run test:coverage` | Run tests with coverage |
130
- | `npm run check` | Run `awa check` on this project |
131
- | `npm run lint` | Check code with Biome |
132
- | `npm run lint:fix` | Fix linting issues |
133
- | `npm run format` | Format code with Biome |
134
- | `npm run typecheck` | TypeScript type checking |
135
- | `npm run gen:example` | Generate example template to `outputs/example` |
136
- | `npm run gen:awa` | Generate awa templates to `outputs/awa` |
137
- | `npm run gen:awa:this` | Generate awa templates to current directory |
138
- | `npm run diff:awa:this` | Diff awa templates against current directory |
121
+ | Command | Description |
122
+ | ----------------------- | ---------------------------------------------- |
123
+ | `npm run build` | Build for production (`dist/`) |
124
+ | `npm run dev` | Run CLI in development mode |
125
+ | `npm test` | Run tests |
126
+ | `npm run test:watch` | Run tests in watch mode |
127
+ | `npm run test:coverage` | Run tests with coverage |
128
+ | `npm run check` | Run `awa check` on this project |
129
+ | `npm run lint` | Check code with ESLint |
130
+ | `npm run lint:fix` | Fix linting issues |
131
+ | `npm run format` | Format code with Prettier |
132
+ | `npm run typecheck` | TypeScript type checking |
133
+ | `npm run gen:example` | Generate example template to `outputs/example` |
134
+ | `npm run gen:awa` | Generate awa templates to `outputs/awa` |
135
+ | `npm run gen:awa:this` | Generate awa templates to current directory |
136
+ | `npm run diff:awa:this` | Diff awa templates against current directory |
139
137
 
140
138
  ## Community
141
139
 
@@ -148,7 +146,7 @@ npm run build
148
146
 
149
147
  ## License
150
148
 
151
- © 2025-26 ncoderz Ltd. Released under the [MIT License](LICENSE).
149
+ © 2025-26 ncoderz Ltd. Released under the [BSD 3-Clause License](LICENSE).
152
150
 
153
151
  ## Acknowledgments
154
152
 
@@ -155,9 +155,6 @@ var Logger = class {
155
155
  if (result.skippedUser > 0) {
156
156
  console.log(chalk.blue(` Skipped (user): ${result.skippedUser}`));
157
157
  }
158
- if (result.skippedEmpty > 0) {
159
- console.log(chalk.dim(` Skipped (empty): ${result.skippedEmpty}`));
160
- }
161
158
  console.log("");
162
159
  }
163
160
  // @awa-impl: DIFF-4_AC-3
@@ -622,4 +619,4 @@ export {
622
619
  ConfigLoader,
623
620
  configLoader
624
621
  };
625
- //# sourceMappingURL=chunk-OQZTQ5ZI.js.map
622
+ //# sourceMappingURL=chunk-LRQWZCYL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/config.ts","../src/types/index.ts","../src/utils/fs.ts","../src/utils/logger.ts"],"sourcesContent":["// @awa-component: CFG-ConfigLoader\n// @awa-component: MULTI-TargetResolver\n// @awa-impl: CFG-1_AC-1\n// @awa-impl: CFG-1_AC-2\n// @awa-impl: CFG-1_AC-3\n// @awa-impl: CFG-1_AC-4\n// @awa-impl: CFG-2_AC-1\n// @awa-impl: CFG-2_AC-2\n// @awa-impl: CFG-2_AC-3\n// @awa-impl: CFG-3_AC-1\n// @awa-impl: CFG-3_AC-2\n// @awa-impl: CFG-3_AC-3\n// @awa-impl: CFG-3_AC-4\n// @awa-impl: CFG-3_AC-5\n// @awa-impl: CFG-3_AC-6\n// @awa-impl: CFG-3_AC-7\n// @awa-impl: CFG-3_AC-8\n// @awa-impl: CFG-3_AC-9\n// @awa-impl: CFG-3_AC-10\n// @awa-impl: CFG-4_AC-1\n// @awa-impl: CFG-4_AC-2\n// @awa-impl: CFG-4_AC-3\n// @awa-impl: CFG-4_AC-4\n// @awa-impl: CFG-5_AC-1\n// @awa-impl: CFG-6_AC-1\n// @awa-impl: CFG-6_AC-2\n// @awa-impl: CLI-1_AC-4\n// @awa-impl: CLI-2_AC-2\n// @awa-impl: CLI-2_AC-3\n// @awa-impl: CLI-2_AC-4\n// @awa-impl: CLI-4_AC-3\n// @awa-impl: CLI-7_AC-2\n// @awa-impl: CFG-7_AC-1\n// @awa-impl: CFG-7_AC-2\n// @awa-impl: CFG-7_AC-3\n// @awa-impl: CFG-7_AC-4\n// @awa-impl: CFG-9_AC-1\n// @awa-impl: CFG-9_AC-2\n// @awa-impl: CFG-9_AC-3\n// @awa-impl: CFG-11_AC-1\n// @awa-impl: CFG-11_AC-2\n// @awa-impl: CFG-11_AC-3\n// @awa-impl: MULTI-1_AC-1\n// @awa-impl: MULTI-2_AC-1\n// @awa-impl: MULTI-3_AC-1\n// @awa-impl: MULTI-5_AC-2\n\nimport { parse } from 'smol-toml';\n\nimport {\n ConfigError,\n type FileConfig,\n type PresetDefinitions,\n type RawCliOptions,\n type ResolvedOptions,\n type TargetConfig,\n type UpdateCheckConfig,\n} from '../types/index.js';\nimport { pathExists, readTextFile } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst DEFAULT_CONFIG_PATH = '.awa.toml';\n\nexport class ConfigLoader {\n // @awa-impl: CFG-1_AC-1, CFG-1_AC-2, CFG-1_AC-3, CFG-1_AC-4\n async load(configPath: string | null): Promise<FileConfig | null> {\n const pathToLoad = configPath ?? DEFAULT_CONFIG_PATH;\n\n // Check if file exists\n const exists = await pathExists(pathToLoad);\n\n // If explicit path provided but doesn't exist, error\n if (configPath && !exists) {\n throw new ConfigError(\n `Configuration file not found: ${configPath}`,\n 'FILE_NOT_FOUND',\n configPath,\n );\n }\n\n // If default path doesn't exist, return null (no error)\n if (!configPath && !exists) {\n return null;\n }\n\n // Read and parse TOML\n try {\n const content = await readTextFile(pathToLoad);\n const parsed = parse(content) as Record<string, unknown>;\n\n // Validate and extract known options\n const config: FileConfig = {};\n\n if (parsed.output !== undefined) {\n if (typeof parsed.output !== 'string') {\n throw new ConfigError(\n `Invalid type for 'output': expected string, got ${typeof parsed.output}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.output = parsed.output;\n }\n\n if (parsed.template !== undefined) {\n if (typeof parsed.template !== 'string') {\n throw new ConfigError(\n `Invalid type for 'template': expected string, got ${typeof parsed.template}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.template = parsed.template;\n }\n\n if (parsed.features !== undefined) {\n if (\n !Array.isArray(parsed.features) ||\n !parsed.features.every((f) => typeof f === 'string')\n ) {\n throw new ConfigError(\n `Invalid type for 'features': expected array of strings`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.features = parsed.features;\n }\n\n if (parsed.preset !== undefined) {\n if (!Array.isArray(parsed.preset) || !parsed.preset.every((p) => typeof p === 'string')) {\n throw new ConfigError(\n `Invalid type for 'preset': expected array of strings`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.preset = parsed.preset;\n }\n\n if (parsed['remove-features'] !== undefined) {\n if (\n !Array.isArray(parsed['remove-features']) ||\n !parsed['remove-features'].every((f) => typeof f === 'string')\n ) {\n throw new ConfigError(\n `Invalid type for 'remove-features': expected array of strings`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config['remove-features'] = parsed['remove-features'];\n }\n\n if (parsed.force !== undefined) {\n if (typeof parsed.force !== 'boolean') {\n throw new ConfigError(\n `Invalid type for 'force': expected boolean, got ${typeof parsed.force}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.force = parsed.force;\n }\n\n if (parsed['dry-run'] !== undefined) {\n if (typeof parsed['dry-run'] !== 'boolean') {\n throw new ConfigError(\n `Invalid type for 'dry-run': expected boolean, got ${typeof parsed['dry-run']}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config['dry-run'] = parsed['dry-run'];\n }\n\n if (parsed.delete !== undefined) {\n if (typeof parsed.delete !== 'boolean') {\n throw new ConfigError(\n `Invalid type for 'delete': expected boolean, got ${typeof parsed.delete}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.delete = parsed.delete;\n }\n\n if (parsed.refresh !== undefined) {\n if (typeof parsed.refresh !== 'boolean') {\n throw new ConfigError(\n `Invalid type for 'refresh': expected boolean, got ${typeof parsed.refresh}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.refresh = parsed.refresh;\n }\n\n if (parsed.presets !== undefined) {\n if (\n parsed.presets === null ||\n typeof parsed.presets !== 'object' ||\n Array.isArray(parsed.presets)\n ) {\n throw new ConfigError(\n `Invalid type for 'presets': expected table of string arrays`,\n 'INVALID_PRESET',\n pathToLoad,\n );\n }\n\n const defs: PresetDefinitions = {};\n for (const [presetName, value] of Object.entries(\n parsed.presets as Record<string, unknown>,\n )) {\n if (!Array.isArray(value) || !value.every((v) => typeof v === 'string')) {\n throw new ConfigError(\n `Invalid preset '${presetName}': expected array of strings`,\n 'INVALID_PRESET',\n pathToLoad,\n );\n }\n defs[presetName] = value as string[];\n }\n\n config.presets = defs;\n }\n\n if (parsed['list-unknown'] !== undefined) {\n if (typeof parsed['list-unknown'] !== 'boolean') {\n throw new ConfigError(\n `Invalid type for 'list-unknown': expected boolean, got ${typeof parsed['list-unknown']}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config['list-unknown'] = parsed['list-unknown'];\n }\n\n // @awa-impl: CLI-31_AC-1\n // Pass through [check] table as-is for check command to process\n if (parsed.check !== undefined) {\n if (\n parsed.check === null ||\n typeof parsed.check !== 'object' ||\n Array.isArray(parsed.check)\n ) {\n throw new ConfigError(\n `Invalid type for 'check': expected table`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.check = parsed.check as Record<string, unknown>;\n }\n\n // @awa-impl: OVL-8_AC-1\n if (parsed.overlay !== undefined) {\n if (!Array.isArray(parsed.overlay) || !parsed.overlay.every((o) => typeof o === 'string')) {\n throw new ConfigError(\n `Invalid type for 'overlay': expected array of strings`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n config.overlay = parsed.overlay;\n }\n\n if (parsed['update-check'] !== undefined) {\n if (\n parsed['update-check'] === null ||\n typeof parsed['update-check'] !== 'object' ||\n Array.isArray(parsed['update-check'])\n ) {\n throw new ConfigError(\n `Invalid type for 'update-check': expected table`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n\n const raw = parsed['update-check'] as Record<string, unknown>;\n const updateCheckConfig: UpdateCheckConfig = {};\n\n if (raw.enabled !== undefined) {\n if (typeof raw.enabled !== 'boolean') {\n throw new ConfigError(\n `Invalid type for 'update-check.enabled': expected boolean, got ${typeof raw.enabled}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n updateCheckConfig.enabled = raw.enabled;\n }\n\n if (raw.interval !== undefined) {\n if (typeof raw.interval !== 'number') {\n throw new ConfigError(\n `Invalid type for 'update-check.interval': expected number, got ${typeof raw.interval}`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n updateCheckConfig.interval = raw.interval;\n }\n\n config['update-check'] = updateCheckConfig;\n }\n\n // Parse [targets.*] sections\n if (parsed.targets !== undefined) {\n if (\n parsed.targets === null ||\n typeof parsed.targets !== 'object' ||\n Array.isArray(parsed.targets)\n ) {\n throw new ConfigError(\n `Invalid type for 'targets': expected table of target sections`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n\n const targets: Record<string, TargetConfig> = {};\n for (const [targetName, targetValue] of Object.entries(\n parsed.targets as Record<string, unknown>,\n )) {\n if (\n targetValue === null ||\n typeof targetValue !== 'object' ||\n Array.isArray(targetValue)\n ) {\n throw new ConfigError(\n `Invalid target '${targetName}': expected table`,\n 'INVALID_TYPE',\n pathToLoad,\n );\n }\n targets[targetName] = this.parseTargetSection(\n targetValue as Record<string, unknown>,\n targetName,\n pathToLoad,\n );\n }\n config.targets = targets;\n }\n\n // Warn about unknown options\n const knownKeys = new Set([\n 'output',\n 'template',\n 'features',\n 'preset',\n 'remove-features',\n 'presets',\n 'force',\n 'dry-run',\n 'delete',\n 'refresh',\n 'list-unknown',\n 'check',\n 'targets',\n 'overlay',\n 'update-check',\n ]);\n for (const key of Object.keys(parsed)) {\n if (!knownKeys.has(key)) {\n logger.warn(`Unknown configuration option: '${key}'`);\n }\n }\n\n return config;\n } catch (error) {\n if (error instanceof ConfigError) {\n throw error;\n }\n\n // TOML parsing error\n throw new ConfigError(\n `Failed to parse TOML configuration: ${error instanceof Error ? error.message : String(error)}`,\n 'PARSE_ERROR',\n pathToLoad,\n );\n }\n }\n\n // @awa-impl: CFG-4_AC-1, CFG-4_AC-2, CFG-4_AC-3, CFG-4_AC-4\n // @awa-impl: CLI-2_AC-2, CLI-2_AC-3, CLI-2_AC-4\n merge(cli: RawCliOptions, file: FileConfig | null): ResolvedOptions {\n // CLI arguments override file config values\n // Output can come from CLI (positional argument) or config file\n\n // @awa-impl: CLI-2_AC-2, CLI-2_AC-3\n const output = cli.output ?? file?.output;\n\n // @awa-impl: CLI-1_AC-4, CLI-2_AC-4\n if (!output) {\n throw new ConfigError(\n 'Output directory is required. Provide it as a positional argument or in the config file.',\n 'MISSING_OUTPUT',\n null,\n );\n }\n\n const template = cli.template ?? file?.template ?? null;\n\n // Features: CLI completely replaces config (no merge)\n const features = cli.features ?? file?.features ?? [];\n\n const preset = cli.preset ?? file?.preset ?? [];\n const removeFeatures = cli.removeFeatures ?? file?.['remove-features'] ?? [];\n const presets = file?.presets ?? {};\n\n const force = cli.force ?? file?.force ?? false;\n const dryRun = cli.dryRun ?? file?.['dry-run'] ?? false;\n const enableDelete = cli.delete ?? file?.delete ?? false;\n const refresh = cli.refresh ?? file?.refresh ?? false;\n const listUnknown = cli.listUnknown ?? file?.['list-unknown'] ?? false;\n const overlay = cli.overlay ?? file?.overlay ?? [];\n const json = cli.json ?? false;\n const summary = cli.summary ?? false;\n\n return {\n output,\n template,\n features,\n preset,\n removeFeatures,\n force,\n dryRun,\n delete: enableDelete,\n refresh,\n presets,\n listUnknown,\n overlay,\n json,\n summary,\n };\n }\n\n // Parse a [targets.<name>] section, validating allowed keys and types\n private parseTargetSection(\n section: Record<string, unknown>,\n targetName: string,\n configPath: string,\n ): TargetConfig {\n const target: TargetConfig = {};\n const allowedKeys = new Set(['output', 'template', 'features', 'preset', 'remove-features']);\n\n for (const key of Object.keys(section)) {\n if (!allowedKeys.has(key)) {\n logger.warn(`Unknown option in target '${targetName}': '${key}'`);\n }\n }\n\n if (section.output !== undefined) {\n if (typeof section.output !== 'string') {\n throw new ConfigError(\n `Invalid type for 'targets.${targetName}.output': expected string, got ${typeof section.output}`,\n 'INVALID_TYPE',\n configPath,\n );\n }\n target.output = section.output;\n }\n\n if (section.template !== undefined) {\n if (typeof section.template !== 'string') {\n throw new ConfigError(\n `Invalid type for 'targets.${targetName}.template': expected string, got ${typeof section.template}`,\n 'INVALID_TYPE',\n configPath,\n );\n }\n target.template = section.template;\n }\n\n if (section.features !== undefined) {\n if (\n !Array.isArray(section.features) ||\n !section.features.every((f) => typeof f === 'string')\n ) {\n throw new ConfigError(\n `Invalid type for 'targets.${targetName}.features': expected array of strings`,\n 'INVALID_TYPE',\n configPath,\n );\n }\n target.features = section.features;\n }\n\n if (section.preset !== undefined) {\n if (!Array.isArray(section.preset) || !section.preset.every((p) => typeof p === 'string')) {\n throw new ConfigError(\n `Invalid type for 'targets.${targetName}.preset': expected array of strings`,\n 'INVALID_TYPE',\n configPath,\n );\n }\n target.preset = section.preset;\n }\n\n if (section['remove-features'] !== undefined) {\n if (\n !Array.isArray(section['remove-features']) ||\n !section['remove-features'].every((f) => typeof f === 'string')\n ) {\n throw new ConfigError(\n `Invalid type for 'targets.${targetName}.remove-features': expected array of strings`,\n 'INVALID_TYPE',\n configPath,\n );\n }\n target['remove-features'] = section['remove-features'];\n }\n\n return target;\n }\n\n // Resolve a target by merging target config with root config (target overrides root via nullish coalescing)\n resolveTarget(targetName: string, fileConfig: FileConfig): FileConfig {\n const targets = fileConfig.targets;\n if (!targets || Object.keys(targets).length === 0) {\n throw new ConfigError(\n 'No targets defined in configuration. Add [targets.<name>] sections to .awa.toml.',\n 'NO_TARGETS',\n null,\n );\n }\n\n const target = targets[targetName];\n if (!target) {\n throw new ConfigError(\n `Unknown target: '${targetName}'. Available targets: ${Object.keys(targets).join(', ')}`,\n 'UNKNOWN_TARGET',\n null,\n );\n }\n\n // Merge: target fields override root (nullish coalescing — target value ?? root value)\n return {\n ...fileConfig,\n output: target.output ?? fileConfig.output,\n template: target.template ?? fileConfig.template,\n features: target.features ?? fileConfig.features,\n preset: target.preset ?? fileConfig.preset,\n 'remove-features': target['remove-features'] ?? fileConfig['remove-features'],\n targets: undefined, // Don't propagate targets into resolved config\n };\n }\n\n // Get all target names from config\n getTargetNames(fileConfig: FileConfig | null): string[] {\n if (!fileConfig?.targets) {\n return [];\n }\n return Object.keys(fileConfig.targets);\n }\n}\n\nexport const configLoader = new ConfigLoader();\n","// @awa-component: GEN-CoreTypes\n\n// Custom error classes for diff operations\nexport class DiffError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DiffError';\n }\n}\n\n// RawCliOptions - CLI argument parser output\nexport interface RawCliOptions {\n output?: string; // Optional positional argument (required if not in config)\n template?: string;\n features?: string[];\n preset?: string[];\n removeFeatures?: string[];\n force?: boolean;\n dryRun?: boolean;\n delete?: boolean;\n config?: string;\n refresh?: boolean;\n listUnknown?: boolean;\n all?: boolean;\n allTargets?: boolean;\n target?: string;\n watch?: boolean;\n overlay?: string[];\n json?: boolean;\n summary?: boolean;\n}\n\n// PresetDefinitions - Named feature bundles\nexport interface PresetDefinitions {\n [presetName: string]: string[];\n}\n\n// TargetConfig - Per-target configuration (generation-related fields only, no boolean flags)\nexport interface TargetConfig {\n output?: string;\n template?: string;\n features?: string[];\n preset?: string[];\n 'remove-features'?: string[];\n}\n\n// UpdateCheckConfig - Update check configuration\nexport interface UpdateCheckConfig {\n enabled?: boolean;\n interval?: number;\n}\n\n// FileConfig - TOML configuration file structure\nexport interface FileConfig {\n output?: string;\n template?: string;\n features?: string[];\n preset?: string[];\n 'remove-features'?: string[];\n force?: boolean;\n 'dry-run'?: boolean;\n delete?: boolean;\n refresh?: boolean;\n presets?: PresetDefinitions;\n 'list-unknown'?: boolean;\n check?: Record<string, unknown>;\n targets?: Record<string, TargetConfig>;\n overlay?: string[];\n 'update-check'?: UpdateCheckConfig;\n}\n\n// ResolvedOptions - Fully resolved configuration with defaults applied\nexport interface ResolvedOptions {\n readonly output: string;\n readonly template: string | null;\n readonly features: readonly string[];\n readonly preset: readonly string[];\n readonly removeFeatures: readonly string[];\n readonly force: boolean;\n readonly dryRun: boolean;\n readonly delete: boolean;\n readonly refresh: boolean;\n readonly presets: PresetDefinitions;\n readonly listUnknown: boolean;\n readonly overlay: readonly string[];\n readonly json: boolean;\n readonly summary: boolean;\n}\n\n// TemplateSourceType - Template source type detection\nexport type TemplateSourceType = 'local' | 'git' | 'bundled';\n\n// ResolvedTemplate - Template source resolution result\nexport interface ResolvedTemplate {\n type: TemplateSourceType;\n localPath: string;\n source: string;\n}\n\n// TemplateContext - Context passed to template engine\nexport interface TemplateContext {\n features: string[];\n version?: string;\n}\n\n// RenderResult - Template rendering output\nexport interface RenderResult {\n content: string;\n isEmpty: boolean;\n isEmptyFileMarker: boolean;\n}\n\n// FileAction - Tagged union for file operations\nexport type FileAction =\n | { type: 'create'; sourcePath: string; outputPath: string }\n | { type: 'overwrite'; sourcePath: string; outputPath: string }\n | { type: 'skip-user'; sourcePath: string; outputPath: string }\n | { type: 'skip-empty'; sourcePath: string; outputPath: string }\n | { type: 'skip-equal'; sourcePath: string; outputPath: string }\n | { type: 'delete'; outputPath: string };\n\n// GenerationResult - Aggregated generation outcome\nexport interface GenerationResult {\n readonly actions: readonly FileAction[];\n readonly created: number;\n readonly overwritten: number;\n readonly deleted: number;\n readonly skipped: number;\n readonly skippedEmpty: number;\n readonly skippedUser: number;\n readonly skippedEqual: number;\n}\n\n// GenerateOptions - File generation parameters\nexport interface GenerateOptions {\n templatePath: string;\n outputPath: string;\n features: string[];\n force: boolean;\n dryRun: boolean;\n delete: boolean;\n}\n\n// ConflictChoice - User choice for conflict resolution\nexport type ConflictChoice = 'overwrite' | 'skip';\n\n// ConflictItem - Individual file conflict for batch resolution\nexport interface ConflictItem {\n outputPath: string;\n sourcePath: string;\n newContent: string;\n existingContent: string;\n}\n\n// BatchConflictResolution - Result of batch conflict resolution\nexport interface BatchConflictResolution {\n overwrite: string[]; // List of output paths to overwrite\n skip: string[]; // List of output paths to skip\n equal: string[]; // List of output paths skipped because content is identical\n}\n\n// TemplateFile - Template file metadata\nexport interface TemplateFile {\n path: string;\n absolutePath: string;\n isPartial: boolean;\n}\n\n// DiffOptions - Diff operation parameters\nexport interface DiffOptions {\n templatePath: string;\n targetPath: string;\n features: string[];\n listUnknown: boolean;\n}\n\n// FileDiffStatus - File comparison status\nexport type FileDiffStatus =\n | 'identical'\n | 'modified'\n | 'new'\n | 'extra'\n | 'binary-differs'\n | 'delete-listed';\n\n// FileDiff - Comparison result for a single file\nexport interface FileDiff {\n relativePath: string;\n status: FileDiffStatus;\n unifiedDiff?: string; // Present only for 'modified' text files\n}\n\n// DiffResult - Aggregated diff outcome\nexport interface DiffResult {\n files: FileDiff[];\n identical: number;\n modified: number;\n newFiles: number;\n extraFiles: number;\n binaryDiffers: number;\n deleteListed: number;\n hasDifferences: boolean;\n}\n\n// CachedTemplate - Cached Git template metadata\nexport interface CachedTemplate {\n source: string;\n localPath: string;\n fetchedAt: Date;\n ref?: string;\n}\n\n// JSON output types for --json flag\n// @awa-impl: JSON-3_AC-1\nexport interface GenerationActionJSON {\n type: string;\n path: string;\n}\n\nexport interface GenerationJSON {\n actions: GenerationActionJSON[];\n counts: {\n created: number;\n overwritten: number;\n skipped: number;\n deleted: number;\n };\n}\n\n// @awa-impl: JSON-4_AC-1\nexport interface DiffFileJSON {\n path: string;\n status: string;\n diff?: string;\n}\n\nexport interface DiffJSON {\n diffs: DiffFileJSON[];\n counts: {\n changed: number;\n new: number;\n matching: number;\n deleted: number;\n };\n}\n\n// Custom error types\nexport class ConfigError extends Error {\n constructor(\n message: string,\n public code:\n | 'FILE_NOT_FOUND'\n | 'PARSE_ERROR'\n | 'INVALID_TYPE'\n | 'MISSING_OUTPUT'\n | 'INVALID_PRESET'\n | 'UNKNOWN_PRESET'\n | 'UNKNOWN_TARGET'\n | 'NO_TARGETS',\n public filePath?: string | null,\n ) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\nexport class TemplateError extends Error {\n constructor(\n message: string,\n public code: 'SOURCE_NOT_FOUND' | 'FETCH_FAILED' | 'RENDER_ERROR',\n public source?: string,\n ) {\n super(message);\n this.name = 'TemplateError';\n }\n}\n\nexport class GenerationError extends Error {\n constructor(\n message: string,\n public code: 'PERMISSION_DENIED' | 'DISK_FULL',\n ) {\n super(message);\n this.name = 'GenerationError';\n }\n}\n","// @awa-component: GEN-FileSystem\n// @awa-impl: GEN-1_AC-1, GEN-1_AC-2\n\nimport { mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function isDirectory(path: string): Promise<boolean> {\n try {\n const stats = await stat(path);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function readTextFile(path: string): Promise<string> {\n return readFile(path, 'utf-8');\n}\n\nexport async function readBinaryFile(path: string): Promise<Buffer> {\n return readFile(path);\n}\n\nexport async function writeTextFile(path: string, content: string): Promise<void> {\n await ensureDir(dirname(path));\n await writeFile(path, content, 'utf-8');\n}\n\nexport async function* walkDirectory(dir: string): AsyncGenerator<string> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Skip directories starting with underscore\n if (entry.name.startsWith('_')) {\n continue;\n }\n yield* walkDirectory(fullPath);\n } else if (entry.isFile()) {\n // Skip files starting with underscore\n if (entry.name.startsWith('_')) {\n continue;\n }\n yield fullPath;\n }\n }\n}\n\nexport function getCacheDir(): string {\n return join(homedir(), '.cache', 'awa', 'templates');\n}\n\nexport function getTemplateDir(): string {\n // In built dist, we need to go up from dist/index.js to project root\n // In development, we're in src/utils/fs.ts\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n\n // Check if we're in dist/ or src/\n if (currentDir.includes('/dist')) {\n // In dist: go up one level to project root\n return join(dirname(currentDir), 'templates');\n }\n\n // In src: go up two levels to project root\n return join(currentDir, '..', '..', 'templates');\n}\n\nexport async function rmDir(dirPath: string): Promise<void> {\n await rm(dirPath, { recursive: true, force: true });\n}\n\nexport async function deleteFile(filePath: string): Promise<void> {\n await rm(filePath, { force: true });\n}\n","// @awa-component: GEN-Logger\n// @awa-impl: CLI-6_AC-3\n// @awa-impl: GEN-6_AC-4\n// @awa-impl: GEN-7_AC-1\n// @awa-impl: GEN-7_AC-2\n// @awa-impl: GEN-7_AC-3\n// @awa-impl: GEN-7_AC-4\n// @awa-impl: GEN-9_AC-1\n// @awa-impl: GEN-9_AC-2\n// @awa-impl: GEN-9_AC-3\n// @awa-impl: GEN-9_AC-4\n// @awa-impl: GEN-9_AC-5\n// @awa-impl: GEN-9_AC-6\n// @awa-impl: GEN-9_AC-7\n// @awa-impl: GEN-9_AC-8\n// @awa-impl: GEN-11_AC-1\n// @awa-impl: GEN-11_AC-2\n// @awa-impl: GEN-11_AC-4\n// @awa-impl: TPL-7_AC-3\n\nimport chalk from 'chalk';\n\nimport type { DiffResult, FileAction, GenerationResult } from '../types/index.js';\n\nexport class Logger {\n info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n }\n\n success(message: string): void {\n console.log(chalk.green('✔'), message);\n }\n\n warn(message: string): void {\n console.warn(chalk.yellow('⚠'), message);\n }\n\n error(message: string): void {\n console.error(chalk.red('✖'), message);\n }\n\n fileAction(action: FileAction): void {\n const { type, outputPath } = action;\n\n switch (type) {\n case 'create':\n console.log(chalk.green(' + '), chalk.dim(outputPath));\n break;\n case 'overwrite':\n console.log(chalk.yellow(' ~ '), chalk.dim(outputPath));\n break;\n case 'skip-user':\n console.log(chalk.blue(' - '), chalk.dim(outputPath), chalk.dim('(skipped)'));\n break;\n case 'skip-empty':\n console.log(chalk.dim(' · '), chalk.dim(outputPath), chalk.dim('(empty)'));\n break;\n case 'skip-equal':\n console.log(chalk.dim(' = '), chalk.dim(outputPath), chalk.dim('(unchanged)'));\n break;\n case 'delete':\n console.log(chalk.red(' ✖ '), chalk.dim(outputPath), chalk.red('(deleted)'));\n break;\n }\n }\n\n // @awa-impl: GEN-9_AC-1, GEN-9_AC-2, GEN-9_AC-3, GEN-9_AC-4, GEN-9_AC-5, GEN-9_AC-6\n summary(result: GenerationResult): void {\n console.log('');\n console.log(chalk.bold('Summary:'));\n\n // @awa-impl: GEN-9_AC-6\n // Check if no files were created, overwritten, or deleted\n if (result.created === 0 && result.overwritten === 0 && result.deleted === 0) {\n console.log(chalk.yellow(' ⚠ No files were created, overwritten, or deleted'));\n }\n\n if (result.created > 0) {\n console.log(chalk.green(` Created: ${result.created}`));\n }\n\n if (result.overwritten > 0) {\n console.log(chalk.yellow(` Overwritten: ${result.overwritten}`));\n }\n\n if (result.deleted > 0) {\n console.log(chalk.red(` Deleted: ${result.deleted}`));\n }\n\n if (result.skippedEqual > 0) {\n console.log(chalk.dim(` Skipped (equal): ${result.skippedEqual}`));\n }\n\n if (result.skippedUser > 0) {\n console.log(chalk.blue(` Skipped (user): ${result.skippedUser}`));\n }\n\n console.log('');\n }\n\n // @awa-impl: DIFF-4_AC-3\n diffLine(line: string, type: 'add' | 'remove' | 'context'): void {\n switch (type) {\n case 'add':\n console.log(chalk.green(line));\n break;\n case 'remove':\n console.log(chalk.red(line));\n break;\n case 'context':\n console.log(chalk.dim(line));\n break;\n }\n }\n\n // @awa-impl: DIFF-4_AC-4, DIFF-4_AC-5\n diffSummary(result: DiffResult): void {\n console.log('');\n\n const filesCompared =\n result.identical +\n result.modified +\n result.newFiles +\n result.extraFiles +\n result.binaryDiffers +\n result.deleteListed;\n const differences =\n result.modified +\n result.newFiles +\n result.extraFiles +\n result.binaryDiffers +\n result.deleteListed;\n\n // @awa-impl: DIFF-4_AC-5\n console.log(chalk.bold(`${filesCompared} files compared, ${differences} differences`));\n\n if (!result.hasDifferences) {\n // @awa-impl: DIFF-4_AC-4\n console.log(chalk.green('✔ No differences found'));\n }\n\n // @awa-impl: DIFF-4_AC-5\n console.log(chalk.bold('Summary:'));\n console.log(chalk.dim(` Identical: ${result.identical}`));\n\n if (result.modified > 0) {\n console.log(chalk.yellow(` Modified: ${result.modified}`));\n }\n\n if (result.newFiles > 0) {\n console.log(chalk.green(` New: ${result.newFiles}`));\n }\n\n if (result.extraFiles > 0) {\n console.log(chalk.red(` Extra: ${result.extraFiles}`));\n }\n\n if (result.binaryDiffers > 0) {\n console.log(chalk.red(` Binary differs: ${result.binaryDiffers}`));\n }\n\n if (result.deleteListed > 0) {\n console.log(chalk.red(` Delete listed: ${result.deleteListed}`));\n }\n\n console.log('');\n }\n}\n\nexport const logger = new Logger();\n"],"mappings":"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","names":[]}