alloc-context 0.1.0__tar.gz → 0.1.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 (136) hide show
  1. {alloc_context-0.1.0 → alloc_context-0.1.1}/PKG-INFO +3 -1
  2. {alloc_context-0.1.0 → alloc_context-0.1.1}/README.md +2 -0
  3. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloc_context.egg-info/PKG-INFO +3 -1
  4. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloc_context.egg-info/SOURCES.txt +1 -0
  5. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/__init__.py +1 -1
  6. {alloc_context-0.1.0 → alloc_context-0.1.1}/pyproject.toml +1 -1
  7. alloc_context-0.1.1/tests/test_server_json.py +35 -0
  8. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_workflows.py +25 -2
  9. {alloc_context-0.1.0 → alloc_context-0.1.1}/LICENSE +0 -0
  10. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloc_context.egg-info/dependency_links.txt +0 -0
  11. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloc_context.egg-info/entry_points.txt +0 -0
  12. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloc_context.egg-info/requires.txt +0 -0
  13. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloc_context.egg-info/top_level.txt +0 -0
  14. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/__main__.py +0 -0
  15. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/config.py +0 -0
  16. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/horizon.py +0 -0
  17. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/__init__.py +0 -0
  18. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/cf_benchmarks.py +0 -0
  19. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/cf_history.py +0 -0
  20. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/coinbase_client.py +0 -0
  21. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/coinbase_portfolio.py +0 -0
  22. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/coingecko.py +0 -0
  23. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/coinmarketcap.py +0 -0
  24. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/env_keys.py +0 -0
  25. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/etf_flows.py +0 -0
  26. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/exchange/__init__.py +0 -0
  27. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/exchange/coinbase_adapter.py +0 -0
  28. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/exchange/kraken_adapter.py +0 -0
  29. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/exchange/live.py +0 -0
  30. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/exchange/portfolio.py +0 -0
  31. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/exchange/registry.py +0 -0
  32. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/exchange/types.py +0 -0
  33. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/exchange_http.py +0 -0
  34. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/fear_greed.py +0 -0
  35. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/fred.py +0 -0
  36. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/http_errors.py +0 -0
  37. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/kalshi.py +0 -0
  38. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/kalshi_api.py +0 -0
  39. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/kalshi_client.py +0 -0
  40. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/kalshi_files.py +0 -0
  41. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/kalshi_state.py +0 -0
  42. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/kraken_client.py +0 -0
  43. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/kraken_portfolio.py +0 -0
  44. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/macro_calendar.py +0 -0
  45. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/macro_normalize.py +0 -0
  46. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/market_snapshots.py +0 -0
  47. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/outcome.py +0 -0
  48. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/parse_helpers.py +0 -0
  49. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/ingest/runner.py +0 -0
  50. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/__init__.py +0 -0
  51. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/assets.py +0 -0
  52. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/bazaar.py +0 -0
  53. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/contracts.py +0 -0
  54. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/handlers.py +0 -0
  55. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/http.py +0 -0
  56. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/payment_middleware.py +0 -0
  57. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/server.py +0 -0
  58. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/staleness.py +0 -0
  59. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/validation.py +0 -0
  60. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/x402_bazaar_dynamic.py +0 -0
  61. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/x402_config.py +0 -0
  62. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/x402_pricing.py +0 -0
  63. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/mcp/x402_stables.py +0 -0
  64. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/__init__.py +0 -0
  65. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/band.py +0 -0
  66. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/breadth.py +0 -0
  67. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/cf_math.py +0 -0
  68. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/cluster.py +0 -0
  69. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/cluster_config.py +0 -0
  70. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/comparison.py +0 -0
  71. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/context.py +0 -0
  72. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/delta.py +0 -0
  73. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/etf.py +0 -0
  74. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/fear_greed.py +0 -0
  75. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/macro.py +0 -0
  76. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/portfolio.py +0 -0
  77. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/rebalance.py +0 -0
  78. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/regime.py +0 -0
  79. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/sentiment.py +0 -0
  80. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/snapshots.py +0 -0
  81. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/rollup/tape.py +0 -0
  82. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/status_report.py +0 -0
  83. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/store/__init__.py +0 -0
  84. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/store/db.py +0 -0
  85. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/store/jsonutil.py +0 -0
  86. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/store/meta.py +0 -0
  87. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/store/retention.py +0 -0
  88. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/store/status.py +0 -0
  89. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/timeutil.py +0 -0
  90. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/x402_production_check.py +0 -0
  91. {alloc_context-0.1.0 → alloc_context-0.1.1}/alloccontext/x402_smoke_redact.py +0 -0
  92. {alloc_context-0.1.0 → alloc_context-0.1.1}/setup.cfg +0 -0
  93. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_adr005_ingest.py +0 -0
  94. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_backup_sqlite.py +0 -0
  95. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_bump_version.py +0 -0
  96. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_coinbase_portfolio.py +0 -0
  97. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_context_snapshots.py +0 -0
  98. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_db_schema.py +0 -0
  99. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_deploy.py +0 -0
  100. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_dev_stack.py +0 -0
  101. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_etf.py +0 -0
  102. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_exchanges_config.py +0 -0
  103. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_fear_greed.py +0 -0
  104. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_fred.py +0 -0
  105. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_horizon.py +0 -0
  106. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_ingest_outcome.py +0 -0
  107. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_ingest_runner.py +0 -0
  108. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_kalshi_api.py +0 -0
  109. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_kraken_portfolio.py +0 -0
  110. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_macro.py +0 -0
  111. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_market_breadth.py +0 -0
  112. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_assets_regime.py +0 -0
  113. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_bazaar.py +0 -0
  114. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_contracts.py +0 -0
  115. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_freshness.py +0 -0
  116. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_handlers.py +0 -0
  117. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_health.py +0 -0
  118. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_http_lifecycle.py +0 -0
  119. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_live_portfolio.py +0 -0
  120. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_server.py +0 -0
  121. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_validation.py +0 -0
  122. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_x402.py +0 -0
  123. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_x402_http.py +0 -0
  124. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_x402_pricing.py +0 -0
  125. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_mcp_x402_stables.py +0 -0
  126. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_qa_ingest_store.py +0 -0
  127. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_rebalance.py +0 -0
  128. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_rollup.py +0 -0
  129. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_scaffold.py +0 -0
  130. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_script_runtime.py +0 -0
  131. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_security_hardening.py +0 -0
  132. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_snapshots_and_delta.py +0 -0
  133. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_status_report.py +0 -0
  134. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_x402_bazaar_dynamic.py +0 -0
  135. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_x402_production_check.py +0 -0
  136. {alloc_context-0.1.0 → alloc_context-0.1.1}/tests/test_x402_smoke_redact.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alloc-context
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: AllocContext — BTC/ETH allocation context, drift, and rebalance facts
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/negillett/alloc-context
@@ -42,6 +42,8 @@ Dynamic: license-file
42
42
 
