qodo-cli 0.3.2__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 (81) hide show
  1. qodo_cli-0.4.0/.devague/current +1 -0
  2. qodo_cli-0.4.0/.devague/frames/qodo-cli-now-does-qodo-s-two-core-jobs-natively-fr.json +168 -0
  3. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.gitignore +3 -0
  4. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.markdownlint-cli2.yaml +3 -0
  5. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/CHANGELOG.md +44 -0
  6. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/PKG-INFO +1 -1
  7. qodo_cli-0.4.0/docs/qodo-skills-sources.md +117 -0
  8. qodo_cli-0.4.0/docs/specs/2026-06-16-qodo-cli-now-does-qodo-s-two-core-jobs-natively-fr.md +45 -0
  9. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/pyproject.toml +1 -1
  10. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/__init__.py +8 -2
  11. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_commands/cli.py +3 -2
  12. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_commands/doctor.py +2 -2
  13. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_commands/explain.py +2 -2
  14. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_commands/learn.py +27 -16
  15. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_commands/overview.py +64 -3
  16. qodo_cli-0.4.0/qodo/cli/_commands/review.py +139 -0
  17. qodo_cli-0.4.0/qodo/cli/_commands/rules.py +98 -0
  18. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_commands/whoami.py +2 -2
  19. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_output.py +14 -0
  20. qodo_cli-0.4.0/qodo/cli/_providers.py +333 -0
  21. qodo_cli-0.4.0/qodo/cli/_qodo_api.py +198 -0
  22. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/explain/catalog.py +74 -6
  23. qodo_cli-0.4.0/tests/test_review.py +372 -0
  24. qodo_cli-0.4.0/tests/test_rules.py +196 -0
  25. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/uv.lock +1 -1
  26. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/agent-config/SKILL.md +0 -0
  27. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  28. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
  29. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
  30. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  31. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  32. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  33. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  34. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  35. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  36. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/cicd/SKILL.md +0 -0
  37. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  38. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  39. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  40. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  41. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  42. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/communicate/SKILL.md +0 -0
  43. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  44. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  45. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  46. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  47. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  48. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  49. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  50. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  51. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  52. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  53. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/run-tests/SKILL.md +0 -0
  54. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  55. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
  56. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  57. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  58. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  59. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/think/SKILL.md +0 -0
  60. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/think/scripts/think.sh +0 -0
  61. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/version-bump/SKILL.md +0 -0
  62. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
  63. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.claude/skills.local.yaml.example +0 -0
  64. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.flake8 +0 -0
  65. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.github/workflows/publish.yml +0 -0
  66. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/.github/workflows/tests.yml +0 -0
  67. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/AGENTS.colleague.md +0 -0
  68. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/CLAUDE.md +0 -0
  69. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/LICENSE +0 -0
  70. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/README.md +0 -0
  71. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/culture.yaml +0 -0
  72. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/docs/skill-sources.md +0 -0
  73. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/__init__.py +0 -0
  74. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/__main__.py +0 -0
  75. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_commands/__init__.py +0 -0
  76. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/cli/_errors.py +0 -0
  77. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/qodo/explain/__init__.py +0 -0
  78. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/sonar-project.properties +0 -0
  79. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/tests/__init__.py +0 -0
  80. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/tests/test_cli.py +0 -0
  81. {qodo_cli-0.3.2 → qodo_cli-0.4.0}/tests/test_cli_introspection.py +0 -0
