substratum-cli 0.2.4__tar.gz → 0.2.6__tar.gz

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 (111) hide show
  1. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/PKG-INFO +1 -1
  2. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/__init__.py +1 -1
  3. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/_boot.py +3 -2
  4. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/_update.py +24 -0
  5. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/session.py +11 -2
  6. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli.egg-info/PKG-INFO +1 -1
  7. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/README.md +0 -0
  8. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/pyproject.toml +0 -0
  9. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/setup.cfg +0 -0
  10. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/README.md +0 -0
  11. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/__main__.py +0 -0
  12. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/_vendor/__init__.py +0 -0
  13. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/_vendor/_pro_test_derive.py +0 -0
  14. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/_vendor/client_gate.py +0 -0
  15. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/_wordmark.py +0 -0
  16. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/account.py +0 -0
  17. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/build_state.py +0 -0
  18. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/cli.py +0 -0
  19. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/codes.py +0 -0
  20. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/__init__.py +0 -0
  21. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/apply.py +0 -0
  22. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/auth.py +0 -0
  23. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/commit.py +0 -0
  24. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/explain.py +0 -0
  25. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/failing.py +0 -0
  26. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/fix.py +0 -0
  27. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/history.py +0 -0
  28. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/init_cmd.py +0 -0
  29. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/pr.py +0 -0
  30. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/replay.py +0 -0
  31. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/scaffold.py +0 -0
  32. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/show.py +0 -0
  33. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/undo.py +0 -0
  34. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/verify.py +0 -0
  35. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/commands/write.py +0 -0
  36. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/config.py +0 -0
  37. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/diffs.py +0 -0
  38. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/engine.py +0 -0
  39. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/gitio.py +0 -0
  40. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/langscan.py +0 -0
  41. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/product_ops.py +0 -0
  42. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/refusals.py +0 -0
  43. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/remote.py +0 -0
  44. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/render.py +0 -0
  45. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/result.py +0 -0
  46. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/run_store.py +0 -0
  47. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/runid.py +0 -0
  48. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli/style.py +0 -0
  49. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli.egg-info/SOURCES.txt +0 -0
  50. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli.egg-info/dependency_links.txt +0 -0
  51. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli.egg-info/entry_points.txt +0 -0
  52. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli.egg-info/requires.txt +0 -0
  53. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/substratum_cli.egg-info/top_level.txt +0 -0
  54. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_adaptive_prior.py +0 -0
  55. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_alias_warrant_trace.py +0 -0
  56. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_bidirectional_gate_contracts.py +0 -0
  57. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_coherence_evolution.py +0 -0
  58. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_coherences.py +0 -0
  59. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_connection_web_api.py +0 -0
  60. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_cross_entity_scoping.py +0 -0
  61. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_data.py +0 -0
  62. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_de28_negation_refuse.py +0 -0
  63. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_definite_description_handler.py +0 -0
  64. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_demo_regression_catalog.py +0 -0
  65. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_demo_response_shape.py +0 -0
  66. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_e1_e2_field_alignment.py +0 -0
  67. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_extraction_class_write_time.py +0 -0
  68. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_falsification_predictions.py +0 -0
  69. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_gap_d_wh_normalization.py +0 -0
  70. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_inference.py +0 -0
  71. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_inflection_cvc_rule.py +0 -0
  72. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_inflection_irregular.py +0 -0
  73. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_intervention.py +0 -0
  74. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_invariant.py +0 -0
  75. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_legal_citation_handler.py +0 -0
  76. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_lens_noop_seam.py +0 -0
  77. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_markup_tag_handler.py +0 -0
  78. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_nl_parser.py +0 -0
  79. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_nl_parser_adversarial.py +0 -0
  80. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_noise.py +0 -0
  81. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_pass2_contextual.py +0 -0
  82. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_perspectives.py +0 -0
  83. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_polysemous_token_alias_guard.py +0 -0
  84. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_possessive_normalization.py +0 -0
  85. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_predicate_canon.py +0 -0
  86. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_projection_gate.py +0 -0
  87. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_projection_gate_tag_question.py +0 -0
  88. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_query_normalizer.py +0 -0
  89. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_records_answer_format.py +0 -0
  90. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_referent_aboutness_gate.py +0 -0
  91. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_referent_quality_gate.py +0 -0
  92. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_refuse_message_topic_neutrality.py +0 -0
  93. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_relation_detection.py +0 -0
  94. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_relaxation.py +0 -0
  95. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_residual_content_gate.py +0 -0
  96. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_reverse_lookup_subject_filter.py +0 -0
  97. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_sec_statement_aliases.py +0 -0
  98. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_span_lens.py +0 -0
  99. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_span_lens_query_integration.py +0 -0
  100. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_substrate.py +0 -0
  101. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_synonymy_detector.py +0 -0
  102. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_table_ingest.py +0 -0
  103. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_triple_ingest.py +0 -0
  104. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_two_phase_schema.py +0 -0
  105. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_user_asserted_aliases.py +0 -0
  106. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_v2_api.py +0 -0
  107. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_v2_api_claims.py +0 -0
  108. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_v2_claim_determinism.py +0 -0
  109. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_word_role.py +0 -0
  110. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_word_role_wiring.py +0 -0
  111. {substratum_cli-0.2.4 → substratum_cli-0.2.6}/tests/test_xbrl_doc_aliases.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: substratum-cli
