19 Commits
Author SHA1 Message Date
Jason ZhouandClaude Opus 5.5 ce916f288d feat: /leads-signals launch page, lead-signals skill, one-command skill install (#710)
* feat(web): /intent-signals landing page for the buyer-signals launch

"Claude monitor buyer signals": built from /people-search, keeping its skill
grid (now eight signal tiles from the launch film's real run) and the People
Search Bench. New: a morning-run demo, a three-step 'your agent is the
monitor' section (Claude Code /schedule, Codex from cron, diff against the
last list), the $0.98 four-source receipt, and pay-per-check pricing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(web): /intent-signals scenes from the launch film

Replace the monitor steps, the receipt table and the signal tile grid with
the film's own scenes, rebuilt as HTML: a radar and signal feed that judges
each post, a thread → scored companies → decision makers flow with vendor
waterfall, 'treg monitors…' with evidence cards per signal, and the daily
hot-leads list a scheduled run grows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(web): /intent-signals hero plays the whole film in one take

The hero now runs monitor the topic → read the thread → score companies →
find decision makers as one continuous, clickable demo, replacing the old
hero table and the two separate scene sections. The 'treg monitors…'
section goes back to the skill tile grid, each tile now a small visual
scene (post, new position, news, job postings, funding, headcount chart,
tech adopters, Reddit thread) instead of text rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(web): /intent-signals headline 'Claude for Signal Monitor' and the real Reddit mark

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* style(web): /intent-signals nav drops the Signals and Daily list links

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): /intent-signals works at every width

Tablet keeps every column and a smaller radar beside the feed; phone puts
the radar above the feed and the post above its thread, folds secondary
columns, wraps the prompt bar and truncates names instead of overlapping.
The prompt cursor now honours [hidden], and a new prompt clears the last
reply before it types.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* style(web): /intent-signals headline 'Claude for Monitor Leads Signal' in Geist Pixel

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): /intent-signals prices from the billed run, not the film's $0.98

The launch run's LinkedIn, Reddit and X sweep billed $0.52 for 2,945 signals
(4,710 with the free GitHub stargazers): $0.0002 per signal checked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(skills): lead-signals, the /intent-signals workflow as a skill

Detect, qualify, contact, hand back a ranked list; optionally keep watching
on the agent's own schedule with a diff against the last list. It names
signal families and the words to search the catalog with, never endpoint
ids, so it stays right as the catalog grows. Served at
/skills/lead-signals/SKILL.md and as the third entry in the well-known
skills index, like make-ugc.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(skills): lead-signals description says only when to use it; example vendors per signal

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(skills): install our skills with npx skills add superdesigndev/treg

The skills CLI (skills.sh) reads skills/ and skips symlinks, so build_plugin.py
now also writes real copies of the workflow skills (make-ugc, lead-signals)
there, and --check keeps them in step with src/treg/web/skills. The six skills
that are repo tooling carry metadata.internal so the CLI hides them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(skills): vendor-listing is repo tooling, hidden from npx skills add

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(web): /intent-signals shows the one-line skill install

npx skills add superdesigndev/treg --skill lead-signals, beside the treg set-up
command; both copy buttons share one handler and wrap on a phone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(cli): treg skill bootstrap installs every public skill the registry advertises

install.sh already runs it; it now also installs each skill in
/.well-known/skills/index.json (make-ugc, lead-signals) into the same global
agent folders as the treg skill. Best-effort, and a name from the index must
be a plain slug before it becomes a directory.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(skills): lead-signals sends an agent without treg to llms.txt to set up

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(web): the buyer-signals page lives at /leads-signals

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* style(web): /leads-signals tools grid shows Aviato people search instead of Apollo

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* style(web): /leads-signals nav reads Leads signals

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(web): /leads-signals served by _static_page like the other launch pages

The catalog's size comes from {ENDPOINTS}/{PROVIDERS} instead of typed numbers,
and the page carries the shared share image.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(context): the installer also installs the advertised workflow skills

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 19:30:04 +10:00
UncleCode 2ff15db042 fix(hub): with TREG_HUB_TEAMS set, a team outside the list sees no trace of the hub
Before, the team list gated only the hub routes and /call/ of a hub id. The open surfaces kept the
plain flag, so with the hub on for one team every other user still read the hub sections of the
agent files, found approved hub tools in catalog search, could open catalog get and the share page,
and saw hub_create, hub_update and hub_mine in the MCP tool list (listed even with the flag off).

- `hub_app.visible_to(slug)`: a reader with a team is judged by `enabled_for`; a reader with no team
  sees the hub only when the list is empty.
- `routers/hub_gate.reader_team` resolves the key or session a request carries, only while a list
  is set. Catalog search, catalog get and its sibling rows, the share page, /skill.md and /llms.txt
  use it; MCP catalog_search resolves the bearer's team the same way.
- `mcp._HubToolsGate` drops the three hub tools from `tools/list` for anyone who cannot see the hub.
- `treg skill bootstrap` sends the key, so a listed team's agents get the hub sections.
- The static plugin files no longer carry the hub sections (owner, 2026-09-26; replaces the
  2026-09-16 decision to always ship them).

Updates docs/context/architecture/hub.md.
2026-09-26 07:52:48 +08:00
UncleCode 2dacc61470 docs(hub): the plugins always ship the hub section; CHANGELOG
Owner's decision, 2026-09-16: a plugin must carry the hub knowledge whatever a deployment does. A
plugin is a static file installed against ANY registry, including a self-hosted one that may have
the hub switched ON, so a plugin that omitted the section would hide a feature that works there.

- src/treg/web/skill.md, src/treg/web/llms.txt: the hub section gains the instruction for the OFF
  case. Every `/hub/...` route answers 404 and every `treg hub` command refuses when a deployment
  has `hub_enabled` off; an agent reports "this registry does not offer the hub" and uses the rest
  of the catalog, instead of retrying a fault that cannot be fixed. The SERVER still strips the
  whole section while its own flag is off, because the server knows its own state.
- scripts/build_plugin.py: the hub section is no longer behind `--with-hub`; it always ships.
  Leaving it behind a flag meant a plain `--check` rebuilt the plugins WITHOUT the hub, reported all
  five as stale, and invited a regeneration that silently stripped the hub text back out.
  `--with-hub` is still accepted and now does nothing. `--check` passes with and without it.
- The five plugins regenerated: claude, codex, cursor, dsh, minimax.
- CHANGELOG.md: new file, this repo had none. Covers the hub under Unreleased.

Full suite 4069 passed, 8 skipped; agent pages + seo 228; hub + mcp + snapshot 186; import-linter
14/14; plugin check OK. One failure in the parallel run, test_backlinks_ceiling, which passes alone
and whose whole file passes alone (14); no source file in this commit relates to it.
2026-09-16 13:15:21 +08:00
UncleCode c49d648f5d Merge branch 'main' into dev/hub (8.4)
Bring the team's work since 2026-09-09 into the hub branch: the review/feedback system, the arena
insights, the R2 body storage and cache admission for the archive, the shared key-value store, and
the SSRF CGNAT fix. 108 commits, 233 files.

The one real conflict was the migration numbers: both branches used 0026-0030 for different
changes. main's chain is 0026 (callreview) through 0032 (archive body storage); the five hub
migrations are renumbered to 0033-0037 and rechained onto 0032, so there is a single head 0037.
Everything else was additive and kept from both sides: the HubTool/HubRun models beside
CallReview/FeedbackHandling, the `hub` domain and the key-value store both in the AGENTS.md tables,
the hub CLI family beside `treg review`, the hub MCP verbs beside `review` in the tool sets, the
quickjs and obstore/redis dependencies together. mcp_feedback.py was removed on main; the deletion
is kept. The docs fragment's migration numbers were updated.

Full suite 3508 passed; agent pages + SEO 216; boundaries 14/14; the migration chain a single head
0037 on Postgres 16; the plugin staleness guard green.
2026-09-10 20:19:31 +08:00
SToneX ff0bf36d38 feat(copy): quote the catalog's size from the loaded catalog, never by hand 2026-09-10 13:09:12 +08:00
UncleCode d610f3fca6 feat(hub): 7.1 - the front door for agents: skill.md, llms.txt, catalog_get on hub ids
- skill.md and llms.txt gain a hub section (the four files, ctx.call, the check, publish, price,
  the share page, and the owner's rule: never paste a credential into a script - register it
  first, then name the tool) inside <!--hub-->...<!--/hub--> blocks. routers/web.py strips them
  while hub_enabled is off, as it strips the routed-discovery blocks, so a deployment never
  documents what it has not switched on. scripts/build_plugin.py drops the block the same way;
  --with-hub keeps it for the final merge. The blocks are whitespace-neutral: the served and
  generated texts are byte-identical to before when the hub is off.
