@cratis/pi 7.103.4 → 7.103.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/package/corpus/harnesses/copilot/instructions/local-work-artifacts.instructions.md +7 -7
  2. package/package/corpus/harnesses/copilot/instructions/specs.csharp.instructions.md +7 -5
  3. package/package/corpus/hooks/README.md +16 -0
  4. package/package/corpus/hooks/scripts/cratis-cleanup-worktrees.sh +148 -24
  5. package/package/corpus/rules/local-work-artifacts.md +7 -7
  6. package/package/corpus/rules/specs.csharp.md +7 -5
  7. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/SKILL.md +12 -4
  8. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/dependency-map.md +76 -0
  9. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/dotnet-nuget.md +3 -0
  10. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/npm-yarn.md +6 -4
  11. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/train-mode.md +43 -0
  12. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/worked-examples.md +166 -28
  13. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/scripts/cratis-local-packages.sh +1065 -60
  14. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/scripts/dependency-map.tsv +68 -0
  15. package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +20 -13
  16. package/package/corpus/skills/cratis-specifications-csharp/references/running-specs.md +90 -0
  17. package/package/corpus/skills/cratis-specifications-csharp/references/shared-lifecycle.md +55 -23
  18. package/package/corpus/skills/cratis-specifications-csharp/verification.json +5 -3
  19. package/package/corpus/skills/filter-syntax/SKILL.md +3 -1
  20. package/package/corpus/skills/run-tests/SKILL.md +1 -1
  21. package/package.json +1 -1
@@ -0,0 +1,68 @@
1
+ # Reference table of producer/consumer dependencies between Cratis repositories. cratis-local-packages.sh reads it to derive the pack plan.
2
+ # Tab-separated; # starts a comment; no versions (pins are read live from consumer manifests).
3
+ # pack <repo> <eco> <target> [PROP=VAL,...] pack targets; PROP is a -p:PROP=VAL argument (never an environment variable)
4
+ # ids <repo> <eco> <comma-separated expected package IDs>
5
+ # uses <consumer> <producer> <eco> <manifest path relative to consumer>
6
+ # image <repo> <dockerfile> <tag-suffix>
7
+ # A target of "." means the repository root (npm workspaces).
8
+
9
+ # Fundamentals
10
+ pack Fundamentals nuget Fundamentals.slnx
11
+ ids Fundamentals nuget Cratis.Fundamentals,Cratis.Metrics.Roslyn,Cratis.OpenTelemetry
12
+ pack Fundamentals npm .
13
+
14
+ # Orleans (edges only)
15
+ pack Orleans nuget Orleans.slnx
16
+
17
+ # Arc
18
+ pack Arc nuget Arc.slnx CratisSpecsTargetFramework=net10.0
19
+ ids Arc nuget Cratis.Arc,Cratis.Arc.Core,Cratis.Arc.MongoDB,Cratis.Arc.EntityFrameworkCore,Cratis.Arc.Swagger,Cratis.Arc.Connections.Azure,Cratis.Arc.ProxyGenerator.Build,Cratis.Arc.Testing
20
+ pack Arc npm .
21
+ ids Arc npm @cratis/arc,@cratis/arc.react,@cratis/arc.react.mvvm,@cratis/arc.vite
22
+
23
+ # Chronicle (clients only; the kernel ships as an image)
24
+ pack Chronicle nuget Source/Clients/Packages.slnf IsPackaging=true,DisableProxyGenerator=true,DisableDockerBuild=true
25
+ ids Chronicle nuget Cratis.Chronicle,Cratis.Chronicle.AspNetCore,Cratis.Chronicle.Aspire,Cratis.Chronicle.CodeAnalysis,Cratis.Chronicle.Connections,Cratis.Chronicle.Contracts,Cratis.Chronicle.Testing,Cratis.Chronicle.XUnit.Integration
26
+ image Chronicle Docker/Production/Dockerfile (none)
27
+
28
+ # Components
29
+ pack Components npm .
30
+ ids Components npm @cratis/components,@cratis/components.primereact,@cratis/components.mui
31
+
32
+ # Screenplay
33
+ pack Screenplay nuget Screenplay.slnx
34
+ pack Screenplay npm .
35
+ ids Screenplay npm @cratis/screenplay-language
36
+
37
+ # Stage
38
+ pack Stage nuget Stage.slnx
39
+
40
+ # Edges (consumer, producer, ecosystem, manifest)
41
+ uses Arc Fundamentals nuget Directory.Packages.props
42
+ uses Arc Chronicle nuget Directory.Packages.props
43
+ uses Arc Screenplay nuget Directory.Packages.props
44
+ uses Chronicle Fundamentals nuget Directory.Packages.props
45
+ uses Chronicle Arc nuget Directory.Packages.props
46
+ uses Chronicle Orleans nuget Directory.Packages.props
47
+ uses Chronicle Arc npm Source/Workbench
48
+ uses Orleans Arc nuget Directory.Packages.props
49
+ uses Orleans Chronicle nuget Directory.Packages.props
50
+ uses Orleans Fundamentals nuget Directory.Packages.props
51
+ uses Stage Fundamentals nuget Directory.Packages.props
52
+ uses Stage Arc nuget Directory.Packages.props
53
+ uses Stage Chronicle nuget Directory.Packages.props
54
+ uses Stage Screenplay nuget Directory.Packages.props
55
+ uses Studio Fundamentals nuget Directory.Packages.props
56
+ uses Studio Arc nuget Directory.Packages.props
57
+ uses Studio Chronicle nuget Directory.Packages.props
58
+ uses Studio Orleans nuget Directory.Packages.props
59
+ uses Studio Stage nuget Directory.Packages.props
60
+ uses Studio Screenplay nuget Directory.Packages.props
61
+ uses Studio Components npm .
62
+ uses Studio Screenplay npm .
63
+ uses Direct Fundamentals nuget Directory.Packages.props
64
+ uses Direct Arc nuget Directory.Packages.props
65
+ uses Direct Chronicle nuget Directory.Packages.props
66
+ uses Direct Orleans nuget Directory.Packages.props
67
+ uses Direct Screenplay nuget Directory.Packages.props
68
+ uses Direct Chronicle image Source/Watchdog/Dockerfile.full
@@ -25,8 +25,8 @@ Sources:
25
25
 
