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.
- package/ONBOARDING-QUICKSTART.md +9 -0
- package/README.md +11 -2
- package/dist/src/commands/init.js +14 -2
- package/dist/src/commands/scaffold-create.js +39 -19
- package/dist/templates/scaffold.yaml +26 -0
- package/package.json +2 -1
- package/templates/contract.template.md +13 -0
- package/templates/manifest.template.md +13 -0
- package/templates/requirement.template.md +12 -0
- package/templates/scaffold.yaml +26 -0
package/ONBOARDING-QUICKSTART.md
CHANGED
|
@@ -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-
|
|
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-
|
|
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
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
.
|
|
115
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
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.
|
|
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,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
|