@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-sourcing
|
|
3
|
-
description:
|
|
3
|
+
description: Comprehensive reference for the Fluent Commerce Responsive Sourcing Framework covering profiles, strategies, conditions, criteria, scoring algorithms, and workflow integration. Use for sourcing configuration or fulfilment allocation questions.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
read-only: true
|
|
6
6
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
@@ -35,7 +35,9 @@ This is a **reference skill** — it provides domain knowledge and query pattern
|
|
|
35
35
|
|
|
36
36
|
## Related Knowledge
|
|
37
37
|
|
|
38
|
+
- `knowledge/platform/domain-model.md` — authoritative entity definitions for InventoryPosition, VirtualPosition, VirtualCatalogue, ControlGroup, Location, Network. **Read this first** for inventory entity relationships and GraphQL edges.
|
|
38
39
|
- `knowledge/platform/create-order-reference.md` — how FulfilmentChoice entities are created inline with orders, item-to-FC linkage, and ORDER::MULTI patterns. Sourcing operates on FulfilmentChoice entities created by the order intake mutation.
|
|
40
|
+
- `knowledge/platform/reference-module-versions.md` — OOTB inventory rules (CreateInventoryPosition, ApplyThresholdControlsToVirtualPosition, etc.) and sourcing rule versions.
|
|
39
41
|
- `knowledge/platform/financial-fields.md` — use for financial field naming conventions, tax/price/discount patterns on fulfilment and order entities
|
|
40
42
|
|
|
41
43
|
## When to Use
|
|
@@ -107,18 +109,28 @@ The `SourcingContext` is the runtime data object passed to conditions and criter
|
|
|
107
109
|
| `order` | Order | The full order entity |
|
|
108
110
|
| `order.totalPrice` | Float | Order total value |
|
|
109
111
|
| `order.attributes[]` | List | Order-level custom attributes |
|
|
110
|
-
| `fulfilmentChoice` | Object | Selected fulfilment option |
|
|
112
|
+
| `fulfilmentChoice` | Object | Selected fulfilment option (created by the order intake mutation) |
|
|
111
113
|
| `fulfilmentChoice.type` | String | e.g., `HD`, `CC`, `SFS` |
|
|
112
114
|
| `fulfilmentChoice.deliveryAddress` | Address | Delivery destination (lat/lng for distance) |
|
|
113
115
|
| `items[]` | List | Order items to source |
|
|
114
116
|
| `items[].productRef` | String | Product reference |
|
|
115
117
|
| `items[].requestedQuantity` | Integer | Quantity needed |
|
|
116
|
-
| `locations[]` | List | Candidate locations from network |
|
|
118
|
+
| `locations[]` | List | Candidate locations from the profile's network |
|
|
117
119
|
| `locations[].ref` | String | Location reference |
|
|
118
120
|
| `locations[].type` | String | e.g., `WAREHOUSE`, `STORE` |
|
|
119
121
|
| `locations[].address` | Address | Location coordinates |
|
|
120
122
|
| `locations[].attributes[]` | List | Location custom attributes |
|
|
121
|
-
| `inventoryPositions[]` | List |
|
|
123
|
+
| `inventoryPositions[]` | List | **InventoryPosition** records — raw on-hand stock per location per product |
|
|
124
|
+
|
|
125
|
+
> **IMPORTANT — InventoryPosition vs VirtualPosition:** The SourcingContext uses **InventoryPosition** (raw on-hand stock from the InventoryCatalogue), NOT **VirtualPosition** (available-to-sell after ControlGroup buffers/exclusions are applied). This distinction is critical:
|
|
126
|
+
>
|
|
127
|
+
> | Entity | What it holds | Used by sourcing? |
|
|
128
|
+
> |--------|--------------|-------------------|
|
|
129
|
+
> | **InventoryPosition** | Raw on-hand quantity at a location for a product | **Yes** — loaded into SourcingContext |
|
|
130
|
+
> | **VirtualPosition** | ATS quantity after ControlGroup buffers applied | **No** — used by storefront availability, not sourcing |
|
|
131
|
+
> | **ControlGroup / Control** | Buffer/exclusion rules that adjust ATS | **No** — affects VirtualPosition only, not sourcing decisions |
|
|
132
|
+
>
|
|
133
|
+
> When `inventoryAvailabilityExclusion` and `inventoryAvailability` criteria check stock, they check **InventoryPosition.onHand**, not VirtualPosition.quantity. See `knowledge/platform/domain-model.md` for full entity definitions and GraphQL edges.
|
|
122
134
|
|
|
123
135
|
Conditions use JSON path expressions to navigate this model. For example, `fulfilmentChoice.type` extracts the delivery type, `order.attributes[?(@.name=='priority')].value` extracts a custom attribute.
|
|
124
136
|
|
|
@@ -134,7 +146,7 @@ A Sourcing Profile is configured as a GraphQL entity and loaded at runtime by th
|
|
|
134
146
|
"status": "ACTIVE",
|
|
135
147
|
"retailerId": 1,
|
|
136
148
|
"catalogueRef": "DEFAULT:1",
|
|
137
|
-
"virtualCatalogueRef": "
|
|
149
|
+
"virtualCatalogueRef": "VC_DEFAULT:1",
|
|
138
150
|
"networkRef": "HD_NETWORK",
|
|
139
151
|
"maxSplit": 2,
|
|
140
152
|
"sourcingStrategies": [
|
|
@@ -157,8 +169,8 @@ A Sourcing Profile is configured as a GraphQL entity and loaded at runtime by th
|
|
|
157
169
|
| `ref` | Yes | Unique identifier for the profile |
|
|
158
170
|
| `status` | Yes | `DRAFT`, `ACTIVE`, or `INACTIVE` |
|
|
159
171
|
| `retailerId` | Yes | Owning retailer ID |
|
|
160
|
-
| `catalogueRef` | No |
|
|
161
|
-
| `virtualCatalogueRef` | No |
|
|
172
|
+
| `catalogueRef` | No | InventoryCatalogue ref for InventoryPosition lookup |
|
|
173
|
+
| `virtualCatalogueRef` | No | VirtualCatalogue ref — **overrides `catalogueRef`** when both are set. Uses ref-based linking (not id-based edges). |
|
|
162
174
|
| `networkRef` | No | Default network for location candidates |
|
|
163
175
|
| `maxSplit` | No | Maximum number of fulfilment locations (default: 1) |
|
|
164
176
|
| `sourcingStrategies` | Yes | Ordered list of strategies |
|
|
@@ -405,16 +417,16 @@ Criteria are classified by tag:
|
|
|
405
417
|
| `fc.sourcing.criterion.locationDistanceExclusion` | Exclusion | Exclude locations beyond a distance threshold | `value` (max distance), `valueUnit` (`KILOMETRES` or `MILES`) |
|
|
406
418
|
| `fc.sourcing.criterion.locationTypeExclusion` | Exclusion | Exclude locations of specified types | `value` (list of type strings, e.g., `["STORE"]`) |
|
|
407
419
|
| `fc.sourcing.criterion.locationNetworkExclusion` | Exclusion | Exclude locations not in the specified network | `value` (network ref string) |
|
|
408
|
-
| `fc.sourcing.criterion.inventoryAvailabilityExclusion` | Exclusion | Exclude locations with insufficient stock for all order items | *(none)* |
|
|
420
|
+
| `fc.sourcing.criterion.inventoryAvailabilityExclusion` | Exclusion | Exclude locations with insufficient on-hand stock (InventoryPosition) for all order items | *(none)* |
|
|
409
421
|
| `fc.sourcing.criterion.locationDistance` | Sorter | Score by distance from delivery address (closest = highest score) | *(none)* |
|
|
410
422
|
| `fc.sourcing.criterion.locationDistanceBanded` | Sorter | Score by distance using configurable bands | `bands` (list of `{from, to, score}`) |
|
|
411
423
|
| `fc.sourcing.criterion.locationDailyCapacity` | Sorter | Score by remaining daily fulfilment capacity | *(none)* |
|
|
412
424
|
| `fc.sourcing.criterion.networkPriority` | Sorter | Score by the location's network priority field | *(none)* |
|
|
413
|
-
| `fc.sourcing.criterion.inventoryAvailability` | Sorter | Score by stock quantity (more stock = higher score) | *(none)* |
|
|
425
|
+
| `fc.sourcing.criterion.inventoryAvailability` | Sorter | Score by on-hand stock quantity from InventoryPosition (more stock = higher score) | *(none)* |
|
|
414
426
|
| `fc.sourcing.criterion.inventoryAvailabilityBanded` | Sorter | Score by stock quantity using configurable bands | `bands` (list of `{from, to, score}`) |
|
|
415
427
|
| `fc.sourcing.criterion.orderValue` | Sorter | Score by order value handling capability | *(none)* |
|
|
416
428
|
|
|
417
|
-
> **Note on Parameter Names:** In `util-sourcing-2.1.0`, the JSON parsing logic uses generic keys like `"value"` and `"valueUnit"` (via `params.get("value")`). Newer versions may use descriptive names like `maxDistance`, `distanceUnit`, `excludedTypes`.
|
|
429
|
+
> **Note on Parameter Names:** In `util-sourcing-2.1.0`, the JSON parsing logic uses generic keys like `"value"` and `"valueUnit"` (via `params.get("value")`). Newer versions may use descriptive names like `maxDistance`, `distanceUnit`, `excludedTypes`. To discover parameter names for your version, use `/fluent-trace` to inspect a sourcing event's rule execution, or decompile the util-sourcing JAR deployed in your environment.
|
|
418
430
|
|
|
419
431
|
### Scoring and Normalization
|
|
420
432
|
|
|
@@ -907,7 +919,10 @@ compact: false
|
|
|
907
919
|
|
|
908
920
|
Review the flow inspection output for condition evaluation results.
|
|
909
921
|
|
|
910
|
-
**3. Verify
|
|
922
|
+
**3. Verify InventoryPosition data exists for candidate locations:**
|
|
923
|
+
|
|
924
|
+
Sourcing reads **InventoryPosition** (raw on-hand), not VirtualPosition (ATS). If locations are excluded for insufficient stock, verify InventoryPosition records exist:
|
|
925
|
+
|
|
911
926
|
```
|
|
912
927
|
Tool: graphql_query
|
|
913
928
|
Query: {
|
|
@@ -915,12 +930,22 @@ Query: {
|
|
|
915
930
|
catalogue: { ref: "DEFAULT:1" }
|
|
916
931
|
productRef: "<PRODUCT_REF>"
|
|
917
932
|
) {
|
|
918
|
-
edges { node { locationRef quantity status } }
|
|
933
|
+
edges { node { ref locationRef onHand quantity status } }
|
|
919
934
|
}
|
|
920
935
|
}
|
|
921
936
|
```
|
|
922
937
|
|
|
923
|
-
|
|
938
|
+
If InventoryPosition exists but sourcing still excludes the location, the `onHand` value may be below the requested quantity. Do NOT check VirtualPosition for sourcing issues — VirtualPosition reflects ATS after ControlGroup buffers, which sourcing does not use.
|
|
939
|
+
|
|
940
|
+
**4. Verify catalogueRef vs virtualCatalogueRef precedence:**
|
|
941
|
+
|
|
942
|
+
If both are set on the profile, `virtualCatalogueRef` overrides `catalogueRef`. Verify which is active:
|
|
943
|
+
```
|
|
944
|
+
Tool: graphql_query
|
|
945
|
+
Query: { sourcingProfile(ref: "<PROFILE_REF>") { catalogueRef virtualCatalogueRef } }
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
**5. Check settings for custom type registration:**
|
|
924
949
|
```
|
|
925
950
|
Tool: graphql_query
|
|
926
951
|
Query: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-system-monitoring
|
|
3
|
-
description: Monitor Fluent Commerce event processing health using Prometheus queries and aggregated analytics
|
|
3
|
+
description: Monitor Fluent Commerce event processing health using Prometheus queries and aggregated analytics for anomaly detection and alert triage. Use for failure rate analysis, event volume trends, or workflow gap identification.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [--from <ISO-datetime>] [--entity-type ORDER|FULFILMENT] [--top-n 20]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-test-data
|
|
3
|
-
description: Discover retailer configuration and generate valid test entity
|
|
3
|
+
description: Discover retailer configuration and generate valid test entity payloads dynamically via GraphQL with no hardcoded refs. Use for creating test data, discovering products or locations, or generating test entity payloads.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [entity-type] [--type HD|CC|SFS] [--count N]
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-trace
|
|
3
|
-
description:
|
|
3
|
+
description: First-responder debugging skill that traces and debugs Fluent Commerce event processing by analyzing failed events, correlating with workflows/rules, and identifying root causes. Use when any entity is stuck, broken, or not progressing.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <entity-ref> [--entity-type ORDER|FULFILMENT] [--status FAILED]
|
|
7
7
|
cursor-tier: manual
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY — this skill MUST win over fluent-entity-flow-diagnose when the prompt says "stuck", "trace why", "root cause", "not progressing", "debug" WITHOUT comparison language like "expected vs observed" or "compare runtime". YIELD-BACK — if the prompt ALSO contains "compare runtime vs expected", "expected vs observed", or "what should have happened", route to fluent-entity-flow-diagnose instead. HARD NEGATIVE — do NOT route here for conceptual Event API reference questions (event categories, statuses, run-once, log action vs audit action without a specific entity) — those belong to fluent-event-api. -->
|
|
9
10
|
|
|
10
11
|
# Event Trace & Debug
|
|
11
12
|
|
|
@@ -448,7 +449,7 @@ When the user asks questions like:
|
|
|
448
449
|
Use the bundled local analyzer after raw capture:
|
|
449
450
|
|
|
450
451
|
```text
|
|
451
|
-
node
|
|
452
|
+
node fluent-ai-skills/tools/event-capture-analyzer.mjs \
|
|
452
453
|
accounts/<PROFILE>/analysis/event-captures/<EVENT_ID>.event.json \
|
|
453
454
|
accounts/<PROFILE>/analysis/event-captures/<EVENT_ID>.window.json \
|
|
454
455
|
--root-ref <ORDER_REF> \
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-transition-api
|
|
3
|
-
description: Query the Fluent Commerce Transition API to discover available user actions for entities at any workflow status.
|
|
3
|
+
description: Query the Fluent Commerce Transition API to discover available user actions for entities at any workflow status. Read-only action discovery. Use for listing available actions, mapping required attributes, or UI action validation.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <entity-type> <subtype> <status> [--retailer-id <id>]
|
|
7
7
|
cursor-tier: auto
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: YIELD-BACK — if the prompt says "send" + event name, "dispatch event", "verify it landed", or "send and verify", route to fluent-mcp-tools instead. This skill discovers what actions EXIST; fluent-mcp-tools SENDS the events. ROUTING PRIORITY for prompts like "what user actions are available at BOOKED?" or "what attributes does each action need?" — those belong here, not in fluent-workflow-analyzer. -->
|
|
9
10
|
|
|
10
11
|
# Transition API — User Action Discovery
|
|
11
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-ui-record
|
|
3
|
-
description:
|
|
3
|
+
description: Record annotated UI walkthroughs of Fluent Commerce apps with before/after screenshots, DOM annotations, screencast recording, and HTML evidence reports. Use for capturing UI changes or documenting walkthroughs.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
read-only: false
|
|
6
6
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-ui-test
|
|
3
|
-
description: Browser-based UI testing for Fluent Commerce OMS
|
|
3
|
+
description: Browser-based UI testing for Fluent Commerce OMS and Store apps using Chrome DevTools MCP to verify page rendering, component display, and user action functionality. Use for UI testing or manifest deployment verification.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [--app oms|store|servicepoint] [--route /orders] [--entity-id <id>] [--screenshot] [--login]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-use-case-discover
|
|
3
|
-
description: Interactive requirements gathering wizard that produces a structured Business Specification
|
|
3
|
+
description: Interactive requirements gathering wizard that produces a structured Business Specification covering use cases, actors, business rules, integrations, and acceptance criteria. Use for requirements gathering, use case discovery, or PRD intake.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [--analyze <path-or-paste>] [--prd <path>] [--profile PROFILE] [--retailer RETAILER_REF]
|
|
@@ -322,7 +322,7 @@ UC-04: [Edge Case] <title> — <one-line summary>
|
|
|
322
322
|
|
|
323
323
|
**Rules:**
|
|
324
324
|
- One diagram per primary use case (UC-01) at minimum. Add diagrams for alternative/exception paths only if the flow is materially different (not just a different error message).
|
|
325
|
-
- Keep diagrams HIGH-LEVEL — 5-10 interactions max.
|
|
325
|
+
- Keep diagrams HIGH-LEVEL — 5-10 interactions max. Prefer business language (e.g., "Trigger StartPick event") over API detail (e.g., `POST /event/sync`). Detailed GraphQL fields, attribute names, and CSS belong in the plan, not the spec.
|
|
326
326
|
- Use Mermaid syntax — validated by `knowledge/mermaid-syntax-rules.md`.
|
|
327
327
|
- Diagrams go in spec §5a (after use cases, before entity model).
|
|
328
328
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-workflow-analyzer
|
|
3
|
-
description: Validate and analyze Fluent Commerce workflow JSON definitions
|
|
3
|
+
description: Validate and analyze Fluent Commerce workflow JSON definitions with structural checks, status graph mapping, event chain tracing, and orphan detection. Use for workflow validation, review, lint, or dependency analysis.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <workflow-file-or-name> [--validate-only] [--strict] [--fix-suggestions] [--deep] [--mermaid] [--explain-rules] [--profile <name>] [--output <path>]
|
|
7
7
|
cursor-tier: manual
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY — if the user wants to validate, check, review, lint, or sanity-check a workflow, route HERE even when the prompt also says "download workflow". Download-plus-validate requests are validation-led, so prefer this skill over fluent-workflow. -->
|
|
9
10
|
|
|
10
11
|
# Workflow Analyzer
|
|
11
12
|
|
|
@@ -153,7 +154,7 @@ WorkflowDefinition
|
|
|
153
154
|
|----|-------|----------|--------|
|
|
154
155
|
| G01 | All statuses have `name` | CRITICAL | Every entry in `statuses[]` must have a non-empty `name` string. |
|
|
155
156
|
| G02 | All statuses have `category` | HIGH | Every status should have a `category` from the standard set. Missing category = wrong UI badge rendering. |
|
|
156
|
-
| G03 | Category values are valid | MEDIUM | Category must be one of: `BOOKING`, `FULFILMENT`, `DELIVERY`, `DONE`, `EXCEPTION
|
|
157
|
+
| G03 | Category values are valid | MEDIUM | Category must be one of: `BOOKING`, `FULFILMENT`, `DELIVERY`, `DONE`, `EXCEPTION`, `GENERATION` (FO/FP workflows only). |
|
|
157
158
|
| G04 | No duplicate status names | HIGH | Two statuses with the same `name` (within the same entity type) cause undefined behavior. |
|
|
158
159
|
| G05 | Orphaned statuses | HIGH | A status defined in `statuses[]` but never referenced in any ruleset trigger or as a SetState destination is unreachable dead config. |
|
|
159
160
|
| G06 | Unreachable statuses | HIGH | If a status cannot be reached from the initial status (CREATED or first defined), it is unreachable. |
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-workspace-tree
|
|
3
|
-
description: Read-only directory tree visualization of the workspace file system
|
|
3
|
+
description: Read-only directory tree visualization of the workspace file system with annotated folders, artifact counts, and optional status overlays. Renders a filesystem structure view like the Unix tree command.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Glob, Grep
|
|
6
6
|
argument-hint: [--profile PROFILE] [--section source|workflows|features|reports|analysis|tasks|sessions] [--depth N]
|
|
7
7
|
cursor-tier: auto
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY — if the prompt says "directory tree", "workspace tree", "folder layout", or "workspace layout", route HERE — do NOT route to fluent-feature-status. fluent-feature-status scans status.json files; this skill renders the filesystem tree. Does NOT handle feature lifecycle tables (→ fluent-feature-status) or account snapshots (→ fluent-account-snapshot). -->
|
|
9
10
|
|
|
10
11
|
# Workspace Tree Visualization
|
|
11
12
|
|
|
@@ -555,6 +555,7 @@ event into the workflow engine — enabling automatic rule execution on entity c
|
|
|
555
555
|
| **Virtual Catalogue** | Virtual Position | `VIRTUAL_CATALOGUE`, `VIRTUAL_POSITION` | Both: No |
|
|
556
556
|
| **Control Group** | Control | `CONTROL_GROUP`, `CONTROL` | Both: No |
|
|
557
557
|
| **Return Order** | Return Fulfilment | `RETURN_ORDER`, `RETURN_FULFILMENT` | Both: Yes |
|
|
558
|
+
| **Job** `[SCHEMA]` | Batch | `JOB`, `BATCH` | JOB: Yes, BATCH: Yes `[SCHEMA: observed in API, not in official docs]` |
|
|
558
559
|
| **Billing Account** | Credit Memo, Invoice, Payment, Payment Transaction | `BILLING_ACCOUNT`, `CREDIT_MEMO`, `INVOICE`, `PAYMENT`, `PAYMENT_TRANSACTION` | All: Yes |
|
|
559
560
|
|
|
560
561
|
**Key implications:**
|
|
@@ -107,7 +107,7 @@ Field order inside each ruleset:
|
|
|
107
107
|
**Key rules:**
|
|
108
108
|
- `rules[]` comes BEFORE `triggers[]`
|
|
109
109
|
- `userActions: []` ALWAYS present (even if empty)
|
|
110
|
-
- NO `subtype` field on rulesets — entity-level `entitySubtype` handles routing
|
|
110
|
+
- NO `subtype` field on event-triggered rulesets — entity-level `entitySubtype` handles routing. Exception: rulesets with `userActions[]` MUST have `subtype` matching `entitySubtype` for UI button visibility (see `user-action-contract.md`).
|
|
111
111
|
- `eventType` is typically `"NORMAL"`
|
|
112
112
|
|
|
113
113
|
## Ruleset Matching (4 criteria)
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-mcp-core
|
|
3
|
-
description: Official Fluent Commerce CLI MCP server setup and operations. Configure the built-in MCP server, run health checks, validate GraphQL connectivity,
|
|
3
|
+
description: Official Fluent Commerce CLI MCP server setup and operations. Configure the built-in MCP server, run health checks, validate GraphQL connectivity, and manage workflow downloads. Use for built-in MCP server setup or GraphQL connectivity testing.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <operation> [--profile name] [--retailer ref]
|
|
7
7
|
cursor-tier: auto
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY over fluent-bootstrap and fluent-connect when prompt explicitly mentions "built-in MCP server", "official MCP server", "GraphQL connectivity". Route HERE only when official-server setup/testing is the primary task. Do not route send-event, Transition API, extension-only GraphQL, runtime connection switching, or extension workflow-get here (→ fluent-mcp-tools). Do not route CI/CD pipelines or non-interactive stdio setup here (→ fluent-cli-mcp-cicd). HARD NEGATIVE — Do NOT route for existing-account onboarding (→ fluent-connect) or MCP extension tools like connection_list, event_send, graphql_query (→ fluent-mcp-tools). -->
|
|
9
10
|
|
|
10
11
|
# Fluent MCP Core
|
|
11
12
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-mcp-tools
|
|
3
|
-
description: Fluent Commerce MCP extension server tools reference
|
|
3
|
+
description: Fluent Commerce MCP extension server tools reference covering all 59 tools including event sending, GraphQL execution, batch ingestion, and connection management. Use for sending events, dispatching, or verifying MCP operations.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: <operation> [entity-type] [entity-ref]
|
|
7
7
|
cursor-tier: manual
|
|
8
8
|
---
|
|
9
|
+
<!-- routing-notes: ROUTING PRIORITY over fluent-transition-api for ANY prompt that says "send" + event name, "dispatch event", "verify it landed", or "send and verify". ROUTING PRIORITY over fluent-bootstrap for event/MCP operations. ROUTING PRIORITY for MCP extension server tools — route here instead of fluent-mcp-core or fluent-workflow when prompt mentions extension tools like workflow_get, connection_list, event_send, graphql_query, batch_send. HARD NEGATIVE — Do NOT route here for broad CLI triage questions (→ fluent-cli-reference) or conceptual Event API questions about event statuses, categories, sourceEvents, orchestration routing, run-once semantics (→ fluent-event-api). Do not route Prometheus monitoring (→ fluent-system-monitoring), built-in server setup, or workflow_download (→ fluent-mcp-core). -->
|
|
9
10
|
|
|
10
11
|
# Fluent MCP Tools
|
|
11
12
|
|
|
@@ -579,7 +580,7 @@ To discover which attributes an entity supports and how they appear in mutations
|
|
|
579
580
|
|
|
580
581
|
### Schema Tool Annotations
|
|
581
582
|
|
|
582
|
-
All
|
|
583
|
+
All 59 MCP extension tools now advertise MCP `ToolAnnotations` (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`). MCP clients that respect annotations can automatically distinguish read-only operations (queries, introspection, cache status) from write operations (event_send, entity_create, workflow_upload).
|
|
583
584
|
|
|
584
585
|
## Batch Ingestion
|
|
585
586
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fluent-rfl-assess
|
|
3
|
-
description: Run a Ready For Launch (RFL) assessment on a Fluent Commerce implementation
|
|
3
|
+
description: Run a Ready For Launch (RFL) assessment on a Fluent Commerce implementation analyzing workflows, rules, settings, and integrations. Trigger on go-live readiness or production audit needs.
|
|
4
4
|
user-invocable: true
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
6
|
argument-hint: [--profile name] [--retailer ref]
|
package/docs/02-prompt-guide.md
CHANGED
|
@@ -78,7 +78,7 @@ These create or change things — the AI presents a plan and waits for your appr
|
|
|
78
78
|
|
|
79
79
|
| Skill | What it does | Try this |
|
|
80
80
|
|-------|-------------|----------|
|
|
81
|
-
| `fluent-pre-deploy-check` | Runs
|
|
81
|
+
| `fluent-pre-deploy-check` | Runs 37 quality gates across 9 phases — produces GO/NO-GO report | `"Run pre-deploy checks"` |
|
|
82
82
|
| `fluent-workflow-deploy` | Uploads workflow JSON to target environment | `"Deploy ORDER::RETURN to staging"` |
|
|
83
83
|
| `fluent-module-deploy` | Deploys compiled module to target environment | `"Deploy the returns module to staging"` |
|
|
84
84
|
| `fluent-e2e-test` | Runs end-to-end test with event firing and assertions | `"Run E2E test of the return flow"` |
|
package/docs/03-use-cases.md
CHANGED
|
@@ -132,7 +132,7 @@ This is the flagship use case. The AI follows the mandatory chain: **requirement
|
|
|
132
132
|
```
|
|
133
133
|
Help me define the use cases for a Return Order feature
|
|
134
134
|
```
|
|
135
|
-
The `/fluent-use-case-discover` wizard runs through
|
|
135
|
+
The `/fluent-use-case-discover` wizard runs through 12 phases:
|
|
136
136
|
- Entity types involved (ORDER, RETURN_ORDER, FULFILMENT)
|
|
137
137
|
- Business rules (return window, item eligibility, refund policies)
|
|
138
138
|
- Status lifecycles per entity
|
|
@@ -558,20 +558,22 @@ After approval:
|
|
|
558
558
|
Help me define the use cases for curbside pickup
|
|
559
559
|
```
|
|
560
560
|
|
|
561
|
-
`/fluent-use-case-discover` runs an interactive wizard through
|
|
561
|
+
`/fluent-use-case-discover` runs an interactive wizard through 12 phases:
|
|
562
562
|
|
|
563
563
|
| Phase | What happens | Output |
|
|
564
564
|
|---|---|---|
|
|
565
|
-
|
|
|
566
|
-
|
|
|
567
|
-
|
|
|
568
|
-
|
|
|
569
|
-
|
|
|
570
|
-
|
|
|
571
|
-
|
|
|
572
|
-
|
|
|
573
|
-
|
|
|
574
|
-
|
|
|
565
|
+
| 0. Mode detection | Detect input mode — vague idea vs structured requirements | Mode selection |
|
|
566
|
+
| 1. Feature identity | Define the feature boundary — what's in, what's out | Scope statement |
|
|
567
|
+
| 2. Actors & triggers | Identify who interacts (customer, store staff, OMS, WMS) | Actor registry |
|
|
568
|
+
| 3. User journeys | Walk through each user journey step by step | Structured use case list |
|
|
569
|
+
| 4. Entities & data | Define entities, subtypes, and relationships | Entity relationship diagram |
|
|
570
|
+
| 5. Business rules | Capture validation rules, constraints, edge cases | Rules inventory |
|
|
571
|
+
| 6. Integrations | Webhooks, external systems, scheduled jobs | Integration map |
|
|
572
|
+
| 7. UI & actions | User interface requirements and user actions | UI requirements |
|
|
573
|
+
| 8. Constraints & risks | Non-functional requirements, risks, edge cases | Risk register |
|
|
574
|
+
| 9. Acceptance criteria | Testable acceptance criteria per use case | Criteria list |
|
|
575
|
+
| 10. Review & gap analysis | Compare requirements against existing environment | Completeness score |
|
|
576
|
+
| 10b. Self-critique | Automated critique loop for spec quality | Refined spec |
|
|
575
577
|
|
|
576
578
|
**Output:** A Business Spec saved to `accounts/<PROFILE>/features/curbside-pickup/spec.md` with a completeness score (0-100%). Specs scoring >= 75% can proceed directly to `/fluent-feature-plan`.
|
|
577
579
|
|
|
@@ -640,7 +642,7 @@ Build it
|
|
|
640
642
|
```
|
|
641
643
|
Run pre-deploy checks
|
|
642
644
|
```
|
|
643
|
-
|
|
645
|
+
37 quality gates across 9 phases. If all pass → READY. If any critical gate fails → BLOCKED with specific fix instructions.
|
|
644
646
|
|
|
645
647
|
**Step 5: Deploy**
|
|
646
648
|
```
|
|
@@ -192,7 +192,7 @@ Now you build the feature planned in Week 1. The AI does the heavy lifting — y
|
|
|
192
192
|
```
|
|
193
193
|
Run pre-deploy checks for [module name]
|
|
194
194
|
```
|
|
195
|
-
|
|
195
|
+
37 quality gates across 9 phases. Review the GO/NO-GO report. Fix any blocking issues before continuing.
|
|
196
196
|
|
|
197
197
|
Then:
|
|
198
198
|
```
|
|
@@ -82,16 +82,16 @@ Adds `chrome-manual` server. Requires Chrome extension from https://github.com/h
|
|
|
82
82
|
|
|
83
83
|
```typescript
|
|
84
84
|
navigate_page({ url: "https://<account>.test.apps.engineering.fluentcommerce.com/oms" })
|
|
85
|
-
take_snapshot() // Find login form
|
|
85
|
+
take_snapshot() // Find login form uids
|
|
86
86
|
|
|
87
87
|
fill_form({
|
|
88
|
-
|
|
89
|
-
{
|
|
90
|
-
{
|
|
88
|
+
elements: [
|
|
89
|
+
{ uid: "username-input-uid", value: "YOUR_USERNAME" },
|
|
90
|
+
{ uid: "password-input-uid", value: "YOUR_PASSWORD" }
|
|
91
91
|
]
|
|
92
92
|
})
|
|
93
|
-
click({
|
|
94
|
-
wait_for({
|
|
93
|
+
click({ uid: "login-button-uid" })
|
|
94
|
+
wait_for({ text: ["Dashboard", "Orders"] })
|
|
95
95
|
take_snapshot() // Verify dashboard loaded
|
|
96
96
|
```
|
|
97
97
|
|
|
@@ -102,7 +102,7 @@ take_snapshot() // Verify dashboard loaded
|
|
|
102
102
|
navigate_page({ url: "https://<account>.test.apps.engineering.fluentcommerce.com/oms#/orders" })
|
|
103
103
|
|
|
104
104
|
// OR click navigation menu
|
|
105
|
-
click({
|
|
105
|
+
click({ uid: "orders-menu-item-uid" })
|
|
106
106
|
take_snapshot() // Verify orders list
|
|
107
107
|
```
|
|
108
108
|
|
|
@@ -110,9 +110,9 @@ take_snapshot() // Verify orders list
|
|
|
110
110
|
|
|
111
111
|
```typescript
|
|
112
112
|
take_snapshot()
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
wait_for({ timeout: 5000 })
|
|
113
|
+
click({ uid: "search-input-uid" }) // Focus the input first
|
|
114
|
+
type_text({ text: "TEST-ORDER-001", submitKey: "Enter" })
|
|
115
|
+
wait_for({ text: ["TEST-ORDER-001"], timeout: 5000 })
|
|
116
116
|
list_network_requests() // Verify GraphQL query fired
|
|
117
117
|
```
|
|
118
118
|
|
|
@@ -120,20 +120,22 @@ list_network_requests() // Verify GraphQL query fired
|
|
|
120
120
|
|
|
121
121
|
```typescript
|
|
122
122
|
fill_form({
|
|
123
|
-
|
|
124
|
-
{
|
|
125
|
-
{
|
|
126
|
-
{
|
|
123
|
+
elements: [
|
|
124
|
+
{ uid: "customer-autocomplete-uid", value: "John Doe" },
|
|
125
|
+
{ uid: "order-type-select-uid", value: "HD" },
|
|
126
|
+
{ uid: "order-ref-input-uid", value: "TEST-ORDER-123" }
|
|
127
127
|
]
|
|
128
128
|
})
|
|
129
|
-
|
|
130
|
-
click({
|
|
129
|
+
// For dropdowns, use fill_form or click to open then click the option
|
|
130
|
+
click({ uid: "retailer-select-uid" })
|
|
131
|
+
click({ uid: "retailer-option-uid" })
|
|
132
|
+
click({ uid: "submit-button-uid" })
|
|
131
133
|
```
|
|
132
134
|
|
|
133
135
|
### 5. Verify GraphQL API Calls
|
|
134
136
|
|
|
135
137
|
```typescript
|
|
136
|
-
click({
|
|
138
|
+
click({ uid: "refresh-button-uid" })
|
|
137
139
|
list_network_requests()
|
|
138
140
|
// Look for: url containing "graphql", method "POST", status 200
|
|
139
141
|
```
|
|
@@ -161,21 +163,21 @@ evaluate_script({
|
|
|
161
163
|
|
|
162
164
|
```typescript
|
|
163
165
|
list_console_messages()
|
|
164
|
-
click({
|
|
166
|
+
click({ uid: "problematic-button-uid" })
|
|
165
167
|
list_console_messages() // Returns array of { level: "error", text: "..." }
|
|
166
168
|
```
|
|
167
169
|
|
|
168
170
|
### 7. Screenshots for Visual Regression
|
|
169
171
|
|
|
170
172
|
```typescript
|
|
171
|
-
take_screenshot({ fullPage: true })
|
|
172
|
-
take_screenshot({
|
|
173
|
+
take_screenshot({ fullPage: true }) // Full page
|
|
174
|
+
take_screenshot({ uid: "order-card-uid" }) // Element-specific
|
|
173
175
|
```
|
|
174
176
|
|
|
175
177
|
### 8. Mobile Responsive Testing
|
|
176
178
|
|
|
177
179
|
```typescript
|
|
178
|
-
|
|
180
|
+
resize_page({ width: 390, height: 844 })
|
|
179
181
|
take_snapshot() // Verify mobile layout
|
|
180
182
|
```
|
|
181
183
|
|
|
@@ -296,7 +298,7 @@ window.__fcTimeline = {
|
|
|
296
298
|
|
|
297
299
|
| Symptom | Cause | Fix |
|
|
298
300
|
|---------|-------|-----|
|
|
299
|
-
| "Element not found" | Element not in DOM yet (still loading) | `wait_for({ timeout: 5000 })` then `take_snapshot()` |
|
|
301
|
+
| "Element not found" | Element not in DOM yet (still loading) | `wait_for({ text: ["expected text"], timeout: 5000 })` then `take_snapshot()` |
|
|
300
302
|
| Hash routing not working | Browser treated `#` as fragment | Use full URL: `https://...com/oms#/orders` (not just `#/orders`) |
|
|
301
303
|
| GraphQL mutation payload missing | POST bodies not always captured | Use `evaluate_script` with fetch interceptor (see above) |
|
|
302
304
|
| Flaky tests after navigation | No auto-wait after navigation | Always add `wait_for` after `navigate_page` |
|
|
@@ -373,23 +375,22 @@ jobs:
|
|
|
373
375
|
| Tool | Purpose | Key Parameters |
|
|
374
376
|
|------|---------|----------------|
|
|
375
377
|
| `navigate_page` | Go to URL | `url` |
|
|
376
|
-
| `click` | Click element | `
|
|
377
|
-
| `type_text` | Type
|
|
378
|
-
| `press_key` | Press keyboard key | `
|
|
379
|
-
| `fill_form` | Fill multiple fields | `
|
|
380
|
-
| `drag` | Drag and drop | `
|
|
381
|
-
| `hover` | Hover over element | `
|
|
382
|
-
| `
|
|
383
|
-
| `
|
|
384
|
-
| `
|
|
385
|
-
| `take_screenshot` | Capture screenshot | `fullPage`, `ref` |
|
|
378
|
+
| `click` | Click element | `uid`, `dblClick` |
|
|
379
|
+
| `type_text` | Type into focused input | `text`, `submitKey` |
|
|
380
|
+
| `press_key` | Press keyboard key | `key` |
|
|
381
|
+
| `fill_form` | Fill multiple fields | `elements: [{uid, value}]` |
|
|
382
|
+
| `drag` | Drag and drop | `from_uid`, `to_uid` |
|
|
383
|
+
| `hover` | Hover over element | `uid` |
|
|
384
|
+
| `upload_file` | Upload file | `uid`, `filePath` |
|
|
385
|
+
| `take_snapshot` | Get DOM snapshot | (returns structured JSON with uid per element) |
|
|
386
|
+
| `take_screenshot` | Capture screenshot | `fullPage`, `uid`, `filePath`, `format` |
|
|
386
387
|
| `list_console_messages` | Get console logs | (returns array) |
|
|
387
388
|
| `list_network_requests` | Get network activity | (returns array) |
|
|
388
389
|
| `evaluate_script` | Run JavaScript | `code` |
|
|
389
390
|
| `handle_dialog` | Handle alert/confirm | `action`, `text` |
|
|
390
391
|
| `close_page` | Close browser tab | |
|
|
391
392
|
| `resize_page` | Change viewport | `width`, `height` |
|
|
392
|
-
| `wait_for` | Wait for
|
|
393
|
+
| `wait_for` | Wait for text to appear | `text` (array of strings), `timeout` |
|
|
393
394
|
|
|
394
395
|
---
|
|
395
396
|
|