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.
Files changed (153) hide show
  1. speclogician/agent/funcs.py +29 -0
  2. speclogician/cmd/agent_cmd.py +89 -0
  3. speclogician/cmd/data_cmd.py +24 -0
  4. speclogician/cmd/model_cmd.py +42 -0
  5. speclogician/cmd/overlay_cmd.py +30 -0
  6. speclogician/cmd/scenario_cmd.py +61 -0
  7. speclogician/cmd/state_cmd.py +52 -0
  8. speclogician/data/artifact.py +8 -50
  9. speclogician/data/container.py +18 -384
  10. speclogician/data/mapping.py +18 -17
  11. speclogician/data/refs.py +12 -11
  12. speclogician/data/reports.py +11 -0
  13. speclogician/data/traces.py +15 -6
  14. speclogician/llms/llmtools.py +102 -0
  15. speclogician/llms/overlay.py +264 -0
  16. speclogician/main.py +36 -102
  17. speclogician/modeling/__init__.py +0 -31
  18. speclogician/modeling/component.py +4 -60
  19. speclogician/modeling/conflict.py +5 -19
  20. speclogician/modeling/domain.py +93 -280
  21. speclogician/modeling/model.py +206 -0
  22. speclogician/modeling/predicates.py +20 -22
  23. speclogician/modeling/report.py +33 -0
  24. speclogician/modeling/scenario.py +119 -87
  25. speclogician/sl_cmd.py +76 -0
  26. speclogician/state/change.py +98 -378
  27. speclogician/state/state.py +183 -399
  28. speclogician/tui/box.tcss +10 -0
  29. speclogician/tui/tui.py +131 -0
  30. speclogician/utils/__init__.py +1 -70
  31. speclogician/utils/imx.py +195 -0
  32. speclogician/utils/load.py +25 -147
  33. speclogician/utils/prompt.md +1 -325
  34. speclogician-0.0.0.dev1.dist-info/METADATA +21 -0
  35. speclogician-0.0.0.dev1.dist-info/RECORD +43 -0
  36. speclogician/commands/__init__.py +0 -15
  37. speclogician/commands/cmd_ch.py +0 -616
  38. speclogician/commands/cmd_find.py +0 -256
  39. speclogician/commands/cmd_view.py +0 -202
  40. speclogician/commands/runner.py +0 -149
  41. speclogician/commands/utils.py +0 -101
  42. speclogician/demos/.DS_Store +0 -0
  43. speclogician/demos/cmd_demo.py +0 -278
  44. speclogician/demos/loader.py +0 -135
  45. speclogician/demos/model.py +0 -27
  46. speclogician/demos/runner.py +0 -51
  47. speclogician/logic/__init__.py +0 -11
  48. speclogician/logic/api/__init__.py +0 -29
  49. speclogician/logic/api/client.py +0 -606
  50. speclogician/logic/api/decomp.py +0 -67
  51. speclogician/logic/api/scenario.py +0 -102
  52. speclogician/logic/api/traces.py +0 -59
  53. speclogician/logic/lib/__init__.py +0 -19
  54. speclogician/logic/lib/complement.py +0 -107
  55. speclogician/logic/lib/domain_model.py +0 -59
  56. speclogician/logic/lib/predicates.py +0 -151
  57. speclogician/logic/lib/scenarios.py +0 -369
  58. speclogician/logic/lib/traces.py +0 -114
  59. speclogician/logic/lib/transitions.py +0 -104
  60. speclogician/logic/main.py +0 -246
  61. speclogician/logic/strings.py +0 -194
  62. speclogician/logic/utils.py +0 -135
  63. speclogician/modeling/complement.py +0 -104
  64. speclogician/modeling/spec.py +0 -306
  65. speclogician/modeling/spec_stats.py +0 -39
  66. speclogician/presentation/api.py +0 -244
  67. speclogician/presentation/builders/_links.py +0 -44
  68. speclogician/presentation/builders/container.py +0 -53
  69. speclogician/presentation/builders/data_artifact.py +0 -42
  70. speclogician/presentation/builders/domain.py +0 -54
  71. speclogician/presentation/builders/instances_list.py +0 -38
  72. speclogician/presentation/builders/predicate.py +0 -51
  73. speclogician/presentation/builders/recommendations.py +0 -41
  74. speclogician/presentation/builders/scenario.py +0 -41
  75. speclogician/presentation/builders/scenario_complement.py +0 -82
  76. speclogician/presentation/builders/smart_find.py +0 -39
  77. speclogician/presentation/builders/spec.py +0 -39
  78. speclogician/presentation/builders/state_diff.py +0 -150
  79. speclogician/presentation/builders/state_instance.py +0 -42
  80. speclogician/presentation/builders/state_instance_summary.py +0 -84
  81. speclogician/presentation/builders/trace.py +0 -58
  82. speclogician/presentation/ctx.py +0 -38
  83. speclogician/presentation/models/container.py +0 -44
  84. speclogician/presentation/models/data_artifact.py +0 -33
  85. speclogician/presentation/models/domain.py +0 -50
  86. speclogician/presentation/models/instances_list.py +0 -23
  87. speclogician/presentation/models/predicate.py +0 -60
  88. speclogician/presentation/models/recommendations.py +0 -34
  89. speclogician/presentation/models/scenario.py +0 -31
  90. speclogician/presentation/models/scenario_complement.py +0 -40
  91. speclogician/presentation/models/smart_find.py +0 -34
  92. speclogician/presentation/models/spec.py +0 -32
  93. speclogician/presentation/models/state_diff.py +0 -34
  94. speclogician/presentation/models/state_instance.py +0 -31
  95. speclogician/presentation/models/state_instance_summary.py +0 -102
  96. speclogician/presentation/models/trace.py +0 -42
  97. speclogician/presentation/preview/__init__.py +0 -13
  98. speclogician/presentation/preview/cli.py +0 -50
  99. speclogician/presentation/preview/fixtures/__init__.py +0 -205
  100. speclogician/presentation/preview/fixtures/artifact_container.py +0 -150
  101. speclogician/presentation/preview/fixtures/data_artifact.py +0 -144
  102. speclogician/presentation/preview/fixtures/domain_model.py +0 -162
  103. speclogician/presentation/preview/fixtures/instances_list.py +0 -162
  104. speclogician/presentation/preview/fixtures/predicate.py +0 -184
  105. speclogician/presentation/preview/fixtures/scenario.py +0 -84
  106. speclogician/presentation/preview/fixtures/scenario_complement.py +0 -81
  107. speclogician/presentation/preview/fixtures/smart_find.py +0 -140
  108. speclogician/presentation/preview/fixtures/spec.py +0 -95
  109. speclogician/presentation/preview/fixtures/state_diff.py +0 -158
  110. speclogician/presentation/preview/fixtures/state_instance.py +0 -128
  111. speclogician/presentation/preview/fixtures/state_instance_summary.py +0 -80
  112. speclogician/presentation/preview/fixtures/trace.py +0 -206
  113. speclogician/presentation/preview/registry.py +0 -42
  114. speclogician/presentation/renderers/__init__.py +0 -24
  115. speclogician/presentation/renderers/container.py +0 -136
  116. speclogician/presentation/renderers/data_artifact.py +0 -144
  117. speclogician/presentation/renderers/domain.py +0 -123
  118. speclogician/presentation/renderers/instances_list.py +0 -120
  119. speclogician/presentation/renderers/predicate.py +0 -180
  120. speclogician/presentation/renderers/recommendations.py +0 -90
  121. speclogician/presentation/renderers/scenario.py +0 -94
  122. speclogician/presentation/renderers/scenario_complement.py +0 -59
  123. speclogician/presentation/renderers/smart_find.py +0 -307
  124. speclogician/presentation/renderers/spec.py +0 -105
  125. speclogician/presentation/renderers/state_diff.py +0 -102
  126. speclogician/presentation/renderers/state_instance.py +0 -82
  127. speclogician/presentation/renderers/state_instance_summary.py +0 -143
  128. speclogician/presentation/renderers/trace.py +0 -122
  129. speclogician/shell/app.py +0 -170
  130. speclogician/shell/shell_ch.py +0 -263
  131. speclogician/shell/shell_view.py +0 -153
  132. speclogician/state/change_result.py +0 -32
  133. speclogician/state/diff.py +0 -191
  134. speclogician/state/inst.py +0 -574
  135. speclogician/state/recommendation.py +0 -13
  136. speclogician/state/recommender.py +0 -577
  137. speclogician/state/state_stats.py +0 -133
  138. speclogician/tui/__init__.py +0 -0
  139. speclogician/tui/app.py +0 -257
  140. speclogician/tui/app.tcss +0 -160
  141. speclogician/tui/demo.py +0 -45
  142. speclogician/tui/images/speclogician-full.png +0 -0
  143. speclogician/tui/images/speclogician-minimal.png +0 -0
  144. speclogician/tui/main_screen.py +0 -454
  145. speclogician/tui/splash_screen.py +0 -51
  146. speclogician/tui/stats_screen.py +0 -125
  147. speclogician/utils/testing.py +0 -151
  148. speclogician-0.0.0b1.dist-info/METADATA +0 -116
  149. speclogician-0.0.0b1.dist-info/RECORD +0 -139
  150. /speclogician/{presentation → agent}/__init__.py +0 -0
  151. /speclogician/{presentation/builders → cmd}/__init__.py +0 -0
  152. /speclogician/{presentation/models → llms}/__init__.py +0 -0
  153. {speclogician-0.0.0b1.dist-info → speclogician-0.0.0.dev1.dist-info}/WHEEL +0 -0
@@ -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