guild-cli 0.19.4__tar.gz → 0.19.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. {guild_cli-0.19.4 → guild_cli-0.19.6}/.eidetic/memory/default__public.jsonl +1 -1
  2. {guild_cli-0.19.4 → guild_cli-0.19.6}/.eidetic/memory/guildmaster__public.jsonl +7 -5
  3. {guild_cli-0.19.4 → guild_cli-0.19.6}/CHANGELOG.md +45 -0
  4. {guild_cli-0.19.4 → guild_cli-0.19.6}/CLAUDE.md +1 -1
  5. {guild_cli-0.19.4 → guild_cli-0.19.6}/PKG-INFO +1 -1
  6. {guild_cli-0.19.4 → guild_cli-0.19.6}/docs/skill-sources.md +12 -12
  7. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/scaffold/instantiate.py +56 -6
  8. {guild_cli-0.19.4 → guild_cli-0.19.6}/pyproject.toml +1 -1
  9. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_scaffold_instantiate.py +76 -0
  10. {guild_cli-0.19.4 → guild_cli-0.19.6}/uv.lock +1 -1
  11. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/agent-config/SKILL.md +0 -0
  12. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  13. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/agent-config/scripts/show.sh +0 -0
  14. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/ask-colleague/SKILL.md +0 -0
  15. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  16. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  17. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  18. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  19. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  20. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  21. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/cicd/SKILL.md +0 -0
  22. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  23. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  24. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  25. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  26. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  27. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/communicate/SKILL.md +0 -0
  28. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  29. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  30. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  31. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  32. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  33. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  34. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  35. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  36. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/guild/SKILL.md +0 -0
  37. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/guild/scripts/configure-repo.sh +0 -0
  38. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/guild/scripts/create.sh +0 -0
  39. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/guild/scripts/overview.sh +0 -0
  40. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/onboard/SKILL.md +0 -0
  41. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/onboard/scripts/onboard.sh +0 -0
  42. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/outsource/SKILL.md +0 -0
  43. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/outsource/prompts/explore.md +0 -0
  44. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/outsource/prompts/review.md +0 -0
  45. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/outsource/prompts/write.md +0 -0
  46. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/outsource/scripts/outsource.sh +0 -0
  47. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  48. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  49. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/recall/SKILL.md +0 -0
  50. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/recall/scripts/recall.sh +0 -0
  51. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/remember/SKILL.md +0 -0
  52. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/remember/scripts/remember.sh +0 -0
  53. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/run-tests/SKILL.md +0 -0
  54. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/run-tests/scripts/test.sh +0 -0
  55. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/sonarclaude/SKILL.md +0 -0
  56. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  57. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  58. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  59. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/teach/SKILL.md +0 -0
  60. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/teach/scripts/teach.sh +0 -0
  61. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/think/SKILL.md +0 -0
  62. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/think/scripts/think.sh +0 -0
  63. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/version-bump/SKILL.md +0 -0
  64. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills/version-bump/scripts/bump.py +0 -0
  65. {guild_cli-0.19.4 → guild_cli-0.19.6}/.claude/skills.local.yaml.example +0 -0
  66. {guild_cli-0.19.4 → guild_cli-0.19.6}/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
  67. {guild_cli-0.19.4 → guild_cli-0.19.6}/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
  68. {guild_cli-0.19.4 → guild_cli-0.19.6}/.flake8 +0 -0
  69. {guild_cli-0.19.4 → guild_cli-0.19.6}/.github/workflows/publish.yml +0 -0
  70. {guild_cli-0.19.4 → guild_cli-0.19.6}/.github/workflows/tests.yml +0 -0
  71. {guild_cli-0.19.4 → guild_cli-0.19.6}/.gitignore +0 -0
  72. {guild_cli-0.19.4 → guild_cli-0.19.6}/.markdownlint-cli2.yaml +0 -0
  73. {guild_cli-0.19.4 → guild_cli-0.19.6}/LICENSE +0 -0
  74. {guild_cli-0.19.4 → guild_cli-0.19.6}/README.md +0 -0
  75. {guild_cli-0.19.4 → guild_cli-0.19.6}/culture.yaml +0 -0
  76. {guild_cli-0.19.4 → guild_cli-0.19.6}/docs/cutover.md +0 -0
  77. {guild_cli-0.19.4 → guild_cli-0.19.6}/docs/onboarding/reachy-mini-mcp.json +0 -0
  78. {guild_cli-0.19.4 → guild_cli-0.19.6}/docs/plans/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
  79. {guild_cli-0.19.4 → guild_cli-0.19.6}/docs/specs/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
  80. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/__init__.py +0 -0
  81. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/__main__.py +0 -0
  82. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/__init__.py +0 -0
  83. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/__init__.py +0 -0
  84. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/_broadcast.py +0 -0
  85. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/_provision_template.py +0 -0
  86. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/create.py +0 -0
  87. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/explain.py +0 -0
  88. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/learn.py +0 -0
  89. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/onboard.py +0 -0
  90. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/overview.py +0 -0
  91. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/show.py +0 -0
  92. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/teach.py +0 -0
  93. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_commands/whoami.py +0 -0
  94. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_errors.py +0 -0
  95. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_output.py +0 -0
  96. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/cli/_repo.py +0 -0
  97. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/scaffold/__init__.py +0 -0
  98. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/skills/__init__.py +0 -0
  99. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/skills/identity.py +0 -0
  100. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/skills/ledger.py +0 -0
  101. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/skills/render.py +0 -0
  102. {guild_cli-0.19.4 → guild_cli-0.19.6}/guild/skills/sources.py +0 -0
  103. {guild_cli-0.19.4 → guild_cli-0.19.6}/sonar-project.properties +0 -0
  104. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/__init__.py +0 -0
  105. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_broadcast_post.py +0 -0
  106. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli.py +0 -0
  107. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli_create.py +0 -0
  108. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli_explain.py +0 -0
  109. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli_learn.py +0 -0
  110. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli_onboard.py +0 -0
  111. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli_overview.py +0 -0
  112. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli_show.py +0 -0
  113. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli_teach.py +0 -0
  114. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_cli_whoami.py +0 -0
  115. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_configure_repo_sonar.py +0 -0
  116. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_skills_convention.py +0 -0
  117. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_skills_identity.py +0 -0
  118. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_skills_ledger.py +0 -0
  119. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_skills_render.py +0 -0
  120. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_skills_sources.py +0 -0
  121. {guild_cli-0.19.4 → guild_cli-0.19.6}/tests/test_version_fallback.py +0 -0