@@ -0,0 +1 @@
1
+ qodo-cli-now-does-qodo-s-two-core-jobs-natively-fr
@@ -0,0 +1,168 @@
1
+ {
2
+ "slug": "qodo-cli-now-does-qodo-s-two-core-jobs-natively-fr",
3
+ "title": "qodo-cli now does Qodo's two core jobs natively from your terminal, in zero-dependency Python: 'qodo rules' surfaces your org's coding rules by semantic search (reading your existing ~/.qodo/config.json API key), and 'qodo review' (a.k.a. 'qodo pr') triages and resolves the Qodo bot's PR review comments through your existing provider CLIs (gh/glab/az). Each verb cites the official qodo-ai/qodo-skills as its behavioral source of truth \u2014 we point at the skills as the spec; we do not fork, vendor, or npx-install them. A dedicated auth/config verb and repos/agents commands are explicit follow-ups.",
4
+ "schema_version": 1,
5
+ "status": "exported",
6
+ "created": "2026-06-16T17:43:44Z",
7
+ "updated": "2026-06-16T17:44:57Z",
8
+ "claims": [
9
+ {
10
+ "id": "c1",
11
+ "kind": "announcement",
12
+ "text": "qodo-cli now does Qodo's two core jobs natively from your terminal, in zero-dependency Python: 'qodo rules' surfaces your org's coding rules by semantic search (reading your existing ~/.qodo/config.json API key), and 'qodo review' (a.k.a. 'qodo pr') triages and resolves the Qodo bot's PR review comments through your existing provider CLIs (gh/glab/az). Each verb cites the official qodo-ai/qodo-skills as its behavioral source of truth \u2014 we point at the skills as the spec; we do not fork, vendor, or npx-install them. A dedicated auth/config verb and repos/agents commands are explicit follow-ups.",
13
+ "origin": "user",
14
+ "status": "confirmed",
15
+ "honesty_conditions": [
16
+ {
17
+ "id": "h1",
18
+ "text": "Behavioral parity is verifiable: for a given input, 'qodo rules'/'qodo review' make equivalent API/provider-CLI calls and apply the same severity mapping as the cited upstream skill.",
19
+ "status": "confirmed"
20
+ }
21
+ ],
22
+ "hard_questions": [],
23
+ "links": []
24
+ },
25
+ {
26
+ "id": "c2",
27
+ "kind": "audience",
28
+ "text": "Developers and AI coding agents with a Qodo subscription who want one terminal-native, zero-dependency CLI for Qodo's domain \u2014 rules and PR review \u2014 instead of juggling per-agent skill installs (npx skills add) and the Qodo web app.",
29
+ "origin": "llm",
30
+ "status": "confirmed",
31
+ "honesty_conditions": [
32
+ {
33
+ "id": "h5",
34
+ "text": "Audience is reachable: a Qodo subscriber can run 'qodo rules' / 'qodo review' on a machine that already has ~/.qodo/config.json (rules) and gh/glab/az (review), with no Qodo-side setup beyond what the skills already require.",
35
+ "status": "confirmed"
36
+ }
37
+ ],
38
+ "hard_questions": [],
39
+ "links": []
40
+ },
41
+ {
42
+ "id": "c3",
43
+ "kind": "before_state",
44
+ "text": "Qodo's capabilities are reachable today only through (a) the per-agent skills in qodo-ai/qodo-skills, installed ad-hoc via 'npx skills add' / the Claude marketplace, and (b) the Qodo web app. qodo-cli has no Qodo surface yet \u2014 it is still the agent-first introspection scaffold (whoami/learn/explain/doctor).",
45
+ "origin": "llm",
46
+ "status": "confirmed",
47
+ "honesty_conditions": [
48
+ {
49
+ "id": "h6",
50
+ "text": "Before-state is checkable: 'git grep' in qodo-cli finds no rules/review command surface today, and the only ways to reach these Qodo behaviors are the upstream skills (npx skills add) and the Qodo web app.",
51
+ "status": "confirmed"
52
+ }
53
+ ],
54
+ "hard_questions": [],
55
+ "links": []
56
+ },
57
+ {
58
+ "id": "c4",
59
+ "kind": "why_it_matters",
60
+ "text": "qodo-cli's stated domain is managing Qodo. Reimplementing the skills' behavior as native zero-dep commands \u2014 while citing qodo-ai/qodo-skills as the canonical spec \u2014 gives one consistent CLI across agents, removes Node/npx + per-agent-install friction, and keeps upstream as the source of truth we point at rather than a fork that drifts.",
61
+ "origin": "llm",
62
+ "status": "confirmed",
63
+ "honesty_conditions": [
64
+ {
65
+ "id": "h7",
66
+ "text": "Benefit is observable: a user gets identical Qodo behavior from 'qodo ...' with no Node/npx or per-agent skill install, and upstream qodo-ai/qodo-skills stays the single cited source (no forked copy lives in this repo).",
67
+ "status": "confirmed"
68
+ }
69
+ ],
70
+ "hard_questions": [],
71
+ "links": []
72
+ },
73
+ {
74
+ "id": "c5",
75
+ "kind": "after_state",
76
+ "text": "'qodo' exposes two Qodo verbs as native command groups \u2014 'rules' (get) and 'review'/'pr' (list, resolve) \u2014 each documenting which upstream skill it derives from. 'rules' calls the Qodo API using the API key already in ~/.qodo/config.json; 'review' drives the user's existing provider CLIs (gh/glab/az) to read and resolve the Qodo bot's PR comments. There is no meta 'skills' verb; a dedicated auth/config verb is deferred to follow-up.",
77
+ "origin": "llm",
78
+ "status": "confirmed",
79
+ "honesty_conditions": [
80
+ {
81
+ "id": "h2",
82
+ "text": "Every native verb's --help/docs names the upstream skill it cites (qodo-get-rules / qodo-pr-resolver) and the API endpoint or provider CLI it uses.",
83
+ "status": "confirmed"
84
+ }
85
+ ],
86
+ "hard_questions": [],
87
+ "links": []
88
+ },
89
+ {
90
+ "id": "c6",
91
+ "kind": "boundary",
92
+ "text": "Non-goals: no 'qodo skills' verb and no npx-skills wrapper (skills are cited as spec, not shipped/installed/forked); no dedicated auth/config or repos/agents verbs in this slice (follow-ups); no reimplementation of Qodo's server-side analysis; not a general Agent-Skills package manager. 'qodo rules' requires a pre-existing ~/.qodo/config.json and does not implement an interactive login.",
93
+ "origin": "llm",
94
+ "status": "confirmed",
95
+ "honesty_conditions": [
96
+ {
97
+ "id": "h8",
98
+ "text": "Non-goals are enforceable: the shipped CLI has no 'skills' verb and no npx invocation, 'qodo rules' errors (not prompts) when ~/.qodo/config.json is absent, and nothing in the repo vendors or forks upstream skill content.",
99
+ "status": "confirmed"
100
+ }
101
+ ],
102
+ "hard_questions": [],
103
+ "links": []
104
+ },
105
+ {
106
+ "id": "c7",
107
+ "kind": "success_signal",
108
+ "text": "With a valid ~/.qodo/config.json, 'qodo rules get \"<task>\"' returns the same severity-ranked rules qodo-get-rules would; and on a repo with open Qodo PR comments, 'qodo review' lists and resolves the same comments qodo-pr-resolver would \u2014 behavioral parity with both cited skills from one zero-dep CLI.",
109
+ "origin": "llm",
110
+ "status": "confirmed",
111
+ "honesty_conditions": [
112
+ {
113
+ "id": "h9",
114
+ "text": "Parity is demonstrable on a fixture: for a known task input 'qodo rules get' returns the same severity-ranked rules qodo-get-rules yields from the same API response; for a PR with known Qodo comments 'qodo review list' enumerates the same comments qodo-pr-resolver would.",
115
+ "status": "confirmed"
116
+ }
117
+ ],
118
+ "hard_questions": [],
119
+ "links": []
120
+ },
121
+ {
122
+ "id": "c8",
123
+ "kind": "requirement",
124
+ "text": "qodo-cli reuses the skills' existing credentials as-is \u2014 ~/.qodo/config.json (API key + environment) for 'rules' and the user's already-working provider-CLI auth (gh/glab/az) for 'review' \u2014 introducing no new config format or auth flow.",
125
+ "origin": "llm",
126
+ "status": "confirmed",
127
+ "honesty_conditions": [
128
+ {
129
+ "id": "h3",
130
+ "text": "On a machine where the skills already work, 'qodo rules' reads the same ~/.qodo/config.json keys with no migration, and 'qodo review' reuses the existing provider-CLI auth \u2014 neither prompts for new credentials.",
131
+ "status": "confirmed"
132
+ }
133
+ ],
134
+ "hard_questions": [],
135
+ "links": []
136
+ },
137
+ {
138
+ "id": "c9",
139
+ "kind": "requirement",
140
+ "text": "Each verb maps 1:1 to a cited upstream skill: 'qodo rules' <- qodo-get-rules (POST /rules/search, severity ERROR/WARNING/RECOMMENDATION); 'qodo review'/'pr' <- qodo-pr-resolver (provider-CLI fetch of Qodo bot comments, dedup, fix, reply, resolve threads, push).",
141
+ "origin": "llm",
142
+ "status": "confirmed",
143
+ "honesty_conditions": [
144
+ {
145
+ "id": "h4",
146
+ "text": "The 1:1 verb<-skill mapping is checkable against the upstream SKILL.md scripts: the endpoints, severity labels, and provider-CLI calls match what those scripts do.",
147
+ "status": "confirmed"
148
+ }
149
+ ],
150
+ "hard_questions": [],
151
+ "links": []
152
+ }
153
+ ],
154
+ "open_vagueness": [
155
+ {
156
+ "id": "v1",
157
+ "text": "Exact Qodo API surface (endpoints, auth header, base URL per environment), the ~/.qodo/config.json schema, and which provider-comment APIs expose the Qodo bot's threads must be confirmed by reading the upstream skill scripts / Qodo API docs during planning.",
158
+ "kind": "unknown_nonblocking",
159
+ "claim_id": null
160
+ },
161
+ {
162
+ "id": "v2",
163
+ "text": "Dedicated 'qodo auth'/'qodo config' verb, repos-level commands, and Qodo agents management are future scope ('and more'), not built in this first slice.",
164
+ "kind": "follow_up",
165
+ "claim_id": null
166
+ }
167
+ ]
168
+ }
@@ -228,3 +228,6 @@ __marimo__/
228
228
 
