Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
5db6624
docs(architecture): define model lifecycle intelligence
pacphi Aug 25, 2026
024d497
feat(models): add lifecycle evidence core
pacphi Aug 25, 2026
6bae4ab
feat(models): discover host model evidence
pacphi Aug 25, 2026
1b28ded
feat(models): expose lifecycle CLI and status
pacphi Aug 25, 2026
9b2b1a7
feat(dashboard): add model lifecycle evidence view
pacphi Aug 25, 2026
01a6067
fix(models): validate current lookup contracts
pacphi Aug 25, 2026
0b58da7
fix(models): enforce trustworthy lifecycle comparisons
pacphi Aug 25, 2026
dfeb577
fix(models): scope host status evidence
pacphi Aug 25, 2026
6bdf2cd
fix(models): preserve lifecycle evidence semantics
pacphi Aug 25, 2026
4efccf4
fix(dashboard): protect model lifecycle evidence
pacphi Aug 25, 2026
ed95c3b
fix(models): honor observed route evidence
pacphi Aug 25, 2026
6941918
fix(dashboard): retain controlled evidence metadata
pacphi Aug 25, 2026
975b932
fix(exec): honor bounded subprocess output
pacphi Aug 25, 2026
e043480
fix(models): harden atomic snapshot writes
pacphi Aug 25, 2026
527dc5e
fix(models): report bounded online contacts
pacphi Aug 25, 2026
deb0b28
docs(models): document lifecycle intelligence
pacphi Aug 25, 2026
8944d8d
docs(adr): record model lifecycle release proof
pacphi Aug 25, 2026
7dd753f
docs(adr): link model lifecycle implementation
pacphi Aug 25, 2026
5583743
fix(models): parse opencode verbose catalog metadata
pacphi Aug 25, 2026
639ad0b
feat(models): expose paged public catalog identity
pacphi Aug 25, 2026
dc814ff
feat(dashboard): add lazy sortable model inventory
pacphi Aug 25, 2026
b7e33a0
docs(models): explain public inventory controls
pacphi Aug 25, 2026
c214f6f
fix(models): harden catalog identity and paging
pacphi Aug 25, 2026
5209d7e
docs(models): document verified catalog identity
pacphi Aug 25, 2026
a545725
fix(models): complete OpenCode catalog discovery
pacphi Aug 25, 2026
4256cf8
fix(models): keep inventory snapshot coherent
pacphi Aug 25, 2026
9965a89
fix(models): close dashboard identity leaks
pacphi Aug 25, 2026
a83fd66
docs(models): record catalog hardening proof
pacphi Aug 25, 2026
674a698
docs(models): refresh exact-head coverage proof
pacphi Aug 25, 2026
1791a8b
fix(models): lead dashboard with operator routes
pacphi Aug 25, 2026
294f2f2
fix(models): show explicit route identity
pacphi Aug 25, 2026
371a7c1
fix(models): complete lifecycle operator experience
pacphi Aug 25, 2026
518c7ef
fix(models): humanize change history
pacphi Aug 25, 2026
eef2dc4
fix(models): preserve Ollama refresh deadlines
pacphi Aug 25, 2026
e6bf784
Merge branch 'main' into feat/110-model-lifecycle-intelligence
pacphi Aug 26, 2026
f417995
fix(dashboard): deduplicate model evidence summaries
pacphi Aug 26, 2026
ade8649
feat(models): enrich lifecycle evidence
pacphi Aug 26, 2026
d323f7c
fix(models): normalize Claude context selectors
pacphi Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions MAINTAINER.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ src/
admin-view.mjs # admin browser controller (embedded into the page; not node-imported)
browser.mjs # openInBrowser — shared by dashboard + admin
usage-index.mjs # canonical usage aggregation by host, provider, model, project, and category
model-inventory/ # model evidence contracts, source adapters, snapshots, diffs, impact, read models
npx.mjs # stale npx-cache detection/prune
mcp.mjs settings.mjs config.mjs paths.mjs statusline.mjs
rvf.mjs daemons.mjs exec.mjs output.mjs
Expand All @@ -78,6 +79,7 @@ tests/
docs/
HOST-SUPPORT.md # canonical host/Ruflo/AQE/Brain compatibility matrix (shipped)
INSTALLATION.md # package scope versus machine/user/project effects (shipped)
MODELS.md # model lifecycle inventory and read-only planning guide (shipped)
PROVIDERS.md # provider and routing guide (shipped)
SETUP.md # setup mutation contract (shipped)
TROUBLESHOOTING.md # symptom-to-fix runbook (shipped)
Expand All @@ -90,9 +92,11 @@ docs/