@@ -1 +1 @@
1
- {"id": "plan-3layer-memory-evolution-2026-06-20", "hash": "db353fae964d96158a26d878e9a159ec5f6e8877cf3dba0a6c34e7e86b7535c3", "content": "3-layer memory evolution plan for eidetic-cli (requested 2026-06-20 by Ori). Layer 1 Migration: migrate the old ~/.claude memory skill data into eidetic across all stores \u2014 files (core.md, notes.md), Neo4j knowledge graph, MongoDB RAG. Eidetic becomes the drop-in replacement. Layer 2 Freshness/Temporal: every record carries a date signature and is temporal; signal strength degrades over time (a year-old fact is weaker than a fresh one); recalling and validating a fact reinforces its signal; remembering a new fact connected to an old one keeps them linked and the stronger validated one gains signal. Layer 3 No active deletion: memory is never actively deleted; a conflicting memory with a stronger signal shadows (supersedes but preserves) the older one; memory older than one year is archived. Open question to investigate: does the old memory solution already have a freshness mechanism. Skills to use: think (devague spec), remember, ask-colleague (explore/work/review).", "scope": {"name": "default", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"source": "claude-code-session", "author": "Ori", "timestamp": "2026-06-20", "topic": "memory-architecture", "status": "proposed-spec", "relates_to": "eidetic-memory-surface"}, "created": "date-unknown", "last_recall": "2026-07-10T14:54:03.866682+00:00", "recall_count": 13, "links": [], "supersedes": null, "lifecycle": "active", "added_by": null}}
1
+ {"id": "plan-3layer-memory-evolution-2026-06-20", "hash": "db353fae964d96158a26d878e9a159ec5f6e8877cf3dba0a6c34e7e86b7535c3", "content": "3-layer memory evolution plan for eidetic-cli (requested 2026-06-20 by Ori). Layer 1 Migration: migrate the old ~/.claude memory skill data into eidetic across all stores \u2014 files (core.md, notes.md), Neo4j knowledge graph, MongoDB RAG. Eidetic becomes the drop-in replacement. Layer 2 Freshness/Temporal: every record carries a date signature and is temporal; signal strength degrades over time (a year-old fact is weaker than a fresh one); recalling and validating a fact reinforces its signal; remembering a new fact connected to an old one keeps them linked and the stronger validated one gains signal. Layer 3 No active deletion: memory is never actively deleted; a conflicting memory with a stronger signal shadows (supersedes but preserves) the older one; memory older than one year is archived. Open question to investigate: does the old memory solution already have a freshness mechanism. Skills to use: think (devague spec), remember, ask-colleague (explore/work/review).", "scope": {"name": "default", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"source": "claude-code-session", "author": "Ori", "timestamp": "2026-06-20", "topic": "memory-architecture", "status": "proposed-spec", "relates_to": "eidetic-memory-surface"}, "created": "date-unknown", "last_recall": "2026-07-14T12:50:24.201587+00:00", "recall_count": 13, "links": [], "supersedes": null, "lifecycle": "active", "added_by": null}}
@@ -1,5 +1,7 @@
1
- {"id": "league-of-agents-platform-created-2026-07-10", "hash": "f380d634b886b82f4384e756bbfc3c2ac06c649a0b9577ae3bc231ccc8584b3d", "content": "2026-07-10: guild create --apply provisioned public agentculture/league-of-agents-platform \u2014 the HOSTING layer that runs the league-of-agents arena online at https://league-of-agents.ai as a turn-based game for humans AND agents (fun + benchmark). It does not reimplement the arena; it runs it. Distinct lane from league-of-agents (the runtime) \u2014 do not conflate. Identifiers: command league-site, import pkg league_site, dist league-of-agents-platform (= repo token, so no --dist override), backend claude, public, full 14-skill kit. Four defining properties: (1) turn-based for humans+agents \u2014 one state projected into two faces via the agentfront contract; (2) works everywhere \u2014 polling is a legitimate client; (3) continuable \u2014 the arena's append-only event log with a stable state_hash IS the resume substrate, do not invent session storage; (4) safeguards vs overload \u2014 enforced safe capacity (queue or refuse, never degrade silently), price-aware S3 archival, cleanup of abandoned matches; the last two are destructive so dry-run by default. AWS-hosted; long-term storage is cloud: S3 for logs/replays (the arena's self-contained single-file HTML replay is a perfect S3 object, and archived matches must stay replayable straight from the bucket), MongoDB + Neo4j for live state and standings. Ledger registration = guildmaster PR #86 (v0.19.1, PATCH). Build brief = league-of-agents-platform#1. Cross-link ask = katvan#59. Closest repo-shape precedent is culture-tools: a Python CLI package plus a web app (site-astro/) in one repo, against the agentfront contract. Owed: Trusted Publisher on PyPI + TestPyPI, /init, backend reconcile (culture.yaml inherits backend colleague from the template while the CLAUDE.md seed prose says claude).", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "project", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "agent": "league-of-agents-platform", "pr": 86, "date": "2026-07-10"}, "created": "2026-07-10T03:58:39.269155+00:00", "last_recall": "2026-07-10T14:54:03.866682+00:00", "recall_count": 2, "links": ["guild-create-desc-350-char-limit"], "supersedes": null, "lifecycle": "active", "added_by": null}}
2
- {"id": "guild-create-desc-350-char-limit", "hash": "d39fd8769ee9db74d1dd5d0e728dbc446cfd979fafff781632bab7e4b3095d9f", "content": "GOTCHA x4 \u2014 guild create emits a clone that fails its OWN CI (2026-07-10, provisioning league-of-agents-platform; filed upstream as guildmaster issue #87). One class of bug: --desc and the repo token are untrusted input to a text transform whose output must satisfy the template's own CI, and the dry-run models none of it. Durable fix recommended in #87: a post-transform CI gate that runs the clone's lint + test jobs after the rename and before the genesis commit \u2014 it catches 2,3,4 and the next one; only 1 needs a separate guard. (1) --desc over 350 chars breaks gh repo create: GitHub caps repo descriptions at 350 chars; the dry-run prints a clean plan and full ledger diff, then --apply dies with 'GraphQL: Could not clone: Description cannot be more than 350 characters'. Benign because ATOMIC \u2014 it fails before the clone, so no repo, no clone dir, no ledger write; verify with gh repo view (expect Could not resolve), ls -d ../<repo>, git status --short docs/. Contrast agent-lifecycle, where a configure-repo abort mid-apply DID leave partial state and needed register_consumer recovery. Measure with: echo -n \"$DESC\" | wc -m. Long-form scope belongs in the build-brief issue, not --desc. (2) A repo token longer than the template's overflows flake8: the rename is culture-agent-template (22 chars) to the repo token; league-of-agents-platform is 25, the first sibling token longer than the template's own, so two lines just under flake8's 100-char limit spilled over and the genesis Tests run landed red. Every earlier sibling had a shorter token so the rename always SHORTENED these lines and the latent overflow never fired. It fires again for any token over 22 chars. (3) A bare URL in --desc fails the clone's markdownlint: --desc is injected verbatim into the README.md intro AND the CLAUDE.md seed; a bare https:// URL is MD034/no-bare-urls and the template's lint job runs markdownlint-cli2 '**/*.md'. Angle-bracket it. The right upstream fix is to autolink, not to refuse \u2014 naming your site in your description is reasonable. (4) THE CONSEQUENTIAL ONE \u2014 --command different from the repo token fails the rubric gate: teken cli doctor --strict's explain_self check runs '<console-script> explain <console-script>'. The explain catalog keys its root entry by the REPO TOKEN (what the rename tracks) while --command retargets only the [project.scripts] entry-point key. When they differ you get 'FAIL explain_self: explain league-site exit=1', 25/26 checks, and the lint job goes red. Evidence this is a recurring MANUAL repair: every sibling whose command differs from its token carries BOTH root keys, hand-added \u2014 reachy-mini-cli (reachy), discord-bot-cli (discord), jetson-ai-lab-cli (jlab), dgx-spark-cli (spark), unsloth-cli (sloth). Six repos, six identical hand-fixes. Fix: guild create should add the console-script alias to the catalog root when --command differs from the token; it is a no-op when they are equal, so the byte-identical no-override guarantee holds. So the --command retarget gap is NOT merely cosmetic \u2014 CI enforces the catalog. Docstrings and learn prose are a softer, separate call.", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "gotcha", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "tool": "guild create", "issue": 87, "date": "2026-07-10"}, "created": "2026-07-10T04:08:22.598281+00:00", "last_recall": "2026-07-10T14:54:03.866682+00:00", "recall_count": 1, "links": ["league-of-agents-platform-created-2026-07-10"], "supersedes": null, "lifecycle": "active", "added_by": null}}
3
- {"id": "org-created-private-2026-07-10", "hash": "aa3a32ca4e097147695076329d3b04b616826cf5eb5aa6a203b91556e80b7ead", "content": "2026-07-10: guild create --apply provisioned PRIVATE agentculture/org \u2014 the AgentCulture org site: source of the web presence published to AgentCulture.org, REPLACING the deleted landing-page repo (deleted outright, never registered in the ledger, no redirect, no surviving local checkout \u2014 no content migration, the site starts fresh). Identifiers: command = pkg = dist = repo token org, backend claude. FIRST no-PyPI sibling: the user asked for no PyPI package, and guild create has no flag for it, so the PyPI lane was stripped post-create as operator-side provisioning (NOT product hand-building): deleted publish.yml, dropped the vendored pypi-maintainer skill + its row in org docs/skill-sources.md, reworded README baseline bullet + version-check comment; org is intentionally excluded from guildmaster pypi-maintainer ledger row WITH an explicit note so the gap reads as intent. TWO OPERATIONAL FACTS: (1) the genesis push fires one doomed Publish-to-PyPI run before you can strip it \u2014 completed red before it could be cancelled, one-time and harmless; (2) main-requires-PR ruleset is active on private repos (paid plan), so the post-create fix could NOT be pushed to main directly \u2014 it needed branch + version bump (org 0.4.0\u21920.4.1) + PR: landed as org#1 (merged), which also means the build brief landed at org#2 (same slot-shift as league-of-agents). Ledger registration = guildmaster PR #88 (v0.19.2, PATCH). Owed: /init, backend reconcile (template culture.yaml ships backend colleague vs seed prose claude), site stack + IA proposal on org#2, deploy workflow (Pages/S3/Cloudflare \u2014 private repo, public site) + operator-owned DNS cutover for AgentCulture.org. Repo-shape precedent for the brief = culture-tools (CLI + site dir in one repo).", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "project", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "agent": "org", "pr": 88, "date": "2026-07-10"}, "created": "2026-07-10T15:08:06.175651+00:00", "last_recall": null, "recall_count": 0, "links": ["league-of-agents-platform-created-2026-07-10", "guild-create-desc-350-char-limit"], "supersedes": null, "lifecycle": "active", "added_by": null}}
4
- {"id": "guild-create-seeds-sonar-token-2026-07-10", "hash": "0cefcc3f176f52199c30273f51cbc74271e20c6921caa45115b41e2ffe87c1b6", "content": "Fixed 2026-07-10, guildmaster PR #89 (v0.19.3). guild create's configure-repo.sh step 4 used to create the new sibling's SONAR_TOKEN repo secret EMPTY. The culture-agent-template tests.yml gates its SonarCloud step on env.SONAR_TOKEN != '', so an empty secret means SonarCloud NEVER runs on that repo, silently \u2014 and the operator had been pasting the token into each new repo's GitHub UI by hand. The fix: step 4 now seeds the secret from the operator's own exported $SONAR_TOKEN, passed on STDIN not argv (the process table is world-readable). When $SONAR_TOKEN is unset it still writes the empty placeholder but WARNS to stderr with the exact gh secret set command to fix it. An already-present secret is NEVER clobbered (the value in GitHub wins); a whitespace-only token is treated as absent. Test: tests/test_configure_repo_sonar.py runs the REAL configure-repo.sh in --apply against a fake gh on PATH (no network) covering seed-from-env, empty+warn, never-clobber, whitespace-as-absent. Reusable pattern for testing shell scripts guildmaster ships: fake gh echoes benign responses for api and secret list and logs secret set stdin; make api .../rulesets echo the ruleset name so the script's already-present branch skips the heredoc create. GOTCHA for backfilling live repos: because the fix (correctly) never clobbers an existing secret, re-running configure-repo.sh does NOT fix a repo that already has the empty placeholder \u2014 that needs a direct 'printf %s \"$SONAR_TOKEN\" | gh secret set SONAR_TOKEN --repo <r>' override. league-of-agents-platform and org (created 2026-07-10) still carry empty secrets. Distinct still-OPEN sibling bug in the same area: cicd's pr-status.sh reads SonarCloud ANONYMOUSLY (no Authorization header, no curl -f), so for PRIVATE projects it gets HTTP 404 and reports 'Quality Gate UNKNOWN, 0 issues, 0 hotspots' \u2014 a false clean \u2014 and workflow.sh await only greps for the literal 'Quality Gate ERROR', so a missing/unreadable gate reads as PASS. Not fixed yet (operator chose the create-flow fix, option B).", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "project", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "pr": 89, "date": "2026-07-10"}, "created": "2026-07-10T15:49:28.579056+00:00", "last_recall": null, "recall_count": 0, "links": ["league-of-agents-platform-created-2026-07-10"], "supersedes": null, "lifecycle": "active", "added_by": null}}
5
- {"id": "learn-cli-created-2026-07-10", "hash": "0256e26f7cfa603ba14d7ec8339d4a1187ac9e533af001818b7902d63dee04d8", "content": "2026-07-10: guild create --apply provisioned public agentculture/learn-cli \u2014 the mesh's LEARNING FRONT: a CLI (command learn), an MCP server, and a web site over one product, where humans AND agents learn a subject step by step. It does NOT tutor; it fronts per-subject tutor CLIs \u2014 the same host-don't-reimplement shape league-of-agents-platform has with the arena runtime. Identifiers: command learn, import package learn, dist learn-cli (= repo token, no --dist override), backend claude, public, full 14-skill kit. First two subjects: french-cli (command french) and spanish-cli (command spanish) \u2014 public backend:colleague private-language-tutor CLIs (track progress, overview, advice, read stories, learn & practice written+spoken online from your phone), both already full-kit consumers. Not language-limited: culture-guide (PRIVATE \u2014 learn core AI concepts, build your first agents, create useful CLIs, adopt agent-first development patterns, i.e. learning to lead teams of agents) is the worked non-language subject the operator named. Design spine in build brief learn-cli#1: the SUBJECT-PLUGIN CONTRACT is the central design (define once so a third subject is a registration not a fork); the three faces (CLI/MCP/HTTP) should be agentfront surfaces derived from one registry so they cannot drift; cross-subject learner state = one profile/login spanning subjects. Parallel worth remembering: katvan aggregates sibling DOCS onto culture.dev, learn-cli aggregates sibling TUTORS onto a learning site. Ledger registration = guildmaster PR #90 (v0.19.4, PATCH). CLEAN GENESIS \u2014 first sibling created since the SONAR_TOKEN seeding fix (PR #89): the SONAR_TOKEN secret was seeded from the operator env at create time so SonarCloud RAN on the genesis commit (no manual paste), and genesis CI was fully green (lint/test/publish). The explain_self catalog-key bug that needed a follow-up on league-of-agents-platform did NOT fire here \u2014 KEY LESSON: it fires only when the command differs from the import PACKAGE (underscore form), e.g. league-site vs league_site, NOT when command differs from the repo token; here command==package==learn so the catalog root already resolves under the command name. learn-cli 0.4.0 PUBLISHED to production PyPI on the genesis push because a Trusted Publisher for the name was already registered, so no Trusted Publisher is owed (unusual for a new sibling); every push to main publishes so bump the version every PR. Owed: /init, backend reconcile (culture.yaml declares backend colleague with AGENTS.colleague.md while the CLAUDE.md seed prose may still say claude; both subject siblings run colleague). Open decisions parked in the brief: hosting (league-of-agents-platform/org/culture-tools precedents), model access (cloudai-cli/ec2bedrock-cli), progress storage (eidetic-cli/data-refinery-cli), and a culture.dev cross-link via katvan if it gets a public domain.", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "project", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "agent": "learn-cli", "pr": 90, "date": "2026-07-10"}, "created": "2026-07-10T16:31:19.593705+00:00", "last_recall": null, "recall_count": 0, "links": ["league-of-agents-platform-created-2026-07-10", "guild-create-seeds-sonar-token-2026-07-10"], "supersedes": null, "lifecycle": "active", "added_by": null}}
1
+ {"id": "league-of-agents-platform-created-2026-07-10", "hash": "f380d634b886b82f4384e756bbfc3c2ac06c649a0b9577ae3bc231ccc8584b3d", "content": "2026-07-10: guild create --apply provisioned public agentculture/league-of-agents-platform \u2014 the HOSTING layer that runs the league-of-agents arena online at https://league-of-agents.ai as a turn-based game for humans AND agents (fun + benchmark). It does not reimplement the arena; it runs it. Distinct lane from league-of-agents (the runtime) \u2014 do not conflate. Identifiers: command league-site, import pkg league_site, dist league-of-agents-platform (= repo token, so no --dist override), backend claude, public, full 14-skill kit. Four defining properties: (1) turn-based for humans+agents \u2014 one state projected into two faces via the agentfront contract; (2) works everywhere \u2014 polling is a legitimate client; (3) continuable \u2014 the arena's append-only event log with a stable state_hash IS the resume substrate, do not invent session storage; (4) safeguards vs overload \u2014 enforced safe capacity (queue or refuse, never degrade silently), price-aware S3 archival, cleanup of abandoned matches; the last two are destructive so dry-run by default. AWS-hosted; long-term storage is cloud: S3 for logs/replays (the arena's self-contained single-file HTML replay is a perfect S3 object, and archived matches must stay replayable straight from the bucket), MongoDB + Neo4j for live state and standings. Ledger registration = guildmaster PR #86 (v0.19.1, PATCH). Build brief = league-of-agents-platform#1. Cross-link ask = katvan#59. Closest repo-shape precedent is culture-tools: a Python CLI package plus a web app (site-astro/) in one repo, against the agentfront contract. Owed: Trusted Publisher on PyPI + TestPyPI, /init, backend reconcile (culture.yaml inherits backend colleague from the template while the CLAUDE.md seed prose says claude).", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "project", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "agent": "league-of-agents-platform", "pr": 86, "date": "2026-07-10"}, "created": "2026-07-10T03:58:39.269155+00:00", "last_recall": "2026-07-14T12:50:24.201587+00:00", "recall_count": 3, "links": ["guild-create-desc-350-char-limit"], "supersedes": null, "lifecycle": "active", "added_by": null}}
2
+ {"id": "guild-create-desc-350-char-limit", "hash": "d39fd8769ee9db74d1dd5d0e728dbc446cfd979fafff781632bab7e4b3095d9f", "content": "GOTCHA x4 \u2014 guild create emits a clone that fails its OWN CI (2026-07-10, provisioning league-of-agents-platform; filed upstream as guildmaster issue #87). One class of bug: --desc and the repo token are untrusted input to a text transform whose output must satisfy the template's own CI, and the dry-run models none of it. Durable fix recommended in #87: a post-transform CI gate that runs the clone's lint + test jobs after the rename and before the genesis commit \u2014 it catches 2,3,4 and the next one; only 1 needs a separate guard. (1) --desc over 350 chars breaks gh repo create: GitHub caps repo descriptions at 350 chars; the dry-run prints a clean plan and full ledger diff, then --apply dies with 'GraphQL: Could not clone: Description cannot be more than 350 characters'. Benign because ATOMIC \u2014 it fails before the clone, so no repo, no clone dir, no ledger write; verify with gh repo view (expect Could not resolve), ls -d ../<repo>, git status --short docs/. Contrast agent-lifecycle, where a configure-repo abort mid-apply DID leave partial state and needed register_consumer recovery. Measure with: echo -n \"$DESC\" | wc -m. Long-form scope belongs in the build-brief issue, not --desc. (2) A repo token longer than the template's overflows flake8: the rename is culture-agent-template (22 chars) to the repo token; league-of-agents-platform is 25, the first sibling token longer than the template's own, so two lines just under flake8's 100-char limit spilled over and the genesis Tests run landed red. Every earlier sibling had a shorter token so the rename always SHORTENED these lines and the latent overflow never fired. It fires again for any token over 22 chars. (3) A bare URL in --desc fails the clone's markdownlint: --desc is injected verbatim into the README.md intro AND the CLAUDE.md seed; a bare https:// URL is MD034/no-bare-urls and the template's lint job runs markdownlint-cli2 '**/*.md'. Angle-bracket it. The right upstream fix is to autolink, not to refuse \u2014 naming your site in your description is reasonable. (4) THE CONSEQUENTIAL ONE \u2014 --command different from the repo token fails the rubric gate: teken cli doctor --strict's explain_self check runs '<console-script> explain <console-script>'. The explain catalog keys its root entry by the REPO TOKEN (what the rename tracks) while --command retargets only the [project.scripts] entry-point key. When they differ you get 'FAIL explain_self: explain league-site exit=1', 25/26 checks, and the lint job goes red. Evidence this is a recurring MANUAL repair: every sibling whose command differs from its token carries BOTH root keys, hand-added \u2014 reachy-mini-cli (reachy), discord-bot-cli (discord), jetson-ai-lab-cli (jlab), dgx-spark-cli (spark), unsloth-cli (sloth). Six repos, six identical hand-fixes. Fix: guild create should add the console-script alias to the catalog root when --command differs from the token; it is a no-op when they are equal, so the byte-identical no-override guarantee holds. So the --command retarget gap is NOT merely cosmetic \u2014 CI enforces the catalog. Docstrings and learn prose are a softer, separate call.", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "gotcha", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "tool": "guild create", "issue": 87, "date": "2026-07-10"}, "created": "2026-07-10T04:08:22.598281+00:00", "last_recall": "2026-07-14T12:50:24.201587+00:00", "recall_count": 2, "links": ["league-of-agents-platform-created-2026-07-10"], "supersedes": null, "lifecycle": "active", "added_by": null}}
3
+ {"id": "org-created-private-2026-07-10", "hash": "aa3a32ca4e097147695076329d3b04b616826cf5eb5aa6a203b91556e80b7ead", "content": "2026-07-10: guild create --apply provisioned PRIVATE agentculture/org \u2014 the AgentCulture org site: source of the web presence published to AgentCulture.org, REPLACING the deleted landing-page repo (deleted outright, never registered in the ledger, no redirect, no surviving local checkout \u2014 no content migration, the site starts fresh). Identifiers: command = pkg = dist = repo token org, backend claude. FIRST no-PyPI sibling: the user asked for no PyPI package, and guild create has no flag for it, so the PyPI lane was stripped post-create as operator-side provisioning (NOT product hand-building): deleted publish.yml, dropped the vendored pypi-maintainer skill + its row in org docs/skill-sources.md, reworded README baseline bullet + version-check comment; org is intentionally excluded from guildmaster pypi-maintainer ledger row WITH an explicit note so the gap reads as intent. TWO OPERATIONAL FACTS: (1) the genesis push fires one doomed Publish-to-PyPI run before you can strip it \u2014 completed red before it could be cancelled, one-time and harmless; (2) main-requires-PR ruleset is active on private repos (paid plan), so the post-create fix could NOT be pushed to main directly \u2014 it needed branch + version bump (org 0.4.0\u21920.4.1) + PR: landed as org#1 (merged), which also means the build brief landed at org#2 (same slot-shift as league-of-agents). Ledger registration = guildmaster PR #88 (v0.19.2, PATCH). Owed: /init, backend reconcile (template culture.yaml ships backend colleague vs seed prose claude), site stack + IA proposal on org#2, deploy workflow (Pages/S3/Cloudflare \u2014 private repo, public site) + operator-owned DNS cutover for AgentCulture.org. Repo-shape precedent for the brief = culture-tools (CLI + site dir in one repo).", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "project", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "agent": "org", "pr": 88, "date": "2026-07-10"}, "created": "2026-07-10T15:08:06.175651+00:00", "last_recall": "2026-07-14T12:50:24.201587+00:00", "recall_count": 1, "links": ["league-of-agents-platform-created-2026-07-10", "guild-create-desc-350-char-limit"], "supersedes": null, "lifecycle": "active", "added_by": null}}
4
+ {"id": "guild-create-seeds-sonar-token-2026-07-10", "hash": "0cefcc3f176f52199c30273f51cbc74271e20c6921caa45115b41e2ffe87c1b6", "content": "Fixed 2026-07-10, guildmaster PR #89 (v0.19.3). guild create's configure-repo.sh step 4 used to create the new sibling's SONAR_TOKEN repo secret EMPTY. The culture-agent-template tests.yml gates its SonarCloud step on env.SONAR_TOKEN != '', so an empty secret means SonarCloud NEVER runs on that repo, silently \u2014 and the operator had been pasting the token into each new repo's GitHub UI by hand. The fix: step 4 now seeds the secret from the operator's own exported $SONAR_TOKEN, passed on STDIN not argv (the process table is world-readable). When $SONAR_TOKEN is unset it still writes the empty placeholder but WARNS to stderr with the exact gh secret set command to fix it. An already-present secret is NEVER clobbered (the value in GitHub wins); a whitespace-only token is treated as absent. Test: tests/test_configure_repo_sonar.py runs the REAL configure-repo.sh in --apply against a fake gh on PATH (no network) covering seed-from-env, empty+warn, never-clobber, whitespace-as-absent. Reusable pattern for testing shell scripts guildmaster ships: fake gh echoes benign responses for api and secret list and logs secret set stdin; make api .../rulesets echo the ruleset name so the script's already-present branch skips the heredoc create. GOTCHA for backfilling live repos: because the fix (correctly) never clobbers an existing secret, re-running configure-repo.sh does NOT fix a repo that already has the empty placeholder \u2014 that needs a direct 'printf %s \"$SONAR_TOKEN\" | gh secret set SONAR_TOKEN --repo <r>' override. league-of-agents-platform and org (created 2026-07-10) still carry empty secrets. Distinct still-OPEN sibling bug in the same area: cicd's pr-status.sh reads SonarCloud ANONYMOUSLY (no Authorization header, no curl -f), so for PRIVATE projects it gets HTTP 404 and reports 'Quality Gate UNKNOWN, 0 issues, 0 hotspots' \u2014 a false clean \u2014 and workflow.sh await only greps for the literal 'Quality Gate ERROR', so a missing/unreadable gate reads as PASS. Not fixed yet (operator chose the create-flow fix, option B).", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "project", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "pr": 89, "date": "2026-07-10"}, "created": "2026-07-10T15:49:28.579056+00:00", "last_recall": "2026-07-14T12:50:24.201587+00:00", "recall_count": 1, "links": ["league-of-agents-platform-created-2026-07-10"], "supersedes": null, "lifecycle": "active", "added_by": null}}
5
+ {"id": "learn-cli-created-2026-07-10", "hash": "0256e26f7cfa603ba14d7ec8339d4a1187ac9e533af001818b7902d63dee04d8", "content": "2026-07-10: guild create --apply provisioned public agentculture/learn-cli \u2014 the mesh's LEARNING FRONT: a CLI (command learn), an MCP server, and a web site over one product, where humans AND agents learn a subject step by step. It does NOT tutor; it fronts per-subject tutor CLIs \u2014 the same host-don't-reimplement shape league-of-agents-platform has with the arena runtime. Identifiers: command learn, import package learn, dist learn-cli (= repo token, no --dist override), backend claude, public, full 14-skill kit. First two subjects: french-cli (command french) and spanish-cli (command spanish) \u2014 public backend:colleague private-language-tutor CLIs (track progress, overview, advice, read stories, learn & practice written+spoken online from your phone), both already full-kit consumers. Not language-limited: culture-guide (PRIVATE \u2014 learn core AI concepts, build your first agents, create useful CLIs, adopt agent-first development patterns, i.e. learning to lead teams of agents) is the worked non-language subject the operator named. Design spine in build brief learn-cli#1: the SUBJECT-PLUGIN CONTRACT is the central design (define once so a third subject is a registration not a fork); the three faces (CLI/MCP/HTTP) should be agentfront surfaces derived from one registry so they cannot drift; cross-subject learner state = one profile/login spanning subjects. Parallel worth remembering: katvan aggregates sibling DOCS onto culture.dev, learn-cli aggregates sibling TUTORS onto a learning site. Ledger registration = guildmaster PR #90 (v0.19.4, PATCH). CLEAN GENESIS \u2014 first sibling created since the SONAR_TOKEN seeding fix (PR #89): the SONAR_TOKEN secret was seeded from the operator env at create time so SonarCloud RAN on the genesis commit (no manual paste), and genesis CI was fully green (lint/test/publish). The explain_self catalog-key bug that needed a follow-up on league-of-agents-platform did NOT fire here \u2014 KEY LESSON: it fires only when the command differs from the import PACKAGE (underscore form), e.g. league-site vs league_site, NOT when command differs from the repo token; here command==package==learn so the catalog root already resolves under the command name. learn-cli 0.4.0 PUBLISHED to production PyPI on the genesis push because a Trusted Publisher for the name was already registered, so no Trusted Publisher is owed (unusual for a new sibling); every push to main publishes so bump the version every PR. Owed: /init, backend reconcile (culture.yaml declares backend colleague with AGENTS.colleague.md while the CLAUDE.md seed prose may still say claude; both subject siblings run colleague). Open decisions parked in the brief: hosting (league-of-agents-platform/org/culture-tools precedents), model access (cloudai-cli/ec2bedrock-cli), progress storage (eidetic-cli/data-refinery-cli), and a culture.dev cross-link via katvan if it gets a public domain.", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "project", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "agent": "learn-cli", "pr": 90, "date": "2026-07-10"}, "created": "2026-07-10T16:31:19.593705+00:00", "last_recall": "2026-07-14T12:50:24.201587+00:00", "recall_count": 1, "links": ["league-of-agents-platform-created-2026-07-10", "guild-create-seeds-sonar-token-2026-07-10"], "supersedes": null, "lifecycle": "active", "added_by": null}}
6
+ {"id": "sensibo-cli-created-public-2026-07-14", "hash": "ff78fd4ce2bb64b6cd1e1f67add5a36d95e2ae81da5504a9abc2b6e92205b53f", "content": "2026-07-14: guild create --apply provisioned PUBLIC agentculture/sensibo-cli \u2014 an agent + CLI for Sensibo smart-AC control at home. Three pillars from the operator: (1) control the AC, (2) collect every sensor reading LOCALLY, (3) set up automated conditions that drive the AC. Identity: repo token sensibo-cli, console command sensibo, import package sensibo, dist sensibo-cli on PyPI, backend claude. Ledger registration + the #87 catalog-alias fix shipped together as guildmaster PR #92 (v0.19.6, PATCH). CLEAN GENESIS: Sonar ran, Tests green, teken cli doctor --strict 26/26, 0.4.0 auto-published to PyPI (Trusted Publisher pre-registered). GOTCHA (benign, expected): the genesis push shows a FAILED Publish run alongside the successful one \u2014 the failure is on GitHub's own Initial commit (443ac83), which is still literally culture-agent-template, so it tries to publish the template dist. Not our clone; ignore it. Build brief = sensibo-cli#1, which deliberately parks TWO honest unknowns rather than guessing: (a) LOCALLY IS UNVERIFIED \u2014 Sensibo devices are cloud-connected and the documented surface is the cloud REST API (/api/v2 + account API key); if no LAN protocol exists, the honest design is poll-cloud + persist-to-a-local-store, and the README must NOT imply a local protocol it does not have; (b) Sensibo ALREADY ships Climate React (server-side threshold automation) + schedules, so the CLI must be explicit about which conditions run in the cloud vs which need the local daemon alive \u2014 a rule that silently dies when a laptop sleeps is worse than no rule. Safety constraint: this drives real compressors, so hysteresis / minimum-off-time to prevent short-cycling is a requirement, not a nicety. Unofficial community tool; Sensibo is a trademark of Sensibo Ltd (qodo-cli is the disclaimer precedent). Owed: /init in the new repo, backend reconcile.", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "tool": "guild create", "agent": "sensibo-cli", "pr": 92, "issue": 1, "date": "2026-07-14", "visibility_note": "public sibling"}, "created": "2026-07-14T13:01:42.860309+00:00", "last_recall": null, "recall_count": 0, "links": ["guild-create-explain-catalog-alias-fix-2026-07-14", "guild-create-desc-350-char-limit"], "supersedes": null, "lifecycle": "active", "added_by": null}}
7
+ {"id": "guild-create-explain-catalog-alias-fix-2026-07-14", "hash": "a58f29317f035d52c7e8640976124cd1d8101bc189ed8be987c6d143f71ff6a9", "content": "FIXED 2026-07-14 (guildmaster 0.19.6, PR #92) \u2014 guildmaster issue #87 item 4, the explain-catalog root alias, THE consequential guild create gotcha. THE BUG: culture-agent-template keys its explain catalog root by the REPO TOKEN \u2014 (\"<repo-token>\",): _ROOT in <pkg>/explain/catalog.py \u2014 because the global rename is all that normally touches it. But the clone's own lint gate, `teken cli doctor --strict`, runs its explain_self check as `<console-script> explain <console-script>`. When --command is retargeted away from the repo token, that lookup has NO catalog entry, explain exits 1, and the genesis Tests run lands RED. SIX siblings carried the identical alias, hand-added after the fact: reachy-mini-cli, discord-bot-cli, jetson-ai-lab-cli, dgx-spark-cli, unsloth-cli, league-of-agents-platform. KEY CORRECTION to the earlier learn-cli memory, which claimed the trigger was command != pkg (underscore form): WRONG. The trigger is command != REPO TOKEN. learn-cli passed CI by ACCIDENT, not by rule \u2014 the template ships a real `learn` VERB, so (\"learn\",) already existed as a catalog key and `learn explain learn` resolved to the VERB's docs instead of the root. Verified empirically by running teken cli doctor --strict against the learn-cli checkout. THE FIX: guild/scaffold/instantiate.py::_alias_explain_root, called from _retarget_command (which now takes pkg). It inserts (\"<command>\",): _ROOT immediately after the repo-token line, reusing whatever symbol that line binds. TWO GUARDS: (1) skip when (\"<command>\",) is ALREADY a catalog key \u2014 a command can legitimately collide with a real verb (the learn case), and a duplicate dict key would silently SHADOW that verb's own docs; (2) only called when command != repo_token, so the byte-identical plain-rename guarantee holds. Degrades to a no-op if the catalog or anchor line is absent. The dry-run plan now lists the alias as an explicit step, so it is visible before --apply. FIRST CLEAN RESULT: sensibo-cli (command sensibo, token sensibo-cli) is the first command-retargeted clone to pass its own CI unpatched \u2014 26/26 strict checks including `PASS explain_self: explain sensibo produced 932 chars`. NOTE the other #87 items are still OPEN: --desc >350 chars kills gh repo create; repo token >22 chars overflows flake8 E501; a bare URL in --desc trips MD034. The durable fix for all of them remains a post-transform CI gate.", "scope": {"name": "guildmaster", "visibility": "public"}, "metadata": {"type": "gotcha", "record_metadata": {"scope": "guildmaster", "repo": "guildmaster", "tool": "guild create", "issue": 87, "pr": 92, "version": "0.19.6", "date": "2026-07-14"}, "created": "2026-07-14T13:01:59.652794+00:00", "last_recall": null, "recall_count": 0, "links": ["sensibo-cli-created-public-2026-07-14", "guild-create-desc-350-char-limit", "learn-cli-created-public"], "supersedes": null, "lifecycle": "active", "added_by": null}}
@@ -5,6 +5,51 @@ All notable changes to this project will be documented in this file.
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/). This project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.19.6] - 2026-07-14
9
+
10
+ ### Added
11
+
12
+ - **Ledger:** registered `sensibo-cli` (public) as a downstream consumer of the
13
+ full canonical skill set. Agent + CLI for Sensibo smart-AC control at home:
14
+ device discovery, local sensor collection, and automated conditions that drive
15
+ the AC. Repo token `sensibo-cli`, command + import package `sensibo`, dist
16
+ `sensibo-cli` on PyPI.
17
+
18
+ ### Fixed
19
+
20
+ - **`guild create`:** a clone whose `--command` differs from its repo token no
21
+ longer fails its own genesis CI. The template keys its explain catalog root by
22
+ the repo token, but the clone's lint gate (`teken cli doctor --strict`) runs
23
+ `explain_self` as `<console-script> explain <console-script>` — so every
24
+ retargeted clone exited 1 there and was hand-patched afterwards (six siblings
25
+ carry the manual fix; [#87](https://github.com/agentculture/guildmaster/issues/87)).
26
+ `_retarget_command` now also aliases the catalog root to the console-script
27
+ name. Skipped when the command collides with an existing catalog key (a real
28
+ verb — a duplicate dict key would shadow that verb's own docs), and a no-op
29
+ when command equals the repo token, so the byte-identical plain-rename
30
+ guarantee is preserved. First clean run: `sensibo-cli` passes 26/26 strict
31
+ checks out of the box.
32
+
33
+ ## [0.19.5] - 2026-07-14
34
+
35
+ ### Added
36
+
37
+ - Provision `jetson-arena` as a downstream consumer (public) — the **model-stack
38
+ arena for Jetson**. It answers "how does *this* Jetson device handle *this
39
+ whole stack*?" (e.g. a realtime VAD → STT → LLM → TTS voice loop on an Orin
40
+ Nano Super 8GB) with latency, memory signature, and quality, and publishes the
41
+ results plus signed-in Docker build recipes on `jetson-arena.com`. The unit of
42
+ record is a **stack**, not a model — cross-device / cross-stack comparison is
43
+ its lane, distinct from the per-device ops of `jetson-cli`, `jetson-orin-cli`,
44
+ and `jetson-thor-cli`, and it sources images from `jetson-containers` rather
45
+ than building its own.
46
+ - Registered as a full-kit consumer across all 14 canonical skills, including
47
+ `pypi-maintainer` (it ships a PyPI distribution, unlike `org`).
48
+
49
+ ### Changed
50
+
51
+ ### Fixed
52
+
8
53
  ## [0.19.4] - 2026-07-10
9
54
 
10
55
  ### Added
@@ -108,7 +108,7 @@ two live broadcasters.
108
108
 
109
109
  **Provisioning verb — `guild create` (template-instantiate a new sibling).**
110
110
 
111
- - `guild create --agent OWNER/REPO --desc TEXT [--backend claude|acp] [--workspace-root DIR] [--template agentculture/culture-agent-template] [--command NAME] [--pkg NAME] [--dist NAME] [--public] [--apply] [--json]` — provision a brand-new AgentCulture sibling by instantiating the GitHub template, renaming identifiers throughout the clone, writing a self-init CLAUDE.md seed, configuring the GitHub repo (branch protection, environments, and the `SONAR_TOKEN` secret — seeded from the operator's own exported `$SONAR_TOKEN` so the sibling is analysed from its first PR, or created empty with a warning if that env var is unset; never clobbers an existing secret), pushing the genesis commit, and registering the agent in `docs/skill-sources.md`. Dry-run by default; `--apply` executes. **New repos are private by default** (the `culture-agent-template` is itself private); pass `--public` to create an open sibling. Branch-protection rulesets (and environments) are GitHub Pro/Team-gated for private repos on free-tier accounts, so `configure-repo.sh` warns-and-skips the gated `gh` calls (any other failure stays fatal) and applies the rest — a private create still completes; re-run `configure-repo.sh` after a Pro upgrade or after going public to add the ruleset. The transform is **pure** (unit-testable against a fixture dir; no network): `culture_agent_template` → pkg (underscore form, e.g. `my_agent`), `culture-agent-template` → repo token (hyphen form, e.g. `my-agent`). **The repo token is the repo/agent identity only** — it always drives the README heading, `culture.yaml` suffix, CLAUDE.md seed, and repo URL. The **command**, **import package**, and **dist** are each independently retargetable and default to the repo token (or, for `--pkg`, the underscore form of `--command`); with no overrides the output is byte-identical to a plain rename. `--command NAME` sets the **console-command (binary) name** (default: the repo token) and retargets **only** the `[project.scripts]` entry-point key — e.g. `--command reachy` for repo `reachy-mini-cli` ships the command as `reachy`. `--pkg NAME` sets the **importable Python package** (default: the underscore form of `--command`, so command and import package stay in lock-step like `guild`/`guild`); pass it only to decouple the two. `--dist NAME` sets the **PyPI distribution name** (default: the repo token); pass e.g. `--dist jetson-cli` to publish as `jetson-cli` while keeping the command and import package as the repo token (`jetson`) — this retargets only `[project].name`, the `importlib.metadata` lookup, and the TestPyPI install pin, matching the `guild-cli`/`guild` convention without a manual post-create edit. (Renaming the dist or command does **not** register a Trusted Publisher — that needs a matching Trusted Publisher registered for the project name on PyPI/TestPyPI; `guild create` configures the GitHub side only.) The CLAUDE.md seed is a `/init`-style bootstrap placeholder — run `/init` in the new repo after provisioning to expand it into a full runtime prompt. Implementation: `guild/scaffold/instantiate.py` (pure transform: `_resolve_identifiers` + `_retarget_command` / `_retarget_dist`), `guild/cli/_commands/create.py` (CLI), `guild/cli/_commands/_provision_template.py` (injectable-runner executor), `.claude/skills/guild/scripts/create.sh` (thin wrapper).
111
+ - `guild create --agent OWNER/REPO --desc TEXT [--backend claude|acp] [--workspace-root DIR] [--template agentculture/culture-agent-template] [--command NAME] [--pkg NAME] [--dist NAME] [--public] [--apply] [--json]` — provision a brand-new AgentCulture sibling by instantiating the GitHub template, renaming identifiers throughout the clone, writing a self-init CLAUDE.md seed, configuring the GitHub repo (branch protection, environments, and the `SONAR_TOKEN` secret — seeded from the operator's own exported `$SONAR_TOKEN` so the sibling is analysed from its first PR, or created empty with a warning if that env var is unset; never clobbers an existing secret), pushing the genesis commit, and registering the agent in `docs/skill-sources.md`. Dry-run by default; `--apply` executes. **New repos are private by default** (the `culture-agent-template` is itself private); pass `--public` to create an open sibling. Branch-protection rulesets (and environments) are GitHub Pro/Team-gated for private repos on free-tier accounts, so `configure-repo.sh` warns-and-skips the gated `gh` calls (any other failure stays fatal) and applies the rest — a private create still completes; re-run `configure-repo.sh` after a Pro upgrade or after going public to add the ruleset. The transform is **pure** (unit-testable against a fixture dir; no network): `culture_agent_template` → pkg (underscore form, e.g. `my_agent`), `culture-agent-template` → repo token (hyphen form, e.g. `my-agent`). **The repo token is the repo/agent identity only** — it always drives the README heading, `culture.yaml` suffix, CLAUDE.md seed, and repo URL. The **command**, **import package**, and **dist** are each independently retargetable and default to the repo token (or, for `--pkg`, the underscore form of `--command`); with no overrides the output is byte-identical to a plain rename. `--command NAME` sets the **console-command (binary) name** (default: the repo token) and retargets the `[project.scripts]` entry-point key **plus the explain catalog's root alias** — e.g. `--command reachy` for repo `reachy-mini-cli` ships the command as `reachy`. The catalog alias is load-bearing, not cosmetic: the clone's own lint gate runs `teken cli doctor --strict`, whose `explain_self` check invokes `<console-script> explain <console-script>`, and the template keys its catalog root by the *repo token* — so before this alias existed, every command-retargeted clone failed its own genesis CI and was hand-patched after the fact ([#87](https://github.com/agentculture/guildmaster/issues/87); six siblings carry the manual fix). The alias is skipped when the command collides with a real verb (a duplicate key would shadow that verb's docs), and is a no-op when command equals the repo token — so the byte-identical plain-rename guarantee holds. `--pkg NAME` sets the **importable Python package** (default: the underscore form of `--command`, so command and import package stay in lock-step like `guild`/`guild`); pass it only to decouple the two. `--dist NAME` sets the **PyPI distribution name** (default: the repo token); pass e.g. `--dist jetson-cli` to publish as `jetson-cli` while keeping the command and import package as the repo token (`jetson`) — this retargets only `[project].name`, the `importlib.metadata` lookup, and the TestPyPI install pin, matching the `guild-cli`/`guild` convention without a manual post-create edit. (Renaming the dist or command does **not** register a Trusted Publisher — that needs a matching Trusted Publisher registered for the project name on PyPI/TestPyPI; `guild create` configures the GitHub side only.) The CLAUDE.md seed is a `/init`-style bootstrap placeholder — run `/init` in the new repo after provisioning to expand it into a full runtime prompt. Implementation: `guild/scaffold/instantiate.py` (pure transform: `_resolve_identifiers` + `_retarget_command` / `_retarget_dist`), `guild/cli/_commands/create.py` (CLI), `guild/cli/_commands/_provision_template.py` (injectable-runner executor), `.claude/skills/guild/scripts/create.sh` (thin wrapper).
112
112
 
113
113
  **Inventory verbs — `overview` & `show` (the read-only surfaces).** guildmaster
114
114
  owns the mesh's *inventory* surfaces per
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: guild-cli
3
- Version: 0.19.4
3
+ Version: 0.19.6
4
4
  Summary: guildmaster — an agent and CLI that manages skills for the AgentCulture mesh.
5
5
  Project-URL: Homepage, https://github.com/agentculture/guildmaster
6
6
  Project-URL: Issues, https://github.com/agentculture/guildmaster/issues
@@ -32,14 +32,14 @@ current by `guild overview --scope mesh`.
32
32
 
33
33
  | Skill | Upstream | Downstream copies (known) | Notes |
34
34
  |-------|----------|---------------------------|-------|
35
- | `agent-config` | `guildmaster` (`.claude/skills/agent-config/`) | `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Inventory variant backing `guild show` ([#12](https://github.com/agentculture/guildmaster/issues/12)); `show.sh` + `data/backend-fingerprints.yaml` vendored verbatim from steward, SKILL.md reframed from alignment-judgment to inventory + `type: command` added. **Forked from steward:** steward retains its own alignment-focused `agent-config` variant; the inventory variant is guildmaster's to supply. |
36
- | `cicd` | `guildmaster` (`.claude/skills/cicd/`) — layered on `devex pr` (in `agentculture/devex`) | `afi-cli`, `devex` (adapted-thin delegate — owns `devex pr`; see [devex#53](https://github.com/agentculture/devex/pull/53)), `agtag`, `antoine`, `appsec`, `auntiepypi`, `cfafi` (still named `pr-review`), `code-lens-cli`, `culture` (still named `pr-review`), `devague`, `katvan`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `grant` (still named `pr-review`), `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Thin delegate to `devex pr` for lint / open / read / reply / delta, plus guildmaster's `status` (SonarCloud quality gate + hotspots + unresolved-thread tally) and `await` (composes `devex pr read --wait` with `status`, non-zero exit on Sonar ERROR / unresolved threads) extensions. **Inverted case:** devex, as the `devex pr` upstream, vendors the skill adapted-thin — a `workflow.sh`-only pure delegate ([devex#53](https://github.com/agentculture/devex/pull/53)). Renamed from `pr-review` in steward 0.7.0; downstream copies may keep the old name on their own cadence. |
37
- | `communicate` | `guildmaster` (`.claude/skills/communicate/`) | `afi-cli`, `devex` (identifier-only — vendored steward 0.11.0; scripts current as of 0.18.0), `agtag`, `antoine`, `appsec`, `auntiepypi`, `code-lens-cli`, `culture` (still named `coordinate`), `devague`, `katvan`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Cross-repo + mesh communication: file issues / hand off briefs to sibling-repo agents (auto-signed), comment on existing issues, fetch issues to inline state into briefs, and send live messages to Culture mesh channels (unsigned — nick is the speaker). Renamed from `coordinate` in steward 0.8.0; absorbed `gh-issues` (as `fetch-issues.sh`) in 0.9.1. Issue I/O backed by `agtag` (>=0.1) since steward 0.11.0 — signature resolves from local `culture.yaml` (override via `--as`). |
38
- | `doc-test-alignment` | `guildmaster` (`.claude/skills/doc-test-alignment/`) | `devague`, `lecodeur`, `lepenseur`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Stub; real implementation TBD. `scripts/check.sh` exits not-yet-implemented today. |
39
- | `pypi-maintainer` | `guildmaster` (`.claude/skills/pypi-maintainer/`) | `agtag`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `learn-cli` | Switches a PyPI package install between pypi / test-pypi / local. Generalised from the original culture-specific `change-package`. `org` is intentionally not a consumer — it ships no PyPI distribution (site repo). |
40
- | `run-tests` | `guildmaster` (`.claude/skills/run-tests/`) | `agtag`, `antoine`, `appsec`, `code-lens-cli`, `culture`, `culture-sonar-cli`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `grant`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Coverage source resolves from `[tool.coverage.run]` in `pyproject.toml`, so the script is portable across siblings without modification. |
41
- | `sonarclaude` | `guildmaster` (`.claude/skills/sonarclaude/`) | `antoine`, `appsec`, `code-lens-cli`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | SonarCloud API client. Project key resolves from `$SONAR_PROJECT` or `--project KEY`. |
42
- | `version-bump` | `guildmaster` (`.claude/skills/version-bump/`) | `afi-cli`, `agtag`, `antoine`, `appsec`, `auntiepypi`, `cfafi`, `code-lens-cli`, `culture`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `grant`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Pure Python, prepends a Keep-a-Changelog entry; no per-repo customization needed. |
35
+ | `agent-config` | `guildmaster` (`.claude/skills/agent-config/`) | `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Inventory variant backing `guild show` ([#12](https://github.com/agentculture/guildmaster/issues/12)); `show.sh` + `data/backend-fingerprints.yaml` vendored verbatim from steward, SKILL.md reframed from alignment-judgment to inventory + `type: command` added. **Forked from steward:** steward retains its own alignment-focused `agent-config` variant; the inventory variant is guildmaster's to supply. |
36
+ | `cicd` | `guildmaster` (`.claude/skills/cicd/`) — layered on `devex pr` (in `agentculture/devex`) | `afi-cli`, `devex` (adapted-thin delegate — owns `devex pr`; see [devex#53](https://github.com/agentculture/devex/pull/53)), `agtag`, `antoine`, `appsec`, `auntiepypi`, `cfafi` (still named `pr-review`), `code-lens-cli`, `culture` (still named `pr-review`), `devague`, `katvan`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `grant` (still named `pr-review`), `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Thin delegate to `devex pr` for lint / open / read / reply / delta, plus guildmaster's `status` (SonarCloud quality gate + hotspots + unresolved-thread tally) and `await` (composes `devex pr read --wait` with `status`, non-zero exit on Sonar ERROR / unresolved threads) extensions. **Inverted case:** devex, as the `devex pr` upstream, vendors the skill adapted-thin — a `workflow.sh`-only pure delegate ([devex#53](https://github.com/agentculture/devex/pull/53)). Renamed from `pr-review` in steward 0.7.0; downstream copies may keep the old name on their own cadence. |
37
+ | `communicate` | `guildmaster` (`.claude/skills/communicate/`) | `afi-cli`, `devex` (identifier-only — vendored steward 0.11.0; scripts current as of 0.18.0), `agtag`, `antoine`, `appsec`, `auntiepypi`, `code-lens-cli`, `culture` (still named `coordinate`), `devague`, `katvan`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Cross-repo + mesh communication: file issues / hand off briefs to sibling-repo agents (auto-signed), comment on existing issues, fetch issues to inline state into briefs, and send live messages to Culture mesh channels (unsigned — nick is the speaker). Renamed from `coordinate` in steward 0.8.0; absorbed `gh-issues` (as `fetch-issues.sh`) in 0.9.1. Issue I/O backed by `agtag` (>=0.1) since steward 0.11.0 — signature resolves from local `culture.yaml` (override via `--as`). |
38
+ | `doc-test-alignment` | `guildmaster` (`.claude/skills/doc-test-alignment/`) | `devague`, `lecodeur`, `lepenseur`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Stub; real implementation TBD. `scripts/check.sh` exits not-yet-implemented today. |
39
+ | `pypi-maintainer` | `guildmaster` (`.claude/skills/pypi-maintainer/`) | `agtag`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Switches a PyPI package install between pypi / test-pypi / local. Generalised from the original culture-specific `change-package`. `org` is intentionally not a consumer — it ships no PyPI distribution (site repo). |
40
+ | `run-tests` | `guildmaster` (`.claude/skills/run-tests/`) | `agtag`, `antoine`, `appsec`, `code-lens-cli`, `culture`, `culture-sonar-cli`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `grant`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Coverage source resolves from `[tool.coverage.run]` in `pyproject.toml`, so the script is portable across siblings without modification. |
41
+ | `sonarclaude` | `guildmaster` (`.claude/skills/sonarclaude/`) | `antoine`, `appsec`, `code-lens-cli`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | SonarCloud API client. Project key resolves from `$SONAR_PROJECT` or `--project KEY`. |
42
+ | `version-bump` | `guildmaster` (`.claude/skills/version-bump/`) | `afi-cli`, `agtag`, `antoine`, `appsec`, `auntiepypi`, `cfafi`, `code-lens-cli`, `culture`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `grant`, `telek`, `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Pure Python, prepends a Keep-a-Changelog entry; no per-repo customization needed. |
43
43
 
44
44
  > **How the downstream column is maintained.** The "Downstream copies (known)"
45
45
  > entries are kept in sync with guildmaster's own drift detector:
@@ -86,9 +86,9 @@ harmless on `claude-code`. This is the only divergence from upstream.
86
86
 
87
87
  | Skill | Origin | Downstream copies (known) | Notes |
88
88
  |-------|--------|---------------------------|-------|
89
- | `think` | `devague` (`agentculture/devague`, `../devague/.claude/skills/think/`) | — (broadcast pending), `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Operator for the **idea→spec** leg (announcement frame → capture/classify claims → interrogate with honesty conditions → park open vagueness → `export` once the frame converges). Renamed from `devague` in devague 0.4.0. **Divergence:** `type: command` added. Runtime dep: `uv tool install devague`. |
90
- | `spec-to-plan` | `devague` (`agentculture/devague`, `../devague/.claude/skills/spec-to-plan/`) | — (broadcast pending), `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Operator for the **spec→plan** leg (`devague plan ...`): seed from a converged frame, cover every coverage target with acceptance-gated, acyclically-ordered tasks, park unknowns as risks, `export` once the plan converges. New in devague 0.4.0. **Divergence:** `type: command` added. Runtime dep: `uv tool install devague`. |
91
- | `assign-to-workforce` | `devague` (`agentculture/devague`, `../devague/.claude/skills/assign-to-workforce/`) | — (broadcast pending), `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | Operator for the **implementation** leg: reads `devague plan waves` (read-only) and fans out independent tasks to one agent per task per wave in isolated git worktrees, with main-agent TDD-gated merges. Three human gates: spec / split plan / final PR. The CLI stays non-orchestrating ([devague#20](https://github.com/agentculture/devague/issues/20)). New in devague 0.10.0. **Divergence:** `type: command` added. Runtime deps: `uv tool install devague`, `git worktree`, the vendored `cicd` skill (for gate-3 `devex pr open`). |
89
+ | `think` | `devague` (`agentculture/devague`, `../devague/.claude/skills/think/`) | — (broadcast pending), `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Operator for the **idea→spec** leg (announcement frame → capture/classify claims → interrogate with honesty conditions → park open vagueness → `export` once the frame converges). Renamed from `devague` in devague 0.4.0. **Divergence:** `type: command` added. Runtime dep: `uv tool install devague`. |
90
+ | `spec-to-plan` | `devague` (`agentculture/devague`, `../devague/.claude/skills/spec-to-plan/`) | — (broadcast pending), `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Operator for the **spec→plan** leg (`devague plan ...`): seed from a converged frame, cover every coverage target with acceptance-gated, acyclically-ordered tasks, park unknowns as risks, `export` once the plan converges. New in devague 0.4.0. **Divergence:** `type: command` added. Runtime dep: `uv tool install devague`. |
91
+ | `assign-to-workforce` | `devague` (`agentculture/devague`, `../devague/.claude/skills/assign-to-workforce/`) | — (broadcast pending), `agenda`, `dominion-breaker`, `colleague`, `jetson`, `reachy-mini-cli`, `jetson-ai-lab-cli`, `dgx-spark-cli`, `unsloth-cli`, `discord-bot-cli`, `arxivist`, `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | Operator for the **implementation** leg: reads `devague plan waves` (read-only) and fans out independent tasks to one agent per task per wave in isolated git worktrees, with main-agent TDD-gated merges. Three human gates: spec / split plan / final PR. The CLI stays non-orchestrating ([devague#20](https://github.com/agentculture/devague/issues/20)). New in devague 0.10.0. **Divergence:** `type: command` added. Runtime deps: `uv tool install devague`, `git worktree`, the vendored `cicd` skill (for gate-3 `devex pr open`). |
92
92
 
93
93
  Downstream is empty by design: these are still being introduced to the mesh.
94
94
  `guild teach --new --skill <name> --to <repos>` frames them as *new* skills to
@@ -136,7 +136,7 @@ the CLI, the wrapper exits with a clear install hint rather than crashing.
136
136
 
137
137
  | Skill | Origin | Downstream copies (known) | Notes |
138
138
  |-------|--------|---------------------------|-------|
139
- | `outsource` | `colleague` (`agentculture/colleague`, `../colleague/.claude/skills/outsource/`) | — (broadcast pending; [`culture-agent-template#8`](https://github.com/agentculture/culture-agent-template/issues/8) proposes adding it to the clone template), `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli` | First-party colleague skill: hand a scoped task to a *different* engine/mind. Verbs `explore` / `review` / `write`. **Divergence:** Provenance paragraph reframed for re-broadcast (above); `type: command` already present upstream. Runtime dep: `uv tool install colleague-cli` + a reachable engine. |
139
+ | `outsource` | `colleague` (`agentculture/colleague`, `../colleague/.claude/skills/outsource/`) | — (broadcast pending; [`culture-agent-template#8`](https://github.com/agentculture/culture-agent-template/issues/8) proposes adding it to the clone template), `rtx-spark-cli`, `reachy-mini-mcp`, `tensor-cli`, `climate-cli`, `eidetic-cli`, `prove-cli`, `reduce-cli`, `refactor-cli`, `rollout-cli`, `coherence-cli`, `agent-lifecycle`, `reterminal`, `operator-cli`, `culture-core`, `ec2-cli`, `qodo-cli`, `knowledgebase-cli`, `cloudai-cli`, `ec2bedrock-cli`, `arm101-cli`, `amazing-hand-cli`, `agentculture-cli`, `data-refinery-cli`, `culture-tools`, `webglass-cli`, `jetson-orin-cli`, `jetson-thor-cli`, `drone-cli`, `fleet-cli`, `league-of-agents`, `harmonics-cli`, `french-cli`, `spanish-cli`, `league-of-agents-platform`, `org`, `learn-cli`, `jetson-arena`, `sensibo-cli` | First-party colleague skill: hand a scoped task to a *different* engine/mind. Verbs `explore` / `review` / `write`. **Divergence:** Provenance paragraph reframed for re-broadcast (above); `type: command` already present upstream. Runtime dep: `uv tool install colleague-cli` + a reachable engine. |
140
140
 
141
141
  Downstream is empty by design — guildmaster is the first holder outside
142
142
  colleague. `guild teach --new --skill outsource --to <repos>` frames it as a
@@ -248,6 +248,11 @@ def transform_plan(
248
248
  f"retarget console command {repo_token!r} → {eff_command!r} "
249
249
  "(the [project.scripts] entry-point key only)"
250
250
  )
251
+ steps.append(
252
+ f"alias the explain catalog root to {eff_command!r} "
253
+ f"(so `{eff_command} explain {eff_command}` resolves and teken's "
254
+ "explain_self check passes)"
255
+ )
251
256
  if eff_dist != repo_token:
252
257
  steps.append(
253
258
  f"retarget PyPI distribution name {repo_token!r} → {eff_dist!r} "
@@ -444,15 +449,17 @@ def _retarget_dist(dest: Path, pkg: str, repo_token: str, dist: str) -> None:
444
449
  )
445
450
 
446
451
 
447
- def _retarget_command(dest: Path, repo_token: str, command: str) -> None:
452
+ def _retarget_command(dest: Path, pkg: str, repo_token: str, command: str) -> None:
448
453
  """Rename only the console **command** from *repo_token* to *command*.
449
454
 
450
455
  Called after the global token replace has set every ``culture-agent-template``
451
- occurrence to *repo_token*. This narrowly rewrites the single place that names
452
- the console *command* (as opposed to the dist or the import package): the
453
- ``[project.scripts]`` entry-point *key* in ``pyproject.toml``.
456
+ occurrence to *repo_token*. This narrowly rewrites the two places that name
457
+ the console *command* (as opposed to the dist or the import package):
454
458
 
455
- The match is anchored at line start with optional indentation
459
+ 1. the ``[project.scripts]`` entry-point *key* in ``pyproject.toml``, and
460
+ 2. the **explain catalog root alias** (see :func:`_alias_explain_root`).
461
+
462
+ For (1) the match is anchored at line start with optional indentation
456
463
  (``^[ \\t]*<repo_token>\\s*=``) — TOML permits an indented table entry — and
457
464
  preserves that indentation, so it hits only the scripts key: never
458
465
  ``name = "<repo_token>"`` (that line starts with ``name``) and never the
@@ -466,6 +473,49 @@ def _retarget_command(dest: Path, repo_token: str, command: str) -> None:
466
473
  dest / _PYPROJECT_TOML,
467
474
  lambda text: key_line.sub(lambda m: m.group(1) + command + m.group(2), text),
468
475
  )
476
+ _alias_explain_root(dest, pkg, repo_token, command)
477
+
478
+
479
+ def _alias_explain_root(dest: Path, pkg: str, repo_token: str, command: str) -> None:
480
+ """Key the explain catalog's root entry by the console *command* too.
481
+
482
+ The template's ``<pkg>/explain/catalog.py`` keys its root markdown by the repo
483
+ token (``("<repo_token>",): _ROOT``), because the global replace is all that
484
+ normally renames it. But the clone's own lint gate — ``teken cli doctor
485
+ --strict`` — runs its ``explain_self`` check as ``<console-script> explain
486
+ <console-script>``. When the command is retargeted away from the repo token
487
+ that lookup has no catalog entry, so ``explain`` exits 1 and the genesis Tests
488
+ run lands red (guildmaster issue #87). Six siblings carry this same alias,
489
+ hand-added after the fact; adding it here makes a retargeted clone green on
490
+ its first CI run.
491
+
492
+ Inserts ``("<command>",): <root-symbol>,`` directly after the repo-token line,
493
+ reusing whatever symbol that line binds. Two guards keep it safe:
494
+
495
+ * if ``("<command>",)`` is *already* a catalog key it is left alone — the
496
+ command may collide with a real verb (``--command learn`` on a template that
497
+ ships a ``learn`` verb), and a duplicate dict key would silently shadow the
498
+ verb's own docs;
499
+ * if the catalog or the anchor line is absent the call degrades to a no-op.
500
+
501
+ Only reached when ``command`` differs from ``repo_token``, so the
502
+ no-override output stays byte-identical.
503
+ """
504
+ catalog = dest / pkg / "explain" / "catalog.py"
505
+ anchor = re.compile(
506
+ r'(?m)^([ \t]*)\("' + re.escape(repo_token) + r'",\):([ \t]*)([A-Za-z_][A-Za-z0-9_]*),$'
507
+ )
508
+
509
+ def _insert_alias(text: str) -> str:
510
+ if f'("{command}",)' in text:
511
+ return text
512
+ match = anchor.search(text)
513
+ if match is None:
514
+ return text
515
+ alias = f'{match.group(1)}("{command}",):{match.group(2)}{match.group(3)},'
516
+ return text[: match.end()] + "\n" + alias + text[match.end() :]
517
+
518
+ _rewrite_text_file(catalog, _insert_alias)
469
519
 
470
520
 
471
521
  def _is_desc_stub(line: str) -> bool:
@@ -683,7 +733,7 @@ def transform_clone(
683
733
  # Independent of step 7: this rewrites the scripts *key* line, the dist
684
734
  # retarget rewrites the [project].name *value* line — different anchors.
685
735
  if eff_command != repo_token:
686
- _retarget_command(dest, repo_token, eff_command)
736
+ _retarget_command(dest, eff_pkg, repo_token, eff_command)
687
737
 
688
738
  # Step 7 — retarget the PyPI dist name (only when it differs from repo_token,
689
739
  # so the default is a true no-op and the bare-name case is unchanged).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "guild-cli"
3
- version = "0.19.4"
3
+ version = "0.19.6"
4
4
  description = "guildmaster — an agent and CLI that manages skills for the AgentCulture mesh."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -43,6 +43,20 @@ def _build_fixture(tmp_path: Path) -> Path:
43
43
  '\n__version__ = _pkg_version("culture-agent-template")\n'
44
44
  )
45
45
 
46
+ # <pkg>/explain/catalog.py — the root markdown is keyed by the repo token, and
47
+ # a `learn` verb entry exists (a command may collide with it).
48
+ explain_dir = pkg_dir / "explain"
49
+ explain_dir.mkdir()
50
+ (explain_dir / "catalog.py").write_text(
51
+ '_ROOT = """# culture-agent-template\n"""\n'
52
+ '_LEARN = """# culture-agent-template learn\n"""\n'
53
+ "\nENTRIES: dict[tuple[str, ...], str] = {\n"
54
+ " (): _ROOT,\n"
55
+ ' ("culture-agent-template",): _ROOT,\n'
56
+ ' ("learn",): _LEARN,\n'
57
+ "}\n"
58
+ )
59
+
46
60
  # .github/workflows/publish.yml — the TestPyPI install hint pins the dist.
47
61
  wf_dir = tmp_path / ".github" / "workflows"
48
62
  wf_dir.mkdir(parents=True)
@@ -486,6 +500,68 @@ def test_transform_plan_whitespace_dist_raises():
486
500
  transform_plan("appsec", "AppSec agent.", dist=" ")
487
501
 
488
502
 
503
+ # ---------------------------------------------------------------------------
504
+ # explain-catalog root alias (issue #87 — `teken cli doctor --strict`)
505
+ # ---------------------------------------------------------------------------
506
+
507
+
508
+ def _catalog(dest, pkg):
509
+ return (dest / pkg / "explain" / "catalog.py").read_text()
510
+
511
+
512
+ def test_transform_default_command_leaves_catalog_keyed_by_repo_token(tmp_path):
513
+ """No --command → the plain rename is byte-identical: one root key, no alias."""
514
+ dest = _build_fixture(tmp_path)
515
+ transform_clone(dest, "appsec", "AppSec agent.", "claude")
516
+ catalog = _catalog(dest, "appsec")
517
+ assert '("appsec",): _ROOT,' in catalog
518
+ assert catalog.count(": _ROOT,") == 2 # the empty key + the repo token, nothing added
519
+
520
+
521
+ def test_transform_custom_command_aliases_catalog_root(tmp_path):
522
+ """--command different from the repo token → `<command> explain <command>`
523
+ must resolve, so the root gets a second key under the console-script name."""
524
+ dest = _build_fixture(tmp_path)
525
+ transform_clone(dest, "sensibo-cli", "Sensibo agent.", "claude", command="sensibo")
526
+ catalog = _catalog(dest, "sensibo")
527
+ assert '("sensibo-cli",): _ROOT,' in catalog # repo-token key kept (pytest suite uses it)
528
+ assert '("sensibo",): _ROOT,' in catalog # console-script key added (teken uses it)
529
+
530
+
531
+ def test_transform_catalog_alias_preserves_indentation_and_other_entries(tmp_path):
532
+ dest = _build_fixture(tmp_path)
533
+ transform_clone(dest, "sensibo-cli", "Sensibo agent.", "claude", command="sensibo")
534
+ catalog = _catalog(dest, "sensibo")
535
+ assert '\n ("sensibo",): _ROOT,\n' in catalog
536
+ assert '("learn",): _LEARN,' in catalog # verb entries untouched
537
+ assert "(): _ROOT," in catalog
538
+
539
+
540
+ def test_transform_catalog_alias_skipped_when_command_collides_with_a_verb(tmp_path):
541
+ """A command that is already a catalog key (a real verb) must not be aliased —
542
+ a duplicate dict key would silently shadow that verb's own docs."""
543
+ dest = _build_fixture(tmp_path)
544
+ transform_clone(dest, "learn-cli", "Learning agent.", "claude", command="learn")
545
+ catalog = _catalog(dest, "learn")
546
+ assert catalog.count('("learn",):') == 1 # still only the verb's entry
547
+ assert '("learn",): _LEARN,' in catalog # and it is the verb's, not the root's
548
+
549
+
550
+ def test_transform_catalog_alias_tolerates_missing_catalog(tmp_path):
551
+ """A template without an explain catalog still transforms (graceful no-op)."""
552
+ dest = _build_fixture(tmp_path)
553
+ (dest / _TEMPLATE_PKG / "explain" / "catalog.py").unlink()
554
+ transform_clone(dest, "sensibo-cli", "Sensibo agent.", "claude", command="sensibo")
555
+ assert (dest / "sensibo" / "cli").exists() or (dest / "sensibo").is_dir()
556
+
557
+
558
+ def test_transform_plan_mentions_catalog_alias_only_when_command_differs(tmp_path):
559
+ with_alias = transform_plan("sensibo-cli", "Sensibo agent.", command="sensibo")
560
+ assert any("explain catalog root" in s for s in with_alias["steps"])
561
+ default = transform_plan("sensibo-cli", "Sensibo agent.")
562
+ assert not any("explain catalog root" in s for s in default["steps"])
563
+
564
+
489
565
  # ---------------------------------------------------------------------------
490
566
  # _resolve_identifiers — the shared resolver
491
567
  # ---------------------------------------------------------------------------
@@ -179,7 +179,7 @@ wheels = [
179
179
 
180
180
  [[package]]
181
181
  name = "guild-cli"
182
- version = "0.19.4"
182
+ version = "0.19.6"
183
183
  source = { editable = "." }
184
184
  dependencies = [
185
185
  { name = "pyyaml" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes