guild-cli 0.3.0__tar.gz → 0.4.0__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 (92) hide show
  1. guild_cli-0.4.0/.claude/skills/agent-config/SKILL.md +82 -0
  2. guild_cli-0.4.0/.claude/skills/agent-config/data/backend-fingerprints.yaml +30 -0
  3. guild_cli-0.4.0/.claude/skills/agent-config/scripts/show.sh +136 -0
  4. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills.local.yaml.example +2 -1
  5. {guild_cli-0.3.0 → guild_cli-0.4.0}/CHANGELOG.md +37 -0
  6. {guild_cli-0.3.0 → guild_cli-0.4.0}/CLAUDE.md +20 -0
  7. {guild_cli-0.3.0 → guild_cli-0.4.0}/PKG-INFO +28 -1
  8. {guild_cli-0.3.0 → guild_cli-0.4.0}/README.md +27 -0
  9. {guild_cli-0.3.0 → guild_cli-0.4.0}/docs/skill-sources.md +1 -0
  10. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/__init__.py +4 -0
  11. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/__init__.py +8 -0
  12. guild_cli-0.4.0/guild/cli/_commands/overview.py +273 -0
  13. guild_cli-0.4.0/guild/cli/_commands/show.py +266 -0
  14. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/ledger.py +36 -0
  15. {guild_cli-0.3.0 → guild_cli-0.4.0}/pyproject.toml +1 -1
  16. guild_cli-0.4.0/tests/test_cli_overview.py +148 -0
  17. guild_cli-0.4.0/tests/test_cli_show.py +165 -0
  18. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_convention.py +2 -0
  19. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_ledger.py +56 -1
  20. {guild_cli-0.3.0 → guild_cli-0.4.0}/uv.lock +1 -1
  21. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  22. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  23. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/SKILL.md +0 -0
  24. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  25. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  26. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  27. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  28. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  29. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/SKILL.md +0 -0
  30. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  31. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  32. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  33. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  34. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  35. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  36. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  37. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  38. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/onboard/SKILL.md +0 -0
  39. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/onboard/scripts/onboard.sh +0 -0
  40. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  41. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  42. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/run-tests/SKILL.md +0 -0
  43. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  44. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
  45. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  46. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  47. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  48. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/teach/SKILL.md +0 -0
  49. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/teach/scripts/teach.sh +0 -0
  50. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/think/SKILL.md +0 -0
  51. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/think/scripts/think.sh +0 -0
  52. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/version-bump/SKILL.md +0 -0
  53. {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
  54. {guild_cli-0.3.0 → guild_cli-0.4.0}/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
  55. {guild_cli-0.3.0 → guild_cli-0.4.0}/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
  56. {guild_cli-0.3.0 → guild_cli-0.4.0}/.flake8 +0 -0
  57. {guild_cli-0.3.0 → guild_cli-0.4.0}/.github/workflows/publish.yml +0 -0
  58. {guild_cli-0.3.0 → guild_cli-0.4.0}/.github/workflows/tests.yml +0 -0
  59. {guild_cli-0.3.0 → guild_cli-0.4.0}/.gitignore +0 -0
  60. {guild_cli-0.3.0 → guild_cli-0.4.0}/.markdownlint-cli2.yaml +0 -0
  61. {guild_cli-0.3.0 → guild_cli-0.4.0}/LICENSE +0 -0
  62. {guild_cli-0.3.0 → guild_cli-0.4.0}/culture.yaml +0 -0
  63. {guild_cli-0.3.0 → guild_cli-0.4.0}/docs/cutover.md +0 -0
  64. {guild_cli-0.3.0 → guild_cli-0.4.0}/docs/plans/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
  65. {guild_cli-0.3.0 → guild_cli-0.4.0}/docs/specs/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
  66. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/__init__.py +0 -0
  67. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/__main__.py +0 -0
  68. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/_broadcast.py +0 -0
  69. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/explain.py +0 -0
  70. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/learn.py +0 -0
  71. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/onboard.py +0 -0
  72. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/teach.py +0 -0
  73. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/whoami.py +0 -0
  74. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_errors.py +0 -0
  75. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_output.py +0 -0
  76. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_repo.py +0 -0
  77. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/__init__.py +0 -0
  78. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/identity.py +0 -0
  79. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/render.py +0 -0
  80. {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/sources.py +0 -0
  81. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/__init__.py +0 -0
  82. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_broadcast_post.py +0 -0
  83. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli.py +0 -0
  84. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_explain.py +0 -0
  85. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_learn.py +0 -0
  86. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_onboard.py +0 -0
  87. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_teach.py +0 -0
  88. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_whoami.py +0 -0
  89. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_identity.py +0 -0
  90. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_render.py +0 -0
  91. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_sources.py +0 -0
  92. {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_version_fallback.py +0 -0
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: agent-config
3
+ description: >
4
+ Show a Culture agent's full configuration in one read-only view: its
5
+ system-prompt file (CLAUDE.md / AGENTS.md / GEMINI.md), the parallel
6
+ culture.yaml, and the agent's local .claude/skills index. Use when an
7
+ operator says "show agent <name>", "what does <agent> look like", or before
8
+ teaching/onboarding an agent and you need to see its current kit + config.
9
+ Backs the `guild show` verb. Vendored from steward (cite-don't-import);
10
+ inventory only — it reports, it does not judge alignment or drift.
11
+ type: command
12
+ ---
13
+
14
+ # agent-config — surface a Culture agent's config in one view
15
+
16
+ guildmaster is the mesh's skills supplier and owns the **inventory** surfaces:
17
+ "what kit + config does this agent have?" This skill answers exactly that for a
18
+ single agent, showing the three artifacts that together define it:
19
+
20
+ 1. **System-prompt file** (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`) — the
21
+ prompt-side guidance for the agent's backend. The script detects which file
22
+ is present from a backend-fingerprint registry.
23
+ 2. **`culture.yaml`** — the runtime-side config (`agents:` list with `suffix`,
24
+ `backend`, `model`, `system_prompt`, `channels`, `tags`, `acp_command`,
25
+ `extras`). Lives parallel to the prompt file at the project root.
26
+ 3. **`.claude/skills/*/SKILL.md`** — the per-project skills the agent can
27
+ invoke, one line each (name + truncated description).
28
+
29
+ This is the **inventory half** of the steward → guildmaster split
30
+ ([issue #12](https://github.com/agentculture/guildmaster/issues/12)): it reports
31
+ the config, it does **not** interpret drift or judge alignment. The relationship
32
+ graph and the "is this agent aligned?" judgment stay with `steward overview` /
33
+ `steward doctor`.
34
+
35
+ ## When to use
36
+
37
+ - Before `guild teach` / `guild onboard` — see an agent's current kit + config.
38
+ - When an operator asks "show me agent `<name>`" or "what does `<agent>` run".
39
+ - Read it, don't guess — before answering a question about what an agent does.
40
+
41
+ ## How to run
42
+
43
+ One script, two ways to call it (or just run `guild show`, which wraps it):
44
+
45
+ ```bash
46
+ # Path mode — point at any directory with a prompt file + culture.yaml
47
+ .claude/skills/agent-config/scripts/show.sh ../culture
48
+
49
+ # Suffix mode — resolve a registered agent suffix via the Culture server's
50
+ # manifest (location set by culture_server_yaml in skills.local.yaml)
51
+ .claude/skills/agent-config/scripts/show.sh daria
52
+ ```
53
+
54
+ Output is three sections: the detected system-prompt file, `culture.yaml` (or
55
+ `(missing)`), and a one-line summary per local skill (name + description,
56
+ truncated to 120 chars).
57
+
58
+ ## What to look at in `culture.yaml`
59
+
60
+ | Field | Why it matters |
61
+ |-------|----------------|
62
+ | `suffix` | Identifies the agent on the mesh. |
63
+ | `backend` | One of `claude` / `codex` / `copilot` / `acp`. The all-backends rule means a feature in one must land in all four. |
64
+ | `model` | Drift here changes behavior silently. |
65
+ | `system_prompt` | Should not contradict the prompt file. |
66
+ | `channels` | Where the agent listens. |
67
+ | `tags`, `extras`, `acp_command` | Backend-specific. |
68
+
69
+ ## Notes
70
+
71
+ - **Read-only.** The script never edits agent files. It reports; it does not
72
+ flag or fix drift — that judgment is steward's lane.
73
+ - **Backend-aware.** Prompt-file detection comes from
74
+ `data/backend-fingerprints.yaml` (the `prompt:` mapping), falling back to the
75
+ built-in `(CLAUDE.md AGENTS.md GEMINI.md)` list if the registry is absent.
76
+ - **Per-machine config.** Suffix mode reads `culture_server_yaml` from
77
+ `.claude/skills.local.yaml` (git-ignored), falling back to
78
+ `.claude/skills.local.yaml.example`.
79
+ - **Vendored from steward** (`agent-config`). guildmaster owns this copy and may
80
+ diverge; re-sync from steward's canonical copy when it changes. Divergences:
81
+ the SKILL.md is reframed for guildmaster's inventory role and adds
82
+ `type: command` for the culture backend's skill loader.
@@ -0,0 +1,30 @@
1
+ # Canonical backend fingerprint registry. Vendored from steward's agent-config
2
+ # skill (cite-don't-import); guildmaster owns this copy. Read by the agent-config
3
+ # show.sh (bash), which `guild show` shells out to. Upstream steward also reads
4
+ # it from a Python detector; guildmaster has no parallel detector, so only the
5
+ # `backends:` prompt mapping below is load-bearing here. Keep that mapping in
6
+ # sync with upstream when re-syncing.
7
+ #
8
+ # `prompt` — the backend's system-prompt filename at the repo root.
9
+ # `steering` — files/dirs distinctive enough to attribute to this backend.
10
+ # `shared_steering` — files/dirs that belong to NO specific backend. A repo
11
+ # declared as any backend may have these without triggering a
12
+ # mismatch. `.agents` is a generic Culture agent-config
13
+ # convention. `.claude/settings.json` and
14
+ # `.claude/settings.local.json` are generic Claude Code
15
+ # (editor/CLI) workspace config files — they appear in any
16
+ # repo that uses Claude Code as the development tool,
17
+ # regardless of the agent backend, so they must never be used
18
+ # to infer the backend or flag a mismatch. The claude backend
19
+ # is identified solely by its `CLAUDE.md` prompt file.
20
+ # `.github/copilot-instructions.md` is generic GitHub Copilot
21
+ # editor/IDE config — any repo may have it regardless of the
22
+ # declared agent backend, so it must not trigger a mismatch.
23
+ backends:
24
+ claude: { prompt: CLAUDE.md, steering: [] }
25
+ codex: { prompt: AGENTS.md, steering: [".codex"] }
26
+ acp: { prompt: AGENTS.md, steering: [".kiro"] }
27
+ copilot: { prompt: AGENTS.md, steering: [] }
28
+ gemini: { prompt: GEMINI.md, steering: [".gemini"] }
29
+ shared_steering: [".agents", ".claude/settings.json", ".claude/settings.local.json", ".github/copilot-instructions.md"]
30
+ prompt_fallback: AGENTS.md
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ # Show a Culture agent's full configuration in one view:
4
+ # the detected system-prompt file (CLAUDE.md / AGENTS.md / GEMINI.md), the
5
+ # parallel culture.yaml, and the .claude/skills/ index.
6
+ #
7
+ # Usage: show.sh <path-or-agent-suffix>
8
+ #
9
+ # Path mode: show.sh ../culture
10
+ # Suffix mode: show.sh daria (resolved via culture_server_yaml in skills.local.yaml)
11
+ #
12
+ # Exit codes:
13
+ # 0 success
14
+ # 1 environment error (missing manifest, missing PyYAML for suffix mode)
15
+ # 2 user error (no target given, unknown suffix, target path doesn't exist)
16
+
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
19
+ REPO_ROOT="$(cd "$SKILL_DIR/../../.." && pwd)"
20
+
21
+ CFG="$REPO_ROOT/.claude/skills.local.yaml"
22
+ [ -f "$CFG" ] || CFG="$REPO_ROOT/.claude/skills.local.yaml.example"
23
+
24
+ # Read a top-level YAML scalar from CFG. Schema is intentionally tiny:
25
+ # key: value (with optional surrounding quotes / trailing comment)
26
+ # No PyYAML dependency.
27
+ read_cfg() {
28
+ awk -v key="$1" '
29
+ $0 ~ ("^" key ":[[:space:]]*") {
30
+ sub("^" key ":[[:space:]]*", "")
31
+ sub(/[[:space:]]*#.*$/, "")
32
+ sub(/^[[:space:]]+/, ""); sub(/[[:space:]]+$/, "")
33
+ sub(/^["\047]/, ""); sub(/["\047]$/, "")
34
+ print
35
+ exit
36
+ }
37
+ ' "$CFG"
38
+ }
39
+
40
+ target="${1:-}"
41
+ if [ -z "$target" ]; then
42
+ echo "Usage: $(basename "$0") <path-or-agent-suffix>" >&2
43
+ exit 2
44
+ fi
45
+
46
+ if [ -d "$target" ]; then
47
+ DIR="$target"
48
+ else
49
+ SERVER_YAML_RAW="$(read_cfg culture_server_yaml)"
50
+ SERVER_YAML="${SERVER_YAML_RAW/#\~/$HOME}"
51
+ if [ ! -f "$SERVER_YAML" ]; then
52
+ echo "no server manifest at $SERVER_YAML — set culture_server_yaml in $CFG" >&2
53
+ echo "or pass an explicit path instead of suffix '$target'" >&2
54
+ exit 1
55
+ fi
56
+ # Suffix mode parses Culture's server manifest, whose schema is dictated by
57
+ # Culture (not by us) and includes nested mappings — too rich for awk.
58
+ # We use python+PyYAML here, with a friendly install hint if it's missing.
59
+ if ! python3 -c 'import yaml' 2>/dev/null; then
60
+ echo "suffix mode needs Python + PyYAML to parse $SERVER_YAML" >&2
61
+ echo " install: pip install --user pyyaml (or: uv pip install pyyaml)" >&2
62
+ echo " or pass an explicit path instead of suffix '$target'" >&2
63
+ exit 1
64
+ fi
65
+ # Use a dedicated exit code (2) for "unknown suffix" so the steward CLI
66
+ # wrapper can distinguish user errors (typo'd suffix) from env errors
67
+ # (missing manifest / PyYAML).
68
+ if ! DIR=$(python3 - "$SERVER_YAML" "$target" <<'PY'
69
+ import sys, yaml, pathlib
70
+ manifest_path, suffix = sys.argv[1], sys.argv[2]
71
+ m = yaml.safe_load(pathlib.Path(manifest_path).read_text()) or {}
72
+ agents = m.get('agents', {})
73
+ entry = agents.get(suffix)
74
+ if entry is None:
75
+ print(f"no agent registered with suffix {suffix!r} in {manifest_path}", file=sys.stderr)
76
+ sys.exit(2)
77
+ print(entry['directory'] if isinstance(entry, dict) else entry)
78
+ PY
79
+ ); then
80
+ exit 2
81
+ fi
82
+ fi
83
+
84
+ DIR="${DIR/#\~/$HOME}"
85
+
86
+ # Recognized prompt filenames come from the shared registry (single source
87
+ # of truth with the Python detector). Fall back to the built-in list if the
88
+ # registry isn't present (e.g. skill vendored without the data file).
89
+ REGISTRY="$SKILL_DIR/data/backend-fingerprints.yaml"
90
+ prompt_files=()
91
+ if [ -f "$REGISTRY" ]; then
92
+ while IFS= read -r pf; do
93
+ [ -n "$pf" ] && prompt_files+=("$pf")
94
+ done < <(grep -oE 'prompt:[[:space:]]*[^,}[:space:]]+' "$REGISTRY" | awk '{print $NF}' | sort -u)
95
+ fi
96
+ [ ${#prompt_files[@]} -eq 0 ] && prompt_files=(CLAUDE.md AGENTS.md GEMINI.md)
97
+
98
+ shown=0
99
+ for pf in "${prompt_files[@]}"; do
100
+ if [ -f "$DIR/$pf" ]; then
101
+ echo "=== $DIR/$pf ==="
102
+ cat "$DIR/$pf"
103
+ echo
104
+ shown=1
105
+ fi
106
+ done
107
+ if [ "$shown" -eq 0 ]; then
108
+ echo "=== $DIR (system prompt) ==="
109
+ echo "(no recognized prompt file: ${prompt_files[*]})"
110
+ echo
111
+ fi
112
+ echo "=== $DIR/culture.yaml ==="
113
+ if [ -f "$DIR/culture.yaml" ]; then cat "$DIR/culture.yaml"; else echo "(missing)"; fi
114
+ echo
115
+ echo "=== $DIR/.claude/skills/ ==="
116
+ found=0
117
+ for s in "$DIR"/.claude/skills/*/SKILL.md; do
118
+ [ -f "$s" ] || continue
119
+ found=1
120
+ name=$(awk '/^name:/{print $2; exit}' "$s")
121
+ desc=$(awk '
122
+ /^description:/ {
123
+ sub(/^description:[[:space:]]*/, "")
124
+ buf = $0
125
+ flag = 1
126
+ next
127
+ }
128
+ flag && /^[a-z_-]+:/ { flag = 0 }
129
+ flag { buf = buf " " $0 }
130
+ END { gsub(/^[[:space:]]+|[[:space:]]+$/, "", buf); print buf }
131
+ ' "$s")
132
+ printf " %-30s %s\n" "$name" "${desc:0:120}"
133
+ done
134
+ if [ "$found" -eq 0 ]; then
135
+ echo " (no skills)"
136
+ fi
@@ -3,7 +3,8 @@
3
3
  # Skills read skills.local.yaml first, falling back to this example.
4
4
 
5
5
  # Path to the Culture server's agent manifest (suffix → directory mapping).
6
- # Used by skills that resolve a registered agent suffix to its repo dir.
6
+ # Used by skills that resolve a registered agent suffix to its repo dir
7
+ # e.g. the agent-config skill / `guild show <suffix>` (suffix mode).
7
8
  culture_server_yaml: ~/.culture/server.yaml
8
9
 
9
10
  # Sibling project paths checked by cross-repo skills (cicd alignment delta,
@@ -5,6 +5,43 @@ 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.4.0] - 2026-05-24
9
+
10
+ ### Added
11
+
12
+ - **`guild overview`** — guildmaster's read-only skills-supplier overview surface
13
+ ([#12](https://github.com/agentculture/guildmaster/issues/12)): the canonical
14
+ skill set + versions/origins, the `docs/skill-sources.md` ledger view, and
15
+ drift signals (unledgered skills, uncovered skills, per-agent kit gaps).
16
+ `--scope all` (default) and `--scope self <agent>`; markdown or `--json`.
17
+ Pure-Python, read-only — no `--apply`, no mutation, no LLM. Degrades
18
+ gracefully pre-cutover: when the ledger has no downstream column the verb
19
+ reports the canonical set and notes that drift activates after the
20
+ steward→guildmaster cutover. Skills-scoped only — does not reproduce
21
+ `steward overview`'s ecosystem relationship graph.
22
+ - **`guild show <path-or-suffix>`** — one agent's full config in one read-only
23
+ view ([#12](https://github.com/agentculture/guildmaster/issues/12)): the
24
+ detected system-prompt file (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`), the
25
+ parallel `culture.yaml`, and the `.claude/skills` index. Path mode or suffix
26
+ mode (resolved via `culture_server_yaml`). Target resolution happens once in
27
+ Python; the human view shells out to the vendored `agent-config` `show.sh`
28
+ (mirroring `steward show`), while `--json` emits a structured object (prompt
29
+ file + contents, parsed `culture.yaml`, skills index) built natively. Failure
30
+ output stays the structured `error:` / `hint:` shape. Inventory only — it
31
+ reports, it does not judge drift.
32
+ - **`agent-config` skill** vendored from steward (cite-don't-import) to back
33
+ `guild show`: `scripts/show.sh` + `data/backend-fingerprints.yaml` verbatim;
34
+ SKILL.md reframed for guildmaster's inventory role + `type: command`. Recorded
35
+ in `docs/skill-sources.md`; now part of the canonical skill set.
36
+ - `guild.skills.ledger.supplier_skills` / `consumer_map` — pure helpers that
37
+ read the supplier ledger (skills tracked + their consumers) for `overview`.
38
+
39
+ ### Changed
40
+
41
+ - `VERBS` index + `README.md` + `CLAUDE.md` document the new inventory verbs and
42
+ the issue #12 division of labor (inventory → guildmaster; alignment judgment →
43
+ steward).
44
+
8
45
  ## [0.3.0] - 2026-05-24
9
46
 
10
47
  ### Added
@@ -106,6 +106,26 @@ asked for one; guildmaster fulfills the broadcast *role* via these two instead).
106
106
  Going live is gated on the steward→guildmaster cutover (`docs/cutover.md`) — no
107
107
  two live broadcasters.
108
108
 
109
+ **Inventory verbs — `overview` & `show` (the read-only surfaces).** guildmaster
110
+ owns the mesh's *inventory* surfaces per
111
+ [issue #12](https://github.com/agentculture/guildmaster/issues/12) — the
112
+ "what kit + config does an agent have?" view. The dividing rule from issue #12:
113
+ **inventory → guildmaster; judgment ("how do agents relate / are they aligned?")
114
+ → steward.** Neither verb clones `steward overview`'s relationship graph.
115
+
116
+ - `guild overview [--scope all|self <agent>]` — the supplier view: canonical
117
+ skill set + versions/origins, the `docs/skill-sources.md` ledger, and drift
118
+ signals (uncovered skills, per-agent kit gaps). Pure-Python, read-only, **no
119
+ `--apply`**. Pre-cutover the ledger has no downstream column, so drift is
120
+ inactive and the verb says so (reads whichever ledger is authoritative).
121
+ - `guild show <path-or-suffix>` — one agent's full config: detected prompt file
122
+ (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`), parallel `culture.yaml`, and the
123
+ `.claude/skills` index. Thin wrapper that shells out to the vendored
124
+ `agent-config` skill's `show.sh` (cite-don't-import from steward), mirroring
125
+ `steward show`. Path mode or suffix mode (resolved via `culture_server_yaml`).
126
+
127
+ Both **report**; they do not flag or fix drift (that judgment is steward's lane).
128
+
109
129
  **Backend:** guildmaster is a CLI *plus* an agent like steward, so the natural
110
130
  fit is `backend: claude` with this `CLAUDE.md` as the runtime prompt and a
111
131
  `culture.yaml` declaring the `guildmaster` agent suffix (steward's is
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: guild-cli
3
- Version: 0.3.0
3
+ Version: 0.4.0
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
@@ -94,6 +94,33 @@ verification). After: **one command** propagates a skill set, or onboards a
94
94
  sibling end-to-end. Going live is gated on the staged steward→guildmaster
95
95
  cutover — see [`docs/cutover.md`](docs/cutover.md).
96
96
 
97
+ ### Inventory verbs — `overview` & `show`
98
+
99
+ guildmaster owns the mesh's **inventory** surfaces (the read-only "what kit +
100
+ config does an agent have?" view) per
101
+ [issue #12](https://github.com/agentculture/guildmaster/issues/12). Both are
102
+ read-only — no `--apply`, no mutation, no drift verdict (judgment stays with
103
+ `steward overview` / `steward doctor`).
104
+
105
+ | Verb | What it does |
106
+ |------|--------------|
107
+ | `guild overview [--scope all\|self <agent>]` | The supplier view: the canonical skill set + versions/origins, the `docs/skill-sources.md` ledger, and drift signals (uncovered skills, per-agent kit gaps). Feeds `teach` / `onboard`. |
108
+ | `guild show <path-or-suffix>` | One agent's full config in one view — its detected prompt file (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`), its parallel `culture.yaml`, and its `.claude/skills` index. |
109
+
110
+ ```bash
111
+ uv run guild overview # whole ledger + canonical set
112
+ uv run guild overview --scope self daria # one agent's kit + gaps
113
+ uv run guild show ../culture # config by path
114
+ uv run guild show daria # config by registered suffix
115
+ uv run guild show ../culture --json # structured config object
116
+ ```
117
+
118
+ `guild show` resolves a registered suffix via the Culture server manifest
119
+ (`culture_server_yaml` in `.claude/skills.local.yaml`); pass an explicit
120
+ directory path to skip the lookup. Pre-cutover the ledger is still a
121
+ consumer-side view with no downstream column, so `overview`'s drift signals
122
+ activate only after the steward→guildmaster cutover — the verb says so plainly.
123
+
97
124
  ## Develop
98
125
 
99
126
  ```bash
@@ -76,6 +76,33 @@ verification). After: **one command** propagates a skill set, or onboards a
76
76
  sibling end-to-end. Going live is gated on the staged steward→guildmaster
77
77
  cutover — see [`docs/cutover.md`](docs/cutover.md).
78
78
 
79
+ ### Inventory verbs — `overview` & `show`
80
+
81
+ guildmaster owns the mesh's **inventory** surfaces (the read-only "what kit +
82
+ config does an agent have?" view) per
83
+ [issue #12](https://github.com/agentculture/guildmaster/issues/12). Both are
84
+ read-only — no `--apply`, no mutation, no drift verdict (judgment stays with
85
+ `steward overview` / `steward doctor`).
86
+
87
+ | Verb | What it does |
88
+ |------|--------------|
89
+ | `guild overview [--scope all\|self <agent>]` | The supplier view: the canonical skill set + versions/origins, the `docs/skill-sources.md` ledger, and drift signals (uncovered skills, per-agent kit gaps). Feeds `teach` / `onboard`. |
90
+ | `guild show <path-or-suffix>` | One agent's full config in one view — its detected prompt file (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`), its parallel `culture.yaml`, and its `.claude/skills` index. |
91
+
92
+ ```bash
93
+ uv run guild overview # whole ledger + canonical set
94
+ uv run guild overview --scope self daria # one agent's kit + gaps
95
+ uv run guild show ../culture # config by path
96
+ uv run guild show daria # config by registered suffix
97
+ uv run guild show ../culture --json # structured config object
98
+ ```
99
+
100
+ `guild show` resolves a registered suffix via the Culture server manifest
101
+ (`culture_server_yaml` in `.claude/skills.local.yaml`); pass an explicit
102
+ directory path to skip the lookup. Pre-cutover the ledger is still a
103
+ consumer-side view with no downstream column, so `overview`'s drift signals
104
+ activate only after the steward→guildmaster cutover — the verb says so plainly.
105
+
79
106
  ## Develop
80
107
 
81
108
  ```bash
@@ -32,6 +32,7 @@ vendored them during its initial scaffold
32
32
  | `sonarclaude` | `steward` (`../steward/.claude/skills/sonarclaude/`) | SonarCloud API client; project key from `$SONAR_PROJECT` or `--project`. |
33
33
  | `doc-test-alignment` | `steward` (`../steward/.claude/skills/doc-test-alignment/`) | Stub today; real implementation TBD upstream. |
34
34
  | `pypi-maintainer` | `steward` (`../steward/.claude/skills/pypi-maintainer/`) | Switches a PyPI install between pypi / test-pypi / local. |
35
+ | `agent-config` | `steward` (`../steward/.claude/skills/agent-config/`) | Per-agent config view backing `guild show` ([#12](https://github.com/agentculture/guildmaster/issues/12)); `show.sh` + `data/backend-fingerprints.yaml` are vendored verbatim. **Divergence:** SKILL.md reframed from steward's alignment-judgment framing to guildmaster's inventory role and adds `type: command` for the culture backend's skill loader. |
35
36
 
36
37
  ## Inbound workflow skills (origin = `devague`, re-broadcast via `steward`)
37
38
 
@@ -35,6 +35,8 @@ def _build_parser() -> argparse.ArgumentParser:
35
35
  from guild.cli._commands import explain as _explain_cmd
36
36
  from guild.cli._commands import learn as _learn_cmd
37
37
  from guild.cli._commands import onboard as _onboard_cmd
38
+ from guild.cli._commands import overview as _overview_cmd
39
+ from guild.cli._commands import show as _show_cmd
38
40
  from guild.cli._commands import teach as _teach_cmd
39
41
  from guild.cli._commands import whoami as _whoami_cmd
40
42
 
@@ -54,6 +56,8 @@ def _build_parser() -> argparse.ArgumentParser:
54
56
  _explain_cmd.register(sub)
55
57
  _teach_cmd.register(sub)
56
58
  _onboard_cmd.register(sub)
59
+ _overview_cmd.register(sub)
60
+ _show_cmd.register(sub)
57
61
 
58
62
  return parser
59
63
 
@@ -25,6 +25,14 @@ VERBS: dict[str, str] = {
25
25
  "Onboard a new sibling: the full canonical kit + identity-setup section "
26
26
  "+ ledger registration + verification record. Dry-run by default."
27
27
  ),
28
+ "overview": (
29
+ "Skills-supplier overview — the canonical skill set + versions, the "
30
+ "ledger view, and drift signals. Read-only; --scope all / self."
31
+ ),
32
+ "show": (
33
+ "Show one agent's full config in a read-only view — its prompt file, "
34
+ "culture.yaml, and skills index. Path or registered suffix."
35
+ ),
28
36
  }
29
37
 
30
38
  __all__ = ["VERBS"]