-
Notifications
You must be signed in to change notification settings - Fork 0
STACK
Mike Crowe edited this page Jul 2, 2026
·
5 revisions
Analysis Date: 2026-06-27
Primary:
- Python 3.12 — all host-side CLI logic in
src/harnessed/(launcher, assembler, schema parser, scan gate, capability test) - Bash — host bootstrap script;
catalog/base/harnessed-scanin-image scan runner
Secondary (in-image, managed by mise):
- Node.js 22 LTS — JS package manager (pnpm) + hatago hub + gemini/codex/omp harness CLIs
- Go 1.24 — in-image via mise; osv-scanner static binary uses Go toolchain at build
- Rust 1.87 — in-image via mise (available to recipes that need it)
- Bun 1.2 — in-image via mise (required by omp plugins; omp extensions are Bun-based)
Host Environment:
- Podman (rootless) ≥ 5.6, current 5.8.2 — the only required host dependency
- Rootless
podman.socket(unix:///run/user/$UID/podman/podman.sock) for Docker-out-of-Docker
In-image Runtime Manager:
- mise (mise-en-place, 2026.x rolling) — manages node, python, pnpm, bun, rust, go, fd, ripgrep, and extra-tools inside
harnessed-baseimage - Config:
catalog/base/Dockerfile.harnessed-base(themise use -glayer)
Package Manager:
- uv 0.11.8 (astral) — Python dep management +
uvxfor stdio MCP servers - Lockfile:
uv.lock(present, committed) - pnpm 11 — JS package management inside images; routes through mise's
npm.package_manager=pnpmhook
Core (Python CLI):
- Typer 0.12.x — CLI framework for
harnessedlauncher (src/harnessed/launcher.py) andharnessed-toolsassembler (src/harnessed/cli.py) - rich 14.x — terminal rendering for capability reports, build output, tables (
src/harnessed/report.py)
Testing:
- pytest 8.x — test runner; config in
pyproject.toml([tool.pytest.ini_options]) - pytest-cov — coverage reporting
Build:
- setuptools ≥ 68 — Python build backend (
pyproject.toml[build-system]) - Two entry points:
harnessed(launcher) andharnessed-tools(assembler only)
Critical Python:
-
ruamel.yaml 0.18.x— YAML parsing forrecipe.yaml,stack.yaml,service.yaml,agent.yaml(src/harnessed/schema.py) -
typer 0.12.x— CLI surface for both entry points -
rich 14.x— all terminal output -
pip-audit 2.10.1— Python supply-chain scan gate (credential-free; always-on baseline)
Dev:
-
pytest ≥ 8,pytest-cov— testing only; listed in[project.optional-dependencies]dev group
In-image (baked):
-
@himorishige/hatago-mcp-hub 0.0.16— MCP hub, installed viapnpm add -gincatalog/base/Dockerfile.hatago -
mcp-server-time 2026.6.4— tracer stdio MCP server, installed viauv tool installin hatago image -
osv-scanner(Google, V2 2.3.x) — image/source vulnerability scan; Go static binary, credential-free -
snyk— JS/Python supply-chain scan; installed viapnpm add -gincatalog/base/Dockerfile.harnessed-base; token-gated, warn-and-skip withoutSNYK_TOKEN -
mcp[cli](FastMCP) — used bycatalog/services/ping/Dockerfilefor the tracer shared service
Extra in-image CLI tools (via extra-tools.txt, installed by mise):
-
bat,eza,sd,dua,gping— modern CLI replacements -
jq,jless,glow,hexyl,yq— data processing -
lazygit— git TUI -
ast-grep,ruff,stylua,markdownlint-cli2— code tooling
Environment:
- No
.envfile; secrets are strictly env-at-launch or resolved via varlock + 1Password - Optional schema at
~/.config/harnessed/.env.schema(uses varlock DSL;@plugin(@varlock/1password-plugin@1.2.0)) - Example:
extra-tools.default.txtandextra-tools.txtcontrol which extra mise tools are baked into the image
Build:
-
pyproject.toml— Python project config, deps, entry points, pytest config -
uv.lock— Python lockfile -
pnpm-workspace.yaml— project-level JS supply-chain allowlist (allowBuilds: {snyk: true}) -
catalog/base/pnpm/config.yaml— global pnpm supply-chain policy baked into every image:-
minimumReleaseAge: 1440(1 day hold) minimumReleaseAgeStrict: trueblockExoticSubdeps: trueverifyStoreIntegrity: true-
strictDepBuilds: true(lifecycle default-deny)
-
- JSON schemas for manifest validation:
schemas/recipe.schema.json,schemas/stack.schema.json,schemas/service.schema.json,schemas/agent.schema.json - Nightly re-scan timer:
systemd/harnessed-rescan.timer+systemd/harnessed-rescan.service
ubuntu:24.04
└── harnessed-base (mise + node@22 + pnpm@11 + python@3.12 + bun@1.2 + rust@1.87 + go@1.24 + scanners)
├── harnessed-claude (curl claude.ai/install.sh)
├── harnessed-omp (mise: github:can1357/oh-my-pi; omp plugin install @drmikecrowe/omp-claude-hooks-bridge)
├── harnessed-opencode (curl opencode.ai/install; baked ~/.config/opencode/opencode.json)
├── harnessed-gemini (mise: npm:@google/gemini-cli; baked ~/.gemini/settings.json)
├── harnessed-codex (mise: npm:@openai/codex; baked ~/.codex/config.toml)
├── harnessed-antigravity (curl antigravity.google/cli/install.sh; baked ~/.gemini/config/mcp_config.json)
└── harnessed-hatago (pnpm: @himorishige/hatago-mcp-hub@0.0.16; uv: mcp-server-time; EXPOSE 3535)
python:3.12-slim
└── harnessed-ping (service image; pip install mcp[cli]; EXPOSE 8080)
Development (host):
- Podman ≥ 5.6 (rootless);
systemctl --user enable --now podman.socket;loginctl enable-linger $USER - Python 3.12 + uv (for running
harnessedandharnessed-toolson host)
Production/Run:
- Same as development — single-user local tooling
- All other dependencies (node, python runtimes, scanners) live inside images
Stack analysis: 2026-06-27
Start Here
Guides
- Recipe authoring
- Service authoring
- Stacks
- Extending stacks (proposed)
- Recipe catalog
- System prompt & rules (proposed)
- Secrets
- AWS SSO
- Pulumi (host login forwarding)
- Egress & exposing services
- Container filesystem
- Git hooks
- Troubleshooting
- Pin management (harnessed update)
Codebase Map
Planning & Roadmap
- open work: GitHub Issues
Research & Prompts
- research/ (home-folder requirements per harness, browse in-repo)
- prompts/ (reusable prompt templates, browse in-repo)