26
26
  | Package | Purpose |
27
27
  | --- | --- |
28
- | `Cratis.Specifications.XUnit` | `Specification` base, lifecycle discovery, `ShouldXxx` assertions, optional shared lifecycle |
29
- | `Cratis.Specifications` | `Catch.Exception`, `SpecificationMethods` (dependency of the XUnit package) |
28
+ | `Cratis.Specifications.XUnit.v3` | `Specification` base, lifecycle discovery, `ShouldXxx` assertions, shared lifecycle by default (house default; `.XUnit` is the xUnit v2 equivalent) |
29
+ | `Cratis.Specifications` | `Catch.Exception`, `SpecificationMethods` (dependency of the XUnit packages) |
30
30
  | `Cratis.Arc.Testing` | `CommandScenario<TCommand>` preserves explicit principal/override/policy services; see application-scenarios |
31
31
  | `Cratis.Chronicle.Testing` | `EventScenario`, `ReadModelScenario<T>`, `ReactorScenario<T>` |
32
32
 
@@ -100,10 +100,14 @@ resolved read-model key. See the ReactorScenario reference for diagnostics,
100
100
  exception capture and UTC occurrence-time defaults.
101
101
 
102
102
  Specification projects are named `<Source>.Specs`. Add a `PackageReference` to
103
- `Cratis.Specifications.XUnit`, not just `Cratis.Specifications`; the C#
104
- namespace stays `Cratis.Specifications`. The house runner is xUnit **2.x**
105
- not xUnit v3. Supported targets are net8.0/net9.0/net10.0;
106
- net48 was dropped (retain 3.x for that target).
103
+ `Cratis.Specifications.XUnit.v3`, not just `Cratis.Specifications`; the C#
104
+ namespace stays `Cratis.Specifications`. The house default is Specifications 5
105
+ on xUnit v3 with `xunit.v3.mtp-off` and `<OutputType>Exe</OutputType>`, run as
106
+ the built executable. 5.0 targets net10.0 only; net8.0/net9.0 projects stay on
107
+ 4.x and net48 on 3.x. A project that stays on xUnit v2 references
108
+ `Cratis.Specifications.XUnit`. Read [running-specs.md](references/running-specs.md)
109
+ for the project shape, the executable loop, filters, mixed solutions and the
110
+ 4.x → 5.0 checklist; the `run-tests` and `filter-syntax` skills own command choice.
107
111
  `Cratis.Specifications.NUnit` is an alternative with the same base pattern,
