Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .engineering/planning/journal.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -186,3 +186,4 @@
{"args":{"command":"move-status","decided_on":"{\"recorded\":{\"test_result\":1}}","target":"01MEM0000000000000064","to":"proposed"},"changed":{},"entity":"story","entry_hash":"f7c57390b7e5131fcb80e529afc9fc8f04be94cafbad3521328623e05f8c799e","from_state":"draft","id":"retire-ess-specify","parent_hash":"c1af61a4a40e1332156137f5248f7278c4d4dd230c2b94611d7b55b844ab8ffb","payload":{"actor":"human:timo","at":1790318170051,"causation":"cmd-move-story-retire-ess-specify-1790318170051","change":{"change":"moved","decided_on":{"recorded":{"test_result":1}},"from":"draft","to":"proposed"},"correlation":"protocol-artifact-move","event_id":"story:retire-ess-specify@3#0~da6e24e15684d045","executor":null,"recorded_at":"2026-09-25T06:36:10Z"},"revision":3,"to_state":"proposed","type":"aep.status.move/v1","version":1}
{"args":{"command":"move-status","decided_on":"{\"recorded\":{\"test_result\":1}}","target":"01MEM0000000000000064","to":"active"},"changed":{},"entity":"story","entry_hash":"623fa207625dcfc20364669ed3657d4de897709bb53b1e110dcd21099a45becb","from_state":"proposed","id":"retire-ess-specify","parent_hash":"f7c57390b7e5131fcb80e529afc9fc8f04be94cafbad3521328623e05f8c799e","payload":{"actor":"human:timo","at":1790318170218,"causation":"cmd-move-story-retire-ess-specify-1790318170218","change":{"change":"moved","decided_on":{"recorded":{"test_result":1}},"from":"proposed","to":"active"},"correlation":"protocol-artifact-move","event_id":"story:retire-ess-specify@4#0~f0694be4ea570c25","executor":null,"recorded_at":"2026-09-25T06:36:10Z"},"revision":4,"to_state":"active","type":"aep.status.move/v1","version":1}
{"args":{"command":"move-status","decided_on":"{\"recorded\":{\"test_result\":1}}","target":"01MEM0000000000000064","to":"implemented"},"changed":{},"entity":"story","entry_hash":"5f14621f29e41c6d0274cdf4974d88310addd62c3c034f0d64962f007d650f78","from_state":"active","id":"retire-ess-specify","parent_hash":"623fa207625dcfc20364669ed3657d4de897709bb53b1e110dcd21099a45becb","payload":{"actor":"human:timo","at":1790318170388,"causation":"cmd-move-story-retire-ess-specify-1790318170388","change":{"change":"moved","decided_on":{"recorded":{"test_result":1}},"from":"active","to":"implemented"},"correlation":"protocol-artifact-move","event_id":"story:retire-ess-specify@5#0~31bf6cfcddec0e7f","executor":null,"recorded_at":"2026-09-25T06:36:10Z"},"revision":5,"to_state":"implemented","type":"aep.status.move/v1","version":1}
{"args":{"command":"create-entity","data":{"body":"# Story: one-sentence onboarding through `b10x`\n\n## Goal\nA person gives Claude Code or Codex one sentence and this repository's link. The agent follows\n`SETUP.md`: it asks before installing the `b10x` binary, then runs `/b10x:init`, which asks what the\nperson wants to do (plan and deliver work, write specifications, isolated Git checkouts,\nintegrations) and how to install the CLIs (prebuilt archives by default, or `cargo`). `b10x` reads\nboth hosts, the binaries on `PATH` and project settings, and plans exact actions: plugins from the\n`b10x` marketplace, CLIs at their newest release, earlier installs under retired names and\nmarketplaces replaced in place. It applies them only after confirmation, and `/<plugin>:upgrade`\nand the SessionStart check keep them current.\nMeasured before (2026-09-24): on the operator's machine `ess` 0.26.0 ran under plugin 0.30.0 and\n`worktree` 0.4.1 under 0.6.0; nothing reported it.\n\n## Acceptance\nIn an isolated headless trial (`task trial:sandbox`, `task trial:run`, `agentplugins-check\ntrial-isolation`), a home seeded with a pinned agentplugins 0.12.0 and a retired `aep-plan` plugin\nends after `/b10x:upgrade` with `aep@b10x` and `b10x@b10x` at the current version and no retired id\nleft; and a fresh agent given only a sentence and the link reaches a validated ESS specification\nwithout cloning a product repository.\n\n## Scope\n- `crates/b10x/`, `catalog.json`, `SETUP.md`, `.github/workflows/release.yml`\n- `plugins/*/skills/{init,upgrade}`, `plugins/b10x/hooks/hooks.json`\n- `crates/agentplugins-check/` (concept rules, `tools`, `trial-isolation`)\n- README, AGENTS.md, website install and plugin pages\n\n## Provenance\n- Trials 1–3 and rounds 3–4 (2026-09-24/25); agentplugins 0.12.0–0.14.7.\n- Rebuilt on 2026-09-25 from a 2026-09-24 draft that could not be applied to the current store.\n","status":"draft","summary":"An agent given one sentence and the repository link asks, installs b10x, plans plugins and CLIs from recorded state, and applies them only after confirmation.","title":"One-sentence onboarding through b10x"},"entity_type":"aep.story/v1","locator":"ep://planning/store/story/one-sentence-onboarding"},"changed":{"body":"# Story: one-sentence onboarding through `b10x`\n\n## Goal\nA person gives Claude Code or Codex one sentence and this repository's link. The agent follows\n`SETUP.md`: it asks before installing the `b10x` binary, then runs `/b10x:init`, which asks what the\nperson wants to do (plan and deliver work, write specifications, isolated Git checkouts,\nintegrations) and how to install the CLIs (prebuilt archives by default, or `cargo`). `b10x` reads\nboth hosts, the binaries on `PATH` and project settings, and plans exact actions: plugins from the\n`b10x` marketplace, CLIs at their newest release, earlier installs under retired names and\nmarketplaces replaced in place. It applies them only after confirmation, and `/<plugin>:upgrade`\nand the SessionStart check keep them current.\nMeasured before (2026-09-24): on the operator's machine `ess` 0.26.0 ran under plugin 0.30.0 and\n`worktree` 0.4.1 under 0.6.0; nothing reported it.\n\n## Acceptance\nIn an isolated headless trial (`task trial:sandbox`, `task trial:run`, `agentplugins-check\ntrial-isolation`), a home seeded with a pinned agentplugins 0.12.0 and a retired `aep-plan` plugin\nends after `/b10x:upgrade` with `aep@b10x` and `b10x@b10x` at the current version and no retired id\nleft; and a fresh agent given only a sentence and the link reaches a validated ESS specification\nwithout cloning a product repository.\n\n## Scope\n- `crates/b10x/`, `catalog.json`, `SETUP.md`, `.github/workflows/release.yml`\n- `plugins/*/skills/{init,upgrade}`, `plugins/b10x/hooks/hooks.json`\n- `crates/agentplugins-check/` (concept rules, `tools`, `trial-isolation`)\n- README, AGENTS.md, website install and plugin pages\n\n## Provenance\n- Trials 1–3 and rounds 3–4 (2026-09-24/25); agentplugins 0.12.0–0.14.7.\n- Rebuilt on 2026-09-25 from a 2026-09-24 draft that could not be applied to the current store.\n","summary":"An agent given one sentence and the repository link asks, installs b10x, plans plugins and CLIs from recorded state, and applies them only after confirmation.","title":"One-sentence onboarding through b10x"},"entity":"story","entry_hash":"9f4d9f13c72d9bc4b810278dcee3a0269efe2a2d3de40197652599d620457107","from_state":null,"id":"one-sentence-onboarding","parent_hash":"5f14621f29e41c6d0274cdf4974d88310addd62c3c034f0d64962f007d650f78","payload":{"actor":"human:timo","at":1790364155880,"causation":"cmd-new-story-one-sentence-onboarding","change":{"change":"created","status":"draft"},"correlation":"protocol-artifact-new","event_id":"story:one-sentence-onboarding@1#0~91dd8d0a511a3232","executor":null,"recorded_at":"2026-09-25T19:22:35Z"},"revision":1,"to_state":"draft","type":"aep.entity.create/v1","version":1}
39 changes: 39 additions & 0 deletions .engineering/planning/story/one-sentence-onboarding.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
format: aep.planning-md/1
id: story:one-sentence-onboarding
kind: story
status: draft
title: One-sentence onboarding through b10x
summary: An agent given one sentence and the repository link asks, installs b10x, plans plugins and CLIs from recorded state, and applies them only after confirmation.
revision: 1
---
# Story: one-sentence onboarding through `b10x`

