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.
Files changed (44) hide show
  1. package/README.md +18 -2
  2. package/core/templates/.agents/backend/API.md +270 -0
  3. package/core/templates/.agents/backend/AUTH.md +257 -0
  4. package/core/templates/.agents/backend/DB.md +268 -0
  5. package/core/templates/.agents/backend/EVENTS.md +264 -0
  6. package/core/templates/.agents/backend/INIT.md +250 -0
  7. package/core/templates/.agents/backend/JOBS.md +267 -0
  8. package/core/templates/.agents/backend/LOGIC.md +302 -0
  9. package/core/templates/.agents/backend/TESTING.md +277 -0
  10. package/core/templates/.agents/client/ACCESSIBILITY.md +277 -0
  11. package/core/templates/.agents/client/FORMS.md +245 -0
  12. package/core/templates/.agents/client/LOGIC.md +288 -0
  13. package/core/templates/.agents/client/ROUTING.md +246 -0
  14. package/core/templates/.agents/client/TESTING.md +252 -0
  15. package/core/templates/.agents/client/UI.md +237 -0
  16. package/core/templates/.agents/shared/CLOUD.md +229 -0
  17. package/core/templates/.agents/shared/CLOUD_TEARDOWN.md +158 -0
  18. package/core/templates/.agents/shared/SECURITY.md +297 -0
  19. package/core/templates/.frameworks/backend/django.md +55 -0
  20. package/core/templates/.frameworks/backend/express.md +74 -0
  21. package/core/templates/.frameworks/backend/fastapi.md +107 -0
  22. package/core/templates/.frameworks/backend/fastify.md +74 -0
  23. package/core/templates/.frameworks/backend/laravel.md +79 -0
  24. package/core/templates/.frameworks/backend/nestjs.md +75 -0
  25. package/core/templates/.frameworks/backend/rails.md +84 -0
  26. package/core/templates/.frameworks/client/angular.md +80 -0
  27. package/core/templates/.frameworks/client/nextjs.md +47 -0
  28. package/core/templates/.frameworks/client/nuxt.md +45 -0
  29. package/core/templates/.frameworks/client/remix.md +44 -0
  30. package/core/templates/.frameworks/client/sveltekit.md +44 -0
  31. package/core/templates/.frameworks/client/vite-react.md +45 -0
  32. package/core/templates/CLAUDE.md +562 -0
  33. package/core/templates/CONTRACTS.md +16 -0
  34. package/core/templates/backend/CLAUDE.md +207 -0
  35. package/core/templates/client/CLAUDE.md +213 -0
  36. package/core/workflow/agent.js +285 -6
  37. package/core/workflow/complete.js +141 -5
  38. package/core/workflow/reset.js +28 -21
  39. package/core/workflow/run.js +3 -0
  40. package/init.js +2 -2
  41. package/lib/questions-flow.js +13 -2
  42. package/lib/steps.js +13 -1
  43. package/lib/ui.js +8 -0
  44. package/package.json +1 -1
@@ -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 to from step 0
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "multi-agents-cli",
3
- "version": "1.1.9",
3
+ "version": "1.1.10",
4
4
  "description": "Multi-agent workflow orchestration for Claude Code — isolated git worktrees, structured state tracking, autonomous task chaining",
5
5
  "keywords": [
6
6
  "claude-code",