speclogician 0.0.0b1__py3-none-any.whl → 0.0.0.dev1__py3-none-any.whl
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.
- speclogician/agent/funcs.py +29 -0
- speclogician/cmd/agent_cmd.py +89 -0
- speclogician/cmd/data_cmd.py +24 -0
- speclogician/cmd/model_cmd.py +42 -0
- speclogician/cmd/overlay_cmd.py +30 -0
- speclogician/cmd/scenario_cmd.py +61 -0
- speclogician/cmd/state_cmd.py +52 -0
- speclogician/data/artifact.py +8 -50
- speclogician/data/container.py +18 -384
- speclogician/data/mapping.py +18 -17
- speclogician/data/refs.py +12 -11
- speclogician/data/reports.py +11 -0
- speclogician/data/traces.py +15 -6
- speclogician/llms/llmtools.py +102 -0
- speclogician/llms/overlay.py +264 -0
- speclogician/main.py +36 -102
- speclogician/modeling/__init__.py +0 -31
- speclogician/modeling/component.py +4 -60
- speclogician/modeling/conflict.py +5 -19
- speclogician/modeling/domain.py +93 -280
- speclogician/modeling/model.py +206 -0
- speclogician/modeling/predicates.py +20 -22
- speclogician/modeling/report.py +33 -0
- speclogician/modeling/scenario.py +119 -87
- speclogician/sl_cmd.py +76 -0
- speclogician/state/change.py +98 -378
- speclogician/state/state.py +183 -399
- speclogician/tui/box.tcss +10 -0
- speclogician/tui/tui.py +131 -0
- speclogician/utils/__init__.py +1 -70
- speclogician/utils/imx.py +195 -0
- speclogician/utils/load.py +25 -147
- speclogician/utils/prompt.md +1 -325
- speclogician-0.0.0.dev1.dist-info/METADATA +21 -0
- speclogician-0.0.0.dev1.dist-info/RECORD +43 -0
- speclogician/commands/__init__.py +0 -15
- speclogician/commands/cmd_ch.py +0 -616
- speclogician/commands/cmd_find.py +0 -256
- speclogician/commands/cmd_view.py +0 -202
- speclogician/commands/runner.py +0 -149
- speclogician/commands/utils.py +0 -101
- speclogician/demos/.DS_Store +0 -0
- speclogician/demos/cmd_demo.py +0 -278
- speclogician/demos/loader.py +0 -135
- speclogician/demos/model.py +0 -27
- speclogician/demos/runner.py +0 -51
- speclogician/logic/__init__.py +0 -11
- speclogician/logic/api/__init__.py +0 -29
- speclogician/logic/api/client.py +0 -606
- speclogician/logic/api/decomp.py +0 -67
- speclogician/logic/api/scenario.py +0 -102
- speclogician/logic/api/traces.py +0 -59
- speclogician/logic/lib/__init__.py +0 -19
- speclogician/logic/lib/complement.py +0 -107
- speclogician/logic/lib/domain_model.py +0 -59
- speclogician/logic/lib/predicates.py +0 -151
- speclogician/logic/lib/scenarios.py +0 -369
- speclogician/logic/lib/traces.py +0 -114
- speclogician/logic/lib/transitions.py +0 -104
- speclogician/logic/main.py +0 -246
- speclogician/logic/strings.py +0 -194
- speclogician/logic/utils.py +0 -135
- speclogician/modeling/complement.py +0 -104
- speclogician/modeling/spec.py +0 -306
- speclogician/modeling/spec_stats.py +0 -39
- speclogician/presentation/api.py +0 -244
- speclogician/presentation/builders/_links.py +0 -44
- speclogician/presentation/builders/container.py +0 -53
- speclogician/presentation/builders/data_artifact.py +0 -42
- speclogician/presentation/builders/domain.py +0 -54
- speclogician/presentation/builders/instances_list.py +0 -38
- speclogician/presentation/builders/predicate.py +0 -51
- speclogician/presentation/builders/recommendations.py +0 -41
- speclogician/presentation/builders/scenario.py +0 -41
- speclogician/presentation/builders/scenario_complement.py +0 -82
- speclogician/presentation/builders/smart_find.py +0 -39
- speclogician/presentation/builders/spec.py +0 -39
- speclogician/presentation/builders/state_diff.py +0 -150
- speclogician/presentation/builders/state_instance.py +0 -42
- speclogician/presentation/builders/state_instance_summary.py +0 -84
- speclogician/presentation/builders/trace.py +0 -58
- speclogician/presentation/ctx.py +0 -38
- speclogician/presentation/models/container.py +0 -44
- speclogician/presentation/models/data_artifact.py +0 -33
- speclogician/presentation/models/domain.py +0 -50
- speclogician/presentation/models/instances_list.py +0 -23
- speclogician/presentation/models/predicate.py +0 -60
- speclogician/presentation/models/recommendations.py +0 -34
- speclogician/presentation/models/scenario.py +0 -31
- speclogician/presentation/models/scenario_complement.py +0 -40
- speclogician/presentation/models/smart_find.py +0 -34
- speclogician/presentation/models/spec.py +0 -32
- speclogician/presentation/models/state_diff.py +0 -34
- speclogician/presentation/models/state_instance.py +0 -31
- speclogician/presentation/models/state_instance_summary.py +0 -102
- speclogician/presentation/models/trace.py +0 -42
- speclogician/presentation/preview/__init__.py +0 -13
- speclogician/presentation/preview/cli.py +0 -50
- speclogician/presentation/preview/fixtures/__init__.py +0 -205
- speclogician/presentation/preview/fixtures/artifact_container.py +0 -150
- speclogician/presentation/preview/fixtures/data_artifact.py +0 -144
- speclogician/presentation/preview/fixtures/domain_model.py +0 -162
- speclogician/presentation/preview/fixtures/instances_list.py +0 -162
- speclogician/presentation/preview/fixtures/predicate.py +0 -184
- speclogician/presentation/preview/fixtures/scenario.py +0 -84
- speclogician/presentation/preview/fixtures/scenario_complement.py +0 -81
- speclogician/presentation/preview/fixtures/smart_find.py +0 -140
- speclogician/presentation/preview/fixtures/spec.py +0 -95
- speclogician/presentation/preview/fixtures/state_diff.py +0 -158
- speclogician/presentation/preview/fixtures/state_instance.py +0 -128
- speclogician/presentation/preview/fixtures/state_instance_summary.py +0 -80
- speclogician/presentation/preview/fixtures/trace.py +0 -206
- speclogician/presentation/preview/registry.py +0 -42
- speclogician/presentation/renderers/__init__.py +0 -24
- speclogician/presentation/renderers/container.py +0 -136
- speclogician/presentation/renderers/data_artifact.py +0 -144
- speclogician/presentation/renderers/domain.py +0 -123
- speclogician/presentation/renderers/instances_list.py +0 -120
- speclogician/presentation/renderers/predicate.py +0 -180
- speclogician/presentation/renderers/recommendations.py +0 -90
- speclogician/presentation/renderers/scenario.py +0 -94
- speclogician/presentation/renderers/scenario_complement.py +0 -59
- speclogician/presentation/renderers/smart_find.py +0 -307
- speclogician/presentation/renderers/spec.py +0 -105
- speclogician/presentation/renderers/state_diff.py +0 -102
- speclogician/presentation/renderers/state_instance.py +0 -82
- speclogician/presentation/renderers/state_instance_summary.py +0 -143
- speclogician/presentation/renderers/trace.py +0 -122
- speclogician/shell/app.py +0 -170
- speclogician/shell/shell_ch.py +0 -263
- speclogician/shell/shell_view.py +0 -153
- speclogician/state/change_result.py +0 -32
- speclogician/state/diff.py +0 -191
- speclogician/state/inst.py +0 -574
- speclogician/state/recommendation.py +0 -13
- speclogician/state/recommender.py +0 -577
- speclogician/state/state_stats.py +0 -133
- speclogician/tui/__init__.py +0 -0
- speclogician/tui/app.py +0 -257
- speclogician/tui/app.tcss +0 -160
- speclogician/tui/demo.py +0 -45
- speclogician/tui/images/speclogician-full.png +0 -0
- speclogician/tui/images/speclogician-minimal.png +0 -0
- speclogician/tui/main_screen.py +0 -454
- speclogician/tui/splash_screen.py +0 -51
- speclogician/tui/stats_screen.py +0 -125
- speclogician/utils/testing.py +0 -151
- speclogician-0.0.0b1.dist-info/METADATA +0 -116
- speclogician-0.0.0b1.dist-info/RECORD +0 -139
- /speclogician/{presentation → agent}/__init__.py +0 -0
- /speclogician/{presentation/builders → cmd}/__init__.py +0 -0
- /speclogician/{presentation/models → llms}/__init__.py +0 -0
- {speclogician-0.0.0b1.dist-info → speclogician-0.0.0.dev1.dist-info}/WHEEL +0 -0
speclogician/utils/testing.py
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Imandra Inc.
|
|
3
|
-
#
|
|
4
|
-
# speclogician/utils/testing.py
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
from .__init__ import JSONObject, JSONValue
|
|
8
|
-
|
|
9
|
-
import json
|
|
10
|
-
from typing import cast
|
|
11
|
-
from click.testing import Result
|
|
12
|
-
|
|
13
|
-
# -----------------------
|
|
14
|
-
# JSON parsing + narrowing helpers
|
|
15
|
-
# -----------------------
|
|
16
|
-
|
|
17
|
-
def parse_json_result(res : Result) -> JSONObject:
|
|
18
|
-
"""
|
|
19
|
-
Parse JSON from CLI output.
|
|
20
|
-
|
|
21
|
-
If stdout is empty (Typer/Pydantic failed before we could emit JSON),
|
|
22
|
-
return a synthetic JSON error object so tests can assert consistently.
|
|
23
|
-
"""
|
|
24
|
-
out = (res.stdout or "").strip()
|
|
25
|
-
|
|
26
|
-
if not out:
|
|
27
|
-
# Pre-command failure (argument parsing / Pydantic validation / Typer)
|
|
28
|
-
# Normalize into the same "result envelope" your CLI emits.
|
|
29
|
-
exc_s = ""
|
|
30
|
-
if res.exception is not None:
|
|
31
|
-
exc_s = str(res.exception)
|
|
32
|
-
elif res.output:
|
|
33
|
-
exc_s = str(res.output)
|
|
34
|
-
|
|
35
|
-
return cast(
|
|
36
|
-
JSONObject,
|
|
37
|
-
{
|
|
38
|
-
"ok": False,
|
|
39
|
-
"stage": "cli_parse",
|
|
40
|
-
"error": exc_s,
|
|
41
|
-
},
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
try:
|
|
45
|
-
data = json.loads(out)
|
|
46
|
-
except json.JSONDecodeError as e:
|
|
47
|
-
raise AssertionError(
|
|
48
|
-
"Failed to decode JSON from stdout.\n"
|
|
49
|
-
f"exit_code={res.exit_code}\n"
|
|
50
|
-
f"stdout={res.stdout!r}\n"
|
|
51
|
-
f"stderr={res.stderr!r}\n"
|
|
52
|
-
f"output={res.output!r}\n"
|
|
53
|
-
f"exception={res.exception!r}\n"
|
|
54
|
-
f"json_error={e}\n"
|
|
55
|
-
) from e
|
|
56
|
-
|
|
57
|
-
# Ensure it's a dict-like JSON object
|
|
58
|
-
if not isinstance(data, dict):
|
|
59
|
-
raise AssertionError(f"Expected JSON object, got: {type(data).__name__}: {data!r}")
|
|
60
|
-
|
|
61
|
-
return cast(JSONObject, data)
|
|
62
|
-
|
|
63
|
-
def get_change(data: JSONObject) -> JSONObject:
|
|
64
|
-
"""
|
|
65
|
-
New CLI JSON wraps the change in {"ok": ..., "change": {...}, ...}.
|
|
66
|
-
Also accept legacy where the change was top-level.
|
|
67
|
-
"""
|
|
68
|
-
chg = data.get("change")
|
|
69
|
-
if isinstance(chg, dict):
|
|
70
|
-
return cast(JSONObject, chg)
|
|
71
|
-
return data
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _as_object(v: JSONValue, *, ctx: str = "value") -> JSONObject:
|
|
75
|
-
if not isinstance(v, dict):
|
|
76
|
-
raise AssertionError(f"Expected object for {ctx}, got {type(v).__name__}: {v!r}")
|
|
77
|
-
return cast(JSONObject, v)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def _as_str(v: JSONValue, *, ctx: str = "value") -> str:
|
|
81
|
-
if not isinstance(v, str):
|
|
82
|
-
raise AssertionError(f"Expected string for {ctx}, got {type(v).__name__}: {v!r}")
|
|
83
|
-
return v
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def _as_bool(v: JSONValue, *, ctx: str = "value") -> bool:
|
|
87
|
-
if not isinstance(v, bool):
|
|
88
|
-
raise AssertionError(f"Expected bool for {ctx}, got {type(v).__name__}: {v!r}")
|
|
89
|
-
return v
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def _as_str_list(v: JSONValue, *, ctx: str = "value") -> list[str]:
|
|
93
|
-
if not isinstance(v, list) or not all(isinstance(x, str) for x in v):
|
|
94
|
-
raise AssertionError(f"Expected list[str] for {ctx}, got: {v!r}")
|
|
95
|
-
return cast(list[str], v)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
# -----------------------
|
|
99
|
-
# Change payload accessors
|
|
100
|
-
# -----------------------
|
|
101
|
-
|
|
102
|
-
def chg_kind(chg: JSONObject) -> str | None:
|
|
103
|
-
v = chg.get("kind")
|
|
104
|
-
if v is None:
|
|
105
|
-
return None
|
|
106
|
-
return _as_str(v, ctx="change.kind")
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
def chg_scenario_name(chg: JSONObject) -> str:
|
|
110
|
-
return _as_str(chg.get("scenario_name"), ctx="change.scenario_name")
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def delta_add(chg: JSONObject, field: str) -> list[str]:
|
|
114
|
-
"""
|
|
115
|
-
field is one of: "given", "when", "then"
|
|
116
|
-
"""
|
|
117
|
-
obj = _as_object(chg.get(field), ctx=f"change.{field}")
|
|
118
|
-
return _as_str_list(obj.get("add"), ctx=f"change.{field}.add")
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
def delta_remove(chg: JSONObject, field: str) -> list[str]:
|
|
122
|
-
obj = _as_object(chg.get(field), ctx=f"change.{field}")
|
|
123
|
-
return _as_str_list(obj.get("remove"), ctx=f"change.{field}.remove")
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def result_ok(data: JSONObject) -> bool:
|
|
127
|
-
return _as_bool(data.get("ok"), ctx="result.ok")
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def result_stage(data: JSONObject) -> str | None:
|
|
131
|
-
v = data.get("stage")
|
|
132
|
-
if v is None:
|
|
133
|
-
return None
|
|
134
|
-
return _as_str(v, ctx="result.stage")
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def result_error_str(data: JSONObject) -> str:
|
|
138
|
-
"""
|
|
139
|
-
Your JSON-safe error is a JSONObject (per your typing), but for tests we usually
|
|
140
|
-
want a stable string. This extracts a string in a robust way.
|
|
141
|
-
Adjust if your error schema is richer (e.g. {"message": "...", "type": "..."}).
|
|
142
|
-
"""
|
|
143
|
-
err = data.get("error")
|
|
144
|
-
if err is None:
|
|
145
|
-
return ""
|
|
146
|
-
if isinstance(err, str):
|
|
147
|
-
return err
|
|
148
|
-
if isinstance(err, dict) and isinstance(err.get("message"), str):
|
|
149
|
-
return cast(str, err["message"])
|
|
150
|
-
# fallback: stable stringify
|
|
151
|
-
return json.dumps(cast(JSONValue, err))
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.3
|
|
2
|
-
Name: speclogician
|
|
3
|
-
Version: 0.0.0b1
|
|
4
|
-
Summary: SpecLogicain AI framework for data-driven formal program specification synthesis, verification and analysis
|
|
5
|
-
Author: denis, hongyu
|
|
6
|
-
Author-email: denis <denis@imandra.ai>, hongyu <hongyu@imandra.ai>
|
|
7
|
-
Requires-Dist: imandrax-api-models>=18.0.0
|
|
8
|
-
Requires-Dist: iml-query>=0.5.1
|
|
9
|
-
Requires-Dist: pydantic>=2.12.5
|
|
10
|
-
Requires-Dist: rich>=14.2.0
|
|
11
|
-
Requires-Dist: textual>=6.11.0
|
|
12
|
-
Requires-Dist: typer>=0.20.0
|
|
13
|
-
Requires-Python: >=3.12
|
|
14
|
-
Project-URL: Homepage, https://speclogician.dev/
|
|
15
|
-
Description-Content-Type: text/markdown
|
|
16
|
-
|
|
17
|
-
# SpecLogician
|
|
18
|
-
SpecLogician AI framework for data-driven formal program specification synthesis, verification and analysis
|
|
19
|
-
|
|
20
|
-
www.speclogician.dev
|
|
21
|
-
|
|
22
|
-
## 1) The challenge: scaling formal methods via LLM-powered automation
|
|
23
|
-
|
|
24
|
-
- Automatically applying formal methods to large software systems using **LLM-powered and agentic tools** remains a fundamental challenge
|
|
25
|
-
- Traditional formal modeling approaches require building **large, monolithic formal models upfront**
|
|
26
|
-
- There is **no single canonical way** to formalize a complex software system
|
|
27
|
-
- As a result, formalization becomes **as much an art as a science**, relying heavily on expert judgment
|
|
28
|
-
- These characteristics fundamentally limit automation:
|
|
29
|
-
- LLMs struggle to generate or maintain **large, globally consistent formal models**
|
|
30
|
-
- Small local changes often require understanding the entire model
|
|
31
|
-
- Monolithic models are brittle under iterative, agent-driven workflows
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
## 2) SpecLogician’s core idea
|
|
35
|
-
|
|
36
|
-
- SpecLogician is an **AI framework for data-driven formal program specification synthesis, verification, and analysis**
|
|
37
|
-
- It replaces monolithic specifications with **incrementally constructed formal logic**
|
|
38
|
-
- The core logic is built from **symbolic `given / when / then` scenarios**
|
|
39
|
-
- Scenarios are:
|
|
40
|
-
- composable
|
|
41
|
-
- declarative
|
|
42
|
-
- local in scope
|
|
43
|
-
- Scenarios are connected to a **domain model of arbitrary complexity**
|
|
44
|
-
- The domain model captures:
|
|
45
|
-
- predicates
|
|
46
|
-
- transitions
|
|
47
|
-
- state/action structure
|
|
48
|
-
- auxiliary and domain-specific logic
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
## 3) Why this structure works well with LLMs
|
|
52
|
-
|
|
53
|
-
- LLM-powered tools are used to:
|
|
54
|
-
- propose new scenarios
|
|
55
|
-
- refine existing scenarios
|
|
56
|
-
- generate structured deltas (add / remove / edit)
|
|
57
|
-
- LLMs operate on **small, well-scoped artifacts**, not entire formal models
|
|
58
|
-
- Each change is:
|
|
59
|
-
- explicit
|
|
60
|
-
- typed
|
|
61
|
-
- machine-checkable
|
|
62
|
-
- This aligns naturally with how LLMs perform best:
|
|
63
|
-
- local reasoning
|
|
64
|
-
- incremental edits
|
|
65
|
-
- structured outputs (JSON, CLI commands)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
## 4) Agentic reasoning loop (formal reasoning as the backbone)
|
|
69
|
-
|
|
70
|
-
- SpecLogician sits at the center of an **agentic reasoning loop**
|
|
71
|
-
- In this loop:
|
|
72
|
-
- **CodeLogician / ImandraX** translate source code into formal models and reasoning artifacts
|
|
73
|
-
- **LLM-powered agentic CLIs** propose scenario additions, edits, and removals as structured deltas
|
|
74
|
-
- **Software mapping tools** (e.g. CodeMaps from cognition.ai) provide high-level program structure and navigation context
|
|
75
|
-
- Each agent contributes **partial, local insight**:
|
|
76
|
-
- code structure
|
|
77
|
-
- behavioral intent
|
|
78
|
-
- execution traces
|
|
79
|
-
- test artifacts
|
|
80
|
-
- SpecLogician:
|
|
81
|
-
- integrates these inputs into a single formal state
|
|
82
|
-
- validates them symbolically
|
|
83
|
-
- delegates global analysis to the **ImandraX automated reasoning engine**
|
|
84
|
-
- The reasoning engine analyzes the **entire accumulated model after every change**
|
|
85
|
-
- This creates a **closed-loop workflow**:
|
|
86
|
-
- propose → formalize → verify → refine
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
## 5) What the resulting formal model enables
|
|
90
|
-
|
|
91
|
-
- Systematically identify **gaps in design and requirements**
|
|
92
|
-
- Precisely understand **test coverage and gaps in test coverage**
|
|
93
|
-
- Trace:
|
|
94
|
-
- execution logs
|
|
95
|
-
- test cases
|
|
96
|
-
- documentation
|
|
97
|
-
- other artifacts
|
|
98
|
-
back to **formal specifications and requirements**
|
|
99
|
-
- Automatically **generate missing test cases**
|
|
100
|
-
- Safely **model and verify the impact of changes** before they are applied
|
|
101
|
-
- Maintain a **single, authoritative source of truth** for system behavior
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
## 6) Big-picture outcome
|
|
105
|
-
|
|
106
|
-
- Transforms LLMs from:
|
|
107
|
-
- probabilistic code generators
|
|
108
|
-
into:
|
|
109
|
-
- **reliable collaborators in a verification-driven workflow**
|
|
110
|
-
- Makes formal methods:
|
|
111
|
-
- incremental
|
|
112
|
-
- data-driven
|
|
113
|
-
- compatible with LLM-powered automation
|
|
114
|
-
- scalable to real-world software systems
|
|
115
|
-
- Positions SpecLogician as the **formal reasoning backbone** for modern, agentic software development
|
|
116
|
-
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
speclogician/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
speclogician/commands/__init__.py,sha256=GVEHMDm4upK2G-kwIS5WfMjd0QvbcOarVQTJ4RV8O2Q,231
|
|
3
|
-
speclogician/commands/cmd_ch.py,sha256=tzd01WrNvcGabUtYu8BlXg8pVH_ORyNn9isqm0YC5qM,19088
|
|
4
|
-
speclogician/commands/cmd_find.py,sha256=Y_Eleso3tgwZfQwtlQcSOYPUZQPS6iX9Gls1Pe9XtSY,7861
|
|
5
|
-
speclogician/commands/cmd_view.py,sha256=Xnf0Gn2lY0iA_XgpucPZ774CBVgUfqrN4lydiyyyhRI,6727
|
|
6
|
-
speclogician/commands/runner.py,sha256=EvzB4kkXMnQPDkxHjVdfJN6N0Ez9wwQmAs5JWqjTmSg,4575
|
|
7
|
-
speclogician/commands/utils.py,sha256=s5no2R7APSYWGX_HWrp6puIinlj9Iq_TerkUPhZD_vA,2681
|
|
8
|
-
speclogician/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
-
speclogician/data/artifact.py,sha256=JLzvlBkSct6b5nuShr5fYRNpQDokHprdcwt37Ds32hk,1575
|
|
10
|
-
speclogician/data/container.py,sha256=VynrYCJwvOcCH5Z4cK76HTKUDRrdfpofwelhl50I0JY,13755
|
|
11
|
-
speclogician/data/mapping.py,sha256=rgGyOUgtreAP0bQvx7Ui7Qit8hjpiVuoBWjYWHEUeJw,2960
|
|
12
|
-
speclogician/data/refs.py,sha256=OHqN3t5G4WUB4b2NnanImUuvPjKvnSEJnJe9y4aT3_U,698
|
|
13
|
-
speclogician/data/traces.py,sha256=OjZJ-8NCFZZhkwXNWnc3BinrQIQTQtUAO40uiOmv3go,626
|
|
14
|
-
speclogician/demos/.DS_Store,sha256=E-dHWTvatN4vA5ts7JaNqfcPfYHkkam8WQLYmNHTFg4,6148
|
|
15
|
-
speclogician/demos/cmd_demo.py,sha256=FdKtn4w-7pzc9hryvZXSkeK7UQlaNFjdVOYql8eBN5A,9188
|
|
16
|
-
speclogician/demos/loader.py,sha256=X6U7XDgXM74_1tzPI6GbKkCKhgaf6CPS1RK9N8aMHhc,4331
|
|
17
|
-
speclogician/demos/model.py,sha256=Ipixvki-9WZf7uHIJTG0HQxUqQgc_veaihSe1R8o7DQ,505
|
|
18
|
-
speclogician/demos/runner.py,sha256=V7RnQxykBzG_fQXeQYhTcrc0L1g01pIREzhZugTc0u4,1224
|
|
19
|
-
speclogician/logic/__init__.py,sha256=Bsi4cXWmw26AwNjFEOPoXh7Wf_rknsw1W7G7ocQ6eik,108
|
|
20
|
-
speclogician/logic/api/__init__.py,sha256=UVKNzdlDxsNRxP4MI8eA-tI0tZJDr3-0tK91BSuuEyk,622
|
|
21
|
-
speclogician/logic/api/client.py,sha256=TQHgpO0h6a_7KS78tpyanlHgN1EcBaeZ41yMImZa3Vs,21438
|
|
22
|
-
speclogician/logic/api/decomp.py,sha256=UWU5jjOva95u7qcBUrqdTC-ukqgMKzzQ1-JMMUAEHpw,2025
|
|
23
|
-
speclogician/logic/api/scenario.py,sha256=r225XqLwVP8lSYftEbLCNXfpx-50ibkZghmA9KUY2Us,3189
|
|
24
|
-
speclogician/logic/api/traces.py,sha256=lttjgblL8mAF9Aac5FDNd07kh4Tjnbi3795tVMtR9fc,1641
|
|
25
|
-
speclogician/logic/lib/__init__.py,sha256=fPTbhjXHIskBcwPZeiwLG9YBJhhGfvn6LCDwKUfk1hY,396
|
|
26
|
-
speclogician/logic/lib/complement.py,sha256=aCLiXdvoVIKre75qVWZx3dPTHQ41w6HGDU6KcmZMg4A,3252
|
|
27
|
-
speclogician/logic/lib/domain_model.py,sha256=Q5lcha7tKx9nUsK9jL2bucn9Sxccf40hGydRaO_fhyg,1877
|
|
28
|
-
speclogician/logic/lib/predicates.py,sha256=uakbWCwJRbh9hXgNnf-iFTWA5g-lQk8MBhh_ZoiJgOI,6622
|
|
29
|
-
speclogician/logic/lib/scenarios.py,sha256=26NiAoQQQdQbuZERNFH0Lwqi0OJfkw8wJ2Em92wHi-k,11846
|
|
30
|
-
speclogician/logic/lib/traces.py,sha256=PT2husAUQekF-5q5MEtUzE4OsPsaZ-Tcq-Xboz8ViXc,4616
|
|
31
|
-
speclogician/logic/lib/transitions.py,sha256=o4X-K_awWNUcvqqmcss1GiE-PlL6ojxOjQctxOGY5Ro,3884
|
|
32
|
-
speclogician/logic/main.py,sha256=44K14N_elI4dm3aSfnB4Z_o6MAZprq0MeoDU0AegBHk,8670
|
|
33
|
-
speclogician/logic/strings.py,sha256=yjNW_yMWSsnU5OSDlx6q-z0NfTJV00I-IGsxJ1F1GMM,5940
|
|
34
|
-
speclogician/logic/utils.py,sha256=6ZzYKrQrB4nEkvHE4_jpM7EOzfWYbU3QJwsEq-5ypWk,3602
|
|
35
|
-
speclogician/main.py,sha256=lA-ero6pkY1dfSpYCh58istPWoEUexOoBf5KWp2SPQg,4673
|
|
36
|
-
speclogician/modeling/__init__.py,sha256=-HA2X0crrbTiwRgR21fRx5SKnztPECcu-eRn2KsaSMA,819
|
|
37
|
-
speclogician/modeling/complement.py,sha256=JZq5E_4w2F1VcAM34qmi02PxF_3h0bWm0OgjhYbH4ZE,3121
|
|
38
|
-
speclogician/modeling/component.py,sha256=oxl-UZBGLnhSl2Y6Ox4FotTanFECd-kJhzbXRbkckfY,2071
|
|
39
|
-
speclogician/modeling/conflict.py,sha256=kFVykVVi3vH7TFAVSDrH1RJS6WnO4nzWW65lukfiMS8,591
|
|
40
|
-
speclogician/modeling/domain.py,sha256=mlya_JFQQUvULrgPOi-zvkQhtPsUqujy6EZX75Kgrds,11814
|
|
41
|
-
speclogician/modeling/predicates.py,sha256=IFEwoc2ao6a11BjuDd5YsdefdpGmc1i9zSZHczMERKY,1447
|
|
42
|
-
speclogician/modeling/scenario.py,sha256=IMQxCSUsAsWU3uhIRnPgCJha5F6UdKoDramlPOu3tiw,4509
|
|
43
|
-
speclogician/modeling/spec.py,sha256=qaHNfPXgRuWWXfEkjr_doSUnTvWXaDnxh_OlVfCmp8c,10034
|
|
44
|
-
speclogician/modeling/spec_stats.py,sha256=_ry1p8ym-rZR5uy5pSgxrWdJReqiITO6TVff1fXFiyo,1406
|
|
45
|
-
speclogician/presentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
|
-
speclogician/presentation/api.py,sha256=eU4Hgzdf_feC0PtvcaLr_2y2J6BddmH318G4ILmULqs,7041
|
|
47
|
-
speclogician/presentation/builders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
-
speclogician/presentation/builders/_links.py,sha256=KouKQoJUzGbIAXPwsRpiRiBzhA7_XKYR4EMQkonkNgo,1231
|
|
49
|
-
speclogician/presentation/builders/container.py,sha256=3AN0Z3yjtadf8SLY-SZ937l8CcpDF81k6Y-uLTujizY,2012
|
|
50
|
-
speclogician/presentation/builders/data_artifact.py,sha256=SLs4yCg2bJUie-bimdfShpHM_45a7S33JjzpI5SuqLo,1139
|
|
51
|
-
speclogician/presentation/builders/domain.py,sha256=87WDceHMsUM3uSekOz-iVACSoV_Ef_fXY1BK1nDSc88,1964
|
|
52
|
-
speclogician/presentation/builders/instances_list.py,sha256=Jo0ev28ePD7I7GB7m34So0STEPc0d1GNwx2TeS6wmqQ,1215
|
|
53
|
-
speclogician/presentation/builders/predicate.py,sha256=VCloCAnFKd9vWjd4qRqSJhEYsbvOOL4sf2Inn_nGuMY,1666
|
|
54
|
-
speclogician/presentation/builders/recommendations.py,sha256=Xcs3wDZvJX1dgv5OAlKN_0BbMux-iM_giXYQsaSQPms,1121
|
|
55
|
-
speclogician/presentation/builders/scenario.py,sha256=44E5e3kcvWsBGRVFVWq_3gXRwL74_GIBlqT8GSZr9CY,1158
|
|
56
|
-
speclogician/presentation/builders/scenario_complement.py,sha256=QRACOrjQ-uJvCaaJCeuMrPyXbIe6VUJRa0QfUg7JXhY,2348
|
|
57
|
-
speclogician/presentation/builders/smart_find.py,sha256=TKtJLkqfwGO0Gn1tt725kKIKhXitwTFwnWNWKT-fnFI,1351
|
|
58
|
-
speclogician/presentation/builders/spec.py,sha256=izea_clqqnpyA3kJadODmJbcTr-3QecGzdb6alNcz7w,1146
|
|
59
|
-
speclogician/presentation/builders/state_diff.py,sha256=POb1yYjybhce-vFCDNjJ8fro34zXqp0Nvl-W-AU5C9c,3794
|
|
60
|
-
speclogician/presentation/builders/state_instance.py,sha256=R1L9O0w_GxWezF8VnPhx90drSVVhkV_LomECjZfDpPw,1424
|
|
61
|
-
speclogician/presentation/builders/state_instance_summary.py,sha256=1ZSnxmvRJu3C26NQzEtHnn8-8dxEELxneZ1k8549B9M,3499
|
|
62
|
-
speclogician/presentation/builders/trace.py,sha256=VVbQwmFSTpqCzjOT8fQnZfpjoFjv-1ZglLaVsf2ypRA,1692
|
|
63
|
-
speclogician/presentation/ctx.py,sha256=3lDZelz5PYeaqLu1mb370ofXeG1VZCXxY0ZiJIp131E,1122
|
|
64
|
-
speclogician/presentation/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
|
-
speclogician/presentation/models/container.py,sha256=9higsGlVam3y0sCPeMUZw2S3uN5CNi5wZ-FCYrzThQ0,1255
|
|
66
|
-
speclogician/presentation/models/data_artifact.py,sha256=lIbfz3NfBh98EIXJJFCiN_uKsKs4W4_f8_9Hdt8B4u8,625
|
|
67
|
-
speclogician/presentation/models/domain.py,sha256=eGd3ADSaLc4uLclbFIMbb4l3sdgeA3YS9Ofm-YIrUGc,1084
|
|
68
|
-
speclogician/presentation/models/instances_list.py,sha256=vkTsBh56OF1qsE0y1TO_dUCwz_kNimoONK0cJo7cgHg,643
|
|
69
|
-
speclogician/presentation/models/predicate.py,sha256=53bOFp-6eYTOGvvFVvqUah-xpRud8AMP-Nc-kvSuiI4,1322
|
|
70
|
-
speclogician/presentation/models/recommendations.py,sha256=S76MGmabo84po-Ior0aBw0lGo0m0UTXXYJfod2mPt7M,763
|
|
71
|
-
speclogician/presentation/models/scenario.py,sha256=ltmcQw_ThUt_zovtniOvPIsvGLXg0lz-J2pD8__KIhk,744
|
|
72
|
-
speclogician/presentation/models/scenario_complement.py,sha256=ql_fbRe3564TGzgOD_N7VgA0_3RUeeyvBN95sG4veQw,975
|
|
73
|
-
speclogician/presentation/models/smart_find.py,sha256=UDH5A_2WVapDlm0XNGWpY89KC_EuqxsbGDTLdX3NvEI,930
|
|
74
|
-
speclogician/presentation/models/spec.py,sha256=GI-Fuum5aloB5O7cH8qRG2CyIHPW74lNqAIuD2eXNgY,740
|
|
75
|
-
speclogician/presentation/models/state_diff.py,sha256=cLBGX7X43NrwekTrr6YHwV7X1j7cNQKKSk0yyjHsjfA,721
|
|
76
|
-
speclogician/presentation/models/state_instance.py,sha256=ZB3ak3R7dMjexUB9BwL5v9MropbHOzNNxhugwPOyx0A,916
|
|
77
|
-
speclogician/presentation/models/state_instance_summary.py,sha256=Uhldl-MYyVdoZuqV_uVDaIAYRRbYYxuOanSi2J2SFTc,2927
|
|
78
|
-
speclogician/presentation/models/trace.py,sha256=CXSm1Sg7bMeTpR8HM8a_eoO7EW1VqDinP6oJVkvMaOY,852
|
|
79
|
-
speclogician/presentation/preview/__init__.py,sha256=pO6ExK7gHPY5l0_IIcC7STkgH7yaG77eZXxg179QV6A,179
|
|
80
|
-
speclogician/presentation/preview/cli.py,sha256=neriJ3qmCwdrVFBbzcQEmZpb1a2-MXJQkP904h_Y_uQ,1525
|
|
81
|
-
speclogician/presentation/preview/fixtures/__init__.py,sha256=sZBOhxalIDCJavS_BmvCSwlQOiUKQMqMiLHjg_fEZxU,5902
|
|
82
|
-
speclogician/presentation/preview/fixtures/artifact_container.py,sha256=_GJ9H6Gi2RBdeL-5lnMVMJKlMxtV1hLSLL71uEazRBg,4767
|
|
83
|
-
speclogician/presentation/preview/fixtures/data_artifact.py,sha256=qk_euGBppBdnK-owp8L49gulm6ZucieoNNVuvhtGgws,4487
|
|
84
|
-
speclogician/presentation/preview/fixtures/domain_model.py,sha256=xdzgFH0xDLdLOsRa9_66QlJlI2JhVDv25fHdcBpiMAs,5291
|
|
85
|
-
speclogician/presentation/preview/fixtures/instances_list.py,sha256=PcBwHfDvXkTInlW0tF0oovqBH5keXyWRLhq1dWuVjFc,5527
|
|
86
|
-
speclogician/presentation/preview/fixtures/predicate.py,sha256=ldkbWsIT6bZRS-pXbTNSAXtpkPDHZQQGAw6D54HDA0I,5493
|
|
87
|
-
speclogician/presentation/preview/fixtures/scenario.py,sha256=JUs2gG_3C-AE5yb-GLDR_J8VSl6MQ1Djn6rIQz5ieSU,2517
|
|
88
|
-
speclogician/presentation/preview/fixtures/scenario_complement.py,sha256=S3Fi3Sbvifw6l-iV0ddT-vg8BQh8ifBs7Ycjo-scaQU,2313
|
|
89
|
-
speclogician/presentation/preview/fixtures/smart_find.py,sha256=wZRVEjZkMtMpK4oxmK9tRsxwajeO7DveOau3mhfnGkE,3898
|
|
90
|
-
speclogician/presentation/preview/fixtures/spec.py,sha256=NpOqb0I50CZ-kVdmjepKZolvtaRJQET84E3_QQIwSqs,2925
|
|
91
|
-
speclogician/presentation/preview/fixtures/state_diff.py,sha256=rCX2qat02WnczYq2gYyBzgElXIUH5jtO4EfhpZWjy_4,5872
|
|
92
|
-
speclogician/presentation/preview/fixtures/state_instance.py,sha256=rhieR2ukOVAqTV42AmQ9VWlRe-73e6aXkNE1X3Je6F8,4196
|
|
93
|
-
speclogician/presentation/preview/fixtures/state_instance_summary.py,sha256=GMG8wiajtg3bRxIYI2njN6xuuFsqC5Nr1MqUg4N_o5c,2515
|
|
94
|
-
speclogician/presentation/preview/fixtures/trace.py,sha256=gIx40qBnSRdwgKCo1capkbdKosx957oI302fK1eyOS8,6881
|
|
95
|
-
speclogician/presentation/preview/registry.py,sha256=pSndyi5oonpgjnBxV2uzEBcwr7Jtplr8_JAieWgFW7c,953
|
|
96
|
-
speclogician/presentation/renderers/__init__.py,sha256=2nMURd6Md432olVbra7lDWkqZrSWAmcomRpnM7GjMDU,625
|
|
97
|
-
speclogician/presentation/renderers/container.py,sha256=xMR9eNIgfD9wf49p0xOV5TNtEcuoEgjUTYfMuJxSVSA,4092
|
|
98
|
-
speclogician/presentation/renderers/data_artifact.py,sha256=JWZc7sqVVDy5nk6Lxg0ENLA9CmBtlvI7jI8B8Ld-lvo,4014
|
|
99
|
-
speclogician/presentation/renderers/domain.py,sha256=bw-eLfwWmHMv-xtDkvAMWU8Wq6vLb-z_i_6K9MKO-F4,3656
|
|
100
|
-
speclogician/presentation/renderers/instances_list.py,sha256=--lGTm0vVUmE2CkNcgirNRT_ngqE4r2sasjZ9_jltXI,4226
|
|
101
|
-
speclogician/presentation/renderers/predicate.py,sha256=GyvLo_-6F6IPeiswfmPEGUJ6xf6hiOJBiqQaJnkPJms,6154
|
|
102
|
-
speclogician/presentation/renderers/recommendations.py,sha256=VW1HHBiLbvHbfs3Qw59UzrQuSosi_k1tDyZl7a8YfNM,2479
|
|
103
|
-
speclogician/presentation/renderers/scenario.py,sha256=NblrIVZO7k8Vq2gISEzdKyISWbpJTfRl4S-ug-ZgzZk,2620
|
|
104
|
-
speclogician/presentation/renderers/scenario_complement.py,sha256=pDTtWq-q95xuzmhu07ykVRZvwxx7TQGT8uwB45aOrAc,1769
|
|
105
|
-
speclogician/presentation/renderers/smart_find.py,sha256=-lvWpLZaswakKr7wujkxqdWFg5Lg2UyA6klhN2mshd0,10143
|
|
106
|
-
speclogician/presentation/renderers/spec.py,sha256=56G1x02Su-Vdbo3mi7acErxr_LycmUFTcr5Cer6KuOs,3619
|
|
107
|
-
speclogician/presentation/renderers/state_diff.py,sha256=L_eMeuge-vpQnnOWK2Zkq2DvYOG_UH9Ecg8WptDVt1o,3236
|
|
108
|
-
speclogician/presentation/renderers/state_instance.py,sha256=awEMD6hcl_s-HdLXg9WgBsa2kgvTme9qYt0w6F_CWvU,2585
|
|
109
|
-
speclogician/presentation/renderers/state_instance_summary.py,sha256=n0qGN1W_JWdtGNCxioi-07G8I2dDP8JnQKNETSzLoNM,4354
|
|
110
|
-
speclogician/presentation/renderers/trace.py,sha256=2SgWL5PGg3xj2DJr7buvd3fNiN6jgK3vcRuAXpupDko,3653
|
|
111
|
-
speclogician/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
112
|
-
speclogician/shell/app.py,sha256=e878cPp-kK49TrwnTovTuIpphZB09aKJ8r1x4nKxnkc,5487
|
|
113
|
-
speclogician/shell/shell_ch.py,sha256=tXo_NoucHoIDYy_FUg7YOEGM1UI_M9h6OTh_atbpE_w,9498
|
|
114
|
-
speclogician/shell/shell_view.py,sha256=oohUaBAIDtJoIs8Mp3qh5V1dLkE-f4mzRsPHisuzRCw,5150
|
|
115
|
-
speclogician/state/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
116
|
-
speclogician/state/change.py,sha256=Rf5sbOFAK1VyAJ8ITZWmC0DIPQoh5YCSMXIyCy3t1lA,16196
|
|
117
|
-
speclogician/state/change_result.py,sha256=q_3e30L-Evb9poMyCL_ThC20fygEjDRpIBqgfRqGaxI,862
|
|
118
|
-
speclogician/state/diff.py,sha256=7s1ZQWbd9W7n9FAyFWX2xt3tA0L_hyjD5BHdiHeSEcI,7283
|
|
119
|
-
speclogician/state/inst.py,sha256=1lADU8uVgoSkSVivF_kR8BNUmWbz69zCW9yFOKaav1M,18228
|
|
120
|
-
speclogician/state/recommendation.py,sha256=41p8tK5XaFfhoSDeEGsO6zLPfWWLbMq5l2_VcgD3y5E,284
|
|
121
|
-
speclogician/state/recommender.py,sha256=l-70yz-mxDc1wWG-M72WNCbs8bIdqHzl2qOIVto6Lf0,20019
|
|
122
|
-
speclogician/state/state.py,sha256=HXPIjznL21y0Ajyx-u6u6BuIQdIkNAiyBGgEuZnxyG8,16673
|
|
123
|
-
speclogician/state/state_stats.py,sha256=7IjuoQ5S_pgtOlyt7Qf0mVu5_DYpjBimiu5eoikjcbQ,5124
|
|
124
|
-
speclogician/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
125
|
-
speclogician/tui/app.py,sha256=86yuvLINrZ_V6HBQSwc3XOi1tJlc6fWrzeKAPoHYCO0,8485
|
|
126
|
-
speclogician/tui/app.tcss,sha256=76Do-3il09ysTPQALf2tWaKt0Pau0J7Av_I7iVAug18,2559
|
|
127
|
-
speclogician/tui/demo.py,sha256=CVQyMa9CQaShanhvEf2WTE8pWTKXLle-7dOKD7HlZOw,1229
|
|
128
|
-
speclogician/tui/images/speclogician-full.png,sha256=x5EkWs8DU5L24lYvnHA6gUukbmHewB5IeoHUURDnpS4,2270585
|
|
129
|
-
speclogician/tui/images/speclogician-minimal.png,sha256=0LbOH6aL0XCJIv7mMBB94BFIONP332eUhqB-FgRVwr8,9603
|
|
130
|
-
speclogician/tui/main_screen.py,sha256=g7DpseeCkPkc4LN4BrSfOEHrdX7s2TeETJy1Bh2oSdY,16879
|
|
131
|
-
speclogician/tui/splash_screen.py,sha256=RWLNUd0O86ni9Gey4NzQA-8T0xhZGlcnn9axs1-DlE8,1250
|
|
132
|
-
speclogician/tui/stats_screen.py,sha256=B2eYQQbERBhtMe9vhjk7VYmykyBBu7tZVXxH6aJpwXU,3885
|
|
133
|
-
speclogician/utils/__init__.py,sha256=gpV9054J9J0DLvm0GzN2yvy2ljFLS9aXyBdJP-FCBMQ,1882
|
|
134
|
-
speclogician/utils/load.py,sha256=IA6sQTnu02ON-HHMdgDweUvk5AVuJZ7mZkxBdOjEpZw,4840
|
|
135
|
-
speclogician/utils/prompt.md,sha256=raPVqcaGI-hHzhhtQzWRNoYLDYMjmbm93KBs35ZxYEg,6596
|
|
136
|
-
speclogician/utils/testing.py,sha256=71HNg-Y1GWBU-rG0IZBbEhRtH7lXZORl7TiZ8V3APYU,4481
|
|
137
|
-
speclogician-0.0.0b1.dist-info/WHEEL,sha256=-neZj6nU9KAMg2CnCY6T3w8J53nx1kFGw_9HfoSzM60,79
|
|
138
|
-
speclogician-0.0.0b1.dist-info/METADATA,sha256=iJhHbd0tmtYGZ71bquGCIN35ABVBEZ56yZDYOqNPd2w,4441
|
|
139
|
-
speclogician-0.0.0b1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|