Cli Printing Press
Search the build
-
aecf495a2026-05-19 fix(cli): harden manifest-gen remote spec loader against hangs and silent truncation (#1699) -
9eff1e202026-05-19 fix(cli): resolve shipcheck CLI binary name from .printing-press.json (#1700) -
b534884f2026-05-19 feat(cli): GraphQL credential probe in doctor + actionable copy (#1701) -
5261ae732026-05-19 fix(cli): return failure exit from verify json (#1693) -
4093ef3e2026-05-19 fix(cli): redact shipcheck api key in json (#1673) -
d81780772026-05-20 fix(cli): handle binary-only response endpoints (Accept + base64 envelope) (#1574) -
1a2438102026-05-19 feat(cli): add Quo (formerly OpenPhone) catalog entry and OpenAPI spec (#1597) -
015478bf2026-05-19 feat(cli): detect Auth0 SPA in-memory auth + emit CDP extractor (#1645) -
75e4d1b92026-05-19 fix(cli): verify-mode HTTP-verb short-circuit + N1 envelope + doctor + read-only POST bypass (#1398) -
c5d868252026-05-19 fix(cli): create llm prompt temp files privately (#1674) -
9a4743352026-05-19 fix(ci): trust queued Greptile gate -
96bc822e2026-05-19 fix(ci): allow queue drafts to skip Greptile -
019dcf3b2026-05-19 chore(ci): enable parallel queue checks in Mergify (#1668) -
81f07e532026-05-19 feat(skills): check public library for existing CLI before generating (#1650) -
cda9b43b2026-05-19 fix(cli): make live-dogfood runner enum-aware and resilient to empty outcomes (#1656) -
5cb39a692026-05-19 fix(skills): stop phase 4.95 code review from being skipped (#1655) -
2c3271fc2026-05-19 fix(cli): detect path params in browser-sniff URL grouper (#1657) -
17cd27742026-05-19 fix(cli): dogfood prefers bundled <dir>/spec.yaml over caller --spec (#1625) -
ac3e15b42026-05-19 fix(cli): sync pagination, auth aliases, narrative timing, and codex prompt (#1341) -
275646a32026-05-19 feat(cli): add auth set-token escape hatch for cookie-auth CLIs (#1641) -
f9bb82c82026-05-19 fix(skills): reprint discovers and carries prior patches (#1649) -
b5b1dd592026-05-18 feat(cli): add cliutil.LooksLikeJWT shared validator with length floor (#1602) -
ed17d3022026-05-18 fix(cli): gate ship plans on agent readiness (#1638) -
7eee7dfc2026-05-18 fix(cli): harden browser-sniff PII placeholders (#1639) -
8c9557012026-05-18 fix(cli): correct live-check and helper emission (#1637) -
af9ba8c72026-05-18 docs(skills): document separate-file pattern for extending emitted files (#1624) -
766354e62026-05-18 feat(cli): add sync --path-context KEY=VAL runtime override for template placeholders (#1631) -
187b69922026-05-18 fix(cli): emit structured cache_warning JSON on auto-refresh failure (#1632) -
e798f6712026-05-18 fix(cli): route Swagger 2.0 specs through openapi2conv to avoid OOM on circular refs (#1630) -
042a78d42026-05-18 feat(cli): flag empty defaultSyncResources at dogfood time (#1633) -
14bc18a42026-05-18 feat(cli): default mcp.transport=[stdio, http] for small APIs (#1629) -
f671b7ba2026-05-18 feat(ci): mirror supply-chain hardening from printing-press-library (#1619) -
1dfbf7952026-05-17 chore(main): release 4.9.0 (#1495) -
ef81ca042026-05-17 test(cli): update TestPublishSkillSkipsCliSkillsMirrorRegen for new library gate name (#1618) -
dde2a4e02026-05-17 docs(skills): publish skill aligns with library's bot-only generated-artifacts rule (#1614) -
fef027fe2026-05-17 fix(skills): retro skill scrubs secrets and PII before posting issue bodies (#1595) -
c3e1b87a2026-05-17 feat(cli): emit .printing-press-patches.json on every generate (#1590) -
caa688012026-05-17 fix(cli): drop // PATCH marker instruction from generated AGENTS.md -
875d64e92026-05-17 fix(cli): detect partial-failure response shape in :mutate handlers, add --allow-partial-failure flag (#1360) -
80ba507e2026-05-16 fix(ci): cancel-in-progress=false so cancelled check_runs don't pile up -
833213ff2026-05-16 fix(cli): drive browser-sniff http_transport from HAR HTTP-version distribution (#1540) -
63f745b82026-05-16 fix(skills): split SQL example out of go-fenced block in NULL-safe scans guidance -
f7365c262026-05-16 fix(ci): close jq if-then-else with end so >10-thread path doesn't crash -
943324172026-05-16 fix(ci): use job exit-code instead of POST/PATCH for check_run state -
c96ac5da2026-05-16 fix(cli): writeThroughCache caches single-object responses keyed by non-id PKs (#1531) -
5b8a81412026-05-16 fix(ci): scope settle delay to synchronize, strip head_sha from PATCH -
162d9a322026-05-16 fix(ci): conversation-resolution check race + duplicate check_run -
f55f57a82026-05-16 fix(ci): address Greptile review on conversation-resolution check -
21ae8a542026-05-16 feat(ci): surface unresolved review threads as a status check -
a8fa80a32026-05-16 fix(ci): require all review threads resolved before queue + merge -
4e304df52026-05-16 fix(cli): scope-aware sync --param dispatch with --global-param fallback (#1529) -
7396d66f2026-05-16 fix(skills): add NULL-safe SQL scan guidance to Phase 3 store-query starter -
c31632b32026-05-16 feat(skills): add /printing-press-amend skill — dogfood + direct-input modes (#1490) -
c10d0b552026-05-16 fix(cli): move extra_commands SKILL.md block to its own top-level section (#1524) -
996379412026-05-16 fix(skills): require codex completion marker before treating delegation as success (#1523) -
82ad787b2026-05-16 fix(cli): cap body-flag recursion depth to prevent compiler OOM (#1522) -
0c3c8bcc2026-05-16 fix(cli): detect integer page paginator and advance numerically in sync (#1519) -
ff5623752026-05-16 fix(cli): drop MCP code-orch handler pre-marshal that base64-encoded mutating bodies (#1521) -
954174012026-05-16 fix(cli): filter auth login --chrome cookies by spec auth.cookies allowlist (#1518) -
34ca81492026-05-16 feat(cli): add --auth-preference flag for catalog-driven scheme selection (#865) -
62838d042026-05-16 fix(cli): validate-narrative splits piped recipes and strips redirects (#1517) -
f5ea270d2026-05-16 fix(cli): match both singular and plural required-flag cobra outputs (#1413) -
43c90ba02026-05-16 feat(catalog): add OpenRouteService under new maps category (#1513) -
bf9014d42026-05-16 fix(cli): synthesize undeclared path placeholders in OpenAPI parser (#1510) -
c7e1b82b2026-05-16 fix(cli): preserve body/content payload on single-object compact path (#1509) -
fe4a5ec32026-05-16 feat(cli): catalog auth_env_vars declares canonical credential env vars (#1508) -
bf7f34652026-05-16 fix(cli): route promoted-command file stem through safeResourceFileStem (#1489) (#1506) -
f64e99132026-05-16 fix(skills): drop cli-skills mirror regen from publish flow (#1502) -
2abbfec02026-05-16 fix(scorer): resolve binary at build/stage/bin/ before cliDir (#1150) (#1412) -
793d5b272026-05-16 fix(skills): surface novel-feature hand-code scope at Phase Gate 1.5 (#1501) -
ca4898a32026-05-16 fix(cli): apply Bearer prefix in composed and cookie AuthHeader paths (#1500) -
f3f704352026-05-16 fix(cli): refresh auth on redirects via CheckRedirect (#1497) -
dc0651ab2026-05-16 fix(cli): exempt vendor OpenAPI/Swagger source under .manuscripts from PII scan (#1496) -
9d3050b52026-05-15 fix(cli): always emit boolean body fields, no zero-guard (#1494) -
96fca0812026-05-15 feat(cli): expose PRINTING_PRESS_DOGFOOD env signal for long-running commands (#1493) -
6fc98d752026-05-15 chore(main): release 4.8.0 (#1491) -
f8d3ba802026-05-15 fix(cli): short-circuit sync on dry-run sentinel response (#1471) -
5f43de502026-05-15 feat(cli): add ElevenLabs generation support (#1307) -
55f5b26b2026-05-15 fix(cli): expand pm_stale timestamp-field list for non-updated_at APIs (#1461) -
3bb6d37b2026-05-15 fix(cli): doctor preserves configured User-Agent when API uses UA as auth credential (#1361) -
2d0ad5ae2026-05-15 fix(ci): switch queue update_method to merge so fork PRs can queue (#1492) -
5460c32a2026-05-15 fix(cli): probe nested path-param leaves so verify catches `args[]` index bugs (#1434) -
d7ccd8502026-05-15 fix(cli): use Chrome User-Agent for synthetic/cookie/composed/session_handshake CLIs (#1479) -
e8eb4e302026-05-15 chore(main): release 4.7.0 (#1377) -
ede5c3502026-05-15 fix(cli): honor explicit "mcp:read-only": "false" in tools-audit (#1485) -
f354bc7a2026-05-15 docs(skills): document hierarchical resource_type in store-query skeleton (#1484) -
77b91be62026-05-15 docs(cli): canonicalize README install block + cross-repo sweep dependency note (#1464) -
a9ffa08f2026-05-15 fix(cli): research-dir state.json api_name overrides info.title-derived name (#1476) -
272d8e832026-05-15 fix(cli): preserve OpenAPI param casing in detected pagination (#1460) -
01c816da2026-05-15 fix(cli): pick gid/sid/uid before name in PK heuristic (#1465) -
72adfefd2026-05-15 fix(cli): drop unused client import from param-less endpoint command files (#911) -
35e515c12026-05-15 fix(cli): query generic resources_fts from search empty-type branch (#1462) -
bb5e2def2026-05-15 fix(cli): validate &&-chained narrative recipes segment-by-segment (#1447) -
a1098f152026-05-15 fix(cli): populate printer + run_id in generated .printing-press.json (#1442) -
9d70aee42026-05-15 chore(ci): add CODEOWNERS for workflows and CODEOWNERS itself (#1472) -
bd4dc6412026-05-15 fix(cli): kebab-case SKILL.md and README endpoint examples (#1445) -
5a04aca62026-05-16 fix(skills): correct install-internal-skills.sh path to repo skills/ (#1342) -
096411ce2026-05-15 fix(cli): strip root-level binaries from staged publish tree (#1449) -
b8b1b6a42026-05-15 fix(cli): force sync concurrency=1 under PRINTING_PRESS_VERIFY to avoid SQLITE_BUSY (#1441) -
dbfc61182026-05-15 fix(cli): propagate PRINTING_PRESS_VERIFY=1 to browser-session-proof probe (#1458) -
e36050fb2026-05-15 fix(cli): substitute server-URL variables from env vars at runtime (#1448) -
c57345a12026-05-15 fix(cli): align publish-skill contract tests with api-slug staged path (#1459) -
ce3aeb4a2026-05-15 fix(skills): use api-slug in publish Step 6 staged path (#1444) -
2bf7d1e72026-05-15 fix(cli): clear every emitted credential field in ClearTokens (#1433) -
73fe56732026-05-15 fix(cli): extend verify-skill recipe scan to README.md (#1430) -
44f1ff792026-05-15 fix(cli): archive merged spec for multi-spec generate runs (#1432) -
acbb3dfe2026-05-15 fix(cli): bypass response cache when polling async jobs (#1429) -
95f035012026-05-14 fix(cli): derive doctor auth.verify_path from me-shaped endpoint (#1431) -
2988814e2026-05-14 fix(skills): canonicalize auth env var when slug-derived differs (#1428) -
55b0f16b2026-05-14 feat(skills): contain session-state.json outside DISCOVERY_DIR (#1425) -
c5a51ead2026-05-14 fix(cli): scope HOME/XDG_CONFIG_HOME for verify/dogfood subprocesses (#1416) -
33a6668b2026-05-14 fix(cli): handle single-quoted args in validate-narrative shell tokenizer (#1424) -
d4b173d62026-05-14 docs(cli): document sync --resources parent-keyed dependent cascade (#1417) -
f32214ea2026-05-14 feat(cli): surface per-endpoint evidence and confidence from browser-sniff (#1397) -
770b65a62026-05-14 docs(cli): clarify issue ownership workflow (#1414) -
46ad86b22026-05-14 fix(cli): stop generated main.go from printing every error twice (#1411) -
d02266022026-05-14 fix(cli): derive doctor probe path from auth.verify_path or me-shaped endpoint (#1406) -
159649742026-05-14 fix(cli): tighten phone-us PII regex to NANP-valid first digits (#1405) -
fdca9f7a2026-05-14 fix(cli): make cookie-auth login --chrome work on Windows (#1404) -
89f38c4c2026-05-14 fix(cli): isolate typed-table upsert failures with per-item SAVEPOINT (#1402) -
2698690e2026-05-14 fix(skills): emit PRINTING_PRESS_BIN marker so later phases survive PATH non-inheritance (#1399) -
ac83f0fd2026-05-14 fix(generator): support single-env basic auth credentials (#1381) -
3bcb9d902026-05-14 fix(cli): descend --select into list-envelope responses (#1379) -
295fd03f2026-05-14 fix(cli): drop shell line comments + skip happy_path on missing file fixtures (#1378) -
fb9125e82026-05-14 fix(cli): emit structured JSON error from parents invoked without a subcommand in --agent mode (#1373) -
d44587e92026-05-14 test(cli): regression tests for body-flag identifier collision shapes (#1376) -
1f1b0bdb2026-05-14 fix(cli): emit WithNumber/WithBoolean for OpenAPI-parsed numeric MCP params (#1372) -
725e063f2026-05-13 chore(main): release 4.6.1 (#1363) -
1ff685372026-05-13 fix(cli): refuse publish package --dest overlay when mirror diverges from source (#1371) -
2437cab72026-05-13 fix(cli): wire composed apiKey + bearer sibling headers through parser, templates, and MCP manifest (#1359) -
51b758c72026-05-13 fix(cli): consume x-tenant-env-var so per-tenant sync paths ship populated (#1368) -
d697eb5a2026-05-13 fix(cli): skip framework-auto-generated operationIds when deriving command names (#1367) -
ca1de8fa2026-05-13 test(cli): pin args[] index for flag-exposed path param shape (#1369) -
80f5bc6c2026-05-13 fix(cli): coerce number-typed --limit param to int (#1370) -
a60103842026-05-13 fix(cli): detect cross-cutting novel features in dogfood scorer (#1364) -
77fce43f2026-05-13 fix(cli): percent-encode path param values in replacePathParam (#1366) -
1fc5f62b2026-05-13 fix(cli): drop MCP handler pre-marshal that base64-encoded mutating bodies (#1357) -
0f8dc9892026-05-13 fix(cli): strip embedded .git/ and .gitmodules in pipeline.CopyDir (#1358) -
a0fac2882026-05-13 chore(main): release 4.6.0 (#1261) -
3b283e042026-05-13 ci: exempt release-please PRs from Greptile review requirement (#1340) -
69cefbe92026-05-13 fix(cli): propagate --timeout to surf transport ResponseHeaderTimeout (#1212) -
3819b67f2026-05-13 fix(cli): support $-prefixed pagination params for Socrata-style APIs (#1204) -
900b335c2026-05-13 feat(cli): emit fetchFull<X> companion for GET-embedded paged sub-resources (#1301) -
e21feae62026-05-13 fix(cli): close ResolveByName json_extract injection + dedupe cacheKey AuthHeader call (#1278) -
ea0cfd8d2026-05-13 chore(cli): ignore local AI agent instruction files (#1326) -
5ac1de7c2026-05-13 fix(ci): collapse Mergify two-step CI to enable in-place mode (#1336) -
1b466a642026-05-13 chore(ci): wire Greptile into Mergify, pin OSS-plan in-place mode (#1321) -
a117a7412026-05-13 chore(ci): raise mergify batch_size and add queue safety knobs (#1306) -
42093ad82026-05-13 fix(skills): extend retro pre-upload scrub with jurisdiction-specific PII patterns (#1302) -
8cc7e6552026-05-13 fix(skills): skip publish-validate in mid-pipeline polish (#1300) -
513ae01d2026-05-13 fix(cli): raise API error body truncation cap from 200 to 4096 bytes (#1285) -
ee3638b22026-05-13 fix(cli): hide const-default query flags from --help (#1287) -
b8488ee42026-05-13 fix(cli): route in:query params to URL on PUT/DELETE/POST/PATCH handlers (#1279) -
f53484882026-05-13 fix(cli): gate provenance diagnostic on wantsHumanTable (#1280) -
a8192b522026-05-12 chore(ci): enable greptile status checks (#1268) -
ff1353092026-05-12 fix(cli): promote write-endpoint params to body when body is empty (#791) -
907984032026-05-12 chore(main): release 4.5.2 (#1230) -
9e0fe96c2026-05-12 fix(cli): populate parent FK in generated UpsertBatch typed-table test fixture (#1253) -
bb9b9cb32026-05-12 fix(cli): make .printing-press.json authoritative for parsed.Name in mcp-sync (#1252) -
28e2fa1b2026-05-12 fix(cli): guard nil Phases in LoadState to prevent lock promote panic (#1193) -
7010c1022026-05-12 fix(ci): fold skill docs into lint gate (#1226) -
09d72e682026-05-12 fix(cli): prioritize bearer + apply root-security filter in scheme selection (#1238) -
5c359ba62026-05-12 fix(cli): gate refreshAccessToken emission on Auth.TokenURL non-empty (#1244) -
c05d3bc72026-05-12 fix(cli): always quote SQL identifiers emitted by safeSQLName (#1228) -
a8ad98202026-05-12 fix(skills): generate absolute manuscript URLs in publish PR body (#1235) -
e40389ef2026-05-12 fix(cli): default Accept to application/json instead of */* (#1229) -
f1246ee12026-05-12 fix(cli): skip dogfood --live error_path probe for mutating commands (#1225) -
a169ca492026-05-12 chore(main): release 4.5.1 (#1170) -
dabf63f82026-05-12 fix(cli): map Cobra/pflag pre-RunE usage errors to exit code 2 (#1194) -
6cda26062026-05-12 fix(cli): emit stderr truncation warning on single-page list responses (#1177) -
4aba68e62026-05-12 docs(cli): cross-reference #1199 in mcp-handler positional-params learning (#1216) -
7365fcc32026-05-12 fix(cli): resolve validation binary path with platform.ExecutablePath (#1213) -
460d676e2026-05-12 fix(cli): index args[] by positional ordinal in path-param emit (#1211) -
9df8c5a22026-05-12 docs(skills): document x-mcp as the OpenAPI form of the mcp: enrichment block (#1201) -
c9a35b5e2026-05-12 fix(cli): refuse to ship CLIs with placeholder base URL (#1186) -
c5a5441d2026-05-12 fix(cli): dedupe nested body-field flatten collisions with sibling scalars (#1190) -
660829ed2026-05-12 fix(cli): preserve x-mcp config when merging combo specs (#1187) -
d0c4caca2026-05-12 docs(skills): tighten Phase 3 Completion Gate to per-row Cobra resolution (#1173) -
ee13fb162026-05-12 fix(cli): make dogfood acceptance marker manifest read best-effort (#1179) -
a3c3c6532026-05-12 fix(cli): redact $HOME paths from publish-tree JSON artifacts (#1181) -
5e3667df2026-05-12 fix(cli): route scorer subcommand --spec URLs through generate's fetch path (#1178) -
e8c03cff2026-05-12 fix(cli): credit auth_protocol on structural OAuth surface, not "Bearer " literal (#1176) -
84138f912026-05-12 fix(cli): handle PascalCase .NET-shape API responses in sync (#1135) (#1174) -
7ba9c20a2026-05-12 fix(cli): accept backtick raw-string Use: in dogfood walkers (#1169) -
f88a10b32026-05-12 fix(cli): preserve novel-command keys in --compact partial-strip path (#1167) -
369761062026-05-12 fix(cli): scope HTTP cache to <api>/http so invalidateCache spares siblings (#1166) -
129644862026-05-12 chore(main): release 4.5.0 (#1134) -
22cc006f2026-05-12 docs(skills): document post-PR review contract in publish skill (#1163) -
88c5b6962026-05-11 feat(skills): add native code review phase to printing-press (#1160) -
403341c72026-05-11 docs(cli): require /printing-press-publish skill for CLI publish PRs (#1145) -
44e7efe42026-05-11 docs(cli): refresh solution docs (#1146) -
8990fc242026-05-11 feat(skills): offer browser-sniff backend install at preflight (#1132) -
d4c8bfbf2026-05-11 chore(main): release 4.4.0 (#1073) -
6536cfff2026-05-11 fix(cli): exempt CLI-root vendor spec files from PII audit scope (#1121) -
5f2bde7f2026-05-11 fix(cli): suppress max_pages_cap_hit warning under --latest-only (#1120) -
10cc48a82026-05-11 fix(cli): infer pagination defaults from plain params; preserve cursor=0 in paginatedGet (#1115) -
c626efca2026-05-11 fix(cli): emit default Accept */* header in generated HTTP clients (#1112) -
c64207472026-05-11 fix(cli): honor Spec.BasePath in generated client URL construction (#1108) -
cb3c09742026-05-11 fix(cli): surface API body in sync_error events and add --param passthrough (#1104) -
cba06db12026-05-11 fix(cli): gate OAuth refresh-token params on x-oauth-refresh-token-mechanism (#1099) -
1ca94b912026-05-11 fix(cli): gofmt rendered .go output in generator emit phase (#1100) -
ff4b65282026-05-11 fix(cli): unwrap single-key API envelopes before agent provenance envelope (#1095) -
17d193072026-05-11 fix(cli): stage runstate manuscripts during lock promote (#1094) -
3d515c452026-05-11 fix(cli): delegate workflow archive to syncResource (#1090) -
705bad2d2026-05-11 fix(cli): dispatch typed-table upserts on spec resource key, not snake table name (#1071) -
5c4ef3a72026-05-11 fix(catalog): refresh google-flights entry to reflect fli native port (#1084) -
27ad2dda2026-05-11 fix(cli): skip Windows Python Store stub in verify-skill (#1086) -
464817182026-05-11 docs(skills): clarify wrapper-only catalog entries have no generator path (#1056) -
24962b7c2026-05-11 feat(cli): sync.walker spec parameter for hierarchical APIs (#1060) (#1074) -
dc6fe8792026-05-11 fix(cli): preserve unknown-shape records in compactListFields (#1078) -
d7e2d74f2026-05-11 feat(cli): promote html_scrape reachability mode when captcha-tier protection blocks JSON + SSR sibling carries state blob (#1065) -
424199a72026-05-11 fix(ci): drop cancel-in-progress from pr-title workflow (#1068) -
910c228d2026-05-11 fix(cli): emit --body-json fallback for oneOf/anyOf request bodies (#994) -
242a56bc2026-05-11 fix(cli): validate ListIDs resourceType to close SQL injection (#1000) -
76db1cc42026-05-11 chore(main): release 4.3.0 (#898) -
9a07f2872026-05-11 fix(cli): walk parent dirs for research.json in live-check (#1057) -
d2770e162026-05-11 fix(cli): honor auth.prefix on bearer_token specs (#1054) -
e2f3a53c2026-05-11 fix(cli): honor --resources filter in dependent sync fan-out (#1047) -
ed693b0d2026-05-11 fix(cli): hide raw resource groups when api browser is generated (#1045) -
c93ce0c22026-05-11 fix(cli): reconcile MCPB manifest against internal/client env reads (#859) (#1035) -
dc5e8c552026-05-11 fix(cli): gate sync since-param emission per resource (#1036) -
66fd401b2026-05-11 fix(cli): Store.Get propagates sql.ErrNoRows so callers can gate on existence (#1031) -
9e604a952026-05-11 test(cli): pin doctor authConfigured short-circuit for OAuth2 + EnvVarSpecs (#1034) -
b1dded7d2026-05-11 fix(cli): classify doctor HTTP 403 as scope-limited WARN, not invalid FAIL (#1033) -
3e56bedf2026-05-10 fix(generator): preserve multi-spec server prefixes (#861) -
5fabad632026-05-10 fix(cli): sync skips resources with unresolved {key} placeholders (#1009) -
a03a7b812026-05-11 fix(generator): rename trailing '_test' stems to avoid Go test-file exclusion (#1020) (#1021) -
4fac827e2026-05-11 feat(cli): point users at where to get a token (URL + instructions + auth setup --launch) (#871) -
a3e07d0a2026-05-10 feat(cli): mechanical PII gate before promote/publish (#958) (#1023) -
4b04f4c62026-05-10 fix(cli): reject control-plane flag injection in MCP shellout (#1022) -
54f007f52026-05-10 fix(skills): gate polish Publish Offer on --standalone, not path detection (#1017) -
3b0508992026-05-10 fix(cli): emit AccessToken-only AuthHeader for all OAuth2 grants (#1010) -
fef70ba12026-05-10 fix(cli): bind typed upsert values in column-declaration order (#1018) -
182395ca2026-05-10 feat(cli): add cliutil.ExtractNumber/ExtractInt for JSON-string-encoded numeric fields (#1002) -
6e086c002026-05-10 fix(cli): fold per-spec base URL path prefixes on multi-spec merge (#995) -
a9e9d0062026-05-10 fix(cli): allow runtime override of OAuth2 OIDC URLs (#970) -
e952e8072026-05-10 fix(generator): route receiver JSON helper through filters (#933) -
5f8dae132026-05-10 fix(cli): reject reserved placeholder hosts in spec validation (#984) -
cb1697ed2026-05-10 fix(cli): force UTF-8 stdio in verify-skill Python subprocess (#985) -
e0240cea2026-05-10 fix(skills): forward --research-dir to scorecard --live-check in mid-pipeline polish (#980) -
618fa4562026-05-10 fix(cli): preserve hand-edits to templated files on --force regen (#967) -
0562bca82026-05-10 fix(skills): preflight Go toolchain before generation runs (#973) -
ab6edbef2026-05-10 fix(cli): route explicit --csv/--quiet/--plain above piped-pipe gate (#968) -
ebc8cd812026-05-10 feat(cli): emit nested-object body fields as parent-prefixed flags (#957) -
ff7553162026-05-10 fix(cli): isolate generic resources by type (#901) -
48cc2a312026-05-10 fix(cli): emit form-encoded request bodies (#947) -
6cd57cc22026-05-10 fix(cli): infer resource-prefixed IDField from item-schema properties (#938) -
d7be66f02026-05-10 docs(cli): require claim and unclaim on issue ownership (#939) -
a1d39bf32026-05-10 fix(cli): seed template-var placeholders in verify mode (#934) -
dceb6e582026-05-10 fix(cli): preserve internal sibling packages on force regen (#897) -
d94d89dc2026-05-10 fix(cli): handle empty sync pages (#903) -
fc291cae2026-05-10 fix(cli): emit multipart requests for upload endpoints (#904) -
8cf5459c2026-05-10 fix(cli): block vendor-prefix secrets during publish (#852) -
534c24ad2026-05-09 chore(ci): speed up PR checks via shard split + lighter lint cache (#887) -
264428972026-05-09 chore(main): release 4.2.2 (#840) -
4b29a6342026-05-09 fix(skills): correct update preflight compatibility (#854) -
1a8f68ee2026-05-09 fix(generator): scope caches by auth identity (#853) -
9f2a4efe2026-05-09 fix(cli): default Surf browser transport to h2 (#850) -
f34645a82026-05-09 docs(cli): add Cursor guide for printed CLIs (#833) -
2d9a304a2026-05-09 fix(cli): preserve manifest fields during dogfood sync (#844) -
117544d02026-05-09 Ignore .omx workspace folders (#841) -
5155331c2026-05-09 Reject stale publish manifests before packaging (#836) -
1c0d110b2026-05-09 fix(cli): preserve operation server host overrides (#834) -
dfb879de2026-05-09 chore(main): release 4.2.1 (#805) -
197021022026-05-09 fix(catalog): Align Google Flights catalog with Flight Goat's current wrapper (#821) -
7a1d83ad2026-05-09 fix(cli): default cookie HTML scrapes to browser transport (#822) -
9bb46da62026-05-09 fix(cli): correct HTTP Basic auth env vars (#810) -
6138e88e2026-05-09 chore(ci): Gate main CI by changed file scope and add a skill-docs check (#809) -
296093c42026-05-09 Document publish PR novel commands and body-file usage (#808) -
079cf52b2026-05-09 docs(cli): clarify catalog entry inclusion rules (#807) -
0020b78a2026-05-09 fix(cli): use slash paths for embedded templates (#794) -
5e04776b2026-05-09 fix(skills): gate polish ship verdict on publish validate (#789) -
d0086ffe2026-05-09 fix(cli): handle Windows shipcheck paths (#783) -
2ff069e02026-05-09 fix(cli): stop credential status overclaims (#779) -
3b929c6e2026-05-08 chore(main): release 4.2.0 (#772) -
de34ec0e2026-05-08 fix(cli): avoid duplicate token auth map keys (#775) -
838f5a492026-05-08 feat(cli): support static config headers (#769) -
a5b572482026-05-08 chore(main): release 4.1.0 (#729) -
1af0f2752026-05-08 feat(ci): add verify-skill drift check (#766) -
172c6c292026-05-08 fix(cli): close redfin retro verification gaps (#762) -
745f2e752026-05-08 fix(cli): sync sibling list endpoints (#756) -
6348c9f22026-05-08 fix(cli): unscore large code-orch token catalogs (#755) -
ecb35ab02026-05-08 ci(cli): skip title lint for merge queue batches (#760) -
ecb2cba02026-05-08 ci(cli): add Mergify merge queue (#757) -
92d303ac2026-05-08 fix(cli): infer bearer auth from prose-only specs (#753) -
7990021b2026-05-08 Add issue ownership guidance to AGENTS.md (#754) -
c332b5342026-05-08 fix(cli): route live cache through typed upserts (#751) -
c397021f2026-05-08 fix(cli): harden force-generate preservation (#750) -
ee8f6ad92026-05-08 feat(cli): credit original printer in per-CLI README (closes #745) (#748) -
ca580efc2026-05-08 fix(cli): align generated install and rename metadata (#749) -
9675f8b22026-05-08 fix(cli): preserve novel cli files on force generate (#747) -
643639212026-05-08 fix(generator): use simple backticks in auth_client_credentials.go.tmpl (#734) -
4ca4b7cf2026-05-08 Add contributor PR template and guide (#744) -
a00e97b12026-05-08 fix(cli): populate manifest.Category from spec when catalog misses (#735) -
6044e7ff2026-05-08 Parallelize Main CI full suite jobs (#743) -
dfdf18312026-05-08 fix(cli): hydrate promote state across scopes (#738) -
8721df4b2026-05-08 fix(cli): preserve browser-sniffed request defaults (#737) -
1d26ae772026-05-08 fix(cli): guard generated CLI build safety (#736) -
b4bdcf682026-05-08 fix(cli): handle wrapped paginated responses (#731) -
979510c22026-05-08 fix(cli): score structural scorer behavior (#732) -
a4b0eb302026-05-08 fix(cli): anchor openapi loader normalization (#730) -
a9b9aa652026-05-08 feat(cli): emit AGENTS.md for printed CLIs (fast-track of #681) (#728) -
c9ebffaa2026-05-08 ci: add Main CI workflow for post-merge build+test+golden gate (#716) -
c9dd54ae2026-05-08 chore(main): release 4.0.6 (#711) -
102305422026-05-08 fix(cli): shard sub-resource tables per parent on collision (#707) -
9e039c0b2026-05-08 fix(cli): source store columns from response schema, not query params (#708) -
b196bd812026-05-08 fix(cli): close MCP sql tool exfiltration vector with allowlist + read-only handle (#709) -
c46cf0152026-05-08 fix(cli): correct named-array envelope detection and api_key set-token slot (#706) -
d1c3371e2026-05-08 fix(cli): dedupe TypeField identifiers in same struct (#705) -
35d7e8422026-05-08 fix(cli): gate orphan token scaffolding on auth surface (#704) -
41c87cf82026-05-08 fix(cli): parse x-mcp extension in OpenAPI parser (#702) -
e601b2112026-05-07 chore(main): release 4.0.5 (#700) -
ac75b83c2026-05-07 fix(cli): add scoped govulncheck gates (#699) -
af70886c2026-05-07 chore(main): release 4.0.4 (#692) -
b188dc2d2026-05-07 fix(cli): strip leading Markdown headings from CLI descriptions (#691) -
fe625c6b2026-05-07 fix(cli): dedupe regen-merge registrations by command use (#690) -
2c538be12026-05-07 chore(main): release 4.0.3 (#686) -
39cbc1892026-05-07 fix(cli): derive Google Discovery resources from operationIds (#680) -
da078d0e2026-05-07 chore(main): release 4.0.2 (#684) -
964203232026-05-07 fix(skills): align publish with library-backed skill mirror (#683) -
823412df2026-05-07 chore(ci): clean up release workflow warnings (#679) -
2ceed8892026-05-07 chore(main): release 4.0.1 (#678) -
4832173d2026-05-07 fix(cli): sync module path with v4 release (#677) -
92940bd72026-05-07 chore(main): release 4.0.0 (#649) -
5701f3e72026-05-07 Clarify polish source-of-truth guidance (#676) -
3da34f162026-05-07 Fix catalog display_name precedence (#675) -
a880a7f72026-05-07 Annotate PM workflows as read-only (#674) -
a590b6b92026-05-07 Document write-time PII redaction in dogfood reports (#673) -
c69e77c82026-05-07 feat(cli): scope verify-skill flag-names; add canonical-sections check (#665) -
d2eca3052026-05-07 fix(skills): repair publish generated-artifact flow (#672) -
a80cb5d42026-05-07 chore(skills): drop compound-engineering plugin and retro hand-off (#671) -
d4d10a8a2026-05-07 fix(phase5): explain accepted marker levels (#647) -
289b48c52026-05-07 docs(cli): group install paths at top of generated README (#660) -
07c8f6372026-05-07 docs(cli): tighten README and drop stale catalog counts (#659) -
1afe5da02026-05-07 docs(cli): prefer npx-based installer over raw go install in README (#657) -
83d2bb192026-05-07 docs(cli): expand commit-style guidance with type list and breaking-change examples (#658) -
6d9ab6642026-05-07 feat(cli): improve generated money workflows and artifact safety (#653) -
cf91eab32026-05-06 feat(cli): add public parameter names (#648) -
e6aa03262026-05-06 fix(cli): omit version field from SKILL.md frontmatter (#656) -
fd7fa6ea2026-05-06 feat(cli): Hermes/OpenClaw frontmatter alignment for printed CLIs (#655) -
c7574bd42026-05-06 fix(dogfood): accept quick live passes with skips (#646) -
f486e4d22026-05-06 chore(main): release 3.10.0 (#616) -
0cf04f732026-05-05 fix(cli): kind-aware auth env-vars and promoted-command --limit (#645) -
3bc1a23a2026-05-05 feat(cli): widen auth env-var model with kind/required/sensitive metadata (#632) (#639) -
7eb951e02026-05-05 feat(skills): flatten retro issues and dedup against open issues (#641) -
5776553b2026-05-05 docs(cli): rewrite install steps and collapse secondary sections (#640) -
2035b2762026-05-05 fix(cli): score composed auth and shell continuations (#636) -
0310d3fb2026-05-05 feat(skills): data-driven Phase 6 menu and hold-path support (#637) -
cb3ef8732026-05-05 fix(cli): require explicit retry no-ops (#635) -
b4a95cb72026-05-05 fix(cli): infer bearer auth from inline params (#634) -
6b5945fd2026-05-05 fix(cli): preserve canonical auth env hints (#633) -
013f92ad2026-05-05 fix(cli): correct no-auth 403 hints (#629) -
5004e4b02026-05-05 fix(cli): harden destructive auth dogfood skips (#628) -
622e15f52026-05-05 docs(cli): capture mcp handler path-vs-query positional recurrence (#626) -
57e2d13a2026-05-05 docs(cli): capture mutator-probe dry-run pattern in solutions library (#624) -
e08c268b2026-05-05 docs(cli): codify lookup-priority discipline in layout contract (#625) -
5b489da72026-05-05 fix(cli): generate usable oauth auth config (#617) -
c5e7a8012026-05-05 chore(main): release 3.9.1 (#607) -
84b22d282026-05-05 fix(cli): skip destructive-at-auth endpoints in live dogfood (#613) -
9c5b882a2026-05-05 fix(cli): emit invalidateCache() in every printed client.go (#612) -
700e46722026-05-05 fix(cli): resolveManuscripts prefers API-slug keying over CLI-name (#615) -
24e7e60f2026-05-05 fix(cli): default live dogfood happy_path on mutators to --dry-run (#614) -
1b0dc70a2026-05-05 fix(cli): always derive install module from filesystem in migrate-skill-metadata (#611) -
4897c5932026-05-05 fix(cli): emit ClawHub-compliant nested YAML for SKILL.md metadata (#609) -
6281f2be2026-05-05 fix(cli): route sync --json events to stdout (#608) -
37ee7e382026-05-05 fix(cli): stamp run_id into manifest at generate time (#606) -
7359a18f2026-05-05 fix(cli): align phase5 quick gate with runner verdict (#605) -
6376d95e2026-05-05 docs(cli): capture HTTP client cache-invalidation pattern (#604) -
76d32e832026-05-04 chore(main): release 3.9.0 (#531) -
ebfa6bf12026-05-04 fix(cli): complete bearer refresh and path handling (#584) -
67c977d82026-05-04 test(cli): live-dogfood resolve-success and search error_path coverage (#583) -
e9696c9b2026-05-04 fix(cli): preserve query params in generated MCP handlers (#582) -
7572b1e02026-05-04 fix(cli): live-dogfood matrix accuracy (WU-2, F4+F5) (#577) -
542835d32026-05-04 fix(cli): generator template polish (WU-1, F1+F2+F3+F6) (#576) -
708a61592026-05-04 fix(skills): speed up retro issue filing (#575) -
26fb45ea2026-05-04 docs(cli): consolidate AGENTS.md via progressive disclosure (#574) -
5bc739092026-05-04 feat(cli): add spec-driven tier routing (#570) -
314b56502026-05-03 feat(cli): compact repeated MCP parameter descriptions (#569) -
847f7c5b2026-05-03 fix(skills): tighten publish and polish workflows (#568) -
185421292026-05-03 fix(cli): preserve operation-routing path params (#567) -
e588bf7e2026-05-03 fix(cli): parse epoch Retry-After headers (#565) -
34413e942026-05-03 fix(cli): reclaim locks from dead owners (#564) -
c0639cf02026-05-03 fix(cli): exempt generated-client source helpers (#563) -
6242e1012026-05-03 fix(cli): add client-call reimplementation directive (#562) -
35fa7afe2026-05-03 fix(cli): support OpenAPI auth metadata overrides (#561) -
b39a23d02026-05-03 fix(cli): separate sampled probes from live verification (#560) -
e973d5c52026-05-03 feat(cli): add live dogfood matrix runner (#559) -
7a1438182026-05-03 fix(cli): gate publishing on Phase 5 proof (#558) -
aae2af9f2026-05-03 feat(skills): retro files parent issue + per-WU sub-issues (#555) -
f362dd442026-05-03 feat(skills): /printing-press-reprint orchestrator (#553) -
74eb87692026-05-03 fix(cli): include cobratree tools in MCP token scoring (#552) -
e4e66bd32026-05-03 fix(cli): dry-run narrative examples in strict validation (#550) -
8b099ba02026-05-03 fix(cli): sync root highlights from verified features (#549) -
96dd07c02026-05-03 fix(cli): session_handshake auth correctness pass (#534) -
13995da72026-05-03 feat(skills): brainstorm novel features via Task subagent (#533) -
f24503852026-05-03 feat(skills): browser-capture fallback options (chrome-MCP, computer-use) (#529) -
7364324a2026-05-03 chore(main): release 3.8.0 (#527) -
593ce9702026-05-03 feat(cli): OAuth2 client_credentials grant + bearer_token AuthHeader precedence fix (#528) -
e761d04d2026-05-03 fix(cli): FedEx retro batch — 5 small fixes (WU-2, WU-3, WU-4, WU-5, WU-7) (#526) -
d364472b2026-05-02 chore(main): release 3.7.0 (#523) -
3c04a0652026-05-02 feat(skills): retro defaults to don't-file; adversarial triage gates (#524) -
53be12092026-05-02 feat(skills): pre-generation MCP enrichment for large surfaces (#522) -
d55947642026-05-02 chore(main): release 3.6.2 (#520) -
734e00d12026-05-02 fix(cli): MCP template ports — NoCache=true + codeOrch stopword filter (refs #515 F1, F4) (#521) -
358e46a62026-05-02 fix(cli): scorer respects runtime MCP surface selection (refs #516 WU-A4) (#519) -
83df8ae72026-05-02 chore(main): release 3.6.1 (#512) -
702f54a12026-05-02 fix(cli): OpenAPI parser walks per-operation servers as fallback (#511) -
53203a0c2026-05-02 chore(main): release 3.6.0 (#509) -
e37cff9d2026-05-02 fix(cli): handle sentry openapi generation (#507) -
73468bac2026-05-02 feat(cli): README template links to release page for binary + MCPB (#508) -
401fa7c82026-05-02 chore(main): release 3.5.0 (#501) -
5584818b2026-05-02 feat(cli): JSON:API support for OpenAPI parser (envelope, page[cursor], x-prefix) (#505) -
6e2562d82026-05-02 docs(cli): bump README "Go 1.22+" prerequisite to "Go 1.26+" (#506) -
31e63be42026-05-02 fix(cli): honor documented typed exit codes (#504) -
97180c032026-05-02 fix(cli): route discriminator sync to typed tables (#503) -
263be3b32026-05-02 fix(cli): strip build/ from publish staging (#502) -
2817bdc72026-05-02 fix(cli): route resource base urls through mcp surfaces (#500) -
ec74c7a92026-05-01 chore(main): release 3.4.3 (#499) -
0a741d322026-05-01 fix(cli): README template recommends MCPB drag-and-drop and skill install (#498) -
f84853b72026-05-01 chore(main): release 3.4.2 (#497) -
3110d5ec2026-05-01 refactor(cli): reuse generated operation id params (#496) -
e47731962026-05-01 docs(cli): reorganize README, add badges and support sections (#495) -
a97b18c12026-05-01 chore(main): release 3.4.1 (#494) -
820ba7b12026-05-01 fix(cli): normalize lock name so slug and binary form share lock file (#493) -
67597dbb2026-05-01 fix(cli): preserve Unicode in OpenAPI display_name (#492) -
37ba0afb2026-05-01 docs(cli): split install into clone-and-run vs marketplace paths (#491) -
e8c0e5742026-05-01 chore(main): release 3.4.0 (#490) -
bd102cf02026-05-01 fix(scorer): live-check treats CLI's graceful empty-handling as PASS, not FAIL (#488) -
aab364be2026-05-01 fix(generator): three template defaults polish has to fix manually (#480) (#485) -
c76d3ec92026-05-01 fix(cli): scorecard APIName drops binary suffix (#489) -
2899613d2026-05-01 fix(cli): mcp-sync stops conflating API slug with binary name (#487) -
9f2655102026-05-01 fix(cli): scorer accuracy — insight prefix, MCP dir selection, freshness coupling (#486) -
40cefcb52026-05-01 feat(cli): add curated Shopify wrapper spec (#476) -
691ee25a2026-05-01 chore(main): release 3.3.0 (#469) -
63c9618c2026-05-01 fix(browsersniff): accept v2-shape traffic-analysis.json on load (#474) (#478) -
6d45d2282026-05-01 fix(regenmerge): correct owner rewrite + skip injection on preserved hosts (#477) -
20ffaaa42026-05-01 chore(skills): re-add context: fork to polish and output-review (#473) -
d1a8a4672026-05-01 feat(generator): owner precedence chain — preserve attribution on regen (#470) -
abde446e2026-05-01 feat(regenmerge): add TEMPLATED-BODY-DRIFT verdict to catch in-place body edits (#468) -
08b886542026-05-01 chore(main): release 3.2.1 (#466) -
05092ed12026-05-01 fix(generator): gate table creation on hasDomainUpsert (#465 follow-up) (#467) -
45a7722b2026-05-01 fix(openapi): preserve params on single-endpoint specs (#465) -
eeb12ea02026-05-01 fix(generator): wrapWithProvenance handles non-JSON response bodies (#464) -
9bc8276e2026-05-01 ci: drop the PR-title scope allow-list, keep requireScope (#463) -
97ca79942026-05-01 fix(regenmerge): semantic dedup for AddCommand calls (#462) -
be309e6a2026-05-01 chore(main): release 3.2.0 (#460) -
4c7bd42d2026-05-01 feat(cli): add regen-merge subcommand for library template sweeps (#461) -
a3ea32ed2026-05-01 fix(cli): unbreak HasStore + non-GET promoted commands (#425) (#459) -
052187a72026-05-01 chore(main): release 3.1.0 (#419) -
de3a4e7c2026-05-01 feat(cli): cost-based throttling primitives for GraphQL CLIs (#434) -
2c59d1c62026-04-30 refactor(cli): extract body-map block to a shared helper (#450) (#457) -
8a548d092026-04-30 feat(cli): add validate-narrative subcommand to replace bash recipe (#433) (#456) -
d909d6cf2026-04-30 Fix docs-only test filtering (#455) -
a197d4142026-04-30 fix(cli): pagination cursor lookup recurses into well-known wrapper objects (#157 F3) (#453) -
5920d0052026-04-30 docs(cli): document OpenAPI extensions and link it from AGENTS (#454) -
c78cb1812026-04-30 fix(skills): tighten human-time-estimate cardinal rule + clean up violations (#452) -
00f832192026-04-30 fix(skills): add Phase 3 starter templates for novel feature commands (#451) -
6aee62052026-04-30 fix(cli): emit mcp:read-only + plumb body fields in promoted commands (#426, #427) (#449) -
1e4798f12026-04-30 fix(cli): migrate 15 templates off flags.printJSON + dogfood regression guard (#428) (#447) -
ba22f30a2026-04-30 fix(cli): retro #421 WU-4, WU-6, WU-7 — search empty JSON, live-check tokenizer, raw database/sql carve-out (#446) -
493a1b152026-04-30 fix(cli): thread ctx through wrapper functions in generated CLIs (#442) (#445) -
6d357b362026-04-30 feat(cli): framework-collision detection in resource-name extraction (#444) -
d9472b762026-04-30 fix(cli): cliutil.BuildPath replaces buildProxyPath with proper URL encoding (#437, #439) (#443) -
c11d0d952026-04-30 fix(cli): store.OpenWithContext + fast-path version check (#436, #438) (#441) -
9a1350622026-04-30 feat(cli): WU-2 sync correctness pass (pagination, ID extraction, exit policy, write serialization) (#430) -
d24f60ed2026-04-30 feat(cli,skills): five remaining retro WUs from postman-explore — store concurrency, narrative validator, proxy joiner, browser-sniff docs (#440) -
1556ff1b2026-04-30 fix(cli): emit StringVar for cursor/page/timestamp pagination flags (#435) -
b6c708932026-04-30 fix(ci): disable golangci-lint remote schema verify (#432) -
8ceea6ad2026-04-30 feat(cli,skills): three retro WUs from postman-explore — POST-as-query detection, novel-command --select, scorecard YAML (#424) -
337840c82026-04-30 fix(skills): sharpen retro cardinal rule to name over-fitted machine changes (#422) -
332e419b2026-04-30 feat(skills): preflight gate with interactive upgrade prompt (#420) -
30370ebb2026-04-29 fix(skills): keep absorb gate showcase as its own turn (#418) -
aa80c9d92026-04-29 chore(main): release 3.0.1 (#416) -
ac98c00a2026-04-29 fix(skills): drop context: fork from output-review so AskUserQuestion works natively (#417) -
4e1db1e72026-04-29 fix(cli): repair v3 release — version regex, module path, CI gate (#415) -
10fd04052026-04-29 chore(main): release 3.0.0 (#356) -
fe5d65c52026-04-29 fix(skills): polish syncs novel_features; publish detects squash-zombie branches (#414) -
cb91024d2026-04-29 fix(cli): OpenAPI parser prefers description over summary on operations (#411) -
0683ef1f2026-04-29 fix(skills): drop context: fork from polish so AskUserQuestion works natively (#410) -
fe1e6d772026-04-29 fix(cli): dogfood agent-context discovery reads stdout only (#407) -
0954bcaf2026-04-29 fix(cli): scorecard human output shows N/A for opt-out dimensions (#406) -
6586c0a22026-04-29 feat(cli): per-resource base_url override in spec schema (#405) -
7670fe982026-04-29 fix(cli): mcp-sync bumps mcp-go pin when migrating to cobratree surface (#404) -
852591592026-04-29 feat(cli): generator emits mcp:read-only on read-only novel commands (#401) -
717a4de32026-04-29 test(cli): cover EndpointTemplateVars runtime substitution + byte-compat -
a0e1bb4a2026-04-29 fix(cli): keep template-var env names out of verifier auth discovery -
8cb57db32026-04-29 feat(cli): substitute EndpointTemplateVars in client.do() + cache key -
289e59882026-04-29 feat(cli): emit buildURL helper + Config.TemplateVars for templated endpoints -
7e08324a2026-04-29 test(cli): cover templated BaseURL + GraphQLEndpointPath rendering -
699e8ed72026-04-29 feat(cli): split BaseURL from GraphQLEndpointPath in GraphQL parser + client -
73d136f72026-04-29 feat(cli): add GraphQLEndpointPath and EndpointTemplateVars to APISpec -
d1b9cd272026-04-29 fix(cli): mcp-sync auto-fixes spec.yaml name drift for internal YAML specs (#400) -
2d9efda52026-04-29 fix(skills): polish loads AskUserQuestion via ToolSearch in forked context (#399) -
262ab8762026-04-29 feat(skills): add /printing-press-import to bring published CLIs into internal library (#398) -
fae7e6e02026-04-29 fix(cli): manifest description no longer doubles 'API' when display_name ends in 'API' (#397) -
2b7a51e12026-04-29 feat(cli,skills): generator-time MCP description enrichment from spec (#396) -
e326adfd2026-04-29 docs(skills): polish skill — read spec.json directly for required/optional, not the manifest (#395) -
cdd9153b2026-04-29 fix(cli): tools-manifest.json classifies reclassified path params as path, not query (#394) -
64f679812026-04-29 feat(cli): mcp-sync reads display_name from public library registry.json fallback (#391) -
401bda542026-04-29 fix(cli,skills): manifest display_name preservation + divergence-check exemptions (#390) -
0320269d2026-04-29 feat(cli,skills): polish ledger per-item enforcement + AGENTS.md guidance (#389) -
e651d01f2026-04-29 feat(cli): MCP description overrides + tools-audit scoring + polish skill nibbles (#382) -
fee6802e2026-04-29 feat(cli): tools-audit checks MCP descriptions in tools-manifest.json (#381) -
6727d0d82026-04-29 feat(skills): add divergence check to polish skill setup (#380) -
a9ca3f802026-04-29 refactor(skills): extract Phase 4.85 into printing-press-output-review sub-skill (#379) -
e4a0089c2026-04-29 feat(cli): add tools-audit subcommand and merge polish into a single skill (#378) -
a81630242026-04-28 fix(cli): mcp-sync detects suggestFlag/Deliver across cli package, not just root.go (#377) -
2b9f2fbb2026-04-28 fix(cli): mcp-sync skips deliver/suggestFlag prolog blocks when absent (#376) -
40d1ffad2026-04-28 fix(cli): mcp-sync refreshes .printing-press.json from spec.yaml (#375) -
a158a6292026-04-28 fix(cli): wire auth.optional through CLIManifest to MCPB user_config Required (#374) -
9f57c41d2026-04-28 fix(cli): mcp-sync preserves manifest brand-casing and hand-edited descriptions (#373) -
283c99232026-04-28 fix(cli): transliterate spec strings to ASCII via Unidecode at every chokepoint (#371) -
1a4bcae82026-04-28 fix(cli): mcp-sync handles older library CLI drift (cliutil + name validation) (#369) -
358ff7822026-04-28 feat(cli): MCP tool surface mirrors Cobra tree at runtime, with mcp-sync backfill (#367) -
1b664d0f2026-04-28 chore(cli): Update Go dependencies and generated CLI template (#368) -
4a2caae02026-04-28 docs(cli): plan MCP tool surface mirrors Cobra tree, with mcp-sync backfill (#365) -
174d23c82026-04-28 fix(cli): add source rate-limit guardrails (#366) -
5777d2672026-04-28 chore(cli): drop dead manifest_url + manifest_checksum from registry guidance (#364) -
0e1b85082026-04-28 chore(cli)!: remove megamcp aggregate server and Composio plan (#363) -
95cf6c882026-04-28 fix(ci): shard test lanes (#362) -
a5ba1b4a2026-04-28 fix(ci): remove redundant generated compile work (#361) -
ddacddba2026-04-28 fix(ci): speed up generated compile tests and caches (#360) -
2e892e362026-04-28 fix(cli): manifest emission no longer gated by stale mcp_ready label (#359) -
9e2600252026-04-27 ci(ci): split fast and full test lanes (#357) -
7f248d592026-04-27 feat(cli): emit MCP tools for novel CLI features via shell-out (#358) -
af2145092026-04-27 feat(cli): MCPB manifest and bundle support for generated CLIs (#355) -
ff70c7eb2026-04-27 chore(main): release 2.4.0 (#330) -
4a6e5c7f2026-04-27 test(cli): simplify shipcheck test setup (#354) -
0ed2fbd82026-04-27 fix(cli): machine improvements from hackernews retro #350 (#352) -
47fe33932026-04-27 fix(publish): gate packaging on skill verification (#348) -
494abe482026-04-27 feat(cli): add printing-press shipcheck umbrella + Phase 4 enforcement + polish-worker hook (#353) -
f3c18d4c2026-04-27 docs(cli): add MIT LICENSE matching README declaration (#349) -
3f7410de2026-04-27 ci(ci): guard low-risk checks and setup docs (#347) -
4c64ffe62026-04-27 ci(ci): improve workflow coverage and guards (#346) -
8617e06d2026-04-27 test(cli): add golden coverage for generated artifacts (#345) -
d86d3af12026-04-27 fix(cli): sync dogfood novel features into CLI artifacts (#344) -
5fa694a02026-04-27 feat(cli): printing-press machine fixes from food52 retro (#337) (#342) -
c74dcd452026-04-27 fix(cli): Cal.com retro #334 — 4 of 5 P1 machine fixes (per-endpoint headers, novel_features, auth set-token, PII scrub) (#341) -
b25c2b902026-04-27 fix(cli): recover RunID in NewMinimalState so lock promote enriches novel_features (#340) -
907c69862026-04-27 feat(cli): add unknown-command check + sync test for verify-skill (#339) -
4219e7122026-04-27 feat(cli): emit promoted-leaf paths in SKILL.md (#338) -
6b2be74d2026-04-27 fix(cli): printing-press P1 machine fixes (issue #333) (#335) -
8bad2efd2026-04-27 fix(cli): score auth prefixes from config (#332) -
09dccfb92026-04-27 feat(cli): add probe-reachability for no-browser challenge classification (#331) -
5966298e2026-04-26 feat(skills): reconcile prior novel features on reprint (#329) -
cae740f52026-04-26 chore(main): release 2.3.9 (#309) -
df551b372026-04-26 fix(ci): include refactors in release notes (#328) -
52bde6b42026-04-26 refactor(cli): share generated naming helpers (#327) -
a2fe15812026-04-26 refactor(cli): simplify scorecard dimension bookkeeping (#326) -
545ffb942026-04-26 refactor(cli): simplify generate orchestration (#325) -
9b97201f2026-04-26 docs(cli): use go fmt ./... for formatting instructions (#324) -
f9c9efd42026-04-26 test(cli): speed up generator test suite (#323) -
b10014912026-04-26 refactor(cli): split verify command helpers (#322) -
18cf50f12026-04-26 refactor(cli): split verify exec helpers (#321) -
7e733aa72026-04-26 refactor(cli): split structural verify runtime (#320) -
ee923f842026-04-26 refactor(cli): share verify report finalization (#319) -
faac0d392026-04-26 refactor(cli): table-drive dogfood verdict rules (#318) -
b54882aa2026-04-26 fix(skills): inherit Codex model from ~/.codex/config.toml instead of hardcoding (#317) -
a5c59b332026-04-26 refactor(cli): table-drive fullrun comparison metrics (#316) -
015ad88e2026-04-26 refactor(cli): split scorecard scoring stages (#315) -
52a3dbc52026-04-26 refactor(cli): split generator vision render stages (#314) -
79b134aa2026-04-26 refactor(cli): split generator render stages (#313) -
b8bb5c1e2026-04-26 refactor(cli): share generated auth helpers (#312) -
fd2ea4f42026-04-26 refactor(cli): simplify refactor-safe helpers (#311) -
0a1e80d92026-04-26 test(cli): add golden output harness (#310) -
f33d8e552026-04-26 fix(cli): harden store migrations for generated identifiers (#308) -
42721ebc2026-04-26 chore(main): release 2.3.8 (#304) -
6181ee362026-04-26 fix(cli): retro #302 — nine fixes from pagliacci-pizza regenerate (#305) -
0d4d2cba2026-04-26 docs(cli): refresh README for launch (Apr 28) (#306) -
8aad8d852026-04-26 fix(cli): retro #301 — six improvements from recipe-goat regenerate (#303) -
574fc27d2026-04-26 chore(main): release 2.3.7 (#299) -
0cc701702026-04-26 fix(cli): use strconv.Atoi for major-version parsing in guard test (#300) -
1ab789ea2026-04-26 fix(cli): use /v2 module path so go install reports correct version (#298) -
42b0f1f42026-04-25 chore(main): release 2.3.6 (#297) -
1e06456c2026-04-25 fix(cli): normalize routing prefixes in OpenAPI paths (#296) -
19e996ae2026-04-25 chore(main): release 2.3.5 (#295) -
0aafafa32026-04-25 fix(cli): normalize generated env var prefixes (#294) -
a18088ad2026-04-25 chore(main): release 2.3.4 (#292) -
ac74e7d22026-04-25 fix(cli): gate publishing on transcendence features (#293) -
4a77f46c2026-04-25 fix(catalog): update stale spec URLs + add download content-validity check (#282) -
6ed197c42026-04-25 fix(cli): make firstCommandExample helper promotion-aware (#291) -
5f68784d2026-04-25 chore(main): release 2.3.3 (#277) -
155293832026-04-25 fix(cli): extend flag-identifier dedup to request body fields (#288) -
ee6bd8812026-04-25 fix(cli): refresh stale catalog entries and reject non-spec bodies (#286) -
6361826d2026-04-25 fix(cli): normalize object-shaped description fields before parsing (#285) -
1a95a78a2026-04-25 fix(cli): prepend T to type names that match Go reserved words (#284) -
72a84a882026-04-25 fix(cli): dedup colliding flag identifiers in generated commands (#283) -
6bbae9362026-04-25 fix(cli): honor explicit --output flag in generate (#281) -
55114c4e2026-04-25 fix(cli): treat access-denied sync errors as warnings (#274) (#280) -
ea0fbe942026-04-25 fix(cli): validate generated JSON string flags (#278) -
1a95d78b2026-04-25 fix(ci): build from local checkout instead of proxying private module (#279) -
892de38b2026-04-24 fix(cli): backfill parent_id on store upgrade (#272) (#276) -
7c9cce482026-04-24 chore(main): release 2.3.2 (#269) -
8eea3a0e2026-04-24 fix(cli): dispatch UpsertBatch to typed tables (#268) (#271) -
6a1847712026-04-24 fix(cli): stop doctor from claiming valid creds are invalid (#270) -
24785ee52026-04-24 fix(cli): avoid duplicate batch store upsert generation (#231) -
55b3f5e12026-04-24 fix(megamcp): reject env var values containing '}' in ApplyAuthFormat (#252) -
d35f25bc2026-04-24 chore(main): release 2.3.1 (#266) -
2c802afe2026-04-24 fix(megamcp): validate placeholders before substitution in ApplyAuthFormat (#262) -
28ba1e012026-04-24 fix(openapi): collect paths to delete before mutation in stripBrokenRefs (#259) -
1645e9622026-04-24 fix(cli): quote paths in emboss stderr output to prevent shell injection (#256) -
5353fb382026-04-23 chore(main): release 2.3.0 (#250) -
4291b3b92026-04-23 feat(cli): add machine-owned freshness coverage (#249) -
92c5b2f42026-04-23 chore(main): release 2.2.0 (#184) -
bc13a5b42026-04-23 fix(ci): allow release-please PR title scope (#248) -
d14cefaa2026-04-23 fix(skills): keep scratch artifacts out of repo docs (#247) -
e741db802026-04-23 feat(cli): generate replayable website CLIs (#241) -
38db06102026-04-22 feat(cli): mcp-audit subcommand + docs for the new MCP surface (#246) -
2d07a0212026-04-22 feat(cli): scorecard dimensions for remote transport, tool design, surface strategy (#245) -
a4207be82026-04-22 feat(cli): code-orchestration thin surface for large-surface APIs (#244) -
85d4ace92026-04-22 feat(cli): declare intent-grouped MCP tools in the spec (#243) -
bce586bc2026-04-22 feat(cli): add http streamable transport to generated MCP servers (#242) -
9dd5632a2026-04-22 feat(cli): generate <cli> which <capability> resolver in every printed CLI (#240) -
440f654d2026-04-22 feat(cli): add live_api_verification scorecard dimension (#239) -
00b9a0d42026-04-22 feat(cli): reimplementation gate in absorb scoring and dogfood (#238) -
e2ca18252026-04-22 docs(cli): add 9-phase pipeline contract at docs/PIPELINE.md (#237) -
8ebb44f32026-04-22 docs(skills): improve printing press voice guidance (#235) -
5e2ed6a82026-04-21 feat(cli): git-backed snapshot share + cache_freshness scorecard dimension (#234) -
4c05e1ee2026-04-21 feat(cli): auto-refresh stale caches before read commands (#233) -
e116a27c2026-04-21 feat(cli): schema-version gate, doctor cache section, cache/share spec surface (#232) -
ab7254b12026-04-21 docs(cli): fix plugin install commands in README (#230) -
ac4d6aa22026-04-20 fix(cli): support nested --select paths + suppress provenance on non-TTY stdout (#229) -
84043f3a2026-04-19 feat(cli): support extra_commands: in spec.yaml for hand-written commands (#227) -
72916ac12026-04-19 feat(cli): add auth doctor subcommand (#226) -
23084c762026-04-18 refactor(cli): rename sniff to browser-sniff (#225) -
86bdfd2e2026-04-18 fix(cli): patch verifies target shape + runs build in target dir (#224) -
8c54c4c82026-04-18 fix(cli): scope goimports to patched files only (#223) -
331809da2026-04-18 feat(cli): patch skips AST mutations owned by colliding features (#222) -
c5ed43692026-04-18 fix(cli): publish manifest must read spec.yaml alongside spec.json (#220) -
16ed5a562026-04-18 feat(cli): printing-press patch — AST-inject PR #218 features into published CLIs (#221) -
1d4e642c2026-04-18 fix(cli): authenticate mega MCP library fetches with GITHUB_TOKEN -
3fd4a5a82026-04-17 style(cli): simplify async-detect sibling-filter boolean -
3ae025f82026-04-17 feat(cli): agent_workflow_readiness scorecard dimension -
c6223b412026-04-17 feat(cli): feedback subcommand for agent-in-band friction reports -
f6e749312026-04-17 feat(cli): --deliver routes command output to file or webhook -
7140c3e72026-04-17 feat(cli): named-profile system for repeatable agent contexts -
1c1728502026-04-17 feat(cli): async-job detection, --wait flag, jobs command -
d4297f632026-04-17 docs(cli): plan HeyGen CLI learnings application -
dc5a8cc42026-04-13 feat(cli): apply Cloudflare Wrangler CLI learnings (naming check, MCP token efficiency, agent-context) (#216) -
6f8b0c7d2026-04-13 fix(skills): Phase 4.85 prompt refinements from calibration dispatch (#215) -
270270ab2026-04-13 feat(cli): machine-output-verification Wave B — live-check entity rule + Phase 4.85 agentic output review (#214) -
65dacc252026-04-13 feat(cli): machine-output-verification Wave A — cliutil package + dogfood test-presence gate (#213) -
18cb521e2026-04-13 feat(cli): printing-press verify-skill + Phase 4 wiring + Phase 4.8 agentic SKILL reviewer (#212) -
831040d52026-04-13 feat(cli): auth.optional spec field — doctor INFO not FAIL, README framing, auth cmd names env var (#211) -
df242da42026-04-13 feat(cli): scorecard --live-check samples novel-feature examples against real targets — closes #200 (#210) -
caa283ed2026-04-13 feat(cli): kind: synthetic spec attribute for multi-source CLIs — closes #203 (#209) -
26bc90572026-04-13 feat(cli): enum validation for params declared with enum constraints (#208) -
3bef9d6c2026-04-13 fix(skills): retro 2026-04-13 — stop the ship-broken pattern and require mechanical Phase 5 dogfood (#207) -
4ebfa0882026-04-12 fix(cli): promoted-command presence check uses promoted type (#196) -
126b00d02026-04-12 fix(cli): path-aware dogfood novel-feature matcher (#195) -
297c3c142026-04-12 feat(scripts): add verify-skill — static SKILL.md validator (#194) -
0ac651342026-04-12 feat(cli): add travel and food-and-dining categories (#187) -
1011df382026-04-12 fix(cli): enrich README and generate SKILL.md so printed CLIs stop looking like scaffolding (#186) -
e2009bb12026-04-12 fix(cli): cross-CLI retro findings - store, sync, scorer, GraphQL templates (#185) -
b436b0812026-04-12 fix(cli): add transitive reachability to dogfood dead function scanner (#183) -
7e6407162026-04-12 chore(main): release 2.1.0 (#181) -
8239f28b2026-04-12 fix(ci): make validate-catalog fail loud on missing base ref (#180) -
6cc5a5f62026-04-12 feat(skills): add DeepWiki codebase analysis to research phase (#156) -
575a3f4f2026-04-12 chore(main): release 2.0.0 (#170) -
9da1cabd2026-04-12 fix(cli): address remaining ESPN retro findings — verify hints, FTS5, doctor (#179) -
096950fd2026-04-11 feat(cli): wrapper-only catalog entries for reverse-engineered APIs (#177) -
23ccc6032026-04-11 fix(skills): add combo-CLI priority gate to prevent source inversion (#176) -
8357850d2026-04-11 fix(cli): address retro findings from yahoo-finance run (#174) (#175) -
cd93b1722026-04-11 fix(cli)!: decouple printing-press-library into standalone marketplace -
c04b6c102026-04-11 fix(skills): add self-vetting gate for transcendence features -
a1fae23b2026-04-11 fix(skills): user-first transcendence feature discovery -
065697572026-04-11 fix(cli): double -pp-cli suffix in manifest + Phase 5 skips no-auth APIs -
2e21807d2026-04-11 fix(ci): auto-sync go install when installed binary exists -
68bc76f32026-04-11 fix(cli): decouple CLI version from API version -
f07a795d2026-04-11 fix(cli): default empty version to 1.0.0 and normalize to semver -
ad9e4aee2026-04-11 fix(cli): movie-goat retro — generator param handling, write-through, sync ceiling, scorer (#172) -
ebd1d0482026-04-11 chore(skills): remove duplicate version fields from marketplace.json -
ac47b18e2026-04-11 fix: use git-subdir source for printing-press-library plugin (#169) -
33d1ba112026-04-10 chore(main): release 1.3.2 (#167) -
e8aa611c2026-04-11 fix(skills): enforce sniff gate with marker file contract (#166) -
32d167a62026-04-10 chore(main): release 1.3.1 (#165) -
ab7f83c92026-04-10 fix(cli): address Kalshi retro findings — --name flag, sync keys, primary key detection (#163) (#164) -
d0ef71bf2026-04-10 chore(main): release 1.3.0 (#155) -
92074e672026-04-11 fix(cli): GraphQL type dedup, usageErr emission, and FTS5 manual sync (#149) -
911dc2902026-04-11 feat(cli): printing press improvements from agent-capture retro (#141) -
f9e6c1082026-04-11 fix(cli): retro fixes from trigger-dev generation (#159) -
4d3c31f82026-04-11 fix(cli): always emit usageErr helper (#162) -
cbcd67db2026-04-10 feat(cli): add printing-press-library plugin to marketplace (#161) -
8354f5282026-04-10 feat(cli): apply PostHog agent-first learnings to MCP server generation (#160) -
776d433c2026-04-09 fix(skills): correct publish package flag name and staging workflow -
49148b432026-04-09 feat(cli): add --dates sync flag and wrapper-object list detection (#154) -
af88767c2026-04-09 chore(main): release 1.2.1 (#151) -
178ae8292026-04-09 fix(skills): constrain artifact writes to managed directories -
b1128d0e2026-04-09 fix(cli): raise resource limit from 50 to 500 and add --max-resources flag (#152) -
816a9fd62026-04-09 fix(cli): deduplicate config env var tags and add operations shorthand (#150) -
36ed047f2026-04-08 refactor(cli): library directories keyed by API slug instead of CLI name (#148) -
2e3b78602026-04-07 chore(main): release 1.2.0 (#144) -
e041f50e2026-04-07 feat(cli): mega MCP — generic HTTP proxy with activation model (#147) -
3393ada02026-04-07 fix(cli): sync version files to 1.1.0 and fix release-please config (#146) -
51afd7782026-04-06 feat(cli): MCP readiness layer — per-endpoint auth awareness and metadata (#145) -
349580af2026-04-06 fix(cli): Dub retro — FTS batch indexing, retry cap, dogfood auth, root dedup, dead code (#143) -
0e30fc532026-04-06 chore(main): release 1.1.0 (#134) -
d96294752026-04-06 fix(cli): generate correct library install path in READMEs -
1b4b98442026-04-05 feat(cli): rename What's New Here to Unique Features, move after Quick Start -
96b9b42c2026-04-05 feat(cli): flow transcendence features into generated READMEs with integrity validation (#137) -
3ea8601d2026-04-05 fix(skills): add Phase 3 Completion Gate to prevent skipping transcendence features -
fb164adc2026-04-05 feat(cli): per-endpoint header routing and auth inference from Authorization header params (#136) -
b5fddac02026-04-05 fix(cli): ensure Sync is always enabled when Store is true -
3e9ac6d82026-04-05 chore(main): release 1.0.0 (#45) -
dd5abb1f2026-04-05 feat(cli): auto-calibrate endpoint-per-resource limit from spec -
95c96c4d2026-04-05 fix(cli): address Cal.com retro findings — scoring, templates, parser, dogfood (#133) -
eae73f442026-04-05 fix(skills): improve retro issue format — priority sections, F-prefix findings, retro doc artifact -
c2076e022026-04-05 feat(skills): make printing-press-retro a public skill (#129) (#131) -
b5c911582026-04-04 fix(cli): replace MarkFlagRequired with RunE validation, remove import guards, fix type fidelity (#130) -
0dac62322026-04-04 feat(cli): add name collision detection and resolution to publish workflow (#128) -
817167282026-04-04 fix(cli): auto-award OAuth2 auth points until generator supports it -
8ec4fc7e2026-04-04 feat(cli): non-skippable dogfood gate and deeper data pipeline validation (#127) -
a1096f412026-04-04 fix(skills): inline dogfood protocol steps to prevent skipping -
75ad9cdb2026-04-04 feat(cli): infer API auth from spec description when securitySchemes missing (#126) -
79a945852026-04-04 feat(cli): detect and emit required API headers from OpenAPI specs (#125) -
26fe57272026-04-04 fix(cli): unhide sub-resource groups when wired into promoted commands -
b80d31402026-04-04 fix(cli): dogfood uses cobra Use: fields and recursive help walking -
6e2e1b3c2026-04-04 fix(skills): comprehensive README requirements for polish agent -
afcd3bd62026-04-04 fix(skills): polish agent picks useful Quick Start commands, not just working ones -
c4befa792026-04-04 fix(skills): polish agent reports skipped findings with reasoning -
af759a272026-04-04 feat(skills): extract polish protocol into polish-worker agent -
d509976c2026-04-04 fix(skills): polish always runs after shipcheck, not just after dogfood -
e7f756b22026-04-04 fix(skills): auto-polish after dogfood testing when fixes were applied -
bc3208462026-04-04 fix(cli): FTS trigger safety, envelope unwrapping, dogfood testing phase (#124) -
289ac4bf2026-04-04 fix(cli): SQL reserved word safety, promoted subcommands, verify classification (#122) -
4b12b3252026-04-04 feat(cli): hide raw resource commands when promoted exist, add api discovery (#121) -
360db3072026-04-04 fix(skills): publish skill checks for merged PRs before reusing branch -
8763a05f2026-04-03 fix(cli): sync path resolution for non-paginated list endpoints -
729ad07d2026-04-03 fix(cli): use catalog Homepage for README website link, remove Homebrew section -
90cf58442026-04-03 feat(cli): search body construction, README website links, and profiler param detection (#120) -
b88aa97b2026-04-03 feat(cli): add --data-source flag for live/local/auto read resolution (#119) -
ff465aac2026-04-03 fix(skills): publish skill specifies full PR URL format -
34e354f62026-04-03 feat(cli): enum sync expansion and generic API prefix stripping (#118) -
c29604c02026-04-03 fix(cli): fix extractKeyURL known-platform check and publish skill contract test -
25e059c32026-04-03 docs(cli): mark scorer/pagination/proxy-routes plan as completed -
5094562d2026-04-03 fix(cli): scorer false positives, pagination param plumbing, and catalog proxy_routes (#117) -
5026f5162026-04-03 fix(skills): publish skill supports fork-based PRs for external contributors (#116) -
e9d9daa52026-04-03 fix(cli): scorer recognizes composed/cookie auth and apiKey header matching -
6d2d059d2026-04-03 feat(cli): browser auth, composed cookies, smart output, and sniff robustness (#115) -
b0a381512026-04-03 feat(cli): add Chrome cookie auth for sniff-discovered APIs (#113) -
10150ad32026-04-03 feat(cli): runstate isolation and lock lifecycle for parallel build safety (#114) -
a28d1b482026-04-02 fix(cli): add primary workflow verification to printing press pipeline (#112) -
0993d60c2026-04-02 fix(cli): add --dest flag to publish package for direct repo writes (#111) -
1f9148f02026-04-02 feat(skills): populate README source credits from absorb manifest -
679808862026-04-02 fix(cli): README title, code block spacing, scorer placeholder fix -
9ab8aa122026-04-01 fix(cli): README scorer alias, template placeholder, verify env discovery -
125188d12026-04-01 fix(skills): goal-driven sniff strategy replaces page-crawl approach (#109) -
998908b52026-04-01 refactor(skills): extract conditional sections to reference files (#108) -
b037ac012026-04-01 fix(cli): publish skill registry format and manuscript resolution (#106) -
fc94557c2026-04-01 fix(skills): add secret leak prevention rules (#107) -
2c9d57d72026-04-01 feat(cli): add printing-press polish --remove-dead-code (#105) -
55c5525b2026-04-01 fix(cli): machine context compensation — scorer, generator, skill improvements (#104) -
6da6fd092026-04-01 feat(cli): generator pipeline improvements — auth inference, verify env, sync paths (#103) -
3af5d2d72026-04-01 fix(ci): add post-merge hook to rebuild binary after git pull -
82a361482026-04-01 fix(cli): generator template improvements — ID typing, dead imports, README cookbook (#102) -
8a5d01cc2026-04-01 fix(cli): scorer behavioral detection — path validity, insight/workflow, dogfood false positives (#101) (#101) -
1c5d6ca92026-03-31 fix(cli): Steam retro improvements — scorer bugs, cache poisoning, template defaults (#100) -
34a914212026-03-31 fix(skills): fix authenticated sniff session transfer daemon lifecycle (#99) -
23648d472026-03-31 fix(skills): correct briefing copy for CLI output description (#98) -
63970f8f2026-03-31 feat(skills): add proactive auth intelligence and session transfer for sniff gate (#97) -
8311b1372026-03-31 feat(skills): add onboarding briefing and showcase novel features at absorb gate (#96) -
129cdea22026-03-31 feat(skills): add Victorian printing press operator voice (#95) -
ed552cb32026-03-31 docs(cli): add glossary section to AGENTS.md (#94) -
ebc132f62026-03-31 fix(ci): auto-rebuild printing-press binary on worktree creation (#93) -
151ec9792026-03-31 fix(cli): actionable auth errors with env var names, key URLs, and 400 handling (#92) -
bed2f97c2026-03-30 feat(skills): add API reachability gate before generation (#91) -
034879722026-03-30 feat(skills): add /printing-press-polish standalone skill (#90) -
6c3c8db82026-03-30 fix(cli): four generator improvements from Redfin retro (#89) -
7f02e1072026-03-30 fix(cli): filter crowd-sniff auth env var hints by API name relevance (#86) -
dfc20ac02026-03-30 fix(skills): add mandatory publish checkpoint after archive (#88) -
d289a8922026-03-30 feat(skills): auto-brainstorm features before absorb gate (#87) -
5bc0b6b82026-03-30 fix(skills): add mandatory sniff gate checkpoint before absorb gate (#85) -
c4a7dcf22026-03-30 fix(ci): add gofmt pre-commit hook and lint pushed files (#83) -
14b9e74f2026-03-30 fix(skills): merge codex detection into setup contract (#84) -
795684092026-03-30 Revert "fix(skills): merge codex detection into setup contract" -
43d21f222026-03-30 fix(skills): merge codex detection into setup contract -
8a8916fd2026-03-30 fix(cli): crowd-sniff and generator improvements from Steam retro (#82) -
64ded0ae2026-03-30 fix(skills): improve retro skill prioritization and skip/do criteria (#81) -
1f9185852026-03-30 fix(skills): archive manuscripts unconditionally after shipcheck, not inside publish gate (#80) -
fba41deb2026-03-30 fix(cli): generator improvements from postman-explore retro (#76) -
4a9843df2026-03-30 feat(cli): add crowd-sniff command for community-based API discovery (#67) -
3093e11a2026-03-30 feat(skills): read MCP source code during ecosystem absorb (#79) -
e11359922026-03-30 feat(cli): auth onboarding UX for generated CLIs (#78) -
bd8444142026-03-30 docs(cli): add local build and plugin dev instructions to README (#77) -
df6f86c02026-03-30 docs(cli): replace Discord with HubSpot as hero example -
b2ad7a862026-03-30 docs(cli): replace 'stealing' with 'absorbing' in README -
7a49df712026-03-30 docs(cli): replace emdashes with regular dashes in README -
cc28b36f2026-03-30 docs(cli): comprehensive README rewrite reflecting current product (#75) -
89ca2ffd2026-03-30 feat(skills): add browser-use version compatibility check to sniff gate (#74) -
cac7eac22026-03-30 feat(skills): add URL detection and disambiguation to printing-press skill (#73) -
91c87cde2026-03-30 feat(cli): add Sources & Inspiration section to generated README (#72) -
99b0768d2026-03-30 feat(skills): implement codex delegation mode in printing-press skill (#71) -
9bad30af2026-03-30 feat(cli): add discovery/ manuscript directory for sniff provenance (#70) -
788a696d2026-03-30 fix(skills): add cd to publish-repo before gh pr create/edit (#69) -
154626ed2026-03-30 fix(cli): write .printing-press.json manifest during generate command (#68) -
797049f52026-03-29 fix(cli): add smart-default table output for POST endpoints (#66) -
f0bb0de22026-03-29 feat(cli): add proxy-envelope client pattern to generator (#65) -
244c48452026-03-29 feat(cli): use local module path at generation, rewrite at publish (#63) -
bafe35632026-03-29 fix(skills): require CLI description rewrite after generation (#64) -
e26505e52026-03-29 feat(cli): add adaptive rate limiting for sniffed APIs (#62) -
f5716d902026-03-29 feat(cli): add spec_source, auth_required, client_pattern to catalog schema (#61) -
283ab9bf2026-03-29 feat(cli): add smart-default output format to generator templates (#60) -
f27c735e2026-03-29 docs(cli): add "Why These CLIs Win" section to README (#59) -
4a1bd2892026-03-29 feat(skills): offer publish after CLI generation completes (#57) -
590a07b12026-03-29 feat(skills): show existing CLI context and clarify regeneration menu (#58) -
035d09742026-03-29 chore(cli): remove stale planning docs (#56) -
bf14db972026-03-29 feat(cli): add publish skill to ship CLIs to printing-press-library (#54) -
ccf7b2ee2026-03-29 fix(skills): make sniff gate reliable with CLI-driven browsing and time budget (#55) -
5ee774c82026-03-29 fix(cli): reject external symlinks during copy (#53) -
cd61dd882026-03-29 fix(skills): recommend installing both capture tools in sniff gate (#52) -
0f765d102026-03-29 fix(skills): don't call unauthenticated endpoints a "public API" (#51) -
a350f4192026-03-29 feat(skills): auto-suggest novel CLI features before absorb gate (#50) -
66cbbc982026-03-29 fix(skills): strengthen sniff gate and add absorb gate options (#49) -
ca6752122026-03-29 fix(skills): auto-install printing-press binary in setup contract (#46) -
b2b473202026-03-29 feat(skills): offer to install capture tools when sniff gate fires (#48) -
82bc5a372026-03-29 feat(skills): add browser-use as primary sniff capture backend (#47) -
a8a003da2026-03-29 feat(generator): make generated CLIs agent-native by default (#43) -
334a52af2026-03-29 feat(skills): integrate sniff into printing-press skill workflow (#44) -
6821a4332026-03-29 feat(cli): add .printing-press.json manifest to published CLIs (#41) -
c1219dec2026-03-29 docs(cli): use brew for lefthook install instructions (#42) -
2afbb8f22026-03-28 ci: re-trigger release-please -
7d9f8c7c2026-03-28 ci: re-trigger release-please after enabling PR creation permissions -
99d2dde82026-03-28 chore(cli): add lefthook pre-push lint and deny --no-verify bypass (#39) -
cc098e672026-03-28 feat(cli): accept name or path in emboss command (#38) -
96bc65df2026-03-28 feat(websniff): add captured traffic test fixture generator -
91e04cca2026-03-28 feat(websniff): add auth session capture with domain binding and security hardening -
7df1537a2026-03-28 docs(cli): fix Trevin article link in credits (#36) -
46a94efe2026-03-28 docs(cli): update README install instructions for standalone binary + plugin (#35) -
dfc0eedc2026-03-28 refactor(cli): decouple skills and binary from repo checkout (#32) -
4f4dd9c42026-03-28 feat(websniff): add APISpec generator and sniff CLI command -
f9b8e1412026-03-28 feat(websniff): add JSON schema inference from captured payloads -
07f158f62026-03-28 feat(websniff): add API endpoint classifier with analytics blocklist -
6c6c9cf52026-03-28 feat(websniff): add HAR and enriched capture parser -
c779648a2026-03-28 feat(ci): automated releases, linting, and commit conventions (#34) -
03a192232026-03-28 fix(ci): shared build cache and Go module caching to prevent test timeouts (#33) -
038826232026-03-28 feat(templates): add flag suggestions, sync NDJSON events, and MCP response quality -
d9801c332026-03-28 fix(skill): require interactive API key consent in Phase 0 -
4120dfcb2026-03-28 feat(pipeline): move mutable runs into scoped runstate (#30) -
7a1c16462026-03-28 fix(scorecard): handle unscored auth semantics (#29) -
6727b8602026-03-28 feat(skill): add 7-principle agent build checklist and Priority 1 review gate to Phase 3 -
432041e22026-03-28 docs(readme): agents-first design, Absorb & Transcend, emboss, verify -
49b98a3b2026-03-28 feat(skill): add Phase 1.5 Ecosystem Absorb Gate - build the GOAT by stealing every best idea -
fe1038e42026-03-28 fix: resolve merge conflicts with upstream, fix RunScorecard 4th arg -
25b07be02026-03-28 fix(skill): enforce 2-pass agent readiness reviewer loop (#28) -
b0d775d42026-03-28 docs: add Phase 4.9 Agent Readiness to README phase list (#27) -
23925ce92026-03-28 docs: add compound engineering plugin to setup instructions -
421c81bd2026-03-28 fix(pipeline): clean generated cli artifacts -
3a850fc52026-03-28 fix(pipeline): match short path declarations -
0dca872a2026-03-28 fix(skill): preserve codex fix delegation -
feef5fa52026-03-28 fix(skill): force agent readiness review to run in foreground -
cf3fcd992026-03-27 docs(scorecard): add scoring architecture best-practice guide and source plan -
bc358ef82026-03-27 fix(skill): add 7 improvements from Cal.com CLI run -
e3a07f7b2026-03-27 fix(skill): enforce Phase 4.9 agent readiness review dispatch -
6b4aea3a2026-03-27 docs: add Cal.com CLI research and planning artifacts -
49f5d8b72026-03-27 fix(scorecard): fix PassRate units, gate sync path-param credit, tighten empty sync detection -
2ce13e772026-03-27 fix(pipeline): handle remote URLs and YAML-to-JSON conversion in spec copy -
5ed498782026-03-27 docs(scorecard): document intentional workflow/insight prefix overlap -
98977f232026-03-27 fix(score): preserve spec extension, remove hardcoded repo path -
64e5ea582026-03-27 refactor(scorecard): extract infra maps and add workflow/insight tests -
dfef94f42026-03-27 fix(scorecard): address code review findings on accuracy changes -
8ab911a72026-03-27 docs: mark score command plan as completed -
c08aedc72026-03-27 feat(skill): add /printing-press-score for standalone CLI scoring -
a00ebdb22026-03-27 feat(pipeline): copy spec into output dir after generation -
1bebcb0a2026-03-27 fix(scorecard): improve accuracy for non-trivial CLIs -
32a4ec902026-03-27 docs: rename score command spec to -plan suffix -
03155a6e2026-03-27 docs: move score command spec to docs/plans -
bc9932e32026-03-27 docs: add design spec for /printing-press-score skill -
0906e2cc2026-03-27 fix(skill): use AskUserQuestion tool in Phase 5.9 emboss prompt -
9d256d742026-03-27 docs: remove superseded design spec for Phase 4.9 -
fe6a36342026-03-27 docs: update specs to reflect stable-numbered PlanPath approach -
630cd0b52026-03-27 refactor(pipeline): use stable-numbered PlanPath instead of name-only -
0d4e711c2026-03-27 fix(cli): propagate ReadDir error in explicitOutput collision guard -
e2e68fb92026-03-27 docs: mark implementation plan as completed -
bc6867312026-03-27 test(cli): add integration tests for claimOrForce behavior -
51ba99962026-03-27 docs(cli): update --force flag description to reflect auto-increment behavior -
ca5c11fd2026-03-27 fix(cli): capture explicitOutput before default assignment -
3a9e977b2026-03-27 fix(pipeline): backfill PlanStatus in migration and persist state -
da9500e42026-03-27 refactor(cli): use ClaimOutputDir for atomic output directory claiming -
0fd4cba62026-03-27 test(pipeline): add concurrency test for ClaimOutputDir -
93b8b4cc2026-03-27 feat(pipeline): add ClaimOutputDir for atomic directory claiming -
5a6c80952026-03-27 feat(skill): add Phase 4.9 agent readiness review loop to SKILL.md -
bdc9a90f2026-03-27 feat(pipeline): add PhaseAgentReadiness and plugin dependency -
e49ec2562026-03-27 docs: add implementation plan for Phase 4.9 agent readiness review loop -
914755d62026-03-27 docs: address review findings for Phase 4.9 requirements doc -
298b49592026-03-27 docs: address document review findings for Phase 4.9 spec -
574c434f2026-03-27 docs: add Phase 4.9 agent-readiness review loop design spec -
fa6b172e2026-03-27 docs: update README for v2 overhaul - three benchmarks, table stakes, api-pp-cli naming -
854ff6012026-03-27 feat(skill): v2 overhaul - 14 changes from Notion + Linear post-mortems -
01a3c1c72026-03-27 docs: rename plan file from shelf to library -
96c28ea42026-03-27 refactor(generator): rename shelf/ to library/ for generated CLI output -
cf381bbb2026-03-27 fix(review): extract DefaultOutputDir helper, update main skill and docs -
34e646c22026-03-27 feat(generator): route generated CLI output to shelf/ directory -
430d60952026-03-27 docs(onboarding): clarify that /printing-press skill is the primary entry point -
66abf7822026-03-27 fix(skill): Phase 0.1 must WAIT for API key answer before proceeding -
75c37eb62026-03-27 feat(emboss): complete baseline persistence, delta computation, and full-mode UX -
efbf4b882026-03-27 feat(emboss): add second-pass improvement command for generated CLIs -
b5e6f02d2026-03-27 fix(plugin): remove invalid skills field from plugin.json -
28036ae72026-03-27 docs(readme): simplify install to just /install-skill -
445bf9572026-03-27 docs: add research plans from GitHub CLI run + quality overhaul + API candidates -
ebe45d512026-03-27 fix(marketplace): align marketplace.json with Claude Code schema -
ad4812f32026-03-27 feat(skill): add product thesis, market research, naming pass, runtime verify phase -
9c4349a32026-03-27 fix(parser): check OpenAPI before GraphQL to prevent false positives -
4f93e79f2026-03-27 feat(verify): add runtime verification command with mock server + fix loop -
dbd5b3a22026-03-27 docs(readme): add install link, fix star count, remove self-credit -
d91566f92026-03-27 feat(templates): add structured confirmation envelope for mutating commands -
c3eacf942026-03-27 feat(dogfood): add ExampleCheck to validate help example correctness -
b86384b12026-03-27 docs: add testing guidance to AGENTS.md -
538e65c42026-03-27 feat(cli): differentiate exit codes by failure type -
b494c3b82026-03-27 feat(cli): add --dry-run flag to generate command -
7f5c35202026-03-27 feat(cli): add --json flag to generate, print, and vision commands -
862dfa702026-03-27 fix(generate): reject non-empty output directory without --force -
df0474e82026-03-27 docs: split CLAUDE.md into AGENTS.md for Codex compatibility -
f6f635992026-03-27 docs: prevent concurrent worktree build collisions -
633eefc32026-03-27 feat(cli): add Example fields to all Cobra commands -
d174491e2026-03-27 docs: add ONBOARDING.md for new contributor orientation -
50ecc63a2026-03-27 fix(skill): Phase 0.1 auto-detects API tokens before asking -
4d2a87bf2026-03-27 docs: rewrite lead narrative - Every Endpoint. Every Insight. One Command. -
771d37932026-03-27 docs: fix README narrative - 323 AND 11, not vs -
c123304c2026-03-27 chore: gitignore go-build cache and binary -
ce96c0c32026-03-27 chore: remove all stale generated CLIs -
2974f4122026-03-27 docs: update README with MCP generation, codex mode, proof of behavior, live testing -
ff9f5e612026-03-27 feat(skill): add opt-in Codex delegation mode for token savings -
0606df642026-03-27 fix(pipeline): 5.5 live test failures auto-trigger fix loop -
06b9270a2026-03-27 feat(pipeline): ship loop, live API testing, rename Steinberger scoring -
6a80b5af2026-03-26 feat(generator): generate MCP server alongside CLI from OpenAPI spec -
8e9260362026-03-26 feat(templates): discrawl-inspired sync performance upgrades -
efaec84b2026-03-26 feat(pipeline): add Proof-of-Behavior verification phase -
345b07532026-03-26 docs: update README with v2 overhaul, agent-first features, credits -
300c01bd2026-03-26 feat(templates): auto-JSON piping, --no-input, --compact (Ramp CLI learnings) -
64c58d862026-03-26 feat(templates): agent-friendly error messages, truncation hints, wired flags -
8c92c19d2026-03-26 feat(graphql): add GraphQL SDL parser for CLI generation -
82bae3ee2026-03-26 feat(dogfood): add mechanical CLI validation command -
7bcacea32026-03-26 feat(skill): add Phase 4.6 hallucination audit and anti-gaming rules -
0063ee762026-03-26 fix(generator): auth format, module path, and example values -
eb59816b2026-03-26 feat(generator): wire BuildSchema to store/sync/search templates -
bba34c422026-03-26 feat(scorecard): add Tier 2 domain correctness dimensions -
86c5d9082026-03-26 feat(generator): Apache 2.0 license on generated CLIs with NOTICE attribution -
307e67c92026-03-26 docs: rewrite README with NOI as hero, discrawl story, gogcli/last30days narrative -
b52da3392026-03-26 docs: add agent-native thesis with research-backed token economics to README -
0c1316fb2026-03-26 docs: update README with Creative Vision Engine, NOI system, and domain archetypes -
63b89f6d2026-03-26 feat(generator): add schema builder with data gravity scoring and insight scorecard dimension -
f55405b82026-03-26 feat(generator): add PM workflow and behavioral insight templates -
f5369dd02026-03-26 feat(generator): add Non-Obvious Insight system, domain archetype detection, and entity mapping -
31a8bed42026-03-26 docs: comprehensive README rewrite for 8-phase pipeline -
b1651b502026-03-26 fix(press): dynamic API type detection, registry is hint not gate -
9e8cc5d52026-03-26 feat(press): support GraphQL APIs - warn but proceed, don't block -
ced6cefc2026-03-26 feat(press): expand Phase 4.5 with report-fix-retest cycle -
7b5ce3832026-03-26 feat(press): add Phase 4.5 Dogfood Emulation - spec-derived API testing -
6775a8622026-03-26 feat(press): add Phase 0.7 prediction engine, Discord CLI, 6-artifact pipeline -
13860ec02026-03-25 feat(press): v2 - depth over breadth, creativity over mechanical -
d51d1e892026-03-25 feat(generator): add compound workflow template with archive and status -
bbd0a47c2026-03-25 feat(store): generate per-resource SQLite tables from profiler output -
611f4b672026-03-25 feat(llmpolish): add LLM Vision Synthesis for domain-aware customization -
a783ac122026-03-25 fix(profiler): improve HighVolume and NeedsSearch heuristics -
de296d1f2026-03-25 feat(scorecard): implement two-tier Vision scoring -
bba88f652026-03-25 feat(generator): wire vision templates into Generate() -
f499c4b52026-03-25 feat(profiler): add API Shape Intelligence Engine -
5c6840d52026-03-25 fix(scorecard): replace presence checks with quality-based scoring -
e25a1b452026-03-25 feat(vision): add Phase 0 Visionary Research - the press thinks before it prints -
bb0acf372026-03-25 feat(skill): v1.1.0 dual Steinberger analysis, deep research, complex body fields -
44daea3a2026-03-25 fix(skill): enforce 5-phase loop with inlined research and phase gates v1.0.0 -
68f631672026-03-25 feat(skill): restore plan-execute-plan-execute loop - the press is smart again -
4ee089522026-03-25 fix(skill): always research, polish, and score - never skip the brain -
6e9340002026-03-25 refactor(skill): Claude Code IS the brain, not the Go binary -
95e268382026-03-25 feat(scorecard): add breadth dimension + fix LLM runner + integration tests -
c266b6fb2026-03-25 feat(templates): add --human-friendly flag and NDJSON pagination events -
b8c762c62026-03-25 docs: rewrite README to reflect what the press actually does now -
a1e7af4e2026-03-25 feat(llm): add LLM brain before generation - the press understands before it builds -
76d082f52026-03-25 feat(llmpolish): add LLM polish pass - the press is now smart, not just fast -
b862cf4c2026-03-25 feat(templates): agent-native CLI improvements - stdin, idempotency, --yes, examples -
3b4f89db2026-03-25 fix(templates): improve doctor health checks and add HTTP response cache -
99de67ec2026-03-25 feat(pipeline): full press run with MakeBestCLI, scorecard fixes, and comparison table -
731b0ce72026-03-25 feat(pipeline): press intelligence engine - dynamic plans, competitor intel, doc-to-spec, scorecard -
ffb7a7e62026-03-25 feat(parser): add lenient mode + comprehensive test suite from overnight learnings -
5e0f47142026-03-25 docs: overnight hardening results - 10/10 gauntlet, 30 tests, 2 new CLIs -
451b7cb72026-03-25 feat(catalog): generate Pipedrive CLI from official OpenAPI spec -
66bc4ea82026-03-25 feat(catalog): generate Plaid CLI from official OpenAPI spec -
02d022fe2026-03-25 test: add coverage for research, dogfood, comparative, textfilter, readme_augment -
2370b45b2026-03-24 fix(templates): guard readme.md.tmpl against empty Auth.EnvVars -
780c6b512026-03-24 feat(templates): add --select flag, error hints, README rewrite, and Owner variable -
1f5871bd2026-03-24 feat(pipeline): add comparative analysis scoring and GoReleaser brews section -
bc5c5db82026-03-24 feat(pipeline): add dogfood automation, anti-AI text filter, and README augmentation -
466715fb2026-03-24 feat(pipeline): add Research and Comparative phases with catalog extensions -
0b8929382026-03-24 feat(linear): generate Linear CLI with 12 resources and 45 commands -
10640caf2026-03-24 docs: update gauntlet findings to 10/10 pass rate -
1eda222a2026-03-24 fix(generator): harden toCamel, flagName, defaultVal and dedup body params -
651d11e12026-03-24 fix(generator): doctor tries health endpoints before reporting status -
5b3d281e2026-03-24 feat(generator): add CRUD aliases to generated CLI commands -
96f0d5132026-03-24 feat(cli): add --force flag to generate command -
7ca3e75b2026-03-24 refactor(pipeline): rewrite seed templates as thin ce:plan prompts -
37008dd92026-03-24 feat(skill): update Workflow 4 to check plan_status for seed vs expanded -
1f3604642026-03-24 refactor(pipeline): use MarkSeedWritten in Init instead of MarkPlanned -
fa2459dd2026-03-24 feat(pipeline): add plan_status field to PhaseState for seed expansion tracking -
15f3d2502026-03-24 docs(plans): template sanitization round 2 + pipeline E2E plan -
d8a93e0a2026-03-24 fix(generator): harden toCamel, flagName, types template for special chars in schema names -
2501e5652026-03-24 docs(plans): update gauntlet findings after parser fixes - 4/10 pass (was 3/10) -
3f096bce2026-03-24 fix(parser): sanitize schema names, cap title length, handle missing servers, resolve URL templates -
0f1beba22026-03-24 feat(catalog): add telegram, launchdarkly, sentry from dogfood gauntlet -
d81e961a2026-03-24 feat(pipeline): add 10 new APIs to known specs registry for dogfood gauntlet -
aae780172026-03-24 feat(pipeline): add autonomous dogfood phase with 3-tier test system -
59ae53402026-03-24 docs: rewrite README with full feature coverage and Steinberger-inspired tone -
ea0867592026-03-24 docs(plans): mark pipeline chaining and E2E petstore plans as completed -
9734d0c12026-03-24 feat(skill): add autonomous pipeline workflows with nightnight-style chaining -
01f443962026-03-24 docs(plans): nightnight chaining plan + E2E test plan for pipeline -
6be0e67f2026-03-24 Revert "feat(skill): add autonomous pipeline workflow with nightnight-style chaining" -
eab64edd2026-03-24 feat(skill): add autonomous pipeline workflow with nightnight-style chaining -
cd1cea5a2026-03-24 docs(plans): update pipeline plan with plan-first architecture -
6a76cb262026-03-24 feat(cli): add 'printing-press print' command with plan-per-phase pipeline -
5d456c672026-03-24 feat(pipeline): spec discovery registry and overlay merge types -
e2560ea72026-03-24 feat(pipeline): add pipeline state manager with phase tracking -
9cfae3e42026-03-24 docs(plans): autonomous CLI pipeline plan and status updates -
bb12a6052026-03-24 feat(cli): multi-spec composition with --spec repetition -
dacda31f2026-03-24 feat(generator): OAuth2 auth flow for generated CLIs -
2e70bc462026-03-23 feat(cli): accept URLs for --spec with local caching -
3cb6e8692026-03-23 feat(generator): add color and TTY detection to generated CLIs -
babd0c662026-03-23 fix(openapi): filter global query params that appear on >80% of endpoints -
08dc4eef2026-03-23 fix(openapi): deep sub-resource detection with common prefix collapse -
332fe5952026-03-23 feat(generator): auto-detect pagination and generate --limit/--all flags -
086f1d452026-03-23 feat(generator): retry logic, structured exit codes, and dry-run support -
c5618c082026-03-23 feat(generator): auto-detect array responses and render as formatted tables -
e993ba6e2026-03-23 feat(generator): auto-generate usage examples in command help -
33d064832026-03-23 fix(openapi): handle nullable types in OpenAPI 3.1 specs -
2915ae3e2026-03-23 fix(generator): auth mapping for Discord BotToken scheme -
3d07636b2026-03-23 feat(generator): sub-resource grouping for nested API paths -
54e55a662026-03-23 fix(generator): dogfood to Steinberger quality across Petstore, Stytch, Discord -
ceacb1352026-03-23 docs: final dogfood plan - fix press until Steinberger quality -
21a7c6aa2026-03-23 docs: add dogfood quality plan -
399c96782026-03-23 fix(generator): 6 dogfooding fixes for production-quality CLI output -
c8942bc32026-03-23 docs: add Steinberger parity plan -
848234312026-03-23 fix(openapi): smart operationId cleaning for clean command names -
588c694e2026-03-23 fix(generator): add PATCH support + skip unexported fields in types -
d3393f882026-03-23 docs: add Phase 4 plan -
16b39bf22026-03-23 docs: add README and CLAUDE.md -
97ff74ff2026-03-23 ci: add catalog validation pipeline for PRs -
45045b922026-03-23 feat(skill): add /printing-press submit workflow for catalog contributions -
3ff4500f2026-03-23 feat(skill): add /printing-press-catalog for browsing and installing CLIs -
cd4824a92026-03-23 feat(catalog): add catalog schema validator with tests -
966492722026-03-23 feat(catalog): add 12 official catalog entries for popular APIs -
07d0564a2026-03-23 feat(plugin): add Claude Code plugin manifest -
f369ea6d2026-03-23 docs: mark Phase 3 plan as completed -
9f3fdc3f2026-03-23 docs: add Phase 3 plan (natural language skill) -
412c2fe62026-03-23 feat(skill): add /printing-press Claude Code skill -
c547fa572026-03-23 docs(skill): add known-specs registry and spec-format reference -
4934eb502026-03-23 fix(openapi): Swagger 2.0 detection + resource name sanitization -
6011234c2026-03-23 feat(openapi): integration tests + oneline template fix for multiline descriptions -
600091032026-03-23 feat(cli): auto-detect OpenAPI vs internal spec format -
e81fc8722026-03-23 feat(openapi): add OpenAPI 3.0+ parser with kin-openapi -
4e3888ab2026-03-23 feat(spec): extend internal format for OpenAPI + add real OpenAPI test fixtures -
875269222026-03-23 docs: add plan files to repo -
4b510ed72026-03-23 feat(validate): quality gates + Clerk/Loops test specs + integration tests -
a78f09792026-03-23 feat(templates): Go templates for all generated CLI files -
b4ab56ba2026-03-23 feat(spec): YAML spec parser with validation and Stytch test fixture -
454739bd2026-03-23 feat(scaffold): initial project structure with CLI skeleton
Authors
- Trevin Chow693
- Matt Van Horn251
- github-actions[bot]49
- Cathryn Lavery16
- hnshah6
- Dinakar Sarbada6
- Nick Walker3
- klatt423
- Giuliano Pezzolo Giacaglia3
- tallyberner2
- Justin Fu2
- andreasvainio1
- HotFix Ops1
- JustSpellJ1
- Mark van de Ven1
- salmonumbrella1
- Michael Schreiber1
- liam-ai-reality1
- kberger1111
- Kyle Kirkland1
- cobuchan1
- mehmet turac1
- CB1
- Adam Harris1
- Omar Shahine1
- brennaman1
- Juany8991
- Jeremy Knows1
- Joe Heitzeberg1
- Pejman Pour-Moezzi1
Agents used
Skills used
- /printing-press89
- /cli82
- /plans69
- /printing-press-library54
- /pipeline50
- /generator50
- /golden46
- /simplify38
- /spec29
- /graphql29
- /client26
- /library22
- /templates22
- /claude22
- /main18
- /cli-printing-press18
- /json17
- /cmd16
- /solutions16
- /mvanhorn16
- /search16
- /internal15
- /sync15
- /config14
- /printing-press-polish14
- /claude-code14
- /mcp13
- /code13
- /sql13
- /composed12
Creative ideas + design notes
aecf495a · 2026-05-19 · fix(cli): harden manifest-gen remote spec loader against hangs and silent truncation (#1699)
* fix(cli): harden manifest-gen remote spec loader against hangs and silent truncation loadSpec in cmd/manifest-gen had two defects when fetching remote specs: 1. No timeout on the HTTP request. http.Get with the default client has no overall request timeout, so a remote host that flushes headers and then blocks on the body would hang manifest-gen indefinitely. 2. Silent truncation. io.LimitReader(body, 50MiB) followed by io.ReadAll returned the first 50 MiB of any oversized response with no error, so the caller could not tell a real 49 MiB spec from a multi-gigabyte stream truncated mid-document. Fix: route the request through http.NewRequestWithContext with a 60s timeout, and read limit+1 bytes so we can return an explicit "spec exceeds N bytes" error when the response is over the limit. The 50 MiB cap is preserved. Adds main_test.go covering happy path, local file, non-200, stalled server (with a short timeout override so the test runs in well under a second), oversized response, and exactly-at-limit response. * fix(cli): eliminate data race in manifest-gen loadSpec tests The previous test helpers `withTimeout` / `withMaxBytes` mutated the package-level `remoteSpecTimeout` and `maxRemoteSpecBytes` vars while the `httptest.Server` handler goroutine read those same vars to size its response. There was no happens-before relationship between the test-goroutine write and the handler-goroutine read, so `go test -race ./cmd/manifest-gen/...` could flag a data race. Refactor `loadSpec` to take its byte limit and timeout as explicit parameters. The single production caller in `main()` passes `maxRemoteSpecBytes` and `remoteSpecTimeout` directly; tests pass their own local values. No package-level state is mutated, so the handler closures close over local vars and the race is gone by construction. Restore the package-level identifiers to `const` since tests no longer override them. Production behavior is unchanged (same 50 MiB limit, same 60s timeout).
9eff1e20 · 2026-05-19 · fix(cli): resolve shipcheck CLI binary name from .printing-press.json (#1700)
* fix(cli): resolve shipcheck CLI binary name from .printing-press.json shipcheckCLIPath and shipcheckCLIPathForGOOS derived the binary name from filepath.Base(o.dir), which is wrong for slug-keyed library dirs. For ~/printing-press/library/notion, basename is "notion" but the binary is "notion-pp-cli", so validate-narrative was invoked with a binary path that does not exist on disk. Resolve the binary name from .printing-press.json's cli_name via pipeline.ReadCLIBinaryName, and fall back to filepath.Base(dir) when the manifest is absent or unparseable (preserves legacy behavior). Clawpatch finding: fnd_sig-feat-cli-command-e17f734225-_8ca7979519 * test(cli): cover unparseable-manifest fallback in shipcheckBinaryName Adds TestShipcheckCLIPath_FallsBackOnUnparseableManifest to pin the parse-error branch of pipeline.ReadCLIBinaryName: when .printing-press.json exists but is malformed JSON, the binary name must fall back to filepath.Base(dir) rather than propagate the parse error or yield an empty name. Greptile P2 on #1700 — the godoc promised the fallback for the "absent or unparseable" case but only the absent path was tested.
b534884f · 2026-05-19 · feat(cli): GraphQL credential probe in doctor + actionable copy (#1701)
* feat(cli): verify GraphQL credentials in doctor + actionable unverified copy
The doctor Credentials check emitted `WARN Credentials: present (not
verified — set auth.verify_path in spec ...)`. Two problems: the operator
running the CLI doesn't own the spec, and there was no next step. GraphQL
APIs (Linear, GitHub, Shopify) also couldn't declare a probe at all since
there's no REST verify endpoint to point at.
- Add `auth.verify_query` spec field. When set, doctor POSTs
`{"query": "<value>"}` to base_url and treats HTTP 2xx + no top-level
`errors` as verified, 401/403 as rejected. Routed through
PostQueryWithParamsAndHeaders so verify-mode doesn't suppress the read.
VerifyPath wins when both are set (REST probe is cheaper).
- Replace the unverified-state copy with a runnable suggestion resolved at
doctor-time: walk the cobra tree for the first endpoint-mirror leaf with a
list/get verb and no positional args. Gated on the pp:endpoint annotation
so it never suggests local-read framework commands, and recurses through
Hidden resource parents (whose endpoint leaves stay runnable).
- Downgrade the unverified state WARN -> INFO; "we didn't check" is not a
warning and shouldn't render yellow in CI dashboards.
Additive: behavior for CLIs that already set auth.verify_path is unchanged.
* fix(cli): split 403 from 401 in doctor GraphQL credential probe
The GraphQL probe collapsed HTTP 401 and 403 into "invalid — check your
credentials". 403 means a valid-but-scope-limited token, so that copy told
operators to replace a working token when they only needed to add scopes.
Mirror the REST probe's split: 401 -> invalid, 403 -> scope-limited.
5261ae73 · 2026-05-19 · fix(cli): return failure exit from verify json (#1693)
* fix(cli): return failure exit from verify json * fix(cli): preserve verify text failure exit * test(cli): assert verify json failure exit * fix(cli): silence verify json failures at root
d8178077 · 2026-05-20 · fix(cli): handle binary-only response endpoints (Accept + base64 envelope) (#1574)
* fix(cli): handle binary-only response endpoints (Accept + base64 envelope)
Generated CLIs hardcoded `Accept: application/json` in the HTTP client
when no per-endpoint override was set, and ran every response through
the JSON sanitizer before returning it as `json.RawMessage`. Endpoints
whose only 2xx content type is non-JSON (e.g. `application/octet-stream`
PDF/file downloads) were therefore rejected by the server with HTTP 406,
and even with the right Accept the bytes would be mangled by the
sanitizer. This is a generic generator gap: it hits any spec with a
binary-only success response.
Fix, using existing plumbing with minimal surface:
- openapi parser: detect success responses whose media types are all
non-JSON / non-`*/*` / non-`+json` and pin `Accept` to that type via
the existing per-endpoint header-override path. New `upsertHeaderOverride`
(and a merge in `applyHeaderOverrides`) keeps the Accept override stable
when configured per-endpoint headers also apply. JSON and `*/*`
endpoints are untouched.
- client.go.tmpl: content-type-gated base64 envelope
(`{"_pp_binary":true,...,"data":"<b64>"}`) for genuinely binary
success bodies so they survive the json.RawMessage contract. JSON,
`*/*`, XML and every text/* type (incl. text/html, so
response_format:html CLIs are unaffected) pass through unchanged. The
error path is byte-identical (still sanitized + truncated).
- command_promoted.go.tmpl: promoted (top-level) GET commands now pass
per-endpoint header overrides, matching typed commands. Without this
the Accept override never reached the client for promoted commands.
Golden: extended testdata/golden/fixtures/golden-api.yaml with one
binary-only endpoint per docs/GOLDEN.md (general machine behavior),
froze its generated command file, and regenerated affected expected
fixtures. All 17 golden cases pass; every diff is attributable to the
envelope path or the one added endpoint.
Verification: go build ./..., go vet ./... (changed pkgs), go test ./...
(0 failures), 5 new parser tests, scripts/golden.sh verify (17/17).
Live-verified against a real binary endpoint: `Accept: application/json`
reproduces HTTP 406; `Accept: application/octet-stream` returns the
file (200, correct content-type).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(cli): thread HeaderOverrides through MCP code-orchestration execute
The original binary-response fix covered typed CLI commands and promoted
commands, but the code-orchestration MCP path (<api>_execute) builds
requests from a slim endpoint table and called c.Get/Post/... directly,
so the per-endpoint Accept override never reached binary-only endpoints
— <api>_execute on a PDF/octet-stream endpoint still 406'd while the CLI
worked.
Add HeaderOverrides to codeOrchEndpoint, emit it in the generated
registry from endpoint.HeaderOverrides, and dispatch through
c.*WithHeaders when present. The client's content-type-gated base64
envelope (already in this branch) then handles the binary body.
Golden: generate-mcp-api/code_orch.go updated (struct field + WithHeaders
dispatch; table emission inert when no endpoint has overrides).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(cli): thread header overrides through typed MCP tools
* fix(cli): avoid text response Accept overrides
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Trevin Chow <trevin@trevinchow.com>
1a243810 · 2026-05-19 · feat(cli): add Quo (formerly OpenPhone) catalog entry and OpenAPI spec (#1597)
Add catalog/quo.yaml plus an in-repo OpenAPI spec for Quo (formerly
OpenPhone), so the Printing Press can generate a printed CLI for the
Quo business-phone API.
Spec covers 18 operations across 14 paths in 6 resource groups:
contacts, conversations, phone-numbers, users, messages, calls. Auth
is via a plain API key in the Authorization header (non-Bearer),
captured in the spec's securitySchemes block.
Provenance:
- tier: community. Quo does not publish a vendor OpenAPI document,
so this spec is community-curated from their public docs. Matches
the kayak / plaid / telegram / sentry pattern.
- info.x-spec-provenance records source: official-docs, the docs URL,
and a confirmed_quirks list. Every path is derived from the
official Quo API reference and cross-verified by live testing
against api.openphone.com/v1. No endpoint relies on MCP tool
schemas or undocumented probing as its sole source of truth.
Quo API quirks captured in x-spec-provenance.confirmed_quirks and
inline schema descriptions:
- POST /messages: 'to' is an array of E.164 strings on both the
request body and the Message response schema. The API rejects a
bare string and returns 'to' as an array even for single-recipient
messages.
- POST /messages: the request body uses 'content' for the message
text while the Message response returns the same text under 'body'.
Real Quo API naming asymmetry, not a curator typo.
POST /messages requestBody wraps the schema in oneOf so the parser
emits a --body-json fallback (and a body_json MCP input) instead of
per-field typed flags. The generator's typed body path serializes
array fields as JSON-strings, which the Quo API rejects; the
--body-json surface lets agents and humans send the array verbatim
("to": ["+155..."]) without round-tripping through a string.
Verified by regenerating and reading
internal/cli/messages_send.go + internal/mcp/tools.go.
testdata/golden/expected/catalog-list/stdout.txt: insert the new Quo
row in social-and-messaging (alphabetical between front and telegram).
No generator code, template, scorer, MCP, or pipeline code changes.
Verification:
- go build -o ./printing-press ./cmd/printing-press
- go test ./... (all packages pass)
- go fmt ./... (no Go files touched)
- go vet ./... (clean)
- scripts/golden.sh verify (20/20 cases pass)
- ./printing-press catalog show quo renders the new tier, provenance,
and notes
- ./printing-press catalog list places Quo in
social-and-messaging between front and telegram
- ./printing-press generate --spec catalog/specs/quo-spec.yaml emits
the expected --body-json fallback warning for POST /messages and
produces a buildable printed CLI that PASSes go mod tidy,
govulncheck, go vet, go build, --help, version, and doctor.
Closes #782 (superseded by #1597).
Co-authored-by: ninjaforhire <andrew@mightyphotobooths.com>
015478bf · 2026-05-19 · feat(cli): detect Auth0 SPA in-memory auth + emit CDP extractor (#1645)
* feat(cli): detect Auth0 SPA in-memory auth at sniff time and emit CDP extractor Some sites (Auth0 SPA SDK v2+ with cacheLocation: memory) keep the access token in JS heap and never write it to cookies or localStorage. The cookie-jar extractor in auth login --chrome has no path to those tokens — DevTools paste was the only way to land them in config until WU-3a (#1641) added auth set-token. This change closes the automation gap. Sniff-time detection looks for /oauth/token responses that carry access_token in the body without a JWT-shaped Set-Cookie on the same response, and annotates the spec with auth.subtype: auth0_spa_in_memory. The generator routes that subtype to auth_browser.go.tmpl, which emits an --auth0-spa flag on auth login --chrome. The CDP path attaches to a running Chrome at --debug-port, installs a Fetch.enable interceptor via chromedp, and captures the next outbound Authorization: Bearer JWT — validated via cliutil.LooksLikeJWT before SaveTokens. Side-effect-command floor applies: the CDP path short-circuits when cliutil.IsVerifyEnv() or cliutil.IsDogfoodEnv() is set, so the verifier matrix and dogfood --live runs never attempt a real Chrome attach. Refs #1598 (WU-3b). * fix(cli): reset auth0 spa token expiry --------- Co-authored-by: Cathryn Lavery <cathryn@bestself.co>
75e4d1b9 · 2026-05-19 · fix(cli): verify-mode HTTP-verb short-circuit + N1 envelope + doctor + read-only POST bypass (#1398)
Closes plan 2026-05-13-001 (U1-U10), the N1 envelope follow-up surfaced in the petstore agent-readiness review, and the greptile P1 read-only-POST finding.
- **Transport-layer gate** (`client.do()`): mutating verbs (DELETE/POST/PUT/PATCH) under `PRINTING_PRESS_VERIFY=1` short-circuit with a synthetic `{"__pp_verify_synthetic__":true,"status":"noop","reason":"verify_short_circuit",...}` envelope. `PRINTING_PRESS_VERIFY_LIVE_HTTP=1` opts back into the real wire for the verify pipeline's mock-mode subprocesses.
- **Read-only POST bypass** (greptile P1): `client.do()` is now a thin wrapper around `doInternal(..., readOnlyIntent bool)`; a new `doRead()` passes `readOnlyIntent=true`. New `PostQueryWithParams` / `PostQueryWithParamsAndHeaders` route through `doRead`. The endpoint template emits `PostQuery*` for `.IsReadOnly` POST commands so GraphQL queries, JSON-RPC reads, and POST-based search dial through the real transport even under verify mode.
- **N1 envelope propagation**: outer command envelope reports `verify_noop: true` and `success: false` when the synthetic sentinel is detected. Naive validators no longer read the noop as a real mutation.
- **Doctor diagnosis line** (U9): `<cli> doctor` surfaces verify state ("normal operation" / "ACTIVE — short-circuit" / "ACTIVE — live HTTP opt-in") so an operator inheriting `PRINTING_PRESS_VERIFY=1` detects the foot-gun without inspecting a response body.
- **Live-verifier env strip** (U10): `live_dogfood` and `workflow_verify` strip both verify env vars from subprocess env via `filterVerifyEnv` so they cannot inherit verify-mode short-circuiting.
- **Per-CLI emitted test** (U5): every regenerated CLI ships `internal/client/client_verify_short_circuit_test.go` covering all four gate states (mutating + verify, LIVE_HTTP opt-in, no env, GET control) plus a `_ReadOnlyPOST` sub-test asserting `doRead` dials through. A template edit that drops the gate fails downstream `go test` rather than silently re-opening the readiness gap.
- **Docs** (U6): AGENTS.md "Side-effect commands" section + `cliutil_verifyenv.go.tmpl` docstring document the transport-layer gate, the LIVE_HTTP opt-in, the `doRead` read-only bypass, the live-verifier strip, and the doctor diagnosis anchor.
- **Regen-merge fixture** (U7): pins `TEMPLATED-WITH-ADDITIONS` classification for the canonical scenario where an operator has hand-added a top-level helper to `client.go` and the fresh template introduces the short-circuit.
- **Rollout playbook** (U8): `docs/solutions/best-practices/verify-mode-short-circuit-rollout-2026-05-13.md` covers the tier:official-first sweep order and known foot-guns.
Verified live on the petstore smoke pipeline: `PRINTING_PRESS_VERIFY=1 petstore-pp-cli pet delete 42 --json` returns the synthetic envelope with no network call.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
019dcf3b · 2026-05-19 · chore(ci): enable parallel queue checks in Mergify (#1668)
* chore(ci): enable parallel queue checks in Mergify Raise `merge_queue.max_parallel_checks` from 1 to 3 and split `queue_conditions` / `merge_conditions` so Mergify can speculate on multiple queued PRs in parallel via `mergify/merge-queue/*` draft PRs. The prior config pinned both `batch_size` and `max_parallel_checks` to 1 under the belief that both were paywalled features on the OSS plan. Mergify support clarified (2026-05-19) that only `batch_size > 1` triggers the paid "Merge Queue Batch" feature; `max_parallel_checks` is a separate, free knob. `batch_size` stays at 1. Greptile compatibility, which was the secondary reason for the old pinning, is handled by the new split: - `queue_conditions` (gates entry on the source PR) keeps the Greptile + `#review-threads-unresolved = 0` requirements. - `merge_conditions` (gates the merge after the speculative draft PR's CI passes) requires only the CI checks that actually run on bot-owned branches. Greptile silent-skips bot branches by design, so requiring it here would block every queued PR. - `merge_protections` continues to re-enforce Greptile + review-threads on the source PR before the GitHub merge, as belt-and-suspenders. * docs(ci): capture mergify parallel-checks learning under docs/solutions/ Add a knowledge-track learning doc that explains the corrected mental model for Mergify on the OSS plan: `batch_size > 1` is paywalled (the "Merge Queue Batch" feature), `max_parallel_checks > 1` is not, and the three-block (queue_conditions / merge_conditions / merge_protections) pattern is what makes draft_pr mode safe alongside Greptile, which silent-skips bot branches by design. Cross-references the wrong-turn history (#1306 raise, #1321 revert, #1336 single-block narrowing) and the present fix (#1668) so the doc is useful both as forward guidance and as context for why the prior config was conservative. * fix(ci): drop pr-title from mergify merge_conditions Greptile flagged this as a P1 on PR #1668: `.github/workflows/pr-title.yml` skips semantic validation only for titles starting with `merge queue:` (the batch-mode prefix from #1306). In `draft_pr` mode with `batch_size: 1`, Mergify's draft PR title format is not guaranteed to match that prefix, so requiring `check-success = pr-title` on the draft could stall every queued PR. The source PR's title is already validated at `queue_conditions` entry and cannot change while queued, so re-checking it on the speculative draft is redundant. Drop it from `merge_conditions` and document the trap in the comment block so the next person editing this config sees why the omission is intentional. Also update the learning doc with this as a third non-obvious failure mode under "Why This Matters".
81f07e53 · 2026-05-19 · feat(skills): check public library for existing CLI before generating (#1650)
* feat(skills): check public library for existing CLI before generating Catches the case where a user kicks off /printing-press for a CLI that already exists in the public library before Phase 1 research burns 30-60 minutes. The new gate sits in Phase 0 alongside the local-library check (mutually exclusive, never double-prompts) and reads mvanhorn/printing-press-library/registry.json via gh api. Matching is agent-driven over the registry, not string-match, so semantic input like "Hacker News reader" finds hackernews, "Cal.com" finds cal-com, and "prediction market" surfaces kalshi. High-confidence hits route the user to /printing-press-reprint; medium-confidence hits present alternatives; low confidence is skipped silently to keep the gate from becoming a dismiss-me prompt. Fails open on network errors. * Address PR review feedback (#1650) - Multi-High match now has its own prompt with correct framing (same product under different names, not "similar/may overlap") and explicit cap-at-2 with truncation guidance for 3+ candidates - Tempfile cleanup guarded with [ -n "$REGISTRY" ] && rm -f so the trailing cleanup doesn't run rm -f "" when the fetch branch already cleaned up and emptied $REGISTRY * Address PR review feedback (#1650) - Specify Combo CLIs prompt concretely with template, cap rule, and confidence tagging. Cap displayed reprint options at 2 across all sources combined to stay under the AskUserQuestion 4-option limit; ordering rule (High over Medium > primary over secondary > canonical slug); truncation note for >2 matches. Continue-with-combo becomes the recommended default since combo CLIs are usually informational. * fix(skills): make combo library check reachable --------- Co-authored-by: Cathryn Lavery <cathryn@bestself.co> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
cda9b43b · 2026-05-19 · fix(cli): make live-dogfood runner enum-aware and resilient to empty outcomes (#1656)
* fix(cli): make live-dogfood runner enum-aware and resilient to empty outcomes Three independent fixes for the live dogfood runner, all in the matrix-builder / acceptance-writer / summary-renderer codepath. 1. Enum-aware happy_path values. `exampleValue` now prefers the first declared enum value when a param carries spec-level enum constraints, so `pet find-by-status --status available` runs instead of the API-rejected `--status example-value`. PII-synthetic shapes still win to keep browser-sniff captures from leaking customer data into examples. 2. `--write-acceptance` writes on every outcome. The flag previously only emitted `phase5-acceptance.json` on PASS, forcing operators to hand-author the FAIL marker the Phase 5.6 gate also forbids editing. The runner now writes `status: "pass"` or `status: "fail"` accordingly; the FAIL marker carries a `failure_summary` block bucketing failures by category (transport_error, http_4xx, http_5xx, exit_nonzero, output_mismatch, other) plus the contributing commands. `phase5_gate.go` already routed `status: "fail"` to the hold path, so the gate behavior is unchanged. 3. Path Validity N/A for empty matrix. `printDogfoodReport` rendered `0/0 valid (FAIL)` when SpecPath was present, the check was not Skipped, and Tested was 0 — cosmetic divide-by-zero misalignment with the scorecard, which reports 10/10 in the same run. Empty matrices now render `N/A`, matching the failure aggregator at `FailedIssues` that already guards on `Tested > 0`. The phase5-acceptance JSON Schema gains an optional `failure_summary` definition, drops the unconditional `tests_passed >= 1` floor, and adds a conditional rule that keeps the floor for `status: "pass"` markers. Closes #1384 * fix(cli): tighten live-dogfood failure classifier per Greptile review Address both findings on PR #1656 review of classifyLiveDogfoodFailure: 1. Match "invalid json" / "not json" independently of the "output" substring so the runner's own literal "invalid JSON" reason strings bucket as output_mismatch rather than falling through to exit_nonzero. 2. Check "http 4" before "http 5" so a retry-count log mentioning "http 5" earlier cannot shadow a real 4xx response (e.g., "retried http 5 times, status http 404"). Adds TestClassifyLiveDogfoodFailure covering both regressions plus the transport_error, output+mismatch conjunction, exit_nonzero, and other branches so future drift trips a targeted assertion instead of the existing aggregate bucket-sum check in TestRunLiveDogfoodWritesFailMarkerOnFail. --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
5cb39a69 · 2026-05-19 · fix(skills): stop phase 4.95 code review from being skipped (#1655)
* fix(skills): stop phase 4.95 code review from being skipped
Phase 4.95's instruction told Claude Code to invoke `/review` for an
in-place code review. But `/review` is PR-shaped — it fetches an open
GitHub PR and comments back via `gh`. At Phase 4.95 there is no PR
yet, so the agent hit the wrong-shape mismatch, then rationalized
skipping the entire phase under the harness-exemption clause ("no
built-in code review"). Code review was silently dropping out of the
pipeline on Claude Code.
Rewrite the section goal-shaped (intent: local review *before* PR
open; CI-time review is the wrong fix window). Tool selection becomes
a survey-and-pick step with `compound-engineering:ce-code-review` and
`/codex:review` as candidate skills and direct reviewer-subagent
dispatch via the Agent tool named as the universal fallback. Explicit
anti-pattern callout on `/review`. Narrow the harness exemption: skip
is only legitimate when neither a review skill nor subagent capability
exists, and "first tool name didn't fit", "no PR yet", and "PR-time CI
will catch it" are explicitly non-acceptable rationales.
Also slim the findings artifact. Fixed-in-place items collapse to a
one-line summary + commit hashes — the commits are already the record.
Full enumeration is reserved for the three non-fix buckets
(template-shape retro candidates, out-of-scope retro candidates,
surface-to-user findings) plus convergence outcome and review-path
chosen.
* fix(skills): clarify phase 4.95 round semantics and trim redundancy
Resolves Greptile P2 findings on #1655:
1. Direct-subagent-dispatch path was ambiguous about what a "round"
means when 3-5 reviewers run in parallel. An agent could fix
correctness findings, re-run only that subagent, see it clear,
and declare convergence with security/maintainability findings
still open. Add: a round means re-running ALL spawned reviewers
in parallel, findings merge into a single set before autofix,
convergence is the merged set being empty.
2. The Autofix policy block restated "cheapest fix window" verbatim
from the opening paragraph. Drop the second occurrence.
---------
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2c3271fc · 2026-05-19 · fix(cli): detect path params in browser-sniff URL grouper (#1657)
* fix(cli): detect path params in browser-sniff URL grouper
HAR-sniffed specs collapsed variable path segments into literal endpoint
names because the normalizer only recognized UUID v4, lowercase hex
hashes, and pure-numeric segments. Application IDs that ship a short
type prefix (`t_xxx`, `cus_xxx`), long opaque base62 / ULID / nanoid
tails, or colon-composite discriminators (`create-image:reference:gpt-
image-2`) all landed in the spec as literal paths, producing per-ID
command files that worked for the exact rows captured and nothing else.
This change:
- Extends `normalizeEntryPath` with prefixed-ID, long-opaque-alnum, and
colon-composite heuristics, each guarded by a non-trivial-token or
mixed-case-or-digit floor so route literals like `subscriptions` or
`host:80` don't get parametrized.
- Derives the placeholder name from the parent path segment
(`tables/t_xxx` -> `tables/{table_id}`) using a conservative
snake-case + trailing-`s` singularizer, with `{id}`/`{uuid}`/`{hash}`
as the fallback when the parent isn't usable as an identifier root.
- Adds a `collapseVariantGroups` post-pass to `DeduplicateEndpoints`
and `DeduplicateTrafficEndpoints` that merges groups whose paths
differ in exactly one segment when at least one member's value
matches a strong ID shape, so cross-entry variance backstops shape
heuristics that miss.
Tests cover the OpenArt history-ID, Clay prefixed-ID, OpenArt colon-
composite form-ID, and the issue's positive/negative acceptance cases.
Closes #1386
* fix(cli): address Greptile findings on browser-sniff path-param detection
Two issues flagged in PR #1657 review:
1. (P1) `collapseVariantGroups` was unreachable as written. Its
`anyOpaque` gate called `looksLikeIDShape`, which uses the exact same
six regex patterns as `normalizeEntryPath` — so any segment that
would satisfy the gate had already been replaced by a placeholder in
the per-segment pass, putting it in a different bucket from the
literal-shaped peer it was supposed to merge with. Replace the gate
with `looksParameterizable`, a weaker check that's TRUE when a
segment has a digit, mixed case, or any strong-ID shape. Also
require ALL members at the varying position to satisfy this gate
(not just one), so a real literal like `health` paired with a
data-shaped sibling stays separate.
Adds a test covering the case Greptile flagged:
`/api/messages/abc123` and `/api/messages/xyz456` (6-char opaque
IDs, no prefix) now collapse to `/api/messages/{message_id}`.
2. (P2) When two ID segments sit directly under the same parent
(`/resources/123/456`), the second one walked back past the
freshly-emitted `{resource_id}` placeholder, found `resources`
again, and emitted a second `{resource_id}` — producing a path with
duplicate parameter names that OpenAPI rejects. Track per-path
placeholder name use and append a counter suffix on collision, so
the path normalizes to `/resources/{resource_id}/{resource_id_2}`.
Adds dedicated single-entry and two-entry tests for the consecutive-
ID case.
* fix(cli): address Greptile follow-up findings on variance pass
Two new P1 findings on the previous fix:
1. `collapseVariantGroups` could still emit duplicate placeholder names
when a per-segment-placed `{resource_id}` lived earlier in the same
path. The variance pass walked back through the existing placeholder,
found `resources` again, and emitted a second `{resource_id}`. Build
a per-target use-count from the existing path's placeholders and
route the variance emission through `disambiguatePlaceholder`, so the
collision becomes `{resource_id_2}` just like the per-segment path.
2. `collapseVariantGroups` was host-blind. `DeduplicateTrafficEndpoints`
keys its dedup map on host but `EndpointGroup` carried no host
field, so the variance pass bucketed entries from different hosts
together and could merge unrelated services into one group. Add a
`Host` field to `EndpointGroup`, populate it in
`DeduplicateTrafficEndpoints`, and include it in the variance
skeleton key.
Adds tests for both: a two-entry case where per-segment normalization
plants a placeholder before the variance position; and a multi-host
case asserting that two distinct hosts stay in separate groups even
when their path shapes coincide.
* fix(cli): narrow variance-pass gate to digit-only widening
P1 follow-up: a pure mixed-case branch (hasUpper && hasLower) in
looksParameterizable was matching PascalCase route literals like
/api/CreateDocument and /api/ListDocuments, which are common in
action-style REST routes (ASP.NET, gRPC-HTTP transcoding). Two such
distinct endpoints would land in the same skeleton bucket and merge into
/api/{api_id}, destroying both routes.
Drop the mixed-case branch entirely. The has-digit branch alone is the
correct widening for the variance pass's target — short opaque IDs like
abc123/xyz456 all carry a digit. The rare digit-free opaque ID is left
for users to parametrize manually rather than risk false-positive
collapses on PascalCase action names.
The variance-pass disambiguation test now exercises digit-bearing
short-opaque IDs (abc123/xyz456 under /resources/) so it stays correct
under the narrowed gate. Adds an explicit negative case: PascalCase
route literals must stay separate.
* fix(cli): make disambiguator scan past suffixed placeholders
P1 follow-up: when a path already carries multiple suffixed
placeholders (`/resources/{resource_id}/{resource_id_2}/...`) and the
variance pass tries to emit a colliding `{resource_id}`, the previous
disambiguator pre-populated `used` with full placeholder strings and
returned `{resource_id_2}` — a name already in the path. Result:
`/resources/{resource_id}/{resource_id_2}/{resource_id_2}`, invalid
OpenAPI.
Rework `disambiguatePlaceholder` to loop on candidate names: start at
the base name, then `_2`, `_3`, ... until a name not already in `used`
is found. Marks every emitted name in `used` so chains stay unique
regardless of how the variance pass pre-populates the map.
Adds a triple-consecutive test asserting that
`/resources/123/456/abc123` and `/resources/789/012/xyz456` normalize
to `/resources/{resource_id}/{resource_id_2}/{resource_id_3}`.
---------
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
17cd2774 · 2026-05-19 · fix(cli): dogfood prefers bundled <dir>/spec.yaml over caller --spec (#1625)
* fix(cli): dogfood prefers bundled <dir>/spec.yaml over caller --spec When the caller invokes `printing-press dogfood --dir X --spec Y` and X contains a spec archived by `publish package`, the archived spec is now authoritative — caller's --spec is overridden. Fixes false-negative Path Validity / Auth Protocol regressions on multi-spec manuscripts runs (browser-sniff, crowd-sniff, hand-authored-on-top-of-official), where the caller picks the upstream spec instead of the CLI's own. Falls through to caller's --spec unchanged when no bundled spec exists. Fixes #1620 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(cli): typed DogfoodSpecSource const, drop ticket refs Address Greptile review: - Introduce DogfoodSpecSource type + DogfoodSpecSourceBundled / DogfoodSpecSourceCaller consts (AGENTS.md: categorical strings -> typed const at introduction). Matches MCPSurfaceState pattern. - Remove ticket-number references from code comments (AGENTS.md: no ticket numbers in code comments). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(golden): refresh dogfood fixtures for bundled-spec auto-discovery Two intentional behavior changes from the dogfood spec-resolution fix: - dogfood-verdict-matrix: stderr gains the `dogfood: using spec ... (bundled)` line; fail-path-auth-dead.json gains spec_source field. - generate-golden-api: same stderr + JSON additions. Also, auth_check and browser_session_check now run substantively (they were skipped previously because the test invokes `dogfood --dir X` without --spec; with bundled-spec auto-discovery the checks engage against <X>/spec.yaml as intended). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(cli): clarify auth_check.detail when bundled spec has no recognized scheme Now that dogfood resolves a bundled spec instead of short-circuiting on no-spec, checkAuth's "expectedPrefix empty" branch is reachable with a spec present. The old message "spec not provided or no bot/bearer/basic scheme detected" contradicted spec_source="bundled" + a non-empty spec_path in the report. Drop the "spec not provided" half — that case no longer reaches this branch. --------- Co-authored-by: Mark van de Ven <10142972+markvandeven@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Trevin Chow <trevin@trevinchow.com>
ac3e15b4 · 2026-05-19 · fix(cli): sync pagination, auth aliases, narrative timing, and codex prompt (#1341)
* fix: sync pagination, auth aliases, narrative timing, and codex prompt
Six independent generator-level findings surfaced during a downstream CLI
generation run against an offset-paginated REST API. Each is generic; the
discovery context is not in the diff or test data.
1. AuthHeader OR-semantics for legacy x-auth-env-vars (spec.go)
IsAuthEnvVarORCase only returned true when all EnvVarSpecs were
non-required per_call. Specs using the legacy x-auth-env-vars list
form (or a populated EnvVars slice with default Required=true) fell
through to the canonical-only path: only the first env-var alias
reached AuthHeader, the rest were populated by Load() but never
read. Updated IsAuthEnvVarORCase to also return true when:
* EnvVarSpecs has 2+ entries that are all request-credentials, OR
* legacy EnvVars list has 2+ entries.
New pin: TestAuthHeader_LegacyEnvVarsList_OrSemantics.
2. validate-narrative side-effect classifier (narrativecheck.go)
--full-examples ran every command whose --help advertised --dry-run,
including auth set-token YOUR_TOKEN_HERE and auth logout. The first
persisted the literal placeholder to the user's ~/.config; the
second wiped saved credentials. Added isSideEffectfulNarrativeExample
skip-classifier covering auth set-token, auth logout, auth setup,
auth login, --launch, and bare --apply. Skipped commands return
StatusUnsupported with an explanatory reason rather than executing.
New pins: TestRunFullExample_SkipsAuthSetToken,
TestRunFullExample_SkipsAuthLogout.
3. Empty-array marshalling guidance (codex-delegation.md)
Codex-generated novel-feature commands declared var results []T,
which marshals nil to JSON null. Empty list outputs broke jq '.[]'
agent pipelines. Updated the transcendence-command prompt template
to require results := make([]T, 0) for all list-shape outputs, with
a paragraph at the top of CONVENTIONS spelling out the contract.
4. Shipcheck leg ordering (shipcheck.go)
dogfood ran first and synthesized README.md and SKILL.md from
research.json.novel_features_built — including any planned commands
whose command-paths didn't actually resolve against the built binary.
validate-narrative ran later and caught them but the user-facing
files were already wrong. Reordered: verify, validate-narrative,
dogfood, workflow-verify, verify-skill, scorecard. Comment updated
to reflect the dependency: verify builds the binary; validate-narrative
checks research.json against the binary BEFORE dogfood renders from it.
5. Offset+has_more pagination loop (sync.go.tmpl)
The sync loop's break-condition required nextCursor != "" alongside
hasMore=true. APIs using offset+has_more (no cursor token in the
response) returned hasMore=true with empty nextCursor on every page,
so the loop broke after page 1 and only the first page worth of
records reached the local store. Fixed at both occurrences (linear
and parent-child sync paths): when cursorParam=="offset" and the
envelope returned no cursor despite hasMore, compute nextOffset
client-side as currentOffset + pageSize.limit. Cursor-based APIs
that genuinely return no cursor still break (existing behavior;
silent infinite-loop guard). New pin:
TestGeneratedSyncAdvancesOffsetWhenHasMoreWithoutCursor.
6. Per-resource pagination param gate (profiler.go + sync.go.tmpl)
Sync sent ?limit= and ?offset= to every list endpoint regardless of
whether the spec declared those params for that endpoint. List
endpoints that don't paginate (typical for /me, /settings, small
reference resources) rejected the synthetic params with HTTP 400
"Invalid query parameter". Added profiler.SupportsPagination per
syncable+dependent resource (detected from endpoint params at
generate time). Generator template emits resourceSupportsPagination()
from the per-resource map; sync gates limit/offset setting on its
return value. New pin:
TestGeneratedSyncGatesPaginationParamsPerResource.
Test coverage:
* go build ./... — pass
* go vet ./... — pass
* go test ./... — pass (30 packages, ~13min runtime)
* fix: use exact side-effect flag matching
* fix: detect cursor-only pagination support
* test(cli): refresh sync pagination goldens
---------
Co-authored-by: Trevin Chow <trevin@trevinchow.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
275646a3 · 2026-05-19 · feat(cli): add auth set-token escape hatch for cookie-auth CLIs (#1641)
* feat(cli): add auth set-token escape hatch for cookie-auth CLIs
The auth_browser template now emits an `auth set-token <jwt>` subcommand
alongside login/status/logout. This is the escape hatch for sites whose
access token cannot be reached by the cookie-jar extractor in
`auth login --chrome` — most commonly Auth0 SPA SDK v2+ deployments that
keep the JWT in JS heap memory and never expose it to cookies or
localStorage. Users (or agents) paste the bearer from DevTools instead of
hand-editing config.toml.
Validation runs through cliutil.LooksLikeJWT (shipped in PR #1602 / WU-2),
so short Cloudflare-shaped tracking cookies like `__cf_bm` get rejected
with a hint pointing back at the DevTools paste flow. Emission is gated
on Auth.Type != "none", so auth.type=none + persisted-query CLIs (the
only path that routes a no-credentials spec through this template) don't
ship a subcommand they have nothing to save into.
Two stale assertions in the cookie/composed auth_browser regression
tests used the literal "set-token" as their proxy for "this is not the
auth_simple template." That proxy no longer holds — auth_browser now
legitimately emits set-token too. Swapped to `newAuthSetupCmd` as the
auth_simple-only signature, since auth_browser uses newAuthLoginCmd for
the cookie/chrome flow instead.
Refs #1598 (WU-3a).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(cli): zero TokenExpiry in auth set-token to avoid stale write
SaveTokens used to receive cfg.TokenExpiry from the loaded config, which
in the escape-hatch scenario is a past timestamp from an expired prior
session. The auth_browser status command doesn't consult TokenExpiry
today, so the bug wasn't immediately surfacing — but writing a known-
stale value violates the zero-on-write invariant that ClearTokens and
SaveBearerToken already follow in config.go.tmpl, and would mislead any
future expiry-aware status check.
Passing time.Time{} keeps the API "we don't know the lifetime"; the real
expiry surfaces via 401 on the next call, same as the rest of the
browser-auth flow.
Refs #1598 (WU-3a).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
f9bb82c8 · 2026-05-19 · fix(skills): reprint discovers and carries prior patches (#1649)
* fix(skills): reprint discovers and carries prior patches Reprinting silently dropped post-publish hand-fixes recorded in .printing-press-patches.json, regressing live-validated API quirks and architectural patterns. Phase B now re-fetches the public patches file (covering the case where amends landed without a regen, so local can lag even when run_id matches), and Phase D threads non-empty patches into the /printing-press hand-off under a new "## Prior Patches" heading. Patches are framed as an informational watch-list, not a re-apply mandate — the machine may have absorbed some upstream, and the retro+bugfix loop is the right mechanism for that drift, not a per-patch reconciliation gate. * fix(skills): make patches discovery's fetch durable Address Greptile P2 findings: the prior mktemp-based fetch leaked the temp file on the success path (accumulating across repeated reprint runs) and used the ephemeral path as the downstream `$PATCHES_SOURCE` reference, which a long-running /printing-press hand-off could find absent. Refresh the local patches file from public via mktemp + atomic rename instead. The temp file is always either renamed or removed, and PATCHES_SOURCE is always the stable local path the downstream agent can open.
b5b1dd59 · 2026-05-18 · feat(cli): add cliutil.LooksLikeJWT shared validator with length floor (#1602)
* docs(cli): file factor75 retro — 3 systemic findings from live dogfooding
Live debugging surfaced three machine-side gaps that compound on any
sniffed BFF CLI:
1. Hand-authored sync silently drops URL personalization params,
degrading responses to a generic preselect without changing JSON shape.
2. looksLikeJWT has no minimum-length floor and saves short Cloudflare /
tracking cookies as access tokens.
3. auth login --chrome can't reach Auth0 SPA SDK in-memory tokens (now
the SDK default since v2 deprecated localStorage as XSS-unsafe).
Tracked as GitHub issue #1598 with three WUs that can be picked up
separately. The Factor75 printed CLI's matching syncer fix is in the
local library (~/printing-press/library/factor75/) and is unaffected by
this commit.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cli): add cliutil.LooksLikeJWT shared validator with length floor
Adds a generator-emitted cliutil helper that every printed CLI now
carries: LooksLikeJWT(string) bool and FindJWTInCookieJar(jar) string,
both with a 150-char total / 20-char header minimum that filters out
Cloudflare bot-management cookies, CSRF tokens, and other short shapes
that share JWT's three-base64url-segments structure.
Until now, sniffed CLIs that need to validate a JWT shape (e.g. when
extracting a Bearer from a cookie jar) had to hand-author the check,
and the hand-authored versions inherit a false-positive: any three-
segment base64url string passes regardless of length. The factor75
printed CLI hit this with the Cloudflare `__cf_bm`-shaped value
`01KRPVRYA2SNQT9BAGD6984WAG_.tt.1` (31 chars), which got saved as the
access token and produced confusing HTTP 401 "invalid character"
decode errors on every subsequent API call.
The helpers are purely additive — no current template calls them, so
no rendered output changes for existing CLIs. They become useful as
soon as auth templates start needing them (next PR: WU-3a `auth
set-token` subcommand uses LooksLikeJWT as its validator).
Refs #1598 (WU-2).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(cli): address PR review feedback on jwtshape helper (#1602)
- Tighten boundary tests to hit 149/150 exactly so constant changes
(150 -> 155) or off-by-one comparison drift surface immediately.
Previous fixtures sat at 108 and 158 chars, neither exercising
the floor.
- FindJWTInCookieJar now strips a leading "Bearer " from the cookie
value before returning, matching LooksLikeJWT's input normalization.
A cookie carrying the Authorization wire value ("Bearer eyJ...")
used to return the prefixed form, which would produce a double-
prefixed Authorization header when a caller built the header from
the result. New test case proves the bare token comes back.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
ed17d302 · 2026-05-18 · fix(cli): gate ship plans on agent readiness (#1638)
* fix(cli): gate ship plans on agent readiness * docs(cli): document readiness ship gate learning * fix(cli): clean readiness finding rendering * fix(cli): normalize readiness table findings * fix(cli): clarify readiness verdict holds --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
af9ba8c7 · 2026-05-18 · docs(skills): document separate-file pattern for extending emitted files (#1624)
* docs(skills): document separate-file pattern for extending emitted files Add a Phase 3 callout to skills/printing-press/SKILL.md warning that hand-edits to any generator-emitted file (`config.go`, `client.go`, `auth.go`, `store.go`, `root.go`, plus the `cliutil_*` / MCP / sync families) are wiped on `printing-press generate --force` and reconciled by `printing-press regen-merge`. Only whole hand-authored files survive across regen; inline additions (struct field, header in do(), AddCommand call, migration row) are not preserved. Names the separate-file pattern per common extension case: - Custom config fields -> internal/config/<api>_config.go - Custom request headers -> internal/client/<api>_headers.go - Custom auth flow -> internal/auth/<api>_auth.go - Extended store schema -> internal/store/<api>_migrations.go - New novel command -> internal/cli/<feature>.go When no separate-file route exists (an AddCommand call with no registry hook, a case branch in a method switch), the callout directs agents to file a generator issue rather than inline-editing. Closes #1604 * docs(skills): reconcile novel-command bullet with Phase 3 skeleton; scope header injection Two Greptile findings on PR #1624: P1 - "New novel command" bullet contradicted the existing Phase 3 skeleton (lines 2491-2495), which instructs agents to wire hand-authored commands via AddCommand in root.go. The earlier text implied the body file alone was sufficient, and the closing paragraph routed AddCommand edits to "file a generator issue." An agent following that guidance would ship a command file that is never registered in the Cobra tree. Reworded to: - The command body lives in internal/cli/<feature>.go (survives regen). - The AddCommand call still goes in root.go per the existing skeleton. - `generate --force` wipes that call, but `regen-merge` re-injects it via the lost-registration mechanism in internal/pipeline/regenmerge/apply.go. - Prefer regen-merge over --force for refreshes. - Spec-declared commands need no hand-wired AddCommand at all. P2 - "Custom request headers" bullet said the exported func is called "before each request," implying global injection. The generated client.go has no per-request mutator chain; the only injection surface is GetWithHeaders / PostWithHeaders called explicitly by novel code. Reworded to make the scope explicit: the helper builds the header map, novel code passes it to GetWithHeaders/PostWithHeaders, and generated endpoint commands are unaffected. Also tightened the closing fallback to exclude AddCommand (which is already covered by regen-merge) and call out which inline diffs actually warrant a generator-issue ask. * fix(skills): correct auth extension path and remove fictional method switch The custom-auth-flow extension pattern pointed agents at `internal/auth/<api>_auth.go`, but no `internal/auth/` package exists — all four auth templates (`auth.go.tmpl`, `auth_simple.go.tmpl`, `auth_browser.go.tmpl`, `auth_client_credentials.go.tmpl`) emit to `internal/cli/` under `package cli`. Following the guidance produced an orphan package that nothing in the generated tree imports. Also dropped the reference to a "templated method switch in `auth.go`": the generated `auth.go` uses constructor functions (`newAuthLoginCmd`, `newAuthSetupCmd`, etc.), not a switch. Aligns the auth extension with the side-by-side same-package invariant that the other four extension patterns already follow (`internal/config/`, `internal/client/`, `internal/store/`, `internal/cli/`). * Update skills/printing-press/SKILL.md Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
766354e6 · 2026-05-18 · feat(cli): add sync --path-context KEY=VAL runtime override for template placeholders (#1631)
* feat(cli): add sync --path-context KEY=VAL runtime override for template placeholders
The narrower spec-extension fix #1368 makes per-tenant sync work when the
spec declares `info.x-tenant-env-var` and the user's environment holds
the value. That covers the steady-state ServiceTitan case but leaves
three gaps named on the issue:
- One-off override at the call site (env says A, this run should target B).
- Placeholders the spec did NOT annotate with an env var, so the
existing `EndpointTemplateVars` substitution has nothing to read.
- The workspace/org generalization beyond `{tenant}`.
The `--path-context KEY=VAL` flag (repeatable) on `sync` plugs all three
into the same generated machinery `EndpointTemplateVars` already uses.
At RunE time the values land in `c.Config.TemplateVars`, so the existing
`buildURL` substitution pipeline picks them up for every request without
new request-path manipulation.
Profiler-driven emission: gated on `.EndpointTemplateVars` being non-
empty so plain APIs (which have nothing to substitute) keep their
existing sync flag surface intact. The matching byte-compat test asserts
the flag is absent from plain CLIs.
Closes #1332
* fix(cli): warn on unknown --path-context keys; drop assertions belonging to #1632
Greptile flagged two findings on PR #1631:
1. Four test assertions referenced template output (emitCacheRefreshFailedEvent,
cache_warning, refresh_failed) that does not exist on this branch. Those
symbols come from PR #1632's auto_refresh template change and were
accidentally included here. Removing them so the freshness-helper test
passes on this branch; #1632 carries the matching assertions.
2. --path-context silently accepted keys outside endpointTemplateVarSet,
so typos like --path-context tneant=... would store the value in
Config.TemplateVars without substituting anywhere, leaving the run
looking correct but using the env-resolved default. Emit a one-line
stderr warning per unknown key. Non-fatal so callers passing
forward-compat keys aren't blocked.
---------
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
187b6992 · 2026-05-18 · fix(cli): emit structured cache_warning JSON on auto-refresh failure (#1632)
* fix(cli): emit structured cache_warning JSON on auto-refresh failure
When autoRefreshIfStale's bounded refresh hits an upstream error and the
command proceeds with the stale cache, the generator now emits a
one-line JSON event to stderr alongside the existing prose warning:
{"event":"cache_warning","reason":"refresh_failed","resources":["homes"],"error":"..."}
meta.freshness already carries this signal in --json output for commands
that wrap with wrapWithProvenance, but novel commands that build their
own response shape (and most agent-facing fan-outs to printed CLIs) only
saw the prose warning on stderr. Agents reading the stdout stream had no
parseable way to know subsequent rows were served from a cache that
doesn't reflect their requested filters.
The new emitter sits next to the prose warning so both stay aligned; the
prose stays for humans, the JSON line gives agents a single grep-able
signal that matches the established sync_warning/sync_error vocabulary.
The matching auto_refresh_test.go.tmpl exercises the emitter shape in
every generated CLI with cache enabled.
Closes #1263
* fix(cli): panic-safe captureStderr + generator assert for auto_refresh_test.go
Addresses Greptile findings on #1632:
- P1: captureStderr lacked deferred cleanup, so a panic in fn() would leak
the io.ReadAll goroutine and hang the test binary. Add a defer that
closes the write end of the pipe and restores os.Stderr, leaving the
happy-path explicit calls as the primary path.
- P2: TestGenerateFreshnessHelperEmitted now asserts auto_refresh_test.go
is emitted with the expected helpers and snippets. Golden fixtures have
no cache-enabled case, so without this a Go syntax error in the
template would only surface when a customer runs go build.
---------
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
e798f671 · 2026-05-18 · fix(cli): route Swagger 2.0 specs through openapi2conv to avoid OOM on circular refs (#1630)
* fix(cli): route Swagger 2.0 specs through openapi2conv to avoid OOM on circular refs Swagger 2.0 specs with circular $ref chains in definitions/ (Tripletex, NetSuite REST, Salesforce Tooling) caused the generator to burn 15-30 minutes of CPU at 1.8-4.4 GB RSS and eventually OOM. The same content converted to OpenAPI 3.x externally via swagger2openapi generated in about three minutes. Detect Swagger 2.0 at the parser boundary (normalized JSON has top-level "swagger": "2.0") and route through openapi2conv.ToV3WithLoader before the OpenAPI 3 loader runs. The conversion rewrites #/definitions/X to #/components/schemas/X so the existing cycle-aware OpenAPI 3 code path handles resolution. openapi2conv is a sub-package of kin-openapi, which is already a dependency. Emit one stderr line announcing the conversion so operators have visibility into the multi-minute resolution phase. The retro called out the silent phase as the biggest UX issue in the failure mode. Closes #1241 * fix(cli): address Greptile feedback on Swagger 2.0 loader (P1 + 2 P2s) P1 (Missing ReadFromURIFunc): the conversion path's loader did not install the custom ReadFromURIFunc that the main OpenAPI 3 path uses, so a Swagger 2.0 spec loaded with a file location whose external $refs pointed at YAML companion files would skip the YAML->JSON normalization step and fail deep inside ToV3WithLoader. Extract the loader setup into newConfiguredOpenAPI3Loader and call it from both paths. P2 (Overly permissive version match): drop the "swagger":"2" prefix variants; the Swagger 2.0 spec mandates exactly "2.0" so the bare "2" forms only matched hypothetical future version strings. Add test fixtures asserting "2" and "2.5" do not trigger detection. P2 (Goroutine leak on timeout): document the intentional leak in the 30s-timeout branch of the cyclic-ref regression test. Parse exposes no cancellation hook; failing the test fast and abandoning the goroutine is the lesser evil compared to letting CI sit for ~25 minutes before OOMing. Refs #1241 * fix(cli): detect Swagger 2.0 via streaming JSON decode, not head substring Greptile P1: the substring-scan detector silently missed real-world Swagger 2.0 specs. normalizeSpecData round-trips through encoding/json, which sorts map keys alphabetically — so "swagger" (s) lands AFTER "definitions" (d) and "paths" (p) in the serialized output. For a multi-MB vendor spec (Tripletex, NetSuite, Salesforce), the "swagger" marker is far past any reasonable head-buffer window, and the detector returned false on the exact specs this PR was built to handle. Switch to a streaming json.Decoder that walks top-level keys, returning true only when a top-level "swagger" key has the value "2.0". Stops reading after the swagger value is found; for non-Swagger 2.0 specs it traverses tokens at the top level (skipping nested values en bloc), which is still fast for the ~2MB upper bound of real specs. Add a regression test that builds a Swagger 2.0 fixture whose alphabetized serialization pushes the "swagger" marker well past the 4KB mark. Refs #1241 --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
042a78d4 · 2026-05-18 · feat(cli): flag empty defaultSyncResources at dogfood time (#1633)
* feat(cli): flag empty defaultSyncResources at dogfood time When a spec exposes no bulk-list endpoint (only parameterized detail pages and required-query searches, e.g. Allrecipes), the profiler correctly produces an empty SyncableResources slice, but the generator still emits `sync` as a runtime no-op alongside store-dependent novel commands (cookbook, pantry, top-rated, ...). The CLI ships with no advertised path to populate the store. Add a dogfood pipeline_check signal that detects the empty-list emission of defaultSyncResources() in the generated sync.go and surfaces it as WARN so the gap is visible at shipcheck time. Also emit a one-line runtime hint (stderr in human mode, sync_warning JSON event in agent mode) when the structural precondition holds, so callers see "no bulk-list endpoints in spec; populate the store via single-fetch commands" instead of a silent total_records:0. Closes #1156 * fix(cli): always emit sync_file_emitted in pipeline_check JSON Greptile flagged a JSON-tag asymmetry on PipelineResult: SyncFileEmitted carried `omitempty` but SyncResourcesPresent did not, so when sync.go is absent a downstream consumer sees `sync_resources_present: false` with no sync_file_emitted signal, which incorrectly reads as "should have resources but does not." Drop the `omitempty` so both fields always appear together and consumers can disambiguate the three real states: sync_file_emitted=false, sync_resources_present=false no sync surface sync_file_emitted=true, sync_resources_present=true healthy sync_file_emitted=true, sync_resources_present=false empty (issue #1156)
14bc18a4 · 2026-05-18 · feat(cli): default mcp.transport=[stdio, http] for small APIs (#1629)
* feat(cli): default mcp.transport=[stdio, http] for small APIs Specs that leave the mcp.transport field unset now get http compiled in alongside stdio when the typed-endpoint surface is at or under spec.DefaultRemoteTransportEndpointThreshold (30). Stdio-only servers can only reach clients that can spawn a subprocess; cloud-hosted agents need a remote transport. Adding http at small surface sizes costs nothing in tool count or agent context and lifts mcp_remote_transport from 5/10 to 10/10 in the scorecard. Explicit transport lists pass through unchanged: a spec that opts into mcp.transport: [stdio] stays stdio-only even at small endpoint counts. Larger APIs continue to fall back to stdio-only by default, where the dominant problem is tool-count, not reach, and warnUnenrichedLargeMCPSurface keeps recommending the orchestration pattern. Resolution lives on a new APISpec.EffectiveMCPTransports helper so the template branch reads from a single source of truth that knows both the configured field and the endpoint count. MCPConfig.EffectiveTransports remains the unconditioned view for spec validation and mcp_audit. Closes #1603 * docs(cli): clarify Transport field comment per Greptile review The inline struct-tag comment on MCPConfig.Transport said "empty == [stdio]", but after the small-API default the empty case resolves via APISpec.EffectiveMCPTransports to [stdio, http] for small APIs and to [stdio] only for larger ones. Update the comment to reflect that.
f671b7ba · 2026-05-18 · feat(ci): mirror supply-chain hardening from printing-press-library (#1619)
* feat(ci): mirror supply-chain hardening from printing-press-library
Adds a layered PR-time gate against the workflow-trust and Go-module env
attack shapes observed in May 2026 (TanStack mini-Shai-Hulud,
BufferZoneCorp, node-ipc).
Two layers, applied to PRs touching .github/workflows/**:
1. Deterministic Python scan in .github/scripts/verify-supply-chain/,
vendored from mvanhorn/printing-press-library (source dated 2026-05-17).
scan.py is verbatim; signals.py is adapted to the generator-repo signal
set — R3 (replace directives in library/**/go.mod), R5 (npm lifecycle),
and R6 (module-path drift) are omitted because they protect surfaces
that don't exist here. R1 (pull_request_target + PR-head checkout),
R2 (id-token outside allowlist; empty allowlist here), and R4
(GOPROXY/GOFLAGS/GONOSUMCHECK overrides) apply with minor adaptation.
15 unit + integration tests pass.
2. Four Greptile rules covering the same signals plus a judgment-only
credential-path read rule for internal/**/*.go and cmd/**/*.go.
Companion PR in mvanhorn/printing-press-library:
https://github.com/mvanhorn/printing-press-library/pull/665
Canonical incident timeline and primary-source citations live in the
published-library repo's docs/solutions/security/2026-05-supply-chain-hardening.md
— single source of truth across both repos.
Informational on landing — promote to required check after a one-week
green window confirms no false-positive miscalibration on real PRs.
* fix(ci): close scanner self-bypass gap in supply-chain workflow
Mirrors the workflow fix from mvanhorn/printing-press-library#665.
Original posture: workflow checked out PR head, so the scan.py
executing the gate was whatever the PR shipped. A malicious PR
could weaken scan.py and bypass detection of its own payload.
New posture: check out the base branch from the base repo (the
trusted scanner version runs), fetch the PR head SHA as a
detached ref, and pass it to scan.py via --head-ref.
Forward-looking concern — this check is informational on
landing but matters once promoted to a required gate.
(R3 / block-form replace evasion does not apply here — the
generator-repo mirror omits R3 entirely; see signals.py header.)
* fix(ci): bootstrap fallback when base has no scanner yet
Mirrors the printing-press-library fix. The previous workflow rewrite
runs scan.py from the base branch, but this PR is what introduces
scan.py, so base has nothing to run. Adds an if-not-exists fallback
that restores .github/scripts/verify-supply-chain/ from the PR head
SHA. No-op after merge.
* fix(ci): R1 flow-sequence trigger + diff-aware R1/R2/R4
Mirrors the printing-press-library fix. Two gaps Greptile flagged
on PR #665 of the published-library repo apply equally here:
1. R1 trigger regex missed YAML flow-sequence form
`on: [pull_request_target, push]`. Added a second regex
(_PR_TARGET_TRIGGER_FLOW) and unified via _has_pr_target_trigger().
2. R1/R2/R4 scanned full head_content rather than diff additions.
Refactored via a shared _lines_to_scan() helper: full scan for
new files, added_lines only for existing files. Prevents false
positives if main ever drifts to contain a pattern these rules
cover.
19 tests pass (was 15).
* chore(ci): mirror scan.py signature change from printing-press-library
PR #665 added rename-aware diff handling to scan.py: changed_files()
returns old_path for renames/copies, and build_change() fetches
base_content from old_path on renames. The signature change is benign
in the generator-repo mirror (R3/R5/R6 are omitted here, so no signal
currently consumes the rename information), but kept in lock-step
with the source to make future cherry-picks of signal changes
mechanical.
Mirror commit only. Tests unchanged (19 pass).
* fix(ci): deletion-guard + id-token regex edge case (mirror)
Mirrors the printing-press-library fix:
1. Workflow gains a deletion-guard step that hard-fails any PR which
removes files under .github/scripts/verify-supply-chain/. Closes the
staged delete-then-replace attack against the bootstrap fallback.
2. _ID_TOKEN_WRITE regex now accepts an optional trailing YAML comment
(`id-token: write # justification`) so attackers can't evade the
strict end-of-line match.
20 tests pass (was 19).
* docs(agents): trim supply-chain section to operational guidance
Mirror of the printing-press-library trim. AGENTS.md no longer narrates
the incident set or enumerates signals; greptile.json is authoritative
for rule coverage, and the published-library solutions doc carries the
incident timeline + primary sources.
* fix(ci): YAML-parse R1/R2/R4 to close block-scalar bypass
Greptile flagged on PR 1619 (4/5): a workflow using YAML block-scalar
notation evades the single-line regex.
ref: >-
\${{ github.event.pull_request.head.sha }}
Both the regex `_DANGEROUS_REF` and `_ID_TOKEN_WRITE` required the
sensitive value on the key's line; valid YAML with the value folded
onto the next line silently passes. Each new YAML quirk (block-form
replace, flow-sequence trigger, now block-scalar values) needed its
own regex patch — that's a brittle approach.
Switched R1/R2/R4 to parse the workflow with pyyaml (pre-installed on
ubuntu-latest runners) and walk the parsed dict tree:
- R1 walks jobs → steps → uses=actions/checkout* → with.ref, and
matches the loaded ref value against a (still-regex) pattern for
dangerous expressions. YAML normalises block-scalars before the
match runs, so all forms collapse to the same string.
- R2 walks workflow-level and job-level `permissions.id-token`. Also
catches `permissions: write-all` which grants id-token implicitly.
- R4 walks env blocks at workflow, job, and step level.
Diff-awareness is now STRUCTURAL: parse both base and head, fire only
if head has the dangerous pattern AND base didn't. Replaces the
line-level _lines_to_scan approach for these signals — more robust
because reformatting (reindent, change YAML style) of an unchanged
dangerous pattern no longer false-fires.
Two new tests cover the folded (`>-`) and literal (`|-`) block-scalar
ref forms. The refs/pull regex also fixed to use [^\\n] instead of
[^\\s] so spaces inside \${{ ... }} don't break the match.
22 tests pass (was 19).
* fix(ci): R1 catches github.head_ref + merge_commit_sha shortcuts
Greptile P1: the dangerous-ref pattern missed github.head_ref (shorthand
alias for event.pull_request.head.ref) and event.pull_request.merge_commit_sha
(GitHub's synthesised test-merge commit). Both resolve to PR-author-controlled
content under pull_request_target — same elevated-context attack surface as
the previously-covered forms.
Same fix mirrored in mvanhorn/printing-press-library#667.
24 tests pass (was 22).
* chore(ci): gitignore __pycache__ and untrack stray .pyc files
verify-supply-chain Python tests were generating .pyc files that got committed because .gitignore had no Python rules.
---------
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
ef81ca04 · 2026-05-17 · test(cli): update TestPublishSkillSkipsCliSkillsMirrorRegen for new library gate name (#1618)
#1614 (docs(skills): publish skill aligns with library's bot-only generated-artifacts rule) updated the publish skill's prose to reference the new `Fail on changes to generated artifacts` gate that mvanhorn/printing-press-library#659 introduced. The existing contract test still asserted the old strings: - "Guard against hand-edits to cli-skills mirror" (gate name retired) - "Do NOT regenerate or commit \`cli-skills/pp-<api-slug>/SKILL.md\` here" (now extended to cover both cli-skills and registry.json) #1614's CI passed because change-scoped test selection didn't include the pipeline shard (the skill change touched skills/, not internal/ pipeline/). The full-suite matrix that runs on release-please PRs caught the divergence on the next release prep (release-please#1495 failing on test (pipeline)). Updated the assertions to match the current skill text. Intent is unchanged: verify the skill names the current rejection mechanism and explicitly warns against committing the generated files.
dde2a4e0 · 2026-05-17 · docs(skills): publish skill aligns with library's bot-only generated-artifacts rule (#1614)
mvanhorn/printing-press-library#659 replaces the older Guard + auto-fix + fork-only drift trio with a single check, `Fail on changes to generated artifacts`, that hard-fails any PR — fork or same-repo — whose diff touches `registry.json` or `cli-skills/pp-*/SKILL.md`. The in-PR auto-fix path is gone; the only legitimate flow is to drop those files from the diff and let post-merge regen (`generate-skills.yml`, `generate-registry.yml`) produce them. Three references in the publish skill described the old behavior: 1. The intro paragraph after the trigger phrases (line ~30) cited `Guard against hand-edits to cli-skills mirror`. 2. The Step 6 bash comment block (line ~461) described the fork-only-pre-rejection + same-repo-auto-fix split. 3. The Greptile-feedback section (line ~942) cited "your edits will be overwritten" without naming the gate. Each now references `Fail on changes to generated artifacts` and the single uniform behavior. No behavior change in the skill itself — Step 6 already does not regenerate or commit these files. This is doc alignment only.
fef027fe · 2026-05-17 · fix(skills): retro skill scrubs secrets and PII before posting issue bodies (#1595)
* fix(skills): retro skill scrubs secrets and PII before posting issue bodies
The retro skill already scrubs artifact zips (via references/secret-scrubbing.md
Layers 1-4) before catbox upload, but issue body text went straight from the
retro doc to `gh issue create` with no scrub step. A finding *about* a
secret-leak could quote the actual leaked value as "evidence" and re-leak it
in a public GitHub issue. The retro doc itself was also unscrubbed despite
being preserved in manuscript proofs and read by future runs' dedup scan.
This change closes both gaps:
1. **New cardinal rule** at the top of the retro skill's Cardinal rules
section: issue bodies and retro docs are public surfaces and must be
scrubbed before posting / writing. Specifically warns against the
"quote the leaked value as evidence" failure mode that retro findings
about secret leaks are most vulnerable to.
2. **New Layer 0 in `references/secret-scrubbing.md`**: a reusable
`scrub_body` shell function that operates on a single markdown file
(the retro doc or an issue body). Hard-fails on unredacted vendor-prefix
tokens (Stripe, GitHub, Slack, AWS, OpenRouter, Anthropic, Linear,
Mailchimp, JWT, Bearer-with-value); auto-redacts PII (real emails,
NANP phones, ZIP+4, Mailchimp inbox-ids) in place. Allowlists RFC 2606
reserved example domains and NANP fictional 555-01XX phone numbers
so legitimate documentation examples pass through unchanged.
3. **Phase 5 (retro doc write) scrubs the doc** immediately after writing
it, before the manuscript proofs + scratch copies are made canonical.
Hard-fails surface as a stop with explicit redaction instructions; PII
auto-redacts and writes the cleaned version in place.
4. **Phase 6 Step 3 (issue/comment post) scrubs body files** before each
`gh issue create` / `gh issue comment` call. Per-WU hard-fails route
into the existing `$FAILED_ISSUES` reporting as a new `scrub-failed`
outcome kind so the user sees what needs hand-redaction.
5. **Body template updated** to explicitly warn agents to redact in the
"What we observed" section of new issue bodies; references the Layer 0
shape so the agent has the redaction format at hand.
6. **New skill-level rule** added to the Rules section: never quote a
leaked secret as evidence of a secret-leak finding.
Verified end-to-end with smoke tests against four input shapes:
- clean input (no findings) passes through with zero diff
- Linear API key (`lin_api_<40+ chars>`) hard-fails with line numbers
- Mailchimp API key (`{32-hex}-us6`) hard-fails with line numbers
- PII (real email, NANP phone, ZIP+4, Mailchimp inbox-id) auto-redacts;
RFC 2606 example.com and NANP 555-01XX pass through unchanged
`go test ./internal/cli/...` green; `scripts/golden.sh verify` green.
Scope: skill markdown only, no Go code changes. No new binary subcommand
needed in this change; the scrubbing is bash-resident in the skill so
users running the skill outside a printing-press source checkout still
get the protection.
* fix(skills): retro scrub_body — fictional 555-01XX exclusion handles paren format (Greptile P2 on #1595)
The original NANP phone regex anchored the (?!555[-\s.]?01) negative lookahead
before the optional opening paren \(? — so when a fictional number is written
as `(555) 012-3456`, the position before the `(` is not where `555` lives,
the lookahead never fires, and the fictional number gets auto-redacted as
PII. API doc examples in that style would be mangled in scrubbed output.
Replace the negative lookahead with a capture-and-decide-inline approach:
extract the area code ($1) and exchange ($2), then check `$a eq "555" &&
$e =~ /^01/` inside a /e replacement.
Two Perl gotchas the new form has to handle:
1. **`$1`/`$&` aren't reliably accessible after the regex engine hands the
replacement to the callback.** Snapshot into lexicals immediately.
2. **The inner `$e =~ /^01/` test resets `$&` to "01".** Without snapshotting
`$&` before the inner match, the carve-out path returns just "01" instead
of the whole original phone string.
The fix snapshots `$&`, `$1`, `$2` into `$w`, `$a`, `$e` *before* running
the inner regex, then uses `$w` (lexical copy of the whole match) for the
preserved path.
Verified against an expanded test matrix:
REAL phones (redact):
425-761-6499, (425) 761-6499, +1 425-761-6499, +1 (425) 761-6499,
4257616499, 425.761.6499 — all → <REDACTED:phone-us>
FICTIONAL 555-01XX (pass through):
555-0142, 555-0100, (555) 012-3456, (555) 0123456, +1 555-012-3456,
+1 (555) 012-3456, 5550123456, 555.012.3456 — all preserved
OTHER PII (redact): emails, ZIP+4, Mailchimp inbox-id — all redact
ALLOWLIST (pass through): @example.com, @example.net, @example.invalid
HARD-FAIL (refuse to write): lin_api_*, {32-hex}-us\d{1,2} — all hard-fail
Comment + code update explain the Perl variable-lifetime trap so future
maintainers don't accidentally re-introduce it.
* fix(skills): preserve scrub-failed body files; reconcile inline-bodies principle with --body-file (Greptile P2 on #1595)
The retro skill's first scrub-body pass had two follow-up gaps Greptile flagged
on the re-review of d4d4c27f:
1. **The cleanup destroyed the recovery path it advertised.** The
`scrub-failed` failure message tells the agent the body file is "left at
$BODY_TMP for hand-redaction" — but the unconditional `rm -rf
"$ISSUE_TMPDIR"` at the end of the loop wiped the file before the agent
could read it. The recovery message was a lie.
Fix: cleanup is now conditional on the scrub-failed count. If any WUs
failed scrub, the temp dir survives so the body file is hand-redactable;
the loop emits a NOTE to stderr telling the user where the surviving
files are. The dir lives in `mktemp -d` so it self-cleans on the next
`tmpwatch` / OS reboot regardless. Clean runs (no scrub-failed) wipe the
dir as before.
2. **The "Execution principles" block forbade `--body-file`** because in
the original design body construction via the `Write` tool added a
per-WU tool round-trip — the single largest source of perceived
latency. The new scrub_body step writes to a bash-resident temp file
inside one `Bash` invocation, scrubs, then passes the scrubbed file to
`gh --body-file`. There are no extra tool round-trips; the principle's
*intent* (avoid Write-tool calls per issue) is still honored, but the
wording ("never pass --body-file") read as forbidding the new approach.
Fix: update the principle to specifically allow bash-resident temp files
while still forbidding per-WU Write-tool round-trips. Adds a one-line
explanation that `--body-file` is the natural consumer of the scrub
step's file output.
Both fixes flow from Greptile's framing: "the hard-fail protection works,
but the recovery path it advertises is broken" and "the stale execution
principle contradicts the new --body-file approach." Confidence on the new
shape should land at 4-5/5 after the re-review.
caa68801 · 2026-05-17 · fix(cli): drop // PATCH marker instruction from generated AGENTS.md
The patches index manifest is the single recorded artifact for library-side customizations. Pairs with the library-side relaxation at mvanhorn/printing-press-library#644 which drops the verifier check requiring bidirectional pairing between .printing-press-patches.json entries and // PATCH source comments. The template's "Local Customizations" section now describes a single step (catalog the change in the patches manifest) rather than two (mark every source site AND catalog). A closing note clarifies that inline // PATCH comments are optional navigation aids if an agent wants them, but the CI no longer requires them. Golden fixtures updated for generate-golden-api and generate-golden-api-rich-auth (the two cases whose expected AGENTS.md include the customizations section); all 20 golden cases pass verify. Existing printed CLIs keep their old AGENTS.md until they regen. No retrofit needed because the library verifier (post-#644) doesn't check the source markers either way.
875d64e9 · 2026-05-17 · fix(cli): detect partial-failure response shape in :mutate handlers, add --allow-partial-failure flag (#1360)
* fix(cli): detect partial-failure response shape in mutate handlers
Add --allow-partial-failure flag. Mutate envelope's success now depends
on both HTTP status and absence of body-level partial-failure (e.g.
Google Ads partialFailureError). Generic detector lives in helpers.go,
not coupled to one API: any 2xx body with a top-level
partialFailureError carrying a non-zero code or non-empty message is
flagged, results[].resourceName is extracted, and the typed exit
(code 6, distinct from apiErr's code 5) fires unless
--allow-partial-failure downgrades it to a stderr warning.
Detection runs once per mutate call before output-mode selection so
table, JSON envelope, --quiet, and raw paths all surface the same
exit code. partialFailureReport is emitted into the envelope under
partial_failure with field/message/code/details/resource_names so
agents can route per-operation remediation.
Runtime test in generator_test.go drops a *_test.go into a generated
Petstore CLI module and runs go test against the emitted
detectPartialFailure; this is the load-bearing safeguard that proves
the detector works on a Google-Ads-shaped body, not just that the
strings are emitted.
* fix(cli): enforce partial-failure exit on mutate raw/quiet output path
Codex review flagged a gap: when neither the wantsHumanTable nor the
asJSON/piped branch handled a mutate response, control fell through to
printOutputWithFlags without checking partialFailure. That meant
--quiet, --csv, --plain, and default terminal raw output would exit 0
on a detected partial failure even though the warning was printed to
stderr — same silent-swallow regression the patch is supposed to be
preventing for JSON consumers.
Wrap the fall-through call so the typed code-6 exit fires unless
--allow-partial-failure is set, matching the table and JSON paths.
* test(cli): update golden fixtures for partial-failure detection
Updated 18 golden cases to reflect the new emitted code:
- helpers.go gains detectPartialFailure + partialFailureErr +
partialFailureReport.
- root.go gains the --allow-partial-failure persistent flag and the
rootFlags.allowPartialFailure field.
- mutate command handlers (POST/PUT/PATCH/DELETE) gain the detection
block at the top of the response handling, partialFailure-aware
envelope serialization, and the fall-through partial-failure exit
guard so --quiet/--csv/--plain/raw output paths surface code 6 too.
Behaviour change is intentional and matches the patch in the prior two
commits.
* fix(cli): include allowPartialFailure in JSON envelope success
When --allow-partial-failure is set and a partial failure is detected, the
process exits 0 (the user opted in to allow it) but the JSON envelope was
still emitting success: false. Automated callers parsing the envelope to
decide whether to retry or alert would see a failure signal on an
intentionally-allowed partial result, disagreeing with the exit code.
Align the envelope's success expression with the exit-code semantics:
treat the request as successful when the status is 2xx AND there is no
partial failure OR the caller passed --allow-partial-failure. Regenerated
goldens mirror the template fix in every affected case.
---------
Co-authored-by: dior <agents@futureremodeling.com>
Co-authored-by: Trevin Chow <trevin@trevinchow.com>
80ba507e · 2026-05-16 · fix(ci): cancel-in-progress=false so cancelled check_runs don't pile up
Mirrors printing-press-library#625. With cancel-in-progress: true, multi-event bursts (synchronize + review.submitted + multiple review_comment.created within seconds) leave cancelled auto check_runs behind that we can't PATCH away post-Feb 2025. Switch to cancel-in-progress: false so queued runs execute serially and all complete with terminal success/failure conclusions.
833213ff · 2026-05-16 · fix(cli): drive browser-sniff http_transport from HAR HTTP-version distribution (#1540)
* fix(cli): drive browser-sniff http_transport from HAR HTTP-version distribution Pre-fix the browser-sniff parser wrote spec.http_transport = browser-chrome-h3 whenever reachability.mode was browser_clearance_http and the bare browser-chrome enum whenever mode was browser_http, regardless of the HTTP version the HAR actually recorded. Origins that serve H/2 but not H/3 (most Cloudflare and Next.js + Vercel SaaS today) shipped CLIs that failed their first live call with CRYPTO_ERROR 0x128 (remote): tls: handshake failure. Adds a new browser-chrome-h2 enum + UsesBrowserHTTP2Transport predicate. Captures HAR httpVersion on every entry, computes a per-target distribution in TrafficAnalysisSummary, and maps the majority version to the matching transport: H/3 -> browser-chrome-h3, H/2 -> browser-chrome-h2, H/1.1 -> browser-chrome (no version force). Empty distribution falls back to bare browser-chrome so the runtime negotiates rather than guesses. The bare browser-chrome enum now means "no version force"; the implicit HTTP/2 force from the pre-fix template requires opt-in via browser-chrome-h2. EffectiveHTTPTransport's default-sniffed and browser-auth-for-HTML branches return browser-chrome-h2 instead of bare browser-chrome so the implicit H/2 force is preserved for shipped CLIs that did not go through browser-sniff. ApplyReachabilityDefaults now runs before applyHTTPTransportDefault so the HAR-driven mapping wins for browser_http / browser_clearance_http modes. browser_required intentionally leaves HTTPTransport empty since the operator must drive a real browser. Closes #1387 * fix(cli): allow --transport browser-chrome-h2 via the CLI flag normalizeHTTPTransport's CLI-flag allow-list was the one place that did not learn about the new browser-chrome-h2 enum. Operators passing --transport browser-chrome-h2 hit the validator's reject path even though the value is accepted by spec.Validate, catalog.Validate, and the generator's enum predicates. Add it to the allow-list and extend the error message and the existing test to cover the new value. Refs #1387 * fix(cli): preserve implicit H/2 force on protection-driven transport path applyHTTPTransportDefault writes spec.HTTPTransportBrowserChrome (bare, no force after the template change) whenever trafficAnalysisRecommendsBrowserTransport fires for non-reachability-mode signals: Cloudflare/DataDome/Akamai/PerimeterX protections, html_scrape protocol, generic browser/scrape hints. Pre-PR the template's else branch unconditionally emitted ForceHTTP2() for bare browser-chrome; post-PR it emits neither, so specs flagged via those heuristics lost their implicit H/2 force. Switch this fallback to browser-chrome-h2 so the generated client still forces HTTP/2 in the absence of HAR HTTP-version data. The reachability- driven paths (browser_http / browser_clearance_http) keep using the HAR distribution via ApplyReachabilityDefaults; explicit H/3 hints still win over the protection default. Refs #1387 --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
63f745b8 · 2026-05-16 · fix(skills): split SQL example out of go-fenced block in NULL-safe scans guidance
Per Greptile review on PR #1530: the COALESCE example was appended inside the same ```go fenced block as the Go snippets, so syntax highlighters, AI tools that read SKILL.md, and lint passes that validate fenced blocks would all interpret the bare SELECT as Go. Move the SQL into its own ```sql fenced block with a short introductory sentence, leaving the Go snippets self-contained.
f7365c26 · 2026-05-16 · fix(ci): close jq if-then-else with end so >10-thread path doesn't crash
Mirrors printing-press-library#623: outer if in the listing jq filter was missing 'end'. jq emits a parse error and exits non-zero; set -e bails the shell before the step summary and ::error:: annotation can write, so authors see a cryptic jq error instead of the thread list.
94332417 · 2026-05-16 · fix(ci): use job exit-code instead of POST/PATCH for check_run state
Mirrors printing-press-library#623 redesign. POST/PATCH approach hits HTTP 403 in CI as of Feb 2025: GitHub Actions runtime rejects workflow-side modification of check_run status/conclusion. Switch to relying on the auto-created check_run for the job (its conclusion mirrors the job's exit status) and exit 1 when threads are unresolved. Net: simpler workflow, no API calls, no duplicates, behavior matches the post-Feb-2025 GitHub Actions runtime.
c96ac5da · 2026-05-16 · fix(cli): writeThroughCache caches single-object responses keyed by non-id PKs (#1531)
* fix(cli): writeThroughCache caches single-object responses keyed by non-id PKs
writeThroughCache guarded its single-object cache write with
`if _, ok := envelope["id"]; ok` — APIs whose primary key is named
CertNo / sku / invoiceId / etc. silently fell through every lookup.
The user saw HTTP 200 and correct stdout while every downstream
feature that reads from the local SQLite store (smart presets,
holdings analysis, offline search) got no data.
Drop the hardcoded "id" guard and delegate primary-key resolution
to UpsertBatch's existing resourceIDFieldOverrides path, which the
parser already populates from `x-resource-id` and the response-schema
inference chain.
Tightened the guard to skip list-shaped envelopes whose array
happened to be empty — `{"items": []}` must not write a row keyed
by the whole envelope. Caught by TestClientBasePathLiveRequest on
the first pass; explicit regression added.
Closes #1439
* fix(cli): verify list-wrapper field is an array before skipping cache write
Greptile flagged that the list-envelope guard checked for KEY presence
only — any detail object whose own field happened to be named data,
results, or items (with a scalar/object/null value) would be treated
as an empty list envelope and silently dropped. That regressed the
prior envelope["id"] path, which would have cached the row.
Tightened the guard to verify the value at the wrapper key actually
unmarshals as a JSON array. A scalar-valued field with a colliding
name is a regular response field, not a list envelope, and the row
still goes through UpsertBatch.
Added TestWriteThroughCacheCachesObjectWithListWrapperFieldName as
explicit coverage for the collision case Greptile called out.
* fix(cli): distinguish JSON null from empty array on list-wrapper field
Greptile noted that json.Unmarshal("null", &arr) succeeds with arr
left nil, so the previous unmarshal-only check would misclassify
{"CertNo":"x","items":null} as an empty list envelope and silently
drop the row. Require arr != nil so true empty arrays stay in the
skip branch while JSON null falls through to UpsertBatch as a
regular field collision.
Added TestWriteThroughCacheCachesObjectWithNullWrapperFieldName as
the missing coverage Greptile called out.
* chore(cli): empty commit to force CI rerun after flaky text file busy
* fix(cli): require list envelope to be fully metadata-shaped before skipping
Greptile flagged round-3: a detail object whose own field happened to
be named items/data/results AND holds an empty array (e.g.
{"id":"order_123","items":[],"status":"pending"}) was being treated
as an empty list envelope and silently dropped. The previous "any
wrapper key with array value" heuristic was too permissive.
Switch to a structural check: an envelope is list-shaped only when
EVERY top-level key is either the wrapper itself (results/data/items)
or one of a known pagination-metadata key (next_cursor, has_more,
total, links, meta, response_metadata, etc.). A single non-metadata
key signals real per-row data and the row gets cached.
Codifies the metadata allowlist as a package-level var so it stays
auditable. Adds explicit regression tests for the multi-key detail
shape and for the real list-envelope-with-metadata shape.
---------
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
5b8a8141 · 2026-05-16 · fix(ci): scope settle delay to synchronize, strip head_sha from PATCH
Mirrors Greptile feedback addressed on printing-press-library#623: P1: head_sha is valid in POST /check-runs but is not a valid body parameter for PATCH /check-runs/<id>. If GitHub strictly validates and 422s the unknown field, the PATCH would fail and set -e bails. Strip head_sha for the PATCH branch via jq del(). P2: settle delay fired for every pull_request_target action. Only synchronize moves the commit pointer and triggers GitHub's async thread auto-resolution, so only synchronize can race it. Gate the delay on action=synchronize to avoid an unnecessary 8s wait on PR opens and draft transitions.
162d9a32 · 2026-05-16 · fix(ci): conversation-resolution check race + duplicate check_run
Three flaws in the workflow shipped with this PR that printing-press-library
#587 surfaced (then closed in mvanhorn/printing-press-library#623). Backing
the same fixes into the cli-printing-press copy before this merges:
1. Race condition. synchronize fires the moment a push lands, but GitHub
marks review threads outdated/resolved asynchronously based on the new
file content. Querying immediately races that resolution and can report
stale 'unresolved' for a thread that is about to flip resolved a second
later. Add 8s settle delay on pull_request_target events specifically.
2. Job name collision. The job was named the same as the user-facing
check ('All conversations resolved'), so GitHub Actions auto-created a
check_run with that name reflecting only the job's exit status (always
success). Our explicit POST created a SECOND check_run with the same
name reflecting actual thread state. Both showed up on the SHA. Rename
the job to 'Evaluate review threads' so the auto-created check_run has
a distinct internal name and stays out of the merge widget.
3. Duplicate check_runs across runs. Every workflow run POSTed a new
check_run rather than updating, so a stale failure could sit next to a
fresh success indefinitely. Switch POST to PATCH-if-exists keyed on
(name=All conversations resolved, app=github-actions).
After this lands the merge widget shows exactly one
'All conversations resolved' entry per PR, with state always matching
the latest workflow run.
f55f57a8 · 2026-05-16 · fix(ci): address Greptile review on conversation-resolution check
Three findings from Greptile on this PR: 1. (P1) Failure summary cited the Mergify condition by name in .mergify.yml, but #1536 has not merged so that condition does not exist on main yet. Replaced with a repo-convention message accurate both today and after #1536 lands. 2. (P2) The --arg PR_NUMBER binding was passed to jq but no longer referenced in the listing function (I removed the use in the cli-printing-press port but left the binding). Dead arg, dropped. 3. (P2) The draft-PR guard only checked pull_request_target events, so reviews and comments on draft PRs still fired the workflow. Rewrote the guard to skip drafts across every PR event source while allowing workflow_dispatch through as an explicit manual ask.
21ae8a54 · 2026-05-16 · feat(ci): surface unresolved review threads as a status check
Ports the conversation-resolution-check workflow from the downstream library repo (mvanhorn/printing-press-library#620, #621). The gate itself is enforced by Mergify (#1536 adds the `#review-threads-unresolved = 0` condition to .mergify.yml). This workflow is the visibility layer. Why both: Mergify's existing `Mergify Merge Protections` check_run is the most readable surface for "what's missing" after a maintainer applies `ready-to-merge`, but pre-label it just says "skipping" with no specific signal about thread state. An author who pushed a fix but didn't click "Resolve conversation" sees green CI, green Greptile Review, and no obvious cue. This workflow puts an explicit "All conversations resolved" check_run in the status list regardless of label state. Lifecycle coverage: pull_request_target for new commits, pull_request_review for new reviews from Greptile, and pull_request_review_comment for new inline findings. concurrency.cancel-in-progress coalesces bursts. Workflow_dispatch provides a manual escape hatch. Note: GitHub Actions does NOT support pull_request_review_thread as a trigger event, so clicking "Resolve conversation" in the UI does not auto-fire this workflow. The check refreshes on the next push, review, or comment. This gap is documented inline in the workflow file. (Library repo #621 was the hotfix that taught us this.)
a8fa80a3 · 2026-05-16 · fix(ci): require all review threads resolved before queue + merge
Mergify's queue_conditions and success_conditions both gate on the Greptile Review check_run being success/neutral/skipped, but that check_run only reflects the confidence score — it does not track whether Greptile's inline P0/P1 findings have actually been resolved. So a PR with unresolved review threads can today: 1. Pass all CI checks (build-and-test, generated-test, etc.) 2. Pass Greptile Review (score >= threshold) 3. Get labeled ready-to-merge 4. Auto-merge via Mergify, with the findings still open PR #1514 is the canonical example today: mergeStateStatus=CLEAN with one unresolved Greptile thread. The downstream library repo had the same gap and closed it via a ruleset rule + a visibility check_run (mvanhorn/printing-press-library#620, #621). This repo uses Mergify instead of rulesets, so the equivalent fix is a Mergify-native condition. Adding `#review-threads-unresolved = 0` to both queue_conditions and success_conditions means: - Mergify won't queue a PR with unresolved threads - Mergify won't merge a PR that picks up new findings during the in-place queue re-run - Mergify's status comments will explicitly cite the unresolved threads as the blocker, so authors see what to do Release-please PRs are bot-generated and reliably have zero review threads, so the condition passes them through transparently — no exemption needed for the existing release-please branch pattern.
4e304df5 · 2026-05-16 · fix(cli): scope-aware sync --param dispatch with --global-param fallback (#1529)
* fix(cli): scope-aware sync --param dispatch with --global-param fallback Asana, Jira, GitHub, and similar APIs reject path-scoped dependent requests when a top-level scope param is re-injected on top of the path context (e.g. /projects/<gid>/tasks?workspace=<gid> trips Asana's "Must specify exactly one of project, tag, ..." error). The sync command's --param flag injected indiscriminately into every request, forcing a manual two-phase workaround. Split syncUserParams.global into flatGlobal (--param) and trueGlobal (--global-param). applyTo gains an isDependent bool: dependent path-scoped calls skip flatGlobal but still apply trueGlobal and per-resource params. Existing single-phase syncs on APIs without dependent resources behave identically. Operators who relied on the old apply-everywhere semantic opt back in with --global-param key=value. Closes #1393 * refactor(cli): rename parseSyncUserParams perResourceFlags param Make the parameter name in the helper signature match the call-site name resourceParamFlags. No behavior change; just removes a name-mismatch readability snag inside the function body. --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
7396d66f · 2026-05-16 · fix(skills): add NULL-safe SQL scan guidance to Phase 3 store-query starter
Novel-feature commands authored against generated typed FTS/upsert
tables or against json_extract on the resources blob silently drop
every row whose scanned column is NULL. `database/sql`'s `rows.Scan`
into a bare `string`/`int64`/`float64` returns a non-nil error on NULL
("converting NULL to string is unsupported"), and the conventional
`for rows.Next()` loop continues past scan errors — so the query
returns zero records, no error reaches the caller, and the feature
looks healthy because the upstream API call succeeded.
The Phase 3 store-query RunE skeleton in skills/printing-press/SKILL.md
documents the resources-table-keyed query pattern but says nothing
about NULL handling. Add an inline scan-comment in the skeleton and a
parallel-shape "NULL-safe SQL scans MUST use sql.Null* targets (or
COALESCE) for any column that can be NULL" paragraph after the
streaming-frame normalizers callout, with right/wrong code snippets.
The generator does not emit per-resource typed query helpers
(writeThroughCache stores opaque JSON via UpsertBatch; resolveLocal
reads opaque JSON), so the issue's `comp:generator` framing was off —
the fix surface is the SKILL prompt that drives Phase 3 novel-feature
authoring.
Closes #1438
Refs #1469 (NULL-safe SQL sub-bullet addressed here; the
helper-enumeration sub-bullet remains open under that issue)
c31632b3 · 2026-05-16 · feat(skills): add /printing-press-amend skill — dogfood + direct-input modes (#1490)
* feat(cli): add verify-internal-skill subcommand
Lints internal-skill SKILL.md files (frontmatter + canonical sections).
Distinct from verify-skill, which validates a printed CLI's SKILL.md
against its Go source — internal skills (polish, retro, publish, amend)
have no internal/cli/ to verify against.
Checks: frontmatter-parse, frontmatter-required (name, description,
allowed-tools), name-matches-dir, allowed-tools-shape, body-has-heading
(warn). All three existing internal skills pass cleanly.
* feat(skills): scaffold printing-press-amend skill
New skill that wraps the dogfood-to-PR loop for a printed CLI in
mvanhorn/printing-press-library. Mines the active session transcript
for friction, scopes with the user, plans + executes the fix, scrubs
PII, opens a PR. Two user-in-loop checkpoints (scope, PR draft).
This commit lands the SKILL.md skeleton (frontmatter + setup contract +
phase-header placeholders) plus the brainstorm requirements doc and
implementation plan that drove it. Phase bodies (U2-U7) land in
follow-up commits.
Adds skills/printing-press-amend/SKILL.md to the
TestSkillSetupBlocksMatchWorkspaceContract test slice — setup-contract
parity with publish/score/catalog enforced.
* fix(cli): use strings.SplitSeq in verify-internal-skill
Satisfies golangci-lint modernize hint. Pure refactor — same behavior,
no test changes needed.
* feat(skills): flesh out printing-press-amend phase bodies + references
Adds the substantive Phase 1-7 bodies to skills/printing-press-amend/
SKILL.md, plus three reference files:
- transcript-parsing.md (Phase 1: read active session transcript,
extract friction signals, classify bug-vs-feature, auto-detect
target CLI, confirm with user)
- pii-scrubbing.md (Phase 5: three-layer scrub — credentials reused
from retro/secret-scrubbing.md, entities from a user-maintained
stop-list at ~/.printing-press/amend-config.yaml, plus first-mention
defense for unrecognized capitalized phrases)
- library-pr-plumbing.md (Phase 6+7: managed-clone bootstrap, branch
collision detection, issue ownership, push + gh pr create with
durable HEAD_SHA evidence URLs — adapted from publish Steps 5/7/8)
Phase 4 operates directly on the managed clone of mvanhorn/printing-
press-library at $PRESS_HOME/.publish-repo-$PRESS_SCOPE (per the
plan's pre-implementation decision), enforces the public library's
mandatory `// PATCH(...)` source-comment + .printing-press-patches.json
contract, and runs `printing-press publish validate` with up-to-3
retry iterations.
Two user-in-loop checkpoints: scope confirmation after capture (U4),
PR draft review before any gh command fires (U7).
* docs(cli): add /printing-press-amend to README skill catalog
One-line entry under Publish, in the same details/summary shape as the
other skills.
* feat(skills): expand printing-press-amend frontmatter for direct-input mode
Broaden description to cover both dogfood and direct-input input modes.
Add trigger phrases for user-supplied asks (rename, add feeds, sniff for
new APIs, amend with these ideas).
U1 of docs/plans/2026-05-16-001-feat-printing-press-amend-direct-input-mode-plan.md
* feat(skills): add Phase 0 input mode detection to printing-press-amend
Insert a new "## Phase 0 — Input Mode Detection" section between Setup
and Phase 1. Documents the detection rubric (dogfood, direct, both,
ambiguous), the AskUserQuestion fallback, the default-dogfood preservation
rule, and the runstate persistence path. Phase 1's existing dogfood body
is untouched; U3 introduces the direct-input sub-section.
U2 of docs/plans/2026-05-16-001-feat-printing-press-amend-direct-input-mode-plan.md
* feat(skills): split printing-press-amend Phase 1 into mode-conditional sub-sections
Rename "## Phase 1 — Friction Capture" to "## Phase 1 — Capture" and
split into ### 1a (dogfood, existing body lifted verbatim) and ### 1b
(direct-input, new). Document the shared typed finding list shape with
new "provenance" field. Reserve ### 1b.i for the sniff subroutine
(filled in by U4).
transcript-parsing.md gets a scope note pointing to direct-input-parsing.md
for the new mode; its body is unchanged.
U3 of docs/plans/2026-05-16-001-feat-printing-press-amend-direct-input-mode-plan.md
* feat(skills): add sniff finding subroutine to printing-press-amend Phase 1b
Document the opt-in sniff path that runs printing-press crowd-sniff (and
optionally browser-sniff with a user-supplied HAR) against the target
CLI's source URL, then converts each discovered candidate endpoint to a
Tier-3 add-endpoint finding with provenance: sniff.
Includes the six steps (resolve URL, crowd-sniff, optional browser-sniff,
convert to findings, degraded-path table, provenance surface at Phase 3).
Sniff is gated on an explicit kind: sniff ask — never auto-invoked.
U4 of docs/plans/2026-05-16-001-feat-printing-press-amend-direct-input-mode-plan.md
* feat(skills): add direct-input-parsing reference for printing-press-amend
New reference doc loaded by Phase 1b. Documents the ask-to-finding
parsing rubric (six finding kinds), the finding shape (with new
provenance field), target-CLI resolution rules (regex extraction + Phase 0
fallback), and edge cases (multi-CLI, ambiguous verbs, bare URLs,
conflicting kinds, combined-mode merging).
Mirrors transcript-parsing.md structure so Phase 1a and Phase 1b reference
docs feel parallel.
U5 of docs/plans/2026-05-16-001-feat-printing-press-amend-direct-input-mode-plan.md
* docs(skills): v0.2 addenda to amend brainstorm + plan; add direct-input plan
Append a v0.2 amendment section to the original brainstorm and original
v0.1 plan pointing at the new direct-input plan. Preserves both originals
as the dogfood-mode design record; the v0.2 design (input-mode detection,
direct-input parsing, sniff finding type) lives in its own plan file.
Add docs/plans/2026-05-16-002-feat-printing-press-amend-direct-input-mode-plan.md
covering U1-U6 of the v0.2 expansion. Sequence number 002 to avoid
collision with the parallel-session bugbounty-goat plan filed today.
U6 of docs/plans/2026-05-16-002-feat-printing-press-amend-direct-input-mode-plan.md
* fix(skills): count only newly-added PATCH markers in printing-press-amend parity check
Greptile P1: the parity check used grep -rc to count // PATCH(...) markers
across all Go files in $CLI_DIR, including markers from prior amend runs.
That cumulative count compared against the per-run declared patch_count
silently passed when prior history made the running total meet or exceed
the declared count, even with zero new markers added.
Switch to git format-patch --stdout + grep '^+.*// PATCH(' so the count
reflects only newly-added markers in this run's diff against upstream.
format-patch is used over git diff to stay robust against environments
where git diff is intercepted by a pager/shim that reformats unified-diff
output.
Resolves Greptile finding on PR #1490.
* fix(skills): relabel printing-press-amend PR-body Evidence block
Greptile P1: the Evidence block labeled .printing-press-patches.json as
"Plan doc" and the next line said "see the plan doc at the path above"
- the URL points at the patches JSON, not the plan doc, which lives
locally at $PRESS_MANUSCRIPTS/<slug>/<run-id>/proofs/... and is never
committed to the public library.
Relabel the URL as "Patch record", point per-finding rationale at the
Findings table + patch record, and note the local plan doc location as
context for the original printer (not as a clickable artifact for
external reviewers). The plan doc stays local by design - it's a
PII-scrubbed audit record, not part of the PR contract.
Resolves Greptile finding on PR #1490. Origin R27's requirement for a
full GitHub URL to the plan doc is unsatisfiable as written and is
silently revised here; flag for retro follow-up.
* fix(skills): hard-stop existing-open-PR path in library-pr-plumbing
Greptile P2: when existing_open was non-empty the snippet printed a
warning and a # AskUserQuestion: ... shell comment, then unconditionally
ran git checkout -b "$BRANCH_NAME" - which fails with a confusing
already-exists error because the local branch from the open PR exists.
Replace the inert comment with a hard exit 1, a concrete two-option
resolution menu printed to the user, and a follow-up prose block that
documents the AskUserQuestion-then-re-enter contract the skill driver
must honor. Literal shell-flow execution now stops at the right place
with an actionable message.
Resolves Greptile finding on PR #1490.
* fix(cli): mark --dir as required on verify-internal-skill
Greptile P2: --dir was validated via a manual `if dir == ""` check in
RunE, which works but doesn't surface the constraint in Cobra's --help
output and runs the validation later than necessary.
Replace with cmd.MarkFlagRequired("dir") after the StringVar
declaration. Missing --dir now produces "required flag(s) \"dir\" not
set" via Cobra's standard flow and the flag is annotated as required
in --help output. The manual check is removed as redundant.
Resolves Greptile finding on PR #1490.
* fix(skills): make 90-days-ago date portable in printing-press-amend
Greptile P1: `date -v-90d` is BSD/macOS-only. On Linux it emits
"date: invalid option -- 'v'" to stderr and produces empty stdout,
leaving the GitHub search qualifier as `merged:>` with no value.
The recently-merged-PR dedup guard then silently returned no results,
defeating Phase 2a's purpose on any non-macOS machine.
Replace with a three-way fallback: GNU `date -d '90 days ago'` first,
BSD `date -v-90d` second, python3 timezone-aware UTC date as final
fallback. Hard exit 1 if all three fail rather than letting the dedup
guard silently drop out.
Resolves Greptile finding on PR #1490.
* fix(skills): assign dogfood_status=N/A in direct-input mode
Greptile P1 (re-review 18:50): the PR body template printed `- Dogfood:
$dogfood_status` and the Phase 8 RESULT block included `dogfood_status:
<PASS|FAIL|N/A>`, but Phase 4's output spec omitted the variable
entirely and no phase instruction assigned it in direct-input mode.
Every PR from a direct-input run would show an empty `- Dogfood:` line.
Add dogfood_status to Phase 4's output spec with a per-mode contract:
- MODE=dogfood: PASS|FAIL from the dogfood validation step
- MODE=direct: always N/A (no transcript to dogfood against)
- MODE=both: PASS|FAIL on the transcript half of the findings
Default must be set by end of Phase 4 so Phase 7/8 never see empty.
Also add defensive ${dogfood_status:-N/A} in the PR body template as
belt-and-suspenders against any future phase forgetting to assign it.
Resolves Greptile finding on PR #1490.
* fix(skills): force-checkout main on managed-clone refresh
Greptile P1 (x2, SKILL.md:460 + library-pr-plumbing.md:86): if a prior
run aborted between Phase 4's file edits and Phase 7's commit, the
managed clone is left on an amend branch with uncommitted changes in
$CLI_DIR. The refresh block's `git checkout main` then fails because
those edits would be overwritten, and the subsequent `git reset --hard
upstream/main` never runs - leaving the clone stuck in a broken state.
Add -f to discard local edits. The managed clone is documented as a
scratch surface owned by the skill; any leftover edits are by definition
abort residue that must be discarded before the next run reuses it.
This is consistent with the existing reset --hard immediately after.
Resolves Greptile finding on PR #1490.
* fix(skills): use working-tree git diff for parity check (not format-patch)
Greptile P1: my prior G1 fix used git format-patch --stdout
upstream/main..HEAD, but the parity check runs in Phase 4 Step 6 -
BEFORE Phase 7's commit. The edits live only in the working tree, so
upstream/main..HEAD is an empty commit range and format-patch emits
nothing. new_patch_markers is always 0:
- When patches_entry > 0 (any real patch run): 0 < patches_entry is
true and exit 1 fires unconditionally, blocking every valid run.
- When patches_entry = 0: the check silently passes regardless.
Switch back to working-tree git diff (the right tool for pre-commit
state). Add --no-pager + --no-color + --no-ext-diff to defeat
colorized output and any configured diff.external tool that would
reformat the diff away from unified-diff shape.
Smoke-tested the corrected snippet against a fresh repo with uncommitted
PATCH-bearing edits: returns 1 for the 1 new marker, as expected.
Resolves Greptile finding on PR #1490 (refines G1's prior fix).
---------
Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
c10d0b55 · 2026-05-16 · fix(cli): move extra_commands SKILL.md block to its own top-level section (#1524)
* fix(cli): move extra_commands SKILL.md block to its own top-level section extra_commands declared in internal-YAML specs (shopify, producthunt, …) used to render under a **Hand-written commands** subsection nested inside ## Command Reference. The Cobra emitter never reads the field, so those rows were promises the generator could not back. verify-skill walks ## Command Reference for inline backticks shaped like `<binary> <cmd>` and correctly fails the unknown-command check on every entry. Lift the block into its own top-level ## Hand-written Extensions section with an explainer line that says they require separate wiring. verify-skill's _extract_inline_commands is scoped to the Command Reference body (regex in scripts/verify-skill/verify_skill.py), so a sibling section is invisible to the unknown-command walker. Generating from catalog/specs/producthunt-spec.yaml and running `printing-press verify-skill --dir <out>` now exits 0. Closes #1451 Sweep tracking issue for already-published CLIs (shopify, producthunt): mvanhorn/printing-press-library#616 * fix(cli): place Hand-written Extensions after Finding the right command Greptile flagged that inserting `## Hand-written Extensions` between the Command Reference body and Freshness Contract silently reparented `### Finding the right command` under the new section for any CLI with extra_commands but no Freshness Contract (extra_commands + HasDataLayer=false case). Markdown nests every `###` under the most recent `##`, so the fix is positional: render the Extensions block after the `### Finding the right command` subsection (and before `## Recipes`). `### Finding` stays a child of `## Command Reference` for every combination of ExtraCommands + Freshness state. Added a regression assertion that locks the relative ordering. End-to-end re-verified: producthunt regens with `## Command Reference` → `### Finding the right command` → `## Hand-written Extensions` → `## Auth Setup`, and verify-skill still exits 0. --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
99637941 · 2026-05-16 · fix(skills): require codex completion marker before treating delegation as success (#1523)
* fix(skills): require codex completion marker before treating delegation as success
Codex `exec` can exit non-zero or be killed mid-run (sandbox abort, OOM,
SIGINT, internal toolchain crash) and leave partial work behind that
looks identical to a successful end-of-prompt exit. The existing
post-codex validate step only checks `go build && go vet` and a
non-empty `git diff`, both of which can pass against partial output, so
the parent skill silently treats partial completion as success and
proceeds to the next priority task with the partial files in tree.
Each of the four prompt templates now ends with a COMPLETION MARKER
section instructing Codex to write `_codex-result.json` (with
`{status,files_written,timestamp}`) only after VERIFY succeeds. The
Delegate step removes any stale marker before the codex invocation so a
file from a prior task can't fool the next one, and the Validate step
treats missing-or-not-complete marker as a Codex failure that falls
through to the existing revert + Claude-fallback path and feeds the
circuit breaker.
Closes #1288
* fix(skills): make completion-marker validate snippet self-describing on failure
Per Greptile review on PR #1523: the previous validate snippet chained
the marker check and the build step with `&&`, so a missing/incomplete
marker exited non-zero silently with the same exit code as a build
failure. The surrounding prose told the agent to surface a specific
error message, but the snippet itself never printed it, leaving the
agent to second-guess which arm failed.
Rewrite both Validate snippets (Phase 3 step e, Phase 4 step 5) as an
`if` block that echoes the exact `codex output marker missing` message
to stderr before exiting non-zero. The build/vet branch is unchanged.
---------
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
82ad787b · 2026-05-16 · fix(cli): cap body-flag recursion depth to prevent compiler OOM (#1522)
* fix(cli): cap body-flag recursion depth to prevent compiler OOM Deeply nested OpenAPI request bodies (Tripletex, NetSuite, SAP S/4HANA, and similar enterprise specs) produced POST/PUT command files with 40k+ lines as the body-flag emitters recursed through every nested object. The Go compiler ran out of memory (signal: killed) before finishing the package. Caps recursion at maxBodyFlagDepth = 3 across the four body-emitter helpers: renderBodyMap, renderBodyVarDecls, renderBodyFlagRegs, renderBodyRequiredChecks. When the next depth would meet the cap, the object's subtree is skipped uniformly across all four; deeper fields are reachable via the existing --stdin flag on POST/PUT/PATCH commands. The --stdin flag's help text is rewritten when truncation fires so an operator inspecting --help sees the affordance without reading the issue tracker. Behavior for shallow specs (<= 2 levels of nesting) is unchanged across all 20 golden fixtures. Closes #1240 Refs #1520 * fix(cli): walk flattened body for depth-cap truncation signal bodyExceedsFlagDepth read endpoint.Body directly, but the four emitters walk flattenCollidingBodyFields(endpoint.Body). When dot-flattened identifier collision clears an object's Fields, the emitters treat that subtree as a JSON-string leaf and never recurse past it, so no depth-cap truncation actually occurs. The predicate, however, still saw the original deep structure and returned true, rewriting the --stdin help text to the truncation-warning variant even though every field was exposed as a per-field flag. Walk flattenCollidingBodyFields in the predicate so detection and emission cannot drift. Adds a regression test for the collision-flattened deep subtree case. Refs #1240 --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
0c3c8bcc · 2026-05-16 · fix(cli): detect integer page paginator and advance numerically in sync (#1519)
* fix(cli): detect integer page paginator and advance numerically in sync
OpenAPI specs that paginate by integer ?page=N (Freshworks family,
Atlassian Cloud, HubSpot, ~30-40% of REST APIs) used to fall through
detectPagination's "after" cursor default, so the generated sync loop
tried to extract a body cursor that never existed and terminated after
page 1.
The OpenAPI parser now recognizes page / page_number / pageNumber /
page[number] as a Type="page" paginator after the existing
cursor/token/offset branches (cursor wins on mixed-form specs). The
sync template adds a runtime fallback: when cursorParam == "page" and
no body cursor is extracted but the page is full, advance the integer
counter so subsequent pages are fetched. Mirrored in the
dependent-resource sync loop for parity.
Link-header pagination (the other case called out in #1296) is a
separate code path (HTTP header parsing rather than body extraction)
and stays a follow-up.
Closes #1296
* fix(cli): guard page-int sync fallback on cursor type, not param name
Greptile flagged that the original guard `pageSize.cursorParam == "page"`
only fires for APIs that literally name the param `page`. The parser
also recognises `page_number`, `pageNumber`, and `page[number]` and
preserves their original case in CursorParam, so those three variants
would silently skip the fallback and still truncate after page 1.
Plumb the paginator class through the runtime: PaginationProfile gains
CursorType (aggregated from endpoint.Pagination.Type), determine-
PaginationDefaults emits both cursorParam (request-key name) and
cursorType ("page"/"cursor"/…) into paginationDefaults, and the two
fallback blocks compare on cursorType so every canonical spelling
shares the same guard.
Generator test is now parametrised over all four spellings.
---------
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
ff562375 · 2026-05-16 · fix(cli): drop MCP code-orch handler pre-marshal that base64-encoded mutating bodies (#1521)
Sibling fix to #1357. The code-orchestration MCP handler template (mcp_code_orch.go.tmpl) had the same defect the endpoint-mirror template already fixed: POST/PUT/PATCH branches json.Marshaled `params` into a []byte, then handed the []byte to c.Post/Put/Patch as the body. The generated client.do() then json.Marshaled the []byte again, which encoding/json base64-encodes into a quoted string. Strict APIs reject the payload with errors like 'Request data must be a JSON object, not a string'. Pass `params` (map[string]any) directly to c.Post/Put/Patch and let client.do() do the single marshal pass. The intermediate marshal-error branch is removed; client.do() already wraps any marshal error with the same "marshaling body" prefix (client.go.tmpl:878). Add TestMCPCodeOrchPassesParamsMap mirroring TestMCPHandlerPassesBodyArgsMap to pin the orchestrator emission shape: no json.Marshal(params) intermediate, and the literal forms c.Post(path, params), c.Put(path, params), c.Patch(path, params). Golden fixture mcp-cloudflare/internal/mcp/code_orch.go updated in lockstep per AGENTS.md "Generator Output Stability". Closes #1426.
File tree
- .claude-plugin/marketplace.json
- .claude-plugin/plugin.json
- .claude/scripts/install-internal-skills.sh
- .claude/settings.json
- .entire/.gitignore
- .github/CODEOWNERS
- .github/pull_request_template.md
- .github/scripts/validate-skill-docs.sh
- .github/scripts/verify-supply-chain/scan.py
- .github/scripts/verify-supply-chain/scan_test.py
- .github/scripts/verify-supply-chain/signals.py
- .github/workflows/conversation-resolution-check.yml
- .github/workflows/golden.yml
- .github/workflows/lint.yml
- .github/workflows/main-ci.yml
- .github/workflows/pr-title.yml
- .github/workflows/release.yml
- .github/workflows/validate-catalog.yml
- .github/workflows/verify-skill-drift-check.yml
- .github/workflows/verify-supply-chain.yml
- .gitignore
- .gocache/00/0025243fb5f09b03aba18639b12d3524c0115b7bcdfd3167db509734b52a90fc-d
- .gocache/00/0041d04a989ffba4a99fc62fbd830713e1c724e35af15e21492d447cb30ea0d7-a
- .gocache/00/0043897807001ce227b9a44eca17a06dcbb8fd464ada9d38638e16d6e454be6c-d
- .gocache/00/007285e191c17b7c5f71f0eb83d512aa2736912f5f96a0236591664325ece1de-a
- .gocache/00/0087901bf53e4822c48f7864aeca9daf62b08ee8b79afb452e81d8bd0a0bb2f3-d
- .gocache/00/00b195e0c5cc09ee57370778ff631c1f873e6a0e4536920c17f15f36ac05a941-a
- .gocache/00/00b2c644bbafb78d82d638334412ce5d1bb6c20fd3018aeff859373fa955c461-a
- .gocache/00/00c1843e57c2423e4efc0f8cf4b41fedd46ef17209ba2a1f557e17f13afbb97d-a
- .gocache/00/00dedcbaf5dd36c49447863279d4bf0649eb1838d56074e8076fc688dff92fca-d
- .gocache/01/0167e53bdf4a44da7236bfb3c89b6aa5e387157d4545514b0fa8f17b2ccebb51-a
- .gocache/01/01c81b45cb4a30d46c823614852e2d84d269cd1d0cb51f86c22e38d92182ce4b-a
- .gocache/01/01c8511224d7359709dea96a590a80319cd8c036fd707a091172c006eced13f0-a
- .gocache/01/01dc6495b2457830bd464fd78d82d377b0f9269ef3a656928902c80a6e3d783e-a
- .gocache/01/01dd1e505a31f7924514d5d354f6cd63f132a495b8bb1ddd01650a43955e0a2b-a
- .gocache/02/020c6e1a73253d0f4dc5e9885ce59ebaf90b28124e08b6c5b367dc9f8e875681-d
- .gocache/02/0223820dd63221c433db1b831fd3fae4647ae3b8e043453fb2eb407774339a3b-d
- .gocache/02/0228e8c8f89db1a322d617e46969cef886b9a0ebea8b462907df092f9339a73c-d
- .gocache/02/02586a2e3dc5ddc007ee609900c7858d4e260fcb318f5be945bcd3e4d026a28f-a
- .gocache/02/026ea4421214fcc424b21d42ac4a27aa52dcc9a54b0a628bf2df751e6f46bc81-d
- .gocache/02/029a59090c4cd85598066e0c94667f3c51e32587c14e7b60a931431a6b5f085c-a
- .gocache/02/02d467881cfb5de77f56c8668f3fedf0fa50365b42872e16d62072abcca199b6-d
- .gocache/02/02dee0e05ef2669836ffe188c8f15111d8c0965127071948da1bbe30a1e91af2-a
- .gocache/02/02e5811c67e4e8b9e72175cc4aa3f850fc5508464abfe3fcf9cc2d8d6e2b4ad9-a
- .gocache/03/03060d05290aa39ee8fa2a4e480eec95ba38e43465377aea71c53275ebb892c2-a
- .gocache/03/03216d5eab4e081e8ab566b19a90a4b360e0dd240c20f5cd1d59fe107de0b202-a
- .gocache/03/032f185f27c25524f7a99c124d8a78d35a1a31a22f66468871c5f06de5aeaa91-d
- .gocache/03/03826401102f81a4986c7274befc3f6eb550d6e5a7fe10f7564ed354f16ff31c-a
- .gocache/03/03ba6299f2b29210f7adfc28d22a4307e6870570a62090ccf637e63c1f23f99e-a
- .gocache/03/03ed7db210eab1e3bbe954339b165b44f66493a778a91786068b619b26285ff5-d
- .gocache/04/0403a345609686210987b5a858050b35b4d3b07e82687925fa1812fbe6d85043-a
- .gocache/04/0410489f794ce429ee6879394f90fd96b69b5ed0526a4a1c9618244504dacfc7-a
- .gocache/04/04504c4c4df7c7757cde72b19a3b195920aa051303ddc3477c4892cc177be9a9-a
- .gocache/04/0464884d3bc5e4c44b8d2008bdfcf202a087c9620af30cbdbcfc7f43db6d199b-a
- .gocache/04/04b4509d27fd9c93eb33d9e8d80ff91f4a3bd31a7c7e2b9a77367d5c2f33aca8-d
- .gocache/04/04c3960d9d9478c5aacf3bc73abe5c2d97c7f8b9fcb3c608b7f3458ad0f79a47-a
- .gocache/04/04c444d4f5b9553694c3f3194fa550bf82dacdff1c5e33b8529d9a10003b79f4-d
- .gocache/04/04d8cb69be0da3f21d8037a4809233a069566988a12550806ed438e330362f3e-a
- .gocache/05/050980b07065c552f1e511da8896fd3f8fd5c5747040e6ae1289d53731bd888f-a
- .gocache/05/0515de9ddefb0348836cf243f74aa58854d235636c771ac68f55ec702f4ea049-d
- .gocache/05/0535dcc8138c325cd4b0b7c14d31f1df1fd5931a07fcb1a1a43c43e0df91c98a-a
- .gocache/05/056962713c83f9f02784224c5921ede5e650262d50766100a6a2ff715748bf01-d
- .gocache/05/05760133df76f4c4860e936df1aac0a3b9d4ffbc5363218671311d00e360ce3b-d
- .gocache/05/05b5f98e3d0fea37216952af3bffd5d51b40df892cc29c24d4ae1c5dc295558c-d
- .gocache/05/05f5e6492430b00f807e4629c6e4a53f3948fc9382f19898d1cc361b3b99ff9b-d
- .gocache/06/064a5028e3c2eab208abbeb9eb3081dc185f1e26e98e6bd8ebec4def4a186457-d
- .gocache/06/068c84fadefde2b0e4b2b4c308d70a31f9d4b8b40d53e3f027888a05c863888c-a
- .gocache/06/06a45522df397b46b35bf32c99a6897f0e05a1628f940c5c48517ecab0a791ff-d
- .gocache/06/06a791014b406996eeea90a95596623b7f38a0e58a2e0774413032cc2ff7eae9-a
- .gocache/06/06bb6bd2287a9d15fe6bbb64f5187bd4aff1da85a7250558ba00087cdde8246b-d
- .gocache/06/06bd8d9756f4f36e1206ccb05354a478298c0f86a2c42791432b1cbd51adcae9-a
- .gocache/06/06c71a7c54b11c24be92448dfa593017810cc2271c85e58e381d14ec35733cb1-a
- .gocache/06/06f5961cf72a4c26f7154137c07e01faa58d97575dc2e7a8882b5a110e8df860-a
- .gocache/07/0712638f3dfe277ceb930691efaa2c58e771f20fda87edf9428ad720d9e69208-a
- .gocache/07/07290596a0ad15f8f9c672a72a0088910ed749cb341d9c3e9e83aca0dcf52cc0-a
- .gocache/07/077c4c84129ee8b3bb95bdcaecd24bff550d8c7ecae971d146bf9590de7b41a9-d
- .gocache/07/07abd86d01b5a778b567fc49a8a06d9f80d9db944134cbb72177a19955f4a5a6-d
- .gocache/07/07b34678e808c87f968c08b46c1c5928e47841b68ea15fdc269df6a040c63c25-a
- .gocache/07/07e761ce189453a4dec3becfd4974e30db891e0637304ea4c4c78a27397f21d2-d
- .gocache/07/07eb066ea501c7091f2ead395ef5bca609a5a5d7258658275cb2d191723b2698-a
- .gocache/08/08383f7a36d3c701334b76b57f9db28f711e5f93de0e9ef24c094591376bda35-d
- .gocache/08/083db7b54b8116540355e829364b34af8957f1a80d957bea04730e2e381de5de-a
- .gocache/08/0851050ff4504e38cc31baa7963242a1ac75cf2be5b9d9effbed8b7aff61240f-a
- .gocache/08/087832261f11fa6e6fe4ec2160bd1580530b3ca62179bed9093beef47b6229f6-d
- .gocache/08/088757b65a3ea2e7c95182ad5cc4c8b1e09163d276dd053038e076d486b20d88-a
- .gocache/08/0889f36188bf30ac61d9b047e8c3145e934d9240c9c80e916e78faf2e65cfefd-a
- .gocache/08/088f81e1d14206196ad2710f724a44a1219199287fb665af9021e32b6573ab9f-d
- .gocache/08/08ac47f615013eab83b235987526fe59c6900d5915ed43b57a7cbd3b47c3a2e9-a
- .gocache/08/08db57f46a968b4b3869de29221ea6aa04293aaad76f1e0936407db2242884cd-a
- .gocache/09/095e5b80bb4debcfc7ab2d6ba5e7a683f1295495c1ff5816b8bf62ca5e1eef93-a
- .gocache/09/099ecfbe5a883806c37f31476825477b3b898262a997bda6c84c788c178eba6b-a
- .gocache/09/09a9f7a35c175cce9e64eb3fbc841554bbb321bf70b599b360b8d2b1ce7dfbcb-a
- .gocache/09/09bf96c1fae70dd14ad97928db09b1ac320a62ef354ab9d3ee9e36ad51639761-a
- .gocache/09/09d50bcc4cc53ff5efef4093a3693bea2651437a4e462e72772446050f787bdb-d
- .gocache/09/09d6e03967e91e0c12923bd8c87abde7126f281bfaec6caa6f2d8b249e94f075-a
- .gocache/09/09d8851cc54cf8bfc0b9185044fa21d7255a4995553509042240d1ec9960b5c7-a
- .gocache/0a/0a09e52e53eabf01a255b930c261b114246e5fde312f986524ad3b106bcde4e5-a
- .gocache/0a/0a21012da141723f184736c712c069d5ef43012b606eb3e248a5c4f9d8bc0913-a
- .gocache/0a/0a758092a019fb275fd6256d33c8056b8ff4d71466e490bc28e167c0e7e1a428-a
- .gocache/0a/0aac8a577f59a5997ad1cba70d5d842ce0af1109e4213855948a85bf3105e9bf-a
- .gocache/0a/0ab48d3fb10facaec33e56f013bf6007e4b8cf879b4e10cc88673f973b59c515-d
- .gocache/0a/0acf7344d9cc61d0feeaaac25245a2bdb458a056dee84fbcdda9eb6fdb575d4e-d
- .gocache/0a/0ad285f6507e1af05720e9bab03896ee11b88df129afea604586b29783ffbd56-a
- .gocache/0b/0b03f303b217b22e80fdaffdff4624f1fdba03ff9926aa47da9cde91d642f1cc-a
- .gocache/0b/0b2e6f8c8326d1ae1715daabc743b445b7a72705937a07991cee3b3c9768e81b-a
- .gocache/0b/0b4898eae1b9e445dcf5a0904ca522b8758e87038f20474ae55aae96c4d58010-a
- .gocache/0b/0b59ae5bb30d0a63b48730bd89eecf5033071c846f2bfb324df29aef79157e88-a
- .gocache/0b/0b677fdedd2b277e2b2de66147cff4648f3e99daa4ff3055f5223730cfb6452d-d
- .gocache/0b/0b6a31d1980ec3fc62d05b1041067aaca8706e5fd8a537472bb0f1a91e83ecbe-a
- .gocache/0b/0b8c88c30fa8334e701b9582af1c25e55670d839afbadb6906d70d59899c45d6-a
- .gocache/0b/0b925f70133183a54bc5f9f428a8d85cd6e8ea5a3867e6c7caa4ff1b5ca3efb7-a
- .gocache/0b/0ba6bc616dda3621cc01c4cd185616e5906cdfd7f44d5f966bce7619b69a57e2-d
- .gocache/0b/0becaf3f18c16cd553376024883f03fb8c2cb7b349c9866605ef3878b94957a8-a
- .gocache/0c/0c0d2406829b5192ef4513ac501de781ccf483eb95fb76bfc7b5674a7c1170eb-d
- .gocache/0c/0c2a35a270914844a54d9c35cd353469bd089993c96fd3dfa6c2bfc38ac90bda-d
- .gocache/0c/0c5d857ca1d5b1687911e91f2d2ef514f427b78c972084baf0620ea023e86cb6-a
- .gocache/0c/0c6ceb15f1c5e41602b33e34c63fccc35453c5fcd90621b44a59058a623d5d53-a
- .gocache/0c/0c877e26a41b59fe337eef8481521f18046f4dc35d72b41b94d1532b576e8751-a
- .gocache/0c/0ce1b1d60f8a08833d55ed93fc8ee8fb07397702e6958b03f6f4ba7b55cc006d-d
- .gocache/0d/0d22601a0aa1fc0769beff5be9c51aaa0579615d9d5258c661dba4756970f62d-d
- .gocache/0d/0d2e94172ce3a120a4e5fc80b7d4f80daba072f871a7e3c64c6b07fc23f58d59-a
- .gocache/0d/0d49f2ca542916a184b68451ccb5c287a90bd3e45e0b07527f636af95412ac73-d
- .gocache/0d/0d613b2727098c44c7bbb8b3ed9522d19f4871da091f11cc334bbeb1508ef74e-a
- .gocache/0d/0d620a83c42f2a7b486b6a4d1495250e232ec7ca0bcee89d3d774971310533d4-a
- .gocache/0d/0d7ea7e884af939f7bf81311d5b922b39b376e3bfea7696c837b9c3dfaff51be-a
- .gocache/0d/0d989dc50637cb076ced78f89f9534e8d79c17852659109bfa84ed6b4f1b3175-d
- .gocache/0d/0da76c8d7703ee166124b81b058eeb3120cbd112822e377a0b6563421a9a37cc-d
- .gocache/0d/0db754b30c5b6b010ccaa8fe8c81090f0d11769e4cda7f0213782f962746aae8-d
- .gocache/0d/0dc3344f255a793db3d855d4e206f455ac6b5bad852a284454d901ced1abc84c-a
- .gocache/0e/0e4f76e6dc9771487436b2f4df63731714aa3d9abdb089b8a6a108afc3eceeb0-d
- .gocache/0e/0e501ece84aca1fc96b9ff4d2933fb35f3d9c9ac927fb9edefcf29e19b81fd33-d
- .gocache/0e/0e70050300efb261409eea33daf3837b21177bb2336efce1529c0584aee24d08-a
- .gocache/0e/0e775a9f3f3195902a23468b2ba8707cb6227f66a9f117ebd9c69366a7583176-a
- .gocache/0e/0e8105f57488757b776c1e56d6a112cb2ce786d914137babcfcc25c147c22857-a
- .gocache/0e/0e9aa49f76d7d56aeaae319ce3073dbb80911e4db6ccc30c9d601e8c5ab7bb42-a
- .gocache/0e/0ea54afb70e923b525eacd476b7cbf994341035fe35d0f9ae7141b5baaa6c9e8-a
- .gocache/0e/0eb3c3a52a5899662b17adb4bf09385b0b21a85cd67222099bd7f7690451b5f8-a
- .gocache/0e/0ec63109e343eea06ad50e28c1acb83ae4d5a90b0457c648e07f4a8eaed5aa0b-d
- .gocache/0f/0f02ea1341bd0edcac6a6a3951e6c5731c6897a444c84f91d24998ddaac9c781-a
- .gocache/0f/0f066ec70c475c8bfbba2f7998892eeafd7348e9c0d7b02365baceb1c4d7fe26-a
- .gocache/0f/0f1222f285581c18aad8311561039be683f3a455fb4f2d78bc7530517c043b12-d
- .gocache/0f/0f2515292f99b9579b4a406ee48a72c740496a87397c29a7a9f3c2db562e5916-a
- .gocache/0f/0f2bbe96b15100b7c084f45b66eceaa42a648ac21d932b50adcbdae04aa08b38-a
- .gocache/0f/0f510c1bceb4fec1dc0bf62f73a87ec1fa63322a3a1ed0aab4a4efd693199f08-a
- .gocache/0f/0f57dbda1867ab405271f7a2b18db01bffe943f8f007122f0f9f13f5e7615bb6-d
- .gocache/0f/0f70322af8fa7f7a26569e60acb9192996abaab1765464755044858bc0e5cfca-a
- .gocache/0f/0f77a08648264fba24661e0697cfdcbea84d63f7bb5a78f3a6b7e39e29141a48-a
- .gocache/0f/0fb19cd61be5d19af06ceae39bac8b86d2a4ff06fb2b209977be7ff3b2aeb1a8-a
- .gocache/0f/0fb82f93a3bb2129e8e82d088e21004636d6eab1bfe0c682658983369045e968-a
- .gocache/0f/0fda37116d8a3a5ff3a9001eaa5c3ecb2c4d71df20ae353da01c5c321f5efa67-d
- .gocache/0f/0ffaec42b4c2d93560b4b1356442007369fc76e265fbfad4a788596c84ed7229-a
- .gocache/10/1002ea806be17ded65b36fb6ab11a8bf6f347362d436f09423ea9af9e9b260b9-a
- .gocache/10/100919244ad08f3101d41cae2f5cfcadcc94e9b1f7b41c91c88b4979a319a11b-d
- .gocache/10/103784e430fccfedeb8258cb277b869dd362f4a36c3ce10bc66b22cb34811b4b-a
- .gocache/10/1094f91160d2bc9f4012ba5d9ed96d6f0f2ea9c6b5195f329b16abdd0517d637-a
- .gocache/11/110b07283d388b91a432e4a4109ad24a49e778e514b3a9d46a05b08322ce5158-a
- .gocache/11/111566d71a8e9ec19187d6335daf9fdb23a53af64d03a04866570217a408655f-d
- .gocache/11/115b353ea325317740210a8d312182f6d903f99772a088edf87821bd4392a7a6-a
- .gocache/11/119b92a93abff982ea6024d0cc3884b5751df827bc2cf4cad2861abff6294376-a
- .gocache/11/11a215b4a330fa4dbd126b7e6c1704119dde27ae63ed334c827e9d278bfaedbe-a
- .gocache/11/11a658db806562d9e946dc9856b02534432b954eff0041d02bf196f771b5e74b-a
- .gocache/11/11b74f42b5bb32f452c57dd27bf00af8dbba04c9efed96c346953e525fdfc208-a
- .gocache/11/11c694b3a5afbae507543843834327712958a1f7b23ee026cf3ff68d75e0b18a-a
- .gocache/11/11d744c8b458d30efb4de521783e7d68a4f38ddac6061f6dc9d8c2a2a44af7b5-d
- .gocache/12/12174f9604029b547eac6da2066712521e0290beb4a481ddddb42b4529e3ddf6-a
- .gocache/12/123958a22948547174debb4a56e9f4c84943532c2f7685123fbb4007e2271afd-a
- .gocache/12/1249ad7d4e5d49474c4cb43fbff4cda838c54faae0785a479c72e4780808c911-a
- .gocache/12/126b9b91da3e9521f230b9360843d905a4b4710604c88d67d02ef414f90a70d3-d
- .gocache/12/12d76c6e1521aff969304acd7e8ae2a585dc1a1e32b4bcd23297b9d8c7824281-a
- .gocache/12/12dcc86bad06eefb71299feffd57908015798228576b97bc6dfa4328a46d0cee-d
- .gocache/13/13165aef9ec2bf063c1586b0c8557074f76987a9e394cd4b6c6c72f0d6fbd927-a
- .gocache/13/1318790111ee3392000c570c02160017364cc8634db8f8ef065b6957b56db6e8-d
- .gocache/13/134589c01a65a1b8545b2a0124b16f0676294fcb3e7d12fabcb6bbd0afa264f5-a
- .gocache/13/13e037a5e73ccedf23a2e10e653544872197a085f53693b36d237698f073c965-a
- .gocache/14/1414360af05829a724e312d99e7d3e61cc1408b1dcae68343bde8b611cc63d75-a
- .gocache/14/141dbf57b070d6cad0d262be841c5a90e5bebc3f77b246e6a8928bb78af9bb2c-a
- .gocache/14/1427e1df5741c1bad37826df1f2b8f8f670f34077c62830ae07bbcd119d8375f-a
- .gocache/14/145e757dc30b51a75f23ccb3fb05b1e2a11f7bfbc7621a92cdfb2360bc8d3738-a
- .gocache/14/1467fed9333ae2f0542549fbb8ff8bf3404419663a06383d46113b58c9edc97f-d
- .gocache/14/146ed6d02214ef4374e9ef666df7cf450b80f8a121dc80f8132c1e98a094f5c7-a
- .gocache/14/14fc95f8d4a08c9d8dc929eea2a3ac041366e294f7e722d771c9bafccbd72686-d
- .gocache/15/1515bc6a0ca14629878d68ebe17ff8796dd2ff043edfe763d3c59db166e99532-d
- .gocache/15/157e8385eb1164ca3689941bb3d6e23cdbb4d2e5703ad6dde72d00d5796deb94-d
- .gocache/15/15a2050f1a5b5fc9304f2b8e822b39369dcac0b6332ae3bd438c3aad30b37cf7-a
- .gocache/15/15b7d2b2a19aa66073fae1a0628a94d0cdd1c5f074201f22dbf43f61f619e5c4-a
- .gocache/15/15d69d59fa177d6a73a867f01d0bb529eab74e36df98de68787fe5a50a0879d1-a
- .gocache/15/15f093732e235c01c6fa5fe006db85f996a3e91ccddb36d2c2d9f6c2acc38879-a
- .gocache/16/1620ac615c86d54df64c0e13fd2a485cdcb0a66648dfb40c5db8ecc046e076dd-a
- .gocache/16/163d1004cb0afa674ed7e31610038e6b5e8e3b45e87496e64ace8dc1c08ebfca-d
- .gocache/16/16654fe8a566f83a166366486e0f25e70d4d5a06ea79e558868479d28ea1f055-d
- .gocache/16/166be05a2902130ecef1ca321328fd87b9d0d6d6a7e5e3a0e4c5c89eabbc68ee-a
- .gocache/16/16946691ef730945f8369506c9b1be6711c33b0fd8a1272b23b21cf68831a4d8-d
- .gocache/16/169f6597008495e4562b263f069669a97fe1b8254b878813be684b3dca87978e-a
- .gocache/16/16b425809fd6272c48f78a5c19378c0461e0fe8a2bf686f8c8afc6222150a4c6-d
- .gocache/16/16d8be82fe10a9eef1f657693d20e61260fb26b4b546dffa9f21b9bc3d6cfc67-d
- .gocache/17/1722e39b2eec812fae3b211d6e60f4a433f0d07a5be681d4de36532e00aac03c-d
- .gocache/17/1725b5704fcfd87326a67165aa1605798ce4ab8500f33aa5e9492e0809293865-a
- .gocache/17/175ac426fa13c9f1c40efcc8ea653880f8cee840eb20401091461effb6076e66-d
- .gocache/17/175df7b78953a007c2639533eeca5099576b137469eda4d48886c45951e9308a-a
- .gocache/17/176722d1aac6c1aa4e465e3d0e8b2db139b4657215e8cd50d524e4c1b2cbb131-d
- .gocache/17/177880146230f893600108ffd3d690fd15fd1dda76f813083ff4e198ba206b63-a
- .gocache/17/1788c7e3fcf5662c87d6ec419e08c12b6b8a9efab8750437fe4450d20d850a85-d
- .gocache/17/17c0b1cf0614720da99247db3f5be0d6eff4a63459786c07e4c52ab0cd507110-a
- .gocache/17/17d9e4c30672dc8a816d29511bd63d6f020f8a7f599bf8acc534ce3bbd87a651-a
- .gocache/18/181eb21860ef1686fe628934ef583ec69cd14c64de34d74d0e5d8614c485c793-a
- .gocache/18/18309a9cf4221194f4f44b3ec4275bd7e03f6256fa13548b83f245f318983659-a
- .gocache/18/186b418173e62eeee87063c773a1f1015876357c288f8c803e0264533cc72a59-a
- .gocache/18/1875818fcfbef9f5abd009f4714e47b8bb490e0435a97945c7af001cfb4c96b6-a
- .gocache/18/18e81c3f30540c1017cd74207283c0366d82e2cc42621a7afa66008871b2b69d-a
- .gocache/18/18f04f810b1bdc08773457c281cba47dbf2f39f1571d7a7f766e1b9ea5b0bacb-a
- .gocache/19/190539a6de8d584210621c8e8e555a720dd64aaed5442a7cdaef84fcd585ed46-d
- .gocache/19/19299e01468c5f16417f5e76ac6225dfd5ec71067bc7aed4dccacdffc08f339d-d
- .gocache/19/192d48df3f4edca929a70e7a51148d76201a8ffb7322d3352b0a8a31df165ac9-d
- .gocache/19/193ae37ae79efab647839e3a670c65ba2539da0679f7e65beb2be7e92072662a-d
- .gocache/19/193cb33f50e3854f30671432319d57135544509a850c60f6be51a314c67f40b3-d
- .gocache/19/1966226b675e67c75208b8c969aad45f66d0da8a34c8be0a79387d54db2a6b7d-a
- .gocache/19/19ab2e0ce2349735098e4e016189fe0e247e202fd0a5be53a64791fa3f0fc5bd-a
- .gocache/19/19ed6fe577c589e867f77b62669356892f800221a204eaed9739f71e570d199a-d
- .gocache/19/19ee6b0d2ba66cb13992380feb198cd0d1005fc8d8f8389349f7b6091d3de457-a
- .gocache/1a/1a731927ad20a750503531120f9910b5e0661bd9def1bd7c623c97d0496e02e7-a
- .gocache/1a/1ab8690f3fa8d574f0c0f883d8a7bf86806c1eb902b0d08e26f584f39e85f9bd-a
- .gocache/1a/1af04cf6ce10bc9f402ea919895b098f2c66d52ecfe3694219dd42e9d63e8272-a
- .gocache/1b/1b0cacedfc7791666c8d2cd22f336a4340bfda5f04ef31f77a304ea01040c0c8-a
- .gocache/1b/1b110722b94d94f1d319a76cd4896e66e2afe24ebe481c8839b2e647c11bdcab-a
- .gocache/1b/1b123d67d2c06a2989076d9eb73bbdc65ee38183c8dec3d654692ebd6d32b1fa-a
- .gocache/1b/1b6293d9d5302a037f78b8b949bbd7abe3956afbc2012b81a3d4715b2426eb5d-a
- .gocache/1b/1b9d9b34a39722912c6f4a9c57bba9b381d76846c5696fdeea35373572a3657b-d
- .gocache/1b/1bd0e7b814a828e09535fb001f8a91c34b4494f123abb888db0c224bd74ab91b-d
- .gocache/1b/1be1dfb18684a76a9e9b7d8dab7612c900cb644dbef9e40a75a1def2e50704eb-a
- .gocache/1c/1c50da174c238010abd7d5a04d85a97a89c283e9cb3af47815af25e817f2aa76-d
- .gocache/1c/1c53d1e2fd6ab50dbde7a80b105e6af6bd31ffe24facd766dff31034182107d5-a
- .gocache/1c/1c83b39f7f586e0d8c6a4c15b0de64a8415aa02ed14c3b44d7aa91ee00d270d4-a
- .gocache/1c/1cb7b5e865fbc31472ea0f2ac0ca2aa93806018fe27dec836cf9a68e76bd4b27-d
- .gocache/1c/1ce81781158ceda46ffa856c340f1c3bcd2066867d944245281a65efec295f7a-a
- .gocache/1d/1d521e76e2fa39d2ae0adc7cb203ea51931d92855936ca59270f017bf8709445-d
- .gocache/1d/1d8b00c6e403d3772483edb1ef9f4aecff9f7784d626db89091339acfdf8f016-a
- .gocache/1d/1d9afc1b6c6652b326552627ddfbc8294ea7faebc36fba7a60fa7b4dfd413a3d-d
- .gocache/1d/1dad8dd150e0372fe8bf2cfccd332eb78de1dc21f7b226ebf6defdac2090f7f9-a
- .gocache/1d/1dcec51e1dee4a7f44e0c36d59aa2c496762c787055f92c431273077ce0043ea-d
- .gocache/1d/1de1df430c213b747cd92aacf57977b53f2ba0d8986e0e558ac05a9c1f381fac-a
- .gocache/1d/1df8856df25a6caf9632a432524e91e392250ac4e7a557537be03a89f5a9fa20-a
- .gocache/1e/1e1cab71c7ec26658dc2da9a9e51a78ac604a06e74e4d3f1c69d49c1a11be6d5-d
- .gocache/1e/1e3adbfe6a56831df6f2820226360111c88b8e07aad6bcc9bbc3ce606673349e-a
- .gocache/1e/1e854542fa53af761db7dbb100996d4cfa8e482e2986f2bcfdad3310cc9d1ebb-d
- .gocache/1e/1ead8613ee55cfa7b070cede9881e2a14d62876054fc7a24e5908c71674b8af8-d
- .gocache/1e/1eb511fae41c02bb666c4cb72faf3186240e90928d1787dc1a920675e91cb29d-a
- .gocache/1e/1eda35da421ee9d7ee7cdd056dc607398f192c1f8e2634d0805ff9e39fe51572-a
- .gocache/1e/1ee2d0f062c07a2dc3ba80aa142b1d270a7b6f930115d907c421d6eb8da176b1-a
- .gocache/1e/1eeab454bba97e6701ae4875d916719f1f8beffab03df64a3cd2a0db16f0debd-a
- .gocache/1e/1ef63d112fcf2884e0266b2f19d3d6a736eb990cd3a0efcbe6c5f6d25a4643b3-a
- .gocache/1e/1efb6904726ab32486d804791be35919aa18eb1444599ddaa2c93be75f1dcbb4-d
- .gocache/1f/1f08f20212e6f0c7a054546af2940339f1b1352633e16a82fdfae4f7f5b7ab54-a
- .gocache/1f/1f15dd405687390de4d5c70a4c07b741ee2d8ba278e3d1bd3e924c50cd91cd51-a
- .gocache/1f/1f4133f8831b9d4eacd9291ba095b26d83b3eedfffff268024bd285c49050740-a
- .gocache/1f/1f54d7b8a49ad138d73e6c2eaf73e85397f9f99856efb39be26265b06640ad8b-a
- .gocache/1f/1f6c61f7090a8d7c4fea3dadea792227405c6a8962f9cac043dbc90dbf94cc3a-a
- .gocache/1f/1f753743e8a66af3045687d22258e5be5564be1d9aea6531909f674455b62d15-a
- .gocache/1f/1fac5c23cb0ff92be199757aee7d5b7f85d566d51ab81d0d8c2ef58335b315aa-a
- .gocache/1f/1faf4f2bd0890a70ece776b2b3605ea0153a00dcd18d1638a48941691e37d107-a
- .gocache/1f/1fd2d882b3c26f92c18e249469984e1ca0c9a1e433c28c91c6b8284860516203-a
- .gocache/1f/1fe0d716b48c66f00e2eb539015b3c6e02b9244ea6f517d3f83e72e957ad9179-a
- .gocache/1f/1fe26f9461e728465a4f220b1823c37c531dfd80ae82389162f758c82fea2c3c-a
- .gocache/1f/1ff89028529997a69a41a865f6ea5e394de1f89c5c2c14dc9ea601ec339bc7fa-a
- .gocache/20/200da92413272a23f62fd8f00bbd3d0864cc2edc61ef221c00444d71cca326c1-d
- .gocache/20/2043856174d52b0ae874a706908900daec1f635a1467a9b5c38c9e91f1eafe3d-a
- .gocache/20/205f457516663047600f8a03054e15d70deb095325c2b3a3045ff39a08e4b832-a
- .gocache/20/209afc605b6487b8faf92a7197e62deb9ac3291a19bb092e5e1e4ce013d6d696-d
- .gocache/20/20bec08135145fc25ad5ae39e0eca9815bfc04cc455cf3ea8a866ef876866b71-a
- .gocache/20/20e1ff48dee411c058cf4475ae3e0fc24beb4210dcbf65f2223805f1fc71056f-a
- .gocache/20/20ea81bf0563c6cf49bb34a416512c9e5fe098c25190e9901abcfbff0294a651-d
- .gocache/20/20ee7256dee2410526c3c6a6d1390a87acd56ffc1e37de5a7182f66215eab9fc-a
- .gocache/20/20f847f228a00eb4037df9566bade893d0fef3c3a85be2cb8f3cd1b5f992da04-a
- .gocache/21/210e02877fcd5ca700f2a65914a429982b445da102caa3813c64f16fbc3cfec7-a
- .gocache/21/2134df903f3d2068407845556b06f5aba5e69822116c24fb405c627323e2f4dd-a
- .gocache/21/21a22f41cf46a43bb0d92317d587b99b08eaac733aed93f0780b7e5d2f2606c0-a
- .gocache/21/21a73a3b7eca95b68609652a77e3585936c95e37975f8a801586f0878db9bf6d-d
- .gocache/21/21ab217e247ea5847e0ff2e4dbfece4c8844ba4b4c3a9f1f4e1703ec7e73858b-a
- .gocache/21/21b726efd0caf246ec29f62ad1d44a8e1f3759d2c01108005c07fc580c3dc89b-a
- .gocache/21/21cf87cc2f6a13060935ba2b276272e36357073e34ab5af7e948d774526c956c-d
- .gocache/21/21fe72e177be4990bbbcebfc2e631803ced4541e9b701c08ad84a635339b4fad-a
- .gocache/22/220c3eb368a151d62abea6651ea4c9d88bd44a713538b70de897ee21ff53529c-d
- .gocache/22/2214a6a79b5f60d879ad4da19e3c756ad8fbc13e718a94efa3dd810b48eddc74-d
- .gocache/22/22660a6630b97c5007eb00a78901b65ffaedc528bd643aba3a5f68b22864bd52-a
- .gocache/22/22ac819c69de4a2d8caca7903017c20efcca756dca1e5d1c95998320a554bc90-a
- .gocache/22/22e4c721877b7d4e35036992e6e00e98ed473f9dbbbbe5b3a40ea07c9966bb44-a
- .gocache/22/22e9c935db51d7211f3ae6845f212d1a3a3ed7cc665a333e6313885584b1b5dd-d
- .gocache/23/2306b61033586a481afadddabaf1f6c5070328f05d89f98bc1bcc043037caf08-a
- .gocache/23/236a9de064f7c61d23ad2cf474fd74ba5064a63fe197aa097cba2597841be85e-a
- .gocache/23/239fc31f672c3f4782172ab3b60e9b85c855f4b87063fa719d444b3c8ecdd370-a
- .gocache/23/23ac103fc0d2ea4f9a3866e3ad617fac032a0762f803b9b2422cddc5a3358379-a
- .gocache/23/23d051e7d2531853a8b8ff09fa728476ee6c7748ced4ab69a134c90b097dedf4-d
- .gocache/23/23f9906005bfc8903c42f377373a4c3dba2605db943146106aa464ef193c0b5b-a
- .gocache/24/24549e5d0ab08f9079806a734e7416278bdf6c13c8ab345e2d25fc8fb5f2c8a0-a
- .gocache/24/245914dbd9e0fd677df940e516c517fc4a7d9e090fa6c4aab8a10953a8ae549b-a
- .gocache/24/24bc9fe33786c59873a797d7da25c524db1ab25345a80344ee23595e3bc803cf-d
- .gocache/24/24eb85c2281f42191c61d49a0e7556289128b985a855d23dd82da495e7895a54-a
- .gocache/24/24eec6cc72842ad07c92ae1ed67c9fc8aa3973898646dddd9e82fecddfcec8cd-a
- .gocache/24/24ff9f16f424ab525137dd016c1c339b9f7315660568ab9974c7c6d0c15dae22-d
- .gocache/25/253284aa2caf7404ec14ab1d160a1ed2efc0618a56fcd29ef2ec57c5b692b56c-d
- .gocache/25/2584d9de03d02ac224a246e290024215f7d9cdd3a32cacbfbd6d166c562635ad-d
- .gocache/25/25a550700ac51c27cfe6b9cecb568f5aad819bd5f1b5955e8d14bd067a57c5fd-d
- .gocache/25/25ba574ee4e8faf20c7ef0db4f1732f934026b8c909c4bafd3a629120db6977f-d
- .gocache/25/25cee86f290c4896b14ec7fba82e371997ed7709873d75f612996fe558984637-a
- .gocache/25/25d991012e1c698a42a3c09c455615c1ef718652cf18991c14d04aac4c8a3906-a
- .gocache/26/26272fe101f52d117f69ed826c4185bda612db368db34fc4a2a18bff8cf1b64e-a
- .gocache/26/262f51716b42efbeb5cef63af2995e38144b62dbdf5421c854cedb79dd5f1f20-a
- .gocache/26/265934f97bdecab12abfb6a12bb4b16e6ffd9b17172fa0c41af65820fab2ae2e-a
- .gocache/26/2683d5e34b54dc68d411d756e4de762e5b99be9fdae3b9a8a27da9fec1184376-d
- .gocache/26/268e03e2886f53ff76a9eda282f58332e14ece51aa412f90adc68a278e4714a2-d
- .gocache/26/26e0ea5af869a320e9f3d9de236286965def45899788a46be5621fb5672abd5a-d
- .gocache/26/26f0a5f9abebe07ed265ea1b2156bf23e0109d890007d055f876d3f61932f147-a
- .gocache/27/2728c33f33bee417e4032fb39a9862142968b5ac00ca4246112e4e04aadf702b-d
- .gocache/27/27385625d09b39ddb4adb44d073ed7b96514bb462ba862c6102f66230ee1efa8-a
- .gocache/27/278a2aaad89deb3d28ab02f25bf54b4784670c56bdaa865f62a98ec5566bca70-d
- .gocache/27/27950be934172238ed07b312b3bf6ccf75e59fb9b5c5042ee71639b85ca6273d-d
- .gocache/27/27b8d8e236ac92f05fc880d45b474138a2d42923180f8d6a16b7bd1cb6cad4de-a
- .gocache/27/27dc3f17d14350eb4a353ea5f105f48ca89a80cc858dd29b94ec2325ac1bab24-d
- .gocache/27/27ee246bd8207541a83fe3b0cfbacc96458636f5aadb30ee1564044864843e88-a
- .gocache/28/280829922270ba8b6c41c22e20696b8b6bc485bca2bb30472da390efed43001c-d
- .gocache/28/281bea3bf382aa0a8641f280358b8dd08587da04afd952a1d2ca6611142bd7ee-a
- .gocache/28/285a978d88032ef0dc8b9b30cae432127273a838c411ca473e46c94c8b9cb392-d
- .gocache/28/28a5a108542a84da383fc2c52a5b0c090ad04400feedc9e4b8c0bd0cd1dc5e59-a
- .gocache/28/28ada95f82c530c5b801e199f54259a9afb65742a59c08a6ce5f56d938994c9b-d
- .gocache/28/28af47017f96a6ac1cb602fc07ae6238af16a4f01b88cc33313407207e2638cc-a
- .gocache/28/28b2d447d3eda36513cc29aae6da1b930f80e858c86aa25585a563f87378643a-d
- .gocache/28/28fad3b8f389fa67212dc1b6ec58bda216238b23af2454bc678140cebc6c6ca0-a
- .gocache/29/29b051b653a394836f379f6d79fca8395d130465de3003fbacf8d3cf9396f976-d
- .gocache/29/29d6c04c2e34b1b788812cfacf5382347696437f366faf7071eb057e2cef7c82-a
- .gocache/2a/2a03ef1f12520e06dfa6e7234cf7cf07086d9c9531e817c7f627faa423735d37-a
- .gocache/2a/2a3a6aeec2e8c81aabdf65637856df0eaeb510b4a708fff97ccc1efd322f57ae-a
- .gocache/2a/2a55eacf49266d7653fc377f84352a05bc8e2c6c70c5ddffbd37d619366cc50f-a
- .gocache/2a/2a7dc69946c3b2d656e2e8b944edeee93a095495d2d1c6c71d4f687b85579f8e-a
- .gocache/2a/2aece03ef7b287f33969f50814d705fa4a821a8d8ce1c9e2764e9717075a16a5-a
- .gocache/2b/2b22232ec27421109400a8c5beca6e7362de9a9ed69f317b2f49843339b7cd80-a
- .gocache/2b/2b339d9de98a2e493fca8abc9f19ebdb7198f00e1585efff084a8a32553450e3-d
- .gocache/2b/2bc7bc11ddd99ead2affdacf3f0b0291a5fd4af51bc327fc1e834ba316ce727d-a
- .gocache/2c/2c062d702c75de9fbf95c2c2c2a1ddc2f1034a95a8f270af343d03e0fa86d7c6-d
- .gocache/2c/2c51d761a9adc13f6f00647528cd268ec4bfd6f3ca03aa890a17c52c8318e285-a
- .gocache/2c/2c764a47a4f9d26c33d3e547b8d7fe162543e372069c32944c091186adc4e1d1-a
- .gocache/2c/2c8a37bb6067920ff880491cbe2e0b49e6e1d7f09795a54744e29a9dcb72e8ff-d
- .gocache/2c/2c90621c7e7e8ee155bf8a7e1356c83c85edd279157d2020d438812fa23b75bd-a
- .gocache/2c/2cb06d67aa5043b25be1fe89f930af98833a91c39198b45cfe97d2e2d611da27-a
- .gocache/2c/2cd4c4f5f5c7888e7b9e11afd0db10496655e1b84c0c1c705d3ec2d343fc5f2f-d
- .gocache/2c/2ce55b84f26f6db240ebe1917e8179af5dcb8b8b291c79f2392ce79fb259f60d-d
- .gocache/2c/2cf4a91ce79d8a7ea1e9b7a727e6d3997ddae099d0a803e3b0fadc3e0d793e99-a
- .gocache/2d/2d7efc2a2995edade2ef320fc8220839452da40a497a5a91c5a4d26bf99062c2-d
- .gocache/2d/2d89c89aef4b85c599b196757dfb59be6c2c2b8a3f9b54e63c37c2a9a8990e7e-d
- .gocache/2d/2da260e75dc2f5b8dca6f32855ca986951362134209da9e8006a6b7d627f7f02-a
- .gocache/2d/2dcc170dd014a4438a1a1018a8aec4f2b74945fecde5bf04b11f711b4caf2ace-d
- .gocache/2d/2dcfd273b64d1c381a9167f971df7197c1d02e7e32c0758baddaba0f61ef5b5c-d
- .gocache/2e/2e535193c8792bdf8636979c4264a8d9d09f719bba3893caa8324ff3b50c2f25-a
- .gocache/2e/2e7a169d29a4fd46dd605f37645391fe90710001990ff3af8422c60b1398f007-d
- .gocache/2e/2e9231f0424f126ce3f18d9f012fc9ca511ce87b76a0d5a2ab344c002a4e6584-d
- .gocache/2e/2e9fa514326c4820596153be9bc18eaf1539144f4338ee287c8f4fee9745b18b-d
- .gocache/2e/2ea3d69b00ffb43612b3bec8d58ad30e9e3b176f0cbc4e3f477403e2748907b9-a
- .gocache/2e/2eb1d0e7bfebdb18e29753ea4489d29a7b2d715af4af0a8eeb81d951474961a5-a
- .gocache/2e/2ebc71a13570e747b8c03e42db8f14541eb3833c1e44cd01536d312d46f5d3a9-d
- .gocache/2e/2ef03cfc6fb43b6d1a4d17879629958d2ed52230019b79a5800273653994883a-a
- .gocache/2f/2f1570c27d156f8433dc8a282d4e2c426f29a166bf4124af2cb03332f5e00116-a
- .gocache/2f/2f252f7e1721d5e8ddf401dcc6e94d56f2dad00bc357c551ba73c6c82f530f1d-a
- .gocache/2f/2f38a3f7fe1706f15ac9a1df730d8d94b2a51160579bf28ddadf19166f5b4658-d
- .gocache/2f/2f52bbcad7f48f13b96bbb5c5b5b3b997123b92dbcb4337b47f141bf63ce56f9-d
- .gocache/2f/2f72b34dfbe289b4d6ebc3b35f154ac39760dfc87fd7a35e735f67aa7cd16500-a
- .gocache/2f/2f8782090efb3d9f01c7788b8abd32d742d67747ead3d392d12eede7376278b1-d
- .gocache/2f/2f9d1e7a89e048e3e7abc5b498f0ff8db40c4bc8d629ce978b4d19afcb7f8b58-d
- .gocache/2f/2fa81e228e0c234d07812c1a7fed45ef3cd0ad19247f6f64b88b74056f8bf011-a
- .gocache/2f/2fccbff7c3d715fee45a8b4955265817be3e086eb560a34f9e2286df5f76cdd0-d
- .gocache/2f/2fdea137132603fb1675e6778394fc1453e573b41b667f6919ad0f7105e4a48e-a
- .gocache/30/306ebba1fd37895c6e3438370244e105844e9b8c2284ee8cbd1046bfe11c74b2-a
- .gocache/30/30725b782046e702875f7029251e17fbfd8104f35c7b5dbf81bad6ccb08b4caf-a
- .gocache/30/30a2caf1e77b2673d0488acf5d74c1ff0ea26a9252133ae8bbc6c8ab35bb47a1-a
- .gocache/30/30a2f1e4b3849358fce1602468b8b8f64f7acbc445b886b1b3961839e0615684-a
- .gocache/30/30a8494fcdc136411a34db065384c5e793efff4b53b16c067cdb68b765aacd97-d
- .gocache/30/30a8b1f8a5c4f6d20f49b88f028239d9f41aa4175587200555b02f06574e08ee-a
- .gocache/30/30c3774bffe6b6ee55c549cfde6476baa19bc238ec03e9923a367cc530a425f0-a
- .gocache/30/30de3215fcee7d591d6742284b234aeed82f0c2ee461acd976e946477feea3fa-d
- .gocache/30/30e3d9c24935c8dde4d7e8722774be6e22d43e00d70ee96e7751bc27befae68f-a
- .gocache/31/3103241a0176c37e046d95d90c79c97007fd823c5f4b0cf80bbba9ba04f41eff-d
- .gocache/31/3143af6e887fbf87e84f2a1910cc03740630210f69cf5d36f72a6dafc7c13e59-a
- .gocache/31/3146a8d8837b968b3120a38e53038cb42076c5f54df39bb5a04c3591ec10e070-d
- .gocache/31/3175cc9af29c8e4957a28abb298c2d51ad56a8f6662bd70751697fb70cef3dc8-a
- .gocache/31/317c91904fc3a353da626af09254aa5c1e041579285a6e746b8db8ff7e68d857-d
- .gocache/31/3181277dfc709bef47701e3b5452704df0993ec759058ecdd3966d46e90cdbe4-d
- .gocache/31/318ff1f8c9d05ca874b60c3b5c09825901d8e4afc136037b512f700921cb00cf-a
- .gocache/31/3193feccaf4e21fb1eabf9f32b3fcc1e71166febd2d2aa2364f83ae76425d7ff-d
- .gocache/31/31b986f7bbd0c57ed34fecf6aee89a232f17f0aa5bae00dde91061a4b0b738a5-a
- .gocache/31/31dadde9864bf670b85624c448cb48e2fa27edaa915feac663985d2653ebd82a-d
- .gocache/32/3203b67ae3450811412db23284f24fdc32246cafe05d10f1f16e8611abab1e57-a
- .gocache/32/3245a9ebf9229af85a31001030a75fa050d15be5cb1b42b56bc8d1ef97d73a86-a
- .gocache/32/325418139eb0e2710ec1587fe4e9ca06a4907d6d0b25c2d0931bca8b1a7920ce-a
- .gocache/32/3271747fe1059e47e96735537b156ecb6ffea48ebec73157dbd6fda452b9b488-d
- .gocache/32/327b3904d5a7e8228289b6e2a214eba853b72b9aa3e4c6857897aaa4b86814ab-a
- .gocache/32/327b96487caee877d390cdd4a2b05f64a631496f5118335cb977a487a32b1e32-d
- .gocache/32/32b0bbd35d203f5ce34ac106bd6b8c7de40a29380d0aa6171f952fce518d2102-d
- .gocache/32/32d0fc293396b26d8953668e2d5af39a192fb8a9acb760bd3ab2d85706e5f3c4-a
- .gocache/32/32fd52f7a1dc1f60e17920bbf4489c2c2287791e064ce52d801c5b9e3d779f2e-a
- .gocache/33/3317576251b0b2dee6acc9cb70bb057e9ebb53afc7625dbf7eac899f6b95ef3c-d
- .gocache/33/331f72065457d9dc420561391762d7f2ee478d61bb74cbf1467dbcc24539cfb9-d
- .gocache/33/3320976b691aba1a3a28d32fbb209234b5aa348752bd7f4424c802eef7dbf3a0-a
- .gocache/33/33493dccdbe50f5277eb893d8179d62b02a7dc8c47cc9d933bc7c63e72cc10d6-a
- .gocache/33/33a0230b66d90575a8ec3a50e8d2a034d0b2517cf3c806c89a74833c050c102d-a
- .gocache/33/33b9febe54d6a1753c9916acf6d6e35b5c51408bcd256d597586713e487f4f78-d
- .gocache/33/33d706920dbb66bdf72bf6cfeaabff77913fcc105f1a74049cee9e2ab862d437-a
- .gocache/33/33e44b39106a5837337a6cb8a2bbf6fe307081fbe3fccea45a8c51fba454c895-a
- .gocache/33/33f231e40e06067891f535d9dda63f8d388a8e07dfeb46d951e5789440813e6e-d
- .gocache/34/340d1d99135f1fe4e675f0f32dbb0c3c0707e2855a29e540707c9888656e0113-d
- .gocache/34/3452ee20214f2fadca39ce9155c7d74b375381293f6748ef5583476e0e327c38-a
- .gocache/34/34598908327240e5089f6e2114bc93e40a0e468ee2f11131bd7d062b591a18dd-a
- .gocache/34/34854da452f46a7dc3cb5f603fce6a83b0ea8ac427f951875e2198fed4187455-a
- .gocache/34/348628366bd106705423c43a99dee42611a11269c42d64e3c89cca29dd708142-a
- .gocache/34/34ea25a859c47b1401b634a67d14df9d67fd5dbedf604fe9cd1bed80d5ae1202-d
- .gocache/34/34f0c02a48b45a856dd631757bc7d8d4f4bce81cdfc5889ffd56cb69ee257b4d-a
- .gocache/34/34fb726c8cffd75c83c57f39d95d90d83c928f1de40b8c6ae48f0906b75f3dce-a
- .gocache/35/350a74e220565aba96ce184f7ad9d14111bbf466ca8f9774fdf29ab18618b684-a
- .gocache/35/35200ec2004a6d9cec4132e3bc87be2b374a1b3c096a387577f91775bba978ae-a
- .gocache/35/3536952859759f62a0da683cf50bdb86aeaba023b0efc0a7ede3aed26325756d-d
- .gocache/35/3537c6945405c6107e203771e94f4e9e7d8786197f100d9998ae48e9b2295b40-d
- .gocache/35/3539432733d5e60659a313a78af36b3c431295f5503cc5b4e23cd3921eee55be-d
- .gocache/35/356b1d64fbb9557333432a67f08f24864c2416ab267705649e6329b79fe63c32-d
- .gocache/35/35cac6d9fbc4d2b33b7f64da2b71159afd2445b2b31dc93c1c3e52bd0cb87efc-a
- .gocache/35/35ea13898b784616da6e687469353bea284fd0149974b93a5c852550ef6beebf-a
- .gocache/36/364c72befbddac2210f5ff6409a192a0d3783a215767772be96d2a0d6b8ddbf4-a
- .gocache/36/369bca74b0d8088e20d0513f8006e4f1c318c1b604c64b340708063489ab024c-a
- .gocache/36/36b624ba136448109ed40a3735c1c869e0aaa40954bf76e9ea63b8f3e66101ee-a
- .gocache/36/36f19b2a77db8f96d4dc36908163010654cd0c17a6e9fd9e48916754ae2affc7-d
- .gocache/37/3742c6cfb9f85bab47fccd437b3da4f9607925581dff1f559dd8c54df8983e92-a
- .gocache/37/376f841bccdd913f2159524a64e7366fb6c9a696d3426cf235ac5be4380e66bd-a
- .gocache/37/3776d22c32e9761356de347c614bf64354df15a004e1bffd9bf5ff7f26467303-a
- .gocache/37/37798307b647e0baba742dc9e8312ce35a64dc574942544268e79372ff7ad82a-a
- .gocache/37/37ab6926fff3d4547ff40244e16317eb181a9913ee4e578a8bf38717f398a1cb-a
- .gocache/37/37f6f952928ffc18d423d4c8fa92b8b87c79d8fc8c03ad9f361d82e0c89edc78-d
- .gocache/38/383e65f64d2c34434250ec3d16f8291d92ba31a2ff6c01fcbb832bdff951b464-a
- .gocache/38/3843ca8d995022571fce216c0387deab78d06b72d8efea3453ac3f2f1cc96790-a
- .gocache/38/38959e2705e1d40d661da893c3c2ab701fd9e8e47995a026cfab7a479f43a2b1-a
- .gocache/38/38bd5d9dbe4e76ccc896eea0df09450ac919cb4798bd59cde2f0b7561d6e4a7a-a
- .gocache/38/38c515a292b068097e62dabe7879dbd4d1d924c5c14167db663a85525552b77b-a
- .gocache/38/38c9b7f21767a80a370296f8ee0580e7603a017bee119f76b5100b1b3e963f7b-a
- .gocache/39/39150d51e704a3fbb2267f9e6a8cab71b4d094dcd4fb65b423bdaceff9713619-a
- .gocache/39/392517be0de047c4b5801b2055b0996f960175d054db5e4b4d99d055b7c4fa04-a
- .gocache/39/394940ab5af5913e4d33e589bb3582a6f1ebe613ad58ec26ffab977590bdea5e-a
- .gocache/39/3973dc326a55308c623bce6489bba5590e08a1397cb7e63b532c1a75d72afe67-d
- .gocache/39/39869bb8c2b223cc8aba7f2fd237afd0356948f03c5fde942c8beb35d469dc67-a
- .gocache/39/39fe96645bc967f753488abbf05dd5a55d4fef254f51e6bdc20712133c5fa2d3-a
- .gocache/3a/3a19d8613402688f78df41ab7ab34408ff6b5aacbb90a89e8fa89af55e505f07-d
- .gocache/3a/3a2247463477d7161e05902eae24cac571de58aeebaebc346c2861e077ee233c-d
- .gocache/3a/3a322d395e16df5b765e9488326d3a905fa80c019944d0d3c1a594460c7f907a-a
- .gocache/3a/3a485e1f04721a21638c1348b5749645824611a1cd197f2329cbd8a14e243363-d
- .gocache/3a/3a4999ff490e27046078def2c4fa84bc52a040787b8a90c7457e1941769b2e1f-a
- .gocache/3a/3a592071f362779dc365eb3680ad53928465768093db8d67be060904e121112d-a
- .gocache/3a/3a61585e920958dc09215fc53088db2c93751ea2da48f412a604e4d45306943f-a
- .gocache/3a/3a65a42dab5faacb13b5f0ff7546fd2cc1b8fc4958221f17180a40eb2aafce1a-d
- .gocache/3a/3a7eb3fbb067f53668ed9e8969013c4393d5baef5793367d9250afa82d91e444-a
- .gocache/3a/3a9a5e85ffcdea4d567a39f7557420704461e784f9d617e87cd4a4edeb54a7d1-d
- .gocache/3a/3a9c8d4149283150aa32c7b26c351604abe16b637e9528a6b7c02d61510300f3-a
- .gocache/3b/3b051879b5ba0e4cd2656fec94eae5c65058a56e4ab22912da80ac2dce151a8d-a
- .gocache/3b/3b34e1d565b5ff6991a632e585754925d91b748f8cf751ce4623921d9a68535c-a
- .gocache/3b/3b3d57b01818bc3b8e0f4616ee23b23b77bcfb4ddca13e9a8d4889888b1fa6ff-a
- .gocache/3b/3b46153fcdb0cdf9bc9a71b9fed772710b12deaeaae8dfded346ccf52b9ae8a5-a
- .gocache/3b/3b704abab0c24e3c653c5fa68a8b7be8c02754789541926af8adcf41b11578fa-a
- .gocache/3b/3b70780653206cb9f55c28689247ecba1a6783a8c99e00cd57a01cb5998af621-a
- .gocache/3b/3b76f1c674ffd228db832df845e07cb117bd54e1ed24f1a4d2fca376438193c0-a
- .gocache/3b/3b7c3bc7eb267fea3b5e7cad842526bcf231c232fa99c5a7ddf82e6c0051eafb-a
- .gocache/3b/3b88113c122170fa25629a277414ae7aafb95032cded7791adfa9991bf60a52d-a
- .gocache/3b/3b9a745a3064e3658e5341f211f581631135a2ac61ca2afcbf339112be4e72e2-a
- .gocache/3b/3b9f0527ed3af53b8f02c3bd5babd6b046767db741a725329dde669884529c30-a
- .gocache/3c/3c1341694576a38fd504d7a2be8d3beef82aa7bbfe42d8acaa4e37f9ddfe9745-a
- .gocache/3c/3c191f7883a8a2ea1381559eeb66365f8f0f7301801e2ff40e570b365c303c01-a
- .gocache/3c/3c54171244694ce84fd3f3c715d9fcad1def57c90f505bfa447b9f66b9a176b8-a
- .gocache/3c/3c5996450e30d8787edbdc57bc091440dab4cdca7a0b8738e4094d98bc40edad-d
- .gocache/3c/3c6e176b2058a2ac09fa34babaa031fbe4be626bbab33641df3c457c75a971da-a
- .gocache/3c/3c73b6a29257969c1a500840c59ec51455da304c5d4c9d9cbdf655dc66a9c43d-a
- .gocache/3c/3c8520b42c39c32da88329e4141feda90386781e3f2f8141f7630e309ba76574-a
- .gocache/3c/3c902dae2eb757caeb111e48dff7910863bb42de0597fca64fc4877e0c47cc88-a
- .gocache/3c/3ce21e414d50aac72f3cff0b8a36d1460d4e7c243822bb39bf862fcb801789e4-a
- .gocache/3c/3cf78f4b90e2ccaf46004bbeb1a74ea031cd67cff2a7ebffc86352fda29a28f0-d
- .gocache/3d/3d276dd96d97a470a1ee0a17d10c5609970111656c7b4c84a733594f39feff18-a
- .gocache/3d/3d2fb3bf2e568cee6aeafcf65562daad15e1d296a9164931f6c72c55c050667c-a
- .gocache/3d/3d30ede411288f59f173f50e36e901f76224a610b28a424aba3c1d749e5b8a68-d
- .gocache/3d/3d41b34b1d2aa1a367d1b71c7f7a4fb33b678c6537f4b56e0463023fbbef194e-a
- .gocache/3d/3d5bd1bbfb0ce0a5db8e3ec8a548dd1c973ab4d69349fa284c77364524088c33-a
- .gocache/3d/3d89c60a1d3a98307308015ae334d3c1db9b6d5c28187cc512287c24e356f1b6-a
- .gocache/3d/3dd884dbd083ff2ca680fe32e436dd20b8cdb53367ed163a4d4238dc002a8bff-a
- .gocache/3d/3dda3fd818280286c67c0034e0c9510f71d03382311da305a0c6fd75bcb71f7f-a
- .gocache/3e/3e0b639f5d897c378b27338cb7899f407d562a3d601b7f0c7b2b3bd9a7b6c104-a
- .gocache/3e/3e1105e1c62caadac02650673f365083e73bdb050ffb91301038804444582378-a
- .gocache/3e/3eb3d07543170b67333862de3fde3149bb25d0a957eb4174427e4c9fead9f5f8-a
- .gocache/3e/3ec496f7e72d60d66b2915f3cf8975bb94b79c4d57e08c3f65fedf46eb5d0339-d
- .gocache/3e/3ed344debeb7814536be115530333071179a2c6bb7816d52de8b6637c86107d5-a
- .gocache/3e/3efbc9b923389cbbe7e23a11dac81f3a84ca5e2f982ca577d0d350ec31a43eca-d
- .gocache/3f/3f15c174cf9b7fe485abbba3d6d721a821d65bf289891362826b1ad6ff9ff31c-a
- .gocache/3f/3f175c2252b4aaa46a896665940033a5173f9c76378b93f523362da6e2a567d5-a
- .gocache/3f/3f409b117180d8c0bd5d067c2a4936edc6df0ad8402b93c5286b6c575d774474-d
- .gocache/3f/3f4af02d0600e55a65fbcdec6f082b9758a1bfcbc8fda1cd24457f338291f112-a
- .gocache/3f/3f843727e6183aa2c0e64f45891d8583c15837a1e3d5ff0a79a546997a0e5ddd-d
- .gocache/40/400dde81579936c732536f87af904b170a8c219e510c459c660c0cd3ba8ef223-a
- .gocache/40/4014d16a078390f9a7a12cc9c86776edc382fb10bccac4574f4234fbe742490c-a
- .gocache/40/4063763669c75b0b0d0e811c6b3258af05a4b9d7647e9434401500732d734bd1-d
- .gocache/40/409c4a45812a8f00d19db7f5786d5e817dc3becdf91cb9670fe0ad2981cc6bea-a
- .gocache/40/40a0585e022164e61f22138e69c6a60c07b97d4643a9bdc371cf1f17bd318775-d
- .gocache/41/410a6c11db55233e1858a55960476156139d5338efd1a07ae3e8cbec779fb317-a