eidetic-cli 0.2.0__tar.gz → 0.2.1__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 (71) hide show
  1. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/CHANGELOG.md +10 -0
  2. eidetic_cli-0.2.1/CLAUDE.md +135 -0
  3. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/PKG-INFO +1 -1
  4. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/explain/catalog.py +4 -0
  5. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/pyproject.toml +1 -1
  6. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/uv.lock +1 -1
  7. eidetic_cli-0.2.0/CLAUDE.md +0 -28
  8. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/agent-config/SKILL.md +0 -0
  9. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  10. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/agent-config/scripts/show.sh +0 -0
  11. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/ask-colleague/SKILL.md +0 -0
  12. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  13. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  14. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  15. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  16. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  17. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  18. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/cicd/SKILL.md +0 -0
  19. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  20. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  21. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  22. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  23. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  24. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/communicate/SKILL.md +0 -0
  25. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  26. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  27. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  28. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  29. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  30. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  31. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  32. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  33. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  34. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  35. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/run-tests/SKILL.md +0 -0
  36. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  37. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
  38. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  39. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  40. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  41. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/think/SKILL.md +0 -0
  42. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/think/scripts/think.sh +0 -0
  43. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/version-bump/SKILL.md +0 -0
  44. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
  45. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.claude/skills.local.yaml.example +0 -0
  46. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.flake8 +0 -0
  47. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.github/workflows/publish.yml +0 -0
  48. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.github/workflows/tests.yml +0 -0
  49. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.gitignore +0 -0
  50. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/.markdownlint-cli2.yaml +0 -0
  51. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/LICENSE +0 -0
  52. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/README.md +0 -0
  53. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/culture.yaml +0 -0
  54. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/docs/skill-sources.md +0 -0
  55. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/__init__.py +0 -0
  56. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/__main__.py +0 -0
  57. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/__init__.py +0 -0
  58. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_commands/__init__.py +0 -0
  59. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_commands/cli.py +0 -0
  60. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_commands/doctor.py +0 -0
  61. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_commands/explain.py +0 -0
  62. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_commands/learn.py +0 -0
  63. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_commands/overview.py +0 -0
  64. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_commands/whoami.py +0 -0
  65. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_errors.py +0 -0
  66. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/cli/_output.py +0 -0
  67. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/eidetic/explain/__init__.py +0 -0
  68. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/sonar-project.properties +0 -0
  69. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/tests/__init__.py +0 -0
  70. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/tests/test_cli.py +0 -0
  71. {eidetic_cli-0.2.0 → eidetic_cli-0.2.1}/tests/test_cli_introspection.py +0 -0
@@ -5,6 +5,16 @@ 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.2.1] - 2026-06-13
9
+
10
+ ### Changed
11
+
12
+ - Replaced the CLAUDE.md seed placeholder with a real runtime guide for eidetic-cli: commands (test/lint/rubric gate), the agent-first CLI architecture (register-per-command, the CliError/exit-code contract, stdout/stderr split, the explain catalog), the mesh-identity pairing, the version-bump-every-PR and rubric-gate rules, cite-don't-import skill provenance, the cicd PR lane, and the template rename procedure. Documents the eidetic vs eidetic-cli console-script naming gotcha.
13
+
14
+ ### Fixed
15
+
16
+ - `explain eidetic` now resolves (added an `("eidetic",)` alias to the explain catalog pointing at the root entry). The agent-first rubric (`teken cli doctor . --strict`) probes the tool by its console-script/package name `eidetic`, but the catalog only carried the `eidetic-cli` self-key, so `explain_self` failed and the lint job went red. Surfaced by CI on this PR; the gap pre-dated it.
17
+
8
18
  ## [0.2.0] - 2026-06-06
9
19
 
10
20
  ### Added
