@atlashub/smartstack-cli 4.74.0 → 4.75.0

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 (93) hide show
  1. package/dist/index.js +111 -36
  2. package/dist/index.js.map +1 -1
  3. package/dist/mcp-entry.mjs +14 -3
  4. package/dist/mcp-entry.mjs.map +1 -1
  5. package/package.json +1 -1
  6. package/templates/agents/ba-reader.md +17 -15
  7. package/templates/agents/ba-writer.md +49 -51
  8. package/templates/skills/apex/_shared.md +1 -1
  9. package/templates/skills/apex/references/checks/backend-checks.sh +21 -7
  10. package/templates/skills/apex/references/checks/infrastructure-checks.sh +47 -10
  11. package/templates/skills/apex/references/frontend-route-wiring-app-tsx.md +3 -0
  12. package/templates/skills/apex/references/post-checks.md +5 -2
  13. package/templates/skills/apex/references/smartstack-frontend.md +53 -7
  14. package/templates/skills/apex/steps/step-00-init.md +74 -0
  15. package/templates/skills/apex/steps/step-03-execute.md +16 -4
  16. package/templates/skills/apex/steps/step-03b-layer1-seed.md +39 -6
  17. package/templates/skills/apex/steps/step-03c-layer2-backend.md +50 -5
  18. package/templates/skills/apex/steps/step-03d-layer3-frontend.md +102 -2
  19. package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +3 -0
  20. package/templates/skills/business-analyse/SKILL.md +14 -0
  21. package/templates/skills/business-analyse/_shared.md +27 -0
  22. package/templates/skills/business-analyse/patterns/suggestion-catalog.md +34 -26
  23. package/templates/skills/business-analyse/questionnaire/01-context.md +13 -9
  24. package/templates/skills/business-analyse/questionnaire/02-stakeholders-scope.md +20 -27
  25. package/templates/skills/business-analyse/questionnaire.md +86 -9
  26. package/templates/skills/business-analyse/references/03-json-schemas.md +213 -0
  27. package/templates/skills/business-analyse/references/03-post-check-validation.md +144 -0
  28. package/templates/skills/business-analyse/references/03-smartstack-entity-guards.md +32 -0
  29. package/templates/skills/business-analyse/references/04-cross-module-validation.md +95 -0
  30. package/templates/skills/business-analyse/references/04-file-allocation.md +162 -0
  31. package/templates/skills/business-analyse/references/04-naming-audit-checks.md +174 -0
  32. package/templates/skills/business-analyse/references/04-semantic-validation-matrix.md +118 -0
  33. package/templates/skills/business-analyse/references/domain-research-playbook.md +234 -0
  34. package/templates/skills/business-analyse/references/entity-sourcing-presentation.md +166 -0
  35. package/templates/skills/business-analyse/references/init-resume-logic.md +70 -0
  36. package/templates/skills/business-analyse/references/module-completeness-challenge.md +174 -0
  37. package/templates/skills/business-analyse/references/multi-app-detection.md +149 -0
  38. package/templates/skills/business-analyse/references/portal-classification.md +52 -0
  39. package/templates/skills/business-analyse/references/validation-checklist.md +30 -1
  40. package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +37 -4
  41. package/templates/skills/business-analyse/steps/step-00-init.md +22 -190
  42. package/templates/skills/business-analyse/steps/step-01-cadrage.md +365 -269
  43. package/templates/skills/business-analyse/steps/step-02-structure.md +98 -20
  44. package/templates/skills/business-analyse/steps/step-03-specify.md +652 -229
  45. package/templates/skills/business-analyse/steps/step-04-consolidate.md +308 -287
  46. package/templates/skills/business-analyse-design/SKILL.md +10 -0
  47. package/templates/skills/business-analyse-design/references/screens-post-check.md +221 -0
  48. package/templates/skills/business-analyse-design/references/screens-type-mapping.md +138 -0
  49. package/templates/skills/business-analyse-design/references/smartcomponents-templates.md +225 -0
  50. package/templates/skills/{business-analyse → business-analyse-design}/references/spec-auto-inference.md +117 -117
  51. package/templates/skills/business-analyse-design/steps/step-01-screens.md +36 -162
  52. package/templates/skills/business-analyse-design/steps/step-02-wireframes.md +8 -7
  53. package/templates/skills/business-analyse-design/steps/step-03-navigation.md +89 -42
  54. package/templates/skills/business-analyse-develop/references/compact-loop.md +9 -0
  55. package/templates/skills/business-analyse-develop/references/handoff-quality-gate.md +132 -0
  56. package/templates/skills/business-analyse-develop/references/prd-v3-transformation.md +326 -0
  57. package/templates/skills/business-analyse-develop/references/report-reconciliation.md +140 -0
  58. package/templates/skills/business-analyse-develop/references/report-template.md +142 -0
  59. package/templates/skills/business-analyse-develop/steps/step-01-task.md +5 -177
  60. package/templates/skills/business-analyse-develop/steps/step-02-execute.md +17 -4
  61. package/templates/skills/business-analyse-develop/steps/step-03-commit.md +6 -2
  62. package/templates/skills/business-analyse-develop/steps/step-04-check.md +6 -0
  63. package/templates/skills/business-analyse-develop/steps/step-05-report.md +3 -269
  64. package/templates/skills/business-analyse-handoff/SKILL.md +10 -0
  65. package/templates/skills/business-analyse-handoff/references/agent-handoff-transform-prompt.md +208 -0
  66. package/templates/skills/business-analyse-handoff/references/context-isolation-pattern.md +47 -0
  67. package/templates/skills/business-analyse-handoff/references/handoff-file-inventory.md +49 -0
  68. package/templates/skills/business-analyse-handoff/references/handoff-global-validation.md +142 -0
  69. package/templates/skills/business-analyse-handoff/references/prd-validation-checks.md +125 -0
  70. package/templates/skills/business-analyse-handoff/references/project-index-update.md +98 -0
  71. package/templates/skills/business-analyse-handoff/steps/step-01-transform.md +9 -160
  72. package/templates/skills/business-analyse-handoff/steps/step-02-export.md +10 -99
  73. package/templates/skills/business-analyse-html/SKILL.md +10 -0
  74. package/templates/skills/business-analyse-html/html/ba-interactive.html +306 -81
  75. package/templates/skills/business-analyse-html/html/src/scripts/01-data-init.js +15 -2
  76. package/templates/skills/business-analyse-html/html/src/scripts/02-navigation.js +6 -46
  77. package/templates/skills/business-analyse-html/html/src/scripts/06-render-mockups.js +88 -33
  78. package/templates/skills/business-analyse-html/html/src/scripts/12-render-diagrams.js +116 -0
  79. package/templates/skills/business-analyse-html/html/src/styles/10-diagrams.css +73 -0
  80. package/templates/skills/business-analyse-html/html/src/template.html +2 -0
  81. package/templates/skills/business-analyse-html/references/02-embedded-artifacts-building.md +144 -0
  82. package/templates/skills/business-analyse-html/references/02-feature-data-building.md +141 -0
  83. package/templates/skills/business-analyse-html/references/02-mapping-tables.md +442 -0
  84. package/templates/skills/business-analyse-html/references/02-normalization-helpers.md +139 -0
  85. package/templates/skills/business-analyse-html/references/02-screen-format-detection.md +283 -0
  86. package/templates/skills/business-analyse-html/references/02-self-check-validation.md +199 -0
  87. package/templates/skills/business-analyse-html/references/data-build.md +22 -1
  88. package/templates/skills/business-analyse-html/references/data-mapping.md +40 -5
  89. package/templates/skills/business-analyse-html/steps/step-02-build-data.md +12 -555
  90. package/templates/skills/business-analyse-review/SKILL.md +10 -0
  91. package/templates/skills/business-analyse-status/SKILL.md +8 -0
  92. package/templates/skills/dev-start/SKILL.md +143 -307
  93. package/templates/skills/efcore/SKILL.md +13 -0
