r2pde-ai 0.1.4 → 0.1.6

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.
@@ -1,3 +1,12 @@
1
+ # Scaffold
2
+
3
+ O comando `scaffold-create` exige o parâmetro `--guide <yaml>`, que deve apontar para um arquivo YAML na raiz do projeto. O comando `init` copia automaticamente um `scaffold.yaml` de exemplo para a raiz do projeto.
4
+
5
+ Exemplo:
6
+
7
+ ```sh
8
+ r2pde-ai scaffold-create --guide ./scaffold.yaml
9
+ ```
1
10
  # Corporate Agenda Quickstart Guide
2
11
 
3
12
  > **Build a Professional Corporate Agenda App with User Management and Calendar Sync (Outlook & Google) using r2pde-ai**
package/README.md CHANGED
@@ -401,13 +401,22 @@ See [LICENSE](./LICENSE) for full terms.
401
401
  Você pode gerar automaticamente um projeto de exemplo baseado no arquivo de guia (por padrão ONBOARDING-QUICKSTART.md) usando:
402
402
 
403
403
  ```bash
404
- r2pde-ai scaffold-from-guide
404
+ r2pde-ai scaffold-create --guide ./scaffold.yaml
405
405
  ```
406
406
 
407
407
  Ou especificar um guia e pasta de destino personalizados:
408
408
 
409
409
  ```bash
410
- r2pde-ai scaffold-from-guide --guide ./meu-guia.md --dest ./meu-projeto-exemplo
410
+ r2pde-ai scaffold-create --guide ./meu-guia.yaml
411
+ ## Scaffold
412
+
413
+ O comando `scaffold-create` agora exige explicitamente o parâmetro `--guide <yaml>`, que deve apontar para um arquivo YAML na raiz do projeto. O comando `init` copia automaticamente um `scaffold.yaml` de exemplo para a raiz do projeto. Edite esse arquivo conforme necessário para gerar scaffolds customizados.
414
+
415
+ Exemplo de uso:
416
+
417
+ ```sh
418
+ r2pde-ai scaffold-create --guide ./scaffold.yaml
419
+ ```
411
420
  ```
412
421
 
413
422
  Isso executa todos os comandos do guia, preenchendo automaticamente os prompts, e gera uma estrutura pronta para testes, onboarding ou demonstração.