108
112
  `[Test]` instead of `[Fact]`, and **public** test methods.
109
113
 
@@ -199,15 +203,18 @@ public class when_<behavior> : Specification
199
203
  - Fields are `private` in a concrete specification and `protected` in a `given/`
200
204
  context, named `_camelCase`.
201
205
  - Any phase may be `async Task`. `void Destroy()` is optional teardown, after
202
- each fact by default; once per eligible class with the shared lifecycle opt-in.
206
+ once per eligible class by default (shared lifecycle); after each fact in a
207
+ `[PerFactSpecificationLifecycle]` class.
203
208
 
204
- `Cratis.Specifications.XUnit` discovers `Establish`, `Because`, and `Destroy` by
209
+ `Cratis.Specifications.XUnit.v3` discovers `Establish`, `Because`, and `Destroy` by
205
210
  convention — there are no attributes on them.
206
211
 
207
- Keep the stock per-fact lifecycle by default. Read
208
- [shared-lifecycle.md](references/shared-lifecycle.md) when deliberately opting
209
- into one instance and one Establish/Because execution per specification class.
210
- Facts must not mutate that shared context.
212
+ The shared lifecycle is the default: one instance and one Establish/Because
213
+ execution per specification class. Facts must not mutate that shared context;
214
+ `CRSPEC0008` is an error when one does. Read
215
+ [shared-lifecycle.md](references/shared-lifecycle.md) for eligibility, opting a
216
+ class, assembly or project out with `[PerFactSpecificationLifecycle]`, and
217
+ fixing `CRSPEC0008`.
211
218
 
212
219
  ## Step 4 — Extract a reusable context
213
220
 
@@ -297,7 +304,7 @@ between collaborators. That is where defects hide.
297
304
  Requires `Cratis.Specifications` 4.0.0 for the analyzers.
298
305
 
299
306
  CRSPEC0001–CRSPEC0007 ship as **warnings** in `Cratis.Specifications`, `.XUnit`,
300
- and `.NUnit`. A warnings-as-errors build enforces them: `should_` names,
307
+ `.XUnit.v3` and `.NUnit`; `CRSPEC0008` is an error. A warnings-as-errors build enforces them: `should_` names,
301
308
  one specification per file (given contexts exempt), no facts on given contexts,
302
309
  test attributes on `should_` methods, no explicit base lifecycle calls, public
303
310
  specification classes, and no `Because` on given contexts. See
