Звіт у форматі JSON машиночитний
{
"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
}