229
229
  # Per-machine skills config (copy from skills.local.yaml.example)
230
230
  skills.local.yaml
231
+
232
+ # devague working state (not committed by default)
233
+ .devague/questions/
@@ -21,3 +21,6 @@ ignores:
21
21
  - ".teken/**"
22
22
  # Vendored skills are cited verbatim from guildmaster — do not reformat them.
23
23
  - ".claude/skills/**"
24
+ # devague-exported specs are generated artifacts (the H1 is the verbatim
25
+ # announcement; bodies carry literal "<placeholders>") — do not reformat them.
26
+ - "docs/specs/**"
@@ -5,6 +5,50 @@ 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-06-17
9
+
10
+ ### Added
11
+
12
+ - First real Qodo-management surface — two native, zero-dependency noun groups,
13
+ each citing `qodo-ai/qodo-skills` as its behavioral source of truth (cite,
14
+ don't fork/vendor/npx):
15
+ - `qodo rules get "<query>"` — semantic-search your org's Qodo coding rules.
16
+ Reimplements `qodo-get-rules` over the stdlib (`urllib`): reads the API key
17
+ already in `~/.qodo/config.json` (env `QODO_API_KEY`/`QODO_ENVIRONMENT_NAME`/
18
+ `QODO_API_URL` win), POSTs `{base}/rules/search`, and prints the
19
+ relevance-ranked rules with `ERROR`/`WARNING`/`RECOMMENDATION` severity.
20
+ Errors (never prompts) when no credentials are present.
21
+ - `qodo review` (alias `qodo pr`) — `list` and `resolve` the Qodo bot's PR
22
+ review comments. Reimplements `qodo-pr-resolver` by driving the user's
23
+ existing provider CLI (`gh`): detect provider, find the open PR for the
24
+ branch, fetch and filter the Qodo bot's comments (`qodo-code-review`,
25
+ `qodo-merge`, `qodo-ai`, `pr-agent-pro(-staging)` — matched as base names so
26
+ both gh `[bot]`-suffix spellings hit), dedup by stable comment identity
27
+ (id/url) so distinct same-badge inline comments never collapse, reply, and
28
+ acknowledge (`+1`). GitHub is wired — including GitHub Enterprise, recognised
29
+ via your `gh` host config (`gh auth status --hostname`) rather than hostname
30
+ guessing (implemented but not live-tested against a real GHE instance);
31
+ GitLab/Azure/Bitbucket/Gerrit are recognised but raise a clear "not wired
32
+ yet" error.
33
+ - `qodo/cli/_qodo_api.py` and `qodo/cli/_providers.py` — the zero-dep mechanics
34
+ behind the two verbs (stdlib `urllib` / `subprocess` only).
35
+ - `docs/qodo-skills-sources.md` — the Qodo-skills citation ledger: verb↔skill
36
+ map, the resolved API/provider contract, follow-up providers, and a re-sync
37
+ procedure.
38
+ - `docs/specs/…-qodo-cli-now-does-qodo-s-two-core-jobs-natively-fr.md` — the
39
+ converged `/think` spec this slice was built from.
40
+
41
+ ### Changed
42
+
43
+ - `learn`, `overview`, the explain catalog root, and the parser description now
44
+ describe the real Qodo surface instead of self-describing as "a clonable
45
+ template" (the drift CLAUDE.md flagged); `overview`'s artifact list now names
46
+ `AGENTS.colleague.md` (the colleague-backend prompt file) rather than
47
+ `CLAUDE.md`.
48
+ - `.markdownlint-cli2.yaml` ignores `docs/specs/**` — devague-exported specs are
49
+ generated artifacts (verbatim-announcement H1, literal `<placeholders>`) and
50
+ are not reformatted, mirroring the vendored-skills exclusion.
51
+
8
52
  ## [0.3.2] - 2026-06-16
