multi-agents-cli 1.1.9 → 1.1.10
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/README.md +18 -2
- package/core/templates/.agents/backend/API.md +270 -0
- package/core/templates/.agents/backend/AUTH.md +257 -0
- package/core/templates/.agents/backend/DB.md +268 -0
- package/core/templates/.agents/backend/EVENTS.md +264 -0
- package/core/templates/.agents/backend/INIT.md +250 -0
- package/core/templates/.agents/backend/JOBS.md +267 -0
- package/core/templates/.agents/backend/LOGIC.md +302 -0
- package/core/templates/.agents/backend/TESTING.md +277 -0
- package/core/templates/.agents/client/ACCESSIBILITY.md +277 -0
- package/core/templates/.agents/client/FORMS.md +245 -0
- package/core/templates/.agents/client/LOGIC.md +288 -0
- package/core/templates/.agents/client/ROUTING.md +246 -0
- package/core/templates/.agents/client/TESTING.md +252 -0
- package/core/templates/.agents/client/UI.md +237 -0
- package/core/templates/.agents/shared/CLOUD.md +229 -0
- package/core/templates/.agents/shared/CLOUD_TEARDOWN.md +158 -0
- package/core/templates/.agents/shared/SECURITY.md +297 -0
- package/core/templates/.frameworks/backend/django.md +55 -0
- package/core/templates/.frameworks/backend/express.md +74 -0
- package/core/templates/.frameworks/backend/fastapi.md +107 -0
- package/core/templates/.frameworks/backend/fastify.md +74 -0
- package/core/templates/.frameworks/backend/laravel.md +79 -0
- package/core/templates/.frameworks/backend/nestjs.md +75 -0
- package/core/templates/.frameworks/backend/rails.md +84 -0
- package/core/templates/.frameworks/client/angular.md +80 -0
- package/core/templates/.frameworks/client/nextjs.md +47 -0
- package/core/templates/.frameworks/client/nuxt.md +45 -0
- package/core/templates/.frameworks/client/remix.md +44 -0
- package/core/templates/.frameworks/client/sveltekit.md +44 -0
- package/core/templates/.frameworks/client/vite-react.md +45 -0
- package/core/templates/CLAUDE.md +562 -0
- package/core/templates/CONTRACTS.md +16 -0
- package/core/templates/backend/CLAUDE.md +207 -0
- package/core/templates/client/CLAUDE.md +213 -0
- package/core/workflow/agent.js +285 -6
- package/core/workflow/complete.js +141 -5
- package/core/workflow/reset.js +28 -21
- package/core/workflow/run.js +3 -0
- package/init.js +2 -2
- package/lib/questions-flow.js +13 -2
- package/lib/steps.js +13 -1
- package/lib/ui.js +8 -0
- package/package.json +1 -1
package/lib/questions-flow.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// ── Imports ───────────────────────────────────────────────────────────────────
|
|
4
4
|
|
|
5
|
-
const { dim, bold, blue, green, cyan, separator, arrowSelect, arrowConfirm, selectRequired, selectOptional } = require('./ui');
|
|
5
|
+
const { dim, bold, blue, green, cyan, separator, arrowSelect, arrowConfirm, selectRequired, selectOptional, stepHeader } = require('./ui');
|
|
6
6
|
const { BACK, RESTART } = require('./steps');
|
|
7
7
|
const {
|
|
8
8
|
CLIENT_FRAMEWORKS, BACKEND_FRAMEWORKS, FRAMEWORK_VERSION_FALLBACK,
|
|
@@ -21,6 +21,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
21
21
|
{
|
|
22
22
|
name: 'clientFw',
|
|
23
23
|
run: async (machine, answers) => {
|
|
24
|
+
stepHeader(1, 12);
|
|
24
25
|
console.log(`\n${bold(blue('Client configuration'))}`);
|
|
25
26
|
return await selectRequired('* Client framework (required):', CLIENT_FRAMEWORKS, machine, 0);
|
|
26
27
|
},
|
|
@@ -30,6 +31,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
30
31
|
{
|
|
31
32
|
name: 'clientFwVersion',
|
|
32
33
|
run: async (machine, answers) => {
|
|
34
|
+
stepHeader(2, 12);
|
|
33
35
|
const fw = answers.clientFw;
|
|
34
36
|
const versions = await fetchLatestVersions(fw.value) || FRAMEWORK_VERSION_FALLBACK[fw.value] || [];
|
|
35
37
|
if (!versions.length) return null; // skip silently
|
|
@@ -56,6 +58,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
56
58
|
{
|
|
57
59
|
name: 'clientState',
|
|
58
60
|
run: async (machine, answers) => {
|
|
61
|
+
stepHeader(3, 12);
|
|
59
62
|
const opts = STATE_OPTIONS[answers.clientFw.value] || [];
|
|
60
63
|
return await selectOptional('State management:', opts, machine, 2);
|
|
61
64
|
},
|
|
@@ -65,6 +68,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
65
68
|
{
|
|
66
69
|
name: 'clientUi',
|
|
67
70
|
run: async (machine, answers) => {
|
|
71
|
+
stepHeader(4, 12);
|
|
68
72
|
const opts = UI_OPTIONS[answers.clientFw.value] || [];
|
|
69
73
|
return await selectOptional('UI library:', opts, machine, 3);
|
|
70
74
|
},
|
|
@@ -74,6 +78,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
74
78
|
{
|
|
75
79
|
name: 'clientStyle',
|
|
76
80
|
run: async (machine, answers) => {
|
|
81
|
+
stepHeader(5, 12);
|
|
77
82
|
return await selectOptional('Styling:', STYLING_OPTIONS, machine, 4);
|
|
78
83
|
},
|
|
79
84
|
},
|
|
@@ -82,6 +87,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
82
87
|
{
|
|
83
88
|
name: 'useIntegratedBackend',
|
|
84
89
|
run: async (machine, answers) => {
|
|
90
|
+
stepHeader(6, 12);
|
|
85
91
|
const fw = answers.clientFw;
|
|
86
92
|
if (!fw.integratedBackend) return false; // skip — not applicable
|
|
87
93
|
|
|
@@ -98,6 +104,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
98
104
|
{
|
|
99
105
|
name: 'backendFwObj',
|
|
100
106
|
run: async (machine, answers) => {
|
|
107
|
+
stepHeader(7, 12);
|
|
101
108
|
if (answers.useIntegratedBackend) return null; // skip
|
|
102
109
|
|
|
103
110
|
separator();
|
|
@@ -121,6 +128,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
121
128
|
{
|
|
122
129
|
name: 'backendFwVersion',
|
|
123
130
|
run: async (machine, answers) => {
|
|
131
|
+
stepHeader(8, 12);
|
|
124
132
|
const fwObj = answers.backendFwObj;
|
|
125
133
|
if (!fwObj) return null; // skip — no backend selected
|
|
126
134
|
|
|
@@ -147,6 +155,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
147
155
|
{
|
|
148
156
|
name: 'backendDb',
|
|
149
157
|
run: async (machine, answers) => {
|
|
158
|
+
stepHeader(9, 12);
|
|
150
159
|
if (!answers.backendFwObj) return null;
|
|
151
160
|
return await selectOptional('Database type:', DB_OPTIONS, machine, 8);
|
|
152
161
|
},
|
|
@@ -156,6 +165,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
156
165
|
{
|
|
157
166
|
name: 'backendOrm',
|
|
158
167
|
run: async (machine, answers) => {
|
|
168
|
+
stepHeader(10, 12);
|
|
159
169
|
const { backendFwObj, backendDb } = answers;
|
|
160
170
|
if (!backendFwObj || !backendDb) return null;
|
|
161
171
|
const ormChoices = ORM_OPTIONS_BY_DB[backendDb] || ORM_OPTIONS[backendFwObj.value] || [];
|
|
@@ -167,6 +177,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
167
177
|
{
|
|
168
178
|
name: 'backendAuth',
|
|
169
179
|
run: async (machine, answers) => {
|
|
180
|
+
stepHeader(11, 12);
|
|
170
181
|
const { backendFwObj } = answers;
|
|
171
182
|
if (!backendFwObj) return null;
|
|
172
183
|
return await selectOptional('Auth strategy:', AUTH_OPTIONS[backendFwObj.value] || [], machine, 10);
|
|
@@ -177,6 +188,7 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
177
188
|
{
|
|
178
189
|
name: 'ideChoice',
|
|
179
190
|
run: async (machine, answers) => {
|
|
191
|
+
stepHeader(12, 12);
|
|
180
192
|
separator();
|
|
181
193
|
console.log(`\n${bold(blue('Environment'))}`);
|
|
182
194
|
|
|
@@ -186,7 +198,6 @@ const buildStepDefs = (IDE_CANDIDATES) => [
|
|
|
186
198
|
|
|
187
199
|
const ideOptions = buildIDEOptions(IDE_CANDIDATES);
|
|
188
200
|
const detectedIDEs = ideOptions.filter(o => o.detected);
|
|
189
|
-
const undetectedIDEs = ideOptions.filter(o => !o.detected && o.cmd);
|
|
190
201
|
const manualOption = ideOptions.filter(o => !o.cmd);
|
|
191
202
|
const sorted = [...detectedIDEs, ...manualOption];
|
|
192
203
|
|
package/lib/steps.js
CHANGED
|
@@ -103,13 +103,25 @@ const runQuestions = async (stepDefs, machine) => {
|
|
|
103
103
|
if (result === RESTART) return RESTART;
|
|
104
104
|
|
|
105
105
|
if (result === BACK) {
|
|
106
|
-
if (i === 0) return RESTART; // nowhere to go back
|
|
106
|
+
if (i === 0) return RESTART; // nowhere to go back from step 0
|
|
107
|
+
machine.enterBackNav(i); // record where back-nav started
|
|
107
108
|
const popped = machine.pop();
|
|
108
109
|
if (popped) delete answers[popped.stepName];
|
|
109
110
|
i--;
|
|
110
111
|
continue;
|
|
111
112
|
}
|
|
112
113
|
|
|
114
|
+
if (result === CONTINUE) {
|
|
115
|
+
// User chose to resume — skip forward to where they first pressed Back
|
|
116
|
+
const resumeTarget = machine.resumeIndex ?? i + 1;
|
|
117
|
+
machine.exitBackNav();
|
|
118
|
+
i = resumeTarget;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Normal answer — if re-answering during back-nav, exit back-nav mode
|
|
123
|
+
if (machine.inBackNav) machine.exitBackNav();
|
|
124
|
+
|
|
113
125
|
machine.push(i, def.name, result);
|
|
114
126
|
answers[def.name] = result;
|
|
115
127
|
i++;
|
package/lib/ui.js
CHANGED
|
@@ -109,6 +109,13 @@ const renderTrajectoryLines = (lines) => {
|
|
|
109
109
|
});
|
|
110
110
|
};
|
|
111
111
|
|
|
112
|
+
// ── Step progress header ─────────────────────────────────────────────────────
|
|
113
|
+
|
|
114
|
+
const stepHeader = (stepIndex, totalSteps) => {
|
|
115
|
+
console.log(`
|
|
116
|
+
${dim(`Step ${stepIndex} of ${totalSteps}`)}`);
|
|
117
|
+
};
|
|
118
|
+
|
|
112
119
|
// ── Step selection helpers ────────────────────────────────────────────────────
|
|
113
120
|
|
|
114
121
|
const { BACK, RESTART } = require('./steps');
|
|
@@ -150,6 +157,7 @@ const selectOptional = async (prompt, items, stepMachine, stepIndex) => {
|
|
|
150
157
|
// ── Exports ───────────────────────────────────────────────────────────────────
|
|
151
158
|
|
|
152
159
|
module.exports = {
|
|
160
|
+
stepHeader,
|
|
153
161
|
c, bold, green, yellow, dim, cyan, blue, red,
|
|
154
162
|
rl, ask,
|
|
155
163
|
arrowSelect, arrowConfirm,
|
package/package.json
CHANGED