- GET /catalog/endpoints/<id> (behind catalog_get and treg catalog get) answers for a hub id:
  endpoint.kind == "hub" with summary, inputs, output, the price line, health, version,
  call_template, the page URL and the readme; never the script, the maker's tools or a key.
  Search never lists a hub tool; an unknown hub-shaped id stays a 404 with the near-miss hints.
  The session comes through Depends(get_session) (the pool guard refused a maker import in a router).
- treg catalog get prints a hub tool's contract in its own shape.

Tests: the route's hub shape and what it hides, flag off => plain 404, the agent files carry the
hub text only when the flag is on and never leak markers, the CLI printer. Suite 2923; the plugin
staleness guard and the pool guard pass; boundaries 14/14.
2026-09-10 10:35:57 +08:00
SToneX 0333516fd5 fix(feedback): complete agent docs and domain boundaries 2026-09-07 20:15:28 +08:00
Cursor AgentandJason Zhou 590fc61695 feat(cursor): ship MCP alongside skill in Cursor plugin
The Cursor plugin now declares an MCP server pointing at the remote
https://treg.to/mcp/ endpoint, so installing the plugin gives agents the
MCP tools (catalog_search, catalog_get, call, balance, my_tools) without
a CLI-only dead end. Auth uses Cursor's env variable syntax
(${env:TREG_TOKEN}) for the bearer token.

Changes:
- Add plugins/treg/mcp.json with Cursor's { mcpServers: {...} } format
- Update plugins/treg/.cursor-plugin/plugin.json to declare skills and mcpServers
- Add CURSOR_BOOTSTRAP in build_plugin.py that checks for tools first
- Regenerate plugins/treg/skills/treg/SKILL.md with new bootstrap
- Add tests for Cursor MCP config and bootstrap

The skill now tells agents to check if tools are visible first (they will
be after setting TREG_TOKEN), and maps the CLI commands onto the MCP tools.
This matches the Codex plugin's approach.

Auth verified:
- Live https://treg.to/mcp/ returns 401 with OAuth metadata for unauth calls
- All 162 MCP auth tests pass (test_mcp.py, test_mcp_oauth.py, test_mcp_install.py)
- Token and OAuth flows both work end-to-end

Co-authored-by: Jason Zhou <JayZeeDesign@users.noreply.github.com>
2026-08-30 05:17:43 +00:00
Jason ZhouandClaude Opus 5 e6dc697ddc fix(plugin): the generated SKILL.md copies strip the routed markers
`<!--routed-->` delimits the section /skill.md removes when a deployment sets
TREG_ROUTED_DISCOVERY=off. A plugin copy is static and cannot know a deployment's
setting, so it keeps the content — but shipping the markers would put visible
HTML comments in the product's most-read page. test_plugin caught it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01189rW3MxcaVTPqxqSZTQot
2026-08-29 15:24:47 +10:00
Jason ZhouandClaude Fable 5 128a791349 refactor(plugin): move the MiniMax root under plugins/ beside the Cursor root
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WBkwAP4DPMJsxBRmG1UGSb
2026-08-25 11:46:24 +10:00
Jason ZhouandClaude Fable 5 96b0c05e13 feat(plugin): MiniMax Plugin Marketplace listing (skills-only) + validator/zip + submission runbook
Adds minimax/ as a fifth generated shop window: .minimax-plugin/plugin.json
(schemaVersion 1, Productivity), icon, and a SKILL.md rendered by build_plugin.py
with a CLI-only bootstrap (no treg mcp install — it cannot write a MiniMax config).
scripts/minimax_plugin.py pre-runs MiniMax's intake rules and builds a wrapper-free
ZIP; both are pinned by tests/test_plugin.py. docs/MINIMAX-PLUGIN.md carries the
form values, pipeline, review risks and the App/Connector path for native MCP.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WBkwAP4DPMJsxBRmG1UGSb
2026-08-25 11:16:59 +10:00
Jason ZhouandClaude Opus 5 931a535627 feat(plugin): add the DeepSeek Harness bundle
A fourth shop window off the same generated skill. dsh reads no plugin.json:
it installs an npm package whose package.json declares `dsh.bundle`, pointing
at a config layer that composes into the user's profile.

    dsh plugin --profile <name> add github:superdesigndev/treg

