You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: AGENTS.md
+30-4Lines changed: 30 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -26,6 +26,12 @@ See the [README.md](README.md) file for a project overview.
26
26
- Run MCP smoke test: `just test-smoke`
27
27
- Fast local loop: `just fast-check` (default iteration flow)
28
28
- Local consistency check: `just doctor`
29
+
- Run all consolidated agent package checks: `just package-check`
30
+
- Run Claude Code plugin checks: `just package-check-claude-code`
31
+
- Run shared skills checks: `just package-check-skills`
32
+
- Run Hermes plugin checks: `just package-check-hermes`
33
+
- Run OpenClaw plugin checks: `just package-check-openclaw`
34
+
- Run host-native agent harness checks: `just agent-harness-check`
29
35
- Generate HTML coverage: `just coverage`
30
36
- Single test: `pytest tests/path/to/test_file.py::test_function_name`
31
37
- Run benchmarks: `pytest test-int/test_sync_performance_benchmark.py -v -m "benchmark and not slow"`
@@ -50,20 +56,34 @@ See the [README.md](README.md) file for a project overview.
50
56
1)**Code:** make changes.
51
57
2)**Test:**`just fast-check` (lint/format/typecheck + pytest-testmon impacted tests for changed code).
52
58
3)**Verify:**`just doctor` (end-to-end file ↔ DB loop in a temp project).
53
-
4)**Full gate (when needed):**`just test` or `just check` for SQLite + Postgres.
59
+
4)**Package verify:**`just package-check` when changes touch `plugins/`, `skills/`, `integrations/`, package metadata, or release wiring.
60
+
5)**Full gate (when needed):**`just test` or `just check` for SQLite + Postgres.
54
61
55
62
Run `just test-smoke` when you specifically need the MCP smoke flow.
56
63
57
64
If testmon is “cold,” the first run may be long. Subsequent runs get much faster.
58
65
66
+
### Consolidated Agent Package Checks
67
+
68
+
The monorepo ships several host-native packages alongside the Python core. Use the root justfile as the canonical entry point:
69
+
70
+
-`just package-check` — validates every copied package and generated bundle path.
71
+
-`just package-check-claude-code` — validates the root and plugin-local Claude marketplace manifests, bundled Claude Code skills, hooks, `basic-memory-manager` agent, and runs `claude plugin validate . --strict`.
72
+
-`just package-check-skills` — validates every top-level `skills/memory-*/SKILL.md` frontmatter block.
73
+
-`just package-check-hermes` — validates `integrations/hermes/plugin.yaml`, the Hermes provider entrypoint, bundled skill, and runs the hermetic unit suite.
74
+
-`just package-check-openclaw` — runs the OpenClaw package install, copies top-level skills into the generated bundle, typechecks, lints, builds `dist/`, runs Bun tests, and performs `npm pack --dry-run`.
75
+
-`just agent-harness-check` — checks the host-specific harnesses without the shared markdown-only skills target.
76
+
77
+
Package-local justfiles live in `plugins/claude-code/`, `skills/`, `integrations/hermes/`, and `integrations/openclaw/`. Prefer the root targets for PR verification so command names stay stable as package internals evolve.
78
+
59
79
### PR CI Gate
60
80
61
81
Before opening or updating a PR, run the checks that mirror the common required CI failures:
62
82
63
83
- Run `just typecheck` in addition to targeted `ruff` and `pytest` commands when tests were added or changed.
64
84
- Sign commits with `git commit -s` so DCO passes. If a PR branch already has unsigned commits, rewrite the branch with signed-off commits before asking for review.
65
85
- Use a semantic PR title accepted by `.github/workflows/pr-title.yml`: `type(scope): summary`.
66
-
- Use one of the allowed scopes: `core`, `cli`, `api`, `mcp`, `sync`, `ui`, `deps`, `installer`.
86
+
- Use one of the allowed scopes: `core`, `cli`, `api`, `mcp`, `sync`, `ui`, `deps`, `installer`, `plugins`, `skills`, `integrations`.
67
87
68
88
### Test Structure
69
89
@@ -162,6 +182,10 @@ See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for detailed architecture docum
162
182
-`/schemas` - Pydantic models for validation
163
183
-`/services` - Business logic layer
164
184
-`/sync` - File synchronization services + `coordinator.py` for lifecycle management
185
+
-`/plugins/claude-code` - Claude Code plugin marketplace package, hooks, skills, and agent harness
Each entrypoint (API, MCP, CLI) has a composition root that:
@@ -263,10 +287,12 @@ Releases are driven by `just release` / `just beta` — never by a bare `git tag
263
287
just release v0.21.3
264
288
```
265
289
266
-
The recipe runs `just lint` + `just typecheck`, then updates `__version__` in `src/basic_memory/__init__.py`and `"version"` in `server.json` (MCP registry metadata), commits as `chore: update version to X.Y.Z for vX.Y.Z release`, creates the `vX.Y.Z` tag, and pushes both the commit and the tag to `origin/main`. After the tag lands, the `Release` workflow builds the package, publishes to PyPI, creates the GitHub release with auto-generated notes, and updates the Homebrew formula. The recipe finishes by printing the post-release tasks the workflow doesn't cover.
290
+
The recipe runs `just lint` + `just typecheck`, then updates every release manifest through `scripts/update_versions.py`: `src/basic_memory/__init__.py`, `server.json`, the root Claude marketplace, the Claude Code plugin manifest and local marketplace, the Hermes `plugin.yaml`, and the OpenClaw `package.json`. It commits as `chore: update version to X.Y.Z for vX.Y.Z release`, creates the `vX.Y.Z` tag, and pushes both the commit and the tag to `origin/main`. After the tag lands, the `Release` workflow builds the Python package, publishes to PyPI, creates the GitHub release with auto-generated notes, publishes the OpenClaw npm package, and updates the Homebrew formula. The recipe finishes by printing the post-release tasks the workflow doesn't cover.
267
291
268
292
**Beta release:**`just beta v0.21.3b1` — same flow with a beta-suffixed tag. PyPI consumers install with `pip install basic-memory --pre`.
269
293
294
+
**Release dry run:**`just release-dry-run v0.21.4` previews the consolidated version update without writing files.
295
+
270
296
**Development builds:** every commit to `main` publishes a `0.21.3.dev26+468a22f`-style version to PyPI automatically via `.github/workflows/dev-release.yml`. No human action.
271
297
272
298
**Do not tag releases by hand.** A bare `git tag vX.Y.Z` skips the in-code version bump. Package metadata is still correct (uv-dynamic-versioning derives it from the git tag) but `basic-memory --version` reports the previous release, which is what happened with v0.21.2 → v0.21.3.
@@ -480,7 +506,7 @@ With GitHub integration, the development workflow includes:
480
506
5.**Code Commits**: ALWAYS sign off commits with `git commit -s`
481
507
6.**Pull Request Titles**: PR titles must follow the semantic format enforced by `.github/workflows/pr-title.yml`: `type(scope): summary`
This level of integration represents a new paradigm in AI-human collaboration, where the AI assistant becomes a full-fledged team member rather than just a tool for generating code snippets.
0 commit comments