Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 03:07 UTC

mitch308 / jenkins-tools

TypeScript · JavaScriptNo license detected★ 0 stars⑂ 0 forkssince Jul 2026View on GitHub ↗

mitch308/jenkins-tools holds a health index of 48 out of 100, placing it in the At risk band. It scores highest on AI Readiness (74/100) and lowest on Community & Adoption (23/100). It was last updated 4 days ago.

48
overall / 100
At risk

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

48
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

洪城城Personal account
0 followers11 public repossince Oct 2014

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npmjenkins-tools-cli0.6.32,627154 days agojenkinsclijenkins-clici-cdbuilddeployautomation

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

69Moderate · 22% of overall
How it's scored
36/36Push recency — last push 4 days ago
2.1/36Commit cadence — 3/52 weeks with commits
18/18Commit volume — 108 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year108
human_commit_share1
days_since_last_push4
active_weeks_last_year3
How it's scored
16.2/27Ships releases — 13 version tags (no GitHub releases)
36/36Release recency — latest release 4 days ago
27/27Release cadence — a release every ~0.9 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count13
latest_release_tagv0.6.3
releases_from_tagsyes
days_since_latest_release4
mean_days_between_releases0.9
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

23Critical · 18% of overall
How it's scored
0/60Stars — 0 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
0/22.5License — no license file detected
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
45.6/80Monthly downloads — 2,627 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesjenkins-tools-cli
dependents
ecosystemsnpm
total_downloads
monthly_downloads2,627
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

42At risk · 24% of overall
How it's scored
0/46.8Issue resolution — no issues or no data
0/38.3PR acceptance — no decided pull requests or no data
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
0/25Owner reach — 0 followers of mitch308
19.9/25Track record — 11 public repos, account ~11 yr old
Inputs used
followers0
owner_typeUser
is_verified
owner_loginmitch308
public_repos11
account_age_days4,303
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 4 days ago
20/20Version history — 15 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesjenkins-tools-cli
ecosystemsnpm
any_deprecatedno
min_days_since_publish4

Engineering Quality

Are baseline engineering and documentation practices in place?

62Moderate · 20% of overall
How it's scored
24/24CI workflows — 1 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.

Documentation

65Moderate
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
0/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionno

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

40At risk · 16% of overall
How it's scored
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 — no data
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
0/2.5License — license file not detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4
Excluded from scoring (no data or not applicable): ci_tests, signed_releases. Remaining weights renormalized.

AI Readiness

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.

74Good · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md, src/skills/jenkins-tools/AGENTS.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 87 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.87
agent_instruction_filesCLAUDE.md, src/skills/jenkins-tools/AGENTS.md
agent_instruction_max_bytes6,387
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 73 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstsconfig.json
agent_commit_share0.73
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
55/55Manageable file sizes — 0/21 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes29,650
source_files_sampled21
oversized_source_files0

Key facts

0GitHub stars
-contributors
108commits, last 12 months
4days since last push
13releases
-bus factor
0open issues
npmpackage ecosystems

Data collection warnings

  • Contributor list unavailable
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:jenkins-tools-cli@0.6.3; advisories assessed against the repository dependency graph instead

More detail