@@ -167,8 +167,7 @@ export async function initCommand() {
167
167
  - r2pde-ai: 0.1.0
168
168
  `;
169
169
  fs.writeFileSync(paths.index, indexContent, { encoding: 'utf8' });
170
- // Step 6 Copy templates
171
- // Corrigir caminho dos templates para dist/templates
170
+ // Step 6 Copy templates and scaffold.yaml to project root
172
171
  const templateFiles = [
173
172
  { src: path.resolve(__dirname, '../../templates/manifest.template.md'), dest: path.resolve(paths.templates, 'manifest.template.md') },
174
173
  { src: path.resolve(__dirname, '../../templates/contract.template.md'), dest: path.resolve(paths.templates, 'contract.template.md') },
@@ -177,6 +176,19 @@ export async function initCommand() {
177
176
  for (const { src, dest } of templateFiles) {
178
177
  fs.copyFileSync(src, dest);
179
178
  }
179
+ // Copy scaffold.yaml from dist/templates (if built) or templates (dev) to project root
180
+ let scaffoldSrc = path.resolve(__dirname, '../../dist/templates/scaffold.yaml');
181
+ if (!fs.existsSync(scaffoldSrc)) {
182
+ scaffoldSrc = path.resolve(__dirname, '../../templates/scaffold.yaml');
183
+ }
184
+ const scaffoldDest = path.resolve(cwd, 'scaffold.yaml');
185
+ if (!fs.existsSync(scaffoldDest)) {
186
+ fs.copyFileSync(scaffoldSrc, scaffoldDest);
187
+ logInfo('Arquivo scaffold.yaml copiado para a raiz do projeto. Edite conforme necessário para usar o scaffold-create.');
188
+ }
189
+ else {
190
+ logWarn('Arquivo scaffold.yaml já existe na raiz do projeto. Não sobrescrito.');
191
+ }
180
192
  const guideContent = [
181
193
  '# r2pde-ai GUIDE',
182
194
  '',
@@ -102,6 +102,21 @@ async function scaffoldCreateHandler(opts) {
102
102
  }
103
103
  }
104
104
  }
105
+ // Copiar a pasta dist do projeto original para o scaffold gerado
106
+ try {
107
+ const sourceDist = path.resolve(__dirname, '../../dist');
108
+ const targetDist = path.join(cwd, 'dist');
109
+ if (fs.existsSync(sourceDist)) {
110
+ copyFolderRecursiveSync(sourceDist, targetDist);
111
+ logSuccess('Pasta dist copiada para o scaffold gerado.');
112
+ }
113
+ else {
114
+ logWarn('Pasta dist não encontrada para copiar.');
115
+ }
116
+ }
117
+ catch (err) {
118
+ logError('Erro ao copiar pasta dist: ' + err);
119
+ }
105
120
  if (!hasCriticalError) {
106
121
  logSuccess('Scaffold concluído com sucesso!');
107
122
  }
@@ -109,30 +124,35 @@ async function scaffoldCreateHandler(opts) {
109
124
  logError('Scaffold finalizado com erros críticos. Revise as mensagens acima.');
110
125
  }
111
126
  }
112
- export const scaffoldCreateCommand = new Command('scaffold-create')
113
- .description('Gera um projeto de exemplo a partir de um arquivo de guia YAML')
114
- .option('--guide <yaml>', 'Caminho para o arquivo de guia YAML (busca automática se não especificado)')
115
- .action((opts) => {
116
- const candidates = [];
117
- if (opts.guide) {
118
- candidates.push(path.resolve(opts.guide));
127
+ // Função utilitária para cópia recursiva de pastas
128
+ function copyFolderRecursiveSync(source, target) {
129
+ if (!fs.existsSync(target)) {
130
+ fs.mkdirSync(target, { recursive: true });
119
131
  }
120
- else {
121
- // Caminho relativo ao CLI instalado globalmente
122
- let cliDir = path.dirname(new URL(import.meta.url).pathname);
123
- if (process.platform === 'win32' && cliDir.startsWith('/')) {
124
- cliDir = cliDir.slice(1);
132
+ if (fs.lstatSync(source).isDirectory()) {
133
+ const files = fs.readdirSync(source);
134
+ for (const file of files) {
135
+ const curSource = path.join(source, file);
136
+ const curTarget = path.join(target, file);
137
+ if (fs.lstatSync(curSource).isDirectory()) {
138
+ copyFolderRecursiveSync(curSource, curTarget);
139
+ }
140
+ else {
141
+ fs.copyFileSync(curSource, curTarget);
142
+ }
125
143
  }
126
- candidates.push(path.resolve(process.cwd(), 'scaffold-guide.yaml'), path.resolve(cliDir, '../../scaffold-guide.yaml'), path.resolve(cliDir, '../scaffold-guide.yaml'));
127
144
  }
128
- const foundPath = candidates.find(f => f && fs.existsSync(f));
129
- if (!foundPath) {
130
- console.error('Arquivo scaffold-guide.yaml não encontrado em nenhum local padrão. Caminhos testados:');
131
- candidates.forEach(f => console.error(' - ' + f));
145
+ }
146
+ export const scaffoldCreateCommand = new Command('scaffold-create')
147
+ .description('Gera um projeto de exemplo a partir de um arquivo de guia YAML. Se --guide não for informado, será usado ./scaffold.yaml da raiz do projeto.')
148
+ .option('--guide <yaml>', 'Caminho para o arquivo de guia YAML (opcional, padrão: ./scaffold.yaml na raiz do projeto)')
149
+ .action((opts) => {
150
+ let guidePath = opts.guide ? path.resolve(opts.guide) : path.resolve(process.cwd(), 'scaffold.yaml');
151
+ if (!fs.existsSync(guidePath)) {
152
+ console.error('Arquivo YAML não encontrado: ' + guidePath + '\nInforme --guide <yaml> ou rode o comando init para gerar um scaffold.yaml de exemplo.');
132
153
  process.exit(1);
133
154
  }
134
- opts.guide = foundPath;
135
- scaffoldCreateHandler(opts).catch((err) => {
155
+ scaffoldCreateHandler({ guide: guidePath }).catch((err) => {
136
156
  console.error(err);
137
157
  process.exit(1);
138
158
  });
@@ -0,0 +1,26 @@
1
+ project:
2
+ name: Example Project
3
+ root: scaffold_done
4
+ description: |
5
+ Example YAML for r2pde-ai scaffold. Replace with your project details.
6
+ steps:
7
+ - type: mkdir
8
+ path: .r2pde-ai
9
+ comment: Create config folder.
10
+ - type: cli
11
+ command: npm init -y
12
+ comment: Initialize npm.
13
+ - type: git-init
14
+ comment: Initialize git repo.
15
+ - type: cli
16
+ command: npx r2pde-ai init
17
+ answers:
18
+ - Example Project
19
+ - Micro SaaS
20
+ - Monolith
21
+ - Clean Code
22
+ - MVP
23
+ - English
24
+ comment: Run r2pde-ai init with defaults.
25
+ files:
26
+ - README.md
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "r2pde-ai",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Pilot Driven Engineering — A CLI framework that bridges the gap between architectural intent and AI-generated code.",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -44,6 +44,7 @@
44
44
  },
45
45
  "files": [
46
46
  "dist",
47
+ "templates",
47
48
  "README.md",
48
49
  "LICENSE",
49
50
  "CHANGELOG.md",
@@ -0,0 +1,13 @@
1
+ # Contract: {{name}}
2
+
3
+ ## Description
4
+ {{description}}
5
+
6
+ ## Details
7
+ - Owner: {{owner}}
8
+ - Date: {{date}}
9
+
10
+ ---
11
+
12
+ ## Terms
13
+ {{terms}}
@@ -0,0 +1,13 @@
1
+ # Manifest: {{name}}
2
+
3
+ ## Purpose
4
+ {{purpose}}
5
+
6
+ ## Scope
7
+ {{scope}}
8
+
9
+ ---
10
+
11
+ ## Metadata
12
+ - Created: {{date}}
13
+ - Author: {{author}}
@@ -0,0 +1,12 @@
1
+ # Requirement: {{name}}
2
+
3
+ ## Description
4
+ {{description}}
5
+
6
+ ## Acceptance Criteria
7
+ - [ ] {{criteria}}
8
+
9
+ ---
10
+
11
+ ## Notes
12
+ {{notes}}
@@ -0,0 +1,26 @@
1
+ project:
2
+ name: Example Project
3
+ root: scaffold_done
4
+ description: |
5
+ Example YAML for r2pde-ai scaffold. Replace with your project details.
6
+ steps:
7
+ - type: mkdir
8
+ path: .r2pde-ai
9
+ comment: Create config folder.
10
+ - type: cli
11
+ command: npm init -y
12
+ comment: Initialize npm.
13
+ - type: git-init
14
+ comment: Initialize git repo.
15
+ - type: cli
16
+ command: npx r2pde-ai init
17
+ answers:
18
+ - Example Project
19
+ - Micro SaaS
20
+ - Monolith
21
+ - Clean Code
22
+ - MVP
23
+ - English
24
+ comment: Run r2pde-ai init with defaults.
25
+ files:
26
+ - README.md