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.
- {fux_engine-0.2.0/fux_engine.egg-info → fux_engine-0.2.1}/PKG-INFO +1 -1
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/__init__.py +1 -1
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/graph.py +3 -1
- {fux_engine-0.2.0 → fux_engine-0.2.1/fux_engine.egg-info}/PKG-INFO +1 -1
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/SOURCES.txt +1 -0
- fux_engine-0.2.1/tests/test_graph_determinism.py +30 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/LICENSE +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/README.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/__main__.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/fux-icon.svg +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/fux-lockup.svg +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/fux-mark.svg +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/graph_boot.js +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/assets/graph_template.html +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/astextract.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/bench.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/build.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/capture.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/check.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/cli.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/clicmds.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/cligraph.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/cliquery.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/cliutil.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/community.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/components.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/config.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/context.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/costledger.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/coverage.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/copilot/prompts/fux-plan.prompt.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/copilot/prompts/fux.prompt.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/README.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/rules/async-everywhere.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/rules/doc-per-code-change.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/rules/files-max-100-lines.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/global/rules/no-secrets-in-vcs.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/_common.sh +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/post_tool_use.sh +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/session_start.sh +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/stop.sh +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/hooks/user_prompt_submit.sh +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/packs/indian-markets-tax/pack.toml +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/packs/indian-markets-tax/rules/capital-gains-equity.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/packs/indian-markets-tax/rules/market-hours-nse.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/schema.json +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/adr/SKILL.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/distill/SKILL.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/fetch-rules/SKILL.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/fux/SKILL.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/plan/SKILL.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/savings/SKILL.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/skills/trace/SKILL.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/drift.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/embed.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/explain.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/feedback.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/fetchrules.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/findings.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/fix.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/fmwrite.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/frontmatter.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/gate.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/gitutil.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/globs.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/governance.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/graphhtml.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/graphquery.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/hookio.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/hooks.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/hybrid.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/impact.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/importer.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/index.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/initcmd.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/lint.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/loader.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/mcpserver.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/mine.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/model.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/narrative.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/pack.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/parity.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/paths.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/recall.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/report.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/savings.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/scaffold.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/scalars.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/schema.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/seal.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/serve.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/settings.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/stats.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/templates/formula.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/templates/spec.md +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/touch.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/tour.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/uispec.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/usage.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/verify.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux/vexamples.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/dependency_links.txt +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/entry_points.txt +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/requires.txt +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/fux_engine.egg-info/top_level.txt +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/pyproject.toml +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/setup.cfg +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_ast_backend.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_astextract.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_bm25f_expand.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_capture_governance.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_centrality.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_check_fix.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_components.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_costledger.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_crossfile_calls.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_edge_confidence.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_embed_rerank.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_examples.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_feedback.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_fetch_rules.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_frontmatter.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_fuzz_mine.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_globs.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_graphhtml.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_hybrid.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_impact.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_lint_stats_gate.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_mcp.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_mcp_extra.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_pack.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_parity_import.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_recall_build_verify.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_recall_eval.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_resolution.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_savings.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_schema_scaffold_init.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_seal.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_serve_sanitize.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_uispec.py +0 -0
- {fux_engine-0.2.0 → fux_engine-0.2.1}/tests/test_verify_hardening.py +0 -0
|
@@ -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
|
-
|
|
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
|
|
@@ -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
|
{fux_engine-0.2.0 → fux_engine-0.2.1}/fux/data/packs/indian-markets-tax/rules/market-hours-nse.md
RENAMED
|
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
|
|
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
|