@@ -0,0 +1,135 @@
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 repo is
6
+
7
+ `eidetic-cli` is an **AgentCulture mesh agent**, scaffolded from
8
+ `culture-agent-template`. Its declared domain is "Agent/CLI providing eidetic
9
+ perfect-recall memory" — but **that memory functionality is not yet built**.
10
+ What exists today is the scaffold: an agent-first introspection CLI (cited from
11
+ [teken](https://github.com/agentculture/teken)'s `afi-cli` `python-cli`
12
+ reference), a mesh identity, the vendored guildmaster skill kit, and a
13
+ build/CI/deploy baseline. New domain code is added as additional noun groups on
14
+ top of this scaffold — it does not replace it.
15
+
16
+ The runtime package has **zero third-party dependencies** (`dependencies = []`).
17
+ `teken` and the lint/test tooling are dev-only. Keep it that way: the
18
+ self-contained runtime is a load-bearing property (the `whoami`/`doctor`
19
+ commands even parse `culture.yaml` by hand rather than import a YAML library).
20
+
21
+ ## Commands
22
+
23
+ ```bash
24
+ uv sync # install deps into .venv
25
+ uv run pytest -n auto # full test suite (xdist parallel)
26
+ uv run pytest tests/test_cli.py -v # one file
27
+ uv run pytest -k whoami # one test by keyword
28
+ uv run pytest --cov=eidetic --cov-report=term # with coverage (CI gate: fail_under=60)
29
+
30
+ # Lint — CI runs all of these; run them before opening a PR:
31
+ uv run black --check eidetic tests
32
+ uv run isort --check-only eidetic tests
33
+ uv run flake8 eidetic tests
34
+ uv run bandit -c pyproject.toml -r eidetic
35
+ markdownlint-cli2 "**/*.md" "#node_modules" "#.claude/skills"
36
+
37
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI enforces
38
+ ```
39
+
40
+ Run the CLI itself with `python -m eidetic <verb>` or `uv run eidetic <verb>`.
41
+
42
+ > **Gotcha:** the console script is named `eidetic` (`[project.scripts]` in
43
+ > `pyproject.toml`), but the dist name, `prog`, and every help/doc string say
44
+ > `eidetic-cli`. So `uv run eidetic-cli …` (as written in some docs) does **not**
45
+ > resolve to a script — use `uv run eidetic …` or `python -m eidetic …`.
46
+
47
+ ## Architecture
48
+
49
+ The CLI follows the **agent-first** pattern — every surface is introspectable and
50
+ machine-readable, designed to be driven by another agent, not just a human.
51
+
52
+ - **`eidetic/cli/__init__.py`** — `main(argv)` is the single entry point. It
53
+ builds the argparse tree (`_build_parser`), then `_dispatch` invokes the
54
+ matched handler and translates exceptions to exit codes. Each command lives in
55
+ `eidetic/cli/_commands/<verb>.py` and exposes a `register(subparsers)` function
56
+ called from `_build_parser`. **To add a verb or noun group, write that module
57
+ and add one `register()` call** — the marked spot in `_build_parser` shows
58
+ where.
59
+
60
+ - **Error contract (`eidetic/cli/_errors.py`, `_output.py`)** — every failure
61
+ raises `CliError(code, message, remediation)`; `_dispatch` catches it (and
62
+ wraps any stray exception) so **no Python traceback ever reaches stderr**.
63
+ Argparse's own errors are routed through the same path via
64
+ `_CliArgumentParser.error()`. Exit codes: `0` success, `1` user error,
65
+ `2` environment error, `3+` reserved. This policy lives in exactly one place —
66
+ don't `sys.exit()` or `print` errors from handlers.
67
+
68
+ - **stdout/stderr split (`_output.py`)** — results go to **stdout**, errors and
69
+ diagnostics to **stderr**, never mixed. `--json` mode routes structured
70
+ payloads to the same streams. Every command accepts `--json`; honor it in any
71
+ new command (text errors render `error:` + `hint:` lines; the `hint:` prefix is
72
+ required by the rubric).
73
+
74
+ - **`eidetic/explain/catalog.py`** — `explain <path>` resolves command-path
75
+ tuples to verbatim markdown docs. Adding a verb means adding its catalog entry
76
+ here, plus its line in `eidetic/cli/_commands/learn.py`'s
77
+ `_TEXT`/`_as_json_payload` and `eidetic/cli/_commands/overview.py`'s `_VERBS` —
78
+ these three are the hand-maintained "docs" surface and drift if you forget one.
79
+
80
+ - **Identity (`whoami.py`, `doctor.py`)** — `find_culture_yaml()` walks up from
81
+ the module to locate the repo's own `culture.yaml` (so identity is the agent's,
82
+ not the CWD's), parsed without a YAML dep. In a wheel install no `culture.yaml`
83
+ ships, so these degrade gracefully to defaults / an info-only doctor report.
84
+ `doctor` mirrors the invariants `steward doctor` checks: **prompt-file-present**
85
+ and **backend-consistency** (`claude`→`CLAUDE.md`, `acp`→`AGENTS.md`,
86
+ `gemini`→`GEMINI.md`), plus **skills-present**.
87
+
88
+ ## Mesh identity
89
+
90
+ `culture.yaml` declares `suffix: eidetic-cli` / `backend: claude`. The
91
+ `backend: claude` value requires this `CLAUDE.md` to exist at the repo root —
92
+ that pairing is what `doctor` and `steward doctor` enforce. If you change the
93
+ backend, rename the prompt file to match.
94
+
95
+ ## Non-negotiable workflow rules
96
+
97
+ - **Bump the version on every PR** — even docs/config/CI-only changes. The
98
+ `version-check` CI job fails the PR if `pyproject.toml`'s version equals
99
+ `main`'s. Use the `version-bump` skill (updates `pyproject.toml` + prepends a
100
+ Keep-a-Changelog entry to `CHANGELOG.md`). `__version__` is read from installed
101
+ package metadata, so the single source of truth is `pyproject.toml`.
102
+
103
+ - **The agent-first rubric must stay green** — `teken cli doctor . --strict`
104
+ gates CI. It checks the seven-bundle rubric (every noun with action-verbs
105
+ exposes `overview`; `learn` is ≥200 chars and names purpose/commands/exit-codes/
106
+ `--json`/`explain`; the error contract; etc.). The empty `cli` noun group exists
107
+ solely to satisfy `overview_cli_noun_exists` — don't delete it.
108
+
109
+ - **Skills are vendored cite-don't-import** — `.claude/skills/` is copied from
110
+ guildmaster (some re-broadcast from `devague`; `ask-colleague` directly from
111
+ `colleague`). **Do not hand-edit vendored skill scripts.** Provenance, the
112
+ re-sync procedure, and tracked local divergences are in
113
+ [`docs/skill-sources.md`](docs/skill-sources.md). `.claude/skills/` is excluded
114
+ from Sonar and markdownlint.
115
+
116
+ ## PR lifecycle
117
+
118
+ Branch → implement → bump version → open PR → address review → merge. The `cicd`
119
+ skill is this repo's PR lane (layered on `devex pr`): it adds `status` (SonarCloud
120
+ quality gate + hotspots + unresolved threads) and `await` (blocks until CI
121
+ settles, non-zero exit on a red Sonar gate or unresolved threads). SonarCloud
122
+ gating only engages when `SONAR_TOKEN` is set (fork PRs and token-less repos stay
123
+ green). `sonarclaude` queries the SonarCloud API directly; `communicate` files
124
+ cross-repo issues and posts to mesh channels.
125
+
126
+ ## Renaming this template
127
+
128
+ This repo is still a clonable scaffold — the name `eidetic` / `eidetic-cli` is
129
+ hard-coded in ~30 tracked files (package dir, CLI strings, tests,
130
+ `sonar-project.properties`, `README.md`). To find every occurrence before a
131
+ rename:
132
+
133
+ ```bash
134
+ git grep -lI 'eidetic'
135
+ ```
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eidetic-cli
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Agent/CLI providing eidetic perfect-recall memory
5
5
  Project-URL: Homepage, https://github.com/agentculture/eidetic-cli
6
6
  Project-URL: Issues, https://github.com/agentculture/eidetic-cli/issues
@@ -119,6 +119,10 @@ itself (distinct from the global `overview`, which describes the agent).
119
119
  ENTRIES: dict[tuple[str, ...], str] = {
120
120
  (): _ROOT,
121
121
  ("eidetic-cli",): _ROOT,
122
+ # The console script / package is named `eidetic` (see [project.scripts]),
123
+ # so `explain eidetic` must also resolve — the agent-first rubric probes the
124
+ # tool by its self-name. Alias it to the same root entry as `eidetic-cli`.
125
+ ("eidetic",): _ROOT,
122
126
  ("whoami",): _WHOAMI,
123
127
  ("learn",): _LEARN,
124
128
  ("explain",): _EXPLAIN,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "eidetic-cli"
3
- version = "0.2.0"
3
+ version = "0.2.1"
4
4
  description = "Agent/CLI providing eidetic perfect-recall memory"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -156,7 +156,7 @@ wheels = [
156
156
 
157
157
  [[package]]
158
158
  name = "eidetic-cli"
159
- version = "0.2.0"
159
+ version = "0.2.1"
160
160
  source = { editable = "." }
161
161
 
162
162
  [package.dev-dependencies]
@@ -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 **eidetic-cli** agent.
11
-
12
- ## Description
13
-
14
- Agent/CLI providing eidetic perfect-recall memory
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`, `eidetic-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
File without changes
File without changes
File without changes
File without changes