3
- Version: 0.2.4
3
+ Version: 0.2.6
4
4
  Summary: Substratum: verified-or-refused code, with provenance. The terminal over the comprehension engine.
5
5
  Author: Substratum
6
6
  License: LicenseRef-Proprietary
@@ -5,4 +5,4 @@ Import budget: this package is stdlib-only; the ONLY module reaching into backen
5
5
  """
6
6
  # SINGLE SOURCE OF TRUTH for the release version. pyproject reads this (dynamic version), the boot shows
7
7
  # it, and the update-check compares against it. To cut a release, bump ONLY this line, then publish.
8
- __version__ = "0.2.4"
8
+ __version__ = "0.2.6"
@@ -56,7 +56,8 @@ def seal(lib_name: str, version: str) -> tuple[str, str]:
56
56
 
57
57
 
58
58
  def render(name, census, langs, substrate, substrate_note, substrate_ok, standing, version,
59
- color=True, ascii_mode=False, logged_in=True, update_to="", seal_key="") -> list[str]:
59
+ color=True, ascii_mode=False, logged_in=True, update_to="", seal_key="",
60
+ update_cmd="pip install --upgrade substratum-cli") -> list[str]:
60
61
  """Return the boot lines. `substrate` is the HONEST name of the intelligence serving this session
61
62
  (the hosted engine version, or 'not connected') -- NEVER a local path. `substrate_note`/`_ok` render
62
63
  the connection state. `seal_key` is the stable identity the self-certificate hashes."""
@@ -157,7 +158,7 @@ def render(name, census, langs, substrate, substrate_note, substrate_ok, standin
157
158
  if update_to: # a pip package cannot self-update; hand over the one command
158
159
  arrow = "^" if ascii_mode else "↑"
159
160
  out += [" " + c(GO, f"{arrow} update") + c(LAB, f" Substratum {update_to} is available")
160
- + c(CH, f" {dot} ") + c(GO, "pip install --upgrade substratum-cli")]
161
+ + c(CH, f" {dot} ") + c(GO, update_cmd)]
161
162
  if not logged_in:
162
163
  out += [" " + c(GO, "login") + c(LAB, " to ") + c(DAT, "fix") + c(LAB, " and ") + c(DAT, "write")
163
164
  + c(LAB, " code (connects the engine)")
@@ -40,6 +40,30 @@ def available(current: str) -> str:
40
40
  return latest if latest and _version_tuple(latest) > _version_tuple(current) else ""
41
41
 
42
42
 
43
+ def upgrade_command() -> str:
44
+ """The exact command that updates THIS install. pipx installs each app into an isolated venv under
45
+ a `pipx` path, where `pip install --upgrade` is a no-op -- so a nag that always says "pip" is wrong
46
+ for the primary (pipx) install path our docs recommend. Detect the install method from the runtime
47
+ location and hand the right command; if the location is somehow unreadable, name both so the user is
48
+ never stuck. Pure, no network, never raises."""
49
+ try:
50
+ import sys
51
+ parts = [getattr(sys, "prefix", "") or "", getattr(sys, "executable", "") or ""]
52
+ try:
53
+ parts.append(os.path.dirname(os.path.abspath(__file__)))
54
+ except Exception:
55
+ pass
56
+ hay = "/".join(p for p in parts if p).replace("\\", "/").lower()
57
+ if not hay:
58
+ return "pipx upgrade substratum-cli (or) pip install --upgrade substratum-cli"
59
+ # pipx venvs live at .../pipx/venvs/<app>/...; the `/pipx/` path segment is the reliable signal.
60
+ if "/pipx/" in ("/" + hay + "/") or "pipx/venvs" in hay:
61
+ return "pipx upgrade substratum-cli"
62
+ return "pip install --upgrade substratum-cli"
63
+ except Exception:
64
+ return "pipx upgrade substratum-cli (or) pip install --upgrade substratum-cli"
65
+
66
+
43
67
  def engine_version() -> str:
44
68
  """The HOSTED engine's substrate version from the last check (cached), or "". This is what actually
