@plures/praxis 1.2.0 → 1.2.11
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 +93 -96
- package/dist/browser/{adapter-TM4IS5KT.js → adapter-CIMBGDC7.js} +5 -3
- package/dist/browser/{chunk-LE2ZJYFC.js → chunk-K377RW4V.js} +76 -0
- package/dist/{node/chunk-JQ64KMLN.js → browser/chunk-MBVHLOU2.js} +12 -1
- package/dist/browser/index.d.ts +32 -5
- package/dist/browser/index.js +15 -7
- package/dist/browser/integrations/svelte.d.ts +2 -2
- package/dist/browser/integrations/svelte.js +1 -1
- package/dist/browser/{reactive-engine.svelte-C9OpcTHf.d.ts → reactive-engine.svelte-9aS0kTa8.d.ts} +136 -1
- package/dist/node/{adapter-K6DOX6XS.js → adapter-75ISSMWD.js} +5 -3
- package/dist/node/chunk-5RH7UAQC.js +486 -0
- package/dist/{browser/chunk-JQ64KMLN.js → node/chunk-MBVHLOU2.js} +12 -1
- package/dist/node/{chunk-LE2ZJYFC.js → chunk-PRPQO6R5.js} +3 -72
- package/dist/node/chunk-R2PSBPKQ.js +150 -0
- package/dist/node/chunk-WZ6B3LZ6.js +638 -0
- package/dist/node/cli/index.cjs +2316 -832
- package/dist/node/cli/index.js +18 -0
- package/dist/node/components/index.d.cts +3 -2
- package/dist/node/components/index.d.ts +3 -2
- package/dist/node/index.cjs +620 -38
- package/dist/node/index.d.cts +259 -5
- package/dist/node/index.d.ts +259 -5
- package/dist/node/index.js +55 -65
- package/dist/node/integrations/svelte.cjs +76 -0
- package/dist/node/integrations/svelte.d.cts +2 -2
- package/dist/node/integrations/svelte.d.ts +2 -2
- package/dist/node/integrations/svelte.js +2 -1
- package/dist/node/{reactive-engine.svelte-1M4m_C_v.d.cts → reactive-engine.svelte-BFIZfawz.d.cts} +199 -1
- package/dist/node/{reactive-engine.svelte-ChNFn4Hj.d.ts → reactive-engine.svelte-CRNqHlbv.d.ts} +199 -1
- package/dist/node/reverse-W7THPV45.js +193 -0
- package/dist/node/{terminal-adapter-CWka-yL8.d.ts → terminal-adapter-B-UK_Vdz.d.ts} +28 -3
- package/dist/node/{terminal-adapter-CDzxoLKR.d.cts → terminal-adapter-BQSIF5bf.d.cts} +28 -3
- package/dist/node/validate-CNHUULQE.js +180 -0
- package/docs/core/pluresdb-integration.md +15 -15
- package/docs/decision-ledger/BEHAVIOR_LEDGER.md +225 -0
- package/docs/decision-ledger/DecisionLedger.tla +180 -0
- package/docs/decision-ledger/IMPLEMENTATION_SUMMARY.md +217 -0
- package/docs/decision-ledger/LATEST.md +166 -0
- package/docs/guides/cicd-pipeline.md +142 -0
- package/package.json +2 -2
- package/src/__tests__/cli-validate.test.ts +197 -0
- package/src/__tests__/decision-ledger.test.ts +485 -0
- package/src/__tests__/reverse-generator.test.ts +189 -0
- package/src/__tests__/scanner.test.ts +215 -0
- package/src/cli/commands/reverse.ts +289 -0
- package/src/cli/commands/validate.ts +264 -0
- package/src/cli/index.ts +47 -0
- package/src/core/pluresdb/adapter.ts +45 -2
- package/src/core/rules.ts +133 -0
- package/src/decision-ledger/README.md +400 -0
- package/src/decision-ledger/REVERSE_ENGINEERING.md +484 -0
- package/src/decision-ledger/facts-events.ts +121 -0
- package/src/decision-ledger/index.ts +70 -0
- package/src/decision-ledger/ledger.ts +246 -0
- package/src/decision-ledger/logic-ledger.ts +158 -0
- package/src/decision-ledger/reverse-generator.ts +426 -0
- package/src/decision-ledger/scanner.ts +506 -0
- package/src/decision-ledger/types.ts +247 -0
- package/src/decision-ledger/validation.ts +336 -0
- package/src/dsl/index.ts +13 -2
- package/src/index.browser.ts +2 -0
- package/src/index.ts +36 -0
- package/src/integrations/pluresdb.ts +14 -2
package/README.md
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
dotnet build
|
|
2
|
-
dotnet test
|
|
3
1
|
# Praxis
|
|
4
2
|
|
|
5
3
|
**Typed, visual-first application logic for Svelte, Node, and the browser.**
|
|
@@ -10,37 +8,10 @@ dotnet test
|
|
|
10
8
|
[](https://nodejs.org/)
|
|
11
9
|
[](https://deno.land/)
|
|
12
10
|
|
|
13
|
-
Praxis is
|
|
11
|
+
Praxis is a unified solution for declarative application development. The framework combines typed logic modeling (facts, events, rules, constraints), component generation (Svelte 5), and local-first data persistence (PluresDB). It includes visual tools (CodeCanvas, State-Docs), distributed system support (Unum), optional cloud relay, and a CLI for scaffolding and generation.
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
- **Component Auto-Generation**: Svelte 5 components generated from schemas
|
|
17
|
-
- **Data Persistence**: PluresDB for local-first, reactive data storage
|
|
18
|
-
- **Documentation**: Auto-generated docs with State-Docs and visual diagrams
|
|
19
|
-
- **Visual Editing**: CodeCanvas for schema design and FSM visualization
|
|
20
|
-
- **Distributed Systems**: Unum for identity and multi-node communication
|
|
13
|
+
The library delivers unified ESM/CJS builds with curated subpath exports (`./`, `./svelte`, `./schema`, `./component`, `./cloud`, `./components`), Svelte 5 runes support, and publish-ready packages for npm and JSR.
|
|
21
14
|
|
|
22
|
-
The library delivers a unified ESM/CJS build, curated subpath exports, Svelte runes support, and a slimmer, publish-ready package for npm and JSR.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## What’s new
|
|
27
|
-
- **Unified builds & exports**: `./`, `./svelte`, `./schema`, `./component`, `./cloud`, `./components`, and CLI all ship with ESM, CJS, and type definitions.
|
|
28
|
-
- **Svelte 5 runes native**: Runes-friendly stores and helpers; server+client builds for integrations.
|
|
29
|
-
- **Framework-agnostic reactivity**: Proxy-based reactive engine for use without Svelte, enabling reactive state management in Node.js, browsers, and any JavaScript environment.
|
|
30
|
-
- **Logic engine refinements**: Typed registry, step diagnostics, and trace-friendly rule execution.
|
|
31
|
-
- **Cloud relay & local-first**: Polished cloud connector alongside PluresDB-first workflows.
|
|
32
|
-
- **Publish-ready**: npm public access + JSR exports aligned to source.
|
|
33
|
-
|
|
34
|
-
## Capabilities at a glance
|
|
35
|
-
- **Logic Engine**: Facts, events, rules, constraints, registry, introspection, and reactive engine variants (Svelte 5 + framework-agnostic).
|
|
36
|
-
- **Schema & Codegen**: PSF-style schema types plus component generator for Svelte UIs.
|
|
37
|
-
- **Svelte Integration**: Typed helpers, runes-ready builds, and Svelte component typings.
|
|
38
|
-
- **Local-First Data**: PluresDB integration for offline-first, reactive state with full persistence.
|
|
39
|
-
- **Distributed Systems**: Unum integration for identity management and multi-node channels.
|
|
40
|
-
- **Documentation**: State-Docs integration for auto-generated Markdown docs and Mermaid diagrams.
|
|
41
|
-
- **Visual Editing**: CodeCanvas integration for visual schema design and FSM visualization.
|
|
42
|
-
- **Cloud Relay**: Optional sync layer (GitHub-auth friendly) for distributed teams.
|
|
43
|
-
- **CLI**: Scaffolding, generation, canvas helpers, docs generation, and cloud commands.
|
|
44
15
|
|
|
45
16
|
## Install
|
|
46
17
|
Node 18+ recommended.
|
|
@@ -55,7 +26,7 @@ pnpm add @plures/praxis
|
|
|
55
26
|
|
|
56
27
|
JSR (Deno):
|
|
57
28
|
```bash
|
|
58
|
-
|
|
29
|
+
deno add @plures/praxis
|
|
59
30
|
# or via import map pointing to npm:
|
|
60
31
|
# {
|
|
61
32
|
# "imports": { "@plures/praxis": "npm:@plures/praxis@^1.1.2" }
|
|
@@ -268,6 +239,67 @@ npx praxis generate --schema src/schemas/app.schema.ts
|
|
|
268
239
|
npx praxis canvas src/schemas/app.schema.ts
|
|
269
240
|
```
|
|
270
241
|
|
|
242
|
+
## Decision Ledger (Behavior Contracts)
|
|
243
|
+
|
|
244
|
+
Document, validate, and track the evolution of your rules and constraints with explicit behavioral contracts.
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
import { defineContract, defineRule } from '@plures/praxis';
|
|
248
|
+
|
|
249
|
+
// Define a contract with explicit behavior, examples, and invariants
|
|
250
|
+
const loginContract = defineContract({
|
|
251
|
+
ruleId: 'auth.login',
|
|
252
|
+
behavior: 'Process login events and create user session facts',
|
|
253
|
+
examples: [
|
|
254
|
+
{
|
|
255
|
+
given: 'User provides valid credentials',
|
|
256
|
+
when: 'LOGIN event is received',
|
|
257
|
+
then: 'UserSessionCreated fact is emitted'
|
|
258
|
+
}
|
|
259
|
+
],
|
|
260
|
+
invariants: ['Session must have unique ID'],
|
|
261
|
+
assumptions: [
|
|
262
|
+
{
|
|
263
|
+
id: 'assume-unique-username',
|
|
264
|
+
statement: 'Usernames are unique across the system',
|
|
265
|
+
confidence: 0.9,
|
|
266
|
+
justification: 'Standard authentication practice',
|
|
267
|
+
impacts: ['spec', 'tests', 'code'],
|
|
268
|
+
status: 'active'
|
|
269
|
+
}
|
|
270
|
+
]
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
// Attach contract to rule
|
|
274
|
+
const loginRule = defineRule({
|
|
275
|
+
id: 'auth.login',
|
|
276
|
+
description: 'Process login events',
|
|
277
|
+
impl: (state, events) => { /* ... */ },
|
|
278
|
+
contract: loginContract
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Validate contracts in CI/CD:**
|
|
283
|
+
```bash
|
|
284
|
+
# Validate all contracts
|
|
285
|
+
npx praxis validate --strict
|
|
286
|
+
|
|
287
|
+
# Generate SARIF for GitHub Actions
|
|
288
|
+
npx praxis validate --output sarif > results.sarif
|
|
289
|
+
|
|
290
|
+
# Reverse engineer contracts from existing code
|
|
291
|
+
npx praxis reverse --interactive
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Key features:**
|
|
295
|
+
- ✅ Explicit behavior documentation with Given/When/Then examples
|
|
296
|
+
- ✅ Assumption tracking with confidence levels
|
|
297
|
+
- ✅ Immutable ledger for change history
|
|
298
|
+
- ✅ Build-time validation and CI/CD integration
|
|
299
|
+
- ✅ Auto-generation from existing code
|
|
300
|
+
|
|
301
|
+
See [src/decision-ledger/README.md](./src/decision-ledger/README.md) for complete documentation.
|
|
302
|
+
|
|
271
303
|
## Exports map
|
|
272
304
|
- `@plures/praxis` → main engine (ESM/CJS/types)
|
|
273
305
|
- `@plures/praxis/svelte` → Svelte 5 integrations
|
|
@@ -280,6 +312,7 @@ npx praxis canvas src/schemas/app.schema.ts
|
|
|
280
312
|
## Documentation
|
|
281
313
|
- [Getting Started](./GETTING_STARTED.md)
|
|
282
314
|
- [Framework Guide](./FRAMEWORK.md)
|
|
315
|
+
- [Decision Ledger Guide](./src/decision-ledger/README.md)
|
|
283
316
|
- [Examples](./examples/)
|
|
284
317
|
|
|
285
318
|
## Contributing
|
|
@@ -538,7 +571,7 @@ Demonstrates the terminal node feature for command execution:
|
|
|
538
571
|
- Terminal adapter creation and configuration
|
|
539
572
|
- Command execution and history tracking
|
|
540
573
|
- YAML schema loading with terminal nodes
|
|
541
|
-
- PluresDB binding configuration
|
|
574
|
+
- PluresDB binding configuration
|
|
542
575
|
- Both text and widget input modes
|
|
543
576
|
|
|
544
577
|
```bash
|
|
@@ -599,6 +632,27 @@ Demonstrates real-time synchronization with Praxis Cloud relay service.
|
|
|
599
632
|
|
|
600
633
|
See [examples/cloud-sync/README.md](./examples/cloud-sync/README.md)
|
|
601
634
|
|
|
635
|
+
### 13. Decision Ledger (`examples/decision-ledger`)
|
|
636
|
+
|
|
637
|
+
Demonstrates behavior contracts for rules and constraints with validation and immutable ledger tracking.
|
|
638
|
+
|
|
639
|
+
Features:
|
|
640
|
+
- Contract definition with behavior, examples, and invariants
|
|
641
|
+
- Assumption tracking with confidence levels
|
|
642
|
+
- Validation and reporting (console, JSON, SARIF)
|
|
643
|
+
- Immutable logic ledger for change history
|
|
644
|
+
- CLI integration for CI/CD pipelines
|
|
645
|
+
|
|
646
|
+
```bash
|
|
647
|
+
npm run build
|
|
648
|
+
node examples/decision-ledger/index.js
|
|
649
|
+
|
|
650
|
+
# Validate contracts
|
|
651
|
+
npx praxis validate --registry examples/sample-registry.js
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
See [examples/decision-ledger/README.md](./examples/decision-ledger/README.md)
|
|
655
|
+
|
|
602
656
|
## API Reference
|
|
603
657
|
|
|
604
658
|
### Core Types
|
|
@@ -673,7 +727,7 @@ Praxis integrates with the full Plures ecosystem:
|
|
|
673
727
|
|
|
674
728
|
### PluresDB Integration
|
|
675
729
|
|
|
676
|
-
Local-first reactive datastore for offline-capable applications.
|
|
730
|
+
Local-first reactive datastore for offline-capable applications. Fully implemented with 32 tests covering all features.
|
|
677
731
|
|
|
678
732
|
```typescript
|
|
679
733
|
import {
|
|
@@ -722,7 +776,7 @@ adapter.subscribeToEvents((events) => {
|
|
|
722
776
|
|
|
723
777
|
### Unum Integration
|
|
724
778
|
|
|
725
|
-
Identity and channels for distributed systems.
|
|
779
|
+
Identity and channels for distributed systems. Fully implemented with comprehensive channel and identity management.
|
|
726
780
|
|
|
727
781
|
```typescript
|
|
728
782
|
import {
|
|
@@ -772,40 +826,10 @@ attachUnumToEngine(engine, unum, channel.id);
|
|
|
772
826
|
**Tests**: Comprehensive integration tests
|
|
773
827
|
**Use Cases**: Distributed messaging, identity management, multi-user collaboration
|
|
774
828
|
|
|
775
|
-
### ADP Integration
|
|
776
|
-
|
|
777
|
-
Architectural Decision Protocol for guardrails and governance.
|
|
778
|
-
|
|
779
|
-
```typescript
|
|
780
|
-
import { createADP } from '@plures/adp';
|
|
781
|
-
|
|
782
|
-
// Track architectural decisions from schemas
|
|
783
|
-
const adp = createADP({
|
|
784
|
-
source: 'praxis-schema',
|
|
785
|
-
decisions: [
|
|
786
|
-
{
|
|
787
|
-
id: 'ADR-001',
|
|
788
|
-
title: 'Use PluresDB for local-first storage',
|
|
789
|
-
context: 'Need offline-capable data storage',
|
|
790
|
-
decision: 'Adopt PluresDB',
|
|
791
|
-
consequences: ['Offline support', 'Sync complexity'],
|
|
792
|
-
},
|
|
793
|
-
],
|
|
794
|
-
});
|
|
795
|
-
|
|
796
|
-
// Enforce guardrails
|
|
797
|
-
adp.enforce({
|
|
798
|
-
rule: 'no-direct-database-access',
|
|
799
|
-
check: (code) => !code.includes('direct-sql'),
|
|
800
|
-
});
|
|
801
|
-
```
|
|
802
|
-
|
|
803
|
-
**Status**: Planned
|
|
804
|
-
**Use Cases**: Architecture documentation, compliance checking, guardrails
|
|
805
829
|
|
|
806
830
|
### State-Docs Integration
|
|
807
831
|
|
|
808
|
-
Living documentation generated from Praxis schemas.
|
|
832
|
+
Living documentation generated from Praxis schemas. Fully implemented with Markdown and Mermaid diagram generation.
|
|
809
833
|
|
|
810
834
|
```typescript
|
|
811
835
|
import {
|
|
@@ -855,12 +879,11 @@ const allDocs = generateDocs(appSchema, {
|
|
|
855
879
|
- **Table of Contents**: Automatic ToC generation
|
|
856
880
|
|
|
857
881
|
**Status**: ✅ Available (`src/integrations/state-docs.ts`)
|
|
858
|
-
**CLI**: Use `praxis generate` with `--docs` flag (coming soon)
|
|
859
882
|
**Documentation**: Auto-generates README, models.md, logic diagrams
|
|
860
883
|
|
|
861
884
|
### CodeCanvas Integration
|
|
862
885
|
|
|
863
|
-
Visual IDE for schema and logic editing.
|
|
886
|
+
Visual IDE for schema and logic editing. Fully implemented with schema visualization and canvas export.
|
|
864
887
|
|
|
865
888
|
```typescript
|
|
866
889
|
import {
|
|
@@ -914,15 +937,13 @@ const updatedSchema = editor.toSchema();
|
|
|
914
937
|
- **Guardian Validation**: Pre-commit lifecycle checks
|
|
915
938
|
|
|
916
939
|
**Status**: ✅ Available (`src/integrations/code-canvas.ts`)
|
|
917
|
-
**CLI**: Use `praxis canvas` commands (coming soon)
|
|
918
940
|
**Documentation**: [docs/guides/canvas.md](./docs/guides/canvas.md)
|
|
919
941
|
|
|
920
|
-
### Svelte
|
|
942
|
+
### Svelte Integration
|
|
921
943
|
|
|
922
|
-
|
|
944
|
+
Svelte v5 integration with reactive stores.
|
|
923
945
|
|
|
924
946
|
```typescript
|
|
925
|
-
// Svelte v5 integration (available now)
|
|
926
947
|
import { createPraxisStore } from '@plures/praxis/svelte';
|
|
927
948
|
|
|
928
949
|
const stateStore = createPraxisStore(engine);
|
|
@@ -930,15 +951,8 @@ const userStore = createDerivedStore(engine, (ctx) => ctx.currentUser);
|
|
|
930
951
|
|
|
931
952
|
// In Svelte component:
|
|
932
953
|
// $: currentUser = $userStore;
|
|
933
|
-
|
|
934
|
-
// Desktop app with Tauri
|
|
935
|
-
npm run tauri:dev // Development
|
|
936
|
-
npm run tauri:build // Production
|
|
937
954
|
```
|
|
938
955
|
|
|
939
|
-
**Status**: Svelte integration available, Tauri templates planned
|
|
940
|
-
**Platform Support**: Web (now), Desktop (planned), Mobile (future)
|
|
941
|
-
|
|
942
956
|
## Cross-Language Usage
|
|
943
957
|
|
|
944
958
|
### PowerShell
|
|
@@ -1012,23 +1026,6 @@ Console.WriteLine($"Facts: {result.State.Facts.Count}"); // Facts: 1
|
|
|
1012
1026
|
|
|
1013
1027
|
See [csharp/Praxis/README.md](./csharp/Praxis/README.md) for complete documentation.
|
|
1014
1028
|
|
|
1015
|
-
## Roadmap
|
|
1016
|
-
|
|
1017
|
-
### Current Focus
|
|
1018
|
-
|
|
1019
|
-
- Full CodeCanvas integration
|
|
1020
|
-
- Enhanced Unum identity support
|
|
1021
|
-
- Advanced State-Docs generation
|
|
1022
|
-
- Multi-language schema support
|
|
1023
|
-
- Real PluresDB sync with CRDT/offline-first capabilities
|
|
1024
|
-
|
|
1025
|
-
### Long Term
|
|
1026
|
-
|
|
1027
|
-
- Mobile templates (iOS, Android)
|
|
1028
|
-
- Enterprise features
|
|
1029
|
-
- Advanced orchestration
|
|
1030
|
-
- Performance optimizations
|
|
1031
|
-
- Plugin ecosystem
|
|
1032
1029
|
|
|
1033
1030
|
## Cross-Language Support
|
|
1034
1031
|
|
|
@@ -2,11 +2,13 @@ import {
|
|
|
2
2
|
InMemoryPraxisDB,
|
|
3
3
|
PluresDBPraxisAdapter,
|
|
4
4
|
createInMemoryDB,
|
|
5
|
-
createPluresDB
|
|
6
|
-
|
|
5
|
+
createPluresDB,
|
|
6
|
+
createPraxisLocalFirst
|
|
7
|
+
} from "./chunk-MBVHLOU2.js";
|
|
7
8
|
export {
|
|
8
9
|
InMemoryPraxisDB,
|
|
9
10
|
PluresDBPraxisAdapter,
|
|
10
11
|
createInMemoryDB,
|
|
11
|
-
createPluresDB
|
|
12
|
+
createPluresDB,
|
|
13
|
+
createPraxisLocalFirst
|
|
12
14
|
};
|
|
@@ -6,6 +6,17 @@ import {
|
|
|
6
6
|
var PraxisRegistry = class {
|
|
7
7
|
rules = /* @__PURE__ */ new Map();
|
|
8
8
|
constraints = /* @__PURE__ */ new Map();
|
|
9
|
+
compliance;
|
|
10
|
+
contractGaps = [];
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
const defaultEnabled = typeof process !== "undefined" ? true : false;
|
|
13
|
+
this.compliance = {
|
|
14
|
+
enabled: defaultEnabled,
|
|
15
|
+
requiredFields: ["behavior", "examples", "invariants"],
|
|
16
|
+
missingSeverity: "warning",
|
|
17
|
+
...options.compliance
|
|
18
|
+
};
|
|
19
|
+
}
|
|
9
20
|
/**
|
|
10
21
|
* Register a rule
|
|
11
22
|
*/
|
|
@@ -14,6 +25,7 @@ var PraxisRegistry = class {
|
|
|
14
25
|
throw new Error(`Rule with id "${descriptor.id}" already registered`);
|
|
15
26
|
}
|
|
16
27
|
this.rules.set(descriptor.id, descriptor);
|
|
28
|
+
this.trackContractCompliance(descriptor.id, descriptor);
|
|
17
29
|
}
|
|
18
30
|
/**
|
|
19
31
|
* Register a constraint
|
|
@@ -23,6 +35,7 @@ var PraxisRegistry = class {
|
|
|
23
35
|
throw new Error(`Constraint with id "${descriptor.id}" already registered`);
|
|
24
36
|
}
|
|
25
37
|
this.constraints.set(descriptor.id, descriptor);
|
|
38
|
+
this.trackContractCompliance(descriptor.id, descriptor);
|
|
26
39
|
}
|
|
27
40
|
/**
|
|
28
41
|
* Register a module (all its rules and constraints)
|
|
@@ -71,6 +84,69 @@ var PraxisRegistry = class {
|
|
|
71
84
|
getAllConstraints() {
|
|
72
85
|
return Array.from(this.constraints.values());
|
|
73
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Get collected contract gaps from registration-time validation.
|
|
89
|
+
*/
|
|
90
|
+
getContractGaps() {
|
|
91
|
+
return [...this.contractGaps];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Clear collected contract gaps.
|
|
95
|
+
*/
|
|
96
|
+
clearContractGaps() {
|
|
97
|
+
this.contractGaps = [];
|
|
98
|
+
}
|
|
99
|
+
trackContractCompliance(id, descriptor) {
|
|
100
|
+
if (!this.compliance.enabled) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const gaps = this.validateDescriptorContract(id, descriptor);
|
|
104
|
+
for (const gap of gaps) {
|
|
105
|
+
this.contractGaps.push(gap);
|
|
106
|
+
if (this.compliance.onGap) {
|
|
107
|
+
this.compliance.onGap(gap);
|
|
108
|
+
} else {
|
|
109
|
+
const label = gap.severity === "error" ? "ERROR" : gap.severity === "warning" ? "WARN" : "INFO";
|
|
110
|
+
console.warn(`[Praxis][${label}] Contract gap for "${gap.ruleId}": missing ${gap.missing.join(", ")}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
validateDescriptorContract(id, descriptor) {
|
|
115
|
+
const requiredFields = this.compliance.requiredFields ?? ["behavior", "examples", "invariants"];
|
|
116
|
+
const missingSeverity = this.compliance.missingSeverity ?? "warning";
|
|
117
|
+
const contract = descriptor.contract ?? (descriptor.meta?.contract && typeof descriptor.meta.contract === "object" ? descriptor.meta.contract : void 0);
|
|
118
|
+
if (!contract) {
|
|
119
|
+
return [
|
|
120
|
+
{
|
|
121
|
+
ruleId: id,
|
|
122
|
+
missing: ["contract"],
|
|
123
|
+
severity: missingSeverity,
|
|
124
|
+
message: `Contract missing for "${id}"`
|
|
125
|
+
}
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
const missing = [];
|
|
129
|
+
if (requiredFields.includes("behavior") && (!contract.behavior || contract.behavior.trim() === "")) {
|
|
130
|
+
missing.push("behavior");
|
|
131
|
+
}
|
|
132
|
+
if (requiredFields.includes("examples") && (!contract.examples || contract.examples.length === 0)) {
|
|
133
|
+
missing.push("examples");
|
|
134
|
+
}
|
|
135
|
+
if (requiredFields.includes("invariants") && (!contract.invariants || contract.invariants.length === 0)) {
|
|
136
|
+
missing.push("invariants");
|
|
137
|
+
}
|
|
138
|
+
if (missing.length === 0) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
return [
|
|
142
|
+
{
|
|
143
|
+
ruleId: id,
|
|
144
|
+
missing,
|
|
145
|
+
severity: "warning",
|
|
146
|
+
message: `Contract for "${id}" is incomplete: missing ${missing.join(", ")}`
|
|
147
|
+
}
|
|
148
|
+
];
|
|
149
|
+
}
|
|
74
150
|
};
|
|
75
151
|
|
|
76
152
|
// src/core/reactive-engine.svelte.ts
|
|
@@ -132,10 +132,21 @@ var PluresDBPraxisAdapter = class {
|
|
|
132
132
|
function createPluresDB(config) {
|
|
133
133
|
return new PluresDBPraxisAdapter(config);
|
|
134
134
|
}
|
|
135
|
+
async function createPraxisLocalFirst(options = {}) {
|
|
136
|
+
const { pollInterval, ...localOptions } = options;
|
|
137
|
+
const mod = await import("@plures/pluresdb/local-first");
|
|
138
|
+
const LocalFirstCtor = mod.PluresDBLocalFirst ?? mod.default;
|
|
139
|
+
if (!LocalFirstCtor) {
|
|
140
|
+
throw new Error("Failed to load PluresDBLocalFirst from @plures/pluresdb/local-first");
|
|
141
|
+
}
|
|
142
|
+
const db = new LocalFirstCtor(localOptions);
|
|
143
|
+
return new PluresDBPraxisAdapter({ db, pollInterval });
|
|
144
|
+
}
|
|
135
145
|
|
|
136
146
|
export {
|
|
137
147
|
InMemoryPraxisDB,
|
|
138
148
|
createInMemoryDB,
|
|
139
149
|
PluresDBPraxisAdapter,
|
|
140
|
-
createPluresDB
|
|
150
|
+
createPluresDB,
|
|
151
|
+
createPraxisLocalFirst
|
|
141
152
|
};
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { L as LogicEngine, P as PraxisState, a as PraxisEvent, b as PraxisRegistry, R as RuleDescriptor, C as ConstraintDescriptor, c as PraxisFact, d as RuleFn, e as
|
|
2
|
-
export {
|
|
1
|
+
import { L as LogicEngine, P as PraxisState, a as PraxisEvent, b as PraxisRegistry, R as RuleDescriptor, C as ConstraintDescriptor, c as PraxisFact, d as RuleFn, e as Contract, f as ConstraintFn, g as PraxisModule } from './reactive-engine.svelte-9aS0kTa8.js';
|
|
2
|
+
export { n as ConstraintId, l as PRAXIS_PROTOCOL_VERSION, h as PraxisDiagnostics, o as PraxisEngineOptions, i as PraxisStepConfig, k as PraxisStepFn, j as PraxisStepResult, q as ReactiveEngineOptions, r as ReactiveLogicEngine, m as RuleId, p as createPraxisEngine, s as createReactiveEngine } from './reactive-engine.svelte-9aS0kTa8.js';
|
|
3
|
+
import { LocalFirstOptions } from '@plures/pluresdb/local-first';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Praxis Reactive Logic Engine
|
|
@@ -434,6 +435,7 @@ interface DefineRuleOptions<TContext = unknown> {
|
|
|
434
435
|
id: string;
|
|
435
436
|
description: string;
|
|
436
437
|
impl: RuleFn<TContext>;
|
|
438
|
+
contract?: Contract;
|
|
437
439
|
meta?: Record<string, unknown>;
|
|
438
440
|
}
|
|
439
441
|
/**
|
|
@@ -460,6 +462,7 @@ interface DefineConstraintOptions<TContext = unknown> {
|
|
|
460
462
|
id: string;
|
|
461
463
|
description: string;
|
|
462
464
|
impl: ConstraintFn<TContext>;
|
|
465
|
+
contract?: Contract;
|
|
463
466
|
meta?: Record<string, unknown>;
|
|
464
467
|
}
|
|
465
468
|
/**
|
|
@@ -943,6 +946,7 @@ declare function validateForGeneration(schema: PraxisSchema): ValidationResult;
|
|
|
943
946
|
* Provides a minimal adapter layer for PluresDB integration.
|
|
944
947
|
* This module defines the core interface and an in-memory implementation.
|
|
945
948
|
*/
|
|
949
|
+
|
|
946
950
|
/**
|
|
947
951
|
* Function to unsubscribe from a watch
|
|
948
952
|
*/
|
|
@@ -1013,7 +1017,10 @@ declare function createInMemoryDB(): InMemoryPraxisDB;
|
|
|
1013
1017
|
*/
|
|
1014
1018
|
type PluresDBInstance = {
|
|
1015
1019
|
get(key: string): Promise<any>;
|
|
1016
|
-
put(key: string, value: any): Promise<
|
|
1020
|
+
put(key: string, value: any): Promise<any>;
|
|
1021
|
+
delete?(key: string): Promise<void>;
|
|
1022
|
+
list?(): Promise<any[]>;
|
|
1023
|
+
close?(): Promise<void>;
|
|
1017
1024
|
};
|
|
1018
1025
|
/**
|
|
1019
1026
|
* Configuration options for PluresDBPraxisAdapter
|
|
@@ -1055,7 +1062,7 @@ declare class PluresDBPraxisAdapter implements PraxisDB {
|
|
|
1055
1062
|
*
|
|
1056
1063
|
* @example
|
|
1057
1064
|
* ```typescript
|
|
1058
|
-
* import { PluresNode } from 'pluresdb';
|
|
1065
|
+
* import { PluresNode } from '@plures/pluresdb';
|
|
1059
1066
|
* import { createPluresDB } from '@plures/praxis';
|
|
1060
1067
|
*
|
|
1061
1068
|
* const pluresdb = new PluresNode({ autoStart: true });
|
|
@@ -1075,6 +1082,26 @@ declare class PluresDBPraxisAdapter implements PraxisDB {
|
|
|
1075
1082
|
* ```
|
|
1076
1083
|
*/
|
|
1077
1084
|
declare function createPluresDB(config: PluresDBAdapterConfig | PluresDBInstance): PluresDBPraxisAdapter;
|
|
1085
|
+
/**
|
|
1086
|
+
* Options for creating a local-first PluresDB adapter using the unified API
|
|
1087
|
+
*/
|
|
1088
|
+
interface PraxisLocalFirstOptions extends LocalFirstOptions {
|
|
1089
|
+
/** Optional polling interval override for watch semantics (ms). Defaults to 1000ms. */
|
|
1090
|
+
pollInterval?: number;
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* Create a PraxisDB adapter backed by PluresDB's unified local-first API.
|
|
1094
|
+
*
|
|
1095
|
+
* This will auto-detect the best backend (WASM/Tauri/IPC/network) unless a mode is provided.
|
|
1096
|
+
* Uses dynamic import to avoid bundling the local-first module in environments that don't need it.
|
|
1097
|
+
*
|
|
1098
|
+
* @example
|
|
1099
|
+
* ```typescript
|
|
1100
|
+
* const db = await createPraxisLocalFirst({ mode: 'auto' });
|
|
1101
|
+
* await db.set('/_praxis/facts/user/1', { id: '1', name: 'Alice' });
|
|
1102
|
+
* ```
|
|
1103
|
+
*/
|
|
1104
|
+
declare function createPraxisLocalFirst(options?: PraxisLocalFirstOptions): Promise<PluresDBPraxisAdapter>;
|
|
1078
1105
|
|
|
1079
1106
|
/**
|
|
1080
1107
|
* PraxisDB Store
|
|
@@ -3290,4 +3317,4 @@ declare function attachAllIntegrations<TContext = unknown>(engine: LogicEngine<T
|
|
|
3290
3317
|
dispose: () => void;
|
|
3291
3318
|
}>;
|
|
3292
3319
|
|
|
3293
|
-
export { type ActivityState, type Actor, ActorManager, type CanvasDocument, type CanvasEdge, type CanvasEdgeStyle, type CanvasEditorConfig, type CanvasNode, type CanvasNodeStyle, type ComponentDefinition, ConstraintDescriptor, ConstraintFn, type ConstraintNode, type ConstraintSchema, type DefineConstraintOptions, type DefineModuleOptions, type DefineRuleOptions, type EventDefinition$1 as EventDefinition, type EventStreamEntry, type FactDefinition$1 as FactDefinition, ReactiveLogicEngine as FrameworkAgnosticReactiveEngine, type ReactiveEngineOptions as FrameworkAgnosticReactiveEngineOptions, type GeneratedDoc, type GeneratedPluresDBFile, type GraphEdge, type GuardianError, type GuardianResult, type GuardianWarning, InMemoryPraxisDB, type LifecycleState, type LoaderOptions, type LoaderResult, type LogicDefinition, LogicEngine, type ModelDefinition, type NodeBindings, type NodeDefinition, type OrchestrationDefinition, PRAXIS_PATHS, type PluresDBAdapter, type PluresDBAdapterConfig, type PluresDBAdapterOptions, PluresDBGenerator, type PluresDBGeneratorOptions, type PluresDBInstance, PluresDBPraxisAdapter, type PraxisDB, PraxisDBStore, type PraxisDBStoreOptions, PraxisEvent, PraxisFact, PraxisModule, PraxisRegistry, type PraxisSchema, PraxisSchemaRegistry, PraxisState, type RegistryGraph, RegistryIntrospector, type RegistrySchema, type RegistryStats, RuleDescriptor, RuleFn, type RuleNode, type RuleSchema, type StateChangeCallback, type StateDoc, type StateDocsConfig, StateDocsGenerator, type StateMachineDoc, type StoredSchema, type TauriAppConfig, type TauriBridge, type TauriCommand, type TauriEvent, type TauriFS, type TauriFileEntry, type TauriMenuItem, type TauriNotification, type TauriNotificationOptions, type TauriPlugin, type TauriPraxisAdapter, type TauriSecurityConfig, type TauriTray, type TauriUpdateConfig, type TauriUpdateInfo, type TauriWindowConfig, type TerminalNodeProps, type TransitionDoc, type UnifiedApp, type UnifiedAppConfig, type UnsubscribeFn, type UnumAdapter, type UnumAdapterConfig, type UnumChannel, type UnumIdentity, type UnumMessage, type UnumStore, type ValidationError, type ValidationResult, attachAllIntegrations, attachTauriToEngine, attachToEngine, attachUnumToEngine, canvasToMermaid, canvasToSchema, canvasToYaml, createCanvasEditor, createReactiveEngine as createFrameworkAgnosticReactiveEngine, createInMemoryDB, createIntrospector, createMockTauriBridge, createPluresDB, createPluresDBAdapter, createPluresDBGenerator, createPraxisDBStore, createSchema, createSchemaRegistry, createSchemaTemplate, createStateDocsGenerator, createTauriPraxisAdapter, createTimerActor, createUnifiedApp, createUnumAdapter, defineConstraint, defineEvent, defineFact, defineModule, defineRule, filterEvents, filterFacts, findEvent, findFact, generateDocs, generateId, generateTauriConfig, getEventPath, getFactPath, getSchemaPath, loadSchemaFromJson, loadSchemaFromYaml, registerSchema, schemaToCanvas, validateForGeneration, validateSchema, validateWithGuardian };
|
|
3320
|
+
export { type ActivityState, type Actor, ActorManager, type CanvasDocument, type CanvasEdge, type CanvasEdgeStyle, type CanvasEditorConfig, type CanvasNode, type CanvasNodeStyle, type ComponentDefinition, ConstraintDescriptor, ConstraintFn, type ConstraintNode, type ConstraintSchema, type DefineConstraintOptions, type DefineModuleOptions, type DefineRuleOptions, type EventDefinition$1 as EventDefinition, type EventStreamEntry, type FactDefinition$1 as FactDefinition, ReactiveLogicEngine as FrameworkAgnosticReactiveEngine, type ReactiveEngineOptions as FrameworkAgnosticReactiveEngineOptions, type GeneratedDoc, type GeneratedPluresDBFile, type GraphEdge, type GuardianError, type GuardianResult, type GuardianWarning, InMemoryPraxisDB, type LifecycleState, type LoaderOptions, type LoaderResult, type LogicDefinition, LogicEngine, type ModelDefinition, type NodeBindings, type NodeDefinition, type OrchestrationDefinition, PRAXIS_PATHS, type PluresDBAdapter, type PluresDBAdapterConfig, type PluresDBAdapterOptions, PluresDBGenerator, type PluresDBGeneratorOptions, type PluresDBInstance, PluresDBPraxisAdapter, type PraxisDB, PraxisDBStore, type PraxisDBStoreOptions, PraxisEvent, PraxisFact, type PraxisLocalFirstOptions, PraxisModule, PraxisRegistry, type PraxisSchema, PraxisSchemaRegistry, PraxisState, type RegistryGraph, RegistryIntrospector, type RegistrySchema, type RegistryStats, RuleDescriptor, RuleFn, type RuleNode, type RuleSchema, type StateChangeCallback, type StateDoc, type StateDocsConfig, StateDocsGenerator, type StateMachineDoc, type StoredSchema, type TauriAppConfig, type TauriBridge, type TauriCommand, type TauriEvent, type TauriFS, type TauriFileEntry, type TauriMenuItem, type TauriNotification, type TauriNotificationOptions, type TauriPlugin, type TauriPraxisAdapter, type TauriSecurityConfig, type TauriTray, type TauriUpdateConfig, type TauriUpdateInfo, type TauriWindowConfig, type TerminalNodeProps, type TransitionDoc, type UnifiedApp, type UnifiedAppConfig, type UnsubscribeFn, type UnumAdapter, type UnumAdapterConfig, type UnumChannel, type UnumIdentity, type UnumMessage, type UnumStore, type ValidationError, type ValidationResult, attachAllIntegrations, attachTauriToEngine, attachToEngine, attachUnumToEngine, canvasToMermaid, canvasToSchema, canvasToYaml, createCanvasEditor, createReactiveEngine as createFrameworkAgnosticReactiveEngine, createInMemoryDB, createIntrospector, createMockTauriBridge, createPluresDB, createPluresDBAdapter, createPluresDBGenerator, createPraxisDBStore, createPraxisLocalFirst, createSchema, createSchemaRegistry, createSchemaTemplate, createStateDocsGenerator, createTauriPraxisAdapter, createTimerActor, createUnifiedApp, createUnumAdapter, defineConstraint, defineEvent, defineFact, defineModule, defineRule, filterEvents, filterFacts, findEvent, findFact, generateDocs, generateId, generateTauriConfig, getEventPath, getFactPath, getSchemaPath, loadSchemaFromJson, loadSchemaFromYaml, registerSchema, schemaToCanvas, validateForGeneration, validateSchema, validateWithGuardian };
|
package/dist/browser/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
PraxisRegistry,
|
|
3
3
|
ReactiveLogicEngine,
|
|
4
4
|
createReactiveEngine
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-K377RW4V.js";
|
|
6
6
|
import {
|
|
7
7
|
LogicEngine,
|
|
8
8
|
PRAXIS_PROTOCOL_VERSION,
|
|
@@ -12,8 +12,9 @@ import {
|
|
|
12
12
|
InMemoryPraxisDB,
|
|
13
13
|
PluresDBPraxisAdapter,
|
|
14
14
|
createInMemoryDB,
|
|
15
|
-
createPluresDB
|
|
16
|
-
|
|
15
|
+
createPluresDB,
|
|
16
|
+
createPraxisLocalFirst
|
|
17
|
+
} from "./chunk-MBVHLOU2.js";
|
|
17
18
|
|
|
18
19
|
// src/core/reactive-engine.ts
|
|
19
20
|
var ReactiveLogicEngine2 = class _ReactiveLogicEngine {
|
|
@@ -579,19 +580,25 @@ function defineEvent(tag) {
|
|
|
579
580
|
};
|
|
580
581
|
}
|
|
581
582
|
function defineRule(options) {
|
|
583
|
+
const contract = options.contract ?? options.meta?.contract;
|
|
584
|
+
const meta = contract ? { ...options.meta ?? {}, contract } : options.meta;
|
|
582
585
|
return {
|
|
583
586
|
id: options.id,
|
|
584
587
|
description: options.description,
|
|
585
588
|
impl: options.impl,
|
|
586
|
-
|
|
589
|
+
contract,
|
|
590
|
+
meta
|
|
587
591
|
};
|
|
588
592
|
}
|
|
589
593
|
function defineConstraint(options) {
|
|
594
|
+
const contract = options.contract ?? options.meta?.contract;
|
|
595
|
+
const meta = contract ? { ...options.meta ?? {}, contract } : options.meta;
|
|
590
596
|
return {
|
|
591
597
|
id: options.id,
|
|
592
598
|
description: options.description,
|
|
593
599
|
impl: options.impl,
|
|
594
|
-
|
|
600
|
+
contract,
|
|
601
|
+
meta
|
|
595
602
|
};
|
|
596
603
|
}
|
|
597
604
|
function defineModule(options) {
|
|
@@ -2707,7 +2714,7 @@ function generateTauriConfig(config) {
|
|
|
2707
2714
|
// src/integrations/unified.ts
|
|
2708
2715
|
async function createUnifiedApp(config) {
|
|
2709
2716
|
const { createPraxisEngine: createPraxisEngine2 } = await import("./engine-YJZV4SLD.js");
|
|
2710
|
-
const { createInMemoryDB: createInMemoryDB2 } = await import("./adapter-
|
|
2717
|
+
const { createInMemoryDB: createInMemoryDB2 } = await import("./adapter-CIMBGDC7.js");
|
|
2711
2718
|
const db = config.db || createInMemoryDB2();
|
|
2712
2719
|
const pluresdb = createPluresDBAdapter({
|
|
2713
2720
|
db,
|
|
@@ -2781,7 +2788,7 @@ async function createUnifiedApp(config) {
|
|
|
2781
2788
|
};
|
|
2782
2789
|
}
|
|
2783
2790
|
async function attachAllIntegrations(engine, registry, options = {}) {
|
|
2784
|
-
const { createInMemoryDB: createInMemoryDB2 } = await import("./adapter-
|
|
2791
|
+
const { createInMemoryDB: createInMemoryDB2 } = await import("./adapter-CIMBGDC7.js");
|
|
2785
2792
|
const db = options.db || createInMemoryDB2();
|
|
2786
2793
|
const pluresdb = createPluresDBAdapter({
|
|
2787
2794
|
db,
|
|
@@ -2867,6 +2874,7 @@ export {
|
|
|
2867
2874
|
createPluresDBGenerator,
|
|
2868
2875
|
createPraxisDBStore,
|
|
2869
2876
|
createPraxisEngine,
|
|
2877
|
+
createPraxisLocalFirst,
|
|
2870
2878
|
createReactiveEngine,
|
|
2871
2879
|
createSchema,
|
|
2872
2880
|
createSchemaRegistry,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { L as LogicEngine, P as PraxisState, a as PraxisEvent } from '../reactive-engine.svelte-
|
|
2
|
-
export {
|
|
1
|
+
import { L as LogicEngine, P as PraxisState, a as PraxisEvent } from '../reactive-engine.svelte-9aS0kTa8.js';
|
|
2
|
+
export { q as ReactiveEngineOptions, r as ReactiveLogicEngine, s as createReactiveEngine } from '../reactive-engine.svelte-9aS0kTa8.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Svelte v5 Integration
|