@avora-labs/cli 1.1.20

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 (103) hide show
  1. package/README.md +218 -0
  2. package/bin/avora.mjs +5 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +64 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/add.command.d.ts +3 -0
  8. package/dist/commands/add.command.d.ts.map +1 -0
  9. package/dist/commands/add.command.js +83 -0
  10. package/dist/commands/add.command.js.map +1 -0
  11. package/dist/commands/config.command.d.ts +3 -0
  12. package/dist/commands/config.command.d.ts.map +1 -0
  13. package/dist/commands/config.command.js +71 -0
  14. package/dist/commands/config.command.js.map +1 -0
  15. package/dist/commands/generate.command.d.ts +3 -0
  16. package/dist/commands/generate.command.d.ts.map +1 -0
  17. package/dist/commands/generate.command.js +258 -0
  18. package/dist/commands/generate.command.js.map +1 -0
  19. package/dist/commands/info.command.d.ts +3 -0
  20. package/dist/commands/info.command.d.ts.map +1 -0
  21. package/dist/commands/info.command.js +92 -0
  22. package/dist/commands/info.command.js.map +1 -0
  23. package/dist/commands/init.command.d.ts +3 -0
  24. package/dist/commands/init.command.d.ts.map +1 -0
  25. package/dist/commands/init.command.js +230 -0
  26. package/dist/commands/init.command.js.map +1 -0
  27. package/dist/commands/new.command.d.ts +3 -0
  28. package/dist/commands/new.command.d.ts.map +1 -0
  29. package/dist/commands/new.command.js +50 -0
  30. package/dist/commands/new.command.js.map +1 -0
  31. package/dist/commands/plugin.command.d.ts +3 -0
  32. package/dist/commands/plugin.command.d.ts.map +1 -0
  33. package/dist/commands/plugin.command.js +153 -0
  34. package/dist/commands/plugin.command.js.map +1 -0
  35. package/dist/commands/remove.command.d.ts +3 -0
  36. package/dist/commands/remove.command.d.ts.map +1 -0
  37. package/dist/commands/remove.command.js +89 -0
  38. package/dist/commands/remove.command.js.map +1 -0
  39. package/dist/registry/amf-config.d.ts +31 -0
  40. package/dist/registry/amf-config.d.ts.map +1 -0
  41. package/dist/registry/amf-config.js +97 -0
  42. package/dist/registry/amf-config.js.map +1 -0
  43. package/dist/registry/meta-registry.d.ts +105 -0
  44. package/dist/registry/meta-registry.d.ts.map +1 -0
  45. package/dist/registry/meta-registry.js +364 -0
  46. package/dist/registry/meta-registry.js.map +1 -0
  47. package/dist/schematics/app/app.schematic.d.ts +3 -0
  48. package/dist/schematics/app/app.schematic.d.ts.map +1 -0
  49. package/dist/schematics/app/app.schematic.js +149 -0
  50. package/dist/schematics/app/app.schematic.js.map +1 -0
  51. package/dist/schematics/form/form.schematic.d.ts +4 -0
  52. package/dist/schematics/form/form.schematic.d.ts.map +1 -0
  53. package/dist/schematics/form/form.schematic.js +100 -0
  54. package/dist/schematics/form/form.schematic.js.map +1 -0
  55. package/dist/schematics/page/page.schematic.d.ts +3 -0
  56. package/dist/schematics/page/page.schematic.d.ts.map +1 -0
  57. package/dist/schematics/page/page.schematic.js +147 -0
  58. package/dist/schematics/page/page.schematic.js.map +1 -0
  59. package/dist/schematics/table/table.schematic.d.ts +3 -0
  60. package/dist/schematics/table/table.schematic.d.ts.map +1 -0
  61. package/dist/schematics/table/table.schematic.js +58 -0
  62. package/dist/schematics/table/table.schematic.js.map +1 -0
  63. package/dist/types/cli.types.d.ts +104 -0
  64. package/dist/types/cli.types.d.ts.map +1 -0
  65. package/dist/types/cli.types.js +3 -0
  66. package/dist/types/cli.types.js.map +1 -0
  67. package/dist/utils/credentials.d.ts +19 -0
  68. package/dist/utils/credentials.d.ts.map +1 -0
  69. package/dist/utils/credentials.js +99 -0
  70. package/dist/utils/credentials.js.map +1 -0
  71. package/dist/utils/diff.d.ts +11 -0
  72. package/dist/utils/diff.d.ts.map +1 -0
  73. package/dist/utils/diff.js +45 -0
  74. package/dist/utils/diff.js.map +1 -0
  75. package/dist/utils/file-utils.d.ts +11 -0
  76. package/dist/utils/file-utils.d.ts.map +1 -0
  77. package/dist/utils/file-utils.js +30 -0
  78. package/dist/utils/file-utils.js.map +1 -0
  79. package/dist/utils/logger.d.ts +21 -0
  80. package/dist/utils/logger.d.ts.map +1 -0
  81. package/dist/utils/logger.js +63 -0
  82. package/dist/utils/logger.js.map +1 -0
  83. package/dist/utils/prompt.d.ts +8 -0
  84. package/dist/utils/prompt.d.ts.map +1 -0
  85. package/dist/utils/prompt.js +63 -0
  86. package/dist/utils/prompt.js.map +1 -0
  87. package/dist/utils/template-engine.d.ts +9 -0
  88. package/dist/utils/template-engine.d.ts.map +1 -0
  89. package/dist/utils/template-engine.js +23 -0
  90. package/dist/utils/template-engine.js.map +1 -0
  91. package/dist/utils/transaction.d.ts +37 -0
  92. package/dist/utils/transaction.d.ts.map +1 -0
  93. package/dist/utils/transaction.js +94 -0
  94. package/dist/utils/transaction.js.map +1 -0
  95. package/package.json +66 -0
  96. package/templates/app/app.component.ts.ejs +9 -0
  97. package/templates/app/app.config.ts.ejs +27 -0
  98. package/templates/app/app.meta.ts.ejs +58 -0
  99. package/templates/app/app.routes.ts.ejs +9 -0
  100. package/templates/app/dashboard.page.ts.ejs +61 -0
  101. package/templates/form/form.meta.ts.ejs +77 -0
  102. package/templates/page/page.meta.ts.ejs +112 -0
  103. package/templates/table/table.meta.ts.ejs +78 -0
