公开记录
软件健康报告模式 0.23.0 · 指标 1.13.0 · 2026-07-21 21:17 UTC

mustachius / taskframe

GoMIT★ 4 星标⑂ 0 复刻始于 2026年7月在 GitHub 上查看 ↗

mustachius/taskframe 的健康指数为 100 分中的 43 分,处于「存在风险」区间。 其得分最高的类别是Vitality(68/100),最低的是Community & Adoption(28/100)。 最近一次更新在 4 天前。 近期的大部分工作由 1 位贡献者完成。

43
总分 / 100
存在风险

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

43
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

mustachius个人账户
8 关注者14 个公开仓库始于 2014年12月

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/mustachius/taskframev0.2.1-34 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

68中等 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 4 天前
1.4/36提交节奏 — 52 周中有 2 周有提交
16.8/18提交量 — 最近一年 73 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year73
human_commit_share1
days_since_last_push4
active_weeks_last_year2

发布纪律

88优秀
评分方式
16.2/27有发布版本 — 3 个版本标签(无 GitHub 发布版本)
36/36发布时效 — 最近一次发布版本于 4 天前
27/27发布节奏 — 约每 1.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count3
latest_release_tagv0.2.1
releases_from_tags
days_since_latest_release4
mean_days_between_releases1.4
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

28危急 · 占总体的 18%
评分方式
7.7/60星标 — 4 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars4
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

33存在风险 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
0/46.8议题解决 — 没有议题或无数据
0/38.3PR 接受 — 没有已裁定的拉取请求或无数据
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决, PR 接受。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
6.9/25所有者影响力 — mustachius 有 8 位关注者
20.6/25既往记录 — 14 个公开仓库,账户约 11 年
所用输入
followers8
owner_typeUser
is_verified
owner_loginmustachius
public_repos14
account_age_days4,235
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 4 天前
12/20版本历史 — 3 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/mustachius/taskframe
ecosystemsgo
any_deprecated
min_days_since_publish4

工程质量

基础的工程与文档实践是否到位?

48存在风险 · 占总体的 20%

工程实践

60中等
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config
已排除计分(无数据或不适用):OpenSSF Scorecard:CI-Tests。 其余权重已重新归一化。

文档

30存在风险
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
0/10仓库描述
0/10主题标签
0/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

34存在风险 · 占总体的 16%

安全态势

34存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 无数据
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3.4
已排除计分(无数据或不适用):ci_tests, packaging, signed_releases。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

