@atlashub/smartstack-cli 3.30.0 → 3.32.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 (52) hide show
  1. package/.documentation/installation.html +7 -2
  2. package/README.md +7 -1
  3. package/dist/index.js +33 -37
  4. package/dist/index.js.map +1 -1
  5. package/dist/mcp-entry.mjs +547 -97
  6. package/dist/mcp-entry.mjs.map +1 -1
  7. package/package.json +1 -1
  8. package/scripts/health-check.sh +2 -1
  9. package/templates/mcp-scaffolding/controller.cs.hbs +10 -7
  10. package/templates/mcp-scaffolding/entity-extension.cs.hbs +132 -124
  11. package/templates/mcp-scaffolding/frontend/api-client.ts.hbs +4 -4
  12. package/templates/mcp-scaffolding/tests/controller.test.cs.hbs +38 -15
  13. package/templates/mcp-scaffolding/tests/service.test.cs.hbs +20 -8
  14. package/templates/skills/apex/SKILL.md +7 -9
  15. package/templates/skills/apex/_shared.md +9 -2
  16. package/templates/skills/apex/references/code-generation.md +412 -0
  17. package/templates/skills/apex/references/post-checks.md +377 -37
  18. package/templates/skills/apex/references/smartstack-api.md +229 -5
  19. package/templates/skills/apex/references/smartstack-frontend.md +368 -11
  20. package/templates/skills/apex/references/smartstack-layers.md +54 -7
  21. package/templates/skills/apex/steps/step-00-init.md +1 -2
  22. package/templates/skills/apex/steps/step-01-analyze.md +45 -2
  23. package/templates/skills/apex/steps/step-02-plan.md +23 -2
  24. package/templates/skills/apex/steps/step-03-execute.md +195 -5
  25. package/templates/skills/apex/steps/step-04-examine.md +18 -5
  26. package/templates/skills/apex/steps/step-05-deep-review.md +9 -11
  27. package/templates/skills/apex/steps/step-06-resolve.md +5 -9
  28. package/templates/skills/apex/steps/step-07-tests.md +66 -1
  29. package/templates/skills/apex/steps/step-08-run-tests.md +12 -3
  30. package/templates/skills/application/references/provider-template.md +62 -39
  31. package/templates/skills/application/templates-backend.md +3 -3
  32. package/templates/skills/application/templates-frontend.md +12 -12
  33. package/templates/skills/application/templates-seed.md +14 -4
  34. package/templates/skills/business-analyse/SKILL.md +10 -7
  35. package/templates/skills/business-analyse/questionnaire/04-data.md +8 -0
  36. package/templates/skills/business-analyse/references/agent-module-prompt.md +84 -5
  37. package/templates/skills/business-analyse/references/agent-pooling-best-practices.md +83 -19
  38. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +6 -2
  39. package/templates/skills/business-analyse/references/team-orchestration.md +470 -113
  40. package/templates/skills/business-analyse/references/validation-checklist.md +5 -4
  41. package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +44 -0
  42. package/templates/skills/business-analyse/steps/step-03a2-analysis.md +72 -1
  43. package/templates/skills/business-analyse/steps/step-03c-compile.md +93 -7
  44. package/templates/skills/business-analyse/steps/step-03d-validate.md +34 -2
  45. package/templates/skills/business-analyse/steps/step-04b-analyze.md +40 -0
  46. package/templates/skills/controller/references/controller-code-templates.md +2 -2
  47. package/templates/skills/controller/templates.md +12 -12
  48. package/templates/skills/feature-full/steps/step-01-implementation.md +4 -4
  49. package/templates/skills/ralph-loop/references/category-rules.md +44 -2
  50. package/templates/skills/ralph-loop/references/compact-loop.md +37 -0
  51. package/templates/skills/ralph-loop/references/core-seed-data.md +51 -20
  52. package/templates/skills/review-code/references/owasp-api-top10.md +1 -1
@@ -683,8 +683,13 @@ git config --global credential.helper manager</code></pre>
683
683
  <p data-lang="en">Install Claude Code CLI and the VS Code extension:</p>
684
684
  <div class="code-block">
685
685
  <button class="copy-btn">Copy</button>
686
- <pre><code># 1. Installer Claude Code CLI
687
- npm install -g @anthropic-ai/claude-code
686
+ <pre><code># 1. Installer Claude Code CLI (native install - recommandé)
687
+ # Windows PowerShell:
688
+ irm https://claude.ai/install.ps1 | iex
689
+ # macOS / Linux / WSL:
690
+ # curl -fsSL https://claude.ai/install.sh | bash
691
+ # WinGet:
692
+ # winget install Anthropic.ClaudeCode
688
693
 