43
43
  # AllocContext
44
44
 
45
+ mcp-name: io.github.negillett/alloc-context
46
+
45
47
  **Allocation context for BTC/ETH** — drift, band checks, USD rebalance moves,
46
48
  and a fused market backdrop (Fear & Greed, Kalshi, ETF flows, macro) as
47
49
  deterministic JSON over MCP.
@@ -1,5 +1,7 @@
1
1
  # AllocContext
2
2
 
3
+ mcp-name: io.github.negillett/alloc-context
4
+
3
5
  **Allocation context for BTC/ETH** — drift, band checks, USD rebalance moves,
4
6
  and a fused market backdrop (Fear & Greed, Kalshi, ETF flows, macro) as
5
7
  deterministic JSON over MCP.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alloc-context
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: AllocContext — BTC/ETH allocation context, drift, and rebalance facts
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/negillett/alloc-context
@@ -42,6 +42,8 @@ Dynamic: license-file
42
42
 
43
43
  # AllocContext
44
44
 
45
+ mcp-name: io.github.negillett/alloc-context
46
+
45
47
  **Allocation context for BTC/ETH** — drift, band checks, USD rebalance moves,
46
48
  and a fused market backdrop (Fear & Greed, Kalshi, ETF flows, macro) as
47
49
  deterministic JSON over MCP.
@@ -125,6 +125,7 @@ tests/test_rollup.py
125
125
  tests/test_scaffold.py
126
126
  tests/test_script_runtime.py
127
127
  tests/test_security_hardening.py