package/dist/index.js CHANGED
@@ -127614,7 +127614,7 @@ function resolvePodmanCmd() {
127614
127614
  (0, import_path13.join)(process.env.LOCALAPPDATA || "", "RedHat", "Podman", "podman.exe")
127615
127615
  ];
127616
127616
  for (const p of knownPaths) {
127617
- if (require("fs").existsSync(p)) return `"${p}"`;
127617
+ if (require("fs").existsSync(p)) return p;
127618
127618
  }
127619
127619
  }
127620
127620
  return "podman";
@@ -127649,6 +127649,22 @@ function getContainerEngineStatus() {
127649
127649
  }
127650
127650
  return null;
127651
127651
  }
127652
+ function checkWindowsVirt() {
127653
+ try {
127654
+ (0, import_child_process8.execSync)("wsl --status", { encoding: "utf-8", timeout: 5e3, stdio: "pipe" });
127655
+ } catch {
127656
+ return "wsl-missing";
127657
+ }
127658
+ try {
127659
+ const state = (0, import_child_process8.execSync)(
127660
+ 'powershell -NoProfile -Command "(Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform).State"',
127661
+ { encoding: "utf-8", timeout: 1e4, stdio: "pipe" }
127662
+ ).trim();
127663
+ if (state === "Disabled") return "hyperv-disabled";
127664
+ } catch {
127665
+ }
127666
+ return null;
127667
+ }
127652
127668
  function getNodeVersion() {
127653
127669
  return process.version;
127654
127670
  }
