fux-engine 0.2.0__tar.gz → 0.2.1__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 (142) hide show
  1. {fux_engine-0.2.0/fux_engine.egg-info → fux_engine-0.2.1}/PKG-INFO +1 -1
  2. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/__init__.py +1 -1
  3. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/graph.py +3 -1
  4. {fux_engine-0.2.0 → fux_engine-0.2.1/fux_engine.egg-info}/PKG-INFO +1 -1
  5. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/SOURCES.txt +1 -0
  6. fux_engine-0.2.1/tests/test_graph_determinism.py +30 -0
  7. {fux_engine-0.2.0 → fux_engine-0.2.1}/LICENSE +0 -0
  8. {fux_engine-0.2.0 → fux_engine-0.2.1}/README.md +0 -0
  9. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/__main__.py +0 -0
  10. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/fux-icon.svg +0 -0
  11. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/fux-lockup.svg +0 -0
  12. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/fux-mark.svg +0 -0
  13. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/graph_boot.js +0 -0
  14. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/graph_template.html +0 -0
  15. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/astextract.py +0 -0
  16. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/bench.py +0 -0
  17. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/build.py +0 -0
  18. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/capture.py +0 -0
  19. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/check.py +0 -0
  20. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/cli.py +0 -0
  21. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/clicmds.py +0 -0
  22. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/cligraph.py +0 -0
  23. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/cliquery.py +0 -0
  24. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/cliutil.py +0 -0
  25. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/community.py +0 -0
  26. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/components.py +0 -0
  27. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/config.py +0 -0
  28. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/context.py +0 -0
  29. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/costledger.py +0 -0
  30. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/coverage.py +0 -0
  31. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/copilot/prompts/fux-plan.prompt.md +0 -0
  32. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/copilot/prompts/fux.prompt.md +0 -0
  33. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/README.md +0 -0
  34. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/rules/async-everywhere.md +0 -0
  35. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/rules/doc-per-code-change.md +0 -0
  36. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/rules/files-max-100-lines.md +0 -0
  37. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/rules/no-secrets-in-vcs.md +0 -0
  38. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/_common.sh +0 -0
  39. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/post_tool_use.sh +0 -0
  40. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/session_start.sh +0 -0
  41. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/stop.sh +0 -0
  42. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/user_prompt_submit.sh +0 -0
  43. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/packs/indian-markets-tax/pack.toml +0 -0
  44. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/packs/indian-markets-tax/rules/capital-gains-equity.md +0 -0
  45. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/packs/indian-markets-tax/rules/market-hours-nse.md +0 -0
  46. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/schema.json +0 -0
  47. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/adr/SKILL.md +0 -0
  48. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/distill/SKILL.md +0 -0
  49. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/fetch-rules/SKILL.md +0 -0
  50. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/fux/SKILL.md +0 -0
  51. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/plan/SKILL.md +0 -0
  52. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/savings/SKILL.md +0 -0
  53. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/trace/SKILL.md +0 -0
  54. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/drift.py +0 -0
  55. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/embed.py +0 -0
  56. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/explain.py +0 -0
  57. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/feedback.py +0 -0
  58. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/fetchrules.py +0 -0
  59. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/findings.py +0 -0
  60. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/fix.py +0 -0
  61. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/fmwrite.py +0 -0
  62. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/frontmatter.py +0 -0
  63. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/gate.py +0 -0
  64. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/gitutil.py +0 -0
  65. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/globs.py +0 -0
  66. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/governance.py +0 -0
  67. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/graphhtml.py +0 -0
  68. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/graphquery.py +0 -0
  69. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/hookio.py +0 -0
  70. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/hooks.py +0 -0
  71. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/hybrid.py +0 -0
  72. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/impact.py +0 -0
  73. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/importer.py +0 -0
  74. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/index.py +0 -0
  75. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/initcmd.py +0 -0
  76. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/lint.py +0 -0
  77. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/loader.py +0 -0
  78. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/mcpserver.py +0 -0
  79. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/mine.py +0 -0
  80. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/model.py +0 -0
  81. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/narrative.py +0 -0
  82. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/pack.py +0 -0
  83. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/parity.py +0 -0
  84. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/paths.py +0 -0
  85. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/recall.py +0 -0
  86. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/report.py +0 -0
  87. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/savings.py +0 -0
  88. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/scaffold.py +0 -0
  89. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/scalars.py +0 -0
  90. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/schema.py +0 -0
  91. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/seal.py +0 -0
  92. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/serve.py +0 -0
  93. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/settings.py +0 -0
  94. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/stats.py +0 -0
  95. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/templates/formula.md +0 -0
  96. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/templates/spec.md +0 -0
  97. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/touch.py +0 -0
  98. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/tour.py +0 -0
  99. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/uispec.py +0 -0
  100. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/usage.py +0 -0
  101. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/verify.py +0 -0
  102. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/vexamples.py +0 -0
  103. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/dependency_links.txt +0 -0
  104. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/entry_points.txt +0 -0
  105. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/requires.txt +0 -0
  106. {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/top_level.txt +0 -0
  107. {fux_engine-0.2.0 → fux_engine-0.2.1}/pyproject.toml +0 -0
  108. {fux_engine-0.2.0 → fux_engine-0.2.1}/setup.cfg +0 -0
  109. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_ast_backend.py +0 -0
  110. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_astextract.py +0 -0
  111. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_bm25f_expand.py +0 -0
  112. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_capture_governance.py +0 -0
  113. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_centrality.py +0 -0
  114. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_check_fix.py +0 -0
  115. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_components.py +0 -0
  116. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_costledger.py +0 -0
  117. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_crossfile_calls.py +0 -0
  118. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_edge_confidence.py +0 -0
  119. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_embed_rerank.py +0 -0
  120. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_examples.py +0 -0
  121. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_feedback.py +0 -0
  122. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_fetch_rules.py +0 -0
  123. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_frontmatter.py +0 -0
  124. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_fuzz_mine.py +0 -0
  125. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_globs.py +0 -0
  126. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_graphhtml.py +0 -0
  127. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_hybrid.py +0 -0
  128. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_impact.py +0 -0
  129. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_lint_stats_gate.py +0 -0
  130. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_mcp.py +0 -0
  131. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_mcp_extra.py +0 -0
  132. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_pack.py +0 -0
  133. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_parity_import.py +0 -0
  134. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_recall_build_verify.py +0 -0
  135. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_recall_eval.py +0 -0
  136. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_resolution.py +0 -0
  137. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_savings.py +0 -0
  138. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_schema_scaffold_init.py +0 -0
  139. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_seal.py +0 -0
  140. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_serve_sanitize.py +0 -0
  141. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_uispec.py +0 -0
  142. {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_verify_hardening.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fux-engine
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Fux — a portable agent-aware knowledge engine: rules, memory, narrative, and graph in one frontmatter substrate.
5
5
  Author-email: arpit arya <arpitarya.me@gmail.com>
6
6
  License: MIT
@@ -3,4 +3,4 @@
3
3
  One frontmatter substrate → derived index, graph, and memory views.
4
4
  $0 deterministic maintenance; no mandatory LLM calls. See docs/fux-plan.md.
5
5
  """
6
- __version__ = "0.2.0"
6
+ __version__ = "0.2.1"
@@ -126,7 +126,9 @@ def _xref(nodes: dict, texts: dict[str, str], covered: set[tuple[str, str]]) ->
126
126
  index = _symbol_index(nodes)
127
127
  seen, out = set(), []
128
128
  for rel, text in texts.items():
129
- for name in astextract.call_names(text) - astextract.CALL_KEYWORDS:
129
+ # `call_names` returns a set — sort so reference-edge order (and thus
130
+ # graph.json) is reproducible across builds (no PYTHONHASHSEED churn).
131
+ for name in sorted(astextract.call_names(text) - astextract.CALL_KEYWORDS):
130
132
  for tid in index.get(name, []):
131
133
  if tid.startswith(rel + "::") or (rel, tid) in covered or (rel, tid) in seen:
132
134
  continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fux-engine
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Fux — a portable agent-aware knowledge engine: rules, memory, narrative, and graph in one frontmatter substrate.
5
5
  Author-email: arpit arya <arpitarya.me@gmail.com>
6
6
  License: MIT
@@ -120,6 +120,7 @@ tests/test_fetch_rules.py
120
120
  tests/test_frontmatter.py
121
121
  tests/test_fuzz_mine.py
122
122
  tests/test_globs.py
123
+ tests/test_graph_determinism.py
123
124
  tests/test_graphhtml.py
124
125
  tests/test_hybrid.py
125
126
  tests/test_impact.py
@@ -0,0 +1,30 @@
1
+ """Reproducible builds: `_xref` iterates a set (`call_names`), so without an
2
+ explicit sort the `references` edge order — and thus graph.json — churns across
3
+ builds under hash randomization, making committed views noisy. The fix sorts the
4
+ iteration; this guards it by asserting the emitted order is canonical (sorted)."""
5
+ from __future__ import annotations
6
+
7
+ import json
8
+
9
+ from fux import build
10
+
11
+
12
+ def _refs_from(project, src_file):
13
+ g = json.loads((project / ".fux" / "out" / "graph.json").read_text())
14
+ return [e for e in g["edges"]
15
+ if e["type"] == "references" and e["source"] == src_file]
16
+
17
+
18
+ def test_reference_edges_emitted_in_sorted_target_order(project):
19
+ # caller.py references three symbols defined elsewhere, at module scope (so they
20
+ # are loose file→symbol `references`, the edges built by `_xref`).
21
+ (project / "src" / "defs.py").write_text(
22
+ "def zeta():\n return 1\n\ndef alpha():\n return 2\n\ndef mu():\n return 3\n")
23
+ (project / "src" / "caller.py").write_text("zeta()\nalpha()\nmu()\n")
24
+ build.run(project)
25
+
26
+ refs = _refs_from(project, "src/caller.py")
27
+ names = [e["target"].split("::", 1)[1] for e in refs]
28
+ assert set(names) >= {"alpha", "mu", "zeta"}, names
29
+ # canonical order — independent of set-iteration / PYTHONHASHSEED.
30
+ assert names == sorted(names), f"reference edges not in sorted order: {names}"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes