@atlashub/smartstack-cli 2.9.0 → 3.1.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.
- package/.documentation/agents.html +1 -371
- package/.documentation/business-analyse.html +81 -17
- package/.documentation/cli-commands.html +1 -1
- package/.documentation/commands.html +1 -1
- package/.documentation/efcore.html +1 -1
- package/.documentation/gitflow.html +1 -1
- package/.documentation/hooks.html +27 -66
- package/.documentation/index.html +166 -166
- package/.documentation/init.html +6 -7
- package/.documentation/installation.html +1 -1
- package/.documentation/ralph-loop.html +1 -9
- package/.documentation/test-web.html +15 -39
- package/dist/index.js +23 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp-entry.mjs +1302 -223
- package/dist/mcp-entry.mjs.map +1 -1
- package/package.json +1 -1
- package/templates/agents/efcore/db-deploy.md +1 -1
- package/templates/agents/efcore/migration.md +26 -10
- package/templates/agents/efcore/rebase-snapshot.md +24 -7
- package/templates/agents/efcore/squash.md +73 -57
- package/templates/agents/gitflow/commit.md +138 -18
- package/templates/agents/gitflow/exec.md +1 -1
- package/templates/agents/gitflow/finish.md +79 -62
- package/templates/agents/gitflow/init-clone.md +186 -0
- package/templates/agents/gitflow/init-detect.md +137 -0
- package/templates/agents/gitflow/init-validate.md +210 -0
- package/templates/agents/gitflow/init.md +231 -74
- package/templates/agents/gitflow/merge.md +115 -33
- package/templates/agents/gitflow/pr.md +151 -46
- package/templates/agents/gitflow/start.md +76 -33
- package/templates/agents/gitflow/status.md +41 -71
- package/templates/hooks/appsettings-guard.sh +76 -0
- package/templates/hooks/ef-migration-check.md +1 -1
- package/templates/hooks/hooks.json +9 -0
- package/templates/project/appsettings.json.template +8 -2
- package/templates/project/test-frontend/msw/handlers.ts +58 -0
- package/templates/project/test-frontend/msw/server.ts +25 -0
- package/templates/project/test-frontend/setup.ts +16 -0
- package/templates/project/test-frontend/test-utils.tsx +59 -0
- package/templates/project/test-frontend/vitest.config.ts +31 -0
- package/templates/skills/_resources/config-safety.md +61 -0
- package/templates/skills/_resources/formatting-guide.md +2 -2
- package/templates/skills/application/SKILL.md +12 -3
- package/templates/skills/application/steps/step-04-backend.md +21 -0
- package/templates/skills/application/steps/step-07-tests.md +259 -120
- package/templates/skills/business-analyse/SKILL.md +57 -28
- package/templates/skills/business-analyse/_shared.md +70 -39
- package/templates/skills/business-analyse/html/ba-interactive.html +2596 -0
- package/templates/skills/business-analyse/questionnaire/00-application.md +123 -131
- package/templates/skills/business-analyse/questionnaire/01-context.md +173 -24
- package/templates/skills/business-analyse/questionnaire/02-stakeholders.md +170 -50
- package/templates/skills/business-analyse/questionnaire/03-scope.md +154 -48
- package/templates/skills/business-analyse/questionnaire/10-documentation.md +1 -1
- package/templates/skills/business-analyse/questionnaire/14-risk-assumptions.md +135 -0
- package/templates/skills/business-analyse/questionnaire/15-success-metrics.md +136 -0
- package/templates/skills/business-analyse/questionnaire.md +55 -46
- package/templates/skills/business-analyse/steps/step-00-init.md +24 -2
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +31 -20
- package/templates/skills/business-analyse/steps/step-03-specify.md +58 -0
- package/templates/skills/business-analyse/steps/step-05-handoff.md +301 -1
- package/templates/skills/business-analyse/steps/step-06-extract.md +518 -0
- package/templates/skills/check-version/SKILL.md +1 -1
- package/templates/skills/efcore/steps/db/step-deploy.md +22 -3
- package/templates/skills/efcore/steps/db/step-reset.md +27 -4
- package/templates/skills/efcore/steps/db/step-seed.md +46 -2
- package/templates/skills/efcore/steps/db/step-status.md +14 -0
- package/templates/skills/efcore/steps/migration/step-01-check.md +31 -5
- package/templates/skills/efcore/steps/migration/step-02-create.md +20 -4
- package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +60 -0
- package/templates/skills/efcore/steps/shared/step-00-init.md +47 -8
- package/templates/skills/efcore/steps/squash/step-03-create.md +27 -5
- package/templates/skills/gitflow/SKILL.md +91 -29
- package/templates/skills/gitflow/_shared.md +144 -2
- package/templates/skills/gitflow/phases/status.md +11 -1
- package/templates/skills/gitflow/steps/step-commit.md +1 -1
- package/templates/skills/gitflow/steps/step-init.md +202 -39
- package/templates/skills/gitflow/steps/step-pr.md +17 -5
- package/templates/skills/gitflow/templates/config.json +10 -1
- package/templates/skills/ralph-loop/SKILL.md +22 -15
- package/templates/skills/ralph-loop/steps/step-01-task.md +89 -4
- package/templates/skills/ralph-loop/steps/step-02-execute.md +408 -23
- package/templates/skills/ralph-loop/steps/step-03-commit.md +84 -2
- package/templates/skills/ralph-loop/steps/step-04-check.md +235 -6
- package/templates/skills/ralph-loop/steps/step-05-report.md +115 -0
- package/templates/skills/validate-feature/SKILL.md +83 -0
- package/templates/skills/validate-feature/steps/step-01-compile.md +38 -0
- package/templates/skills/validate-feature/steps/step-02-unit-tests.md +45 -0
- package/templates/skills/validate-feature/steps/step-03-integration-tests.md +53 -0
- package/templates/skills/validate-feature/steps/step-04-api-smoke.md +157 -0
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<header class="global-header">
|
|
13
13
|
<div class="logo">SS</div>
|
|
14
14
|
<span class="site-title">SmartStack CLI</span>
|
|
15
|
-
<span class="version-badge">
|
|
15
|
+
<span class="version-badge">v3.0.0</span>
|
|
16
16
|
<div class="header-divider"></div>
|
|
17
17
|
<span class="page-title">Test Web</span>
|
|
18
18
|
<nav class="breadcrumb">
|
|
@@ -225,49 +225,25 @@
|
|
|
225
225
|
<section id="configuration">
|
|
226
226
|
<h2>Configuration</h2>
|
|
227
227
|
|
|
228
|
-
<p data-lang="fr">
|
|
229
|
-
|
|
228
|
+
<p data-lang="fr">
|
|
229
|
+
La configuration se fait dans <code>.claude/test-web/config.json</code>. Utilisez un template pour demarrer rapidement :
|
|
230
|
+
</p>
|
|
231
|
+
<p data-lang="en">
|
|
232
|
+
Configuration is done in <code>.claude/test-web/config.json</code>. Use a template to get started quickly:
|
|
233
|
+
</p>
|
|
230
234
|
|
|
231
235
|
<div class="code-block">
|
|
232
236
|
<button class="copy-btn">Copy</button>
|
|
233
|
-
<pre><code>
|
|
234
|
-
"version": "1.0.0",
|
|
235
|
-
"targets": [
|
|
236
|
-
{
|
|
237
|
-
"name": "npm Package Page",
|
|
238
|
-
"url": "https://www.npmjs.com/package/@scope/package-name",
|
|
239
|
-
"type": "fetch",
|
|
240
|
-
"expects": {
|
|
241
|
-
"status": 200,
|
|
242
|
-
"contains": ["package-name", "Install"]
|
|
243
|
-
}
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
"name": "npm Search",
|
|
247
|
-
"query": "@scope/package-name npm",
|
|
248
|
-
"type": "search",
|
|
249
|
-
"expects": {
|
|
250
|
-
"hasResults": true
|
|
251
|
-
}
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
"name": "GitHub Repository",
|
|
255
|
-
"url": "https://github.com/org/repo",
|
|
256
|
-
"type": "fetch",
|
|
257
|
-
"expects": {
|
|
258
|
-
"status": 200,
|
|
259
|
-
"contains": ["README", "package.json"]
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
],
|
|
263
|
-
"settings": {
|
|
264
|
-
"timeout": 30000,
|
|
265
|
-
"retries": 2,
|
|
266
|
-
"reportPath": ".claude/test-web/reports"
|
|
267
|
-
}
|
|
268
|
-
}</code></pre>
|
|
237
|
+
<pre><code>/test-web-config npm-package</code></pre>
|
|
269
238
|
</div>
|
|
270
239
|
|
|
240
|
+
<p data-lang="fr">
|
|
241
|
+
Le fichier de configuration definit les URLs a tester, le type de test (fetch, search, chrome) et les resultats attendus (code HTTP, contenu present). Voir les templates ci-dessous pour les cas d'usage courants.
|
|
242
|
+
</p>
|
|
243
|
+
<p data-lang="en">
|
|
244
|
+
The configuration file defines URLs to test, the test type (fetch, search, chrome) and expected results (HTTP code, content present). See templates below for common use cases.
|
|
245
|
+
</p>
|
|
246
|
+
|
|
271
247
|
<h3 data-lang="fr">Types de targets</h3>
|
|
272
248
|
<h3 data-lang="en">Target Types</h3>
|
|
273
249
|
|
package/dist/index.js
CHANGED
|
@@ -44464,16 +44464,16 @@ var require_chainedTokenCredential = __commonJS({
|
|
|
44464
44464
|
// node_modules/uuid/dist/esm-node/rng.js
|
|
44465
44465
|
function rng() {
|
|
44466
44466
|
if (poolPtr > rnds8Pool.length - 16) {
|
|
44467
|
-
|
|
44467
|
+
import_crypto2.default.randomFillSync(rnds8Pool);
|
|
44468
44468
|
poolPtr = 0;
|
|
44469
44469
|
}
|
|
44470
44470
|
return rnds8Pool.slice(poolPtr, poolPtr += 16);
|
|
44471
44471
|
}
|
|
44472
|
-
var
|
|
44472
|
+
var import_crypto2, rnds8Pool, poolPtr;
|
|
44473
44473
|
var init_rng = __esm({
|
|
44474
44474
|
"node_modules/uuid/dist/esm-node/rng.js"() {
|
|
44475
44475
|
"use strict";
|
|
44476
|
-
|
|
44476
|
+
import_crypto2 = __toESM(require("crypto"));
|
|
44477
44477
|
rnds8Pool = new Uint8Array(256);
|
|
44478
44478
|
poolPtr = rnds8Pool.length;
|
|
44479
44479
|
}
|
|
@@ -44678,13 +44678,13 @@ function md5(bytes) {
|
|
|
44678
44678
|
} else if (typeof bytes === "string") {
|
|
44679
44679
|
bytes = Buffer.from(bytes, "utf8");
|
|
44680
44680
|
}
|
|
44681
|
-
return
|
|
44681
|
+
return import_crypto3.default.createHash("md5").update(bytes).digest();
|
|
44682
44682
|
}
|
|
44683
|
-
var
|
|
44683
|
+
var import_crypto3, md5_default;
|
|
44684
44684
|
var init_md5 = __esm({
|
|
44685
44685
|
"node_modules/uuid/dist/esm-node/md5.js"() {
|
|
44686
44686
|
"use strict";
|
|
44687
|
-
|
|
44687
|
+
import_crypto3 = __toESM(require("crypto"));
|
|
44688
44688
|
md5_default = md5;
|
|
44689
44689
|
}
|
|
44690
44690
|
});
|
|
@@ -44733,13 +44733,13 @@ function sha1(bytes) {
|
|
|
44733
44733
|
} else if (typeof bytes === "string") {
|
|
44734
44734
|
bytes = Buffer.from(bytes, "utf8");
|
|
44735
44735
|
}
|
|
44736
|
-
return
|
|
44736
|
+
return import_crypto4.default.createHash("sha1").update(bytes).digest();
|
|
44737
44737
|
}
|
|
44738
|
-
var
|
|
44738
|
+
var import_crypto4, sha1_default;
|
|
44739
44739
|
var init_sha1 = __esm({
|
|
44740
44740
|
"node_modules/uuid/dist/esm-node/sha1.js"() {
|
|
44741
44741
|
"use strict";
|
|
44742
|
-
|
|
44742
|
+
import_crypto4 = __toESM(require("crypto"));
|
|
44743
44743
|
sha1_default = sha1;
|
|
44744
44744
|
}
|
|
44745
44745
|
});
|
|
@@ -115955,7 +115955,6 @@ var import_fs_extra5 = __toESM(require_lib());
|
|
|
115955
115955
|
var import_path6 = require("path");
|
|
115956
115956
|
var import_os3 = require("os");
|
|
115957
115957
|
var import_child_process5 = require("child_process");
|
|
115958
|
-
var import_crypto2 = require("crypto");
|
|
115959
115958
|
|
|
115960
115959
|
// src/lib/file-tracker.ts
|
|
115961
115960
|
var import_crypto = require("crypto");
|
|
@@ -116689,11 +116688,11 @@ EndGlobal
|
|
|
116689
116688
|
throw new Error(`Template not found: ${templatePath}`);
|
|
116690
116689
|
}
|
|
116691
116690
|
let appSettingsContent = await import_fs_extra5.default.readFile(templatePath, "utf-8");
|
|
116692
|
-
|
|
116693
|
-
appSettingsContent = appSettingsContent.replace(/\{\{ProjectName\}\}/g, projectName).replace(/\{\{GenerateRandomSecret\}\}/g, randomSecret).replace(/\{\{ProjectDomain\}\}/g, `${projectName.toLowerCase()}.app`).replace(/\{\{ProjectNameLower\}\}/g, projectName.toLowerCase());
|
|
116691
|
+
appSettingsContent = appSettingsContent.replace(/\{\{ProjectName\}\}/g, projectName).replace(/\{\{ProjectDomain\}\}/g, `${projectName.toLowerCase()}.app`).replace(/\{\{ProjectNameLower\}\}/g, projectName.toLowerCase());
|
|
116694
116692
|
const appSettings = JSON.parse(appSettingsContent);
|
|
116695
116693
|
appSettings.MultiTenant = {
|
|
116696
116694
|
Enabled: config.multiTenant.enabled,
|
|
116695
|
+
EnableB2B: config.multiTenant.enableB2B,
|
|
116697
116696
|
EnableB2C: config.multiTenant.enableB2C,
|
|
116698
116697
|
SystemTenantSlug: config.multiTenant.systemTenantSlug,
|
|
116699
116698
|
SystemTenantName: config.multiTenant.systemTenantName,
|
|
@@ -117426,7 +117425,7 @@ async function initializeGit(config, dryRun) {
|
|
|
117426
117425
|
execCommand(`git commit -m "${commitMsg}"`, projectDir, dryRun);
|
|
117427
117426
|
}
|
|
117428
117427
|
}
|
|
117429
|
-
var initCommand = new Command("init").description("Initialize a new SmartStack project").argument("[name]", "Project name (optional, uses current folder if not provided)").option("--dry-run", "Show what would be created without actually creating").option("-y, --yes", "Skip prompts and use defaults").option("--skip-mcp-check", "Skip MCP servers verification").option("--multi-tenant", "Enable multi-tenant mode").option("--b2c", "Enable B2C (user tenant management)").option("--preview", "Use preview/prerelease versions (NuGet --prerelease + npm @next)").option("--here", "Initialize in current directory (use folder name as project name)").action(async (name, options) => {
|
|
117428
|
+
var initCommand = new Command("init").description("Initialize a new SmartStack project").argument("[name]", "Project name (optional, uses current folder if not provided)").option("--dry-run", "Show what would be created without actually creating").option("-y, --yes", "Skip prompts and use defaults").option("--skip-mcp-check", "Skip MCP servers verification").option("--multi-tenant", "Enable multi-tenant mode").option("--b2b", "Enable B2B (organisation management)").option("--b2c", "Enable B2C (user tenant management)").option("--preview", "Use preview/prerelease versions (NuGet --prerelease + npm @next)").option("--here", "Initialize in current directory (use folder name as project name)").action(async (name, options) => {
|
|
117430
117429
|
logger.header("SmartStack Project Initialization");
|
|
117431
117430
|
if (!options.skipMcpCheck) {
|
|
117432
117431
|
logger.info("Checking MCP servers...");
|
|
@@ -117666,6 +117665,7 @@ var initCommand = new Command("init").description("Initialize a new SmartStack p
|
|
|
117666
117665
|
projectDir: finalProjectDir,
|
|
117667
117666
|
multiTenant: {
|
|
117668
117667
|
enabled: options.multiTenant ?? true,
|
|
117668
|
+
enableB2B: options.b2b ?? true,
|
|
117669
117669
|
enableB2C: options.b2c ?? true,
|
|
117670
117670
|
systemTenantSlug: "default",
|
|
117671
117671
|
systemTenantName: "Default Workspace",
|
|
@@ -117680,6 +117680,13 @@ var initCommand = new Command("init").description("Initialize a new SmartStack p
|
|
|
117680
117680
|
message: "Enable multi-tenant mode?",
|
|
117681
117681
|
default: true
|
|
117682
117682
|
},
|
|
117683
|
+
{
|
|
117684
|
+
type: "confirm",
|
|
117685
|
+
name: "enableB2B",
|
|
117686
|
+
message: "Enable B2B (organisation management)?",
|
|
117687
|
+
default: true,
|
|
117688
|
+
when: (answers2) => answers2.multiTenantEnabled
|
|
117689
|
+
},
|
|
117683
117690
|
{
|
|
117684
117691
|
type: "confirm",
|
|
117685
117692
|
name: "enableB2C",
|
|
@@ -117710,6 +117717,7 @@ var initCommand = new Command("init").description("Initialize a new SmartStack p
|
|
|
117710
117717
|
projectDir: finalProjectDir,
|
|
117711
117718
|
multiTenant: {
|
|
117712
117719
|
enabled: answers.multiTenantEnabled ?? true,
|
|
117720
|
+
enableB2B: answers.enableB2B ?? true,
|
|
117713
117721
|
enableB2C: answers.enableB2C ?? true,
|
|
117714
117722
|
systemTenantSlug: answers.systemTenantSlug || "default",
|
|
117715
117723
|
systemTenantName: answers.systemTenantName || "Default Workspace",
|
|
@@ -117727,6 +117735,7 @@ var initCommand = new Command("init").description("Initialize a new SmartStack p
|
|
|
117727
117735
|
logger.info(`Preview mode: ${config.preview ? source_default.yellow("Enabled (prerelease)") : source_default.gray("Disabled (stable)")}`);
|
|
117728
117736
|
logger.info(`Multi-Tenant: ${config.multiTenant.enabled ? source_default.green("Enabled") : source_default.gray("Disabled")}`);
|
|
117729
117737
|
if (config.multiTenant.enabled) {
|
|
117738
|
+
logger.info(` B2B (Organisations): ${config.multiTenant.enableB2B ? source_default.green("Enabled") : source_default.gray("Disabled")}`);
|
|
117730
117739
|
logger.info(` B2C (User Tenants): ${config.multiTenant.enableB2C ? source_default.green("Enabled") : source_default.gray("Disabled")}`);
|
|
117731
117740
|
logger.info(` System Tenant: ${source_default.cyan(config.multiTenant.systemTenantSlug)} (${config.multiTenant.systemTenantName})`);
|
|
117732
117741
|
}
|
|
@@ -124550,7 +124559,6 @@ var glob = Object.assign(glob_, {
|
|
|
124550
124559
|
glob.glob = glob;
|
|
124551
124560
|
|
|
124552
124561
|
// src/lib/config-sync.ts
|
|
124553
|
-
var import_crypto3 = require("crypto");
|
|
124554
124562
|
function addMissingKeys(target, template, prefix = "") {
|
|
124555
124563
|
const added = [];
|
|
124556
124564
|
for (const key of Object.keys(template)) {
|
|
@@ -124570,8 +124578,7 @@ function addMissingKeys(target, template, prefix = "") {
|
|
|
124570
124578
|
return added;
|
|
124571
124579
|
}
|
|
124572
124580
|
function resolveTemplatePlaceholders(content, projectName) {
|
|
124573
|
-
|
|
124574
|
-
return content.replace(/\{\{ProjectName\}\}/g, projectName).replace(/\{\{GenerateRandomSecret\}\}/g, secret).replace(/\{\{ProjectDomain\}\}/g, `${projectName.toLowerCase()}.app`).replace(/\{\{ProjectNameLower\}\}/g, projectName.toLowerCase());
|
|
124581
|
+
return content.replace(/\{\{ProjectName\}\}/g, projectName).replace(/\{\{ProjectDomain\}\}/g, `${projectName.toLowerCase()}.app`).replace(/\{\{ProjectNameLower\}\}/g, projectName.toLowerCase());
|
|
124575
124582
|
}
|
|
124576
124583
|
function isPlainObject(value) {
|
|
124577
124584
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|