Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [],
"is_fork": true,
"size_kb": 10081,
"has_wiki": true,
"homepage": "https://thecompanion.sh",
"languages": {
"CSS": 23037,
"HTML": 2753,
"Shell": 16770,
"Makefile": 373,
"Dockerfile": 1356,
"JavaScript": 6576,
"TypeScript": 6785665
},
"pushed_at": "2026-07-19T08:09:08Z",
"created_at": "2026-04-20T02:03:48Z",
"owner_type": "User",
"updated_at": "2026-07-19T08:09:12Z",
"description": "Web & Mobile UI for Claude Code & Codex . Launch sessions, stream responses, approve tools. All from your browser / mobile",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript"
]
},
"owner": {
"blog": null,
"name": "Moritz",
"type": "User",
"login": "hellcoderGIT",
"company": null,
"location": null,
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/5343954?v=4",
"created_at": "2013-08-30T03:47:36Z",
"is_verified": null,
"public_repos": 3,
"account_age_days": 4712
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": false
},
"activity": {
"releases": [
{
"tag": "companion-v0.108.0",
"kind": "other",
"published_at": "2026-07-19T07:57:46Z"
},
{
"tag": "companion-v0.107.0",
"kind": "other",
"published_at": "2026-07-08T07:56:14Z"
},
{
"tag": "companion-v0.106.0",
"kind": "other",
"published_at": "2026-07-06T09:40:27Z"
},
{
"tag": "companion-v0.105.3",
"kind": "other",
"published_at": "2026-07-02T06:15:33Z"
},
{
"tag": "companion-v0.105.2",
"kind": "other",
"published_at": "2026-07-01T00:33:38Z"
},
{
"tag": "companion-v0.105.1",
"kind": "other",
"published_at": "2026-06-26T05:26:57Z"
},
{
"tag": "companion-v0.105.0",
"kind": "other",
"published_at": "2026-06-23T08:00:11Z"
},
{
"tag": "companion-v0.104.3",
"kind": "other",
"published_at": "2026-06-19T10:40:43Z"
},
{
"tag": "companion-v0.104.2",
"kind": "other",
"published_at": "2026-06-19T09:56:02Z"
},
{
"tag": "companion-v0.104.1",
"kind": "other",
"published_at": "2026-06-18T07:35:46Z"
},
{
"tag": "companion-v0.104.0",
"kind": "other",
"published_at": "2026-06-18T04:00:54Z"
},
{
"tag": "companion-v0.103.0",
"kind": "other",
"published_at": "2026-06-18T03:25:29Z"
},
{
"tag": "companion-v0.102.1",
"kind": "other",
"published_at": "2026-06-17T04:17:19Z"
},
{
"tag": "companion-v0.102.0",
"kind": "other",
"published_at": "2026-06-16T09:24:18Z"
},
{
"tag": "companion-v0.101.2",
"kind": "other",
"published_at": "2026-06-15T01:51:10Z"
},
{
"tag": "companion-v0.101.1",
"kind": "other",
"published_at": "2026-06-13T08:26:58Z"
},
{
"tag": "companion-v0.101.0",
"kind": "other",
"published_at": "2026-06-12T00:53:44Z"
},
{
"tag": "companion-v0.100.0",
"kind": "other",
"published_at": "2026-06-11T05:52:05Z"
},
{
"tag": "companion-v0.99.1",
"kind": "other",
"published_at": "2026-05-26T07:06:12Z"
},
{
"tag": "companion-v0.99.0",
"kind": "other",
"published_at": "2026-05-15T07:15:21Z"
},
{
"tag": "companion-v0.98.0",
"kind": "other",
"published_at": "2026-05-15T05:44:11Z"
},
{
"tag": "companion-v0.97.0",
"kind": "other",
"published_at": "2026-04-20T03:34:37Z"
},
{
"tag": "companion-v0.96.0",
"kind": "other",
"published_at": "2026-04-20T02:56:35Z"
}
],
"recent_commits": [
{
"oid": "9a11f0fa3b506ab9c0c107965c681417fd4d8d3b",
"body": "… path\n\nnpm@latest resolved to npm 12, which requires Node >= 22 and broke the\nTrusted Publishing upgrade step on the Node 20 runner. Also allows manually\ndispatching a publish when release-please has already tagged the release.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(publish): pin npm@11 and Node 22; add workflow_dispatch re-publish…",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-07-19T08:09:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e8c410a40457bcf492f9cd0a22a843ccc637b09e",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.108.0 (#63)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-19T07:57:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f983b4dccd45419cd6711bee368531c17c0622b4",
"body": "…(#62)\n\n* feat(dashboard): add project dashboard with nightly AI session summaries\n\nAdds an opt-in project dashboard that shows where every session stands:\n- Nightly summarizer job (croner) summarizes each Claude session transcript\n changed since the last run via the Anthropic API (Haiku 4.5 by def\n[…]\ne CLI availability instead.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(dashboard): project dashboard with nightly AI session summaries …",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-07-19T04:06:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9f18d7bc7ba5c8932e2615a3f0fc4ddc611158f9",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.107.0 (#61)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-08T07:56:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b270e2fb13d2c29e51a425c7853e5348c92554d",
"body": "Add `claude-sonnet-5` (Claude 5-family Sonnet) as a selectable Claude\nmodel and remove the now-superseded Sonnet 4.6 entry. Update the model\npicker tests (backends, ModelSwitcher, HomePage) accordingly.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(models): add Sonnet 5 to Claude model picker (#60)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-07-08T07:55:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1601ff9886e41e7e2ad395c251ace6643007eb10",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.106.0 (#59)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-06T09:40:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "903b01f92e6b8a537e652c737ea1b6eb97625602",
"body": "…ch (#58)\n\nThe proactive keepalive auto-relaunches a CLI process that exits with no\nbrowser attached, to keep long-running sessions (agents, cron) alive. Add a\nglobal setting (proactiveKeepaliveEnabled, default on) so operators can turn\nit off and let dead sessions stay dead while experimenting.\n\nsc\n[…]\nnager, the settings REST route (with boolean validation),\nand a toggle in Settings → General.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(settings): add kill-switch to disable proactive keepalive relaun…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-07-06T09:39:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "86a5a7315f6baace1812efeb88e622577a355a1b",
"body": "Scheduled agents used process liveness (isAlive) as the overlap guard, but\nthe stdio CLI stays alive after a turn until the session is archived — so\nisAlive was permanently true and every subsequent scheduled run was skipped\nuntil someone manually archived the open session.\n\nAdd a per-agent restartM\n[…]\nkip\" preserves the old wait-if-open\nbehavior. Manual/forced runs still bypass the skip guard.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(agents): terminate leftover session before scheduled runs (#57)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-07-06T09:38:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "50e8ea3f8601a1b3c1541662dd5dc265d9d47606",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.105.3 (#56)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-02T06:15:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e81f5cca3bd51243856a516e06d982f0a437409a",
"body": "… (#55)\n\nNon-image uploads to a Claude session are supposed to be written to\n<cwd>/.companion-uploads/ and referenced by relative path so Claude reads\nthem from disk with its Read tool. PDFs were exempt: they were inlined as\nbase64 `document` blocks and handed to Claude directly. That pushes the who\n[…]\nery other non-image file. Only images inline now,\nwhich matches the Codex adapter's behavior.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(claude-adapter): stage PDFs to disk instead of inlining to Claude…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-07-02T06:14:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b9a7e0f53b200430a161347ed784586345814d24",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.105.2 (#54)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-01T00:33:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "464c71f0511afccc385b25a2bdd342ccf90ab906",
"body": "…ean turn-end (#53)\n\nWhen the Claude CLI's stdout EOFs right after a turn-ending `result`, the\nprocess is shutting down cleanly but can take longer than the 2s grace to\nflush teardown (MCP servers, etc.) and exit code-0. The adapter was\nSIGTERM-ing it during that window, converting a code-0 exit int\n[…]\ncovery. The result grace stays\nbounded so a teardown deadlock after a result is still killed.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(claude-adapter): stop relaunch churn from premature SIGTERM on cl…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-07-01T00:29:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "88c45ae6528fb2b79c3129c3d1aed73d9a54a831",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.105.1 (#51)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-26T05:26:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "191e34274de2d2f801b61833d61509409d9ccc21",
"body": "…#52)\n\n* fix(codex): fetch model list live from app-server, drop stale cache\n\nRecent Codex releases (0.142.x, GPT-5.5) no longer write\n~/.codex/models_cache.json and serve their model catalog over the\napp-server `model/list` RPC instead. The companion's model picker read\nthe now-missing cache file, \n[…]\n to satisfy the 80% gate.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(codex): fetch model list live from app-server, drop stale cache (…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-26T05:26:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "10d7236f3c5818e486a5d690e8ebf07b25d50043",
"body": "Up to ~10 minutes of silence is normal for long-running agents (builds,\nlarge web fetches, subagents), so warning at 7 minutes fired too eagerly.\nRaise ACTIVITY_STALLED_MS from 7 to 15 minutes and add a regression test\nasserting 10 minutes still reads as \"quiet\" rather than \"may be stuck\".\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(feed): raise \"may be stuck\" warning to 15min (#50)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-24T13:51:49Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2b64152d87fccc086f2694179c28dec398120769",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.105.0 (#49)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-23T08:00:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "280fa4c64d7c214f4e2998e381cb07c6b4e42ae0",
"body": "Add an effort dropdown next to the model selector so a session can be\nlaunched at a specific reasoning effort (Low / Medium / High / xHigh /\nMax), mapped to the Claude Code CLI's --effort flag. The default option\npasses no flag, so the model keeps its own built-in default effort.\n\n- Claude-only: Cod\n[…]\nionStream -> CreateSessionRequest -> launcher,\n which adds `--effort <level>` only when non-empty and preserves it\n across --resume relaunch.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(home): add reasoning-effort selector to the new-session screen",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-06-22T03:02:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d720c0a8e1beb90855c8775303e0e6801864b2a4",
"body": "Replay an in-flight user turn after a --resume relaunch so a CLI death\nmid-turn no longer leaves the session waiting forever; detect auth\nfailures and skip auto-relaunch (which only loops back into the same\nexpired credentials) in favour of a re-login affordance; and re-queue\nmessages that hit a dyi\n[…]\nead pipe.\n- Surface an auth failure as a single re-login banner (drop the duplicate\n auth_status bubble that stacked the same guidance twice).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(cli): recover sessions that hang after CLI death or auth failure",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-06-22T03:02:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2961437fea9a65bccdfccb162ccf9c2fc4c5b8d3",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.104.3 (#47)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-19T10:40:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0143a8187bc115b7a92143d80db46d6e94e77582",
"body": "…#46)\n\nThe stdio adapter killed any CLI whose stdout EOF'd while the process was\nstill alive. But the CLI routinely closes stdout a beat *before* it exits\ncleanly (e.g. right after a `result`), so this converted a code-0 exit into a\nSIGTERM (143) and forced a needless --resume relaunch — churning he\n[…]\n wedged processes (e.g. stopped emitting after a 429)\nwhile no longer clobbering clean exits.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(adapter): grace period before killing a CLI whose stdout closed (…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-19T10:39:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "484509dc6b195d07c4bc2376b060f79e360e9f27",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.104.2 (#45)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-19T09:55:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "edae64b586427e80a921003e854c759f4bb84d08",
"body": "…(#44)\n\n* fix(session): cap auto-relaunch with a rolling window to stop invisible crash loops\n\nThe per-attempt budget (MAX_AUTO_RELAUNCHES) only catches *fast* re-crashes.\nA session that crashes every minute or two stays connected just long enough\n(> HEALTHY_UPTIME_MS) for scheduleHealthyReset to wi\n[…]\n and the Playground mock.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: stop invisible CLI relaunch loops and delay stuck warning to 7m …",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-19T09:49:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2ec188a248a5505938e4ebb318c455730d83d184",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.104.1 (#43)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-18T07:35:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8af18671e5190c3693a865bb0e55f31e30b93f26",
"body": "…uck-session diagnostics (#42)\n\nWhen a turn is interrupted mid-stream (CLI crash/relaunch/disconnect/reconnect),\nthe client cleared sessionStatus and the composer spinner but left the in-flight\nisStreaming draft message in the feed. With no \"Generating\" bar (gated on\nsessionStatus === \"running\") and\n[…]\nices in the chat, and\nstructured logs (browser + Companion server) for the next error search.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(session): clear orphaned streaming draft on interruption + add st…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-18T07:09:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d39343037dea48a8eecc617ad8e63c4a14fba348",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.104.0 (#40)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-18T04:00:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c84217ad0173229d4e450f7904510e89640a9ca",
"body": "Surfaces host memory usage so an approaching out-of-memory condition is\nvisible at a glance (we hit OOM on another server and it was hard to spot).\n\n- New GET /api/system/memory endpoint. On Linux it reads /proc/meminfo and\n uses MemAvailable (accounts for reclaimable cache → real OOM headroom),\n \n[…]\nored red >80% / amber >50%). Polls once a\n minute — cheap and slow-moving. Backend-agnostic.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(panel): add server memory usage meter to the side panel (#41)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-18T04:00:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0e79d7f104e55a6626284000599eb57a42a6a4fb",
"body": "… (#39)\n\nReplaces the auto-derived initials with the intended behaviour:\n\n- The session prefix is the user's own initials, typed by them. Placeholder\n is \"e.g. MA\" (no longer \"billing\"); it is not derived from the name.\n- \"Your name\" stays first-name only (placeholder \"e.g. Moritz\").\n- When no pref\n[…]\nthe auto-generated name, so\n the session is named \"{prefix}_{topic}\" (e.g. \"MA_InvoicePdf\").\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(home): refine session naming — typed prefix, name fallback, topic…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-18T03:49:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b2e038144e51ba8e77e29fb5e645e9cc2c2ef9f2",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.103.0 (#37)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-18T03:25:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c76442a4d0cd169ff865ee4062242dea21e2e2f1",
"body": "…topic (#38)\n\nTwo small new-session naming improvements:\n\n- The session prefix now defaults to the user's initials (e.g. \"Moritz\n Aschoff\" -> \"MA\") instead of the \"billing\" example placeholder. When no\n prefix is explicitly set, the initials are used so sessions are tagged\n with who created them.\n[…]\nrefix}_{topic}\" (e.g. \"MA_InvoicePdf\"). Empty topic falls back to the\n existing random name.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(home): default session prefix to user initials and add optional …",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-18T03:24:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6929c50f45c7507060a71f5928a8a6dde5dcb189",
"body": "…#36)\n\nThe working indicator was gated solely on sessionStatus === \"running\",\nwhich only flipped reliably after a full assistant message or a\nsession_phase event — neither covers the initial pre-first-token wait or\nevery streaming flow. As a result the indicator was often missing, and\nthere was no w\n[…]\ndex (both emit tool_progress + message flow).\nAdds Playground states and tests for all tiers.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(session): make \"Generating\" indicator reliable and stall-aware (…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-18T03:03:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "47cd6bc1b049628c5d34bb8d5fd7c9e1c2887f1a",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.102.1 (#35)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-17T04:17:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c720db6ea3a1e21fac695bc9f1517fbffb81faad",
"body": "…m image (#34)\n\nThe sandbox/container feature relied on the upstream, no-longer-maintained\ndocker.io/stangirard/the-companion image (run privileged). To avoid pulling or\nrunning an unmaintained image, sandbox support is now DISABLED by default behind\na feature flag. The code is kept intact so we can\n[…]\n\" notice (no pulls).\n\nRe-enable with COMPANION_SANDBOX_ENABLED=1 + VITE_SANDBOX_ENABLED=true.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(sandbox): disable sandbox behind a flag; stop using the upstrea…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-17T04:15:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "62b14e82a03ec7131a0b6b2777e6c77043bc4a92",
"body": "… name saved (#33)\n\nThe Context panel (where identity is normally edited) only exists inside an\nopen session, so a fresh browser had no way to set a name. Surface the\nname/prefix inputs on the new-conversation screen when no name is saved yet,\nand make the name mandatory in that case. Once a name is\n[…]\nen hides the inputs again and reuses the saved value (still editable from\nthe Context panel).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(session): show identity inputs on new-conversation screen when no…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-17T04:13:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1b57e0b7694864da3f5ed9a2812e37e71c664340",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.102.0 (#31)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-16T09:24:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dcfb68fb85fd9614d8778bfccfb7d2ad3cf0cf7e",
"body": "…ptional (#32)\n\nThe name/prefix rarely change, so the prominent new-session form was the\nwrong home for them. Move the inputs into the Context panel (TaskPanel) as\na new \"Identity\" section, and stop requiring a name to start a session.\n\n- New IdentitySection in TaskPanel with name + prefix inputs, p\n[…]\nsage, prefix applied to the session name) when present.\n- Both fields are now fully optional.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(session): move identity inputs to Context panel, make name o…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-16T09:22:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7025b263ce8e6d038861b8793cffc5565955c0ca",
"body": "…r (#30)\n\nRequire a name before creating a session and allow an optional session\nprefix. The name is injected into the initial message as \"[Name]: ...\"\nso the agent knows who it's talking to, and the prefix is applied to the\ngenerated session name as \"{prefix}_{Generated Name}\".\n\n- userName threads \n[…]\nult) and \"No user data\" options; only shown once\n sessions carrying a user name have loaded.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(session): add user identity, name prefix, and sidebar user filte…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-15T08:52:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9d828d9bba5f4b34f16f11679187595c087bc0af",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.101.2 (#29)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-15T01:50:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ecc9d071844d43f522b8d8e25d3033411a75f969",
"body": "The CLI's AskUserQuestion handler looks each answer up by the question's\nfull text, but the UI keyed the answers object by question index (\"0\").\nThe lookup missed, so the CLI returned an empty result (\"User has answered\nyour questions: .\") and the model never saw the choice — it just guessed.\n\nMap i\n[…]\n keys before sending. This was\ntransport-independent (broken under both --sdk-url and stdio).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(permission): key AskUserQuestion answers by question text (#28)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-15T01:49:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "485e510a709556174dd154fc2b6766633aff8318",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.101.1 (#27)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-13T08:26:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58af44d2634d2edb981144fab48a200f970be022",
"body": "…me (#26)\n\nGate the auto-relaunch crash budget on real uptime instead of spawn success, so a session whose CLI keeps dying right after --resume stops looping after MAX_AUTO_RELAUNCHES and surfaces a clear in-chat message. Adds regression tests.",
"is_bot": false,
"headline": "fix(orchestrator): stop infinite crash-relaunch loop on poisoned resu…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-13T08:25:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "caa3049520c42c34c878de0b68418dcbc476714d",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.101.0 (#25)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-12T00:53:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "915ae6b7ae2186886e620e59f5903ecbc69a6228",
"body": "Adds an Export button in the session header (TopBar) with a dropdown offering:\n- Download as HTML — self-contained file with images embedded inline as data:\n URIs (thinking blocks collapsible, tool calls + results rendered).\n- Download as Text — plain transcript; images become\n `[image: <type>, ~N\n[…]\nname),\nExportMenu (render + axe + interactions + error path), api.exportSession.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(session): add session export to HTML or text (#24)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-12T00:52:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "62f315f0a11f63944d02650687ce0fd7bc562e9c",
"body": "The Claude stdio (stream-json) adapter flipped `stdioConnected = false` on\ntransport loss but never fired its disconnect callback — unlike the WebSocket\npath (`detachWebSocket`) and the CodexAdapter (`proc.exited` →\n`cleanupAndDisconnect`). As a result the bridge kept believing the backend was\nattac\n[…]\nats on `cli_disconnected` so the spinner\n stops and the reconnect banner shows.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(claude): recover stuck stdio sessions when the transport dies (#23)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-12T00:52:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fc6fbdf05eee9e79ba35521b196ebded9654968e",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.100.0 (#20)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-11T05:51:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3590f0e7005877cba89e234bf2bf6efc1edcec1f",
"body": "After the stdio stream-json migration the companion no longer uses --sdk-url,\nso the 2.1.121/2.1.170 lockdowns can't affect sessions. The ClaudeCompatBanner\nwas still firing on any 2.1.121+ binary (\"rejects local --sdk-url — sessions\nwill fail until you pin or patch\"), which is now false and mislead\n[…]\naude-patcher,\nclaude-tls, cli-ingress-server, and the legacy --sdk-url WS path).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(claude): remove obsolete --sdk-url compatibility banner (#22)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-11T05:50:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8008b9f4250f252691ee6985044d30b6c1cd8ee2",
"body": "…l (#21)\n\n* feat(claude): drive Claude over stdio stream-json instead of --sdk-url\n\nThe `--sdk-url` WebSocket bridge is built on an undocumented, internal\nRemote-Control flag that Anthropic progressively locked down: 2.1.121 added a\nhostname allowlist (localhost rejected) and 2.1.170 made worker-reg\n[…]\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(claude): drive Claude over stdio stream-json instead of --sdk-ur…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-11T05:32:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5d5d2f34f620fee60fec674cd799666f1e065388",
"body": "… list (#19)\n\n- claude-opus-4-8 becomes the new default (replaces 4.7 at the top of CLAUDE_MODELS)\n- claude-fable-5 added with ★ icon to mark the new Mythos-class tier; not the default since its safeguards route ~5% of sessions back to Opus 4.8\n- Updated the affected default-model assertions in back\n[…]\ndel ID claude-opus-4-8).\"\n claude-fable-5 → \"I'm Claude Fable 5 (model ID claude-fable-5).\"\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(models): add Opus 4.8 and Fable 5 (Mythos-class) to Claude model…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-06-10T10:55:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3449f1bf46268d3992e1f35c38eb454c8aa492f0",
"body": "Replaces the long-lived NPM_PUBLISH_TOKEN secret with GitHub OIDC.\nThe runner mints a short-lived id-token that npm verifies against the\ntrusted-publisher config registered on @hellcoder/companion. No more\ntoken rotation, no EOTP failures from 2FA-protected publish tokens.\n\n- Adds permissions: id-to\n[…]\nww.npmjs.com/package/@hellcoder/companion/access\n(done out-of-band before this PR is merged).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: switch npm publish to Trusted Publishing (OIDC) (#18)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-26T07:19:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a5ca89224ca884f8e6ee4e232e23c1884792702d",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.99.1 (#17)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-05-26T07:06:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bea346e2118abe8f1494f33ef9a5c2426d60fe29",
"body": "…rade (#16)\n\n* fix(session-store): default to ~/.companion/sessions, never /tmp\n\n0.99.0 switched the default session directory to $TMPDIR/vibe-sessions,\nwhich on most Linux hosts is /tmp — wiped on every reboot and not\ndiscoverable to anyone with an existing ~/.companion/ corpus.\n\nDefaults to join(C\n[…]\na separate justification.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: restore ~/.companion/sessions default and drop root bypass downg…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-26T07:05:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "07cba316a3b0f48bc1fd1bedd20224d7b2218038",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.99.0 (#14)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-05-15T07:14:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6294bbe0f1cae2a059528dfa5d19e331483fe899",
"body": "…nk resolution (#15)\n\nThree follow-ups to feat(claude-compat) (#13):\n\n1. detectPatched now streams the full binary instead of slicing the first\n 32 MiB. In observed Claude 2.1.142 builds the marker sits at ~166 MB\n and ~217 MB out of 232 MB, so the previous head-of-file slice always\n reported \n[…]\n FALSE in 378 ms\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(claude-compat): detect patched binary anywhere in file, fix symli…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-15T07:08:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "15d15e5fed0bf4f843fff71c433cccc2ff657ce3",
"body": "…m UI (#13)\n\nClaude Code CLI 2.1.121 (~2026-04-27) added a static hostname allowlist to\n--sdk-url that rejects every non-Anthropic host (validator YR4, set KU5).\nStock 2.1.121+ binaries make every spawned companion session exit immediately\nwith \"host 127.0.0.1 is not an approved Anthropic endpoint\" \n[…]\nal dependencies.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(claude-compat): detect 2.1.121+ lockdown and offer pin/patch fro…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-15T06:40:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8e92f12d324d2c82673c7a94c2f8e42af8e051ef",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release companion 0.98.0 (#8)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-05-15T05:44:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8cac0884aff7cfd982370feb2e21e82bbae54ed3",
"body": "…off bridge mode (#655) (#12)\n\nClaude Code v1.2.1+ rejects the literal hostname \"localhost\" in --sdk-url\nas a cross-site WebSocket hijacking hardening measure, breaking spawned\nCLI sessions. This change:\n\n* Switches the non-containerized branch in spawnCLI to ws://127.0.0.1\n to bypass the string-ma\n[…]\nh settings-manager, settings-routes, api.ts and a new row\nin the General tab of SettingsPage.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(cli-launcher): use 127.0.0.1 in --sdk-url; add optional JSON-hand…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-15T04:22:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0f40433288e7e3628a5312e76e430d574837fe51",
"body": "…or queued messages (#11)\n\nNon-image attachments are staged to <cwd>/.companion-uploads/ so the model\ncan Read them. This relied on sessionCwd being populated from system_init,\nbut system_init only arrives after the CLI WebSocket connects. User\nmessages sent before that point (very common: the bridg\n[…]\nually written to\n disk under <cwd>/.companion-uploads/ when cwd is provided at construction.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(attachments): pass cwd at adapter construction so staging works f…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-10T14:29:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bc75eae8002b5180ba545484bb45dd8929b8b8c7",
"body": "CI's jscpd@latest reports a higher duplication score than locally\n(1.6% vs 1.28% on the same SHA), so:\n\n- Extract IconToolbarButton + SaveAsPromptIcon and shared\n openSavePromptModal helper, eliminating the remaining mobile/desktop\n duplication of the Save-as-prompt and Attach-file buttons\n- Pin j\n[…]\nplication from 1.6% (CI failure) to 1.2% locally and removes\nall flagged Composer.tsx clones.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(composer): extract more shared toolbar buttons; pin jscpd (#10)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-10T11:20:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a28c1043ae5905bd84fa006e36881092e7ad6716",
"body": "…DRY guard (#9)\n\nThe mobile and desktop toolbar layouts each duplicated the mode-toggle\nand send/stop buttons, pushing the jscpd duplication score over the\n1.5% threshold (CI was failing at 1.69%). Extracting these into small\nhelper components drops the score to 1.28% with no behavior change.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(composer): extract ModeToggleButton/SendOrStopButton to fix …",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-10T11:09:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8b1140ec099e1e05a1418feabbf328558b52753f",
"body": "Replaces the image-only upload flow with a generic attachment pipeline\nso users can drag-drop, paste, or pick any file. Images and PDFs are\nembedded inline as Claude content blocks; everything else is staged\nto <cwd>/.companion-uploads/ so Claude's Read tool can access it.\n\nAdds server-side validati\n[…]\nze (25MB/file, 100MB/message) and\nbase64 well-formedness, since clients can lie about either.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(attachments): support uploading any file type, not just images (#7)",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-05-10T10:54:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6e9b64e21124aaaf088023471e4e3cbb14214af7",
"body": "docs(moritz): add server-migration runbook",
"is_bot": false,
"headline": "Merge pull request #6 from hellcoderGIT/docs/moritz-edition-migration",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-04-20T06:08:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ebdafcae7abf7c605204824fe098f5bf19cf01b",
"body": "Operational runbook for cutting an existing the-companion install over to\n@hellcoder/companion without losing ~/.companion state. Self-contained so\nit can be handed verbatim to an agent on a target server.\n\nLives at the top of docs/ rather than inside the Mintlify nav tree\n(docs.json) because it's internal ops guidance, not user-facing product\ndocs — Mintlify ignores stray .md files not listed in docs.json.",
"is_bot": false,
"headline": "docs(moritz): add server-migration runbook",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-04-20T06:08:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "684fe6013c1c6cee3ae8ebba79d47f7f3fc6b24a",
"body": "…n--components--companion\n\nchore(main): release companion 0.97.0",
"is_bot": false,
"headline": "Merge pull request #5 from hellcoderGIT/release-please--branches--mai…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-04-20T03:34:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ef014d3bfec256a3c8fff6f3463496d16cb44c7b",
"body": null,
"is_bot": true,
"headline": "chore(main): release companion 0.97.0",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-04-20T03:32:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00d0601a8a53ed77f65459084de064fa9eeb48a7",
"body": "feat(ui): copy-to-clipboard button on code and tool-output blocks",
"is_bot": false,
"headline": "Merge pull request #4 from hellcoderGIT/feat/copy-code-button",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-04-20T03:32:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c38495df6ddbc158b970973737f008b398ba83a",
"body": "Addresses a long-standing selection-reset problem: when the assistant or a\ntool is streaming, React swaps the <pre> subtree on each new token, which\nwipes any text selection the user had made. The workaround was to pause or\nscroll to stop streaming before copying — awkward. A dedicated copy button\ns\n[…]\npyButton.test.tsx (7 cases covering render/click/success/\nfail/aria/axe) and three new assertions in MessageBubble.test.tsx that\nverify the button appears on each surface. Full suite 4952 / 4952 pass.",
"is_bot": false,
"headline": "feat(ui): add copy-to-clipboard button on code and tool-output blocks",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-04-20T03:31:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ab2759cba6ee58cdde44415056b94275f610588e",
"body": "…n--components--companion\n\nchore(main): release companion 0.96.0",
"is_bot": false,
"headline": "Merge pull request #2 from hellcoderGIT/release-please--branches--mai…",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-04-20T02:56:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "26b3d44a9476042e59d17bf5d74dcded5b0c786c",
"body": null,
"is_bot": true,
"headline": "chore(main): release companion 0.96.0",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-04-20T02:56:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ccc9c0d6c1f0d526d5ca1134241cd2656d2ad637",
"body": "feat(models): add Claude Opus 4.7 and Codex GPT-5.3 xHigh/Max",
"is_bot": false,
"headline": "Merge pull request #3 from hellcoderGIT/feat/opus-4-7-and-xhigh-max",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-04-20T02:54:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5aa41ea2b4483986b601b478f0e4c212aea5d1b9",
"body": "Add the newest Anthropic and OpenAI reasoning tiers as selectable models:\n\n- CLAUDE_MODELS: insert claude-opus-4-7 (\"Opus 4.7\") at the top so it\n becomes the default for new Claude sessions. 4.6, Sonnet 4.6 and\n Haiku 4.5 remain available.\n- CODEX_MODELS: insert gpt-5.3-codex-max (\"GPT-5.3 Max\") a\n[…]\n-7.\n- ModelSwitcher.test.tsx: the lone /Opus/ regex now matches two options\n (4.7 and 4.6), so tests that needed a single match are tightened to\n /Opus 4\\.6/ or /Opus 4\\.7/.\n\n4942 / 4942 tests pass.",
"is_bot": false,
"headline": "feat(models): add Claude Opus 4.7 and Codex GPT-5.3 xHigh/Max variants",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-04-20T02:54:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e1a11e4617419190e9ecfdf4cd01174a4caa9c5a",
"body": "feat(fork): Moritz Edition branding + own npm release channel",
"is_bot": false,
"headline": "Merge pull request #1 from hellcoderGIT/feat/moritz-edition",
"author_name": "Moritz",
"author_login": "hellcoderGIT",
"committed_at": "2026-04-20T02:28:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db54769c042a35327aa2c8848785d1c6316cbff4",
"body": "The existing publish.yml and preview.yml pushed docker images to\nstangirard/the-companion on Docker Hub — that's upstream's registry, not\nours, and we have no credentials for it. The auto-updater in the app only\npolls npm, so npm publishing is the only piece of the release pipeline\nthis fork actuall\n[…]\ner\n- delete docker.yml and docker-server.yml (standalone image builders; we\n can add our own under ghcr.io/hellcoderGIT later if we want)\n\nPrereq: NPM_PUBLISH_TOKEN repo secret is already configured.",
"is_bot": false,
"headline": "ci: drop upstream Docker Hub publishing, keep npm release pipeline",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-04-20T02:25:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "46627a6e2d4e32b775780b0180a4f614e08fd715",
"body": "Make the fork visually distinguishable from upstream so we can tell at a\nglance which build is running. Adds a small \"Moritz Edition\" pill next to\nthe \"The Companion\" wordmark on the home page and an \"ME\" pill on the\nsidebar, both using the existing cc-primary brand color. Also updates the\n<title>, \n[…]\nile-web-app-title meta, and PWA manifest name.\n\nExisting component tests still assert on \"The Companion\" text and alt\nattribute; both are preserved, so all 154 HomePage/Sidebar tests continue\nto pass.",
"is_bot": false,
"headline": "feat(ui): add Moritz Edition badge to wordmark",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-04-20T02:25:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b1cd299dc767814fe5be1a5222a5dff1171c2480",
"body": "…updater\n\nSwitch the npm package name from the-companion to @hellcoder/companion so our\nfork can publish its own releases without colliding with upstream. The update\nchecker now polls the scoped package on npm, and the in-app Update & restart\nbutton installs from our package. Bin names (the-companio\n[…]\n-routes.ts: bun install -g uses the new name\n- release-please-config.json: package-name updated to match\n- tests updated accordingly (55 tests passing in the two touched files,\n 4939 passing overall)",
"is_bot": false,
"headline": "feat(fork): rename package to @hellcoder/companion and retarget auto-…",
"author_name": "MoeClaudeUI",
"author_login": null,
"committed_at": "2026-04-20T02:25:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "52883144858f62d6f9b418c00432279f28d119d4",
"body": "## Summary\n- expand the saved prompt editor into a wider split-layout workspace\n- give the content editor substantially more room for long prompt\nauthoring\n- improve scope and storage sections so metadata stays readable while\nediting\n\n## Why\n- the previous inline form was too cramped for longer reus\n[…]\npre-commit hook: cd web && bun run typecheck && bun run test --\n--coverage\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(prompts): expand prompt editor workspace (#640)",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-04-02T18:39:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4c9dbab91094d0d83a04c79681e6e153d7f17652",
"body": "… (#639)\n\n## Summary\n- When the CLI exits plan mode autonomously (after ExitPlanMode tool\napproval), it reports the new `permissionMode` in its `system.status`\nmessage\n- The server was updating internal state but **never broadcasting** a\n`session_update` to connected browsers\n- This left the browser\n[…]\nunchanged (avoids\nunnecessary chatter)\n- Typecheck passes (`tsc --noEmit`)\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ws-bridge): broadcast permissionMode changes from CLI to browsers…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-04-02T06:06:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "abdfb4bc7e096e810bde30b3cac844ceb2d8f469",
"body": "…nd tasks (#638)\n\n## Summary\n- Adds a floating **ActivityTray** component (pill + expandable panel)\nthat shows background agent status and task progress within a session\n- Detects `Agent` tool_use with `run_in_background: true` in the\nWebSocket stream and tracks lifecycle in the store\n- First step t\n[…]\naxe a11y\n- All 4936 existing tests continue to pass\n\n## Review provenance\n- Implemented by AI agent (Claude Opus 4.6)\n- Human review: pending\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ui): add ActivityTray floating component for background agents a…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-04-01T18:29:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e0c242dd1b0c94ff5ddbf3f8e7e706ce6d5cd506",
"body": "…otocol drift warnings (#637)\n\n## Summary\n- Handle 10 previously unhandled Codex JSON-RPC notification methods\nthat were triggering false \"protocol drift\" warnings in the UI\n- Bare `\"error\"` notifications (transient stream disconnections like\n\"Reconnecting... 2/5\") are now handled gracefully — logge\n[…]\n\n- All 4915 tests pass, typecheck clean\n\n## Review provenance\n- Investigated and implemented by AI agent (Claude Opus 4.6)\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(codex): handle unhandled Codex notification methods to prevent pr…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-04-01T16:37:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a0d4e5263820fefc2bb6beaf6aeb1903052b568d",
"body": "…active keepalive (#635)",
"is_bot": false,
"headline": "fix(keepalive): add Codex disconnect debounce and enable headless pro…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-04-01T15:42:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a2341a06b0a442d7a2989faf2ba248a0fc60da9a",
"body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.95.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.94.0...the-companion-v0.95.0)\n(2026-04-01)\n\n\n### Features\n\n* **keepalive:** proactive CLI relaunch when frontend is disconnected\n([#634](https://github.com/The-Vibe\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release the-companion 0.95.0 (#633)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-04-01T15:27:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6a0e7c599c1700ca750fee2b6ad93f8aed362e99",
"body": "… (#634)\n\n## Summary\n- CLI processes (Claude Code & Codex) now auto-relaunch on crash even\nwithout a browser connected\n- Ensures headless sessions (agents, cron jobs) stay alive with\nexponential backoff (3s/6s/12s)\n- Intentional kills (idle-kill, delete, archive) are excluded via\ntracking set\n- Also\n[…]\norchestrator tests pass (5 new)\n- Typecheck passes\n- Pre-commit hooks pass\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(keepalive): proactive CLI relaunch when frontend is disconnected…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-04-01T14:50:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9b5e67535233acb987f60348a7f3d90d6f76f83c",
"body": "## Summary\n- remove the workbench terminal entry and terminal route\n- simplify session chrome by removing editor, browser, terminal, and\nprocesses surfaces\n- drop the unused `editorTabEnabled` setting from the client and server\ncontracts\n\n## Why\n- the session UI had multiple dead or redundant surfac\n[…]\nts\nserver/routes.test.ts`\n\n## Screenshot\n- to be added after local capture\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(workbench): remove terminal and session extras (#632)",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-04-01T08:31:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b176624dff1c422bb4ec7521dc4ae13ac9fbd807",
"body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.94.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.93.0...the-companion-v0.94.0)\n(2026-03-27)\n\n\n### Features\n\n* **settings:** add provider token configuration for Claude Code and\nCodex ([#623](https://github.com/The\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release the-companion 0.94.0 (#624)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-03-30T14:39:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a5559854b55b9605a0203a1ac07a998696487ddf",
"body": "…Codex (#623)\n\n## Summary\n- Adds a new **Providers** section to the Settings page between\nNotifications and Anthropic\n- Users can configure/update their **Claude Code OAuth token** (from\n`claude setup-token`) and **OpenAI API key** (for Codex) without\nre-running onboarding\n- Masked input fields with\n[…]\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(settings): add provider token configuration for Claude Code and …",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-27T19:48:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "75a6cc982da1f53a9236db01f0d22915758f1598",
"body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.93.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.5...the-companion-v0.93.0)\n(2026-03-27)\n\n\n### Features\n\n* **claude:** support channels protocol updates\n([#613](https://github.com/The-Vibe-Company/companion/iss\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release the-companion 0.93.0 (#611)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-03-27T15:12:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "177af4be321411dad1c1fe3683fd805e6beaa06c",
"body": "## Summary\n- The sidebar poll updates `sdkSessions` from the server every 5s but\nnever prunes the client-side `sessions` Map\n- Since the sidebar renders from `UNION(sessions.keys(), sdkSessions)`,\nserver-deleted sessions persist as ghost entries until hard refresh\n- After `setSdkSessions(list)`, now\n[…]\nbar tests pass\n\n## Review provenance\n- Root cause identified and fix implemented by AI agent (dev-debug\nworkflow)\n- Human review: no\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(sidebar): reconcile client sessions with server on poll (#621)",
"author_name": "Edwin Hu",
"author_login": "edwinhu",
"committed_at": "2026-03-27T15:07:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6f6d411cc4e7cb7d16216f179212ef7ea44e4a40",
"body": "…ing, and diagnostics (#617)\n\n## Summary\n- Adds a hidden Recording Hub feature gated behind\n`COMPANION_RECORDING_HUB=1`\n- Enables secure upload/import of JSONL protocol recordings into a\ncurated store (`~/.companion/hub/`)\n- Implements `ReplayAdapter` (IBackendAdapter) to replay recorded\nsessions as\n[…]\n tests pass\n- Full suite passes (4855 tests, 188 files)\n- Typecheck passes\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(recording-hub): add hidden recording hub for replay, compat test…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-24T10:34:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c2f2b55118cb576532746cbde87eab4de4b87001",
"body": "… (#615)\n\n## Summary\n- Add first-launch onboarding wizard that guides users through\nconfiguring Claude Code (OAuth token via `claude setup-token`) and Codex\n(OpenAI API key)\n- Tokens are persisted in `~/.companion/settings.json` and auto-injected\ninto sessions as `CLAUDE_CODE_OAUTH_TOKEN` / `OPENAI_\n[…]\no\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(onboarding): add provider setup wizard for Claude Code and Codex…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-24T08:53:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5baccb13ba0b87d2dfcaa9e0241951ca9febc684",
"body": "## Summary\n- add support for new Claude channels/protocol message types in the\nbackend adapter and shared session types\n- surface new streamlined text, tool summary, and prompt suggestion\nevents in the frontend store and websocket client\n- document the protocol updates and refresh playground/tests f\n[…]\n run test` (launched in container; long-running suite)\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(claude): support channels protocol updates (#613)",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-21T18:58:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "08e495b3ac06323d1113a43328682deedeac373d",
"body": null,
"is_bot": false,
"headline": "fix(linear): log webhook acceptance and rejection (#612)",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-19T12:13:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c256360d6db3846e4110f1232c047ef16f939906",
"body": "<!-- CURSOR_AGENT_PR_BODY_BEGIN -->\nThis pull request contains changes generated by a Cursor Cloud Agent\n<!-- CURSOR_AGENT_PR_BODY_END -->\n\n<div><a\nhref=\"https://cursor.com/agents/bc-7b5be7ef-d331-472b-ba4d-b80ec1a2c5eb\"><picture><source\nmedia=\"(prefers-color-scheme: dark)\"\nsrcset=\"https://cursor.co\n[…]\nom/assets/images/open-in-cursor-dark.png\"></picture></a> </div>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: Stan Girard <StanGirard@users.noreply.github.com>",
"is_bot": false,
"headline": "refactor: Code redundancy reduction (#610)",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-18T20:56:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b67650f91c2ba8c8473d9cbd4d5777bde1999acb",
"body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.5](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.4...the-companion-v0.92.5)\n(2026-03-18)\n\n\n### Code Refactoring\n\n* **linear:** separate OAuth Apps from Tickets integration\n([#607](https://github.com/The-Vibe-Co\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release the-companion 0.92.5 (#609)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-03-18T20:54:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6710519081bcbde1c785c34075b9a56c5b52d898",
"body": "## Summary\n- Separates the Linear integration into two distinct concepts: **Linear\nTickets** (API-key connections for issue viewing/searching) and **Linear\nOAuth Apps** (standalone OAuth connections for agent @mention triggers)\n- Introduces a new `LinearOAuthConnection` entity stored in\n`~/.companio\n[…]\n provenance\n- Implemented by AI agent (Claude)\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(linear): separate OAuth Apps from Tickets integration (#607)",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-18T19:56:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b57488329e07c39b11c0cbd4c43ed6dea50730a3",
"body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.4](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.3...the-companion-v0.92.4)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **claude-adapter:** re-apply user echo drop fix reverted by\n[#589](https://github.com/The-Vibe-Company\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release the-companion 0.92.4 (#606)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-03-18T11:08:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ee653928150ce7877d2baf79230dafbc5c9e3f84",
"body": "## Summary\n- Re-apply the user echo drop fix from #592 that was inadvertently\nreverted by #589's merge resolution\n- Silently drop all CLI `user` echo messages (both string and\ntool_result arrays) — they're redundant since tool results already\narrive in assistant message content blocks\n\n## Why\nPR #59\n[…]\nhoes are silently dropped\n- 61/61 adapter tests pass\n- Typecheck clean\n\n## Review provenance\n- Investigated & implemented by AI agent\n- Human review: no\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(claude-adapter): re-apply user echo drop fix reverted by #589 (#605)",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-18T11:06:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0c2335e52b1983d1263e188923f97c656b5791ce",
"body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.3](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.2...the-companion-v0.92.3)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **docker:** preserve containers on idle-kill and increase default\ntimeout to 24h\n([#602](https://githu\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release the-companion 0.92.3 (#603)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-03-18T10:12:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7f5eab2924686b3cbfebf1abf94951a361a13d13",
"body": "…meout to 24h (#602)\n\n## Summary\n- Idle-kill no longer destroys Docker containers — only kills the CLI\nprocess, so containers survive and can be restarted on relaunch\n- Default idle timeout increased from 20 minutes to 24 hours\n(`COMPANION_IDLE_KILL_MINUTES` env var still works for override)\n- Expli\n[…]\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(docker): preserve containers on idle-kill and increase default ti…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-18T10:11:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "24ef8ac28e2adace6eec240bdcbe36f6a6b35fea",
"body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.2](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.1...the-companion-v0.92.2)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **orchestrator:** prevent PID recycling from blocking Docker session\nrelaunch\n([#589](https://github.c\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release the-companion 0.92.2 (#601)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-03-18T09:57:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5e76c50051f70efa0bd827b3ae252e48d3afa0d1",
"body": "… relaunch (#589)",
"is_bot": false,
"headline": "fix(orchestrator): prevent PID recycling from blocking Docker session…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-18T07:10:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f5f0a9284950d13dd2f869d62de17c4d0b22d526",
"body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.1](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.0...the-companion-v0.92.1)\n(2026-03-17)\n\n\n### Bug Fixes\n\n* **ui:** redesign chat blocks inline and fix streaming message\nduplication\n([#597](https://github.com/T\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release the-companion 0.92.1 (#600)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-03-18T06:12:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6735a9a6482c650c36ffb280448a00148f1c8b12",
"body": "…ation (#597)\n\n## Summary\n- Redesign chat tool blocks (ThinkingBlock, EditBlock, BashBlock,\nBashResultBlock) from card-based to inline rendering — no cards, no\nscroll, \"show more\" for long content\n- Fix streaming message duplication caused by CLI sending incremental\n`assistant` messages (one per con\n[…]\nlive session\n- Verified no React duplicate key warnings in browser console\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ui): redesign chat blocks inline and fix streaming message duplic…",
"author_name": "Stan Girard",
"author_login": "StanGirard",
"committed_at": "2026-03-17T21:21:11Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 23,
"commits_last_year": 582,
"latest_release_at": "2026-07-19T07:57:46Z",
"latest_release_tag": "companion-v0.108.0",
"releases_from_tags": false,
"days_since_last_push": 5,
"active_weeks_last_year": 17,
"days_since_latest_release": 5,
"mean_days_between_releases": 3.4
},
"community": {
"has_readme": false,
"has_license": false,
"has_description": false,
"has_contributing": false,
"health_percentage": null,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "@hellcoder/companion",
"exists": true,
"license": "MIT",
"keywords": [
"claude",
"claude-code",
"ai",
"agent",
"web-ui",
"vibe-coding"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@hellcoder/companion",
"is_deprecated": false,
"latest_version": "0.108.0",
"repository_url": "https://github.com/hellcoderGIT/companion",
"versions_count": 66,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 3170,
"first_published_at": "2026-04-20T02:57:10.337000Z",
"latest_published_at": "2026-07-19T08:09:59.755000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 1,
"stars": 1,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-07-08",
"count": 1
}
],
"complete": true,
"collected": 1,
"total_forks": 1
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"landing/tsconfig.json",
"platform/tsconfig.json",
"relay/tsconfig.json",
"web/tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 234876,
"source_files_sampled": 522,
"oversized_source_files": 17,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 10656
},
"dependencies": {
"manifests": [
"landing/package.json",
"package.json",
"platform/package.json",
"relay/package.json",
"web/package.json"
],
"advisories": {
"error": null,
"scope": "published_package",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 89,
"malicious_count": 0,
"assessed_package": "npm:@hellcoder/companion@0.108.0",
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "react",
"manifest": "landing/package.json",
"ecosystem": "npm",
"version_constraint": "^19.0.0"
},
{
"name": "react-dom",
"manifest": "landing/package.json",
"ecosystem": "npm",
"version_constraint": "^19.0.0"
},
{
"name": "the-companion",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^0.2.2"
},
{
"name": "better-auth",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^1.4.0"
},
{
"name": "class-variance-authority",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^0.7.1"
},
{
"name": "clsx",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^2.1.1"
},
{
"name": "drizzle-orm",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^0.39.0"
},
{
"name": "hono",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^4.7.0"
},
{
"name": "lucide-react",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^0.575.0"
},
{
"name": "drizzle-kit",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^0.30.0"
},
{
"name": "postgres",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^3.4.8"
},
{
"name": "react",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^19.0.0"
},
{
"name": "react-dom",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^19.0.0"
},
{
"name": "resend",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^6.9.4"
},
{
"name": "stripe",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^17.0.0"
},
{
"name": "tailwind-merge",
"manifest": "platform/package.json",
"ecosystem": "npm",
"version_constraint": "^3.5.0"
},
{
"name": "@codemirror/lang-cpp",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.3"
},
{
"name": "@codemirror/lang-css",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.3.1"
},
{
"name": "@codemirror/lang-html",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.4.11"
},
{
"name": "@codemirror/lang-java",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.2"
},
{
"name": "@codemirror/lang-javascript",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "6.2.4"
},
{
"name": "@codemirror/lang-json",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.2"
},
{
"name": "@codemirror/lang-markdown",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.5.0"
},
{
"name": "@codemirror/lang-python",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.2.1"
},
{
"name": "@codemirror/lang-rust",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.2"
},
{
"name": "@codemirror/lang-sql",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.10.0"
},
{
"name": "@codemirror/lang-xml",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.1.0"
},
{
"name": "@codemirror/lang-yaml",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^6.1.2"
},
{
"name": "@codemirror/view",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "6.39.15"
},
{
"name": "@uiw/react-codemirror",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "4.25.4"
},
{
"name": "axe-core",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^4.11.1"
},
{
"name": "croner",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^10.0.1"
},
{
"name": "diff",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^8.0.3"
},
{
"name": "fzf",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^0.5.2"
},
{
"name": "hono",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^4.7.0"
},
{
"name": "posthog-js",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^1.347.2"
},
{
"name": "qrcode",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^1.5.4"
},
{
"name": "ws",
"manifest": "web/package.json",
"ecosystem": "npm",
"version_constraint": "^8.19.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 63,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 2,
"top_contributors": [
{
"type": "User",
"login": "StanGirard",
"commits": 309,
"avatar_url": "https://avatars.githubusercontent.com/u/19614572?v=4"
},
{
"type": "User",
"login": "hellcoderGIT",
"commits": 41,
"avatar_url": "https://avatars.githubusercontent.com/u/5343954?v=4"
},
{
"type": "User",
"login": "claude",
"commits": 8,
"avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
},
{
"type": "User",
"login": "edwinhu",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/174409?v=4"
},
{
"type": "User",
"login": "binhnguyenduc",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/37066217?v=4"
},
{
"type": "User",
"login": "freezscholte",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/52416805?v=4"
},
{
"type": "User",
"login": "Ziltosh",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/7701420?v=4"
},
{
"type": "User",
"login": "sondh5",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/22186548?v=4"
},
{
"type": "User",
"login": "Codex-Agent",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/214169644?v=4"
},
{
"type": "User",
"login": "educamosonline",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/9588621?v=4"
}
],
"contributors_sampled": 16,
"top_contributor_share": 0.811
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"a11y.yml",
"ci.yml",
"coverage-gate.yml",
"preview.yml",
"publish.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 5,
"reason": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/17 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 3 contributing companies or organizations -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "9a11f0fa3b506ab9c0c107965c681417fd4d8d3b",
"ran_at": "2026-07-25T05:15:44Z",
"aggregate_score": 4.5,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-19T08:10:04Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-19T07:57:35Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/hellcoderGIT/companion",
"host": "github.com",
"name": "companion",
"owner": "hellcoderGIT"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 57,
"inputs": {
"security": 56,
"vitality": 86,
"community": 24,
"governance": 58,
"engineering": 55
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 86,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"commits_last_year": 582,
"human_commit_share": 0.69,
"days_since_last_push": 5,
"active_weeks_last_year": 17
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "17/52 weeks with commits",
"points": 11.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 17
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "582 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 582
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 23,
"latest_release_tag": "companion-v0.108.0",
"releases_from_tags": false,
"days_since_latest_release": 5,
"mean_days_between_releases": 3.4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "23 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 23
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~3.4 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 3.4
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 24,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 1,
"stars": 1,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 1
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "1 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 1
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "critical",
"name": "Community health",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"has_readme": false,
"has_license": false,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 58,
"inputs": {
"packages": [
"@hellcoder/companion"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 3170
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "3,170 downloads/month across npm",
"points": 46.7,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 3170,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 58,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 37,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 16,
"top_contributor_share": 0.811
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 81% of commits",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 81
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "16 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 16
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 3 contributing companies or organizations -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 63,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "63/63 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 63,
"decided": 63
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/17 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 36,
"inputs": {
"followers": 1,
"owner_type": "User",
"is_verified": null,
"owner_login": "hellcoderGIT",
"public_repos": 3,
"account_age_days": 4712
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1 followers of hellcoderGIT",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "hellcoderGIT"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "3 public repos, account ~12 yr old",
"points": 16.4,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 3
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@hellcoder/companion"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 5 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 5
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "66 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 66
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 55,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "5 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 5
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
"points": 10,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": "https://thecompanion.sh",
"has_readme": false,
"has_docs_dir": true,
"has_description": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://thecompanion.sh",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 56,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 45,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 4.5
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
"points": 1.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/17 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 3 contributing companies or organizations -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@hellcoder/companion@0.108.0 runtime dependency closure — what installing the published package pulls in — 89 packages. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_published",
"params": {
"package": "npm:@hellcoder/companion@0.108.0",
"assessed": 89
}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 89,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "no indirect dependency carries a known advisory",
"points": 25,
"status": "met",
"details": [
{
"code": "no_indirect_advisories",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 89,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 4
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 81,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 10656
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "69 of 69 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 69,
"sampled": 69
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 71,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [
"landing/tsconfig.json",
"platform/tsconfig.json",
"relay/tsconfig.json",
"web/tsconfig.json"
],
"agent_commit_share": 0.52,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "52 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 52,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 98,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 234876,
"source_files_sampled": 522,
"oversized_source_files": 17
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "17/522 source files over 60KB",
"points": 53.2,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 522,
"oversized": 17
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"Community profile unavailable",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-25T05:16:06.936471Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/h/hellcoderGIT/companion.svg",
"full_name": "hellcoderGIT/companion",
"license_state": "standard",
"license_spdx": "MIT"
}