9
53
 
10
54
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qodo-cli
3
- Version: 0.3.2
3
+ Version: 0.4.0
4
4
  Summary: Community CLI and agent to manage Qodo — the AI code reviewer and Qodo's other agents (requires a Qodo subscription). Unofficial: not affiliated with, authorized, or endorsed by Qodo; the Qodo name and trademark belong to Qodo Ltd.
5
5
  Project-URL: Homepage, https://github.com/agentculture/qodo-cli
6
6
  Project-URL: Issues, https://github.com/agentculture/qodo-cli/issues
@@ -0,0 +1,117 @@
1
+ # Qodo-skills citation ledger
2
+
3
+ `qodo rules` and `qodo review` are **native reimplementations** of the two
4
+ official skills in [`qodo-ai/qodo-skills`](https://github.com/qodo-ai/qodo-skills).
5
+ We **cite, don't import**: those skills are the behavioral source of truth that
6
+ this CLI points at — we do **not** fork, vendor, or `npx skills add` them, and no
7
+ copy of their content lives in this repo. This ledger records what each native
8
+ verb derives from, what we reimplement versus what stays the calling agent's job,
9
+ and the resolved API/provider contract.
10
+
11
+ If upstream changes, this is the file to re-check the contract against.
12
+
13
+ ## Verb ↔ skill map
14
+
15
+ | qodo-cli verb | Upstream skill | Upstream reference |
16
+ | --- | --- | --- |
17
+ | `qodo rules get` | `qodo-get-rules` | `skills/qodo-get-rules/SKILL.md`, `references/search-endpoint.md`, `references/output-format.md` |
18
+ | `qodo review list` / `resolve` (alias `qodo pr`) | `qodo-pr-resolver` | `skills/qodo-pr-resolver/SKILL.md`, `resources/providers.md` |
19
+
20
+ ## What we reimplement vs. what stays agent-side
21
+
22
+ The skills are agent harnesses: they mix deterministic API/provider mechanics
23
+ with LLM-driven steps (generating search queries, reading code, writing fixes).
24
+ This CLI owns **only the deterministic mechanics**. The LLM steps stay with the
25
+ calling agent — which keeps the CLI zero-dependency and model-agnostic.
26
+
27
+ - **`qodo rules`** — we own: read `~/.qodo/config.json`, build the base URL,
28
+ POST `/rules/search`, return relevance-ranked rules with severity. The agent
29
+ owns: turning a task into the two structured queries `qodo-get-rules`
30
+ generates (call `rules get` once per query and merge).
31
+ - **`qodo review`** — we own: detect the provider, find the open PR, fetch and
32
+ filter the Qodo bot's comments, dedup by stable comment identity (id/url),
33
+ reply, acknowledge. The agent owns: reading the flagged files, generating a
34
+ fix, editing, and committing.
35
+
36
+ ## Resolved contract — `qodo-get-rules`
37
+
38
+ - **Config:** `~/.qodo/config.json`. Keys: `API_KEY` (env `QODO_API_KEY` wins),
39
+ `ENVIRONMENT_NAME` (env `QODO_ENVIRONMENT_NAME` wins), `QODO_API_URL` (optional
40
+ override). Absent config is not fatal if `QODO_API_KEY` is set; otherwise it is
41
+ an environment error — the CLI never prompts for credentials.
42
+ - **Base URL:** `QODO_API_URL` → `{url}/rules/v1`. Otherwise by environment:
43
+ empty → `https://qodo-platform.qodo.ai/rules/v1`, else
44
+ `https://qodo-platform.<env>.qodo.ai/rules/v1` (e.g. `staging`, `qodost.st`).
45
+ - **Endpoint:** `POST {base}/rules/search`.
46
+ - **Headers:** `Authorization: Bearer <API_KEY>`, `request-id` (a per-call UUID),
47
+ `qodo-client-type` (telemetry; we send `qodo-cli`), optional `trace_id` (from
48
+ `TRACE_ID`).
49
+ - **Request body:** `{"query": <str>, "top_k": <int>, "scopes": [<str>]}`.
50
+ `scopes` is omitted entirely when empty (never `null` / `[]`). `top_k`
51
+ defaults to `20`.
52
+ - **Response:** `{"rules": [{"id", "name", "content", "severity"}]}`, ranked by
53
+ relevance (most relevant first). Severity is one of `ERROR`, `WARNING`,
54
+ `RECOMMENDATION`.
55
+
56
+ ## Resolved contract — `qodo-pr-resolver`
57
+
58
+ - **Qodo bot logins:** `qodo-merge`, `qodo-ai`, `pr-agent-pro`,
59
+ `pr-agent-pro-staging` (from the skill), plus `qodo-code-review` (observed
60
+ live on GitHub — the login the current Qodo reviewer posts under). Matched as
61
+ base names: `gh pr view --json comments` returns the login **without** `[bot]`
62
+ while `gh api` returns it **with** `[bot]`, so the suffix is normalised before
63
+ matching. (Gerrit: comments tagged `autogenerated:qodo`.)
64
+ - **Comment surfaces:** the summary arrives as PR-level **issue comments**
65
+ (`gh pr view --json comments`) and per-issue **inline review comments**
66
+ (`gh api .../pulls/<pr>/comments`). We deliberately do **not** fetch
67
+ `pulls/<pr>/reviews` — the skill documents only the two surfaces above, and
68
+ the reviews endpoint was empty on a live Qodo-reviewed PR.
69
+ - **Provider detection:** `git remote get-url origin`, matched against the host.
70
+ - **Provider detection upgrade (GitHub Enterprise):** `github.com` classifies as
71
+ GitHub directly. Any other host that is *unknown* to the well-known-host map is
72
+ re-checked against `gh auth status --hostname <host>` — if `gh` is
73
+ authenticated to it, it is treated as a GitHub Enterprise host (we don't guess
74
+ GHE hostnames). **Implemented but NOT live-tested** against a real GHE instance
75
+ (we have none); covered by mocked tests only.
76
+ - **GitHub (wired now), via `gh`:**
77
+ - find PR: `gh pr list --head <branch> --state open --json number,title,url`
78
+ - summary comments: `gh pr view <pr> --json comments`
79
+ - inline comments: `gh api repos/{owner}/{repo}/pulls/<pr>/comments --paginate`
80
+ - reply: `gh api repos/{owner}/{repo}/pulls/<pr>/comments/<id>/replies -X POST -f body=<text>`
81
+ - acknowledge: `gh api repos/{owner}/{repo}/pulls/comments/<id>/reactions -X POST -f content='+1'`
82
+
83
+ ### Follow-up providers (recognised, not yet wired)
84
+
85
+ These are captured from `resources/providers.md` so wiring them is a lookup, not
86
+ a re-investigation. Today the CLI raises a clear "not wired yet" error for them.
87
+
88
+ - **GitLab (`glab`):** find `glab mr list --source-branch <branch>`; fetch
89
+ `glab mr view <iid> --comments`; reply / resolve via
90
+ `glab api /projects/:id/merge_requests/<iid>/discussions/...`.
91
+ - **Azure DevOps (`az`):** find `az repos pr list --source-branch <branch> --status active`;
92
+ fetch / reply / resolve via `az devops invoke --resource pullRequestThreads`.
93
+ - **Bitbucket (`curl`):** REST under
94
+ `api.bitbucket.org/2.0/repositories/<ws>/<repo>/pullrequests/<id>/comments`.
95
+ - **Gerrit:** detect via `.gitreview` / port `29418` / `googlesource.com`; push
96
+ `git push origin HEAD:refs/for/<branch>`.
97
+
98
+ True GitHub review-thread resolution (the GraphQL `resolveReviewThread`
99
+ mutation) is also a follow-up; today `resolve` posts the `+1` reaction the
100
+ upstream skill uses as a lightweight acknowledgement.
101
+
102
+ ## Non-goals (enforced)
103
+
104
+ - No `qodo skills` verb and no `npx skills add` wrapper — skills are cited as a
105
+ spec, never shipped, installed, or forked.
106
+ - No reimplementation of Qodo's server-side analysis.
107
+ - `qodo rules` does not implement an interactive login — it reuses existing
108
+ credentials and errors when they are absent.
109
+
110
+ ## Re-sync procedure
111
+
112
+ 1. Re-fetch the upstream `SKILL.md` and the `references/` / `resources/` files
113
+ listed in the verb↔skill map above.
114
+ 2. Diff the resolved contract in this file against them (endpoint, headers,
115
+ request/response schema, bot logins, provider commands).
116
+ 3. Update `qodo/cli/_qodo_api.py` / `qodo/cli/_providers.py` and this ledger
117
+ together, then bump the version.
@@ -0,0 +1,45 @@
1
+ # qodo-cli now does Qodo's two core jobs natively from your terminal, in zero-dependency Python: 'qodo rules' surfaces your org's coding rules by semantic search (reading your existing ~/.qodo/config.json API key), and 'qodo review' (a.k.a. 'qodo pr') triages and resolves the Qodo bot's PR review comments through your existing provider CLIs (gh/glab/az). Each verb cites the official qodo-ai/qodo-skills as its behavioral source of truth — we point at the skills as the spec; we do not fork, vendor, or npx-install them. A dedicated auth/config verb and repos/agents commands are explicit follow-ups.
2
+
3
+ > qodo-cli now does Qodo's two core jobs natively from your terminal, in zero-dependency Python: 'qodo rules' surfaces your org's coding rules by semantic search (reading your existing ~/.qodo/config.json API key), and 'qodo review' (a.k.a. 'qodo pr') triages and resolves the Qodo bot's PR review comments through your existing provider CLIs (gh/glab/az). Each verb cites the official qodo-ai/qodo-skills as its behavioral source of truth — we point at the skills as the spec; we do not fork, vendor, or npx-install them. A dedicated auth/config verb and repos/agents commands are explicit follow-ups.
4
+
5
+ ## Audience
6
+
7
+ - Developers and AI coding agents with a Qodo subscription who want one terminal-native, zero-dependency CLI for Qodo's domain — rules and PR review — instead of juggling per-agent skill installs (npx skills add) and the Qodo web app.
8
+
9
+ ## Before → After
10
+
11
+ - Before: Qodo's capabilities are reachable today only through (a) the per-agent skills in qodo-ai/qodo-skills, installed ad-hoc via 'npx skills add' / the Claude marketplace, and (b) the Qodo web app. qodo-cli has no Qodo surface yet — it is still the agent-first introspection scaffold (whoami/learn/explain/doctor).
12
+ - After: 'qodo' exposes two Qodo verbs as native command groups — 'rules' (get) and 'review'/'pr' (list, resolve) — each documenting which upstream skill it derives from. 'rules' calls the Qodo API using the API key already in ~/.qodo/config.json; 'review' drives the user's existing provider CLIs (gh/glab/az) to read and resolve the Qodo bot's PR comments. There is no meta 'skills' verb; a dedicated auth/config verb is deferred to follow-up.
13
+
14
+ ## Why it matters
15
+
16
+ - qodo-cli's stated domain is managing Qodo. Reimplementing the skills' behavior as native zero-dep commands — while citing qodo-ai/qodo-skills as the canonical spec — gives one consistent CLI across agents, removes Node/npx + per-agent-install friction, and keeps upstream as the source of truth we point at rather than a fork that drifts.
17
+
18
+ ## Requirements
19
+
20
+ - qodo-cli reuses the skills' existing credentials as-is — ~/.qodo/config.json (API key + environment) for 'rules' and the user's already-working provider-CLI auth (gh/glab/az) for 'review' — introducing no new config format or auth flow.
21
+ - honesty: On a machine where the skills already work, 'qodo rules' reads the same ~/.qodo/config.json keys with no migration, and 'qodo review' reuses the existing provider-CLI auth — neither prompts for new credentials.
22
+ - Each verb maps 1:1 to a cited upstream skill: 'qodo rules' <- qodo-get-rules (POST /rules/search, severity ERROR/WARNING/RECOMMENDATION); 'qodo review'/'pr' <- qodo-pr-resolver (provider-CLI fetch of Qodo bot comments, dedup, fix, reply, resolve threads, push).
23
+ - honesty: The 1:1 verb<-skill mapping is checkable against the upstream SKILL.md scripts: the endpoints, severity labels, and provider-CLI calls match what those scripts do.
24
+
25
+ ## Honesty conditions
26
+
27
+ - Behavioral parity is verifiable: for a given input, 'qodo rules'/'qodo review' make equivalent API/provider-CLI calls and apply the same severity mapping as the cited upstream skill.
28
+ - Audience is reachable: a Qodo subscriber can run 'qodo rules' / 'qodo review' on a machine that already has ~/.qodo/config.json (rules) and gh/glab/az (review), with no Qodo-side setup beyond what the skills already require.
29
+ - Before-state is checkable: 'git grep' in qodo-cli finds no rules/review command surface today, and the only ways to reach these Qodo behaviors are the upstream skills (npx skills add) and the Qodo web app.
30
+ - Benefit is observable: a user gets identical Qodo behavior from 'qodo ...' with no Node/npx or per-agent skill install, and upstream qodo-ai/qodo-skills stays the single cited source (no forked copy lives in this repo).
31
+ - Every native verb's --help/docs names the upstream skill it cites (qodo-get-rules / qodo-pr-resolver) and the API endpoint or provider CLI it uses.
32
+ - Non-goals are enforceable: the shipped CLI has no 'skills' verb and no npx invocation, 'qodo rules' errors (not prompts) when ~/.qodo/config.json is absent, and nothing in the repo vendors or forks upstream skill content.
33
+ - Parity is demonstrable on a fixture: for a known task input 'qodo rules get' returns the same severity-ranked rules qodo-get-rules yields from the same API response; for a PR with known Qodo comments 'qodo review list' enumerates the same comments qodo-pr-resolver would.
34
+
35
+ ## Success signals
36
+
37
+ - With a valid ~/.qodo/config.json, 'qodo rules get "<task>"' returns the same severity-ranked rules qodo-get-rules would; and on a repo with open Qodo PR comments, 'qodo review' lists and resolves the same comments qodo-pr-resolver would — behavioral parity with both cited skills from one zero-dep CLI.
38
+
39
+ ## Scope / boundaries
40
+
41
+ - Non-goals: no 'qodo skills' verb and no npx-skills wrapper (skills are cited as spec, not shipped/installed/forked); no dedicated auth/config or repos/agents verbs in this slice (follow-ups); no reimplementation of Qodo's server-side analysis; not a general Agent-Skills package manager. 'qodo rules' requires a pre-existing ~/.qodo/config.json and does not implement an interactive login.
42
+
43
+ ## Open / follow-up
44
+
45
+ - Dedicated 'qodo auth'/'qodo config' verb, repos-level commands, and Qodo agents management are future scope ('and more'), not built in this first slice.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "qodo-cli"
3
- version = "0.3.2"
3
+ version = "0.4.0"
4
4
  description = "Community CLI and agent to manage Qodo — the AI code reviewer and Qodo's other agents (requires a Qodo subscription). Unofficial: not affiliated with, authorized, or endorsed by Qodo; the Qodo name and trademark belong to Qodo Ltd."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -67,11 +67,13 @@ def _build_parser() -> argparse.ArgumentParser:
67
67
  from qodo.cli._commands import explain as _explain_cmd
68
68
  from qodo.cli._commands import learn as _learn_cmd
69
69
  from qodo.cli._commands import overview as _overview_cmd
70
+ from qodo.cli._commands import review as _review_group
71
+ from qodo.cli._commands import rules as _rules_group
70
72
  from qodo.cli._commands import whoami as _whoami_cmd
71
73
 
72
74
  parser = _CliArgumentParser(
73
75
  prog="qodo-cli",
74
- description="qodo-cli — a clonable template for AgentCulture mesh agents.",
76
+ description="qodo-cli — an unofficial community CLI to manage Qodo (rules + PR review).",
75
77
  )
76
78
  parser.add_argument(
77
79
  "--version",
@@ -82,13 +84,17 @@ def _build_parser() -> argparse.ArgumentParser:
82
84
  # through _CliArgumentParser too.
83
85
  sub = parser.add_subparsers(dest="command", parser_class=_CliArgumentParser)
84
86
 
87
+ # Qodo domain noun groups (the real surface):
88
+ _rules_group.register(sub)
89
+ _review_group.register(sub)
90
+ # Agent-first introspection verbs:
85
91
  _whoami_cmd.register(sub)
86
92
  _learn_cmd.register(sub)
87
93
  _explain_cmd.register(sub)
88
94
  _overview_cmd.register(sub)
89
95
  _doctor_cmd.register(sub)
90
96
  _cli_group.register(sub)
91
- # Register your own noun groups here:
97
+ # Register further noun groups here, following the rules/review pattern:
92
98
  # from qodo.cli._commands import my_noun as _my_noun_group
93
99
  # _my_noun_group.register(sub)
94
100
 
@@ -11,6 +11,7 @@ from __future__ import annotations
11
11
  import argparse
12
12
 
13
13
  from qodo.cli._commands.overview import cli_sections, emit_overview
14
+ from qodo.cli._output import add_json_flag
14
15
 
15
16
 
16
17
  def cmd_cli_overview(args: argparse.Namespace) -> int:
@@ -32,12 +33,12 @@ def register(sub: argparse._SubParsersAction) -> None:
32
33
  "cli",
33
34
  help="CLI-surface introspection (see 'qodo-cli cli overview').",
34
35
  )
35
- p.add_argument("--json", action="store_true", help="Emit structured JSON.")
36
+ add_json_flag(p)
36
37
  p.set_defaults(func=_no_verb, json=False)
37
38
  # `p` is a _CliArgumentParser (the top-level subparsers were built with that
38
39
  # parser_class); propagate it so `cli overview` parse errors route through
39
40
  # the structured error contract instead of argparse's default stderr/exit 2.
40
41
  noun_sub = p.add_subparsers(dest="cli_command", parser_class=type(p))
41
42
  ov = noun_sub.add_parser("overview", help="Describe the qodo-cli CLI surface.")
42
- ov.add_argument("--json", action="store_true", help="Emit structured JSON.")
43
+ add_json_flag(ov)
43
44
  ov.set_defaults(func=cmd_cli_overview)
@@ -22,7 +22,7 @@ from __future__ import annotations
22
22
  import argparse
23
23
 
24
24
  from qodo.cli._commands.whoami import find_culture_yaml, read_agent_fields
25
- from qodo.cli._output import emit_result
25
+ from qodo.cli._output import add_json_flag, emit_result
26
26
 
27
27
  # backend → required prompt file (the backend-consistency mapping).
28
28
  _PROMPT_FILE = {
@@ -120,5 +120,5 @@ def register(sub: argparse._SubParsersAction) -> None:
120
120
  "doctor",
121
121
  help="Check the agent-identity invariants (prompt-file-present, backend-consistency).",
122
122
  )
123
- p.add_argument("--json", action="store_true", help="Emit structured JSON.")
123
+ add_json_flag(p)
124
124
  p.set_defaults(func=cmd_doctor)
@@ -9,7 +9,7 @@ from __future__ import annotations
9
9
 
10
10
  import argparse
11
11
 
12
- from qodo.cli._output import emit_result
12
+ from qodo.cli._output import add_json_flag, emit_result
13
13
  from qodo.explain import resolve
14
14
 
15
15
 
@@ -34,5 +34,5 @@ def register(sub: argparse._SubParsersAction) -> None:
34
34
  nargs="*",
35
35
  help="Command path tokens; empty = root (same as 'qodo-cli').",
36
36
  )