128
+ tests/test_server_json.py
128
129
  tests/test_snapshots_and_delta.py
129
130
  tests/test_status_report.py
130
131
  tests/test_workflows.py
@@ -1,3 +1,3 @@
1
1
  """AllocContext — BTC/ETH allocation context and rebalance facts."""
2
2
 
3
- __version__ = "0.1.0"
3
+ __version__ = "0.1.1"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "alloc-context"
3
- version = "0.1.0"
3
+ version = "0.1.1"
4
4
  description = "AllocContext — BTC/ETH allocation context, drift, and rebalance facts"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -0,0 +1,35 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from pathlib import Path
5
+
6
+ REPO_ROOT = Path(__file__).resolve().parent.parent
7
+ SERVER_JSON = REPO_ROOT / "server.json"
8
+
9
+ # Official MCP Registry limit (see registry validation errors).
10
+ REGISTRY_DESCRIPTION_MAX_LEN = 100
11
+
12
+
13
+ def test_server_json_description_within_registry_limit():
14
+ data = json.loads(SERVER_JSON.read_text(encoding="utf-8"))
15
+ description = data["description"]
16
+ assert len(description) <= REGISTRY_DESCRIPTION_MAX_LEN, (
17
+ f"server.json description is {len(description)} chars; "
18
+ f"registry max is {REGISTRY_DESCRIPTION_MAX_LEN}"
19
+ )
20
+
21
+
22
+ def test_server_json_version_matches_pyproject():
23
+ import tomllib
24
+
25
+ py_ver = tomllib.loads(
26
+ (REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8")
27
+ )["project"]["version"]
28
+ data = json.loads(SERVER_JSON.read_text(encoding="utf-8"))
29
+ assert data["version"] == py_ver
30
+ assert data["packages"][0]["version"] == py_ver
31
+
32
+
33
+ def test_readme_includes_mcp_registry_name_for_pypi():
34
+ readme = (REPO_ROOT / "README.md").read_text(encoding="utf-8")
35
+ assert "mcp-name: io.github.negillett/alloc-context" in readme
@@ -72,11 +72,13 @@ def test_release_workflow_unified_pipeline():
72
72
  "prepare",
73
73
  "validate-version",
74
74
  "publish-pypi",
75
+ "publish-mcp-registry",
75
76
  "deploy",
76
77
  ]
77
78
 
78
79
  prepare_runs = [step.get("run", "") for step in _job_steps(workflow, "prepare")]
79
80
  assert any("scripts/bump_version.py" in run for run in prepare_runs)
81
+ assert any("release/v" in run and "git push" in run for run in prepare_runs)
80
82
 
81
83
  validate_runs = [
82
84
  step.get("run", "") for step in _job_steps(workflow, "validate-version")
@@ -98,5 +100,26 @@ def test_release_workflow_unified_pipeline():
98
100
  for step in publish_steps
99
101
  )
100
102
 
101
- finalize_runs = [step.get("run", "") for step in _job_steps(workflow, "finalize-tag")]
102
- assert any("git push origin" in run and "TAG" in run for run in finalize_runs)
103
+ registry = workflow["jobs"]["publish-mcp-registry"]
104
+ assert registry["needs"] in (
105
+ ["publish-pypi", "validate-version"],
106
+ ["validate-version", "publish-pypi"],
107
+ )
108
+ registry_runs = [
109
+ step.get("run", "") for step in _job_steps(workflow, "publish-mcp-registry")
110
+ ]
111
+ assert any("mcp-publisher publish" in run for run in registry_runs)
112
+
113
+ finalize = workflow["jobs"]["finalize-tag"]
114
+ assert "publish-mcp-registry" in finalize["needs"]
115
+
116
+ assert "sync-main" in workflow["jobs"]
117
+
118
+
119
+ def test_publish_mcp_registry_workflow_dispatch():
120
+ workflow = _load_workflow("publish-mcp-registry.yml")
121
+ on = _workflow_on(workflow)
122
+ assert "workflow_dispatch" in on
123
+ runs = [step.get("run", "") for step in _job_steps(workflow, "publish")]
124
+ assert any("install-mcp-publisher" in run for run in runs)
125
+ assert any("github-oidc" in run for run in runs)
File without changes
File without changes