@@ -127812,19 +127828,15 @@ var doctorCommand = new Command("doctor").description("Run diagnostics and check
127812
127828
  });
127813
127829
  } else if (containerEngine && !containerEngine.running) {
127814
127830
  const isPodman = containerEngine.name === "Podman";
127815
- const wslMissing = isPodman && process.platform === "win32" && (() => {
127816
- try {
127817
- return (0, import_child_process8.execSync)("wsl --status", { encoding: "utf-8", timeout: 5e3, stdio: "pipe" }) && false;
127818
- } catch {
127819
- return true;
127820
- }
127821
- })();
127831
+ const virtIssue = isPodman && process.platform === "win32" ? checkWindowsVirt() : null;
127832
+ const virtMessage = virtIssue === "wsl-missing" ? "Podman installed but WSL2 is missing" : virtIssue === "hyperv-disabled" ? "Podman installed but hardware virtualization is not enabled" : `${containerEngine.name} installed but ${isPodman ? "machine" : "daemon"} not running`;
127833
+ const virtFix = virtIssue === "wsl-missing" ? "Run as Admin: wsl --install, restart PC, then: podman machine init && podman machine start" : virtIssue === "hyperv-disabled" ? "Enable VT-x/SVM in BIOS, then run as Admin: wsl --install --no-distribution, restart, then: podman machine init && podman machine start" : isPodman ? "Run: podman machine init && podman machine start" : "Start Docker Desktop, or run: podman machine init && podman machine start";
127822
127834
  diagnostics.push({
127823
127835
  name: "Container Engine",
127824
127836
  status: "warning",
127825
- message: wslMissing ? "Podman installed but WSL2 is missing" : `${containerEngine.name} installed but ${isPodman ? "machine" : "daemon"} not running`,
127826
- fix: wslMissing ? "Run as Admin: wsl --install, restart PC, then: podman machine init && podman machine start" : isPodman ? "Run: podman machine init && podman machine start" : "Start Docker Desktop, or run: podman machine init && podman machine start",
127827
- installCmd: wslMissing ? process.platform === "win32" ? "wsl --install" : void 0 : void 0
127837
+ message: virtMessage,
127838
+ fix: virtFix,
127839
+ installCmd: virtIssue === "wsl-missing" ? process.platform === "win32" ? "wsl --install" : void 0 : void 0
127828
127840
  });
127829
127841
  } else {
127830
127842
  diagnostics.push({
@@ -128050,6 +128062,7 @@ var import_bcryptjs = __toESM(require_bcryptjs());
128050
128062
  var import_fs4 = require("fs");
128051
128063
  var import_path14 = require("path");
128052
128064
  var import_os6 = require("os");
128065
+ var import_crypto8 = require("crypto");
128053
128066
  var import_child_process9 = require("child_process");
128054
128067
  function tryLoadNativeDriver() {
128055
128068
  try {
@@ -128066,11 +128079,25 @@ var DEFAULT_CONFIG = {
128066
128079
  var PASSWORD_CHARS = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789!@#$%&*";
128067
128080
  var PASSWORD_LENGTH = 16;
128068
128081
  function generatePassword() {
128069
- let password = "";
128082
+ const bytes = (0, import_crypto8.randomBytes)(PASSWORD_LENGTH);
128083
+ const chars = [];
128070
128084
  for (let i = 0; i < PASSWORD_LENGTH; i++) {
128071
- password += PASSWORD_CHARS.charAt(Math.floor(Math.random() * PASSWORD_CHARS.length));
128072
- }
128073
- return password;
128085
+ chars.push(PASSWORD_CHARS.charAt(bytes[i] % PASSWORD_CHARS.length));
128086
+ }
128087
+ let hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false;
128088
+ for (const c of chars) {
128089
+ if (c >= "a" && c <= "z") hasLower = true;
128090
+ else if (c >= "A" && c <= "Z") hasUpper = true;
128091
+ else if (c >= "0" && c <= "9") hasDigit = true;
128092
+ else hasSpecial = true;
128093
+ }
128094
+ const extra = (0, import_crypto8.randomBytes)(4);
128095
+ let pos = 0;
128096
+ if (!hasLower) chars[pos++] = "abcdefghjkmnpqrstuvwxyz"[extra[0] % 23];
128097
+ if (!hasUpper) chars[pos++] = "ABCDEFGHJKLMNPQRSTUVWXYZ"[extra[1] % 24];
128098
+ if (!hasDigit) chars[pos++] = "23456789"[extra[2] % 8];
128099
+ if (!hasSpecial) chars[pos] = "!@#$%&*"[extra[3] % 7];
128100
+ return chars.join("");
128074
128101
  }
128075
128102
  function findAppSettings(apiFolder) {
128076
128103
  if (!(0, import_fs4.existsSync)(apiFolder)) {
@@ -128260,11 +128287,23 @@ adminCommand.command("reset").description("Reset the localAdmin account password
128260
128287
  spinner.text = "Generating new password...";
128261
128288
  const newPassword = generatePassword();
128262
128289
  const passwordHash = await import_bcryptjs.default.hash(newPassword, 12);
128263
- spinner.text = "Updating password...";
128264
- const updateQuery = `UPDATE [core].[auth_Users] SET PasswordHash = '${passwordHash}', MustChangePassword = 0, UpdatedAt = GETUTCDATE() WHERE Email = '${adminEmail}'`;
128290
+ spinner.text = "Updating password and unlocking account...";
128291
+ const userId = executeSqlCmd(
128292
+ connInfo.server,
128293
+ connInfo.database,
128294
+ `SELECT CAST(Id AS NVARCHAR(36)) FROM [core].[auth_Users] WHERE Email = '${adminEmail}'`,
128295
+ sqlAuth
128296
+ ).trim();
128297
+ const updateQuery = `UPDATE [core].[auth_Users] SET PasswordHash = '${passwordHash}', MustChangePassword = 0, IsLocked = 0, LockoutEnd = NULL, UpdatedAt = GETUTCDATE() WHERE Email = '${adminEmail}'`;
128265
128298
  executeSqlCmd(connInfo.server, connInfo.database, updateQuery, sqlAuth);
128266
- spinner.succeed("Password reset successfully!");
128299
+ const deleteSessionsQuery = `DELETE FROM [core].[auth_Sessions] WHERE UserId = '${userId}' AND IsSuccessful = 0`;
128300
+ try {
128301
+ executeSqlCmd(connInfo.server, connInfo.database, deleteSessionsQuery, sqlAuth);
128302
+ } catch {
128303
+ }
128304
+ spinner.succeed("Password reset and account unlocked!");
128267
128305
  displayPasswordResult(adminEmail, newPassword);
128306
+ spinner.stop();
128268
128307
  };
128269
128308
  const displayPasswordResult = (email, password) => {
128270
128309
  if (options.json) {
@@ -128308,17 +128347,28 @@ adminCommand.command("reset").description("Reset the localAdmin account password
128308
128347
  spinner.text = "Generating new password...";
128309
128348
  const newPassword = generatePassword();
128310
128349
  const passwordHash = await import_bcryptjs.default.hash(newPassword, 12);
128311
- spinner.text = "Updating password...";
128350
+ spinner.text = "Updating password and unlocking account...";
128312
128351
  await sqlModule.query`
128313
128352
  UPDATE [core].[auth_Users]
128314
128353
  SET PasswordHash = ${passwordHash},
128315
128354
  MustChangePassword = ${false},
128355
+ IsLocked = ${false},
128356
+ LockoutEnd = ${null},
128316
128357
  UpdatedAt = ${/* @__PURE__ */ new Date()}
128317
128358
  WHERE Email = ${adminEmail}
128318
128359
  `;
128360
+ try {
128361
+ await sqlModule.query`
128362
+ DELETE FROM [core].[auth_Sessions]
128363
+ WHERE UserId = (SELECT Id FROM [core].[auth_Users] WHERE Email = ${adminEmail})
128364
+ AND IsSuccessful = ${false}
128365
+ `;
128366
+ } catch {
128367
+ }
128319
128368
  await sqlModule.close();
128320
- spinner.succeed("Password reset successfully!");
128369
+ spinner.succeed("Password reset and account unlocked!");
128321
128370
  displayPasswordResult(adminEmail, newPassword);
128371
+ spinner.stop();
128322
128372
  };
128323
128373
  const tryWithSqlCmd = async () => {
128324
128374
  try {
@@ -130294,7 +130344,6 @@ function resolveEngineCmd(name) {
130294
130344
  try {
130295
130345
  const result = (0, import_child_process12.spawnSync)(name, ["--version"], {
130296
130346
  encoding: "utf-8",
130297
- shell: true,
130298
130347
  timeout: 5e3,
130299
130348
  stdio: "pipe"
130300
130349
  });
@@ -130309,13 +130358,12 @@ function resolveEngineCmd(name) {
130309
130358
  for (const p of knownPaths) {
130310
130359
  if (import_fs_extra16.default.existsSync(p)) {
130311
130360
  try {
130312
- const result = (0, import_child_process12.spawnSync)(`"${p}"`, ["--version"], {
130361
+ const result = (0, import_child_process12.spawnSync)(p, ["--version"], {
130313
130362
  encoding: "utf-8",
130314
- shell: true,
130315
130363
  timeout: 5e3,
130316
130364
  stdio: "pipe"
130317
130365
  });
130318
- if (result.status === 0) return `"${p}"`;
130366
+ if (result.status === 0) return p;
130319
130367
  } catch {
130320
130368
  }
130321
130369
  }
@@ -130328,7 +130376,6 @@ function checkEngine(name) {
130328
130376
  try {
130329
130377
  const version2 = (0, import_child_process12.spawnSync)(cmd, ["--version"], {
130330
130378
  encoding: "utf-8",
130331
- shell: true,
130332
130379
  timeout: 5e3,
130333
130380
  stdio: "pipe"
130334
130381
  });
@@ -130337,7 +130384,6 @@ function checkEngine(name) {
130337
130384
  }
130338
130385
  const info = (0, import_child_process12.spawnSync)(cmd, ["info"], {
130339
130386
  encoding: "utf-8",
130340
- shell: true,
130341
130387
  timeout: 1e4,
130342
130388
  stdio: "pipe"
130343
130389
  });
@@ -130346,6 +130392,33 @@ function checkEngine(name) {
130346
130392
  return { name, installed: false, running: false, cmd };
130347
130393
  }
130348
130394
  }
130395
+ function checkWindowsVirtualization() {
130396
+ try {
130397
+ const r = (0, import_child_process12.spawnSync)("wsl", ["--status"], { encoding: "utf-8", timeout: 5e3, stdio: "pipe" });
130398
+ if (r.status !== 0) return "wsl-missing";
130399
+ } catch {
130400
+ return "wsl-missing";
130401
+ }
130402
+ try {
130403
+ const r = (0, import_child_process12.spawnSync)("wsl", ["--list", "--quiet"], { encoding: "utf-8", timeout: 5e3, stdio: "pipe" });
130404
+ const output = ((r.stdout || "") + (r.stderr || "")).toLowerCase();
130405
+ if (/virtual machine platform|hypervisor/i.test(output) && r.status !== 0) {
130406
+ return "hyperv-disabled";
130407
+ }
130408
+ } catch {
130409
+ }
130410
+ try {
130411
+ const r = (0, import_child_process12.spawnSync)("powershell", [
130412
+ "-NoProfile",
130413
+ "-Command",
130414
+ "(Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform).State"
130415
+ ], { encoding: "utf-8", timeout: 1e4, stdio: "pipe" });
130416
+ const state = (r.stdout || "").trim();
130417
+ if (state === "Disabled") return "hyperv-disabled";
130418
+ } catch {
130419
+ }
130420
+ return null;
130421
+ }
130349
130422
  function detectEngine() {
130350
130423
  const docker = checkEngine("docker");
130351
130424
  if (docker.installed && docker.running) return docker;
@@ -130355,15 +130428,8 @@ function detectEngine() {
130355
130428
  return podman;
130356
130429
  }
130357
130430
  if (podman.installed && !podman.running) {
130358
- const wslMissing = process.platform === "win32" && (() => {
130359
- try {
130360
- const r = (0, import_child_process12.spawnSync)("wsl", ["--status"], { encoding: "utf-8", shell: true, timeout: 5e3, stdio: "pipe" });
130361
- return r.status !== 0;
130362
- } catch {
130363
- return true;
130364
- }
130365
- })();
130366
- if (wslMissing) {
130431
+ const virtIssue = process.platform === "win32" ? checkWindowsVirtualization() : null;
130432
+ if (virtIssue === "wsl-missing") {
130367
130433
  logger.error("WSL2 is required by Podman but is not installed.");
130368
130434
  console.log();
130369
130435
  console.log(` Install WSL2 first (run as Administrator):`);
@@ -130371,6 +130437,16 @@ function detectEngine() {
130371
130437
  console.log(` Restart your PC, then:`);
130372
130438
  console.log(` ${source_default.cyan("podman machine init")}`);
130373
130439
  console.log(` ${source_default.cyan("podman machine start")}`);
130440
+ } else if (virtIssue === "hyperv-disabled") {
130441
+ logger.error("Hardware virtualization is not enabled.");
130442
+ console.log();
130443
+ console.log(` To build Docker images, you need to enable virtualization:`);
130444
+ console.log(` 1. Enable VT-x (Intel) or SVM (AMD) in your BIOS/UEFI settings`);
130445
+ console.log(` 2. Then run as Administrator:`);
130446
+ console.log(` ${source_default.cyan("wsl --install --no-distribution")}`);
130447
+ console.log(` 3. Restart your PC, then:`);
130448
+ console.log(` ${source_default.cyan("podman machine init")}`);
130449
+ console.log(` ${source_default.cyan("podman machine start")}`);
130374
130450
  } else {
130375
130451
  logger.error("Podman is installed but the machine is not running.");
130376
130452
  console.log();
@@ -130449,7 +130525,6 @@ function runCompose(engine, composePath, args) {
130449
130525
  }
130450
130526
  const result = (0, import_child_process12.spawnSync)(engine.cmd, ["compose", "-f", composePath, ...args], {
130451
130527
  encoding: "utf-8",
130452
- shell: true,
130453
130528
  stdio: "pipe",
130454
130529
  cwd: process.cwd(),
130455
130530
  env: { ...process.env, ...extraEnv }