37
- p.add_argument("--json", action="store_true", help="Emit structured JSON.")
37
+ add_json_flag(p)
38
38
  p.set_defaults(func=cmd_explain)
@@ -9,26 +9,33 @@ from __future__ import annotations
9
9
  import argparse
10
10
 
11
11
  from qodo import __version__
12
- from qodo.cli._output import emit_result
12
+ from qodo.cli._output import add_json_flag, emit_result
13
13
 
14
14
  _TEXT = """\
15
- qodo-cli — a clonable template for AgentCulture mesh agents.
15
+ qodo-cli — an unofficial, community CLI to manage Qodo from your terminal.
16
16
 
17
17
  Purpose
18
18
  -------
19
- Scaffold for a new Culture mesh agent: an agent-first CLI (cited from the teken
20
- `python-cli` reference), an identity (culture.yaml + CLAUDE.md), the canonical
21
- guildmaster skill kit under .claude/skills/, and a deploy/CI baseline. Clone it,
22
- rename the package, and edit culture.yaml to mint a new agent.
19
+ Run Qodo's core jobs natively, in zero-dependency Python. `qodo rules` surfaces
20
+ your org's coding rules by semantic search (reusing the API key already in
21
+ ~/.qodo/config.json); `qodo review` (a.k.a. `qodo pr`) triages and resolves the
22
+ Qodo bot's PR review comments through your existing provider CLI (gh). Each verb
23
+ cites qodo-ai/qodo-skills as its behavioral source of truth — we point at the
24
+ skills, we do not fork, vendor, or npx-install them. Unofficial: not affiliated
25
+ with, authorized, or endorsed by Qodo.
23
26
 
24
27
  Commands
25
28
  --------
26
- qodo-cli whoami Identity from culture.yaml.
27
- qodo-cli learn This self-teaching prompt.
28
- qodo-cli explain <path>... Markdown docs for any noun/verb path.
29
- qodo-cli overview Descriptive snapshot of the agent.
30
- qodo-cli doctor Check the agent-identity invariants.
31
- qodo-cli cli overview Describe the CLI surface itself.
29
+ qodo-cli rules get "<query>" Semantic-search your org's Qodo rules.
30
+ qodo-cli review list List the Qodo bot's PR review comments.
31
+ qodo-cli review resolve <id> Reply to and acknowledge a Qodo comment.
32
+ qodo-cli pr ... Alias for `review`.
33
+ qodo-cli whoami Identity from culture.yaml.
34
+ qodo-cli learn This self-teaching prompt.
35
+ qodo-cli explain <path>... Markdown docs for any noun/verb path.
36
+ qodo-cli overview Descriptive snapshot of the agent.
37
+ qodo-cli doctor Check the agent-identity invariants.
38
+ qodo-cli cli overview Describe the CLI surface itself.
32
39
 
33
40
  Machine-readable output
34
41
  -----------------------
@@ -39,12 +46,13 @@ Exit-code policy
39
46
  ----------------
40
47
  0 success
41
48
  1 user-input error (bad flag, bad path, missing arg)
42
- 2 environment / setup error
49
+ 2 environment / setup error (missing ~/.qodo/config.json, gh absent, API error)
43
50
  3+ reserved
44
51
 
45
52
  More detail
46
53
  -----------
47
- qodo-cli explain qodo-cli
54
+ qodo-cli explain rules
55
+ qodo-cli explain review
48
56
  """