**Published tarball** = the `files` whitelist in `package.json`:
`bin/agentic-kit.mjs`, `src/`, `claude/`, `docs/HOST-SUPPORT.md`,
`docs/INSTALLATION.md`, `docs/PROVIDERS.md`, `docs/SETUP.md`,
`docs/TROUBLESHOOTING.md`, `docs/UPGRADING.md`, `docs/CODEX-STATUSLINE.md`, and
`docs/adr/0015-managed-codex-native-statusline.md`. Generated workspace state under
`docs/INSTALLATION.md`, `docs/MODELS.md`, `docs/PROVIDERS.md`, `docs/SETUP.md`,
`docs/TROUBLESHOOTING.md`, `docs/UPGRADING.md`, `docs/CODEX-STATUSLINE.md`,
`docs/adr/0015-managed-codex-native-statusline.md`,
`docs/adr/0032-model-lifecycle-intelligence.md`, and
`docs/ddd/model-lifecycle-intelligence.md`. Generated workspace state under
the shipped source trees is explicitly excluded. Nothing else ships — verify with
`npm pack --dry-run` before a release if you touch `files`.

Expand Down
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ ak system machine footprint: install size, runtime, storage, catalog, proj
[--deep] [--json]
ak usage inspect/refresh offline provider account analytics
status | refresh openrouter
ak models inspect model lifecycle evidence and swap impact
status | refresh | diff | explain | plan
ak host manage execution hosts, routing, and provider bindings
status | pick | refresh | off
ak run execute a host-neutral activity pipeline (including explicit OpenCode routes)
Expand All @@ -113,9 +115,10 @@ command always works.)
| ------ | -------------- |
| **setup** | Installs/updates ruflo + agentic-qe + the **agentdb** CLI globally (handling npm ≥11.17's `allow-scripts` so natives build; agentdb is pinned to ruflo's bundled version so the shared learning store stays coherent), installs the **RuvNet Brain** (an offline knowledge base over the rUv stack, powering the `search_ruvnet` MCP — a ~2 GB one-time download, prompted; skip with `--no-ruvnet-brain`), deploys the token-audit skill, merges the managed guidance blocks into the machine-wide guidance files (`~/.claude/CLAUDE.md`, plus `~/.codex/AGENTS.md` on codex machines), offers one-time MCP registration (user scope, with a tool-family picker), and — inside a repo — initializes the project: sanitized `ruflo init`, absolute memory-path pin, a **verified** store→disk write, statusline footer, and a background daemon with **local-only ($0) workers** (token-spending AI workers stay opt-in behind upstream's machine-wide budget). Project scope triggers on a `.git` entry in the current folder; without one it's skipped with a note. `--project` forces the same project setup in the current directory (e.g. a not-yet-`git init`-ed folder); it does not locate an ancestor repository. Project initialization runs `ruflo init --full --force` and can replace existing agent configuration, so read the [setup scope and project mutation contract](docs/SETUP.md) before using it on an existing project. `--minimal` skips it, `--yes` accepts all prompts (non-interactive), `--no-aqe` / `--no-ruvnet-brain` / `--no-security` disable those subsystems, and `--reconfigure` re-offers MCP registration. `--codex` enables + installs the Codex host during setup (ambidextrous dual-host mode; both hosts then run at once), and `--primary-host claude\|codex` picks which host leads (codex implies `--codex`). |
| **status** | Per-subsystem ✓/⚠/✗ (versions, the kit's own version, **ruvnet-brain** (present + release drift, or "not installed"), natives (agentdb copies **and** ruflo's own memory runtime — the one `npx ruflo memory` loads — load-tested for a native better-sqlite3, not just the agentdb dirs), **memory-pin** (warns when `CLAUDE_FLOW_DB_PATH` points off the live DB), security, learning, aqe/RVF, **agentdb** (CLI present + coherent with ruflo's bundled version, or a store-skew warning), MCP, **hosts** (claude/codex/opencode version + install method; the Claude/Codex **primary** marked and failed when absent), **providers** (host wiring + aqe fallback chain, or "drifted"/claude-only default), **routing** (the persisted activity host+model policy; only Claude/Codex routes project into AQE), daemons, guidance-file blocks (`~/.claude/CLAUDE.md`, project `AGENTS.md`, and `~/.codex/AGENTS.md` on codex machines), statusline), each drift row naming what `sync` would do about it — plus a **health-history** line that flags regressions since the last sync (learning shrank, native slots dropped, drift/security backslid). |
| **sync** | The one convergence verb: upgrades first when a new release exists, then re-heals everything an upgrade wipes, then re-checks and reports. Included in that heal: it **installs any enabled frontier host** (claude/codex/opencode) that's entirely absent — never touching an external (mise/brew/native) install — and **re-applies provider wiring** (the `ENABLE_*` host env, OpenCode's native configuration, the aqe fallback chain, and ruflo API providers) whenever it has drifted — and, on a dual-host project, **seeds/heals the Claude/Codex default routing policy** (materializing eligible routes into agentic-qe's `agentOverrides`, e.g. after an aqe upgrade first makes it eligible). It also **installs/repins the standalone `agentdb` CLI** to ruflo's bundled version (keeping the shared cognitive store coherent) and appends a **health-history snapshot** so `status` can flag regressions across syncs. It also **re-runs the RuvNet Brain installer** to pull the latest release when the on-disk KB has drifted (or installs it if absent, when enabled). It also **self-updates the kit**: when a newer `@pacphi/agentic-kit` exists it installs it as the *last* step (the new code applies from the next `ak` run, never mid-sync). Prerelease installs (`4.0.0-alpha.*`) track the `next` npm dist-tag as well as `latest`, so alphas see their successors; stable installs only ever follow `latest`. `--no-upgrade` skips the self-update along with the package upgrades. |
| **dashboard** | Opens an observation-only local web dashboard (`127.0.0.1:7431`, localhost-only, never detaches) with five primary areas: **About · Overview · Usage · Observability · System**. About is a plain-words directory of everything the kit installed and why (the same content as `ak about`); Overview covers readiness, hosts & routing, providers, runtime, and machine-wide intelligence; Usage turns local Claude/Codex/OpenCode transcripts into scorecards, limits, findings, and per-session detail; Observability follows live and historical agent activity with masked evidence; System reports what the stack occupies on the machine (the same data as `ak system`). Deep links are hierarchical (`#about`, `#overview/summary`, `#usage/<session-id>`, `#observability/live`, `#system/storage`). No dashboard action mutates agents or repositories; ruflo and agentic-qe stores are opt-in through repeatable `--live-source 'surface=path'`. The page is self-contained, offline-first, and protected by a per-session token. Full navigation, keyboard behavior, and per-view semantics: [Dashboard guide](docs/DASHBOARD.md) and [Observability guide](docs/OBSERVABILITY.md). **Auto-opens your browser** (`--no-open` for headless/SSH); `--port N` changes the port. Stop with Ctrl-C. (Also available as `ak x dashboard`.) |
| **sync** | The one convergence verb: upgrades first when a new release exists, then re-heals everything an upgrade wipes, then re-checks and reports. Included in that heal: it **installs any enabled frontier host** (claude/codex/opencode) that's entirely absent — never touching an external (mise/brew/native) install — and **re-applies provider wiring** (the `ENABLE_*` host env, OpenCode's native configuration, the aqe fallback chain, and ruflo API providers) whenever it has drifted — and, on a dual-host project, **seeds/heals the Claude/Codex default routing policy** (materializing eligible routes into agentic-qe's `agentOverrides`, e.g. after an aqe upgrade first makes it eligible). It also **installs/repins the standalone `agentdb` CLI** to ruflo's bundled version (keeping the shared cognitive store coherent) and appends a **health-history snapshot** so `status` can flag regressions across syncs. It also **re-runs the RuvNet Brain installer** to pull the latest release when the on-disk KB has drifted (or installs it if absent, when enabled). It also **self-updates the kit**: when a newer `@pacphi/agentic-kit` exists it installs it as the *last* step (the new code applies from the next `ak` run, never mid-sync). Prerelease installs (`4.0.0-alpha.*`) track the `next` npm dist-tag as well as `latest`, so alphas see their successors; stable installs only ever follow `latest`. `--no-upgrade` skips the self-update along with the package upgrades. Model refresh/diff/plan findings remain advisory: sync never contacts a model catalogue or applies a model plan. |
| **dashboard** | Opens an observation-only local web dashboard (`127.0.0.1:7431`, localhost-only, never detaches) with five primary areas: **About · Overview · Usage · Observability · System**. About is a plain-words directory of everything the kit installed and why (the same content as `ak about`); Overview covers readiness, hosts & routing, providers, runtime, and machine-wide intelligence; Usage turns local Claude/Codex/OpenCode transcripts into scorecards, limits, findings, per-session detail, and privacy-projected model lifecycle evidence. The Models inventory is lazy, paged, filterable, sortable, and internally scrollable; source-proven public catalogue names remain readable while private deployment identity stays keyed. Observability follows live and historical agent activity with masked evidence; System reports what the stack occupies on the machine (the same data as `ak system`). Deep links are hierarchical (`#about`, `#overview/summary`, `#usage/models`, `#usage/<session-id>`, `#observability/live`, `#system/storage`). No dashboard action mutates agents or repositories; ruflo and agentic-qe stores are opt-in through repeatable `--live-source 'surface=path'`. The page is self-contained, offline-first, and protected by a per-session token. Full navigation, keyboard behavior, and per-view semantics: [Dashboard guide](docs/DASHBOARD.md) and [Observability guide](docs/OBSERVABILITY.md). **Auto-opens your browser** (`--no-open` for headless/SSH); `--port N` changes the port. Stop with Ctrl-C. (Also available as `ak x dashboard`.) |
| **usage** | Reads provider-account analytics from local cache (`ak usage status`) or performs one explicit OpenRouter management-API refresh (`ak usage refresh openrouter`). Refresh requires `OPENROUTER_MANAGEMENT_KEY`, writes a credential-free mode-`0600` cache, and discards endpoint/user/key/session identifiers. `status` and dashboard reads make no network request. OpenRouter account rows have no grounded host/session/project correlation and are never merged into transcript totals. |
| **models** | Builds a private, host-scoped model inventory from Claude, Codex, OpenCode, Ollama, bounded local usage evidence, and a dated bundled record of Anthropic's public model/lifecycle facts. `status`, `diff`, `explain`, and `plan` are cache-only and read-only; `refresh --online` is the sole online-catalogue boundary. Public facts never imply account or OpenRouter routability. Swap plans enumerate routes plus Agentic QE/Ruflo consumers and print a copyable canonical action without executing it. The CLI exposes exact local evidence deliberately; the Dashboard exposes source-proven public catalogue identity and pseudonymizes private identifiers. See [Model lifecycle intelligence](docs/MODELS.md). |
| **admin** | Opens the **maintainer admin** (`127.0.0.1:7432`, localhost-only, foreground) — the project-telemetry sibling of `dashboard`, with the same dark/light visual theme and persisted theme preference: unique repo visitors and cloners (GitHub traffic API, needs a push-access token via `GITHUB_TOKEN`/`GH_TOKEN`/`gh auth token` — panels degrade honestly without one), contributors and watchers, npm download momentum (last 7d vs prior 7d, sparklines — shown as trend only, never an absolute reach number, since mirrors/CI inflate the raw count), latest CI run status and open Dependabot alerts, a **"since you last looked"** delta strip over a local baseline, open issues/PRs from others (oldest first), and external humans ranked by recency (bots excluded). Access is gated by a **per-session token** carried in the URL fragment and sent header-only; the page makes **zero external fetches** (the server proxies GitHub/npm; your credential never reaches the page or the payload). Where `dashboard` is offline-first, `admin` does deliberate GitHub/npm egress — that contract split is why they're siblings, not tabs. `--port N`, `--no-open`; Ctrl-C stops. (Also available as `ak x admin`.) |
| **about** | A plain-words directory of every component the kit installs and configures — one entry per component: what it is, what it does for you, where to read more, and an honest state chip read from the same detection `ak status` uses (the prose is authored with the release; the chip is the only runtime fact). `ak about [entry-id]` opens one entry; `--category` narrows to `hosts`, `engine-memory`, `quality`, `safety`, `knowledge`, `kit`, or `configured`; `--no-detect` skips state resolution for an instant editorial read; `--json` emits the directory with resolved chips. The dashboard's About area renders this identical directory. |
| **system** | What the stack occupies on your machine. The default read is the cheap tier: the live agent-process census, the files growing fastest between scans, and the last deep scan's figures carried forward with their date. `--deep` re-walks install trees, storage, the cross-host catalog, and every discovered project (minutes on a large machine), then persists the result; `--json` emits the same snapshot payload `/api/system` serves. The dashboard's System area renders this same data across its Summary, Advisory, Sessions, Storage, Runtime, Catalog, and Projects views. |
Expand Down
4 changes: 3 additions & 1 deletion bin/agentic-kit.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const PORCELAIN = Object.assign(Object.create(null), {
dashboard: () => import('../src/commands/x/dashboard.mjs'),
admin: () => import('../src/commands/x/admin.mjs'),
usage: () => import('../src/commands/usage.mjs'),
models: () => import('../src/commands/models.mjs'),
system: () => import('../src/commands/system.mjs'),
about: () => import('../src/commands/about.mjs'),
run: () => import('../src/commands/run.mjs'),
Expand Down Expand Up @@ -52,6 +53,7 @@ Usage (ak = alias of agentic-kit):
ak dashboard open the local web dashboard (localhost; auto-opens browser) [--port N] [--no-open]
ak admin maintainer-only telemetry admin (localhost; GitHub/npm egress) [--port N] [--no-open]
ak usage inspect/refresh offline provider analytics [status|refresh openrouter]
ak models inspect/refresh model lifecycle evidence [status|refresh|diff|explain|plan]
ak system what this stack occupies on your machine [--deep] [--json]
ak about what agentic-kit installs and configures, and why [--category N]
ak run execute a host-neutral activity pipeline [template "task"] [--dry-run]
Expand Down Expand Up @@ -177,7 +179,7 @@ async function main() {
// setup and host own complete mutation/reporting flows. Running the generic
// nudge after a declined trust preflight could write version-cache state and
// violate their "before any changes" boundary.
if (!values.json && !values['dry-run'] && !['sync', 'usage', 'setup', 'host', 'ruflo-mcp'].includes(cmd)) {
if (!values.json && !values['dry-run'] && !['sync', 'usage', 'models', 'setup', 'host', 'ruflo-mcp'].includes(cmd)) {
try {
const { driftReport } = await import('../src/lib/versions.mjs');
for (const r of await driftReport()) {
Expand Down
Loading
Loading