feat(adr-006): Phase 1 — Python SDK + scaffolder + self-serve webhook install#197
Closed
lilyshen0722 wants to merge 1 commit intomainfrom
Closed
feat(adr-006): Phase 1 — Python SDK + scaffolder + self-serve webhook install#197lilyshen0722 wants to merge 1 commit intomainfrom
lilyshen0722 wants to merge 1 commit intomainfrom
Conversation
… install
Three artifacts in one PR per ADR-006 §Migration path Phase 1:
1. Backend self-serve webhook install
- models/AgentRegistry.ts: `ephemeral?: boolean`; search() filters ephemeral
rows so they never appear in the marketplace catalog. Direct getByName()
still resolves them for install/uninstall.
- routes/registry/install.ts: pod-member who installs a webhook agent with
no published manifest gets an ephemeral registry row synthesized in
their name. Membership check fronts everything; non-webhook installs
without manifest still 404; podId required (ADR-006 invariant 7);
agentName regex-validated (returns 400 vs Mongoose 500); structured
[cap self-serve-install] log fires on every synthesis.
- routes/registry/pod-agents.ts: comment noting the ephemeral GC gap
(ADR-006 OQ #1) for the day someone wires the janitor.
- __tests__/integration/self-serve-install.test.js: 5 cases — happy path
(token works), non-webhook 404, malformed name 400, non-member 403,
catalog excludes ephemeral.
2. Python SDK
- examples/sdk/python/commonly.py: ~150 LOC, stdlib only. Class Commonly
with the four CAP verbs (poll_events / ack / post_message / get_memory /
sync_memory) + a run() loop. CommonlyError carries .status + .body.
ADR-003 invariant #9 documented in sync_memory; run() docstring matches
the actual no-ack-on-handler-error semantics (kernel re-delivers).
- examples/hello-world-python/bot.py: ~50 LOC echo template; reads token
from COMMONLY_TOKEN env or KEY=VALUE-formatted .commonly-env file.
3. CLI scaffolder
- cli/src/commands/agent.js: `init --language python --name <n> --pod <id>`
subcommand and an exported performInit core. Refuses to clobber any of
the 3 output files (`commonly.py`, `<name>.py`, `.commonly-env`); writes
.commonly-env with mode 0600 in KEY=VALUE format. Reads SDK + template
via import.meta.url (works from any cwd; will need bundling at Phase 4
publish — comment links to ADR section).
- cli/__tests__/agent-init.test.mjs: 4 cases — full happy path with
byte-for-byte SDK/template equality, /runtime-tokens fallback, clobber
refusal (asserts NO install POST issued), unknown-language reject.
57/57 CLI tests, 5/5 backend integration tests, type-check clean.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
lilyshen0722
added a commit
that referenced
this pull request
Apr 16, 2026
… install (#197) Self-serve webhook install: pod members can POST /install with runtimeType:'webhook' and no pre-published manifest — backend synthesizes an ephemeral AgentRegistry row, mints a runtime token, and the agent polls /events immediately. Ephemeral rows are excluded from marketplace catalog browse. Python SDK (examples/sdk/python/commonly.py): ~150 LOC reference client — poll_events, ack, post_message, get/sync_memory, run(). Skips ack on handler exception so kernel re-delivers (at-least-once). CLI scaffolder (`commonly agent init --language python`): copies SDK + bot template, writes .commonly-env (0600), issues install + token mint. Clobber-protection refuses to overwrite existing files. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Contributor
Author
|
Merged via local squash+push → db7a223 |
lilyshen0722
added a commit
that referenced
this pull request
Apr 16, 2026
…1 as shipped Sweep of documentation catching up with today's merges: - ADR-003: status line now includes Phase 3 §Deliverable 3 shipped (2026-04-15). Added revision note pointing at the cross-check test file and its seven assertions. Deliverable 3 itself marked shipped inline. - ADR-005: status bumped from Draft to Accepted. Revision history records Phase 1a (PR #194), Phase 1b (PR #195), and the three follow-up fixes that landed during/after live smoke (cwd guard + --instance shadowing #196, self-mention loop #201, URL/key asymmetry #202). Phase 1a + 1b headers marked shipped inline. - ADR-006: status bumped from Draft to Accepted. Revision history names Phase 1 (PR #197), the Cloudflare UA follow-up (5db9376), and the live-smoke result on api-dev. Open Question #1 (ephemeral GC) updated with current TODO location. - CLAUDE.md Agent Runtime Quick Rules: five new prescriptive rules — self-mention guard, `commonly agent init` self-serve path, Python SDK User-Agent requirement, CLI --instance symmetry. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
lilyshen0722
added a commit
that referenced
this pull request
Apr 16, 2026
…ipped (#203) * fix(cli): resolve --instance symmetrically (saved key OR URL) Historically `resolveInstanceUrl` treated --instance as a URL and `getToken` treated it as a config key. So: commonly whoami --instance https://api-dev.commonly.me → URL resolved correctly, but token lookup returned null (no auth) commonly whoami --instance dev → token found, but "dev" was returned literally as the URL (ENOTFOUND) Neither form worked end-to-end. Filed as a follow-up during ADR-005 Phase 1b smoke. Fix: funnel both functions through a new `resolveInstance(identifier)` helper that probes URL-shaped inputs (http[s]://) against saved URLs first (case-insensitive, trailing-slash tolerant), then falls back to exact-key lookup, then to an unknown-URL bootstrap, then to null. Both forms of --instance now work for both URL and token resolution. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs(adr): mark ADR-003 Phase 3, ADR-005 Phases 1a+1b, ADR-006 Phase 1 as shipped Sweep of documentation catching up with today's merges: - ADR-003: status line now includes Phase 3 §Deliverable 3 shipped (2026-04-15). Added revision note pointing at the cross-check test file and its seven assertions. Deliverable 3 itself marked shipped inline. - ADR-005: status bumped from Draft to Accepted. Revision history records Phase 1a (PR #194), Phase 1b (PR #195), and the three follow-up fixes that landed during/after live smoke (cwd guard + --instance shadowing #196, self-mention loop #201, URL/key asymmetry #202). Phase 1a + 1b headers marked shipped inline. - ADR-006: status bumped from Draft to Accepted. Revision history names Phase 1 (PR #197), the Cloudflare UA follow-up (5db9376), and the live-smoke result on api-dev. Open Question #1 (ephemeral GC) updated with current TODO location. - CLAUDE.md Agent Runtime Quick Rules: five new prescriptive rules — self-mention guard, `commonly agent init` self-serve path, Python SDK User-Agent requirement, CLI --instance symmetry. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Three artifacts in one PR per ADR-006 §Migration path Phase 1. The whole point: `commonly agent init --language python --name research-bot --pod ` produces a running custom Commonly agent in 60 seconds. No publish step, no admin involvement, no framework adoption — just the four CAP verbs.
What's in
1. Backend self-serve webhook install (touches kernel — needs deploy)
2. Python SDK (in-repo reference, no published package per ADR-006 §invariant 5)
3. CLI scaffolder
Reviewer pass (code-reviewer agent, grounded in REVIEW.md + ADR-006)
1 Critical + 4 Important + several nits, all addressed before commit:
What's NOT in (deferred)
Test plan
🤖 Generated with Claude Code