45
69
  serves fix/write for a thin client, so the boot shows THIS -- never a local path."""
@@ -114,6 +114,7 @@ class Session:
114
114
  logged_in = account.is_logged_in()
115
115
  _update.refresh_async() # refresh the update cache in the background (next session)
116
116
  update_to = _update.available(_cver) # instant read from cache; "" if none or unknown
117
+ update_cmd = _update.upgrade_command() # the RIGHT command for this install (pipx vs pip)
117
118
 
118
119
  # HONEST substrate: which intelligence actually serves fix/write this session, and in which mode.
119
120
  # Two real deployment modes: HOSTED (thin client -> engine on Fly) and AIRGAPPED-LOCAL (engine +
@@ -141,7 +142,8 @@ class Session:
141
142
  if S.seal_cols() >= 84:
142
143
  for ln in _boot.render(name, census, "py · go · ts", substrate, sub_note, sub_ok,
143
144
  st, "0.1.0", color=self.color, ascii_mode=ascii_mode,
144
- logged_in=logged_in, update_to=update_to, seal_key=seal_key):
145
+ logged_in=logged_in, update_to=update_to, seal_key=seal_key,
146
+ update_cmd=update_cmd):
145
147
  self._say(ln)
146
148
  return
147
149
  # compact identity (narrow pane): the mark + a lime-railed status
@@ -161,7 +163,7 @@ class Session:
161
163
  self._say(f" {rail} " + bits)
162
164
  if update_to:
163
165
  self._say(" " + pn("update", S.GOLD)
164
- + pn(f" {update_to}: pip install --upgrade substratum-cli", S.LABEL))
166
+ + pn(f" {update_to}: {update_cmd}", S.LABEL))
165
167
  if not logged_in:
166
168
  self._say(" " + pn("login", S.GOLD) + pn(" to fix and write code", S.LABEL))
167
169
  self._say(" " + pn("help", S.GOLD) + pn(" for commands", S.LABEL))
@@ -619,6 +621,7 @@ class Session:
619
621
  self.banner()
620
622
  from . import style as S
621
623
  prompt = (S.GOLD + S.g("brand") + " " + S.RESET) if self.color else (S.g("brand") + " ")
624
+ exit_hints = 0
622
625
  while True:
623
626
  try:
624
627
  line = input(prompt)
@@ -626,7 +629,13 @@ class Session:
626
629
  sys.stdout.write("\n")
627
630
  _leave()
628
631
  except KeyboardInterrupt:
632
+ # Ctrl-C clears the current line (readline behavior); it does NOT exit. Users spam it
633
+ # trying to leave and just get blank lines, so surface the real exit the first few
634
+ # times, then stay quiet for power users who use Ctrl-C to clear a half-typed line.
629
635
  sys.stdout.write("\n")
636
+ if exit_hints < 3:
637
+ self._say(" Ctrl-C clears the line. to leave, type /exit (or press Ctrl-D)", _DIM)
638
+ exit_hints += 1
630
639
  continue
631
640
  try:
632
641
  res, keep = self.handle(line)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: substratum-cli
3
- Version: 0.2.4
3
+ Version: 0.2.6
4
4
  Summary: Substratum: verified-or-refused code, with provenance. The terminal over the comprehension engine.
5
5
  Author: Substratum
6
6
  License: LicenseRef-Proprietary
File without changes
File without changes