@@ -0,0 +1,90 @@
1
+ <!-- Copyright (c) Cratis. All rights reserved. -->
2
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
3
+
4
+ # Running specifications and migrating to 5.0
5
+
6
+ Requires `Cratis.Specifications.XUnit.v3` 5.0 on `net10.0`. Check the
7
+ `PackageReference` versions in the specification project; 4.x projects follow the
8
+ checklist below before the executable loop applies.
9
+
10
+ Sources: [Running specifications fast](https://github.com/Cratis/Specifications/blob/main/Documentation/running-fast.md),
11
+ [The native runner](https://github.com/Cratis/Specifications/blob/main/Documentation/runner.md) and
12
+ [Upgrading to 5.0](https://github.com/Cratis/Specifications/blob/main/Documentation/upgrading-5.0.md).
13
+
14
+ ## Project shape
15
+
16
+ ```xml
17
+ <PropertyGroup>
18
+ <TargetFramework>net10.0</TargetFramework>
19
+ <OutputType>Exe</OutputType>
20
+ </PropertyGroup>
21
+ <ItemGroup>
22
+ <PackageReference Include="Cratis.Specifications.XUnit.v3" />
23
+ <PackageReference Include="xunit.v3.mtp-off" />
24
+ <PackageReference Include="Microsoft.NET.Test.Sdk" />
25
+ <PackageReference Include="xunit.runner.visualstudio" />
26
+ </ItemGroup>
27
+ ```
28
+
29
+ Versions live in `Directory.Packages.props`. Keep `Cratis.Specifications` and the
30
+ adapter package on the same version. The Cratis AI repository's `Source/Cratis.AI.Specs`
31
+ is a worked example, including the CI step that runs the built executable.
32
+
33
+ ## Local loop
34
+
35
+ An xUnit v3 suite costs about 4.5 times more CPU through `dotnet test` than as the
36
+ built executable (indicative, from the upstream benchmark). Restore and build once,
37
+ then run the executable:
38
+
39
+ ```bash
40
+ dotnet restore Source/MyProject.Specs
41
+ dotnet build Source/MyProject.Specs --configuration Release --no-restore
42
+ ./Source/MyProject.Specs/bin/Release/net10.0/MyProject.Specs
43
+ ```
44
+
45
+ Without an apphost, run `dotnet <path>/MyProject.Specs.dll`. `dotnet run --no-build`
46
+ also works but still starts MSBuild to resolve the project, so prefer the executable
47
+ for repeated runs. A pass is exit code 0 with the reported total equal to the
48
+ passed count.
49
+
50
+ Where a solution mixes Microsoft.Testing.Platform and VSTest projects, run each
51
+ project on its own; `dotnet test` on the whole solution does not work there.
52
+
53
+ ## Filters
54
+
55
+ The executable accepts the filters of the xUnit v3 runner flavor the project
56
+ references. Check the flavor with `<executable> -h`; the `run-tests` skill owns
57
+ the command choice and `filter-syntax` owns the expression syntax.
58
+
59
+ | Project references | Filter flags |
60
+ | --- | --- |
61
+ | `xunit.v3.mtp-off` (house default) | `-class`, `-method`, `-namespace`, `-trait`, or one `-filter "<query>"`; do not mix the three kinds |
62
+ | MTP-enabled `xunit.v3` | `--filter-class`, `--filter-method`, `--filter-trait`, or one `--filter-query` |
63
+ | `Cratis.Specifications.Runner` (experimental native runner) | `--treenode-filter '/*/*/when_registering/*'` or `--filter-uid <uid>` |
64
+
65
+ Do not use `dotnet test --filter` against an MTP executable. See the
66
+ [`run-tests`](../../run-tests/SKILL.md) and [`filter-syntax`](../../filter-syntax/SKILL.md)
67
+ skills for the exact command per platform.
68
+
69
+ ## Migrate from 4.x to 5.0
70
+
71
+ Follow the upstream [upgrade guide](https://github.com/Cratis/Specifications/blob/main/Documentation/upgrading-5.0.md)
72
+ and record the spec count and outcomes first.
73
+
74
+ 1. Record the baseline: total, passed, failed and skipped counts, and the list of
75
+ discovered classes and methods, from the unmodified branch.
76
+ 2. Target `net10.0` in every specification project; projects that must stay on
77
+ net8.0/net9.0 stay on 4.x.
78
+ 3. Move `Cratis.Specifications` and the adapter package to the same 5.0 version. For
79
+ xUnit v3 switch to `Cratis.Specifications.XUnit.v3`, `xunit.v3.mtp-off` and
80
+ `<OutputType>Exe</OutputType>`.
81
+ 4. Delete any `[assembly: Xunit.TestFramework(...)]` that registers Cratis
82
+ Specifications.
83
+ 5. Fix each `CRSPEC0008` error by moving the change into `Establish` or `Because`; use
84
+ `[PerFactSpecificationLifecycle]` only when the fact genuinely needs a fresh instance.
85
+ 6. Rebuild with warnings as errors and fix new nullable warnings.
86
+ 7. Run the executable and require the same total, the same passed count and the same
87
+ classes and methods as the baseline (display names may become more readable),
88
+ with no new skips. A different count means a spec was
89
+ lost or duplicated; investigate before continuing.
90
+ 8. Point CI at the built executable, and run mixed solutions project by project.
@@ -1,38 +1,70 @@
1
1
  <!-- Copyright (c) Cratis. All rights reserved. -->
2
2
  <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
3
3
 
4
- # Optional shared xUnit lifecycle
4
+ # Shared specification lifecycle
5
5
 
6
- Source: `Cratis.Specifications.XUnit`,
7
- `SpecificationTestFramework.cs`, `SpecificationTestClassRunner.cs`, and
8
- `Specification.cs`.
6
+ Requires `Cratis.Specifications.XUnit.v3` or `.XUnit` 5.0. Before 5.0 the shared
7
+ lifecycle was an opt-in on xUnit and `CRSPEC0008` was informational; check the package
8
+ version before relying on either. NUnit, TUnit and the native runner always share the
9
+ instance.
9
10
 
10
- Requires `Cratis.Specifications.XUnit` 4.1.0.
11
+ Source: [Running specifications fast](https://github.com/Cratis/Specifications/blob/main/Documentation/running-fast.md)
12
+ and [Upgrading to 5.0](https://github.com/Cratis/Specifications/blob/main/Documentation/upgrading-5.0.md).
11
13
 
12
- The house default remains stock xUnit
13
- per-fact execution.
14
+ The shared lifecycle is the house default. Plain xUnit builds a new instance per fact,
15
+ so `Establish` and `Because` would run once per fact; the shared lifecycle runs them
16
+ once per class, which is what a specification means: one context, one action,
17
+ several assertions. Construction, `Establish` and `Because` happen once, all facts share
18
+ the instance, and `Destroy` runs once after the last fact, including when
19
+ initialization failed. A throwing `Establish` or `Because` fails every fact in that
20
+ class.
14
21
 
15
- ## Opt in
22
+ The package registers the test framework. Delete any hand-written
23
+ `[assembly: Xunit.TestFramework("Cratis.Specifications.SpecificationTestFramework", ...)]`;
24
+ a duplicate fails the build with `CS0579`.
16
25
 
17
- Add this assembly attribute to the specification project:
26
+ ## Eligibility
27
+
28
+ A class is shared only when it derives from `Specification`, has a single public
29
+ parameterless constructor (or only framework-managed fixture arguments), does not
30
+ implement `IDisposable`, and has only plain facts. Theories, `ITestOutputHelper`
31
+ constructors, custom `IAsyncLifetime` implementations, custom fact test cases and plain
32
+ xUnit classes keep the per-fact lifecycle.
33
+
34
+ `Specification.InitializeAsync()` is idempotent for a single instance. It does not make
35
+ an ineligible class shared or cache instances across classes.
36
+
37
+ ## CRSPEC0008
38
+
39
+ `CRSPEC0008` is an error by default: a `should_` fact that assigns to or increments an
40
+ instance field or property of the specification, or calls `Add`, `AddRange`, `Remove`,
41
+ `RemoveAt`, `Clear` or `Insert` on one, would make the result depend on fact order.
42
+ Move the change into `Establish` or `Because`:
18
43
 
19
44
  ```csharp
20
- // Copyright (c) Cratis. All rights reserved.
21
- // Licensed under the MIT license. See LICENSE file in the project root for full license information.
45
+ public class when_registering : Specification
46
+ {
47
+ List<string> _registered;
22
48
 
23
- [assembly: Xunit.TestFramework("Cratis.Specifications.SpecificationTestFramework", "Cratis.Specifications.XUnit")]
49
+ void Establish() => _registered = [];
50
+ void Because() => _registered.Add("first");
51
+
52
+ [Fact] void should_have_one_registration() => _registered.Count.ShouldEqual(1);
53
+ }
24
54
  ```
25
55
 
26
- For eligible classes, construction, `Establish`, and `Because` happen once.
27
- All facts share the instance; `Destroy` runs once after the last fact, including
28
- when initialization failed. A throwing `Establish` or `Because` fails every fact
29
- in that class. Facts must only assert, never mutate shared context.
56
+ Do not lower the severity to pass the gate. When the repository must lower it, set it in
57
+ `.editorconfig` with `dotnet_diagnostic.CRSPEC0008.severity = warning`.
58
+
59
+ ## Keep per-fact execution
60
+
61
+ Use the narrowest scope; the reason is a fact that genuinely needs a fresh instance.
30
62
 
31
- A class is eligible only when it derives from `Specification`, has a single
32
- public parameterless constructor, does not implement `IDisposable`, and has only
33
- plain facts. Theories, custom fact test cases, fixture/output-helper constructors,
34
- and plain xUnit classes keep the stock per-fact lifecycle. This is not xUnit v3
35
- support; the package uses xUnit 2.x.
63
+ | Scope | How |
64
+ | --- | --- |
65
+ | One class | `[PerFactSpecificationLifecycle]` on the class |
66
+ | The assembly | `[assembly: PerFactSpecificationLifecycle]` |
67
+ | The project | `<CratisSpecificationsSharedLifecycle>false</CratisSpecificationsSharedLifecycle>` |
36
68
 
37
- `Specification.InitializeAsync()` is idempotent for a single instance. It does
38
- not make an ineligible class shared or cache instances across classes.
69
+ Read [running-specs.md](./running-specs.md) for the executable loop and the 4.x → 5.0
70
+ checklist.
@@ -3,9 +3,11 @@
3
3
  "input": "Set up a C# specification project and choose its lifecycle.",
4
4
  "fixtures": [],
5
5
  "assertions": [
6
- { "kind": "skill-contains", "value": "Cratis.Specifications.XUnit" },
7
- { "kind": "skill-contains", "value": "xUnit **2.x**" },
8
- { "kind": "skill-contains", "value": "stock per-fact lifecycle by default" },
6
+ { "kind": "skill-contains", "value": "Cratis.Specifications.XUnit.v3" },
7
+ { "kind": "skill-contains", "value": "<OutputType>Exe</OutputType>" },
8
+ { "kind": "skill-contains", "value": "running-specs.md" },
9
+ { "kind": "skill-contains", "value": "[PerFactSpecificationLifecycle]" },
10
+ { "kind": "skill-contains", "value": "CRSPEC0008" },
9
11
  { "kind": "skill-contains", "value": "shared-lifecycle.md" },
10
12
  { "kind": "skill-contains", "value": "CRSPEC0001–CRSPEC0007" },
11
13
  { "kind": "skill-contains", "value": "Do not suppress these warnings" }
@@ -80,7 +80,9 @@ dotnet test --filter "Name~LoginTest"
80
80
 
81
81
  ## MTP filters — xUnit (v3)
82
82
 
83
- xUnit v3 on MTP uses **framework-specific filter flags** instead of the generic `--filter` expression:
83
+ xUnit v3 on MTP uses **framework-specific filter flags** instead of the generic `--filter` expression. A project on `xunit.v3.mtp-off` (the Cratis specification default) runs the native xUnit v3 executable instead and takes `-class`, `-method`, `-namespace`, `-trait` or one `-filter "<query>"`; see the `cratis-specifications-csharp` skill's `references/running-specs.md`.
84
+
85
+ The flags below apply to the MTP-enabled `xunit.v3` runner:
84
86
 
85
87
  | Flag | Description |
86
88
  |------|-------------|
@@ -12,7 +12,7 @@ metadata:
12
12
 
13
13
  # Run .NET Tests
14
14
 
15
- Cratis rules in `.cratis/ai/rules/` (including `csharp.md`, `specs.csharp.md`, and `orleans.md`) and the `cratis-*` skills win where they differ. Specification authoring belongs to **cratis-specifications-csharp**; Cratis core repositories run xUnit v2 on VSTest.
15
+ Cratis rules in `.cratis/ai/rules/` (including `csharp.md`, `specs.csharp.md`, and `orleans.md`) and the `cratis-*` skills win where they differ. Specification authoring belongs to **cratis-specifications-csharp**; Cratis spec projects on Specifications 5 and xUnit v3 run as the built executable, not `dotnet test`; see its `references/running-specs.md` for the loop and filter flags. Projects still on xUnit v2 run on VSTest.
16
16
 
17
17
  Return or execute the command or command sequence that matches the repository's
18
18
  project system, test platform, framework, and SDK mode.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/pi",
3
- "version": "7.103.4",
3
+ "version": "7.103.6",
4
4
  "description": "Configuration-aware Cratis AI integration for Pi",
5
5
  "type": "module",
6
6
  "files": [