It is the only surface that can ship the connector AND the CLI path in one
zero-config install. The Claude manifest declares no MCP server because
anything declared there is registered before anyone has signed in - five
always-on tools that 401 on every call. dsh evaluates a row's `disabled`
expression at boot, so the treg MCP row can exist and stay off until
TREG_TOKEN is in the environment: a token-holder gets mcp__treg__* at boot,
everyone else gets a clean install and a skill that walks them to `treg login`.

The dsh variant gets its own bootstrap for two reasons the other three do not
have: the tools are namespaced (`mcp__treg__call`, not `call`), and
`treg mcp install` is the wrong move here - it writes Claude Code / Cursor /
opencode configs, never a dsh profile. `treg mcp install` now says so when it
detects ~/.dsh, and points at the bundle instead.

dsh/index.js is hand-written ESM with no dependencies, both deliberate: a git
install fetches sources rather than build output (a `prepare` script would make
every user allowlist a build first), and an out-of-tree bundle depending on an
in-box @deepseek-ai package installs a second copy that drifts from the host's.
tests/test_plugin.py pins both, plus the no-token gate.

Verified against @deepseek-ai/dsh@0.1.0-rc.6: the bundle installs into a
profile, its layer composes, and the package resolves and returns a valid skill
candidate. The first version of the gate read `!!js !process.env.TREG_TOKEN`,
which took the whole profile down with "duplication of a tag property" - YAML
reads the second `!` as another tag. That is now a test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsD1EYGHk1an8DLL1yrzqK
2026-08-15 16:44:25 +10:00
Jason ZhouandClaude Opus 5 9ddc5992e3 feat(cursor): add the Cursor plugin, in the layout Cursor actually prescribes
We had nothing for Cursor — only .claude-plugin/ and plugin/.codex-plugin/ — so
submitting the repo to their marketplace would have listed something with nothing
installable in it.

Cursor's layout is not Claude Code's, and the difference is the part that bites:

  .cursor-plugin/marketplace.json            repo root
  plugins/treg/.cursor-plugin/plugin.json    per-plugin manifest
  plugins/treg/skills/treg/SKILL.md
  plugins/treg/assets/logo.svg

The plugin root is NEVER the repo root here. Claude Code takes `source: "./"`;
Cursor wants `./plugins/<name>`, matching the folder name. Their marketplace
schema also differs — a metadata{} block instead of a top-level description, and
no $schema — so the two manifests are not copies of each other and should not be
"fixed" to match.

Verified with cursor/plugin-template's OWN validator (scripts/validate-template.mjs
run against this repo): passes, with only the two optional-component warnings the
template emits for itself. A test now pins the same rules so it cannot rot.

build_plugin.py grows a third variant rather than a third source. Claude and
Cursor share one CLI_BOOTSTRAP: both give the agent a terminal, neither ships a
connector, and `treg mcp install` writes a verified config for both. Two
near-identical strings would have drifted; the old Claude-only wording also named
~/.claude/skills explicitly, which is wrong for Cursor, so it is agent-neutral now
and shorter for it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012x16Skh3DNWoqv7LgNxUYF
2026-08-15 11:55:35 +10:00
Jason ZhouandClaude Opus 5 33598ed6c9 fix(plugin): three prompts max, and stop asserting tools the upload path strips
Two things the OpenAI upload form told us that nothing local could.

BLOCKING: `interface.defaultPrompt` must contain at most three prompts; we had
four. Dropped the balance/my_tools one — the three kept cover enrichment,
backlinks-with-price, and provider comparison, which is the story that matters.
Pinned with a test, since an upload round-trip is an expensive way to rediscover
a constant.