## Goal
A person gives Claude Code or Codex one sentence and this repository's link. The agent follows
`SETUP.md`: it asks before installing the `b10x` binary, then runs `/b10x:init`, which asks what the
person wants to do (plan and deliver work, write specifications, isolated Git checkouts,
integrations) and how to install the CLIs (prebuilt archives by default, or `cargo`). `b10x` reads
both hosts, the binaries on `PATH` and project settings, and plans exact actions: plugins from the
`b10x` marketplace, CLIs at their newest release, earlier installs under retired names and
marketplaces replaced in place. It applies them only after confirmation, and `/<plugin>:upgrade`
and the SessionStart check keep them current.
Measured before (2026-09-24): on the operator's machine `ess` 0.26.0 ran under plugin 0.30.0 and
`worktree` 0.4.1 under 0.6.0; nothing reported it.

## Acceptance
In an isolated headless trial (`task trial:sandbox`, `task trial:run`, `agentplugins-check
trial-isolation`), a home seeded with a pinned agentplugins 0.12.0 and a retired `aep-plan` plugin
ends after `/b10x:upgrade` with `aep@b10x` and `b10x@b10x` at the current version and no retired id
left; and a fresh agent given only a sentence and the link reaches a validated ESS specification
without cloning a product repository.

## Scope
- `crates/b10x/`, `catalog.json`, `SETUP.md`, `.github/workflows/release.yml`
- `plugins/*/skills/{init,upgrade}`, `plugins/b10x/hooks/hooks.json`
- `crates/agentplugins-check/` (concept rules, `tools`, `trial-isolation`)
- README, AGENTS.md, website install and plugin pages