OpenSSF Scorecard 4.0 / 10
4.0aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-22 03:07 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-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
0Licenselicense file not detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 5
RegistryPackageVersion constraintManifest
npmchalk^5.6.2package.json
npmcommander^15.0.0package.json
npminquirer^14.0.2package.json
npmjs-yaml^5.2.1package.json
npmora^9.4.1package.json
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 384,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "JavaScript": 26594,
        "TypeScript": 100027
      },
      "pushed_at": "2026-07-17T07:48:25Z",
      "created_at": "2026-07-07T02:38:14Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T07:48:33Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "洪城城",
      "type": "User",
      "login": "mitch308",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/9126262?v=4",
      "created_at": "2014-10-10T03:00:26Z",
      "is_verified": null,
      "public_repos": 11,
      "account_age_days": 4303
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-07-17T07:41:06Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-07-15T11:26:02Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-10T08:10:14Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-07-10T07:09:31Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-10T06:03:42Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-07-09T12:30:56Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-09T12:13:36Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-07-09T11:50:26Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-07-09T11:37:33Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-07-09T10:52:49Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-09T09:52:43Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-07-09T03:30:05Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-07-08T02:22:42Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "58b291d2500c575bcdbbdf45efaeba4743c4eb35",
          "body": null,
          "is_bot": false,
          "headline": "docs: CLAUDE.md 改为中文",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-17T07:45:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8231b9eb56e567135ed5e8347eb25f39676fdccd",
          "body": null,
          "is_bot": false,
          "headline": "0.6.3",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-17T07:41:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db3ce42bb7146e79eb764be865742aa94fea95ac",
          "body": "构建进行中时,使用 Date.now() - timestamp 计算已持续时间,\n替代原来的破折号/0s 显示,与 job-select 向导行为一致",
          "is_bot": false,
          "headline": "feat: status 构建中显示已持续时间",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-17T07:38:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1dc62bd3140a20d2115b9e7ad30a3327e90cc4bd",
          "body": null,
          "is_bot": false,
          "headline": "0.6.1",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-15T11:26:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "059f2b920c3a31e05ad50cfe45bfcce9dd3ac327",
          "body": "- build() 触发后立即用 nextBuildNumber+队列位置推算构建号写入记录,\n  替换原 10s 轮询 waitForBuildNumber(排队超时会丢失构建号)\n- showRecentBuilds 改用记录自身 buildNumber 查询真实状态,\n  不再用 getLastBuildSummary 查当前最新构建号(导致同 job 多条记录显示同一号)\n- URL 按状态显示:已执行显示构建地址,排队中显示队列地址\n- 默认显示最近 10 条记录(原 20 条)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 真实构建号记录与 status 显示",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-15T11:21:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "50b50b71ed4468908fe40c1d6a55e4bb62550c0d",
          "body": null,
          "is_bot": false,
          "headline": "0.6.0",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T08:10:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9e2e4275e8c67f46b0f989510a4f86571e4ba48",
          "body": "- remove-skills: list each deleted file/directory path before removal\n- remove-skills: show full path in success messages\n- setup-skills: Ctrl+C during inquirer prompt now returns empty\n  array instead of falling through to auto-install on all platforms\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: enhance remove-skills logging and fix Ctrl+C in setup-skills",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T08:06:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "93420d8fcf82a55e65746e860d99d22440a6c547",
          "body": "- Uninstall skill from specified or all installed platforms\n- Default: auto-detect platforms where skill is installed\n- --platform <name>: remove from specific platform\n- --all: remove from all platforms\n- --dry-run: preview without deleting\n- Also removes universal symlink at ~/.agents/skills/\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add jkt remove-skills command",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T07:59:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7bf890e0abe7c0a5b5622a650a79b1d8c9146825",
          "body": "- Rewrite installForPlatform() in setup-skills.ts to use fs.cpSync,\n  fs.symlinkSync, fs.rmSync instead of calling external shell scripts\n- Delete install.ps1 and install.sh (no longer needed)\n- Fixes Chinese garbled output on Windows (PowerShell 5.1 codepage issue)\n- Single cross-platform implementation, no more dual script maintenance\n- Cursor .mdc generation and universal symlink done in TypeScript\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: replace install.ps1 + install.sh with Node.js fs operations",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T07:51:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7a9702d1d3718e167ed2ab753f4febd09ff61760",
          "body": "PowerShell 5.1 -File mode always uses system codepage (GBK on Chinese\nWindows), and there's no reliable way to force UTF-8 output through\nexecSync stdio:inherit. chcp 65001 and [Console]::OutputEncoding both\nfail in this mode.\n\nSolution: change all install.ps1 output messages to English, which is\nASCII-safe and never garbled regardless of codepage. Revert setup-skills.ts\nback to -File invocation.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use English output in install.ps1 to avoid Chinese garbled text",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T07:40:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fffa72319ee44316b60fb852dfd8e8efe4f6913a",
          "body": "Add 'chcp 65001' before Console encoding settings — PowerShell 5.1\nWrite-Host uses the console code page, not [Console]::OutputEncoding.\nWithout chcp, Chinese characters are displayed as mojibake.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: fix Chinese garbled output in install.ps1",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T07:27:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4441e3e051fb35d240e6782c68ffecc434b421d6",
          "body": null,
          "is_bot": false,
          "headline": "0.5.1",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T07:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7ae6f1874e8a8df2adc988eb2461da0b93a5a6c",
          "body": "…content\n\nSKILL.md: 409→136 lines (-67%)\n- Remove '触发方式' section (skill already activated by description)\n- Remove role preamble (redundant when skill is active)\n- Remove '工作流示例' section (duplicates core operations)\n- Remove '决策流程' ASCII flowchart (same logic as build steps)\n- Remove '使用技巧' (redunda\n[…]\nor to single line\n\nAGENTS.md: 59→17 lines (-71%)\n- Remove '激活触发' section (frontmatter handles this)\n- Remove sectioned layout, use compact command table\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: trim skill files — remove redundant trigger/role/duplicate …",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T06:34:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15eec5a699cbba565111998566c434ff4e0034db",
          "body": "Revert commit 78a230f that over-compressed SKILL.md and AGENTS.md.\nFull documentation is preferred over token savings.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "revert: restore full skill documentation",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T06:22:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "78a230f2ab961371de5cbfd8a3e014c1f77a6631",
          "body": "SKILL.md: 409→77 lines (-81%)\n- Replace verbose examples with compact command reference table\n- Inline JSON output format instead of separate examples\n- Remove duplicate content (examples overlapped with core operations)\n- Remove verbose decision flowchart (replaced by concise build flow)\n- Merge er\n[…]\n- Key content inlined into SKILL.md command table\n- Agent cannot actively read reference files at runtime\n\nTotal: ~750 lines → ~97 lines, ~22KB → ~3.2KB\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: optimize skill files to reduce token consumption by 85%",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T06:18:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc63694162f71dc3cb0fe89e4a86541463cbfeff",
          "body": "- README.md: add params/update commands, local cache feature, build without job\n- CLAUDE.md: update build [job] syntax, param cache, update command, uno-choice regex\n- SKILL.md: add jkt update section, clarify build without job behavior\n- AGENTS.md: add params and update command examples\n- references/jkt-commands.md: add jkt update docs, build without job\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update all docs for recent feature changes",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T06:11:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5e535a9b722d35c9ee3aaf3893cfba04609fb498",
          "body": null,
          "is_bot": false,
          "headline": "0.5.0",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T06:03:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e6ac7581ed780b840b325ae722eea963682c46f",
          "body": "- Change build <job> to build [job] (optional argument)\n- When no job is provided, run the full wizard flow:\n  auth → job-select → params → execute\n- Same behavior as running jkt without arguments\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: jkt build without job runs full wizard (same as jkt)",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T06:02:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "65c2114ba1eee3862a4750bafcc9ba6e0be78994",
          "body": "parseUnoChoiceScript used a non-greedy regex return\\s*\\[([\\s\\S]*?)\\]\nthat stopped at the first ']' — but choice values like\n'小密盒(xmh)[pc-enterprise]:selected' contain inner brackets, so the\nlist content was truncated and items extraction returned empty.\n\nChange the regex to match to the end of the return statement\n(\\]\\s*$) so the full list is captured before extracting quoted items.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: uno-choice script parsing when choice values contain brackets",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T05:53:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0240af64270bf1a004c7937cce28b0d7c39c08a5",
          "body": "Remove .jenkinsrc.yml and .jenkins-history.json from .gitignore so\nthese config templates can be tracked in the repo.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove config file entries from gitignore",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T04:02:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "502791980777f4506223929daa05d24ca8706cb6",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: remove CI workflow",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T03:56:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "062764f43c3cd7743e7e6d2fc678b222a6cfe24a",
          "body": "- Remove automatic update check on every command invocation\n- Remove checkUpdate/printUpdateNotice/waitForUpdateCheck from index.ts\n- Add jkt update command to check and install latest version\n- Add jkt update --check to only check without updating\n- Simplify update.ts to checkAndUpdate() function\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: replace auto update check with jkt update command",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T03:54:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "50bfc5bb36a900a473168235c7394c01f98a9fbc",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: simplify CI to only check Node.js 22",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T03:49:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e0297191f36c942a4d22c9aeaaae9739cd5e77f",
          "body": "- getBuildStatus now extracts params and userName from build actions\n- findQueuedItem now extracts params and userName from queue actions\n- BuildStatus and QueueItemInfo interfaces add params/userName fields\n- Single build status output shows params and user info\n- Queued build output shows params and user info\n- Pending build output shows params\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: status command shows build parameters and trigger user",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T03:46:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ed16cd4fa76373d830833bc0f1450919c3ee7079",
          "body": "- jkt params now reads from local cache by default (fast, offline)\n- Add --remote flag to fetch from Jenkins and update cache\n- Add --sync flag to sync param key changes (remove deleted, add new with defaults)\n- JSON output adds source/lastParams/sync fields for agent usage\n- Wizard prioritizes loca\n[…]\nparam cache after -p builds\n- Update SKILL.md agent flow to use lastParams for faster builds\n- Fix --json short flag -j conflicting with global -j/--job\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: params command local cache priority + remote sync",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-10T03:38:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eaae936f7c3895bb8ddc8a8fb74679035d2ac7e1",
          "body": null,
          "is_bot": false,
          "headline": "0.4.1",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T12:30:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "675fd8a7140da47af769b24517a4790a7bd508f6",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.4.0",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T12:21:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2e4eed19bdf67d3197f878b9436ef2ab123943e1",
          "body": null,
          "is_bot": false,
          "headline": "0.4.0",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T12:13:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8b04fe95c6bbd90a405f4d33057d0e005aa9863",
          "body": "- package.json: use 'install' hook calling postinstall-hint.js\n  (npm v7+ skips postinstall on global install, but install hook runs)\n- scripts/postinstall-hint.js: pure JS, only prints hint message\n- setup-skills.ts: remove showInstallHint/isNpmInstallHook logic,\n  focus on actual skill installation only\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: separate install hint into scripts/postinstall-hint.js",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T12:10:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4e74b3b9c0301c30aaaa7fdcaab1802df724e31d",
          "body": "npm v7+ skips postinstall on global install, but the install hook\nstill runs. Rename postinstall → install in package.json and update\nlifecycle event detection to match both install and postinstall.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use install hook instead of postinstall for global install hint",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T12:02:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52c9a48d1d1a357bdeb6e106f27a0491be0d4e40",
          "body": "… wizard\n\nnpm postinstall sets npm_lifecycle_event=postinstall, detect this\nand show the hint box instead of launching inquirer interactive\nselection. Users can run 'jkt setup-skills' later to actually install.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: show skill install hint on global install instead of interactive…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T11:57:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "23b9519d0fd7c8f4e88327018c0d39bddafde2ef",
          "body": null,
          "is_bot": false,
          "headline": "0.3.3",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T11:50:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49ddc4112732be93dc0e42cfdcc137bbbac3e8f4",
          "body": "Replace bare 'return' with 'process.exit(0)' in abort command action\nhandler. Inquirer's readline interface can keep the event loop alive,\ncausing the process to hang after the action function returns.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: jkt abort not exiting after operation completes",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T11:43:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "34924783fc393a347bf6b113a655626bae6aa901",
          "body": null,
          "is_bot": false,
          "headline": "0.3.2",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T11:37:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0b909b87703c619fdac2ae5987ab10fbd3c52b5",
          "body": "Node 18 build fails (ESM dependency compat), Node 20 deprecated on\nGitHub Actions. Update engines to >=20.0.0.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: update CI node version matrix to 20/22/24, drop Node 18",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T11:30:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9fdb4e13d7d63e427b06797ef4f39fb6bd1a79d5",
          "body": "…sion/help\n\n- setup-skills: detect npx execution, check global install and version\n  match; warn if no global install or version mismatch\n- update.ts: expose waitForUpdateCheck() for quick-exit commands\n- index.ts: await update check before -v/-h so upgrade notice appears\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: npx global install check for setup-skills & update check on ver…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T11:28:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f4d811ca9aa46c7b83e28c7cf52bae12231444c9",
          "body": "When jkt is installed globally in non-TTY mode (e.g. npm install -g),\ndisplay a prominent hint box showing how to install skills for\ndetected AI tools, instead of a single-line skip message.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: show skill install hint after global install/update",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T11:15:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b4c16edcbe052090920fde6e68c1cb0a5cec8ee",
          "body": "- ci.yml: build check on push/PR to main (Node 18/20/22 matrix)\n- publish.yml: auto publish to npm on v* tag push (with provenance)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add GitHub Actions CI and npm publish workflows",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T11:11:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "28f791695e6cfea4dfd10d345cf609eece497cba",
          "body": null,
          "is_bot": false,
          "headline": "0.3.1",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T10:52:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43c9a0b75a814dfce7f24a2589630410744b3c1d",
          "body": "Revert non-TTY auto-install behavior. postinstall runs in non-TTY\nso it will skip with a hint to run 'jkt setup-skills' manually.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: do not auto-install skills in non-TTY environment",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T10:51:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9e69f04e68e9bcb433cdb78ceab1582cbd7b453b",
          "body": "…-8 encoding\n\n- postinstall now auto-installs to all detected platforms instead of\n  skipping in non-TTY environments (npm install -g works correctly)\n- Interactive selection only happens in TTY mode (jkt setup-skills)\n- Add [Console]::OutputEncoding = UTF8 in install.ps1 to fix Chinese\n  garbled output in Git Bash / MINGW64 terminals\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: auto-install skills in postinstall (non-TTY), fix PowerShell UTF…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T10:49:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "069a3354c45d36691f7fc37594aabfdbd64bb4ad",
          "body": null,
          "is_bot": false,
          "headline": "0.3.0",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T09:52:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfb6f1286c3789e032b644c72fadad415e39fbf5",
          "body": "- jkt config remove <name>: remove a server profile\n  (auto-switches default if removing the current default,\n   warns about jobs referencing the removed profile)\n- jkt config test [name]: test connection for a specific server\n  (defaults to current default profile if name omitted)\n- Update SKILL.md and references with new config commands\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add config remove command, support config test with server name",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T09:46:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "02d966abc3fcdb184893d1658e407ae12fff8274",
          "body": "… flow\n\n- Add jkt params <job> command to query job parameter definitions\n  (--json flag for machine-readable output, human-readable by default)\n- Update SKILL.md with agent-driven build workflow:\n  1. jkt params <job> --json to get parameter definitions\n  2. Agent asks user to confirm/modify parame\n[…]\n -p in agent (non-TTY) environment\n- Update decision flow and workflow examples in SKILL.md\n- Update references/jkt-commands.md with params command docs\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add jkt params command, update skill for agent-driven parameter…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T09:42:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4538395cc87793b1e64f114e2d437a4be5268847",
          "body": "…n, i18n install scripts\n\n- Rename directory and name field from jenkins-tools-skill to jenkins-tools\n  (slash trigger /jenkins-tools now matches directory name)\n- Add interactive multi-select platform selection in setup-skills.ts\n  (uses inquirer checkbox, auto-detects installed platforms)\n- Simpli\n[…]\n)\n- All install script output text now in Chinese\n- Fix PowerShell variable scope issues (: prefix)\n- Fix $MyInvocation.PSCommandPath null in -File mode\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: rename skill to jenkins-tools, add interactive platform selectio…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T09:26:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5855f96b6a174d4e3bd12d76833b934ca775cbd3",
          "body": "…tandard)\n\n- Add SKILL.md + AGENTS.md following Agent Skills Open Standard\n- Support 17 platforms: Claude Code, Cursor, Copilot, Codex, Gemini,\n  Windsurf, Cline, OpenCode, Kiro, Goose, Roo Code, Kilo Code,\n  Trae, Junie, Factory Droid, Antigravity, Universal\n- Add install.sh (POSIX) + install.ps1 (\n[…]\n in Chinese (consistent with CLI i18n)\n- CI/TTY detection: skip in CI, skip in non-interactive terminals\n- Idempotent: repeated installs replace cleanly\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add cross-platform agent skills system (v2, Agent Skills Open S…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T09:00:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bad4bd6125d0adb219721dfe819cf240e2e8bdea",
          "body": "Remove setup-skills.ts, copy-skills.js, src/skills/ directory, and\nthe skills design document. Update package.json (remove postinstall,\nsetup-skills scripts and copy-skills build step), CLAUDE.md, and\nREADME.md to reflect the removal.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove agent/IDE skills installer and related files",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T03:47:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6673792589847a9bb5478356d1a213bb2eb109c7",
          "body": null,
          "is_bot": false,
          "headline": "0.2.3",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T03:30:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ab93120d87a770b5114ffffde0a0d06462f68ca",
          "body": "- Add #!/usr/bin/env node shebang so npm generates correct .cmd wrapper\n  on Windows (fixes jkt opening file instead of running)\n- Sort queued items by build number descending in getRecentBuilds()\n  so newest queued builds appear first\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add shebang to index.ts and sort queued builds descending",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-09T03:28:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "292da10e205c16c8b27c82c168ea37c4b72e4e19",
          "body": null,
          "is_bot": false,
          "headline": "docs: add version management and i18n conventions to CLAUDE.md",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T02:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cad89227b5642b5d4b39a495736b5b7d808f2da",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.2",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T02:22:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48ec2c10404537c18a10ae095af92d2bdb207866",
          "body": "- Top-level description, version, help option\n- All subcommand help options\n- Config command help subcommand",
          "is_bot": false,
          "headline": "i18n: translate all CLI help text to Chinese",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T02:18:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc23393ec369209a2651109fd52785fa6b85aeb9",
          "body": null,
          "is_bot": false,
          "headline": "fix: use -v instead of -V for version flag",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T02:12:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b044cac00ec3c299591a2f1189347cbad3f6ed33",
          "body": "- Check latest version from npm registry at startup (non-blocking)\n- Print update notice at process exit if newer version exists\n- 3s timeout, silently ignores network errors",
          "is_bot": false,
          "headline": "feat: async npm update check with notice on exit",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T02:08:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61775fe91fd8276a40bed0e4ae43e07ad8164fb4",
          "body": null,
          "is_bot": false,
          "headline": "refactor: extract skills copy script from inline build command",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T02:02:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a1dad8489b77107ee96cd80b57eaa668f98440b",
          "body": null,
          "is_bot": false,
          "headline": "build: use rimraf to clean dist/ before compilation",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T01:56:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "530481fd6d3ea7efe3099df9726248174341a1c6",
          "body": null,
          "is_bot": false,
          "headline": "build: clean dist/ before compilation to remove stale files",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T01:49:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0951429e4f43a0486284d6f79cd6610b1d240748",
          "body": "Use createRequire to import package.json version at runtime,\neliminating the need to manually sync version in index.ts.",
          "is_bot": false,
          "headline": "refactor: read version from package.json instead of hardcoding",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T01:48:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8300d449d0967f54d58f4e5cb473cc6deefa71c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.1",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-08T01:45:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "faf4bb27a5e5c0219c07cefe313a6c02f54e0f05",
          "body": "Jenkins with CSRF protection rejects POST requests (build, abort, etc.)\nwith 403 when using password authentication. The crumb validation\nrequires both the Jenkins-Crumb header AND the session cookie from the\ncrumb fetch request.\n\nChanges:\n- Add cookie jar to JenkinsService that collects Set-Cookie headers\n- Auto-fetch crumb from /crumbIssuer/api/json before first POST\n- Send cookies on all subsequent requests\n- Include crumb header on POST requests via getCrumb() + extraHeaders",
          "is_bot": false,
          "headline": "fix: add CSRF crumb and session cookie support for password auth",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T10:55:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6c8fc049ae2cf1e68a48f64bd7492202782511b",
          "body": "- Delete src/commands/run.ts (redundant with default command)\n- Move -j/--job option to top-level jkt command\n- Update all skills/docs to remove jkt run references\n- Add config add/use to skills documentation",
          "is_bot": false,
          "headline": "refactor: remove jkt run, promote --job to top-level option",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T10:37:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9020b20dcc4dac37c227b2c96927e91fd2dcaeeb",
          "body": "- jkt config add <name>: interactively add a new server profile\n- jkt config use <name>: switch the default server profile\n- Export promptProfileDetails from auth.ts for reuse\n- Update README with new config commands",
          "is_bot": false,
          "headline": "feat: add config add/use commands for managing server profiles",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T10:28:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "818a06aedb2210649b9820d2a645e8034f1b92c3",
          "body": "- Add pending/queued status icons to all docs and skill files\n- Add status icon table to README\n- Update repo URL in README and package.json\n- Note Agent/IDE Skills as untested\n- Bump version to 0.2.0\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update docs and skills for v0.2.0",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T07:54:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bd9a32ba38e4a167bed5b709574bf803dea7d304",
          "body": "- 120s → 2m0s, 3665s → 1h1m5s, 45s → 45s\n- Applies to both status --recent and status -n outputs\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: display build duration in h/m/s format",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T07:45:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6bee096fce64fb5144cafc823d82041276ea4f7f",
          "body": "Jenkins queue items don't always have executable.number assigned\nbefore the build starts. Use the job's nextBuildNumber to compute\nthe build number for queued items sequentially:\n- Items with executable.number already set → use it\n- Items without → assigned from nextBuildNumber in order\n\nThis fixes:\n[…]\n <job> -n 453 now correctly finds queued item #453\n- jkt status <job> -r 10 shows correct #number for queued items\n  instead of #0 or queue#<id>\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: compute buildNumber for queued items using nextBuildNumber",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T07:38:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9fa6dc807cb3d6e0f0dc2603fa13cc114c6f615c",
          "body": "When a build is queued but executable is null (buildNumber not yet\nassigned), it should still be returned as a match — it could be the\nbuild the user is looking for. Only skip when executable.number is\nexplicitly assigned and doesn't match.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: findQueuedItem matches queued items without assigned buildNumber",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T07:33:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8d2ebab1881e0f848a12aef0f289f0450be2f70c",
          "body": "…itives\n\n- Add optional buildNumber param to findQueuedItem()\n- status -n: pass buildNumber so #455 won't match queue item for #452\n- abort interactive list: pass r.buildNumber for accurate queue matching\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: findQueuedItem now matches by job+buildNumber to avoid false pos…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T07:30:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "445ce60ad59bca1e77b297fd4828cc367e65f6a2",
          "body": "- Build API accessible but result=null + building=false → show ⏳ 待执行\n- Build API 404 → fallback to queue search (findQueuedItem) → show ⏳ 排队中\n- Log query on pending build → graceful error instead of crash\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: jkt status <job> -n <number> now handles pending/queued builds",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T07:18:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb4d0f84d4c00ac2377b86b25b4c1e472270a4a8",
          "body": "… --recent\n\n- Identify builds with result=null && building=false as pending\n- Add pending field to BuildSummary interface\n- Dedup queued items that already have a buildNumber from builds list\n- Display pending builds with ⏳ 待执行 (blue) status\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: show pending builds (assigned number but not started) in status…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T07:06:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "004e327177d75d2096dd44597c5319ccf258eb55",
          "body": "- Extract parameters from queue item actions (ParametersAction)\n  for queued builds and from build actions for completed builds\n- Add params field to BuildSummary interface\n- Display params as key=value on a second line in status output\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: show build params in status --recent output",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T06:58:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ecafc85bb9f5a5e690a84da40313b7cfb8a6f441",
          "body": "- getRecentBuilds now queries Jenkins queue API first to find\n  queued items for the job, then merges with completed builds\n- BuildSummary adds queued, queueId, queueWhy fields\n- status output shows queued items with ⏳ 排队中 and queue#<id>\n  label, including queue reason (why) in description\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: show queued builds in status --recent output",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T06:54:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52e3a9bd2055b58e1d484031660dfab45f26a8f6",
          "body": "- Config (.jenkinsrc.yml) and history (.jenkins-history.json) now\n  stored in ~/.jkt/ instead of project cwd, making global npm install\n  work from any directory\n- Add src/config/paths.ts to centralize path resolution\n- Remove cwd parameter from all commands, wizard modules, loader, store\n- Update CLAUDE.md and README.md docs\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: move config files to global ~/.jkt/ directory",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T06:39:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f60f1f1884abdf52c971143b66c41a7ff02df7dc",
          "body": "…ent skills\n\n- abort: handle queued (not-yet-started) builds via Jenkins queue API\n  (cancelQueueItem, getQueueItemStatus, findQueuedItem)\n- status: add -r/--recent <count> to list recent N builds for a job\n  with trigger user and description info\n- skills: expand Claude Code (commands+skills+agents\n[…]\nix OpenCode (agents/*.md + opencode.json\n  agent field instead of invalid commands), update Codex content\n- docs: update CLAUDE.md and README.md\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: support queued build abort, status --recent, and enhance IDE/ag…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T05:57:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "33d4f76c07690e68079e718e04260157f4f2bf7a",
          "body": "- Add skill templates for Claude Code, Cursor, Codex, OpenCode\n- Add setup-skills.ts: interactive installer triggered by npm postinstall\n- Supports idempotent install/uninstall via markers\n- CI/non-TTY environments auto-skip with manual fallback\n- jkt abort now accepts optional [job] argument\n- Update CLAUDE.md and README.md\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add agent/IDE skills system with postinstall installer",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T03:36:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "68401552a9318d82782bcdce8e8965ed3224cdc2",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add agent/IDE skills system design spec",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T03:27:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "82d35c5d06747efec1182702e6bffa05f56813ac",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update README with all commands and features",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T02:33:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "825c914bf53db97730f412103d0dfa63eb17437d",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove unnecessary prepack script",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T02:25:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4fead10557ee45ddd4edeea9ad927f92bbb542e5",
          "body": "- Add .npmrc with official npm registry\n- Rename package to jenkins-tools-cli (jenkins-tools was taken)\n- Add 'files' field to include only dist/ in published package\n- Add prepublishOnly and prepack scripts\n- Add engine requirement: node >= 18.0.0\n- Add more keywords for discoverability\n- Verified with npm pack --dry-run (28.1 kB, 50 files)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: configure npm publishing with .npmrc and package.json updates",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T02:19:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a584ab3d09c022453e5231d651d46cfa66534e2",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract stripAuthFromUrl to shared utils/output module",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T02:16:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "be67096c8d4f8337d6e640127a8c980c00ca15e0",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add CLAUDE.md for future Claude Code sessions",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T02:12:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d364842f4c71acd984b5e82762e622254b5ff8ab",
          "body": "'jkt status' shows recent CLI-triggered builds\n'jkt status <name>' queries specific job status (was 'jkt status job <name>')\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: simplify jkt status to use optional [name] argument",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T02:09:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8aa1f42d4c4297b41600e200115a82edc7eb1de3",
          "body": "- 'jkt abort' shows recent CLI-triggered builds with real-time status\n- Building jobs can be aborted (stop)\n- Completed jobs can be deleted from Jenkins\n- Supports manual job+number input via prompt\n- Add abortBuild() and deleteBuild() to JenkinsService\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add jkt abort command for stopping and deleting builds",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T02:05:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "460b366a57f52906ca6aec8684d4f3065c15593d",
          "body": "- Poll queue API to get build number after triggering (up to 10s)\n- Strip embedded credentials from URLs in output\n- Show build URL instead of queue URL when build number is available\n- Display queue/build URL in status records\n- Add queueUrl field to BuildRecord\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: output build number and clean URL after triggering build",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T01:56:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "79637cc06e7fe902c700705bc0e5a485d91bd977",
          "body": "When no -p KEY=VALUE params are provided, jkt build now runs the\nparameter configuration wizard (Step 3) before triggering the build,\nsame as the interactive flow.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: jkt build without -p flags enters params wizard",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T01:50:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e5d21adb90f7aaaa8bc2f6e294154622884bf8a1",
          "body": "- Add BuildRecord type and buildRecords to history file\n- Record every build triggered via jkt or jkt build\n- 'jkt status' now shows last 20 builds triggered from this CLI\n  with real-time status from Jenkins\n- 'jkt status job <name>' for specific job status (was 'jkt status <job>')\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: jkt status without args shows last 20 CLI-triggered builds",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-07T01:44:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b4b7b85a8045fdef1ffb9cfeda63753917d53277",
          "body": "- Add lastJob tracking to history file (meta.lastJob)\n- Search input defaults to last built job name\n- Select prompt defaults to last built job in preset list\n- Pass cwd to runJobSelectWizard for history lookup\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: default to last built job in search and selection",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T12:07:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c432850b50b5a06f21af988083e85809c58a4816",
          "body": "When .jenkinsrc.yml has no jobs configured, Step 2 now offers a\nsearch mode: fetch all job names from Jenkins, filter by keyword,\nand show matching results with last build summary.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: search Jenkins jobs when no presets configured",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T12:02:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4f9c353fc504856992b74a09889eaf798177aaf3",
          "body": "Display build number, result, timestamp and duration for each\nconfigured job in the Step 2 selection prompt.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: show last build summary in job selection list",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T11:58:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "82be3d612ad629827aa8d378f88382d163e04dfe",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: pass default value to select prompt for choice parameters",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T11:53:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f66672b9ca46b9907a4ca86a672b0337009e237",
          "body": "…wrapper\n\n- Parse parameters in XML order instead of by-type batches\n- Replace direct inquirer.prompt calls with utils/prompt.ts wrappers\n- Fixes APP_INSTANCE select loop caused by ESM inquirer import mismatch\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: preserve parameter order from config.xml and use unified prompt …",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T11:46:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "53b3dbafc6b223377cbba65b97d0ae7f9deae27d",
          "body": "… parsing\n\n- Remove jenkins-api dependency entirely\n- Use native http/https modules for all Jenkins API calls\n- Parse parameter definitions from config.xml instead of JSON API\n- Properly handle uno-choice plugin's ChoiceParameter by parsing\n  Groovy script in config.xml (with XML entity decoding)\n- Supports StringParameter, BooleanParameter, ChoiceParameter types\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: replace jenkins-api with direct REST API calls + config.xml…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T11:36:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8e9b1379a7efe7c962dd0773d8ad1a713bcc4f6f",
          "body": "The uno-choice ChoiceParameter plugin does not expose choices via the\nJSON API. This adds HTML scraping of /job/<name>/build to extract\nradio/select option values for ChoiceParameter types.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: scrape choice params from build form HTML for uno-choice plugin",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T11:24:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0a25a9fb9de271bb9d7a84dbcb815263818139d4",
          "body": "…object\n\njenkins-api's init() only accepts a URL string with credentials embedded\nas user:pass@host, not an options object with headers.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use URL-embedded auth for jenkins-api init() instead of headers …",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T11:13:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5f7064145a938a9195fea4ea457bb76b0c86667e",
          "body": "…ompat\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use jenkins-api.init() instead of direct function call for ESM c…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T11:05:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "08be2fbc2af7f86c31a1eefa137b18af8ba31b5c",
          "body": "…e deps\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: suppress punycode deprecation warning from jenkins-api transitiv…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T11:01:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e243708b7ae989e6f6c881f60bc55d116db8315e",
          "body": "…er v14\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use 'select' prompt type instead of deprecated 'list' for inquir…",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T10:54:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a9d135d8f1907fbefae05b0637d5e29afa7c613b",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add README and example config file",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T10:04:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "739508bc8c492e97bc8234791552dfeca71973cb",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: register all CLI commands - run, build, status, config",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T10:02:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1bcf486ab402017df0a8140702fd6a738fc3b629",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: wizard step 4 - build execution with confirmation summary",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T09:54:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eb0d804594dbc6c74d372956d91df3d177a12cc1",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: wizard step 3 - parameter configuration with three-layer merge",
          "author_name": "洪城城",
          "author_login": null,
          "committed_at": "2026-07-06T09:53:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 13,
      "commits_last_year": 108,
      "latest_release_at": "2026-07-17T07:41:06Z",
      "latest_release_tag": "v0.6.3",
      "releases_from_tags": true,
      "days_since_last_push": 4,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 0.9
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 14,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "jenkins-tools-cli",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "jenkins",
            "cli",
            "jenkins-cli",
            "ci-cd",
            "build",
            "deploy",
            "automation"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/jenkins-tools-cli",
          "is_deprecated": false,
          "latest_version": "0.6.3",
          "repository_url": "https://github.com/mitch308/jenkins-tools",
          "versions_count": 15,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2627,
          "first_published_at": "2026-07-07T09:52:36.736000Z",
          "latest_published_at": "2026-07-17T07:42:30.238000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0
      },
      "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": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 29650,
      "source_files_sampled": 21,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md",
        "src/skills/jenkins-tools/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 6387
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "chalk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.6.2"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.0.0"
        },
        {
          "name": "inquirer",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.2"
        },
        {
          "name": "js-yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.1"
        },
        {
          "name": "ora",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.4.1"
        }
      ],
      "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": null,
      "bot_contributors": 0,
      "top_contributors": [],
      "contributors_sampled": null,
      "top_contributor_share": null
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "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": 0,
            "reason": "license file not 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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "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": 9,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "58b291d2500c575bcdbbdf45efaeba4743c4eb35",
        "ran_at": "2026-07-22T03:07:47Z",
        "aggregate_score": 4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T07:48:26Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/mitch308/jenkins-tools",
    "host": "github.com",
    "name": "jenkins-tools",
    "owner": "mitch308"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 48,
      "inputs": {
        "security": 40,
        "vitality": 69,
        "community": 23,
        "governance": 42,
        "engineering": 62
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 69,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "commits_last_year": 108,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 3
            },
            "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": "3/52 weeks with commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "108 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 108
                    }
                  }
                ],
                "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": 13,
              "latest_release_tag": "v0.6.3",
              "releases_from_tags": true,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 0.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "13 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "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 ~0.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.9
                    }
                  }
                ],
                "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": 23,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "jenkins-tools-cli"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2627
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,627 downloads/month across npm",
                "points": 45.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2627,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 42,
        "weight": 0.24,
        "metrics": [
          {
            "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": 37,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "mitch308",
              "public_repos": 11,
              "account_age_days": 4303
            },
            "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": "0 followers of mitch308",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "mitch308"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "11 public repos, account ~11 yr old",
                "points": 19.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 11
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "jenkins-tools-cli"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "15 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 62,
        "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": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "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": 25,
                "status": "met",
                "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": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 40,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 40,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 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 not detected",
                "points": 0,
                "status": "missed",
                "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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 1.5,
                "status": "partial",
                "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": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "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": "good",
        "name": "AI Readiness",
        "value": 74,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.87,
              "agent_instruction_files": [
                "CLAUDE.md",
                "src/skills/jenkins-tools/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 6387
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md, src/skills/jenkins-tools/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md, src/skills/jenkins-tools/AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "87 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 87,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.73,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "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": "73 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 73,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 29650,
              "source_files_sampled": 21,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/21 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 21,
                      "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": [
    "Contributor list unavailable",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:jenkins-tools-cli@0.6.3; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T03:07:51.783885Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mitch308/jenkins-tools.svg",
  "full_name": "mitch308/jenkins-tools",
  "license_state": "absent",
  "license_spdx": null
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.26.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.