WORSE, and only an "info" notice on the form: "Uploaded plugins are currently
limited to skills only — MCP configuration from mcpServers, mcp.json and
.mcp.json will not be included." The Codex skill opened with "You already have
treg — use the tools, not the terminal" and a table of five tools. Uploaded that
way, every one of those sentences is false, and the first run is an agent
hunting for tools that were stripped at submission — the exact failure the
bootstrap exists to prevent, just inverted.

So the bootstrap now DETECTS instead of asserting: look at your tools first, use
them if they are there, install the CLI if they are not. That is correct for
both arrival paths rather than betting on one, which matters because the
connector route still exists and this manifest still declares it — the directory
simply drops it on upload today. Also notes that registering MCP into Codex is
manual (config.toml + env-var indirection), so the skill does not send anyone to
`treg mcp install`, which does not write Codex.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012x16Skh3DNWoqv7LgNxUYF
2026-08-15 10:55:43 +10:00
Jason ZhouandClaude Opus 5 46459b5b36 feat(plugin): the Claude skill wires up CLI + login + MCP on first run
Supersedes the previous take, which told the agent to SKIP `treg mcp install`.
That was wrong twice over.

Wrong on intent: the wanted end state is CLI + skill + tools, not skill alone.
Skills-only is a property of the MANIFEST, not of what the user ends up with.
The manifest still declares no connector — anything it declared would be
registered at install time, before a human has signed in, i.e. five always-on
tools that 401 on every call — and that is what keeps `/plugin install`
zero-config. The SKILL then finishes the setup at first run, when a human IS
present to sign in.

Wrong on fact: it warned that `treg mcp install` would "register a second copy
which would fail with 401". cmd_mcp_install does neither. It reads the token
from config and sys.exits BEFORE writing anything when there is none, and again
on a 401 with "nothing was written". So a premature run is a silent no-op, and
after `treg login` the registration simply works. An overstated warning in the
product's most-read page is its own kind of wrong.

The bootstrap is now an ordered three-step block — install.sh, treg login,
treg mcp install — and the order is load-bearing for the reason above: step 3
ahead of step 2 writes nothing, quietly enough that an agent moves on believing
the tools exist. A test pins the sequence, and pins the restart note too, since
`claude mcp add` does not take effect until the agent restarts.

Also noted for the human rather than acted on: install.sh always runs
`treg skill bootstrap` (no flag suppresses it), so step 1 drops a second copy of
this same skill into ~/.claude/skills/treg/. Harmless but redundant with the
plugin. Deleting files under $HOME is not a skill's call to make.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012x16Skh3DNWoqv7LgNxUYF
2026-08-15 00:16:36 +10:00
Jason ZhouandClaude Opus 5 503099787d feat(plugin): ship treg as a skills-only Claude Code plugin, and four doors to one skill
The Codex plugin is built around the MCP connector, and that listing sits in a
review queue. The skill never needed MCP: src/treg/web/skill.md already teaches
an agent to install the CLI, sign in, and call the catalog. So it also ships as
a Claude Code plugin, served from this repo as its own marketplace — live the
moment it merges, with no reviewer in the loop.

  /plugin marketplace add superdesigndev/treg
  /plugin install treg@treg

build_plugin.py grows a second variant rather than a second source. The two
differ ONLY in the prepended bootstrap, because they arrive in opposite worlds:
the Codex plugin ships tools, so its bootstrap says "use the tools, not the
terminal"; the Claude plugin ships none, so its bootstrap says the opposite —
install the CLI first, and do not ask the human for a provider key. The Claude
copy also gets a `version:` stamped into its frontmatter: ClawHub requires it,
Claude Code ignores it, and that is what lets one file satisfy both registries.

skills/treg/ sits at the REPO ROOT, not under plugin/, because that one path is
simultaneously what Claude Code's loader auto-discovers, what `npx skills add`
resolves, and what `clawhub skill publish` takes. `source: "./"` then makes the
plugin root the repo root — so anything auto-discovered there ships to users,
and a test asserts no stray commands/, agents/ or hooks/ appears.

A fourth door needs no registry at all: /.well-known/skills/index.json plus
/.well-known/skills/treg/SKILL.md make this host a first-class skill source
under the agentskills.io convention (Hermes reads it directly). It routes
through the same _serve_md as /skill.md, so {BASE} templates to the SERVING
host — a self-hosted registry advertises itself, not treg.to. The index
description is read from the skill's frontmatter at request time rather than
duplicated, and a test fails the moment the two disagree.