63中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 73 次人类提交中有 73 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — go.mod(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
0/10已体现的代理实践 — 最近 73 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
10/10OpenSSF Scorecard:Pinned-Dependencies — all dependencies are pinned
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 73 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes32,071
source_files_sampled73
oversized_source_files0

关键数据

4GitHub 星标
1贡献者
73最近 12 个月提交数
4距最近推送天数
3发布版本数
1巴士系数(bus factor)
0开放议题
Go软件包生态系统数

数据采集警告

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 4 ★ / 0 ⇿
4Star
2发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

223344422026-072026-072026-07
主版本 0次版本 1修订 1
OpenSSF Scorecard 3.4 / 10
3.4综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-21 21:17 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
不适用Packagingpackaging workflow not detected
10Pinned-Dependenciesall dependencies are pinned
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
直接依赖 8
注册表软件包版本约束清单文件
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/glamourv1.0.0go.mod
Gogithub.com/charmbracelet/harmonicav0.2.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.1-0.20250404203927-76690c660834go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.6go.mod
Gogithub.com/muesli/termenvv0.16.0go.mod
Gomodernc.org/sqlitev1.53.0go.mod
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 1855,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 385185,
        "PowerShell": 2554
      },
      "pushed_at": "2026-07-17T12:48:29Z",
      "created_at": "2026-07-13T17:03:24Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T18:45:18Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "mustachius",
      "company": null,
      "location": null,
      "followers": 8,
      "avatar_url": "https://avatars.githubusercontent.com/u/10211078?v=4",
      "created_at": "2014-12-16T17:04:07Z",
      "is_verified": null,
      "public_repos": 14,
      "account_age_days": 4235
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-07-17T12:40:35Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-17T12:36:16Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-14T15:32:19Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "ccda7206b0f1b7be5bd314a6741505d75b7ad181",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo gifs [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:48:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a1f935a64e6dd0bab418d27fb4fdd867d13c602",
          "body": "Pushing v0.2.1 fired both workflows: path filters do not apply to tag\nevents, so vhs ran on a detached HEAD and its auto-commit step died\nwith exit 128, and CI re-ran a suite that had already passed for the\nsame commit. Both triggers are now scoped to branches.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "ci: do not trigger workflows on tag pushes",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:45:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3ac7b3c8f5701c150ed326642706acc5c5bb751",
          "body": "Stale since the REPL became the default interface: both language\nblocks now say the REPL and list `taskframe classic` for the\nfull-screen TUI, which the usage never mentioned.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "fix(cli): help usage said the bare command opens the TUI",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:40:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd8f34cb347f9b2f3ecbf175a788b4024d89e830",
          "body": "The install section now states the Go requirement up front, gains the\ngo install one-liner and an explicit \"nothing Windows-only\" note (CI\nalready tests on Linux), and the from-source example stops writing a\n.exe in a sh block. A short contributing section sets expectations\nbefore the project gets shared around.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "docs: install paths for Linux/macOS, Go requirement, contributing note",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:36:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d815ffa187464a9369ca40f25646cd1a650d3ee1",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo gifs [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:27:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "042091c6a66de506d9f0492c161f5768b0ec4234",
          "body": "New demo-classic.tape shows the redesigned classic interface in the\ncharm theme (tab jumps, the lit Overdue tab, an active task with\nelapsed time, and the detail dialog over the dimmed view); the vhs\nworkflow now renders both tapes and commits demo*.gif, and the README\nembeds the new gif in the classic section. The lip gloss credit slims\ndown to the charm theme bullet - the interface now speaks for itself.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "docs: classic TUI demo tape + slimmer Charm mentions",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:07:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5420dbfbb9f96aaf6a15eb7a3464f413e6b66d8",
          "body": "The help modal gains the tab-band row and leads every combo with its\nletter (F-keys still bound, just secondary); dead fkey-era catalog keys\ndrop and the search info stops citing F7. README rewrites the classic\nTUI section around tabs, checklist marks, chips and dimmed dialogs, and\nthe theme list grows to eleven with charm.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "docs(tui): help, catalog and README catch up with the redesign",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T00:07:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1eaa783f4c380ec630e516c9f5b8380903134159",
          "body": "lipglossPlace blanked everything behind a modal; overlayModal now takes\nthe real midsection (renderMain, shared by both View paths), strips\neach line to plain text via the new ui.StripANSI (charmbracelet/x/ansi,\nalready in the module graph, promoted to a direct require) and re-renders\nit dim, splici\n[…]\ndescriptions even when the box was clamped below 94 cells (any 80-97\ncol terminal), which the new modal-open width test caught.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): modals float over the dimmed live view",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T00:04:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0afcb6974d710ad36c07697ca958414e2209be0",
          "body": "The status row becomes chips (count in the primary chip; @context,\nlanguage and sort in secondary ones, message in between), and the\nNorton F-key bar gives way to a dim one-line key legend that follows\nthe input focus (list / sidebar / search / modal). All F-keys stay\nbound — they only leave the visual. ASCII mode sanitizes the legend\nglyphs.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): chip status bar and a dim hint line replace the F-key bar",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T00:00:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8a9c93b4e9aa7a9bc74efe10a3b0094091ccd16",
          "body": "The DOS-style [ ]/[x]/[-]/[>] cells become 1-cell checklist glyphs:\no pending, check done (strikethrough body unchanged), multiplication-x\ndeleted, filled-dot active with the elapsed suffix. --ascii degrades to\no/x/-/* and the fold arrows finally get ASCII fallbacks (v and >),\nwhich they never had.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): checklist marks in the list and detail",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T23:58:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a367524324b80c6a158218d63f294e5c2bb579a3",
          "body": "The two double-border panels give way to open columns split by a thin\nborder-colored rule, Charm style: a title row above them carries the\nonly focus indicator (bold TitleFocus on the focused side). The list\ngains a column of width and the frame keeps its exact-height/width\ninvariants; mouse geometry now flows through contentTop/contentHeight\ninstead of literals.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): boxless sidebar and list columns",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T23:56:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e0c64a2691bdaf81da19fd1c91a0e5c199a397b",
          "body": "A 3-line rounded tab band (All/Today/Overdue/Week/Active/Next/Waiting,\ndriven by the report registry) sits under the header; [/] cycle, 1-7\njump, mouse clicks hit-test through the same tabLayout spans the\nrenderer uses. Tab report ⊕ sidebar selection compose via Filter.Merge\n(context < tab < sidebar\n[…]\nband windows\naround the active tab with ‹ › markers. Dropping the per-filter counts\nalso cuts five store.List calls per reload.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): report tabs replace the sidebar virtual filters",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T23:54:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a529c733278bab58ffdddba685d9ce90f88e170d",
          "body": "Rounded borders become the default box set (borland alone keeps its\ndouble-border Turbo Vision identity via the new per-palette box field).\nThe f-key styles are renamed to Chip/ChipAlt ahead of the status-chip\nbar, with per-theme secondary surfaces. New 11th theme `charm` mirrors\nthe lipgloss-README pink/purple look, wordmark gradient included.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(ui): per-theme box chars, chip styles, and the charm theme",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T23:46:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69611de19d06ebf56252a12d33778e902f586c24",
          "body": null,
          "is_bot": false,
          "headline": "docs: multi-line notes, REPL /sync, mouse and elapsed time in the README",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:56:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf270444cd7a25117c8f0200aeda8aa49fc2a7ec",
          "body": "Both panel boxes span exactly panelH rows with width-padded lines, so\nthe native join is output-identical to the hand-rolled loop. The modal\nplacer stays hand-rolled on purpose: lipgloss.Place returns oversized\ncontent unchanged, and tall modals rely on being clipped to panelH —\ndocumented on the function.",
          "is_bot": false,
          "headline": "refactor(tui): use lipgloss.JoinHorizontal for the panel join",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:54:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eee1e58d339b560afb3235ee193d842614047f33",
          "body": "WithMouseCellMotion: the wheel scrolls the task list, the sidebar and\nthe detail/read modals (through the same harmonica spring as the keys,\nvia a new scroller.scrollBy); a left click selects the row or sidebar\nitem under the pointer, and clicking the already-selected task opens\nits detail. Clicks o\n[…]\ne are no-ops,\nand context rows only select — Enter remains the activation toggle.\nTrade-off: native terminal text selection is disabled while the TUI\nruns (Shift+drag still works in Windows Terminal).",
          "is_bot": false,
          "headline": "feat(tui): mouse support in the classic interface",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:53:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2dc08ab12b9b53259c5cc89900545c87b4a71298",
          "body": "cli.RunSync is now exported and the REPL wraps it in a tea.Cmd: /sync\n[init <url>|status|pull|push] runs git off the UI thread with a\nbubbles/spinner line under the prompt. One run at a time; a fresh\nspinner per run keeps stale ticks inert, and completion caches refresh\nafter a pull replaces the database. Tab-completion and /help updated\n(/lang added to the completion list too).",
          "is_bot": false,
          "headline": "feat(repl): /sync command with a spinner (closes the sync phase 2)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6f5e7469d85553b3e7273f0811b78222a787699",
          "body": "Notes render as markdown, so the capture box is now a real textarea:\nenter breaks the line and ctrl+d saves (esc still cancels; ctrl+d is\nintercepted before the textarea sees it — its default keymap binds it\nto delete-forward). Hints updated in both languages. Edit/child/prompt\ninputs stay single-line.",
          "is_bot": false,
          "headline": "feat: multi-line notes via bubbles/textarea (REPL and classic TUI)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:48:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95b5039c92f014947ab46c5d924784455832252b",
          "body": "New ui.FormatElapsed helper (<1m / 37m / 1h25m / 2d3h) rendered on\nstarted tasks in the TUI list and detail and in the REPL overlay and\ndetail. No live ticking — values refresh whenever the UI re-renders.",
          "is_bot": false,
          "headline": "feat: show elapsed time on active tasks (list, overlay, detail)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:45:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54568f1738fabec832352a878eddb7353d4539a5",
          "body": null,
          "is_bot": false,
          "headline": "docs: update the classic TUI section (logo header, new keys, sidebar)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:32:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20ca97f76e12c4542d471bdf1ba8b18790d37f6a",
          "body": "Pending list rows now color each segment on its own: dim ids, accent\n[>] marker and tags, priority H/M highlighted, due dates red when\noverdue and orange (new warn color) when due today. Sidebar separators\nbecome labeled section headers, tag/context rows use the accent, counts\ndim. Detail view accen\n[…]\nindicators next to the\nsort mode. The help modal lists the new keys (S, U, L, Enter on @ctx)\nin two columns so it fits the header-shrunk canvas. Cursor rows stay\nsingle-style plain strings throughout.",
          "is_bot": false,
          "headline": "feat(tui): segment-level color pass, richer status bar, two-column help",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:32:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6db43a07e5c88fe30f0879d2a1b77453109774c6",
          "body": "New store.ProjectStatusCounts (GROUP BY project, status; deleted rows\nexcluded) feeds a 6-cell bar on sidebar project rows, aggregated up the\ndotted hierarchy like the pending counts. The bar renders styled on\nnormal rows and as plain glyphs inside the cursor highlight, and is\nomitted when the sidebar is too narrow. Closes the last pending item\nfrom the visual phase 1.",
          "is_bot": false,
          "headline": "feat(tui): per-project done/total progress bar in the sidebar",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:27:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8f38af3db0b2375eec04044525c78845ca7c784",
          "body": "The classic TUI finally honors contexts like the REPL and CLI: the\nactive context folds into every list query (sidebar scalars win, tags\nunion — same Merge semantics as the REPL), defined contexts get their\nown sidebar section (@name rows, Enter toggles activation, ● marks the\nactive one), and virtual-filter counts fold the context in so numbers\nmatch what selecting them shows. Project and tag counts stay global.",
          "is_bot": false,
          "headline": "feat(tui): contexts in the sidebar, applied to the task list",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:24:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e966f7cb2b9ac5d30afa09466609d11ae50342f",
          "body": "Mirrors undo: U reapplies the most recently undone operation through\nstore.Redo; 'nothing to redo' surfaces on the red status line exactly\nlike undo's empty case.",
          "is_bot": false,
          "headline": "feat(tui): redo on key U",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:21:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8b2ea7412bd4e4ab34977cee78cbf72789c175c",
          "body": "S toggles the started state of the task under the cursor (the [>]\nmarker already rendered; only the toggle was missing). The sidebar's\nvirtual filters gain Active and Next rows from the shared report\nregistry, and the list panel now honors a report's display limit\n(next = 15) via Sidebar.Limit + TaskList.SetLimit.",
          "is_bot": false,
          "headline": "feat(tui): start/stop on key S; Active and Next views in the sidebar",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:20:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef1939fd6022a73c3dcc3e2a74960672d405035a",
          "body": "Mirrors the REPL's /lang: L flips en<->pt-br in place, re-localizes the\ncached search prompt, persists through store.SetLanguage, and the\nstatus reload rebuilds the cached sidebar labels. Options.Lang is\nnormalized once in newApp so a zero value behaves as English.",
          "is_bot": false,
          "headline": "feat(tui): live language toggle on key L",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:17:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50706a32fe20745ef7992158839623e2393e54ba",
          "body": "The classic TUI now keeps the TaskFrame logo at the top: the full\n6-line gradient wordmark when the terminal is at least 78x28, and a\ncompact one-line brand (with a language tag on the right) otherwise.\nThe header shrinks the panel area instead of adding rows, so the frame\nstill spans exactly the terminal height.",
          "is_bot": false,
          "headline": "feat(tui): always-visible adaptive logo header",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:17:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6bb24bde700df71bba707451bae28a8baeb8699",
          "body": "… color\n\nMove the TASKFRAME wordmark art out of the REPL banner into internal/ui\n(exported, gradient-aware Wordmark helper) so the classic TUI can render\nit too. Add GradientLine (per-rune horizontal gradient) for one-line\nbrands, ProgressGlyphs (unstyled bar runes for single-style rows), a\nwarn due-soon color in all ten palettes, and StatusAccent (accent over\nthe status-bar background).",
          "is_bot": false,
          "headline": "feat(ui): shared wordmark, horizontal gradient, progress glyphs, warn…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:17:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc14d144489db838c82701c258b0dabce63126f6",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo.gif [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T12:06:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78a29ff194b06e163d5e164099ba7fbf7c32a8fc",
          "body": "Vary the feature bullets instead of one uniform bold-dash pattern, trim\nem dashes, and rewrite the sync paragraph; also note the five kept\nbackups and warn against embedding a token in the sync URL.",
          "is_bot": false,
          "headline": "docs: rework the README feature list and sync section",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T12:03:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38ce8cb28aa22293f23b5fb0afc02af84f855fc5",
          "body": "The DB directory, sync backups and clone parent are now 0o700 and the\nfiles written by sync 0o600 (no-op on Windows, keeps other local users\nout on Unix). CI declares contents:read explicitly, every action is\npinned to a commit SHA, and the vhs job pins vhs v0.11.0 / ttyd 1.7.7\ninstead of latest.",
          "is_bot": false,
          "headline": "chore(security): tighten data-file permissions and harden CI workflows",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T12:02:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d53007336ab34138f16b396aa54cb5be51d60d29",
          "body": "govulncheck flagged GO-2026-5320 (XSS in goldmark, reachable through\nui.RenderMarkdown -> glamour) plus nine x/net advisories in code we do\nnot call. Both modules move to their fixed versions; the scan is clean.",
          "is_bot": false,
          "headline": "chore(deps): bump goldmark to 1.7.17 and x/net to 0.55.0",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T12:02:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8303a2c48eaec4bfad7c50235c3b156189b42200",
          "body": null,
          "is_bot": false,
          "headline": "docs: document sync and note/edit from the list overlay in the README",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T11:27:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7bdaa1791da11a6b91e943fd289ff96a6e4fef8",
          "body": "…ck; delete refresh\n\nRound out the REPL list/detail overlays so tasks can be managed without\njuggling ids, and so every action gives visible confirmation.\n\n- Edit under the cursor (key `e`): opens an inline token editor over the\n  highlighted task (list) or the task being viewed (detail) — type the \n[…]\nl (retitle + reload), delete removes the row, plus a\nfile-backed note test proving notes always persisted (the earlier \"not saved\"\nreport was a feedback gap, not a save failure). gofmt/vet/test green.",
          "is_bot": false,
          "headline": "feat(repl): edit from the list/detail (key e); visible overlay feedba…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-15T22:22:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ffbdf90f917a59a24f2b98c4222366ec1ab0664",
          "body": "Press `n` in the REPL `list` overlay to add a note to the task or subtask\nunder the cursor, and in the task detail view to note the task you're\nlooking at. Reaches parity with the classic TUI, which already had F5/`n`.\n\n- model.go: a `noteReturn` field records where the note box should return\n  to; \n[…]\ne row's task, parent or child). The `note <id>` command is\nunchanged. Tests: TestNoteFromList (task + subtask), TestNoteFromDetail\n(saves and reloads showing the note), TestNoteCancelFromListIsSilent.",
          "is_bot": false,
          "headline": "feat(repl): add a note from the list overlay and the detail view (key n)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-15T12:10:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "633dd9c25a7e42238d5ee73bd4ecb5944e50eb39",
          "body": "Add `taskframe sync` so tasks/notes/history can move between machines\n(home/work) through a private git repo holding a JSON export — no manual\nDB copying. Sequential, single-user; last-writer-wins with safety rails.\n\nA true merge is infeasible (task ids are local autoincrement rowids that\ncollide ac\n[…]\never\n--force. Auth is delegated to the user's git (GCM/SSH).\n\nTests: gitsync_test.go (bare repo) + cli/sync_test.go (two-machine LWW:\nadopt/push/pull/divergence/backup). Verified with the real binary.",
          "is_bot": false,
          "headline": "feat(sync): sync the database across machines via git (taskframe sync)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-15T10:58:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b021be73b9e48180a652d79c6348cf1a8d50b16d",
          "body": "…if shows it)",
          "is_bot": false,
          "headline": "docs: drop the static REPL screen replica from the README (the demo.g…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:46:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "707adea2be77228e5f20b039c29f1542dcd504bf",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo.gif [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:41:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3617758da125b50ddcd00085af753d0c98022d8",
          "body": "…rs in color\n\nGitHub sets CI=true, which makes lipgloss/termenv ignore ANSI and degrade the gradient banner to grayscale in the gif (only the markdown path force-overrode the profile). Replicate what charmbracelet/vhs-action did: empty CI + COLORTERM=truecolor.",
          "is_bot": false,
          "headline": "ci(vhs): set CI='' and COLORTERM=truecolor so the gradient logo rende…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:39:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33933e5ecf710e2500d3f7e83ac74a8a25176649",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo.gif [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:37:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6167782490fb7e76dc8f5a77871df87951f02df",
          "body": "The REPL scrollback is immutable, so the mid-demo '/theme dracula' switch never recolored the banner/output in the gif. Launch already in dracula (TASKFRAME_THEME) so the gradient logo and note render in color from the start; drop the no-op /theme beat.",
          "is_bot": false,
          "headline": "demo: start the demo in the Dracula theme (colorful gradient logo)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:35:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca9f1aa542bfe59a6df7ef2b11c330feeceade55",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo.gif [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:28:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2e2d65e0201ba5bc86f163b1b17aa823141a816",
          "body": "…r is broken)\n\ncharmbracelet/vhs-action@v2 fails with 'Failed to install ffmpeg': it hardcodes an ffmpeg n5.1 asset name that BtbN/FFmpeg-Builds no longer ships. Install ffmpeg (apt), ttyd (release binary), and VHS + taskframe (go install) ourselves. Also trigger on changes to the workflow itself.",
          "is_bot": false,
          "headline": "ci(vhs): install ffmpeg/ttyd/vhs directly (vhs-action ffmpeg installe…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:25:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "854643785a2119b00df1dbdcf74fbf9f0d57062f",
          "body": null,
          "is_bot": false,
          "headline": "docs: add VHS demo tape + CI to render demo.gif for the README",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T18:33:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f81cd93c5df8feafa81b4a60f25813f193f7fa8",
          "body": "…ht themes",
          "is_bot": false,
          "headline": "feat(ui): add dracula, catppuccin, nord, gruvbox, solarized, tokyonig…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T18:31:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b6e943195b603e67fc7f4b49d68fb21ccab99fd",
          "body": "The activity-log entry for an added note used to include the note's raw body,\nso the markdown source (asterisks) showed up literally right below the rendered\nNotes section, making it look like nothing rendered. History now just records\n\"note added\"; the note itself is shown, rendered, in the Notes section.",
          "is_bot": false,
          "headline": "fix: don't repeat raw note text in the History log",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T18:11:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "138adc02123ad3c2d594665c7a8d264f5d1d12b9",
          "body": "Notes shown in the task detail (not only the read view) are now rendered as\nmarkdown, so bold/lists/etc. appear where you naturally open the task. The\nactivity-log/History line keeps the raw note text (it is an audit trail).\nRenderMarkdown also forces a truecolor profile when detection reports Ascii\nbut the rest of the UI is clearly in color (an alt-screen detection miss),\nso notes actually render styled.",
          "is_bot": false,
          "headline": "feat: render task notes as markdown in the detail views (REPL + TUI)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T17:44:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9422a43589993aba718ea30763e9c1761ec47e0a",
          "body": "RenderMarkdown relied on glamour's own auto-detection, which could resolve to\nno color and leave literal ** markers instead of bold. It now uses the same\ncolor profile lipgloss uses (the one that already renders the gradient), so\nnotes render consistently wherever the UI shows color.",
          "is_bot": false,
          "headline": "fix(ui): pin glamour to lipgloss's color profile for markdown",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T17:31:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82d326b5b6f7b97834a49d9003627bcbd8e7d431",
          "body": "…nica)\n\nAdds github.com/charmbracelet/harmonica and a shared scroller that wraps a\nviewport: the viewport still computes and clamps the target offset, and a\nspring animates only the displayed offset toward it (with momentum on\nrepeated keys). A reduceMotion flag (set in tests) makes scrolling instant so\nthe synchronous smoke tests stay fast and deterministic. TUI only; the\nnon-alt-screen REPL is unchanged.",
          "is_bot": false,
          "headline": "feat(tui): spring-eased scrolling in the detail and read views (harmo…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T17:17:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd36908b10b2fbe817d18f9c2b7b2a6b7a993585",
          "body": "Adds github.com/charmbracelet/glamour and a shared ui.RenderMarkdown helper\n(cached term renderer, auto/notty style, string-only to keep internal/ui at\nthe bottom of the graph). Notes stay plain text in the DB; only the display\nchanges.\n\n- TUI: a new full-screen Read modal (key R) renders the task t\n[…]\n\n  and each note as a timestamped section, scrollable via viewport.\n- REPL: a new `read <id>` command renders the notes as markdown into the\n  scrollback. Both wired through i18n and the help screens.",
          "is_bot": false,
          "headline": "feat: Glow-style markdown read view for task notes (glamour)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T17:00:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9642aba075527e1edf944794a8ea74087477260",
          "body": "The classic TUI status line now shows the active sort mode on the right,\nso the current ordering is visible at a glance; the left side (task count,\nsearch, last status) truncates to yield space when the terminal is narrow.",
          "is_bot": false,
          "headline": "feat(tui): right-aligned sort indicator in the status bar",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:37:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1600c4e63e79ea2e3b32f31bcb3685a5e99ae05",
          "body": "The default theme paints no background; its light-gray chrome now uses\nlipgloss.AdaptiveColor so it stays legible on a light-background terminal.\nDark-terminal appearance is unchanged; colored accents are untouched.",
          "is_bot": false,
          "headline": "feat(ui): adaptive grays so the dark theme reads on light terminals",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:35:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06aff92b133d49fca82e23adaf94bf264ba46db6",
          "body": "Replaces the manual scroll math in the REPL and TUI detail views with a\nviewport.Model, fixing off-by-one clamping and adding pgup/pgdown/home/end\nfor free. The list overlay keeps its cursor-based windowing.",
          "is_bot": false,
          "headline": "feat(ui): scroll the task detail with bubbles/viewport",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:34:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d17c07022770c3f68e4854cd82ba37c4839af0c",
          "body": null,
          "is_bot": false,
          "headline": "chore: keep CLAUDE.md local-only (untrack + gitignore)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:24:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a04fd37e42c1cbff11edb66fe471fae1ef1ba40",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): make the logo gradient vertical (top-to-bottom)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:22:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0af7dac43e57c1d6bcf9c835375a9cf5e6f06e7e",
          "body": "- GradientLine helper colors the TASKFRAME wordmark per column between two\n  hex endpoints (per-theme; mono themes ramp within their hue). Truecolor,\n  downsamples on limited terminals.\n- ProgressBar helper renders a filled/empty block bar from a fraction.\n- show a subtask completion bar in the REPL and TUI detail views; the TUI\n  detail now loads and lists subtasks too.",
          "is_bot": false,
          "headline": "feat(ui): gradient logo and subtask progress bars",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:06:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69868fc676968bfd125ffa11c557395a5f5a0403",
          "body": null,
          "is_bot": false,
          "headline": "fix: keep REPL prompt input inside the box on wide terminals",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T15:59:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45daf1cb0bbeb8dfa2016bda605e0da8943c9d0c",
          "body": null,
          "is_bot": false,
          "headline": "docs: add MIT license",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T15:32:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffc87580b03039a124b63ba8e37c95d19670949c",
          "body": null,
          "is_bot": false,
          "headline": "chore: rename module path to github.com/mustachius/taskframe",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T15:09:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e1cba78a9e52885467c6b3cec55af717e38ebcc",
          "body": "Simplifica a saida para ASCII puro e reescreve a documentacao.\n\n- substitui os glifos decorativos de status por marcadores ASCII: as\n  mensagens de sucesso ficam sem prefixo, erros usam \"x\", tarefa ativa\n  usa [>] e recorrente usa ~ (ja eram os equivalentes do modo --ascii).\n- enxuga alguns comentar\n[…]\nmuns: features,\n  instalacao, uso, interfaces (REPL/CLI/TUI), tokens e datas, idioma,\n  temas, configuracao, dados e desenvolvimento.\n\nbuild + vet + gofmt + testes verdes; saida verificada no binario.",
          "is_bot": false,
          "headline": "cleanup: plain-ASCII output markers + English README",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T15:05:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "134c8e469b2ba81cb66635e073d2bebbd0aa7b1b",
          "body": "Torna o ingles o idioma padrao do TaskFrame (maior alcance do repo) e\nadiciona um comando para alternar para pt-br.\n\n- novo pacote leaf internal/i18n: catalogo de mensagens da camada de\n  apresentacao (map[string][2]string, [0]=en canonico, [1]=pt-br) com\n  Lang.T/Tf; helpers Normalize/Next. Nao imp\n[…]\n\n  novo internal/i18n test garante catalogo completo (en+pt) e fallback.\n\nbuild + vet + gofmt + testes verdes; verificado no binario (CLI en/pt,\n--lang sobrepoe setting, banner/help nos dois idiomas).",
          "is_bot": false,
          "headline": "i18n: ingles como idioma padrao + toggle pt-br",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T14:43:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f44955c14de9307123483250fd6bd1ff89ed453f",
          "body": "Substitui o banner (estrela + wordmark espacada) por um logo grande do\nnome do projeto em ASCII, estilo ANSI Shadow, colorido com o accent do\ntema. Sob --ascii usa um fallback figlet \"Standard\" de largura 1 para\nconhost legado. Mantem o subtitulo \"tarefas no terminal\".",
          "is_bot": false,
          "headline": "logo: TASKFRAME em ASCII art (ANSI Shadow) com fallback --ascii",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T14:05:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e3e3d0e8d8b180f2cb12cb69d0a73d58e32cb9b",
          "body": "Antes, edit <id> +tag substituía todo o conjunto de tags. Agora acumula:\ntask.MergeTags(existentes, add, remove) mantém as antigas, soma as +tag e\ntira as -tag (dedup, ordem preservada). cmdEdit passa a capturar o filtro\ndo ParseTokens para pegar as ExcludeTags (-tag).\n\nEx.: edit 1 +casa +mercado  (mantém as que já tinha)\n     edit 1 -urgente        (remove só essa)\n\nTestes: MergeTags (add/remove/dedup/vazio) e REPL edit acumula/remove tags.",
          "is_bot": false,
          "headline": "edit: +tag adiciona e -tag remove (não sobrescreve mais)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T17:40:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "601357837babe97dbdb01b111cdba165d35d1632",
          "body": "O import só entrava em banco vazio, o que impedia sincronização recorrente.\nAgora store.Import(d, replace) — com replace=true limpa tasks/notes/activity/\ntags na mesma tx (defer_foreign_keys) antes de restaurar, preservando ids\n(parent/notas/undo seguem válidos). CLI: import [--replace|-r] <arquivo>\n[…]\nh;\nPC B `pull`, `import --replace sync.json`.\n\nTeste: import --replace num banco não-vazio substitui e restaura exatamente;\nos testes de import em banco vazio (e a recusa sem --replace) seguem verdes.",
          "is_bot": false,
          "headline": "import --replace: sobrescrever banco para sync via git",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T17:22:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39040261583466b6dd532a92f3a454575511641b",
          "body": "Redo completo sobre o activity log, com semântica padrão de editor. O\nTaskwarrior não tem redo — aqui foi viabilizado por marcadores.\n\nMecanismo (store/activity.go):\n- Marcadores kind='undo'|'redo' cujo field guarda o op_id afetado.\n  lastMarkerExpr dá o marcador mais recente de um op: \"aplicado\" se\n[…]\nção por op novo, nada-a-refazer; REPL redo reconclui. Os testes de\nundo existentes seguem verdes.\n\nDoc: CLAUDE.md atualizado (estado v4 + decisão de audit log com undo/redo,\nsettings/contexts/config).",
          "is_bot": false,
          "headline": "Taskwarrior F5: redo (desfazer o desfazer)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T15:03:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a64f767e96315b8ecaec85e03cdcff46869924f7",
          "body": "Permite ajustar defaults e a fórmula de urgência sem recompilar, como o\n.taskrc do Taskwarrior.\n\ninternal/config: config.json (zero-dep) em %APPDATA%\\taskframe\\config.json,\noverride por TASKFRAME_CONFIG. Campos: theme, sort, urgency (mapa de\ncoeficientes). Arquivo ausente = zero config; JSON malform\n[…]\n no próximo boot.\n\nTestes: config.Load (ausente/válido/malformado); ConfigureUrgency\n(override aplica, não-especificado mantém default, chave desconhecida\nignorada, reconfigura a partir dos defaults).",
          "is_bot": false,
          "headline": "Taskwarrior F4: arquivo de config (.taskrc)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T14:54:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce70162307153fd557cbd35d7580ae483c3eef26",
          "body": "Marca uma tarefa como em andamento, como o `task start`/`task stop` do\nTaskwarrior — some urgência e ganha a tag virtual/report ACTIVE.\n\nEsquema/modelo:\n- Migration 3 (aditiva): ALTER TABLE tasks ADD COLUMN start TEXT.\n- Task.Start *time.Time + Task.IsActive(); incluído no scan, nos 3 SELECTs\n  (Get\n[…]\n/CLI; linha\n\"iniciada ▶ <data>\" no detalhe do REPL.\n\nTestes: store (start/stop, urgência sobe, ActiveOnly, undo reverte start\ne stop, export/import preserva start); REPL (start ativa + report active).",
          "is_bot": false,
          "headline": "Taskwarrior F3: start/stop (tarefa ativa)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T14:51:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e80fbb935d4ad0172e63c5d3aff93c2c523e2e5a",
          "body": "Um contexto é um filtro nomeado que passa a valer em toda listagem até\nser desativado — como o `task context` do Taskwarrior.\n\nStore (internal/store/context.go), sobre a tabela settings (preferência\nde máquina: não loga em activity, fora do export):\n- ActiveContext/SetActiveContext, DefineContext/Co\n[…]\n (ativa, valida que existe),\ncontext none, context delete <nome>.\n\nTestes: store (define/ativa/ContextFilter/delete limpa ativo); REPL\n(contexto filtra a lista, título mostra @nome, nocontext ignora).",
          "is_bot": false,
          "headline": "Taskwarrior F2: contexts (filtro default salvo)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T14:43:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "51044bf5691ac17ac5b76a18b2ace356a9fdb6e5",
          "body": "Base da gramática estilo Taskwarrior, compartilhada por CLI e REPL.\n\nSeleção:\n- task.ParseIDSpec: aceita \"1\", \"1,5\", \"1-3\", \"1-3,5\" (dedup, ordem\n  preservada, cap de range). Substitui os dois parseIDs duplicados de\n  CLI e REPL; done/del passam a aceitar ranges e listas.\n\nFiltros:\n- Filter.ExcludeT\n[…]\n filho sob o cursor via input\n  inline (modeAddChild), sem digitar id.\n\nTestes: ParseIDSpec, -tag/status:, reports/Merge, List ExcludeTags,\nreport abre overlay, done por range, add-child sob o cursor.",
          "is_bot": false,
          "headline": "Taskwarrior F1: ranges de id, filtros com negação, reports nomeados",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T14:37:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "016e561352d8c39b4ee68c00779b14e1b09f8b3f",
          "body": "Subtarefas já existiam no núcleo (parent_id, BuildTree, CheckMoveCycle,\nundo de reparent) e na TUI clássica, mas o REPL — a interface padrão —\nmal as expunha. Este commit traz essa UX ao REPL e uniformiza a árvore\nentre REPL e CLI.\n\nNúcleo:\n- store.Children(parentID): filhos diretos não-deletados, o\n[…]\nssa a usar os mesmos conectores de árvore do REPL.\n\nTUI clássica: inalterada (referência).\n\nTestes: store.Children; REPL sub/add-validado, flatten+collapse, árvore no\noverlay e detalhe com pai/filhos.",
          "is_bot": false,
          "headline": "Subtarefas no REPL + paridade na CLI",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T13:40:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d4fb499a13d66652b548e93986bd935fe8da7d3",
          "body": "- internal/repl: REPL inline (sem alt-screen), banner com logo, prompt\n  arredondado, saida no scrollback via tea.Println; overlay de lista\n  navegavel + detalhe; comandos naturais + /slash; historico e Tab\n- Norton Commander vira 'taskframe classic'; CLI one-shot inalterada\n- Fase 0 compartilhada: \n[…]\n/ui (tema extraido do\n  tui via shim), store.CheckMoveCycle\n- install.ps1: instala como comando global do usuario (PATH idempotente)\n- ~10 smoke tests do REPL (seam model.transcript); docs atualizadas",
          "is_bot": false,
          "headline": "v3: interface REPL inline estilo Claude Code (novo padrao)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-12T19:29:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e77959d358d961ac2d155527c5d222e0c20d339f",
          "body": "- 4 temas (dark/borland/green/amber) trocaveis com 't', persistidos em\n  settings (migration 2); padrao novo 'dark' usa o fundo do terminal no\n  lugar do azul ANSI-4 que cansava a vista; --theme e TASKFRAME_THEME\n- Sidebar: filtros virtuais Hoje/Atrasadas/Semana/Aguardando + tags\n- Form/detail: camp\n[…]\nersistida\n- F6/m: mover tarefa (projeto/pai) com validacao de ciclo\n- CLI export/import JSON com ids preservados (undo sobrevive ao restore)\n- CI GitHub Actions (vet+test ubuntu/windows, gofmt ubuntu)",
          "is_bot": false,
          "headline": "v2: sistema de temas, filtros virtuais, sort, mover, export/import",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-12T13:20:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e9a24a3166e74536e125a195432a65c172c7bac",
          "body": "Go + Bubble Tea + SQLite (modernc, sem CGo). TUI de dois paineis com\nbordas duplas e F-key bar; CLI de captura rapida estilo taskwarrior.\nTarefas, subtarefas aninhadas, projetos hierarquicos, notas, activity\nlog completo com undo por op_id, urgency score, recorrencia, filtros\ne busca.",
          "is_bot": false,
          "headline": "TaskFrame v1: gerenciador de tarefas TUI estilo Norton Commander",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-12T13:09:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 3,
      "commits_last_year": 73,
      "latest_release_at": "2026-07-17T12:40:35Z",
      "latest_release_tag": "v0.2.1",
      "releases_from_tags": true,
      "days_since_last_push": 4,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 1.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/mustachius/taskframe",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/mustachius/taskframe",
          "is_deprecated": false,
          "latest_version": "v0.2.1",
          "repository_url": "https://github.com/mustachius/taskframe",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-17T12:40:35Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 4,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-07-17",
            "count": 2
          },
          {
            "date": "2026-07-18",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_stars": 4
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 32071,
      "source_files_sampled": 73,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/glamour",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/harmonica",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1-0.20250404203927-76690c660834"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.6"
        },
        {
          "name": "github.com/muesli/termenv",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.16.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.53.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": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "mustachius",
          "commits": 73,
          "avatar_url": "https://avatars.githubusercontent.com/u/10211078?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "vhs.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": null,
            "reason": "no pull request found",
            "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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 10,
            "reason": "all dependencies are pinned",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "ccda7206b0f1b7be5bd314a6741505d75b7ad181",
        "ran_at": "2026-07-21T21:17:14Z",
        "aggregate_score": 3.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/mustachius/taskframe",
    "host": "github.com",
    "name": "taskframe",
    "owner": "mustachius"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 43,
      "inputs": {
        "security": 34,
        "vitality": 68,
        "community": 28,
        "governance": 33,
        "engineering": 48
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "commits_last_year": 73,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "73 commits in the last year",
                "points": 16.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 73
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": 88,
            "inputs": {
              "releases_count": 3,
              "latest_release_tag": "v0.2.1",
              "releases_from_tags": true,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 1.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.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": 28,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 0,
              "stars": 4,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "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": 22.5,
                "status": "met",
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 33,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "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": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 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": 47,
            "inputs": {
              "followers": 8,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "mustachius",
              "public_repos": 14,
              "account_age_days": 4235
            },
            "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": "8 followers of mustachius",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 8,
                      "login": "mustachius"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "14 public repos, account ~11 yr old",
                "points": 20.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 14
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/mustachius/taskframe"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "3 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 48,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "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": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 34,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 34,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.4
            },
            "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "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": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 63,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "73 of 73 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 73,
                      "sampled": 73
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "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": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 73",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 73
                    }
                  }
                ],
                "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": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 32071,
              "source_files_sampled": 73,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/73 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 73,
                      "oversized": 0
                    }
                  }
                ],
                "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T21:17:18.910328Z",
  "schema_version": "0.23.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mustachius/taskframe.svg",
  "full_name": "mustachius/taskframe",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.23.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计Go.