AXIS IDEVS Code extension that brings the AXIS charting IDE beside Pine / PYNE buffers — run orchestration, charts, results, and live sessions inside the editor.
Part of the HOOX open trading stack. Sister products: PYNE (Pine language tooling) and AXIS (charting PWA).
InstallFrom the VS Code Marketplace / Open VSX, search for AXIS IDE, or install a VSIX built from this repo:
The optional AXIS Trading Pack (
StatusThis is the 0.1.0 extension:
ActivationActivates on commands and when the workspace contains AXIS/Pine sources. Pine
globs intentionally match the PYNE language extension list: Commands
SecretStorage UX (
|
| Slot | Prefix / shape | Commands |
|---|---|---|
| Worker API key | /^pn_[a-f0-9]{48}$/ |
axis.secrets.setWorkerKey |
| Pro API key | pyn_ + 20–508 [A-Za-z0-9_-] |
axis.secrets.setProKey |
| Both | — | axis.secrets.clear (confirm; deletes Worker + Pro) |
- Set flows use
showInputBox({ password: true }); invalid input is rejected before store. - Empty input on a set command clears that slot.
- Status bar shows Worker/Pro set/missing only — never key material.
- Keys are never
contributes.configurationproperties (noaxis.worker.apiKey/axis.pro.apiKey). - Run / live paths read SecretStorage only.
Settings
| Setting | Default | Notes |
|---|---|---|
axis.telemetry.offline |
true |
Keep product telemetry off |
axis.engine.id |
server |
Pro /run only in this release |
axis.engine.endpoint |
http://127.0.0.1:5002 |
Pro base URL (no /run suffix); loopback unless remote allowed |
axis.engine.allowRemoteEndpoint |
false |
Opt-in before sending Bearer off-machine (application scope — workspace cannot enable) |
axis.engine.allowPyodide |
false |
Opt-in chart CSP widen for optional Pyodide calculator (wasm-unsafe-eval + worker-src blob:). Bars-in only; Wasm assets not shipped |
axis.chart.useMockBars |
false |
Opt-in mock/fixture bars for chart + run. Default false uses real history via datafeed |
axis.chart.historyBars |
1500 |
Default history window (clamped ≤20000) |
axis.datafeed.url |
http://127.0.0.1:5003 |
Local @hoox-sh/axis-datafeed base (GET /datafeed/ohlcv); remote needs axis.engine.allowRemoteEndpoint |
axis.worker.url |
https://worker.axis.hoox.sh |
Live ticket mint + WS upgrade origin |
axis.live.enabled |
true |
Disable to make axis.liveStart a no-op |
axis.plugins.allowUrlInstall |
false |
Allow remote plugin installs |
axis.mcp.stdio |
true |
Advertise the AXIS MCP stdio server |
axis.mcp.command |
"" |
Absolute path / command for the AXIS CLI (application scope) |
axis.mcp.allowNpx |
false |
Allow npx -y @hoox-sh/axis-cli fallback (application scope) |
Real history (default): start @hoox-sh/axis-datafeed on :5003. Chart
clears then paints fetched bars (chart.full seq above handshake); runs fail
clearly if fetch fails (no empty /run body, no silent mock). Set
axis.chart.useMockBars to true only for offline/fixture dogfood.
Secrets are not settings — use the axis.secrets.* commands above.
Webview CSP
Chart and Results/Strategy webviews share a paint-only CSP (host proxies network):
| Directive | Value |
|---|---|
default-src |
'none' |
script-src |
${webview.cspSource} (no inline script) |
style-src |
${webview.cspSource} 'unsafe-inline' |
img-src |
${webview.cspSource} data: blob: |
connect-src |
'none' |
When axis.engine.allowPyodide is enabled (default false), the chart
webview only adds 'wasm-unsafe-eval' to script-src and
worker-src blob: ${webview.cspSource}. Results/Strategy stay paint-only.
Pyodide remains a bars-in calculator stub (LOCAL_PYODIDE_VERSION = '0.29.5');
multi-MB Wasm is not packaged in the VSIX yet.
Full matrix vs the AXIS PWA and the Pyodide enable path: docs/csp-matrix.md. Do not change runtime CSP without updating that doc.
Develop
Requirements: Bun 1.4.4, Node 22 (esbuild / Vite / vsce
shell-outs), and VS Code ^1.95.0 for the electron suite.
bun install
bun run compile # host esbuild + all Vite webviews
bun run compile:webview # webviews only
bun run watch # host esbuild watch
bun run watch:webview # chart Vite watch
bun run check # tsc host + every webview
bun run test:unit # bun:test
bun run test:coverage # unit + lcov under coverage/
bun run test:coverage:gate # coverage + BASELINE/protocol ratchet
bun run test # @vscode/test-electron (needs PYNE VSIX)
bun run package # → axis-ide-<version>.vsix
bun run pack:package # → pack/axis-<version>.vsix
bun run verify # check + coverage gate
Build layout
| Artifact | Path | Notes |
|---|---|---|
| Extension host bundle | out/extension.js |
Produced by esbuild.host.mjs. Do not move the host entry to dist/. |
| Chart webview assets | dist/webview/chart/ |
Vite build (compile:webview:chart); CSP HTML is host-generated. |
| Results webview assets | dist/webview/results/ |
Shared Results/Strategy Vite bundle (compile:webview:results). |
| Studio webviews | dist/webview/<studio>/ |
One Vite config per activity-bar / panel studio. |
Electron tests
Electron tests need hoox-sh.pyne installed into the downloaded VS Code. By
default the harness globs pyne-vscode-*.vsix from a sibling pynescript /
pyne checkout. Override with
AXIS_IDE_PYNE_VSIX=/path/to/pyne-vscode-….vsix. In CI (CI /
GITHUB_ACTIONS), a missing or failed install hard-fails.
Repository layout
.
├── src/ # extension host (TypeScript)
├── webview/ # one Vite project per webview
├── media/ # icons, builtin catalog, activity art
├── scripts/ # coverage gate
├── docs/ # CSP matrix + design/plan notes
├── pack/ # hoox-sh.axis extension pack
├── fixtures/ # sample *.axis.json
├── .github/workflows/ # CI + release
└── out/ dist/ coverage/ # build output (gitignored)
CI / release
.github/workflows/ci.yml— Bun unit tests + coverage gate,@vscode/test-electronunder xvfb, VSIX packaging onmain/ tags / dispatch..github/workflows/release.yml— onv*tags: builds both VSIX files, attaches them to the GitHub Release, and publishes to the Marketplace / Open VSX whenVSCE_PAT/OVSX_PATare configured.- Maintainer publishing guide: PUBLISH.md.
License
GNU Affero General Public License version 3 only (SPDX:
AGPL-3.0-only). See LICENSE and NOTICE (lists
TradingView Lightweight Charts™ Apache-2.0 and other third-party
components). File headers must not say “or later”. Sister extension
hoox-sh.pyne remains AGPL-3.0-or-later — do not relicense it.
This extension was extracted from the AXIS monorepo
(hoox-sh/axis) with its commit history
preserved.