@fluentcommerce/ai-skills 0.14.0 → 0.15.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/README.md +3 -0
- package/bin/cli.mjs +198 -49
- package/content/cli/skills/fluent-bootstrap/SKILL.md +1 -1
- package/content/cli/skills/fluent-cli-mcp-cicd/SKILL.md +1 -1
- package/content/cli/skills/fluent-cli-reference/SKILL.md +1 -1
- package/content/cli/skills/fluent-cli-retailer/SKILL.md +1 -1
- package/content/cli/skills/fluent-connect/SKILL.md +1 -1
- package/content/cli/skills/fluent-workflow/SKILL.md +2 -1
- package/content/dev/agents/fluent-frontend-dev.md +1 -1
- package/content/dev/skills/fluent-account-snapshot/SKILL.md +1 -1
- package/content/dev/skills/fluent-archive/SKILL.md +2 -1
- package/content/dev/skills/fluent-build/SKILL.md +2 -2
- package/content/dev/skills/fluent-connection-analysis/SKILL.md +2 -1
- package/content/dev/skills/fluent-custom-code/SKILL.md +2 -1
- package/content/dev/skills/fluent-data-module-scaffold/SKILL.md +2 -1
- package/content/dev/skills/fluent-e2e-test/SKILL.md +1 -1
- package/content/dev/skills/fluent-entity-flow-diagnose/SKILL.md +2 -1
- package/content/dev/skills/fluent-event-api/SKILL.md +2 -1
- package/content/dev/skills/fluent-feature-explain/SKILL.md +2 -1
- package/content/dev/skills/fluent-feature-plan/SKILL.md +2 -1
- package/content/dev/skills/fluent-feature-status/SKILL.md +1 -1
- package/content/dev/skills/fluent-frontend-build/SKILL.md +1 -1
- package/content/dev/skills/fluent-frontend-readme/SKILL.md +2 -1
- package/content/dev/skills/fluent-frontend-review/SKILL.md +2 -1
- package/content/dev/skills/fluent-goal/SKILL.md +1 -1
- package/content/dev/skills/fluent-implementation-map/SKILL.md +1 -1
- package/content/dev/skills/fluent-inventory-catalog/SKILL.md +2 -2
- package/content/dev/skills/fluent-job-batch/SKILL.md +6 -3
- package/content/dev/skills/fluent-knowledge-init/SKILL.md +1 -1
- package/content/dev/skills/fluent-module-convert/SKILL.md +1 -1
- package/content/dev/skills/fluent-module-scaffold/SKILL.md +2 -1
- package/content/dev/skills/fluent-module-validate/SKILL.md +2 -1
- package/content/dev/skills/fluent-mystique-assess/SKILL.md +22 -6
- package/content/dev/skills/fluent-mystique-builder/SKILL.md +32 -1
- package/content/dev/skills/fluent-mystique-component/SKILL.md +1 -1
- package/content/dev/skills/fluent-mystique-diff/SKILL.md +1 -1
- package/content/dev/skills/fluent-mystique-preview/SKILL.md +19 -2
- package/content/dev/skills/fluent-mystique-scaffold/SKILL.md +12 -1
- package/content/dev/skills/fluent-mystique-sdk-reference/SKILL.md +2 -1
- package/content/dev/skills/fluent-pre-deploy-check/SKILL.md +3 -3
- package/content/dev/skills/fluent-retailer-config/SKILL.md +1 -1
- package/content/dev/skills/fluent-rollback/SKILL.md +1 -1
- package/content/dev/skills/fluent-rule-lookup/SKILL.md +2 -1
- package/content/dev/skills/fluent-rule-scaffold/SKILL.md +7 -6
- package/content/dev/skills/fluent-rule-test/SKILL.md +2 -1
- package/content/dev/skills/fluent-scope-plan/SKILL.md +1 -1
- package/content/dev/skills/fluent-session/SKILL.md +1 -1
- package/content/dev/skills/fluent-settings/SKILL.md +2 -2
- package/content/dev/skills/fluent-skill-observability/SKILL.md +1 -1
- package/content/dev/skills/fluent-sourcing/SKILL.md +38 -13
- package/content/dev/skills/fluent-system-monitoring/SKILL.md +1 -1
- package/content/dev/skills/fluent-test-data/SKILL.md +1 -1
- package/content/dev/skills/fluent-trace/SKILL.md +3 -2
- package/content/dev/skills/fluent-transition-api/SKILL.md +2 -1
- package/content/dev/skills/fluent-ui-record/SKILL.md +1 -1
- package/content/dev/skills/fluent-ui-test/SKILL.md +1 -1
- package/content/dev/skills/fluent-use-case-discover/SKILL.md +2 -2
- package/content/dev/skills/fluent-workflow-analyzer/SKILL.md +3 -2
- package/content/dev/skills/fluent-workspace-tree/SKILL.md +2 -1
- package/content/knowledge/platform/domain-model.md +1 -0
- package/content/knowledge/platform/workflow-json-structure.md +1 -1
- package/content/mcp-extn/skills/fluent-mcp-core/SKILL.md +2 -1
- package/content/mcp-extn/skills/fluent-mcp-tools/SKILL.md +3 -2
- package/content/rfl/skills/fluent-rfl-assess/SKILL.md +1 -1
- package/docs/02-prompt-guide.md +1 -1
- package/docs/03-use-cases.md +15 -13
- package/docs/04-onboarding-plan.md +1 -1
- package/docs/chrome-devtools-mcp-reference.md +34 -33
- package/docs/fluent-ai-skills-reference.md +10 -10
- package/metadata.json +1 -1
- package/package.json +6 -1
- package/scripts/postinstall.mjs +38 -0
- package/{content/dev/skills/fluent-trace/scripts/analyze-event-capture.mjs → tools/event-capture-analyzer.mjs} +3 -3
- package/tools/{generate-feature-dashboard.mjs → feature-dashboard.mjs} +2 -2
- package/tools/manifest-diff.mjs +1 -1
- package/{content/dev/skills/fluent-mystique-assess/validator.mjs → tools/manifest-validator.mjs} +2 -2
- package/tools/workflow-explainer.mjs +1021 -0
package/README.md
CHANGED
|
@@ -106,6 +106,9 @@ This downloads workflows, scans your account, and sets up the workspace. After t
|
|
|
106
106
|
>
|
|
107
107
|
> **How to verify:** `npx @fluentcommerce/ai-skills doctor` checks everything (skills, MCP, knowledge, docs, profile connectivity). `npx @fluentcommerce/ai-skills status` checks just the skill installation.
|
|
108
108
|
|
|
109
|
+
> [!IMPORTANT]
|
|
110
|
+
> **`knowledge/` and `docs/` are merge-safe.** The installer copies platform knowledge and reference docs into your workspace but **never deletes your own files**. Only files originally installed by the package are overwritten or removed on reinstall/uninstall. If you add custom notes, architecture docs, or team knowledge to these directories, they will be preserved across upgrades. A `.fluent-installed-files.json` manifest in each directory tracks which files are managed by the package.
|
|
111
|
+
|
|
109
112
|
---
|
|
110
113
|
|
|
111
114
|
## How It Works
|
package/bin/cli.mjs
CHANGED
|
@@ -797,6 +797,159 @@ function removeEntry(path, type) {
|
|
|
797
797
|
}
|
|
798
798
|
}
|
|
799
799
|
|
|
800
|
+
// ---------------------------------------------------------------------------
|
|
801
|
+
// Merge-install: copy source files into a destination directory without
|
|
802
|
+
// removing client-added files. Tracks installed files in a manifest so
|
|
803
|
+
// uninstall and re-install can clean up precisely.
|
|
804
|
+
// ---------------------------------------------------------------------------
|
|
805
|
+
|
|
806
|
+
const DIR_MANIFEST_FILENAME = ".fluent-installed-files.json";
|
|
807
|
+
|
|
808
|
+
/**
|
|
809
|
+
* Recursively collect all relative file paths under `dir`.
|
|
810
|
+
*/
|
|
811
|
+
function collectRelativePaths(dir, base = dir) {
|
|
812
|
+
const paths = [];
|
|
813
|
+
if (!existsSync(dir)) return paths;
|
|
814
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
815
|
+
const full = join(dir, entry.name);
|
|
816
|
+
if (entry.isDirectory()) {
|
|
817
|
+
paths.push(...collectRelativePaths(full, base));
|
|
818
|
+
} else {
|
|
819
|
+
paths.push(full.slice(base.length + 1).replace(/\\/g, "/"));
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
return paths;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* Merge-install `src` into `dest`: copy every file from src (overwriting
|
|
827
|
+
* same-named files) but leave client-added files untouched. Writes a
|
|
828
|
+
* manifest of installed files so future installs and uninstalls know
|
|
829
|
+
* exactly which files are "ours".
|
|
830
|
+
*
|
|
831
|
+
* Also removes files that were in the previous manifest but are no longer
|
|
832
|
+
* in the source (renamed/deleted upstream), then prunes empty directories.
|
|
833
|
+
*
|
|
834
|
+
* @param {string} src - source directory (package content)
|
|
835
|
+
* @param {string} dest - target directory (workspace or global)
|
|
836
|
+
* @param {Object} [options]
|
|
837
|
+
* @param {string[]} [options.exclude] - relative paths to skip (e.g. [".claude-plugin"])
|
|
838
|
+
* @returns {number} count of files installed
|
|
839
|
+
*/
|
|
840
|
+
function mergeInstallDir(src, dest, options = {}) {
|
|
841
|
+
const excludePatterns = (options.exclude || []).map((p) => p.replace(/\\/g, "/"));
|
|
842
|
+
ensureDir(dest);
|
|
843
|
+
|
|
844
|
+
// Read previous manifest to detect removals
|
|
845
|
+
const manifestPath = join(dest, DIR_MANIFEST_FILENAME);
|
|
846
|
+
const oldManifest = readJson(manifestPath);
|
|
847
|
+
const previousFiles = new Set((oldManifest && oldManifest.files) || []);
|
|
848
|
+
|
|
849
|
+
// Collect and copy source files
|
|
850
|
+
const isExcluded = (rel) => excludePatterns.some((pat) =>
|
|
851
|
+
rel === pat || rel.includes(pat) || rel.split("/").some((seg) => seg === pat)
|
|
852
|
+
);
|
|
853
|
+
const srcFiles = collectRelativePaths(src).filter((rel) => !isExcluded(rel));
|
|
854
|
+
|
|
855
|
+
for (const rel of srcFiles) {
|
|
856
|
+
const destFile = join(dest, rel);
|
|
857
|
+
ensureDir(dirname(destFile));
|
|
858
|
+
cpSync(join(src, rel), destFile, { force: true });
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
const installedSet = new Set(srcFiles);
|
|
862
|
+
|
|
863
|
+
// Remove files from previous install that no longer exist in source
|
|
864
|
+
for (const rel of previousFiles) {
|
|
865
|
+
if (!installedSet.has(rel)) {
|
|
866
|
+
const fullPath = join(dest, rel);
|
|
867
|
+
if (existsSync(fullPath)) {
|
|
868
|
+
rmSync(fullPath, { force: true });
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
// Prune empty directories (bottom-up) — skip dest root so install always has a target
|
|
874
|
+
const pruneEmpty = (dir) => {
|
|
875
|
+
if (!existsSync(dir)) return;
|
|
876
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
877
|
+
if (entry.isDirectory()) pruneEmpty(join(dir, entry.name));
|
|
878
|
+
}
|
|
879
|
+
try {
|
|
880
|
+
const remaining = readdirSync(dir);
|
|
881
|
+
if (remaining.length === 0 && !isSamePath(dir, dest)) {
|
|
882
|
+
rmSync(dir, { recursive: true, force: true });
|
|
883
|
+
}
|
|
884
|
+
} catch { /* dir already gone */ }
|
|
885
|
+
};
|
|
886
|
+
pruneEmpty(dest);
|
|
887
|
+
|
|
888
|
+
// Write new manifest
|
|
889
|
+
const manifest = {
|
|
890
|
+
version: pkg.version,
|
|
891
|
+
installedAt: new Date().toISOString(),
|
|
892
|
+
files: srcFiles.sort(),
|
|
893
|
+
};
|
|
894
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
|
|
895
|
+
|
|
896
|
+
return srcFiles.length;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
/**
|
|
900
|
+
* Remove only the files we previously installed (per manifest) from `dest`.
|
|
901
|
+
* Prunes empty directories afterwards. If no manifest exists, falls back
|
|
902
|
+
* to removing the entire directory (legacy behavior).
|
|
903
|
+
*
|
|
904
|
+
* @param {string} dest - target directory to clean
|
|
905
|
+
* @returns {boolean} true if anything was removed
|
|
906
|
+
*/
|
|
907
|
+
function mergeUninstallDir(dest) {
|
|
908
|
+
if (!existsSync(dest)) return false;
|
|
909
|
+
|
|
910
|
+
const manifestPath = join(dest, DIR_MANIFEST_FILENAME);
|
|
911
|
+
const manifest = readJson(manifestPath);
|
|
912
|
+
|
|
913
|
+
if (!manifest || !manifest.files) {
|
|
914
|
+
// Legacy: no manifest — remove everything (matches old behavior)
|
|
915
|
+
rmSync(dest, { recursive: true, force: true });
|
|
916
|
+
return true;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
let removed = 0;
|
|
920
|
+
for (const rel of manifest.files) {
|
|
921
|
+
const fullPath = join(dest, rel);
|
|
922
|
+
if (existsSync(fullPath)) {
|
|
923
|
+
rmSync(fullPath, { force: true });
|
|
924
|
+
removed++;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
// Remove the manifest itself
|
|
929
|
+
if (existsSync(manifestPath)) rmSync(manifestPath, { force: true });
|
|
930
|
+
|
|
931
|
+
// Remove .version stamp if present
|
|
932
|
+
const versionFile = join(dest, ".version");
|
|
933
|
+
if (existsSync(versionFile)) rmSync(versionFile, { force: true });
|
|
934
|
+
|
|
935
|
+
// Prune empty directories (bottom-up) — including dest root on uninstall
|
|
936
|
+
const pruneEmpty = (dir) => {
|
|
937
|
+
if (!existsSync(dir)) return;
|
|
938
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
939
|
+
if (entry.isDirectory()) pruneEmpty(join(dir, entry.name));
|
|
940
|
+
}
|
|
941
|
+
try {
|
|
942
|
+
const remaining = readdirSync(dir);
|
|
943
|
+
if (remaining.length === 0) {
|
|
944
|
+
rmSync(dir, { recursive: true, force: true });
|
|
945
|
+
}
|
|
946
|
+
} catch { /* dir already gone */ }
|
|
947
|
+
};
|
|
948
|
+
pruneEmpty(dest);
|
|
949
|
+
|
|
950
|
+
return removed > 0;
|
|
951
|
+
}
|
|
952
|
+
|
|
800
953
|
// ---------------------------------------------------------------------------
|
|
801
954
|
// Orphan cleanup: remove skills/agents from previous installs that are no
|
|
802
955
|
// longer in the current catalog. Uses a manifest file written after each
|
|
@@ -1232,10 +1385,12 @@ function installKnowledge() {
|
|
|
1232
1385
|
if (!existsSync(src)) return 0;
|
|
1233
1386
|
|
|
1234
1387
|
// 1. Local workspace copy (primary — supports account knowledge overrides)
|
|
1388
|
+
// Merge-install: overwrites our files, preserves client-added files.
|
|
1235
1389
|
const dest = join(getProjectRoot(), "knowledge");
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1390
|
+
let count = mergeInstallDir(src, dest, { exclude: [".claude-plugin"] });
|
|
1391
|
+
// Always clean up .claude-plugin directory if it leaked in
|
|
1392
|
+
const pluginDir = join(dest, ".claude-plugin");
|
|
1393
|
+
if (existsSync(pluginDir)) rmSync(pluginDir, { recursive: true, force: true });
|
|
1239
1394
|
// Stamp local copy with package version for doctor version comparison
|
|
1240
1395
|
writeFileSync(join(dest, ".version"), pkg.version, "utf-8");
|
|
1241
1396
|
|
|
@@ -1243,21 +1398,12 @@ function installKnowledge() {
|
|
|
1243
1398
|
const refModSrc = join(CONTENT_ROOT, "dev", "reference-modules");
|
|
1244
1399
|
if (existsSync(refModSrc)) {
|
|
1245
1400
|
const refModDest = join(dest, "reference-modules");
|
|
1246
|
-
|
|
1401
|
+
count += mergeInstallDir(refModSrc, refModDest);
|
|
1247
1402
|
}
|
|
1248
1403
|
|
|
1249
1404
|
// 3. Global fallback copy (so new workspaces can skip full install)
|
|
1250
1405
|
installGlobalKnowledge(src);
|
|
1251
1406
|
|
|
1252
|
-
// Count copied files for reporting
|
|
1253
|
-
let count = 0;
|
|
1254
|
-
const walk = (dir) => {
|
|
1255
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
1256
|
-
if (entry.isDirectory()) walk(join(dir, entry.name));
|
|
1257
|
-
else count++;
|
|
1258
|
-
}
|
|
1259
|
-
};
|
|
1260
|
-
walk(dest);
|
|
1261
1407
|
return count;
|
|
1262
1408
|
}
|
|
1263
1409
|
|
|
@@ -1269,15 +1415,12 @@ function installKnowledge() {
|
|
|
1269
1415
|
function installGlobalKnowledge(src) {
|
|
1270
1416
|
if (!src) src = join(CONTENT_ROOT, "knowledge");
|
|
1271
1417
|
if (!existsSync(src)) return 0;
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
cpSync(src, GLOBAL_KNOWLEDGE_DIR, { recursive: true, force: true });
|
|
1275
|
-
rmSync(join(GLOBAL_KNOWLEDGE_DIR, ".claude-plugin"), { recursive: true, force: true });
|
|
1418
|
+
// Global dir is fully managed (no client files) — merge-install for consistency
|
|
1419
|
+
mergeInstallDir(src, GLOBAL_KNOWLEDGE_DIR, { exclude: [".claude-plugin"] });
|
|
1276
1420
|
// Copy reference module catalog alongside global knowledge
|
|
1277
1421
|
const refModSrc = join(CONTENT_ROOT, "dev", "reference-modules");
|
|
1278
1422
|
if (existsSync(refModSrc)) {
|
|
1279
|
-
|
|
1280
|
-
cpSync(refModSrc, refModDest, { recursive: true, force: true });
|
|
1423
|
+
mergeInstallDir(refModSrc, join(GLOBAL_KNOWLEDGE_DIR, "reference-modules"));
|
|
1281
1424
|
}
|
|
1282
1425
|
// Stamp with package version so we can detect stale global knowledge
|
|
1283
1426
|
writeFileSync(join(GLOBAL_KNOWLEDGE_DIR, ".version"), pkg.version, "utf-8");
|
|
@@ -1304,26 +1447,8 @@ function installDocs() {
|
|
|
1304
1447
|
const dest = join(getProjectRoot(), "docs");
|
|
1305
1448
|
// Guard: when running from the repo itself, src === dest — skip to avoid self-deletion.
|
|
1306
1449
|
if (existsSync(dest) && realpathSync(src) === realpathSync(dest)) return 0;
|
|
1307
|
-
//
|
|
1308
|
-
|
|
1309
|
-
mkdirSync(dest, { recursive: true });
|
|
1310
|
-
// Copy file-by-file to avoid cpSync issues with Windows temp paths.
|
|
1311
|
-
for (const entry of readdirSync(src)) {
|
|
1312
|
-
if (entry.includes(".tmp.")) continue; // skip transient editor files
|
|
1313
|
-
try {
|
|
1314
|
-
cpSync(join(src, entry), join(dest, entry), { recursive: true, force: true });
|
|
1315
|
-
} catch { /* skip files that vanish between readdir and copy */ }
|
|
1316
|
-
}
|
|
1317
|
-
// Count copied files for reporting
|
|
1318
|
-
let count = 0;
|
|
1319
|
-
const walk = (dir) => {
|
|
1320
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
1321
|
-
if (entry.isDirectory()) walk(join(dir, entry.name));
|
|
1322
|
-
else count++;
|
|
1323
|
-
}
|
|
1324
|
-
};
|
|
1325
|
-
walk(dest);
|
|
1326
|
-
return count;
|
|
1450
|
+
// Merge-install: overwrites our files, preserves client-added files.
|
|
1451
|
+
return mergeInstallDir(src, dest, { exclude: [".tmp."] });
|
|
1327
1452
|
}
|
|
1328
1453
|
|
|
1329
1454
|
function buildStarterWorkspaceInstructions(fileName, profile, retailer) {
|
|
@@ -1654,16 +1779,15 @@ function generateStarterGeminiMd(profile, retailer) {
|
|
|
1654
1779
|
|
|
1655
1780
|
function uninstallKnowledge() {
|
|
1656
1781
|
const dest = join(getProjectRoot(), "knowledge");
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1782
|
+
// Uninstall nested reference-modules first (has its own manifest)
|
|
1783
|
+
const refModDest = join(dest, "reference-modules");
|
|
1784
|
+
mergeUninstallDir(refModDest);
|
|
1785
|
+
return mergeUninstallDir(dest);
|
|
1660
1786
|
}
|
|
1661
1787
|
|
|
1662
1788
|
function uninstallDocs() {
|
|
1663
1789
|
const dest = join(getProjectRoot(), "docs");
|
|
1664
|
-
|
|
1665
|
-
rmSync(dest, { recursive: true, force: true });
|
|
1666
|
-
return true;
|
|
1790
|
+
return mergeUninstallDir(dest);
|
|
1667
1791
|
}
|
|
1668
1792
|
|
|
1669
1793
|
function uninstallClaude(groups) {
|
|
@@ -4150,6 +4274,27 @@ function listGroups(groups) {
|
|
|
4150
4274
|
log("");
|
|
4151
4275
|
}
|
|
4152
4276
|
|
|
4277
|
+
function showGetStarted() {
|
|
4278
|
+
log(`
|
|
4279
|
+
fluent-ai-skills v${pkg.version}
|
|
4280
|
+
|
|
4281
|
+
No skills installed yet. Get started:
|
|
4282
|
+
|
|
4283
|
+
${"\x1b[36m"}npx @fluentcommerce/ai-skills install${"\x1b[0m"}
|
|
4284
|
+
|
|
4285
|
+
First time? Add a Fluent CLI profile for full API access:
|
|
4286
|
+
|
|
4287
|
+
${"\x1b[36m"}npx @fluentcommerce/ai-skills install --profile MYPROFILE${"\x1b[0m"}
|
|
4288
|
+
|
|
4289
|
+
Other targets (Codex, Gemini):
|
|
4290
|
+
|
|
4291
|
+
npx @fluentcommerce/ai-skills install --target codex
|
|
4292
|
+
npx @fluentcommerce/ai-skills install --target gemini
|
|
4293
|
+
|
|
4294
|
+
Run ${"\x1b[36m"}npx @fluentcommerce/ai-skills --help${"\x1b[0m"} for all options.
|
|
4295
|
+
`);
|
|
4296
|
+
}
|
|
4297
|
+
|
|
4153
4298
|
function showHelp(groups) {
|
|
4154
4299
|
const groupNames = getInstallableGroups(groups).map((group) => group.name).join(", ");
|
|
4155
4300
|
log(`
|
|
@@ -4330,7 +4475,11 @@ function main() {
|
|
|
4330
4475
|
const args = process.argv.slice(2);
|
|
4331
4476
|
|
|
4332
4477
|
if (args.length === 0) {
|
|
4333
|
-
|
|
4478
|
+
if (!hasAnyInstallations(groups)) {
|
|
4479
|
+
showGetStarted();
|
|
4480
|
+
} else {
|
|
4481
|
+
showHelp(groups);
|
|
4482
|
+
}
|
|
4334
4483
|
process.exit(0);
|
|
4335
4484
|
}
|
|
4336
4485
|
|
|
@@ -4470,8 +4619,8 @@ function main() {
|
|
|
4470
4619
|
log("");
|
|
4471
4620
|
targetUninstall(target, selected, { scope });
|
|
4472
4621
|
if (!hasAnyInstallations(groups)) {
|
|
4473
|
-
if (uninstallKnowledge()) logOk("removed knowledge/");
|
|
4474
|
-
if (uninstallDocs()) logOk("removed docs/");
|
|
4622
|
+
if (uninstallKnowledge()) logOk("removed managed files from knowledge/");
|
|
4623
|
+
if (uninstallDocs()) logOk("removed managed files from docs/");
|
|
4475
4624
|
}
|
|
4476
4625
|
if (purge) {
|
|
4477
4626
|
if (existsSync(GLOBAL_KNOWLEDGE_DIR)) {
|
|
@@ -4569,7 +4718,7 @@ function main() {
|
|
|
4569
4718
|
break;
|
|
4570
4719
|
}
|
|
4571
4720
|
case "dashboard": {
|
|
4572
|
-
const dashboardScript = join(dirname(fileURLToPath(import.meta.url)), "..", "tools", "
|
|
4721
|
+
const dashboardScript = join(dirname(fileURLToPath(import.meta.url)), "..", "tools", "feature-dashboard.mjs");
|
|
4573
4722
|
const dashArgs = [...commandArgs];
|
|
4574
4723
|
if (profile && !dashArgs.includes("--profile") && !dashArgs.includes("-p")) {
|
|
4575
4724
|
dashArgs.push("--profile", profile);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-bootstrap
|
|
3
|
-
description: Complete Fluent Commerce account bootstrap wizard for greenfield environments. Use when setting up a brand-new account from scratch with no existing CLI profile or retailer
|
|
3
|
+
description: Complete Fluent Commerce account bootstrap wizard for greenfield environments. Use when setting up a brand-new account from scratch with no existing CLI profile or retailer.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [profile-name] [retailer-ref]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-cli-mcp-cicd
|
|
3
|
-
description: Fluent CLI MCP and CI/CD operations guide
|
|
3
|
+
description: Fluent CLI MCP and CI/CD operations guide for MCP server configuration and safe module deployment in automation pipelines. Use for CI/CD pipeline setup or MCP connectivity validation.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [mcp|cicd] [--profile name] [--retailer ref]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-cli-reference
|
|
3
|
-
description: Complete Fluent Commerce CLI v2 command reference
|
|
3
|
+
description: Complete Fluent Commerce CLI v2 command reference with every command, flag, and output format. Use for any CLI question or to find the right specialist skill.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [command] [subcommand]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-cli-retailer
|
|
3
|
-
description: Manage Fluent retailer lifecycle via CLI
|
|
3
|
+
description: Manage Fluent retailer lifecycle via CLI including creation, listing, profile context validation, and retailer admin access. Use for retailer CRUD and deployment context setup.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <create|list> [retailer-ref] [--profile name]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-connect
|
|
3
|
-
description: Guided onboarding wizard to connect this workspace to an existing Fluent Commerce account
|
|
3
|
+
description: Guided onboarding wizard to connect this workspace to an existing Fluent Commerce account. Discovers profiles, wires MCP, downloads workflows. Use when connecting to an existing account.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [--profile <name>] [--retailer <ref>] [--force]
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-workflow
|
|
3
|
-
description:
|
|
3
|
+
description: List, download, merge fragments, and track workflow modifications via Fluent CLI. Use for workflow retrieval, export, merging customizations, or viewing logs.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <operation> [workflow-name]
|
|
7
7
|
cursor-tier: auto
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: HARD NEGATIVE — if the user wants to validate, review, lint, or analyze a workflow after download, route to fluent-workflow-analyzer; this skill owns retrieval and operational manipulation, not validation. -->
|
|
9
10
|
|
|
10
11
|
# Workflow Management
|
|
11
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-frontend-dev
|
|
3
|
-
description: Fluent Commerce frontend development agent for Mystique UI framework. Builds, validates, scaffolds, and analyzes Mystique manifests and SDK component projects. Triggers on "build manifest", "create page", "validate UI", "scaffold component", "analyze manifest", "mystique", "frontend", "ui component".
|
|
3
|
+
description: Fluent Commerce frontend development agent for Mystique UI framework. Builds, validates, scaffolds, and analyzes Mystique manifests and SDK component projects. Triggers on "build manifest", "create page", "validate UI", "scaffold component", "analyze manifest", "mystique", "frontend", "ui component", "new app", "build app", "create app".
|
|
4
4
|
tools: Bash, Read, Write, Edit, Glob, Grep
|
|
5
5
|
model: inherit
|
|
6
6
|
skills:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-account-snapshot
|
|
3
|
-
description: Lightweight account state snapshot
|
|
3
|
+
description: Lightweight account state snapshot covering retailers, workflows, modules, catalogues, settings, and UI customizations with MCP-first data collection. Use for account inventory or environment summary.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [--profile <name>] [--retailer <ref>] [--include <sections>] [--json] [--refresh]
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-archive
|
|
3
|
-
description: Archive completed or abandoned features by transitioning status.json to ARCHIVED state
|
|
3
|
+
description: Archive completed or abandoned features by transitioning status.json to ARCHIVED state and generating a closeout summary. Use when formally closing out a feature or marking it as archived.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <feature-slug> [--profile PROFILE] [--reason completed|abandoned|superseded] [--cleanup] [--force]
|
|
7
7
|
cursor-tier: auto
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY — if the prompt says "archive", "ARCHIVED", "closeout summary", "close feature", "mark as archived", or "feature done", route HERE — do NOT route to fluent-session. This skill transitions status.json and generates closeout summaries. fluent-session tracks file changes, which is completely different. Does NOT handle session summaries (use fluent-session), feature status tables (use fluent-feature-status), or change audits. -->
|
|
9
10
|
|
|
10
11
|
# Feature Archival
|
|
11
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-build
|
|
3
|
-
description: Build, version, and package Fluent Commerce extension modules
|
|
3
|
+
description: Build, version, and package Fluent Commerce extension modules with Maven compilation, version bumping, CHANGELOG updates, and git tagging. Use when compiling, packaging, or preparing a module release.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [build|version|package|deploy|full|status|bump|sync|tag] [--skip-tests] [--level patch|minor|major] [--dry-run]
|
|
@@ -78,7 +78,7 @@ This skill does **not** own deployment runbooks. For deployment:
|
|
|
78
78
|
|
|
79
79
|
| Signal | Condition | Example |
|
|
80
80
|
|--------|-----------|---------|
|
|
81
|
-
| `-> READY: <path>` | Build successful, artifact produced | `-> READY: accounts/MY_PROFILE/SOURCE/backend/fc-module-my-extensions/dist/
|
|
81
|
+
| `-> READY: <path>` | Build successful, artifact produced | `-> READY: accounts/MY_PROFILE/SOURCE/backend/fc-module-my-extensions/dist/fluent-commerce-my-extensions-0.0.30.zip` |
|
|
82
82
|
| `-> NEXT: /fluent-<skill>` | Ready for pre-deploy check | `-> NEXT: /fluent-pre-deploy-check` |
|
|
83
83
|
| `-> BLOCKED: <reason>` | Build failed | `-> BLOCKED: VALIDATION_FAILED — Compilation error in CancelOrderRule.java:45` |
|
|
84
84
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-connection-analysis
|
|
3
|
-
description: Analyze workflow connection topology across multiple rulesets and workflows
|
|
3
|
+
description: Analyze workflow connection topology across multiple rulesets and workflows with edge maps, runtime diffs, and orphan detection. Use for cross-entity hops, cross-workflow dependencies, or connection topology analysis.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <workflow-file-or-name> [--deep] [--mermaid] [--output <path>] [--validate <entity-ref> --entity-type ORDER|FULFILMENT] [--from <iso> --to <iso>]
|
|
7
7
|
cursor-tier: auto
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY — if the prompt says "connection analysis", "cross-entity hops", "orphaned rulesets across workflows", "internal edges", "cross-workflow dependencies", "runtime-vs-static topology", or "connection topology", route HERE — do NOT route to fluent-workflow-analyzer. fluent-workflow-analyzer handles a SINGLE workflow's internal graph; this skill maps topology ACROSS multiple workflows and entities. -->
|
|
9
10
|
|
|
10
11
|
# Fluent Connection Analysis
|
|
11
12
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-custom-code
|
|
3
|
-
description: Analyze custom Fluent implementation source code under accounts
|
|
3
|
+
description: Analyze custom Fluent implementation source code under accounts/PROFILE/SOURCE/backend, explain behavior, and prepare safe extension plans. Use for source-level backend questions about custom Java plugins, classes, or rule implementations.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <PROFILE> [--retailer <RETAILER_REF>] [--objective "<what to change>"]
|
|
7
7
|
cursor-tier: manual
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY — source-level backend questions like "which class handles X", "which rule implements Y", "explain this custom Java plugin" belong here, not in fluent-implementation-map or fluent-feature-explain. Workflow-name or feature-name prompts like "explain ORDER::HD end-to-end" stay on fluent-feature-explain unless the user explicitly asks about a class, plugin, module, or source file. -->
|
|
9
10
|
|
|
10
11
|
# Custom Code Intelligence
|
|
11
12
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-data-module-scaffold
|
|
3
|
-
description: Scaffold a new Fluent Commerce data module (no Java plugins)
|
|
3
|
+
description: Scaffold a new Fluent Commerce data module (no Java plugins) with assets directories, module.json, config template, and build script. Use for workflow-only, settings-only, or data-only modules without compiled code.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <module-name> [--profile <profile>]
|
|
7
7
|
cursor-tier: auto
|
|
8
8
|
planning-gate: mandatory
|
|
9
9
|
---
|
|
10
|
+
<!-- routing-notes: ROUTING PRIORITY over fluent-module-scaffold when the user says "no Java", "no code", "workflow-only module", "JSON-only module", "data-only module", or "no compiled plugins". Any constraint that eliminates Java compilation means data module, not extension module. -->
|
|
10
11
|
|
|
11
12
|
# Data Module Scaffolder
|
|
12
13
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-e2e-test
|
|
3
|
-
description: Run end-to-end test sequences for Fluent Commerce workflows
|
|
3
|
+
description: Run end-to-end test sequences for Fluent Commerce workflows by creating entities, firing events, polling statuses, and asserting state transitions. Use for explicit test scenarios or workflow verification runs.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [scenario-name] [--order-ref <ref>] [--entity-type ORDER|FULFILMENT]
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-entity-flow-diagnose
|
|
3
|
-
description:
|
|
3
|
+
description: Reconstruct the full lifecycle of a Fluent Commerce entity and compare observed runtime behavior against the static workflow definition. Use when comparing expected vs observed entity flow or reconstructing complete lifecycle history.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
read-only: true
|
|
6
6
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
7
7
|
argument-hint: <entity-ref-or-id> [--entity-type <TYPE>] [--identifier-kind ref|id|auto] [--from <iso> --to <iso>] [--output <path>] [--deep]
|
|
8
8
|
cursor-tier: auto
|
|
9
9
|
---
|
|
10
|
+
<!-- routing-notes: HARD NEGATIVE — Do NOT route here for JOB/BATCH entities (→ fluent-job-batch). ROUTING PRIORITY over fluent-trace when the prompt asks to "compare runtime vs expected", "expected vs observed", or "what should have happened". HARD NEGATIVE for fluent-trace confusion — Do NOT route here when the prompt says "trace why", "stuck", "root cause", "not progressing", "debug" WITHOUT comparison language. Pure first-responder debugging goes to fluent-trace. -->
|
|
10
11
|
|
|
11
12
|
# Entity Flow Diagnose
|
|
12
13
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-event-api
|
|
3
|
-
description:
|
|
3
|
+
description: Event API knowledge and conceptual reference covering the Fluent Commerce event data model, event types, categories, statuses, orchestration routing, run-once execution, and log vs audit actions. Use for event model questions or API semantics.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
read-only: true
|
|
6
6
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
7
7
|
argument-hint: [--entity-ref <ref>] [--entity-type ORDER|FULFILMENT] [--status FAILED|SUCCESS|SCHEDULED] [--type ORCHESTRATION|ORCHESTRATION_AUDIT]
|
|
8
8
|
cursor-tier: manual
|
|
9
9
|
---
|
|
10
|
+
<!-- routing-notes: ROUTING PRIORITY — if the prompt asks about "event model", "event types", "event categories", "event statuses", "how events are routed to rulesets", "run-once", "sourceEvents semantics", or "log action vs audit action", route HERE — do NOT route to fluent-feature-explain, fluent-workflow-analyzer, or fluent-mcp-tools. Even if the prompt mentions workflows, rulesets, event_list, or sourceEvents, semantic questions about the event data model belong HERE. fluent-mcp-tools is for sending events; this skill owns the Event API data model itself. -->
|
|
10
11
|
|
|
11
12
|
# Fluent Commerce Event API
|
|
12
13
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-feature-explain
|
|
3
|
-
description: Reverse-engineer and explain an existing Fluent Commerce feature
|
|
3
|
+
description: Reverse-engineer and explain an existing Fluent Commerce feature by synthesizing workflow analysis, custom code, connection topology, and runtime evidence into an architecture document. Use when explaining how a specific feature or workflow works.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <feature-name-or-workflow> [--depth shallow|full] [--include-runtime] [--output <path>]
|
|
7
7
|
cursor-tier: manual
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY — if the prompt names a specific existing workflow or feature such as "ORDER::HD", "FULFILMENT::CC", or asks "how does this work" or "reverse-engineer this feature", route HERE rather than fluent-implementation-map or fluent-feature-plan. HARD NEGATIVE — Do NOT route here for event-centric questions (→ fluent-event-api), broad account-wide inventory (→ fluent-implementation-map), future-change planning (→ fluent-feature-plan), or source-level plugin/class questions (→ fluent-custom-code). -->
|
|
9
10
|
|
|
10
11
|
# Feature Explainer
|
|
11
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-feature-plan
|
|
3
|
-
description: Produce comprehensive feature implementation plans with
|
|
3
|
+
description: Produce comprehensive feature implementation plans with NEW/EXISTING/MODIFIED/REUSED/OOTB classification across all artifacts including rules, workflows, and settings. Use for planning a feature implementation.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <feature-description> [--profile PROFILE] [--retailer RETAILER_REF]
|
|
@@ -96,6 +96,7 @@ Check for project-specific knowledge that should inform feature planning:
|
|
|
96
96
|
- `knowledge/platform/reference-modules.md` — use for OOTB capabilities before planning new custom assets
|
|
97
97
|
- `knowledge/platform/reusability-patterns.md` — use for deciding when to reuse patterns, extend them, or introduce new artifacts
|
|
98
98
|
- `knowledge/platform/sync-vs-async-patterns.md` — use for event choreography, sequencing, and long-running orchestration choices
|
|
99
|
+
- `knowledge/platform/interaction-design-patterns.md` — use for user action patterns, module visibility, and strict action contracts (eventName, context[], modules[], attributes[])
|
|
99
100
|
- `knowledge/platform/rule-development-contract.md` — **MANDATORY**: annotation contract (`@ParamString` vs `@EventAttribute`), reading patterns, enhancement protocol for Rules Inventory section
|
|
100
101
|
- `knowledge/platform/create-order-reference.md` — createOrder/createReturnOrder/createFulfilment input schemas, fulfilmentChoice wiring, ORDER::MULTI patterns. Use when planning features that create or modify orders.
|
|
101
102
|
4. If `accounts/<PROFILE>/memory/index.md` exists, read the top account-specific gotchas and apply them silently while planning.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-feature-status
|
|
3
|
-
description: Dashboard view of all features and their lifecycle status
|
|
3
|
+
description: Dashboard view of all features and their lifecycle status by scanning status.json files and presenting a consolidated table with filtering and sorting. Use for feature status overview or progress tracking.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Glob, Grep
|
|
6
6
|
argument-hint: [--profile PROFILE] [--filter STATUS] [--format table|json] [--tree]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-frontend-build
|
|
3
|
-
description: Build, test, and validate a Mystique SDK component project
|
|
3
|
+
description: Build, test, and validate a Mystique SDK component project with local dev server and 7 production quality gates. Use for frontend builds, local dev mode, or SDK bundle validation.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [project-path] [full|build|test|lint|check]
|