689
694
  # 2. Installer l'extension VS Code
690
695
  code --install-extension anthropic.claude-code</code></pre>
package/README.md CHANGED
@@ -35,7 +35,13 @@ Before installing SmartStack CLI, verify that the following tools are installed:
35
35
  node --version && npm --version && git --version && dotnet --version && claude --version
36
36
  ```
37
37
 
38
- > **Node.js** : [nodejs.org](https://nodejs.org/) | **.NET SDK** : [dotnet.microsoft.com](https://dotnet.microsoft.com/download) | **Claude Code** : `npm install -g @anthropic-ai/claude-code`
38
+ > **Node.js** : [nodejs.org](https://nodejs.org/) | **.NET SDK** : [dotnet.microsoft.com](https://dotnet.microsoft.com/download) | **Claude Code** : [code.claude.com/docs/en/setup](https://code.claude.com/docs/en/setup)
39
+ >
40
+ > **Install Claude Code (native - recommended):**
41
+ > - **Windows PowerShell**: `irm https://claude.ai/install.ps1 | iex`
42
+ > - **Windows (WinGet)**: `winget install Anthropic.ClaudeCode`
43
+ > - **WSL (Ubuntu on Windows)**: `curl -fsSL https://claude.ai/install.sh | bash`
44
+ > - **macOS / Linux**: `curl -fsSL https://claude.ai/install.sh | bash`
39
45
 
40
46
  ---
41
47
 
package/dist/index.js CHANGED
@@ -116531,11 +116531,7 @@ function execCommand(command, cwd, dryRun = false) {
116531
116531
  return;
116532
116532
  }
116533
116533
  try {
116534
- (0, import_child_process5.execSync)(command, {
116535
- cwd,
116536
- stdio: "inherit",
116537
- shell: true
116538
- });
116534
+ (0, import_child_process5.execSync)(command, { cwd, stdio: "inherit" });
116539
116535
  } catch (error) {
116540
116536
  throw new Error(`Command failed: ${command}`);
116541
116537
  }
@@ -116764,7 +116760,6 @@ EndGlobal
116764
116760
  );
116765
116761
  }
116766
116762
  logger.info("Installing NuGet packages...");
116767
- const targetFramework = "net10.0";
116768
116763
  const dbPackage = "Microsoft.EntityFrameworkCore.SqlServer";