package/README.md ADDED
@@ -0,0 +1,218 @@
1
+ # @avora/cli
2
+
3
+ > Official CLI for the **AvoraMetaForge** Angular meta-framework ecosystem.
4
+
5
+ [![Node.js ≥18](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.8-blue)](https://www.typescriptlang.org/)
7
+ [![ESM Only](https://img.shields.io/badge/module-ESM-yellow)](https://nodejs.org/api/esm.html)
8
+ [![License: UNLICENSED](https://img.shields.io/badge/license-UNLICENSED-red)]()
9
+
10
+ ---
11
+
12
+ ## Overview
13
+
14
+ `@avora/cli` is the developer toolchain for the `@avora/meta-forge` Angular library — a meta-driven framework that generates entire pages, forms, tables, and navigation from TypeScript configuration objects (`AppMeta`).
15
+
16
+ The CLI automates the entire authoring lifecycle:
17
+
18
+ - **Scaffold** new AMF applications (`avora new`)
19
+ - **Generate** meta-driven pages, forms, tables, APIs, and nav items with AST-safe patching
20
+ - **Install** private `@avora/*` packages from GitHub Package Registry
21
+ - **Manage** workspace configuration (`avora.json`)
22
+ - **Create** plugin packages for the ecosystem
23
+
24
+ ---
25
+
26
+ ## Installation
27
+
28
+ ```bash
29
+ # From the GitHub Package Registry (private)
30
+ npm install -g @avora/cli --registry https://npm.pkg.github.com
31
+
32
+ # Or link locally during development
33
+ cd projects/avora-cli
34
+ npm install
35
+ npm run link:cli # builds + npm link → makes `avora` available globally
36
+ ```
37
+
38
+ ---
39
+
40
+ ## Quick Start
41
+
42
+ ### New project
43
+ ```bash
44
+ avora new my-portal # interactive wizard
45
+ avora new my-portal --layout vertical --auth-type jwt
46
+ ```
47
+
48
+ ### Existing Angular workspace
49
+ ```bash
50
+ cd my-angular-workspace
51
+ avora init # detects projects, creates avora.json
52
+ avora info # verify workspace diagnostics
53
+ ```
54
+
55
+ ### Generate schematics
56
+ ```bash
57
+ # Page (with nav + table section)
58
+ avora generate page products \
59
+ --section page-header \
60
+ --section table \
61
+ --guard \
62
+ --nav-group Features \
63
+ --nav-icon package
64
+
65
+ # Form
66
+ avora generate form create-product --layout grid --columns 2
67
+
68
+ # Table
69
+ avora generate table users --columns "name,email,status,createdAt"
70
+
71
+ # API endpoint
72
+ avora generate api list-products --method GET --path /api/products --mock
73
+
74
+ # Nav item only
75
+ avora generate nav-item --label Reports --route /reports --icon bar-chart-2 --group Main
76
+ ```
77
+
78
+ All `generate` commands support `--dry-run` to preview changes before writing:
79
+ ```bash
80
+ avora generate page reports --section table --dry-run
81
+ ```
82
+
83
+ ### Install private packages
84
+ ```bash
85
+ avora add @avora/plugin-charts # prompts for GitHub PAT if not set
86
+ # Set token via env var for CI/CD:
87
+ AVORA_REGISTRY_TOKEN=ghp_... avora add @avora/plugin-charts
88
+ ```
89
+
90
+ ### Configuration
91
+ ```bash
92
+ avora config # list all config
93
+ avora config defaultLayout horizontal
94
+ avora config registry.url https://npm.pkg.github.com
95
+ ```
96
+
97
+ ### Workspace info
98
+ ```bash
99
+ avora info
100
+ # ┌────────────────────────────────────────────────┐
101
+ # │ AvoraMetaForge Workspace Info │
102
+ # ├────────────────────────────────────────────────┤
103
+ # │ CLI Version: 1.0.0 │
104
+ # │ Pages registered: 12 │
105
+ # │ API endpoints: 8 │
106
+ # │ Navigation items: 11 │
107
+ # └────────────────────────────────────────────────┘
108
+ ```
109
+
110
+ ---
111
+
112
+ ## Commands
113
+
114
+ | Command | Description |
115
+ |---|---|
116
+ | `avora new <name>` | Scaffold a new AMF application |
117
+ | `avora init` | Initialize AMF in an existing Angular workspace |
118
+ | `avora generate\|g page [name]` | Generate a meta-driven page |
119
+ | `avora generate\|g form [name]` | Generate a standalone FormMeta |
120
+ | `avora generate\|g table [name]` | Generate a standalone TableMeta |
121
+ | `avora generate\|g api [id]` | Add an API endpoint to `app.meta.ts` |
122
+ | `avora generate\|g nav-item` | Add a navigation item |
123
+ | `avora add <package>` | Install a private `@avora/*` package |
124
+ | `avora config [key] [value]` | Read/write `avora.json` |
125
+ | `avora plugin create [name]` | Scaffold a new plugin package |
126
+ | `avora plugin list` | List registered plugins |
127
+ | `avora info` | Display workspace diagnostics |
128
+
129
+ ---
130
+
131
+ ## Architecture
132
+
133
+ ```
134
+ src/
135
+ ├── cli.ts # Root Commander program
136
+ ├── types/cli.types.ts # All interfaces & option types
137
+ ├── registry/
138
+ │ ├── meta-registry.ts # ts-morph AST patcher for app.meta.ts
139
+ │ └── amf-config.ts # avora.json read/write + workspace detection
140
+ ├── schematics/
141
+ │ ├── app/ # avora new
142
+ │ ├── page/ # avora generate page
143
+ │ ├── form/ # avora generate form
144
+ │ └── table/ # avora generate table
145
+ ├── commands/ # One file per command
146
+ └── utils/
147
+ ├── transaction.ts # Atomic file writes with rollback
148
+ ├── credentials.ts # AES-256-GCM token store (~/.avora/)
149
+ ├── diff.ts # Colored unified diff for --dry-run
150
+ ├── logger.ts # Angular CLI-style output
151
+ ├── prompt.ts # @inquirer/prompts wrappers
152
+ ├── template-engine.ts # EJS template renderer
153
+ └── file-utils.ts # Naming convention converters
154
+ templates/
155
+ ├── app/ # avora new scaffold templates
156
+ ├── page/page.meta.ts.ejs # PageMeta — all section types
157
+ ├── form/form.meta.ts.ejs # FormMeta — stepper, grid, actions
158
+ └── table/table.meta.ts.ejs # TableMeta — columns, actions, pagination
159
+ ```
160
+
161
+ ### Key design decisions
162
+
163
+ - **Full ESM** — `"type": "module"`, `moduleResolution: NodeNext`, `@inquirer/prompts`
164
+ - **AST patching** — `ts-morph` manipulates `app.meta.ts` instead of regex replace. CRLF-aware, single-quote style, trailing-comma aware.
165
+ - **Atomic writes** — `FileTransaction` snapshots each file before writing; any failure triggers automatic rollback.
166
+ - **Dry-run everywhere** — All generate commands show a colored unified diff before touching any file.
167
+ - **CI-friendly** — Every interactive prompt has a flag equivalent; `AVORA_REGISTRY_TOKEN` env var skips credential prompts.
168
+
169
+ ---
170
+
171
+ ## Development
172
+
173
+ ```bash
174
+ npm install
175
+ npm run build # tsc → dist/
176
+ npm run build:watch # watch mode
177
+ npm run link:cli # build + npm link (makes `avora` global)
178
+
179
+ # Test against the workspace
180
+ npm run test:info
181
+ npm run test:dry-run
182
+ ```
183
+
184
+ ---
185
+
186
+ ## Workspace config (`avora.json`)
187
+
188
+ Created at the workspace root by `avora new` or `avora init`:
189
+
190
+ ```json
191
+ {
192
+ "version": "1.0.0",
193
+ "projectType": "application",
194
+ "library": "@avora/meta-forge",
195
+ "libraryVersion": "1.0.0",
196
+ "paths": {
197
+ "metaFile": "src/app/app.meta.ts",
198
+ "pagesDir": "src/app/pages",
199
+ "appConfig": "src/app/app.config.ts",
200
+ "appRoutesFile": "src/app/app.routes.ts"
201
+ },
202
+ "defaultLayout": "vertical",
203
+ "registry": {
204
+ "type": "github",
205
+ "org": "AvoraLabs",
206
+ "scope": "@avora",
207
+ "url": "https://npm.pkg.github.com",
208
+ "privateRepo": true
209
+ },
210
+ "plugins": []
211
+ }
212
+ ```
213
+
214
+ ---
215
+
216
+ ## License
217
+
218
+ UNLICENSED — Private, AvoraLabs internal tooling.
package/bin/avora.mjs ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import('../dist/cli.js').catch((err) => {
3
+ console.error('Fatal: could not load @avora/cli runtime.\nRun `npm run build` first.\n', err.message);
4
+ process.exit(1);
5
+ });
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,64 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { createRequire } from 'node:module';
4
+ const require = createRequire(import.meta.url);
5
+ const { version } = require('../package.json');
6
+ import { registerNewCommand } from './commands/new.command.js';
7
+ import { registerInitCommand } from './commands/init.command.js';
8
+ import { registerGenerateCommand } from './commands/generate.command.js';
9
+ import { registerAddCommand } from './commands/add.command.js';
10
+ import { registerConfigCommand } from './commands/config.command.js';
11
+ import { registerPluginCommand } from './commands/plugin.command.js';
12
+ import { registerInfoCommand } from './commands/info.command.js';
13
+ import { registerRemoveCommand } from './commands/remove.command.js';
14
+ const program = new Command();
15
+ // ─── Program metadata ─────────────────────────────────────────────────────────
16
+ program
17
+ .name('avora')
18
+ .description(chalk.bold.cyan('AvoraMetaForge CLI') + '\n' +
19
+ chalk.dim(' Build meta-driven Angular apps with confidence.'))
20
+ .version(version, '-v, --version', 'Output the current CLI version')
21
+ .helpOption('-h, --help', 'Show help')
22
+ .addHelpText('after', `
23
+ ${chalk.bold('Examples:')}
24
+ ${chalk.cyan('avora new')} my-portal ${chalk.dim('# Scaffold a new AMF app')}
25
+ ${chalk.cyan('avora generate page')} products ${chalk.dim('# Generate a page')}
26
+ ${chalk.cyan('avora generate page')} products ${chalk.dim('--section table --section page-header')}
27
+ ${chalk.cyan('avora generate form')} create-product ${chalk.dim('# Generate a FormMeta')}
28
+ ${chalk.cyan('avora generate table')} users ${chalk.dim('--columns "name,email,status"')}
29
+ ${chalk.cyan('avora generate api')} list-products ${chalk.dim('--method GET --path /api/products')}
30
+ ${chalk.cyan('avora generate nav-item')} ${chalk.dim('--label Products --route /products --icon package')}
31
+ ${chalk.cyan('avora del')} invoices ${chalk.dim('# Remove the generated invoices page')}
32
+ ${chalk.cyan('avora add')} @avora/plugin-charts ${chalk.dim('# Install private package')}
33
+ ${chalk.cyan('avora plugin create')} my-widget ${chalk.dim('# Scaffold a new plugin')}
34
+ ${chalk.cyan('avora config')} defaultLayout horizontal ${chalk.dim('# Update avora.json')}
35
+ ${chalk.cyan('avora info')} ${chalk.dim('# Workspace diagnostics')}
36
+
37
+ ${chalk.bold('Aliases:')}
38
+ ${chalk.cyan('g')} → generate (e.g. avora g page products)
39
+
40
+ ${chalk.bold('Dry-run:')}
41
+ All generate commands support ${chalk.cyan('--dry-run')} to preview changes before writing.
42
+ `);
43
+ // ─── Register commands ────────────────────────────────────────────────────────
44
+ registerNewCommand(program);
45
+ registerInitCommand(program);
46
+ registerGenerateCommand(program);
47
+ registerAddCommand(program);
48
+ registerConfigCommand(program);
49
+ registerPluginCommand(program);
50
+ registerInfoCommand(program, version);
51
+ registerRemoveCommand(program);
52
+ // ─── Unknown command handler ──────────────────────────────────────────────────
53
+ program.on('command:*', (cmds) => {
54
+ console.error(chalk.red(`\n Unknown command: ${cmds[0]}\n`));
55
+ console.error(` Run ${chalk.cyan('avora --help')} to see all available commands.\n`);
56
+ process.exit(1);
57
+ });
58
+ // ─── Parse ────────────────────────────────────────────────────────────────────
59
+ program.parseAsync(process.argv).catch((err) => {
60
+ const message = err instanceof Error ? err.message : String(err);
61
+ console.error(chalk.red('\n Fatal error: ') + message + '\n');
62
+ process.exit(1);
63
+ });
64
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAW,2BAA2B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAU,4BAA4B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAW,2BAA2B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAQ,8BAA8B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAQ,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAU,4BAA4B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAQ,8BAA8B,CAAC;AAEvE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,iFAAiF;AACjF,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CACV,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAC5C,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAC/D;KACA,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,gCAAgC,CAAC;KACnE,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC;KACrC,WAAW,CAAC,OAAO,EAAE;EACtB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,sCAAsC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAClG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,2BAA2B,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC1F,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,2BAA2B,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC9F,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC;IACtF,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC;IACvG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,sCAAsC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC;IAC9G,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,qCAAqC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAClG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,2BAA2B,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,kCAAkC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC5F,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qCAAqC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC;;EAEnG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;EAEjB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;kCACU,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;GACtD,CAAC,CAAC;AAEL,iFAAiF;AACjF,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,iFAAiF;AACjF,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAc,EAAE,EAAE;IACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,iFAAiF;AACjF,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAddCommand(program: Command): void;
3
+ //# sourceMappingURL=add.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.command.d.ts","sourceRoot":"","sources":["../../src/commands/add.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuBzD"}
@@ -0,0 +1,83 @@
1
+ import { execa } from 'execa';
2
+ import fsExtra from 'fs-extra';
3
+ const { writeFile, pathExists, readFile } = fsExtra;
4
+ import { join } from 'node:path';
5
+ import { findWorkspaceRoot, loadConfig, saveConfig } from '../registry/amf-config.js';
6
+ import { logger } from '../utils/logger.js';
7
+ import { resolveRegistryToken, setCredential } from '../utils/credentials.js';
8
+ import { password } from '../utils/prompt.js';
9
+ export function registerAddCommand(program) {
10
+ program
11
+ .command('add <package>')
12
+ .description('Install a private @avora-labs/* package from the configured registry')
13
+ .option('--registry <url>', 'Override registry URL')
14
+ .option('--token <token>', 'Auth token (prefer AVORA_REGISTRY_TOKEN env var)')
15
+ .option('--save-token', 'Save token to ~/.avora/credentials', false)
16
+ .option('--dry-run', 'Preview install without running npm')
17
+ .action(async (pkg, opts) => {
18
+ const root = await findWorkspaceRoot();
19
+ if (!root) {
20
+ logger.error('Not inside an AvoraMetaForge workspace.');
21
+ process.exit(1);
22
+ }
23
+ const config = await loadConfig(root);
24
+ try {
25
+ await addPackage(root, config, pkg, opts);
26
+ }
27
+ catch (err) {
28
+ logger.error('Failed to install package.', err);
29
+ process.exit(1);
30
+ }
31
+ });
32
+ }
33
+ async function addPackage(root, config, pkg, opts) {
34
+ const registryUrl = opts['registry'] ??
35
+ config.registry?.url ?? 'https://npm.pkg.github.com';
36
+ const scope = pkg.startsWith('@') ? pkg.split('/')[0] : '@avora';
37
+ // ── Resolve auth token ────────────────────────────────────────────────────
38
+ let token = opts['token'] ?? await resolveRegistryToken(scope);
39
+ if (!token) {
40
+ logger.warning('No registry token found for scope ' + scope);
41
+ logger.info(` Set env var AVORA_REGISTRY_TOKEN, or enter it below.`);
42
+ token = await password({ message: 'GitHub PAT / registry token:' });
43
+ if (opts['saveToken']) {
44
+ await setCredential(`registry-token-${scope}`, token);
45
+ logger.success('Token saved to ~/.avora/credentials');
46
+ }
47
+ }
48
+ // ── Ensure .npmrc ─────────────────────────────────────────────────────────
49
+ const npmrcPath = join(root, '.npmrc');
50
+ const npmrcLine = `${scope}:registry=${registryUrl}\n//${registryUrl.replace('https://', '')}/:_authToken=${token}\n`;
51
+ if (!(await pathExists(npmrcPath))) {
52
+ await writeFile(npmrcPath, npmrcLine, 'utf-8');
53
+ logger.create(npmrcPath);
54
+ }
55
+ else {
56
+ const existing = await readFile(npmrcPath, 'utf-8');
57
+ if (!existing.includes(registryUrl)) {
58
+ await writeFile(npmrcPath, existing + '\n' + npmrcLine, 'utf-8');
59
+ logger.update(npmrcPath, 'registry entry added');
60
+ }
61
+ }
62
+ if (opts['dryRun']) {
63
+ logger.nl();
64
+ logger.info(`[DRY-RUN] Would run: npm install ${pkg} --registry ${registryUrl}`);
65
+ logger.info('Run without --dry-run to install.');
66
+ return;
67
+ }
68
+ // ── npm install ───────────────────────────────────────────────────────────
69
+ logger.info(`Installing ${pkg} from ${registryUrl}…`);
70
+ await execa('npm', ['install', pkg, `--registry=${registryUrl}`], { cwd: root, stdio: 'inherit' });
71
+ // ── Auto-register if it's an @avora/plugin-* ─────────────────────────────
72
+ if (pkg.includes('plugin')) {
73
+ if (!(config.plugins ?? []).includes(pkg)) {
74
+ config.plugins = [...(config.plugins ?? []), pkg];
75
+ await saveConfig(root, config);
76
+ logger.update('avora.json', `${pkg} added to plugins`);
77
+ logger.info(` Remember to import and register "${pkg}" in your app.meta.ts plugins[] array.`);
78
+ }
79
+ }
80
+ logger.nl();
81
+ logger.success(`${pkg} installed successfully!`);
82
+ }
83
+ //# sourceMappingURL=add.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.command.js","sourceRoot":"","sources":["../../src/commands/add.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerConfigCommand(program: Command): void;
3
+ //# sourceMappingURL=config.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.command.d.ts","sourceRoot":"","sources":["../../src/commands/config.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC5D"}
@@ -0,0 +1,71 @@
1
+ import { findWorkspaceRoot, loadConfig, saveConfig } from '../registry/amf-config.js';
2
+ import { logger } from '../utils/logger.js';
3
+ export function registerConfigCommand(program) {
4
+ program
5
+ .command('config [key] [value]')
6
+ .description('Read or write AvoraMetaForge config.\n' +
7
+ ' Keys: defaultLayout, registry.url, app.name, auth.type\n' +
8
+ ' Example: avora config defaultLayout horizontal')
9
+ .option('--list', 'List all current config values')
10
+ .action(async (key, value, opts) => {
11
+ const root = await findWorkspaceRoot();
12
+ if (!root) {
13
+ logger.error('Not inside an AvoraMetaForge workspace.');
14
+ process.exit(1);
15
+ }
16
+ const config = await loadConfig(root);
17
+ try {
18
+ if (opts['list'] || !key) {
19
+ printConfig(config);
20
+ return;
21
+ }
22
+ if (!value) {
23
+ const current = getNestedValue(config, key);
24
+ logger.info(`${key} = ${JSON.stringify(current)}`);
25
+ return;
26
+ }
27
+ setNestedValue(config, key, coerce(value));
28
+ await saveConfig(root, config);
29
+ logger.success(`${key} set to: ${value}`);
30
+ }
31
+ catch (err) {
32
+ logger.error('Config operation failed.', err);
33
+ process.exit(1);
34
+ }
35
+ });
36
+ }
37
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
38
+ function getNestedValue(obj, key) {
39
+ return key.split('.').reduce((acc, part) => {
40
+ if (acc && typeof acc === 'object')
41
+ return acc[part];
42
+ return undefined;
43
+ }, obj);
44
+ }
45
+ function setNestedValue(obj, key, value) {
46
+ const parts = key.split('.');
47
+ const last = parts.pop();
48
+ const target = parts.reduce((acc, part) => {
49
+ if (!acc[part] || typeof acc[part] !== 'object')
50
+ acc[part] = {};
51
+ return acc[part];
52
+ }, obj);
53
+ target[last] = value;
54
+ }
55
+ /** Coerce string values to appropriate types */
56
+ function coerce(value) {
57
+ if (value === 'true')
58
+ return true;
59
+ if (value === 'false')
60
+ return false;
61
+ if (!isNaN(Number(value)))
62
+ return Number(value);
63
+ return value;
64
+ }
65
+ function printConfig(config) {
66
+ logger.nl();
67
+ logger.header('Current avora.json Config');
68
+ console.log(JSON.stringify(config, null, 2));
69
+ logger.nl();
70
+ }
71
+ //# sourceMappingURL=config.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.command.js","sourceRoot":"","sources":["../../src/commands/config.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerGenerateCommand(program: Command): void;
3
+ //# sourceMappingURL=generate.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.command.d.ts","sourceRoot":"","sources":["../../src/commands/generate.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgDzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8G9D"}