Two things corrected on the way past:
  - the Codex manifest claimed MIT. LICENSE is Apache-2.0 plus a hosted-service
    restriction, and a store listing is where a wrong licence does real damage.
  - the two listings described the product differently. Both now carry the one
    line llms.txt opens with, pinned by a test across all three places it lives.

Docs are in the same commit per CLAUDE.md. Note drift.sh has moved to
.agents/skills/ — the path in CLAUDE.md is stale.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012x16Skh3DNWoqv7LgNxUYF
2026-08-14 23:57:55 +10:00
Jason ZhouandClaude Fable 5 8ca54c0c6f feat: treg.to is the canonical domain — treg.superdesign.dev becomes the legacy alias
public_url/email_from defaults, render.yaml, CLI fallbacks, packaging (npm/plugin/pyproject),
web pages (+canonical tag), docs and context fragments all move to https://treg.to.

The legacy host keeps serving the FULL API forever — installed CLIs, skill.md files and
.mcp.json configs in the wild hold Bearer tokens pointed at it, and HTTP clients strip
Authorization on cross-host redirects. Only browser-facing marketing pages 301 to treg.to
(new middleware + tests).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 11:56:20 +10:00
Jason ZhouandClaude Fable 5 cebf8dd502 feat: agent-first onboarding, Getting started revamp, catalog Try-it, skill rename (#64)
* feat(web): first-run agent onboarding + Getting started revamp

New signups land on #connections (the default view for any signed-in
arrival with no deep link). The welcome modal grows two steps after
team creation: an agent picker (OpenClaw / Hermes / Claude.ai / Claude
Code / Codex + more) and the per-agent setup line. The old docked
"Getting started" stepper (onb.*) is removed entirely.

Getting started is rebuilt as numbered cards — ① Set up your <agent>
(setup line + the already-created API key, masked) and ② Try it out
(four copyable live-data prompts, each verified through the catalog,
plus OAuth connect chips for social/ads/site-SEO) — moved to the top
of the nav, above Catalog. Main content column is now centered;
"Your tools" renamed to "Your vault"; page titles reworded.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U72hGQwYvVSyzh7XGqNra9

* feat(skill): rename the installed skill tools-registry -> treg

The skill installed into agents was named/foldered "tools-registry",
which matched neither the `treg` command nor the brand agents see —
confusing both agents and humans. Now: skill.md frontmatter name is
treg, `treg skill bootstrap` writes <agent>/skills/treg/ (and retires
a leftover tools-registry/ folder when it holds only our SKILL.md),
install.sh's fallback path and the Claude plugin folder follow suit.

The PyPI package name (tools-registry) is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U72hGQwYvVSyzh7XGqNra9

* feat(skill): sell the skill in its description, not describe it

The old description led with mechanics (catalog vs own-tools split).
Now it leads with when to reach for it — data access (SEO/SERP,
keyword volume, backlinks, social & trends, enrichment, ads,
scraping) and acting on connected accounts (posting, ad campaigns,
site SEO via OAuth) — and pitches treg as OpenRouter for agent
tools. Kept YAML-safe (no ": " inside the plain scalar).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U72hGQwYvVSyzh7XGqNra9

* feat(agents): one setup line everywhere — llms.txt carries the flow

The ~30-line "Agent instruction" duplicated what llms.txt and the
skill already teach (catalog search, prices, scan/upload); the only
things a prompt can carry that a file cannot are the token, the team,
and the authorization to run. So the instruction everywhere is now
exactly:  set up treg — {BASE}/llms.txt with token <T>, team <slug>
(welcome modal, Getting started, sidebar copy row, preview modal —
all one buildAgentPrompt).

llms.txt absorbs the rest: a "set up treg" agent flow (permission
once, work straight through, prove it with one relevant call), the
star-the-repo ask after first real data, and its money rules drop
the confirm-price-with-the-human ritual — prices are visible, calls
are fractions of a cent, just call.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U72hGQwYvVSyzh7XGqNra9

* feat(catalog): Try-it is the primary CTA, with agent/CLI/API/manual tabs