## Provenance
- Trials 1–3 and rounds 3–4 (2026-09-24/25); agentplugins 0.12.0–0.14.7.
- Rebuilt on 2026-09-25 from a 2026-09-24 draft that could not be applied to the current store.
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# Changelog

## [0.14.7] — 2026-09-25

The operator's decision on the install method, asked for by a team adopting ESS: anyone with Rust
installed used to get a full source build of every CLI.

- `b10x` installs CLIs from the release's checksummed prebuilt archive by default; `cargo` is used
when `--method cargo` asks for it or a release has no archive. Before, `cargo` on `PATH` made it
the default.
- `b10x:init` offers prebuilt first; the product `init` skills say which method is planned and
offer the other; `SETUP.md`, the install page and the plugin pages say the same.

## [0.14.6] — 2026-09-25

The fixes for the trial findings shipped in aep 0.59.3 and ess 0.32.0; the skills now describe that
Expand Down
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ resolver = "2"
members = ["crates/agentplugins-check", "crates/b10x"]

[workspace.package]
version = "0.14.6"
version = "0.14.7"
edition = "2021"
rust-version = "1.85"
license = "Apache-2.0"
Expand Down
4 changes: 2 additions & 2 deletions SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ says so. Change nothing the user did not confirm.
- If `~/.local/bin` is not on `PATH`, tell the user and use `~/.local/bin/b10x` below.
2. **Run the guided setup.** `b10x setup guide` prints the `/b10x:init` skill; follow it from its
step 2. It asks what the user wants to do (plan and deliver work, write specifications, isolated
Git checkouts, integrations) and how to install the CLIs (`cargo` or prebuilt), lists every
change, and applies it only after the user confirms.
Git checkouts, integrations) and how to install the CLIs (prebuilt by default, or `cargo`),
lists every change, and applies it only after the user confirms.
3. **Continue with the product.** A plugin loads in the next session. To use it now, run
`b10x skill <plugin>:init` (for example `b10x skill ess:init`) and follow the printed text;
`b10x skill <plugin>` lists the rest.
8 changes: 4 additions & 4 deletions crates/b10x/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ enum Top {
/// Products, comma separated: aep, ess, worktree, connectors.
#[arg(value_delimiter = ',')]
products: Vec<String>,
/// How to install CLIs; default: cargo when it is on PATH, else prebuilt.
/// How to install CLIs; default: prebuilt, cargo when a release has no archive.
#[arg(long, value_enum)]
method: Option<MethodArg>,
/// Hosts to plan for.
Expand All @@ -55,7 +55,7 @@ enum Top {
/// Products, comma separated; default: every installed product.
#[arg(value_delimiter = ',')]
products: Vec<String>,
/// How to install CLIs; default: cargo when it is on PATH, else prebuilt.
/// How to install CLIs; default: prebuilt, cargo when a release has no archive.
#[arg(long, value_enum)]
method: Option<MethodArg>,
/// Hosts to plan for.
Expand Down Expand Up @@ -91,7 +91,7 @@ enum Top {
/// Target directory; defaults to `~/.local/bin` (prebuilt) or `~/.cargo/bin` (cargo).
#[arg(long)]
dir: Option<PathBuf>,
/// How to install; default: cargo when it is on PATH, else prebuilt.
/// How to install; default: prebuilt, cargo when a release has no archive.
#[arg(long, value_enum)]
method: Option<MethodArg>,
},
Expand All @@ -108,7 +108,7 @@ enum Setup {
/// Hosts to plan for.
#[arg(long, value_enum, default_value_t = Hosts::All)]
host: Hosts,
/// How to install CLIs; default: cargo when it is on PATH, else prebuilt.
/// How to install CLIs; default: prebuilt, cargo when a release has no archive.
#[arg(long, value_enum)]
method: Option<MethodArg>,
/// Print the plan as JSON.
Expand Down
34 changes: 15 additions & 19 deletions crates/b10x/src/plan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ pub struct Context<'a> {
/// Plan only the selected products (`init`, `upgrade`): nothing else is uninstalled, migrated or
/// removed. `false` makes the selection the whole desired state (`setup plan`).
pub only: bool,
/// How to install binaries; `None` picks cargo when it is on `PATH`, else prebuilt.
/// How to install binaries; `None` picks the prebuilt archive when the release has one, else cargo.
pub method: Option<Method>,
/// Update only what is installed: no new plugins, and a host with nothing Beyond10x on it is
/// left alone (`upgrade`).
Expand Down Expand Up @@ -818,24 +818,23 @@ fn plan_settings(
}
}

/// The install method for one binary: the explicit choice when it can be honoured, else cargo when
/// it is on `PATH`, else the prebuilt archive when the release has one.
fn method(context: &Context<'_>, inventory: &Inventory, install: &Install) -> Option<Method> {
/// The install method for one binary: the explicit choice when it can be honoured, else the prebuilt
/// archive when the release has one, else cargo.
fn method(context: &Context<'_>, install: &Install) -> Option<Method> {
let archive = install.archive.is_some()
&& context
.resolved
.archives
.get(install.repository())
.copied()
.unwrap_or(false);
let cargo = install.cargo.is_some() && inventory.cargo;
match context.method {
Some(Method::Prebuilt) if archive => Some(Method::Prebuilt),
Some(Method::Cargo) if install.cargo.is_some() => Some(Method::Cargo),
_ if cargo => Some(Method::Cargo),
_ if archive => Some(Method::Prebuilt),
_ if install.cargo.is_some() => Some(Method::Cargo),
_ => None,
let cargo = install.cargo.is_some();
if cargo && (matches!(context.method, Some(Method::Cargo)) || !archive) {
Some(Method::Cargo)
} else if archive {
Some(Method::Prebuilt)
} else {
None
}
}

Expand Down Expand Up @@ -898,7 +897,7 @@ fn plan_binaries(
),
});
} else {
let Some(method) = method(context, inventory, &binary.install) else {
let Some(method) = method(context, &binary.install) else {
findings.push(Finding {
level: Level::Warn,
host: None,
Expand Down Expand Up @@ -1458,7 +1457,7 @@ mod tests {
}

#[test]
fn cargo_is_the_default_when_present_and_prebuilt_otherwise() {
fn prebuilt_is_the_default_and_cargo_only_when_asked_or_without_archives() {
let method_for = |cargo: bool, asked: Option<Method>| {
let inventory = Inventory {
claude: Some(HostState::default()),
Expand All @@ -1473,12 +1472,9 @@ mod tests {
_ => None,
})
};
assert_eq!(method_for(true, None), Some(Method::Cargo));
assert_eq!(method_for(true, None), Some(Method::Prebuilt));
assert_eq!(method_for(false, None), Some(Method::Prebuilt));
assert_eq!(
method_for(true, Some(Method::Prebuilt)),
Some(Method::Prebuilt)
);
assert_eq!(method_for(true, Some(Method::Cargo)), Some(Method::Cargo));
}

#[test]
Expand Down
2 changes: 1 addition & 1 deletion plugins/aep/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "aep",
"displayName": "AEP",
"description": "Plan governed work in the AEP artifact store and deliver it in reviewed waves: decomposition, plan critique, reverse engineering, story scoping, implementation and adversarial review.",
"version": "0.14.6",
"version": "0.14.7",
"author": {
"name": "Beyond10x"
},
Expand Down
2 changes: 1 addition & 1 deletion plugins/aep/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "aep",
"version": "0.14.6",
"version": "0.14.7",
"description": "Plan governed work in the AEP artifact store and deliver it in reviewed waves.",
"author": {
"name": "Beyond10x"
Expand Down
7 changes: 4 additions & 3 deletions plugins/aep/skills/init/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ Run `aep --version`. If it answers, go to step 2: `b10x:init` just installed it,
b10x init aep --out ~/.local/state/b10x/plan.json
```

It prints what it would do, including the install method: `cargo` when a Rust toolchain is on
`PATH`, otherwise a prebuilt, checksummed release archive. Ask the user which method they want if
both are possible, re-run with `--method cargo` or `--method prebuilt` to match, show the plan, and
It prints what it would do, including the install method: the prebuilt, checksummed release archive
by default, or `cargo` (a source build) when the user asks for it and a Rust toolchain is on `PATH`.
When both are possible, say which is planned and offer the other; re-run with `--method cargo` if
they choose it, show the plan, and
after they confirm run `b10x setup apply --plan ~/.local/state/b10x/plan.json --yes`.

Planning models new data with ESS (`aep:planning` rule 7). If `ess --version` does not answer, offer
Expand Down
2 changes: 1 addition & 1 deletion plugins/b10x/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "b10x",
"displayName": "Beyond10x",
"description": "Set up, upgrade and check the Beyond10x plugins and binaries, route work to them, and create portable plugins.",
"version": "0.14.6",
"version": "0.14.7",
"author": {
"name": "Beyond10x"
},
Expand Down
2 changes: 1 addition & 1 deletion plugins/b10x/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "b10x",
"version": "0.14.6",
"version": "0.14.7",
"description": "Set up, upgrade and check the Beyond10x plugins and binaries, route work to them, and create portable plugins.",
"author": {
"name": "Beyond10x"
Expand Down
7 changes: 4 additions & 3 deletions plugins/b10x/skills/init/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ question tool when it has one (Claude Code: `AskUserQuestion` with `multiSelect:
command -v cargo
```

Ask: *How should the command-line tools be installed?* — **cargo** (builds from the release tag;
offered first when `cargo` is on `PATH`) or **prebuilt** (downloads the release's checksummed
archive; no Rust toolchain needed). Without `cargo`, say prebuilt is used and skip the question.
Ask: *How should the command-line tools be installed?* — **prebuilt** (the default: downloads the
release's checksummed archive; no Rust toolchain needed) or **cargo** (builds every crate from the
release tag; offered only when `cargo` is on `PATH`). Without `cargo`, say prebuilt is used and skip
the question.

## 4. Plan and confirm

Expand Down
2 changes: 1 addition & 1 deletion plugins/connectors/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "connectors",
"version": "0.14.6",
"version": "0.14.7",
"description": "Set up, inspect, and invoke governed integrations through the connectors CLI.",
"author": { "name": "Beyond10x" },
"license": "Apache-2.0",
Expand Down
2 changes: 1 addition & 1 deletion plugins/connectors/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "connectors",
"version": "0.14.6",
"version": "0.14.7",
"description": "Set up, inspect, and invoke governed integrations through the connectors CLI.",
"author": { "name": "Beyond10x" },
"license": "Apache-2.0",
Expand Down
Loading
Loading