qodo-cli 0.3.2__tar.gz → 0.5.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 (87) hide show
  1. qodo_cli-0.5.0/.devague/current +1 -0
  2. qodo_cli-0.5.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.5.0}/.gitignore +3 -0
  4. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.markdownlint-cli2.yaml +3 -0
  5. qodo_cli-0.5.0/.pr_agent.toml +26 -0
  6. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/CHANGELOG.md +71 -0
  7. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/PKG-INFO +1 -1
  8. qodo_cli-0.5.0/best_practices.md +59 -0
  9. qodo_cli-0.5.0/docs/qodo-skills-sources.md +117 -0
  10. qodo_cli-0.5.0/docs/specs/2026-06-16-qodo-cli-now-does-qodo-s-two-core-jobs-natively-fr.md +45 -0
  11. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/pyproject.toml +1 -1
  12. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/cli/__init__.py +8 -2
  13. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/cli/_commands/cli.py +3 -2
  14. qodo_cli-0.5.0/qodo/cli/_commands/doctor.py +262 -0
  15. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/cli/_commands/explain.py +2 -2
  16. qodo_cli-0.5.0/qodo/cli/_commands/learn.py +99 -0
  17. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/cli/_commands/overview.py +65 -4
  18. qodo_cli-0.5.0/qodo/cli/_commands/review.py +139 -0
  19. qodo_cli-0.5.0/qodo/cli/_commands/rules.py +98 -0
  20. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/cli/_commands/whoami.py +2 -2
  21. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/cli/_output.py +14 -0
  22. qodo_cli-0.5.0/qodo/cli/_providers.py +333 -0
  23. qodo_cli-0.5.0/qodo/cli/_qodo_api.py +198 -0
  24. qodo_cli-0.5.0/qodo/explain/catalog.py +213 -0
  25. qodo_cli-0.5.0/tests/test_cli_introspection.py +197 -0
  26. qodo_cli-0.5.0/tests/test_review.py +372 -0
  27. qodo_cli-0.5.0/tests/test_rules.py +196 -0
  28. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/uv.lock +1 -1
  29. qodo_cli-0.3.2/qodo/cli/_commands/doctor.py +0 -124
  30. qodo_cli-0.3.2/qodo/cli/_commands/learn.py +0 -88
  31. qodo_cli-0.3.2/qodo/explain/catalog.py +0 -133
  32. qodo_cli-0.3.2/tests/test_cli_introspection.py +0 -106
  33. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/agent-config/SKILL.md +0 -0
  34. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  35. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
  36. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
  37. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  38. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  39. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  40. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  41. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  42. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  43. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/cicd/SKILL.md +0 -0
  44. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  45. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  46. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  47. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  48. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  49. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/communicate/SKILL.md +0 -0
  50. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  51. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  52. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  53. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  54. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  55. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  56. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  57. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  58. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  59. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  60. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/run-tests/SKILL.md +0 -0
  61. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  62. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
  63. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  64. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  65. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  66. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/think/SKILL.md +0 -0
  67. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/think/scripts/think.sh +0 -0
  68. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/version-bump/SKILL.md +0 -0
  69. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
  70. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.claude/skills.local.yaml.example +0 -0
  71. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.flake8 +0 -0
  72. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.github/workflows/publish.yml +0 -0
  73. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/.github/workflows/tests.yml +0 -0
  74. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/AGENTS.colleague.md +0 -0
  75. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/CLAUDE.md +0 -0
  76. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/LICENSE +0 -0
  77. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/README.md +0 -0
  78. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/culture.yaml +0 -0
  79. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/docs/skill-sources.md +0 -0
  80. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/__init__.py +0 -0
  81. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/__main__.py +0 -0
  82. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/cli/_commands/__init__.py +0 -0
  83. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/cli/_errors.py +0 -0
  84. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/qodo/explain/__init__.py +0 -0
  85. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/sonar-project.properties +0 -0
  86. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/tests/__init__.py +0 -0
  87. {qodo_cli-0.3.2 → qodo_cli-0.5.0}/tests/test_cli.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/**"
@@ -0,0 +1,26 @@
1
+ # Qodo Merge / PR-Agent configuration for qodo-cli.
2
+ # Docs: https://docs.qodo.ai/qodo-documentation/qodo-merge/configuration/configuration-file
3
+ #
4
+ # Kept minimal on purpose (per Qodo's guidance: only override what you need).
5
+ # The repo's coding conventions live in best_practices.md at the root, which the
6
+ # reviewer auto-references; this file just reinforces a few intentional patterns
7
+ # that an earlier review flagged as false positives.
8
+
9
+ [pr_reviewer]
10
+ extra_instructions = """
11
+ qodo-cli is an unofficial, community CLI to manage Qodo, built as a
12
+ zero-runtime-dependency, stdlib-only Python package. Intentional patterns (do
13
+ not flag these as issues):
14
+ - Command handlers return a bare 0/1/None for the exit code. The EXIT_* constants
15
+ in qodo/cli/_errors.py are for CliError codes (the failure path), not for
16
+ handler return values. `return 0` in a handler is intentional and consistent
17
+ across every command.
18
+ - Nested argparse subparsers inherit the structured-error parser class via
19
+ `add_subparsers(parser_class=type(p))` (see qodo/cli/_commands/cli.py). Passing
20
+ `type(p)` is the established idiom and is equivalent to naming
21
+ `_CliArgumentParser` directly — it is not a missing parser_class.
22
+ - `qodo review resolve --reply` drives the user's own `gh` with their own auth;
23
+ the reply text belongs to the caller, so the tool must not auto-append an agent
24
+ signature.
25
+ See best_practices.md at the repo root for the full conventions.
26
+ """
@@ -5,6 +5,77 @@ 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.5.0] - 2026-06-17
9
+
10
+ ### Added
11
+
12
+ - `.pr_agent.toml` + `best_practices.md` at the repo root — the Qodo Merge
13
+ reviewer config (cite, don't fork). They codify this repo's intentional
14
+ patterns (bare `return 0` handlers, `parser_class=type(p)` subparser nesting,
15
+ the mechanics-only `review resolve --reply`) so Qodo reviews accurately and
16
+ stops raising them as violations.
17
+ - `qodo doctor` now also checks **Qodo setup**, against the current git repo:
18
+ `.pr_agent.toml` present, `best_practices.md` present, and whether a usable
19
+ Qodo API key is resolvable for `qodo rules` — `QODO_API_KEY`, else a non-empty
20
+ `API_KEY` in `~/.qodo/config.json` (a present-but-keyless or malformed file
21
+ fails the check with guidance, and never throws). These are advisory and each
22
+ carries a `remediation` that guides an agent through setup. Runs in any repo
23
+ (not just a source checkout). (Addresses #7.)
24
+
25
+ ### Changed
26
+
27
+ - `qodo doctor` `healthy` now depends on **error**-severity checks only;
28
+ `warning`/`info` checks surface guidance without flipping `healthy` or the
29
+ exit code. Fixes the `claude → CLAUDE.md` drift in the `doctor` explain entry
30
+ (this repo's backend is `colleague` → `AGENTS.colleague.md`).
31
+ - `learn` now describes `doctor` as "agent-identity invariants + Qodo setup" in
32
+ both its text and JSON payload, matching `overview` and the explain catalog
33
+ (self-description stays consistent across the introspection surfaces).
34
+
35
+ ## [0.4.0] - 2026-06-17
36
+
37
+ ### Added
38
+
39
+ - First real Qodo-management surface — two native, zero-dependency noun groups,
40
+ each citing `qodo-ai/qodo-skills` as its behavioral source of truth (cite,
41
+ don't fork/vendor/npx):
42
+ - `qodo rules get "<query>"` — semantic-search your org's Qodo coding rules.
43
+ Reimplements `qodo-get-rules` over the stdlib (`urllib`): reads the API key
44
+ already in `~/.qodo/config.json` (env `QODO_API_KEY`/`QODO_ENVIRONMENT_NAME`/
45
+ `QODO_API_URL` win), POSTs `{base}/rules/search`, and prints the
46
+ relevance-ranked rules with `ERROR`/`WARNING`/`RECOMMENDATION` severity.
47
+ Errors (never prompts) when no credentials are present.
48
+ - `qodo review` (alias `qodo pr`) — `list` and `resolve` the Qodo bot's PR
49
+ review comments. Reimplements `qodo-pr-resolver` by driving the user's
50
+ existing provider CLI (`gh`): detect provider, find the open PR for the
51
+ branch, fetch and filter the Qodo bot's comments (`qodo-code-review`,
52
+ `qodo-merge`, `qodo-ai`, `pr-agent-pro(-staging)` — matched as base names so
53
+ both gh `[bot]`-suffix spellings hit), dedup by stable comment identity
54
+ (id/url) so distinct same-badge inline comments never collapse, reply, and
55
+ acknowledge (`+1`). GitHub is wired — including GitHub Enterprise, recognised
56
+ via your `gh` host config (`gh auth status --hostname`) rather than hostname
57
+ guessing (implemented but not live-tested against a real GHE instance);
58
+ GitLab/Azure/Bitbucket/Gerrit are recognised but raise a clear "not wired
59
+ yet" error.
60
+ - `qodo/cli/_qodo_api.py` and `qodo/cli/_providers.py` — the zero-dep mechanics
61
+ behind the two verbs (stdlib `urllib` / `subprocess` only).
62
+ - `docs/qodo-skills-sources.md` — the Qodo-skills citation ledger: verb↔skill
63
+ map, the resolved API/provider contract, follow-up providers, and a re-sync
64
+ procedure.
65
+ - `docs/specs/…-qodo-cli-now-does-qodo-s-two-core-jobs-natively-fr.md` — the
66
+ converged `/think` spec this slice was built from.
67
+
68
+ ### Changed
69
+
70
+ - `learn`, `overview`, the explain catalog root, and the parser description now
71
+ describe the real Qodo surface instead of self-describing as "a clonable
72
+ template" (the drift CLAUDE.md flagged); `overview`'s artifact list now names
73
+ `AGENTS.colleague.md` (the colleague-backend prompt file) rather than
74
+ `CLAUDE.md`.
75
+ - `.markdownlint-cli2.yaml` ignores `docs/specs/**` — devague-exported specs are
76
+ generated artifacts (verbatim-announcement H1, literal `<placeholders>`) and
77
+ are not reformatted, mirroring the vendored-skills exclusion.
78
+
8
79
  ## [0.3.2] - 2026-06-16
9
80
 
10
81
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qodo-cli
3
- Version: 0.3.2
3
+ Version: 0.5.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,59 @@
1
+ # Best practices for qodo-cli
2
+
3
+ Repository-specific coding standards for the Qodo reviewer — and for any agent
4
+ working in this repo. `qodo-cli` is an unofficial, community CLI to manage Qodo,
5
+ built as a **zero-runtime-dependency, stdlib-only** Python package.
6
+
7
+ These conventions are pinned by the test suite and the agent-first rubric
8
+ (`teken cli doctor . --strict`); please review against them rather than against
9
+ generic defaults.
10
+
11
+ ## Dependencies
12
+
13
+ - Runtime dependencies must stay empty (`dependencies = []` in `pyproject.toml`).
14
+ Use only the Python standard library at runtime, and flag any new third-party
15
+ runtime import. `teken` and the lint/test tools are dev-only.
16
+
17
+ ## Exit codes
18
+
19
+ - Command handlers return a bare `0` / `1` / `None` for their exit code (`0` is
20
+ success). The `EXIT_*` constants in `qodo/cli/_errors.py` are for `CliError`
21
+ codes on the failure path, **not** for handler return values. A bare
22
+ `return 0` in a handler is intentional and consistent across every command —
23
+ do not flag it as a magic number.
24
+
25
+ ## Errors and output
26
+
27
+ - Every failure raises `CliError(code, message, remediation)`; no Python
28
+ traceback may leak to stderr. Text-mode errors render `error: <msg>` then
29
+ `hint: <remediation>` (the `hint:` prefix is required).
30
+ - Results go to stdout; errors and diagnostics go to stderr. Never mix the two,
31
+ in text or `--json` mode. Every command supports `--json`.
32
+
33
+ ## argparse
34
+
35
+ - Build subparsers with the structured-error parser class. Nested subparsers
36
+ inherit it via `add_subparsers(parser_class=type(p))` (see
37
+ `qodo/cli/_commands/cli.py`); passing `type(p)` is the established idiom and is
38
+ equivalent to naming `_CliArgumentParser` directly — it is not a missing
39
+ `parser_class`.
40
+ - Add the standard `--json` flag with `add_json_flag()` from `qodo.cli._output`
41
+ rather than re-declaring the literal.
42
+
43
+ ## The CLI is mechanics-only
44
+
45
+ - `qodo review resolve --reply` drives the user's own `gh` with their own auth;
46
+ the reply text belongs to the caller. The tool must not auto-append an agent
47
+ signature — that would mis-attribute human-authored replies. Signing is the
48
+ caller's responsibility (an opt-in flag may be added later).
49
+
50
+ ## Cite, don't import
51
+
52
+ - Behavior derived from `qodo-ai/qodo-skills` and the vendored `.claude/skills/`
53
+ kit is cited as the source of truth, not forked or vendored into runtime code.
54
+ Keep `docs/qodo-skills-sources.md` in sync when the upstream contract changes.
55
+
56
+ ## Keep the self-description in sync
57
+
58
+ - When adding a command, update `learn`, `overview`, and the explain catalog so
59
+ the rubric and the self-describing text stay consistent.
@@ -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.5.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)