116769
116764
  const nugetPackages = [
116770
116765
  {
@@ -117163,7 +117158,6 @@ async function createFrontendStructure(config, state, dryRun) {
117163
117158
  await import_fs_extra6.default.ensureDir((0, import_path7.join)(webDir, "src", "types"));
117164
117159
  await import_fs_extra6.default.ensureDir((0, import_path7.join)(webDir, "src", "i18n"));
117165
117160
  await import_fs_extra6.default.ensureDir((0, import_path7.join)(webDir, "public"));
117166
- const smartstackNpmTag = config.preview ? "next" : "latest";
117167
117161
  const packageJson = {
117168
117162
  name: `${projectName.toLowerCase()}-web`,
117169
117163
  private: true,
@@ -117595,7 +117589,7 @@ async function initializeGit(config, dryRun) {
117595
117589
  execCommand("git add .", projectDir, dryRun);
117596
117590
  if (!dryRun) {
117597
117591
  try {
117598
- (0, import_child_process5.execSync)("git diff --cached --quiet", { cwd: projectDir, shell: true });
117592
+ (0, import_child_process5.execSync)("git diff --cached --quiet", { cwd: projectDir });
117599
117593
  logger.info(source_default.gray("No new changes to commit (already committed)"));
117600
117594
  } catch {
117601
117595
  execCommand('git commit -m "chore: initial SmartStack project setup"', projectDir, dryRun);
@@ -124963,11 +124957,7 @@ function execCommand2(command, cwd, dryRun = false) {
124963
124957
  return;
124964
124958
  }
124965
124959
  try {
124966
- (0, import_child_process6.execSync)(command, {
124967
- cwd,
124968
- stdio: "inherit",
124969
- shell: true
124970
- });
124960
+ (0, import_child_process6.execSync)(command, { cwd, stdio: "inherit" });
124971
124961
  } catch (error) {
124972
124962
  throw new Error(`Command failed: ${command}`);
124973
124963
  }
@@ -124978,11 +124968,7 @@ function tryExecCommand(command, cwd, dryRun = false) {
124978
124968
  return true;
124979
124969
  }
124980
124970
  try {
124981
- (0, import_child_process6.execSync)(command, {
124982
- cwd,
124983
- stdio: "inherit",
124984
- shell: true
124985
- });
124971
+ (0, import_child_process6.execSync)(command, { cwd, stdio: "inherit" });
124986
124972
  return true;
124987
124973
  } catch (error) {
124988
124974
  return false;
@@ -125243,15 +125229,15 @@ var upgradeCommand = new Command("upgrade").description("Upgrade SmartStack pack
125243
125229
  logger.info(` ${source_default.cyan(project.relPath)}:`);
125244
125230
  for (const pkg2 of otherPackages) {
125245
125231
  try {
125246
- const output = dryRun ? `[DRY RUN] dotnet add "${project.csprojPath}" package ${pkg2.name}` : (0, import_child_process6.execSync)(
125247
- `dotnet add "${project.csprojPath}" package ${pkg2.name} --no-restore`,
125248
- { shell: true, encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }
125249
- );
125250
125232
  if (dryRun) {
125251
125233
  logger.info(` [DRY RUN] ${pkg2.name} ${source_default.yellow(pkg2.currentVersion)} \u2192 latest`);
125252
125234
  result.otherPkgUpdated++;
125253
125235
  continue;
125254
125236
  }
125237
+ (0, import_child_process6.execSync)(
125238
+ `dotnet add "${project.csprojPath}" package ${pkg2.name} --no-restore`,
125239
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }
125240
+ );
125255
125241
  const newContent = await import_fs_extra7.default.readFile(project.csprojPath, "utf-8");
125256
125242
  const newVersion = readPackageVersion(newContent, pkg2.name);
125257
125243
  if (newVersion && newVersion !== pkg2.currentVersion) {
@@ -125644,7 +125630,7 @@ function createLicenseCommand() {
125644
125630
  logger.info("Validating license key...\n");
125645
125631
  const result = validateLicenseKey(key);
125646
125632
  if (!result.valid) {
125647
- logger.error("License Activation Failed", result.error || "Invalid license");
125633
+ logger.error(`License Activation Failed: ${result.error || "Invalid license"}`);
125648
125634
  process.exit(1);
125649
125635
  }
125650
125636
  await saveLicenseKey(key);
@@ -125654,7 +125640,7 @@ function createLicenseCommand() {
125654
125640
  license.command("status").description("Show current license status").action(async () => {
125655
125641
  const result = await validateCurrentLicense();
125656
125642
  if (!result.valid) {
125657
- logger.error("No Valid License", result.error || "License not found");
125643
+ logger.error(`No Valid License: ${result.error || "License not found"}`);
125658
125644
  logger.info("\nTo activate a license:");
125659
125645
  logger.info(" smartstack license activate <your-license-key>");
125660
125646
  logger.info("\nTo purchase a license:");
@@ -125663,14 +125649,14 @@ function createLicenseCommand() {
125663
125649
  }
125664
125650
  console.log(formatLicenseInfo(result.license));
125665
125651
  if (result.license.daysRemaining <= 30) {
125666
- logger.warn(`License expires in ${result.license.daysRemaining} days`);
125652
+ logger.warning(`License expires in ${result.license.daysRemaining} days`);
125667
125653
  logger.info("Renew at: https://atlashub.io/products/smartstack-cli");
125668
125654
  }
125669
125655
  });
125670
125656
  license.command("deactivate").description("Remove the current license").action(async () => {
125671
125657
  const key = await loadLicenseKey();
125672
125658
  if (!key) {
125673
- logger.warn("No license is currently active");
125659
+ logger.warning("No license is currently active");
125674
125660
  return;
125675
125661
  }
125676
125662
  await removeLicenseKey();
@@ -125680,7 +125666,7 @@ function createLicenseCommand() {
125680
125666
  logger.info("Verifying license key...\n");
125681
125667
  const result = validateLicenseKey(key);
125682
125668
  if (!result.valid) {
125683
- logger.error("License Invalid", result.error || "Unknown error");
125669
+ logger.error(`License Invalid: ${result.error || "Unknown error"}`);
125684
125670
  process.exit(1);
125685
125671
  }
125686
125672
  logger.success("License is valid!");
@@ -125704,8 +125690,16 @@ var checkMcpCommand = new Command("check-mcp").description("Check MCP servers st
125704
125690
  }
125705
125691
  logger.error("Claude Code CLI is not installed!");
125706
125692
  console.log();
125707
- logger.info("Install it with:");
125708
- console.log(source_default.cyan(" npm install -g @anthropic-ai/claude-code"));
125693
+ logger.info("Install it with (native install recommended):");
125694
+ if (process.platform === "win32") {
125695
+ console.log(source_default.cyan(" Windows PowerShell: irm https://claude.ai/install.ps1 | iex"));
125696
+ console.log(source_default.cyan(" WinGet: winget install Anthropic.ClaudeCode"));
125697
+ console.log(source_default.cyan(" WSL (Ubuntu): curl -fsSL https://claude.ai/install.sh | bash"));
125698
+ } else {
125699
+ console.log(source_default.cyan(" curl -fsSL https://claude.ai/install.sh | bash"));
125700
+ }
125701
+ console.log();
125702
+ console.log(source_default.dim(" More info: https://code.claude.com/docs/en/setup"));
125709
125703
  process.exit(1);
125710
125704
  }
125711
125705
  const claudeVersion = getClaudeCodeVersion();
@@ -125858,7 +125852,13 @@ ralphCommand.command("start").description("Verify prerequisites and prepare Ralp
125858
125852
  logger.success("Claude Code CLI is installed");
125859
125853
  } else {
125860
125854
  logger.error("Claude Code CLI is NOT installed");
125861
- console.log(` Install with: ${source_default.cyan("npm install -g @anthropic-ai/claude-code")}`);
125855
+ if (process.platform === "win32") {
125856
+ console.log(` Windows: ${source_default.cyan("irm https://claude.ai/install.ps1 | iex")} (PowerShell)`);
125857
+ console.log(` WSL: ${source_default.cyan("curl -fsSL https://claude.ai/install.sh | bash")}`);
125858
+ } else {
125859
+ console.log(` Install: ${source_default.cyan("curl -fsSL https://claude.ai/install.sh | bash")}`);
125860
+ }
125861
+ console.log(` More info: ${source_default.cyan("https://code.claude.com/docs/en/setup")}`);
125862
125862
  allChecksPass = false;
125863
125863
  }
125864
125864
  logger.step(2, 5, "Checking MCP servers...");
@@ -126188,7 +126188,7 @@ var doctorCommand = new Command("doctor").description("Run diagnostics and check
126188
126188
  name: "Claude Code",
126189
126189
  status: claudeInstalled ? "ok" : "error",
126190
126190
  message: claudeVersion || "Not installed",
126191
- fix: !claudeInstalled ? "npm install -g @anthropic-ai/claude-code" : void 0
126191
+ fix: !claudeInstalled ? process.platform === "win32" ? "Windows: irm https://claude.ai/install.ps1 | iex | WSL: curl -fsSL https://claude.ai/install.sh | bash" : "curl -fsSL https://claude.ai/install.sh | bash" : void 0
126192
126192
  });
126193
126193
  if (claudeInstalled) {
126194
126194
  const mcpResult = checkRequiredMcpServers();
@@ -127844,18 +127844,14 @@ export PATH="$PATH:$HOME/.dotnet:$HOME/.dotnet/tools"' >> ~/.bashrc`,
127844
127844
  async function installClaudeInWsl() {
127845
127845
  const status = checkClaudeInWsl();
127846
127846
  if (status.installed) return { success: true, version: status.version, skipped: true };
127847
- const nodeCheck = checkNodeInWsl();
127848
- if (!nodeCheck.installed) {
127849
- return { success: false, error: "Node.js is not installed (required for Claude Code)" };
127850
- }
127851
127847
  const spinner = logger.spinner("Installing Claude Code...");
127852
127848
  const result = wslInstall(
127853
- "source ~/.nvm/nvm.sh && npm install -g @anthropic-ai/claude-code",
127849
+ "curl -fsSL https://claude.ai/install.sh | bash",
127854
127850
  18e4
127855
127851
  );
127856
127852
  if (result === null) {
127857
127853
  spinner.fail("Failed to install Claude Code");
127858
- return { success: false, error: "npm install -g @anthropic-ai/claude-code failed" };
127854
+ return { success: false, error: "Claude Code native install failed (curl -fsSL https://claude.ai/install.sh | bash)" };
127859
127855
  }
127860
127856
  const check = checkClaudeInWsl();
127861
127857
  if (check.installed) {