On an endpoint row, "▶ Try it" is now the ink-fill primary action and
the old "Connect {provider}" is demoted to a secondary "Bring your own
key" (its real meaning — your key wins over treg's and isn't metered).

The Try-it drawer gains four tabs (AI Agent default): AI Agent shows a
one-line setup (team + token embedded here only, a run-now context) and
a ready "Use treg to call <id>" prompt; CLI shows install/login →
catalog get → the filled treg call; API shows the curl /call/ form with
the token header (+ X-Treg-Org in session mode); Manual is the existing
live test form.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U72hGQwYvVSyzh7XGqNra9

* fix(catalog): OAuth endpoints keep Connect as primary; fix dead Manual Run

Which run action is primary now depends on the provider's auth_kind
(mkOauth): OAuth providers (act as your account, can't use treg's key)
keep Connect as the ink-fill primary with Try-it secondary; key/token
providers keep Try-it primary with "Bring your own key" secondary.

The Manual tab no longer strands a disabled Run hugging the tab bar
when the endpoint isn't callable from this org — it shows a banner
pointing at Connect / the AI Agent / CLI / API tabs instead, and a
"no parameters — just run it" hint for the param-less callable case.

Retitles the markup test to the new run-actions intent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U72hGQwYvVSyzh7XGqNra9

* feat(landing): 0% additional fee band after pay-for-results

Centered pixel-type headline plus a dark mono equation card that types
out "provider rate + $0.000 markup = your price" on scroll, with a
one-line note that treg earns on vendor volume pricing, not markup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018UnVdcbzN8H4mXQaTkHdvD

* feat(web): billing — one-click fund cards + auto top-up toggle

Add funds is now four preset cards ($5/$10/$25/$50); clicking one goes
straight to Stripe checkout — no dropdown-then-button. Auto top-up is a
toggle: switching it on reveals the settings panel (amount, threshold,
the PSD2 consent mandate, confirm); the toggle alone can only disarm or
open the panel — arming still requires the recorded consent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8t2aMqbfstGqStPLsoxDq

* feat(web): default landing is Getting started, not the catalog

New signups (after the welcome modal) and every signed-in arrival at
/app with no deep link or hash now land on #start (Getting started)
instead of #connections. welcomeFinish and both boot paths updated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U72hGQwYvVSyzh7XGqNra9

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:18:31 +10:00
UncleCode e4de297ebb feat(plugin): the Codex/ChatGPT plugin — connector plus skill, like OpenAI's own
The listing is the point: traffic from the directory ChatGPT and Codex share, instead of needing to
already know to run install.sh. What it ships is BOTH halves, exactly as OpenAI's `github` plugin
declares `"skills"` and `"apps"` together:

  * `.mcp.json` — the connector, pointing at https://treg.superdesign.dev/mcp/ with the token read
    from TREG_TOKEN. This is what makes the plugin work the moment it is installed.
  * `skills/tools-registry/SKILL.md` — the judgement. Tools alone would tell a model HOW to call
    treg and nothing about WHEN it is the right move or how to choose between providers.

The skill is GENERATED from src/treg/web/skill.md by scripts/build_plugin.py, and a test fails if the
copy drifts. It gains one section the served version does not have: the served skill is written
around the `treg` command line, because that is how every other install path reaches treg — a plugin
user has no terminal, they have the connector's tools, so the top of the page maps one onto the other
and says what to do if the tools are absent (set TREG_TOKEN). Without it the first run is an agent
dutifully trying to run a shell command that does not exist, which is the listing's whole funnel
spent on an error.

`category` and `capabilities` are not guesses: read from OpenAI's own installed manifests under
~/.codex/plugins/cache — github is Developer Tools + ["Interactive","Write"], gmail is Communication.
The published docs list neither set of allowed values.

Two tests guard what a public listing cannot easily walk back: the copy may never claim routing or
automatic failover (treg compares, the agent chooses — the landing page needed that correction
once), and the connector must point at production over https, never a dev box or localhost.

docs/PLUGIN-SUBMISSION.md carries every field of the submission form, the five positive and three
negative test cases it requires, and the blockers — business identity verification, and a SUPPORT URL
that treg does not yet have (/support, /contact and /help are all 404).
2026-08-09 19:07:41 +08:00