qodo-cli 0.3.1__tar.gz → 0.3.2__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.
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/CHANGELOG.md +13 -0
- qodo_cli-0.3.2/CLAUDE.md +180 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/PKG-INFO +1 -1
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/pyproject.toml +1 -1
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/explain/catalog.py +4 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/tests/test_cli.py +8 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/uv.lock +1 -1
- qodo_cli-0.3.1/CLAUDE.md +0 -28
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/agent-config/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/cicd/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/run-tests/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/think/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/think/scripts/think.sh +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/version-bump/SKILL.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills.local.yaml.example +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.flake8 +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.github/workflows/publish.yml +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.github/workflows/tests.yml +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.gitignore +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/.markdownlint-cli2.yaml +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/AGENTS.colleague.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/LICENSE +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/README.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/culture.yaml +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/docs/skill-sources.md +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/__init__.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/__main__.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/__init__.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_commands/__init__.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_commands/cli.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_commands/doctor.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_commands/explain.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_commands/learn.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_commands/overview.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_commands/whoami.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_errors.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/cli/_output.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/qodo/explain/__init__.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/sonar-project.properties +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/tests/__init__.py +0 -0
- {qodo_cli-0.3.1 → qodo_cli-0.3.2}/tests/test_cli_introspection.py +0 -0
|
@@ -5,6 +5,19 @@ 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.3.2] - 2026-06-16
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- `explain` now resolves the console-script name `qodo` (not only the dist name
|
|
13
|
+
`qodo-cli`), so the agent-first rubric's `explain <self>` check passes — the
|
|
14
|
+
rubric derives the self-token from `[project.scripts]` (`qodo`). Pinned by a
|
|
15
|
+
regression test.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- CLAUDE.md: re-initialized from the seed placeholder into a full runtime prompt via /init — documents the agent-first CLI dispatch/contracts, the rubric gate, colleague-backend mesh identity (AGENTS.colleague.md), vendored-skill provenance, version-bump-every-PR + cicd PR lane, and the add-a-command/rename procedures. Flags known drift where stale text still says backend: claude and that the console script is qodo (not qodo-cli).
|
|
20
|
+
|
|
8
21
|
## [0.3.1] - 2026-06-13
|
|
9
22
|
|
|
10
23
|
### Changed
|
qodo_cli-0.3.2/CLAUDE.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## What this is
|
|
6
|
+
|
|
7
|
+
**qodo-cli** — an unofficial, community CLI and agent to manage **Qodo** (the AI
|
|
8
|
+
code reviewer and Qodo's other agents; requires a Qodo subscription). Not
|
|
9
|
+
affiliated with, authorized, or endorsed by Qodo; the Qodo name and trademark
|
|
10
|
+
belong to Qodo Ltd.
|
|
11
|
+
|
|
12
|
+
**Current reality vs. intended domain.** The intended domain is managing Qodo,
|
|
13
|
+
but no Qodo-management surface exists yet. Today the runtime is still the
|
|
14
|
+
**agent-first scaffold** cited from teken's `afi-cli` `python-cli` reference: a
|
|
15
|
+
self-describing introspection CLI (`whoami`, `learn`, `explain`, `overview`,
|
|
16
|
+
`doctor`, `cli`). Several artifacts still self-describe this repo as "a clonable
|
|
17
|
+
template" (the `learn`/`explain`/`overview` text, the README "Make it your own"
|
|
18
|
+
section). When you build the actual Qodo surface, add it as new noun groups (see
|
|
19
|
+
*Adding a command*) and update that self-describing text to match.
|
|
20
|
+
|
|
21
|
+
The runtime has **zero third-party dependencies** (`dependencies = []` in
|
|
22
|
+
`pyproject.toml`); `teken` is a dev-only dependency used by the rubric gate.
|
|
23
|
+
Requires Python ≥ 3.12.
|
|
24
|
+
|
|
25
|
+
## Commands
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
uv sync # install runtime + dev deps into .venv
|
|
29
|
+
uv run qodo whoami # run the CLI (console script is `qodo`)
|
|
30
|
+
uv run pytest -n auto # full test suite, parallel (xdist)
|
|
31
|
+
uv run pytest tests/test_cli.py::test_whoami_text # a single test
|
|
32
|
+
uv run teken cli doctor . --strict # the agent-first rubric gate CI enforces
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
> The installed console script is **`qodo`**, even though the dist/package is
|
|
36
|
+
> `qodo-cli` and the CLI identifies itself (argparse `prog`) as `qodo-cli`.
|
|
37
|
+
> `uv run qodo …`, not `uv run qodo-cli …` (the README example is wrong).
|
|
38
|
+
|
|
39
|
+
Lint (CI runs each of these; all must pass):
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
uv run black --check qodo tests
|
|
43
|
+
uv run isort --check-only qodo tests
|
|
44
|
+
uv run flake8 qodo tests
|
|
45
|
+
uv run bandit -c pyproject.toml -r qodo
|
|
46
|
+
markdownlint-cli2 "**/*.md" "#node_modules" "#.local" "#.claude/skills" "#.teken"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Black/isort/flake8 all use line length 100. Bandit skips B101/B404/B603.
|
|
50
|
+
|
|
51
|
+
## Architecture
|
|
52
|
+
|
|
53
|
+
### CLI dispatch (`qodo/cli/`)
|
|
54
|
+
|
|
55
|
+
`main(argv)` in `qodo/cli/__init__.py` is the single entry point. Flow:
|
|
56
|
+
|
|
57
|
+
1. `_build_parser()` constructs the argparse tree and calls each command
|
|
58
|
+
module's `register(sub)` to attach its subparser + handler.
|
|
59
|
+
2. `parse_args` resolves `args.func`; `_dispatch(args)` invokes it.
|
|
60
|
+
3. A handler returns `None`/`int` on success and **raises `CliError` on
|
|
61
|
+
failure**. `_dispatch` catches `CliError` and routes it through `_output`;
|
|
62
|
+
any *other* exception is wrapped into a `CliError` so **no Python traceback
|
|
63
|
+
ever leaks to stderr**.
|
|
64
|
+
|
|
65
|
+
Each verb/noun lives in its own module under `qodo/cli/_commands/` exposing a
|
|
66
|
+
`register(sub)` function and a handler. Noun groups (like `cli`) add their own
|
|
67
|
+
nested subparsers inside `register`.
|
|
68
|
+
|
|
69
|
+
### Stable contracts (don't break these — tests and the rubric pin them)
|
|
70
|
+
|
|
71
|
+
- **stdout/stderr split** (`_output.py`): command *results* go to stdout,
|
|
72
|
+
*errors and diagnostics* go to stderr. Never mixed, in text or JSON mode.
|
|
73
|
+
- **Structured errors** (`_errors.py`): every failure is a
|
|
74
|
+
`CliError{code, message, remediation}`. Text mode renders `error: <msg>` then
|
|
75
|
+
`hint: <remediation>`; the `hint:` prefix is required by the rubric.
|
|
76
|
+
- **Exit codes**: `0` success, `1` user error, `2` environment error, `3+`
|
|
77
|
+
reserved (`EXIT_*` constants in `_errors.py`).
|
|
78
|
+
- **`--json` everywhere**: every command accepts `--json`. Argparse-level errors
|
|
79
|
+
(unknown verb/flag) also honor it — `_CliArgumentParser.error()` routes through
|
|
80
|
+
`emit_error`, and `main` pre-scans raw argv into the class-level `_json_hint`
|
|
81
|
+
*before* `parse_args` so JSON mode is known even at parse time. New subparsers
|
|
82
|
+
must be built with `parser_class=_CliArgumentParser` to inherit this.
|
|
83
|
+
- **Explain catalog** (`qodo/explain/catalog.py`): markdown keyed by command-path
|
|
84
|
+
tuples; `resolve()` raises `CliError` on an unknown path. The test
|
|
85
|
+
`test_every_catalog_path_resolves` asserts every catalog entry resolves, so a
|
|
86
|
+
new command needs a matching catalog entry.
|
|
87
|
+
|
|
88
|
+
### The agent-first rubric (`teken cli doctor . --strict`)
|
|
89
|
+
|
|
90
|
+
This gate is **load-bearing and CI-enforced** — it is why the scaffold verbs
|
|
91
|
+
exist and constrains how you add new ones:
|
|
92
|
+
|
|
93
|
+
- `learn` must be ≥ 200 chars and mention purpose, command map, exit codes,
|
|
94
|
+
`--json`, and `explain`.
|
|
95
|
+
- Any noun with action-verbs must also expose `overview` (the `cli` noun exists
|
|
96
|
+
solely to satisfy this — `cli overview` describes the CLI surface, distinct
|
|
97
|
+
from the global `overview` that describes the agent).
|
|
98
|
+
- Descriptive verbs (`overview`) must not hard-fail on a bad/missing target path
|
|
99
|
+
(hence `overview` accepts and ignores a positional `target`).
|
|
100
|
+
- `doctor` must emit the rubric-shaped contract
|
|
101
|
+
`{healthy, checks: [{id, passed, severity, message, remediation}]}`.
|
|
102
|
+
|
|
103
|
+
When you add real commands, keep `learn`, `overview`, and the explain catalog in
|
|
104
|
+
sync or this gate fails.
|
|
105
|
+
|
|
106
|
+
### Mesh identity (`culture.yaml` + resident prompt file)
|
|
107
|
+
|
|
108
|
+
`culture.yaml` declares the agent: `suffix` (nick), `backend`, `model`. The
|
|
109
|
+
**backend is `colleague`**, so the resident prompt file is **`AGENTS.colleague.md`**,
|
|
110
|
+
*not* `CLAUDE.md`. `whoami`/`doctor` parse `culture.yaml` **without a YAML
|
|
111
|
+
dependency** (hand-rolled parser in `whoami.py`, reading the first agent block)
|
|
112
|
+
to keep runtime deps empty.
|
|
113
|
+
|
|
114
|
+
`doctor` enforces the backend→prompt-file map (mirrors `steward doctor`):
|
|
115
|
+
`claude → CLAUDE.md`, `colleague → AGENTS.colleague.md`, `acp → AGENTS.md`,
|
|
116
|
+
`gemini → GEMINI.md`, plus a `.claude/skills/`-present check. If you change the
|
|
117
|
+
backend in `culture.yaml`, teach `doctor._PROMPT_FILE` the new mapping or the
|
|
118
|
+
backend-consistency invariant breaks (`test_doctor_recognizes_declared_backend`
|
|
119
|
+
guards this).
|
|
120
|
+
|
|
121
|
+
> **Known drift:** several artifacts still say `backend: claude` / `CLAUDE.md`
|
|
122
|
+
> (README, `overview`'s `_ARTIFACTS`, the `_ROOT`/`_DOCTOR` explain entries,
|
|
123
|
+
> `docs/skill-sources.md`). The live source of truth is `culture.yaml` + the
|
|
124
|
+
> tests, which assert `backend: colleague`. Fix the stale text when you touch
|
|
125
|
+
> those files; don't trust them over `culture.yaml`.
|
|
126
|
+
|
|
127
|
+
### Vendored skills (`.claude/skills/`)
|
|
128
|
+
|
|
129
|
+
The skill kit is **cite-don't-import**: vendored verbatim from **guildmaster**
|
|
130
|
+
(the AgentCulture skills supplier), provenance + re-sync procedure + tracked
|
|
131
|
+
local divergences in `docs/skill-sources.md`. **Do not reformat vendored
|
|
132
|
+
skills** — markdownlint and SonarCloud both exclude `.claude/skills/**`. Every
|
|
133
|
+
`SKILL.md` must carry `type: command` (load-bearing for the culture backend's
|
|
134
|
+
`core.skill_loader`, which silently skips files lacking it). To update a skill,
|
|
135
|
+
follow the re-sync steps in `docs/skill-sources.md` rather than hand-editing.
|
|
136
|
+
|
|
137
|
+
## Workflow conventions
|
|
138
|
+
|
|
139
|
+
- **Version-bump on every PR** — even docs/config/CI-only changes. The CI
|
|
140
|
+
`version-check` job (PR events only) blocks merge if `pyproject.toml`'s
|
|
141
|
+
`version` matches `main`. Use the `version-bump` skill
|
|
142
|
+
(`python3 .claude/skills/version-bump/scripts/bump.py patch|minor|major`),
|
|
143
|
+
which also prepends a Keep-a-Changelog entry to `CHANGELOG.md`. The version is
|
|
144
|
+
single-sourced in `pyproject.toml`; `qodo/__init__.py` reads it via
|
|
145
|
+
`importlib.metadata` (no separate `__version__` literal to sync).
|
|
146
|
+
- **PR lane** — use the `cicd` skill (`.claude/skills/cicd/scripts/workflow.sh`,
|
|
147
|
+
a thin layer over `devex pr`). Branch naming: `fix/`, `feat/`, `docs/`,
|
|
148
|
+
`skill/`. The signature `- <nick> (Claude)` is auto-appended by `devex` from
|
|
149
|
+
`culture.yaml`. When implementation is done and tests pass, the standing
|
|
150
|
+
AgentCulture default is **push and open a PR** — don't pause on a
|
|
151
|
+
merge/keep/discard menu.
|
|
152
|
+
- **SonarCloud** gates CI when `SONAR_TOKEN` is set (project key
|
|
153
|
+
`agentculture_qodo-cli`); token-less repos and fork PRs stay green.
|
|
154
|
+
`relative_files = true` in `[tool.coverage.run]` is required so `coverage.xml`
|
|
155
|
+
emits repo-relative paths Sonar can map to `sonar.sources=qodo`. Coverage
|
|
156
|
+
`fail_under = 60`.
|
|
157
|
+
|
|
158
|
+
## Adding a command
|
|
159
|
+
|
|
160
|
+
1. Create `qodo/cli/_commands/<name>.py` with a handler and a `register(sub)`
|
|
161
|
+
(mirror `whoami.py`). Add a `--json` flag; raise `CliError` on failure.
|
|
162
|
+
2. Wire it into `_build_parser()` in `qodo/cli/__init__.py`.
|
|
163
|
+
3. Add a catalog entry in `qodo/explain/catalog.py` (and to `ENTRIES`).
|
|
164
|
+
4. Add it to the verb lists in `learn.py` and `overview.py` so the rubric and
|
|
165
|
+
self-description stay consistent.
|
|
166
|
+
5. Add tests under `tests/` and bump the version.
|
|
167
|
+
|
|
168
|
+
## Renaming the package (when cloning as a template)
|
|
169
|
+
|
|
170
|
+
The scaffold name is hard-coded in ~100 places (package `qodo/`, dist `qodo-cli`,
|
|
171
|
+
the `_ISSUES_URL` in `qodo/cli/__init__.py`, the CLI command files, `tests/`,
|
|
172
|
+
`sonar-project.properties`, README). List every occurrence first:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
git grep -nI -e 'qodo-cli' -e 'qodo' -e 'agentculture/qodo-cli'
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Then rename the package dir, update `[project.scripts]`/`name` in
|
|
179
|
+
`pyproject.toml`, edit `culture.yaml` (`suffix`/`backend`), rewrite the resident
|
|
180
|
+
prompt file, and re-vendor only the skills you need (`docs/skill-sources.md`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: qodo-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "qodo-cli"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.2"
|
|
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"
|
|
@@ -9,6 +9,9 @@ context without chaining reads.
|
|
|
9
9
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
|
+
# The console script is `qodo` while the CLI self-identifies (argparse prog) and
|
|
13
|
+
# the dist are `qodo-cli`. The agent-first rubric runs `explain <script-name>`,
|
|
14
|
+
# i.e. `explain qodo`, so the root entry is keyed under both spellings below.
|
|
12
15
|
_ROOT = """\
|
|
13
16
|
# qodo-cli
|
|
14
17
|
|
|
@@ -119,6 +122,7 @@ itself (distinct from the global `overview`, which describes the agent).
|
|
|
119
122
|
ENTRIES: dict[tuple[str, ...], str] = {
|
|
120
123
|
(): _ROOT,
|
|
121
124
|
("qodo-cli",): _ROOT,
|
|
125
|
+
("qodo",): _ROOT, # console-script name; satisfies the rubric's `explain <self>` check
|
|
122
126
|
("whoami",): _WHOAMI,
|
|
123
127
|
("learn",): _LEARN,
|
|
124
128
|
("explain",): _EXPLAIN,
|
|
@@ -92,6 +92,14 @@ def test_explain_self(capsys: pytest.CaptureFixture[str]) -> None:
|
|
|
92
92
|
assert capsys.readouterr().out.startswith("#")
|
|
93
93
|
|
|
94
94
|
|
|
95
|
+
def test_explain_console_script_name(capsys: pytest.CaptureFixture[str]) -> None:
|
|
96
|
+
# The agent-first rubric runs `explain <console-script-name>` (= `qodo`).
|
|
97
|
+
# Keep that resolvable even though the CLI self-identifies as `qodo-cli`.
|
|
98
|
+
rc = main(["explain", "qodo"])
|
|
99
|
+
assert rc == 0
|
|
100
|
+
assert capsys.readouterr().out.startswith("#")
|
|
101
|
+
|
|
102
|
+
|
|
95
103
|
def test_explain_json(capsys: pytest.CaptureFixture[str]) -> None:
|
|
96
104
|
rc = main(["explain", "whoami", "--json"])
|
|
97
105
|
assert rc == 0
|
qodo_cli-0.3.1/CLAUDE.md
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md — seed / bootstrap placeholder
|
|
2
|
-
|
|
3
|
-
> **This is a self-initializing seed, not a finished runtime prompt.**
|
|
4
|
-
> Run `/init` (or describe the agent's domain to your AI assistant) to
|
|
5
|
-
> re-initialize this file into a full runtime prompt, using the description
|
|
6
|
-
> below and the scaffolded repo as context.
|
|
7
|
-
|
|
8
|
-
## Agent
|
|
9
|
-
|
|
10
|
-
This repository hosts the **qodo-cli** agent.
|
|
11
|
-
|
|
12
|
-
## Description
|
|
13
|
-
|
|
14
|
-
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.
|
|
15
|
-
|
|
16
|
-
## Re-init instruction
|
|
17
|
-
|
|
18
|
-
This file is a seed. To expand it into your full runtime prompt:
|
|
19
|
-
|
|
20
|
-
1. Open this repo in Claude Code (or your preferred AI assistant).
|
|
21
|
-
2. Run `/init` — the assistant will read the repo, incorporate the description
|
|
22
|
-
above, and replace this seed with a complete `CLAUDE.md`.
|
|
23
|
-
3. Commit the result.
|
|
24
|
-
|
|
25
|
-
Until you run `/init`, `qodo-cli` satisfies the `steward doctor`
|
|
26
|
-
`prompt-file-present` and `backend-consistency` invariants (a `CLAUDE.md`
|
|
27
|
-
exists and `culture.yaml` declares `backend: claude`) but the prompt is not
|
|
28
|
-
yet tailored to this agent's domain.
|
|
File without changes
|
{qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/agent-config/data/backend-fingerprints.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/scripts/templates/skill-new-brief.md
RENAMED
|
File without changes
|
{qodo_cli-0.3.1 → qodo_cli-0.3.2}/.claude/skills/communicate/scripts/templates/skill-update-brief.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|