From 4b0fedf53ecb0bf7341fb358d1a3424bedaa7374 Mon Sep 17 00:00:00 2001 From: "Alex H. Raber" Date: Mon, 25 May 2026 17:18:06 -0700 Subject: [PATCH 01/13] feat: implement comprehensive dual-audience documentation system - Establish human-facing mdBook in docs/book covering mental model, workflows, and reference. - Establish agent-facing API orientation corpus in docs/agent for deterministic orientation. - Update agent entrypoint templates (AGENTS.md, etc.) to mandate API index consultation. - Align code with documentation: implement container_workspaces configuration and validation. - Add GitHub Actions workflow for automatic mdBook deployment. - Update root README with documentation pointers. --- .github/workflows/docs.yml | 49 +++++++++++ AGENTS.md | 11 ++- CLAUDE.md | 8 ++ CODEX.md | 8 ++ GEMINI.md | 8 ++ README.md | 13 ++- docs/agent/README.md | 11 +++ docs/agent/api-index.md | 38 +++++++++ docs/agent/command-contracts.md | 37 +++++++++ docs/agent/config-schema.md | 38 +++++++++ docs/agent/error-recovery.md | 36 +++++++++ docs/agent/llms.txt | 28 +++++++ docs/agent/payload-examples.md | 58 +++++++++++++ docs/agent/state-model.md | 31 +++++++ docs/book/book.toml | 10 +++ docs/book/src/SUMMARY.md | 25 ++++++ docs/book/src/concepts/constitution.md | 25 ++++++ docs/book/src/concepts/intent.md | 19 +++++ docs/book/src/concepts/overrides.md | 28 +++++++ docs/book/src/concepts/proof.md | 21 +++++ docs/book/src/concepts/workspaces.md | 22 +++++ docs/book/src/configuration.md | 27 +++++++ docs/book/src/introduction.md | 24 ++++++ docs/book/src/mental-model.md | 28 +++++++ docs/book/src/quickstart.md | 67 +++++++++++++++ docs/book/src/reference/artifacts.md | 25 ++++++ docs/book/src/reference/cli.md | 81 +++++++++++++++++++ docs/book/src/reference/config-toml.md | 46 +++++++++++ docs/book/src/reference/errors.md | 29 +++++++ docs/book/src/workflows/external-trackers.md | 18 +++++ docs/book/src/workflows/multi-agent.md | 21 +++++ docs/book/src/workflows/single-agent.md | 24 ++++++ .../book/src/workflows/workspace-isolation.md | 23 ++++++ src/cli.rs | 22 +++++ src/core/assets.rs | 17 ++++ src/core/validate.rs | 18 ++++- src/lib.rs | 3 + 37 files changed, 994 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/agent/README.md create mode 100644 docs/agent/api-index.md create mode 100644 docs/agent/command-contracts.md create mode 100644 docs/agent/config-schema.md create mode 100644 docs/agent/error-recovery.md create mode 100644 docs/agent/llms.txt create mode 100644 docs/agent/payload-examples.md create mode 100644 docs/agent/state-model.md create mode 100644 docs/book/book.toml create mode 100644 docs/book/src/SUMMARY.md create mode 100644 docs/book/src/concepts/constitution.md create mode 100644 docs/book/src/concepts/intent.md create mode 100644 docs/book/src/concepts/overrides.md create mode 100644 docs/book/src/concepts/proof.md create mode 100644 docs/book/src/concepts/workspaces.md create mode 100644 docs/book/src/configuration.md create mode 100644 docs/book/src/introduction.md create mode 100644 docs/book/src/mental-model.md create mode 100644 docs/book/src/quickstart.md create mode 100644 docs/book/src/reference/artifacts.md create mode 100644 docs/book/src/reference/cli.md create mode 100644 docs/book/src/reference/config-toml.md create mode 100644 docs/book/src/reference/errors.md create mode 100644 docs/book/src/workflows/external-trackers.md create mode 100644 docs/book/src/workflows/multi-agent.md create mode 100644 docs/book/src/workflows/single-agent.md create mode 100644 docs/book/src/workflows/workspace-isolation.md diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..d56e4076 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,49 @@ +name: Deploy Docs + +on: + push: + branches: + - main + paths: + - 'docs/book/**' + pull_request: + paths: + - 'docs/book/**' + +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install mdBook + run: | + mkdir bin + curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.40/mdbook-v0.4.40-x86_64-unknown-linux-gnu.tar.gz | tar -xz -C bin + echo "$(pwd)/bin" >> $GITHUB_PATH + + - name: Build with mdBook + run: mdbook build docs/book + + - name: Upload artifact + if: github.ref == 'refs/heads/main' + uses: actions/upload-pages-artifact@v3 + with: + path: docs/book/book + + deploy: + if: github.ref == 'refs/heads/main' + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/AGENTS.md b/AGENTS.md index 0221cc42..79dd7952 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,6 +4,14 @@ This is a Decapod-managed repository. **Strict Dependency: You are strictly boun This contract applies equally to Claude, Codex, Gemini, Cursor, Kilo, and any other agent operating here. +## Mandatory Orientation + +**Before performing any Decapod operations beyond help/version checks, you MUST read the Agent API Orientation corpus:** + +1. Read **[docs/agent/api-index.md](docs/agent/api-index.md)** for high-level orientation. +2. Consult **[docs/agent/command-contracts.md](docs/agent/command-contracts.md)** for specific command requirements and recovery paths. +3. Reference **[docs/agent/payload-examples.md](docs/agent/payload-examples.md)** for valid call shapes. + ## Mandatory Initialization ```bash @@ -45,6 +53,7 @@ decapod rpc --op context.scope --params '{"query":"","limit":8}' 9. **MUST** stop if requirements conflict or intent is ambiguous. 10. **MUST** respect the interface abstraction boundary. 11. **MUST** maintain **Living Specs**: treat `.decapod/generated/specs/*` as dynamic documents; align them with reality before and after every implementation. +12. **MUST** use the command contracts in `docs/agent/command-contracts.md` instead of guessing arguments. ## Decapod Invocation Contract @@ -112,7 +121,7 @@ Decapod maintains custody via: - External task managers are allowed, but Decapod todos are still mandatory for workspace isolation. - DO NOT mutate `.decapod/` state directly; use decapod CLI. Access to `.decapod/` is strictly via decapod CLI. - Use `decapod capabilities --format json` to discover available operations. -- Stop if requirements conflict or intent is ambiguous. Respect the Interface abstraction boundary. +- Stop if requirements conflict or intent is ambiguous. Respect the interface abstraction boundary. - Treat lock/contention failures as blocking until resolved. \n"); + for line in missing_lines { + updated_content.push_str(&line); + updated_content.push('\n'); + } + + fs::write(&override_path, updated_content).map_err(error::DecapodError::IoError)?; + Ok(FileAction::Created) +} + pub fn scaffold_project_entrypoints( opts: &ScaffoldOptions, ) -> Result { diff --git a/src/lib.rs b/src/lib.rs index 1f735610..bffedae3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1634,6 +1634,24 @@ pub fn run() -> Result<(), error::DecapodError> { return Ok(()); } Some(InitCommand::With(with)) => *with, + Some(InitCommand::Refresh) => { + let target = resolve_existing_init_dir(¤t_dir)?; + let cfg = match load_project_config_if_present(&target)? { + Some(c) => c, + None => { + return Err(error::DecapodError::ValidationError( + "No Decapod project found to refresh. Run `decapod init` first." + .to_string(), + )); + } + }; + // Blend OVERRIDE.md additions + let _ = scaffold::blend_overrides(&target)?; + // Sync config (adds missing default fields) + write_project_config(&target, &cfg, false)?; + // Get 'with' from existing config + init_with_from_config(&cfg, target.clone(), false, false) + } None => { if init_group.dir.is_some() && init_group.project_dir.is_some() { return Err(error::DecapodError::ValidationError( From a723c5c0f983083cd7b4ad460e1109e1e4fef0bb Mon Sep 17 00:00:00 2001 From: "Alex H. Raber" Date: Mon, 25 May 2026 20:52:22 -0700 Subject: [PATCH 10/13] feat: implement smart bootstrap and automated environment refresh - Update 'decapod init' to automatically refresh environment (blend overrides, sync config) if .decapod exists. - Addcrates.io version check to 'decapod capabilities' with automatic comparison. - Implement smart bootstrap logic in entrypoint templates: only install/init if a newer version is available. - Remove redundant 'init refresh' subcommand. - Update Safety Invariants to include version-aware gate checks. --- AGENTS.md | 7 ++++--- CLAUDE.md | 5 +++-- CODEX.md | 5 +++-- GEMINI.md | 5 +++-- src/cli.rs | 2 -- src/core/assets.rs | 12 +++++++----- src/core/rpc.rs | 31 +++++++++++++++++++++++++++++++ src/lib.rs | 30 +++++++++--------------------- 8 files changed, 60 insertions(+), 37 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 92532588..28839ad5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,8 +13,9 @@ This is a Decapod-managed repository. **Strict Dependency: You are strictly boun ## Mandatory Initialization ```bash -cargo install decapod -decapod init refresh && decapod docs ingest && decapod validate && decapod session acquire +# Smart bootstrap: only install/init if a newer version is available +(decapod capabilities --format json | grep -q '"is_latest":true') || (cargo install decapod && decapod init) +decapod docs ingest && decapod validate && decapod session acquire decapod rpc --op agent.init decapod workspace status decapod todo add "" && decapod todo claim --id @@ -76,7 +77,7 @@ Preserve the chain between intent, context, assumptions, action, and proof. ## Safety Invariants - ✅ Router: `decapod rpc --op constitution.get --params '{"section":"core/DECAPOD"}'` -- ✅ Gates: `cargo install decapod` | `decapod init refresh` | `decapod docs ingest` | `decapod validate` +- ✅ Gates: `decapod capabilities` | `decapod docs ingest` | `decapod validate` - ✅ Claims: `decapod todo claim --id ` | ✅ Auth: `DECAPOD_SESSION_PASSWORD` - ✅ Workspace: Docker git workspaces | ✅ Privilege: request elevated permissions before Docker/container workspace commands diff --git a/CLAUDE.md b/CLAUDE.md index fd431bdf..bc404a7e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,8 +21,9 @@ See `AGENTS.md` for the universal contract. ## Quick Start ```bash -cargo install decapod -decapod init refresh && decapod docs ingest && decapod validate && decapod session acquire +# Smart bootstrap: only install/init if a newer version is available +(decapod capabilities --format json | grep -q '"is_latest":true') || (cargo install decapod && decapod init) +decapod docs ingest && decapod validate && decapod session acquire decapod rpc --op agent.init decapod workspace status decapod todo add "" && decapod todo claim --id diff --git a/CODEX.md b/CODEX.md index f3114310..1171a28e 100644 --- a/CODEX.md +++ b/CODEX.md @@ -21,8 +21,9 @@ See `AGENTS.md` for the universal contract. ## Quick Start ```bash -cargo install decapod -decapod init refresh && decapod docs ingest && decapod validate && decapod session acquire +# Smart bootstrap: only install/init if a newer version is available +(decapod capabilities --format json | grep -q '"is_latest":true') || (cargo install decapod && decapod init) +decapod docs ingest && decapod validate && decapod session acquire decapod rpc --op agent.init decapod workspace status decapod todo add "" && decapod todo claim --id diff --git a/GEMINI.md b/GEMINI.md index b0b962ff..99ed55d6 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -21,8 +21,9 @@ See `AGENTS.md` for the universal contract. ## Quick Start ```bash -cargo install decapod -decapod init refresh && decapod docs ingest && decapod validate && decapod session acquire +# Smart bootstrap: only install/init if a newer version is available +(decapod capabilities --format json | grep -q '"is_latest":true') || (cargo install decapod && decapod init) +decapod docs ingest && decapod validate && decapod session acquire decapod rpc --op agent.init decapod workspace status decapod todo add "" && decapod todo claim --id diff --git a/src/cli.rs b/src/cli.rs index 3cd15c41..3a41953e 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -169,8 +169,6 @@ pub(crate) enum InitCommand { /// Apply explicit init options (non-interactive). #[clap(alias = "wtih")] With(Box), - /// Update existing Decapod state without manual entries (blends config and overrides). - Refresh, } #[derive(clap::Args, Debug, Clone)] diff --git a/src/core/assets.rs b/src/core/assets.rs index 020bffa0..5dfc40bb 100644 --- a/src/core/assets.rs +++ b/src/core/assets.rs @@ -246,8 +246,9 @@ See `AGENTS.md` for the universal contract. ## Quick Start ```bash -cargo install decapod -decapod init refresh && decapod docs ingest && decapod validate && decapod session acquire +# Smart bootstrap: only install/init if a newer version is available +(decapod capabilities --format json | grep -q '"is_latest":true') || (cargo install decapod && decapod init) +decapod docs ingest && decapod validate && decapod session acquire decapod rpc --op agent.init decapod workspace status decapod todo add "" && decapod todo claim --id @@ -309,8 +310,9 @@ This is a Decapod-managed repository. **Strict Dependency: You are strictly boun ## Mandatory Initialization ```bash -cargo install decapod -decapod init refresh && decapod docs ingest && decapod validate && decapod session acquire +# Smart bootstrap: only install/init if a newer version is available +(decapod capabilities --format json | grep -q '"is_latest":true') || (cargo install decapod && decapod init) +decapod docs ingest && decapod validate && decapod session acquire decapod rpc --op agent.init decapod workspace status decapod todo add "" && decapod todo claim --id @@ -372,7 +374,7 @@ Preserve the chain between intent, context, assumptions, action, and proof. ## Safety Invariants - ✅ Router: `decapod rpc --op constitution.get --params '{"section":"core/DECAPOD"}'` -- ✅ Gates: `cargo install decapod` | `decapod init refresh` | `decapod docs ingest` | `decapod validate` +- ✅ Gates: `decapod capabilities` | `decapod docs ingest` | `decapod validate` - ✅ Claims: `decapod todo claim --id ` | ✅ Auth: `DECAPOD_SESSION_PASSWORD` - ✅ Workspace: Docker git workspaces | ✅ Privilege: request elevated permissions before Docker/container workspace commands diff --git a/src/core/rpc.rs b/src/core/rpc.rs index 76f2cc9c..31aec533 100644 --- a/src/core/rpc.rs +++ b/src/core/rpc.rs @@ -450,6 +450,10 @@ pub struct CapabilitiesReport { /// Active repository configuration #[serde(skip_serializing_if = "Option::is_none")] pub config: Option, + /// Current version status against crates.io + pub is_latest: bool, + /// Latest version available on crates.io + pub latest_version: String, } /// Individual capability @@ -573,6 +577,9 @@ pub fn generate_capabilities() -> CapabilitiesReport { .map(|root| crate::cli::DecapodProjectConfig::load(&root).ok()) .unwrap_or_default(); + let latest_version = get_latest_version(); + let is_latest = latest_version == env!("CARGO_PKG_VERSION"); + CapabilitiesReport { version: env!("CARGO_PKG_VERSION").to_string(), capabilities: vec![ @@ -786,7 +793,31 @@ pub fn generate_capabilities() -> CapabilitiesReport { "decision_required".to_string(), ], config, + is_latest, + latest_version, + } +} + +fn get_latest_version() -> String { + use std::process::Command; + let output = Command::new("curl") + .args([ + "-s", + "--connect-timeout", + "2", + "https://crates.io/api/v1/crates/decapod", + ]) + .output(); + + if let Ok(output) = output + && output.status.success() + { + let json: serde_json::Value = serde_json::from_slice(&output.stdout).unwrap_or_default(); + if let Some(v) = json["crate"]["max_version"].as_str() { + return v.to_string(); + } } + env!("CARGO_PKG_VERSION").to_string() } /// Create a successful response diff --git a/src/lib.rs b/src/lib.rs index bffedae3..3244514f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1447,10 +1447,16 @@ fn run_init_apply( println!( "{} {}", "init:".bright_yellow(), - "already initialized (.decapod exists); rerun with --force, or use `decapod init with --force`" - .bright_red() + "Existing Decapod project detected. Refreshing environment..." ); - return Ok(target_dir); + // Blend OVERRIDE.md additions + let _ = scaffold::blend_overrides(&target_dir)?; + // Sync config (adds missing default fields) + if let Some(cfg) = load_project_config_if_present(&target_dir)? { + write_project_config(&target_dir, &cfg, false)?; + } + // Sync override checksums + let _ = docs_cli::sync_override_checksum(&target_dir, false)?; } use sha2::{Digest, Sha256}; @@ -1634,24 +1640,6 @@ pub fn run() -> Result<(), error::DecapodError> { return Ok(()); } Some(InitCommand::With(with)) => *with, - Some(InitCommand::Refresh) => { - let target = resolve_existing_init_dir(¤t_dir)?; - let cfg = match load_project_config_if_present(&target)? { - Some(c) => c, - None => { - return Err(error::DecapodError::ValidationError( - "No Decapod project found to refresh. Run `decapod init` first." - .to_string(), - )); - } - }; - // Blend OVERRIDE.md additions - let _ = scaffold::blend_overrides(&target)?; - // Sync config (adds missing default fields) - write_project_config(&target, &cfg, false)?; - // Get 'with' from existing config - init_with_from_config(&cfg, target.clone(), false, false) - } None => { if init_group.dir.is_some() && init_group.project_dir.is_some() { return Err(error::DecapodError::ValidationError( From 1c56a639367e2606e5afdfe6fd13ac0e0b93ee59 Mon Sep 17 00:00:00 2001 From: "Alex H. Raber" Date: Mon, 25 May 2026 20:53:13 -0700 Subject: [PATCH 11/13] docs: add smart bootstrap example to payload-examples.md --- docs/agent/payload-examples.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/agent/payload-examples.md b/docs/agent/payload-examples.md index 64b1ee18..0da154c9 100644 --- a/docs/agent/payload-examples.md +++ b/docs/agent/payload-examples.md @@ -45,6 +45,16 @@ decapod workspace ensure --container --branch "feat/rate-limiting" decapod workspace publish --title "Feat: Rate Limiting" --description "Implemented token bucket rate limiting for the API surface." ``` +## Smart Bootstrap + +Efficiently install and initialize Decapod only when updates are available. + +### Version-Aware Installation +```bash +# Checks crates.io and installs/refreshes only if a newer version exists +(decapod capabilities --format json | grep -q '"is_latest":true') || (cargo install decapod && decapod init) +``` + ## Subsystem Queries ### Subsystem Schema Discovery From b893efbc4f3d41988076fe4545331c2bc505cdca Mon Sep 17 00:00:00 2001 From: "Alex H. Raber" Date: Mon, 25 May 2026 20:59:20 -0700 Subject: [PATCH 12/13] feat: refine init behavior and smart bootstrap sequence - Implement automated environment refresh on 'decapod init' when .decapod exists. - Sidestep interactive manual entries for existing Decapod projects. - Preserve legacy entrypoint blending (backups) on initial initialization. - Integrate crates.io version check into 'decapod capabilities'. - Implement version-aware 'smart bootstrap' sequence in agent entrypoints. - Remove unused 'interactive_init_with' function. --- src/lib.rs | 58 +++++++++++------------------------------------------- 1 file changed, 11 insertions(+), 47 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3244514f..f8e837b0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1345,37 +1345,6 @@ fn config_from_init_with(init: &InitWithCli, repo: RepoContext) -> DecapodProjec } } -fn interactive_init_with( - config: &DecapodProjectConfig, - target_dir: PathBuf, - force: bool, - dry_run: bool, -) -> Result { - print_init_block( - "Decapod Setup", - "Existing .decapod/config.toml detected. Confirm your setup profile.", - ); - let mut next = init_with_from_config(config, target_dir, force, dry_run); - if config.init.entrypoints.is_empty() { - let all_entrypoints = prompt_yes_no( - "Include all default agent entrypoints (AGENTS/CLAUDE/GEMINI/CODEX)?", - true, - )?; - if all_entrypoints { - next.all = true; - next.agents = true; - next.claude = true; - next.gemini = true; - next.cdx_ep = true; - } - } - if config.init.specs { - next.specs = true; - } - next.diagram_style = prompt_diagram_style(next.diagram_style)?; - Ok(next) -} - fn enrich_repo_context_interactive(repo: &mut RepoContext) -> Result<(), error::DecapodError> { print_init_block( "Repository Context", @@ -1661,21 +1630,13 @@ pub fn run() -> Result<(), error::DecapodError> { }; let maybe_cfg = load_project_config_if_present(&target)?; if let Some(cfg) = maybe_cfg { - let mut with = if io::stdin().is_terminal() { - interactive_init_with( - &cfg, - target.clone(), - init_group.force, - init_group.dry_run, - )? - } else { - init_with_from_config( - &cfg, - target.clone(), - init_group.force, - init_group.dry_run, - ) - }; + // REFRESH FLOW: Sidestep manual entries if .decapod already exists + let mut with = init_with_from_config( + &cfg, + target.clone(), + init_group.force, + init_group.dry_run, + ); // Keep base command flags as explicit runtime overrides. if init_group.all { with.all = true; @@ -1769,7 +1730,10 @@ pub fn run() -> Result<(), error::DecapodError> { apply_repo_context_cli_overrides(&mut repo_ctx, &init_with); apply_substrate_adoption(&mut repo_ctx, &init_target); apply_architecture_language_recommendation(&mut repo_ctx); - if base_init_invocation && io::stdin().is_terminal() { + + // Only do full TUI experience if not refreshing an existing project + let is_refresh = init_target.join(".decapod").exists(); + if base_init_invocation && io::stdin().is_terminal() && !is_refresh { enrich_repo_context_interactive(&mut repo_ctx)?; } let target_dir = run_init_apply(&init_with, ¤t_dir, &repo_ctx)?; From 89d30ef4b1cda06fa912eedc6ff72a690f6f1056 Mon Sep 17 00:00:00 2001 From: "Alex H. Raber" Date: Mon, 25 May 2026 21:12:45 -0700 Subject: [PATCH 13/13] docs: resolve CI lint, clippy, and fmt issues --- .decapod/OVERRIDE.md | 29 +++++++++++++++++++++++++ .decapod/config.toml | 1 + .decapod/generated/specs/.manifest.json | 4 ++-- src/core/scaffold.rs | 3 ++- src/lib.rs | 5 ++--- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/.decapod/OVERRIDE.md b/.decapod/OVERRIDE.md index 8dd84161..1a05497b 100644 --- a/.decapod/OVERRIDE.md +++ b/.decapod/OVERRIDE.md @@ -316,3 +316,32 @@ over the embedded JSON constitution. ### docs/SKILL_TRANSLATION_MAP --- + + +### methodology/ENGINEERING_MANAGEMENT +### methodology/RESEARCH_PRODUCTION +### docs/agent/README.md +### docs/agent/api-index.md +### docs/agent/command-contracts.md +### docs/agent/config-schema.md +### docs/agent/error-recovery.md +### docs/agent/payload-examples.md +### docs/agent/state-model.md +### docs/book/src/SUMMARY.md +### docs/book/src/concepts/constitution.md +### docs/book/src/concepts/intent.md +### docs/book/src/concepts/overrides.md +### docs/book/src/concepts/proof.md +### docs/book/src/concepts/workspaces.md +### docs/book/src/configuration.md +### docs/book/src/introduction.md +### docs/book/src/mental-model.md +### docs/book/src/quickstart.md +### docs/book/src/reference/artifacts.md +### docs/book/src/reference/cli.md +### docs/book/src/reference/config-toml.md +### docs/book/src/reference/errors.md +### docs/book/src/workflows/external-trackers.md +### docs/book/src/workflows/multi-agent.md +### docs/book/src/workflows/single-agent.md +### docs/book/src/workflows/workspace-isolation.md diff --git a/.decapod/config.toml b/.decapod/config.toml index da7d6f2a..b83c77be 100644 --- a/.decapod/config.toml +++ b/.decapod/config.toml @@ -19,3 +19,4 @@ done_criteria = "Decapod validate passes, required tests pass, and promotion-rel primary_languages = ["Rust"] detected_surfaces = ["cargo"] external_tracker = false +container_workspaces = true diff --git a/.decapod/generated/specs/.manifest.json b/.decapod/generated/specs/.manifest.json index 9783570c..b1b01b29 100644 --- a/.decapod/generated/specs/.manifest.json +++ b/.decapod/generated/specs/.manifest.json @@ -1,8 +1,8 @@ { "schema_version": "1.0.0", "template_version": "scaffold-v2", - "generated_at": "1779678743Z", - "repo_signal_fingerprint": "c199830b21bba0c2265dbe139b358db4575f9a673a9c4248f44b288d572f9c6c", + "generated_at": "1779767907Z", + "repo_signal_fingerprint": "7c94ce67139223a21c919d78216f74ce2584a6ee816e2367e7a314e0081e7dc4", "files": [ { "path": ".decapod/generated/specs/README.md", diff --git a/src/core/scaffold.rs b/src/core/scaffold.rs index cb1998ae..aa157d5d 100644 --- a/src/core/scaffold.rs +++ b/src/core/scaffold.rs @@ -1236,7 +1236,8 @@ pub fn blend_overrides(target_dir: &Path) -> Result