49
57
 
50
58
 
@@ -52,8 +60,11 @@ def _as_json_payload() -> dict[str, object]:
52
60
  return {
53
61
  "tool": "qodo-cli",
54
62
  "version": __version__,
55
- "purpose": "Clonable scaffold for a new AgentCulture mesh agent.",
63
+ "purpose": "Unofficial community CLI to manage Qodo (rules + PR review).",
56
64
  "commands": [
65
+ {"path": ["rules", "get"], "summary": "Semantic-search your org's Qodo rules."},
66
+ {"path": ["review", "list"], "summary": "List the Qodo bot's PR comments."},
67
+ {"path": ["review", "resolve"], "summary": "Reply to / acknowledge a comment."},
57
68
  {"path": ["whoami"], "summary": "Identity probe from culture.yaml."},
58
69
  {"path": ["learn"], "summary": "Self-teaching prompt."},
59
70
  {"path": ["explain"], "summary": "Markdown docs by path."},
@@ -84,5 +95,5 @@ def register(sub: argparse._SubParsersAction) -> None:
84
95
  "learn",
85
96
  help="Print a structured self-teaching prompt for agent consumers.",
86
97
  )
87
- p.add_argument("--json", action="store_true", help="Emit structured JSON.")
98
+ add_json_flag(p)
88
99
  p.set_defaults(func=cmd_learn)