fix: [nomad-prep] P0 — rename lib/vault.sh + vault/ to action-vault namespace (#792)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
18190874ca
commit
e9a018db5c
18 changed files with 21 additions and 21 deletions
|
|
@ -31,11 +31,11 @@ disinto/ (code repo)
|
||||||
├── supervisor/ supervisor-run.sh — formula-driven health monitoring (polling-loop executor)
|
├── supervisor/ supervisor-run.sh — formula-driven health monitoring (polling-loop executor)
|
||||||
│ preflight.sh — pre-flight data collection for supervisor formula
|
│ preflight.sh — pre-flight data collection for supervisor formula
|
||||||
├── architect/ architect-run.sh — strategic decomposition of vision into sprints
|
├── architect/ architect-run.sh — strategic decomposition of vision into sprints
|
||||||
├── vault/ vault-env.sh — shared env setup (vault redesign in progress, see #73-#77)
|
├── action-vault/ vault-env.sh — shared env setup (vault redesign in progress, see #73-#77)
|
||||||
│ SCHEMA.md — vault item schema documentation
|
│ SCHEMA.md — vault item schema documentation
|
||||||
│ validate.sh — vault item validator
|
│ validate.sh — vault item validator
|
||||||
│ examples/ — example vault action TOMLs (promote, publish, release, webhook-call)
|
│ examples/ — example vault action TOMLs (promote, publish, release, webhook-call)
|
||||||
├── lib/ env.sh, agent-sdk.sh, ci-helpers.sh, ci-debug.sh, load-project.sh, parse-deps.sh, guard.sh, mirrors.sh, pr-lifecycle.sh, issue-lifecycle.sh, worktree.sh, formula-session.sh, stack-lock.sh, forge-setup.sh, forge-push.sh, ops-setup.sh, ci-setup.sh, generators.sh, hire-agent.sh, release.sh, build-graph.py, branch-protection.sh, secret-scan.sh, tea-helpers.sh, vault.sh, ci-log-reader.py, git-creds.sh, sprint-filer.sh
|
├── lib/ env.sh, agent-sdk.sh, ci-helpers.sh, ci-debug.sh, load-project.sh, parse-deps.sh, guard.sh, mirrors.sh, pr-lifecycle.sh, issue-lifecycle.sh, worktree.sh, formula-session.sh, stack-lock.sh, forge-setup.sh, forge-push.sh, ops-setup.sh, ci-setup.sh, generators.sh, hire-agent.sh, release.sh, build-graph.py, branch-protection.sh, secret-scan.sh, tea-helpers.sh, action-vault.sh, ci-log-reader.py, git-creds.sh, sprint-filer.sh
|
||||||
│ hooks/ — Claude Code session hooks (on-compact-reinject, on-idle-stop, on-phase-change, on-pretooluse-guard, on-session-end, on-stop-failure)
|
│ hooks/ — Claude Code session hooks (on-compact-reinject, on-idle-stop, on-phase-change, on-pretooluse-guard, on-session-end, on-stop-failure)
|
||||||
├── projects/ *.toml.example — templates; *.toml — local per-box config (gitignored)
|
├── projects/ *.toml.example — templates; *.toml — local per-box config (gitignored)
|
||||||
├── formulas/ Issue templates (TOML specs for multi-step agent tasks)
|
├── formulas/ Issue templates (TOML specs for multi-step agent tasks)
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ OPS_REPO_ROOT="${OPS_REPO_ROOT:-/home/debian/disinto-ops}"
|
||||||
VAULT_ACTIONS_DIR="${OPS_REPO_ROOT}/vault/actions"
|
VAULT_ACTIONS_DIR="${OPS_REPO_ROOT}/vault/actions"
|
||||||
|
|
||||||
# Vault action validation
|
# Vault action validation
|
||||||
VAULT_ENV="${SCRIPT_ROOT}/../vault/vault-env.sh"
|
VAULT_ENV="${SCRIPT_ROOT}/../action-vault/vault-env.sh"
|
||||||
|
|
||||||
# Admin users who can merge vault PRs (from issue #77)
|
# Admin users who can merge vault PRs (from issue #77)
|
||||||
# Comma-separated list of Forgejo usernames with admin role
|
# Comma-separated list of Forgejo usernames with admin role
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@ The `main` branch on the ops repo (`johba/disinto-ops`) is protected via Forgejo
|
||||||
|
|
||||||
## Vault PR Lifecycle
|
## Vault PR Lifecycle
|
||||||
|
|
||||||
1. **Request** — Agent calls `lib/vault.sh:vault_request()` with action TOML content
|
1. **Request** — Agent calls `lib/action-vault.sh:vault_request()` with action TOML content
|
||||||
2. **Validation** — TOML is validated against the schema in `vault/vault-env.sh`
|
2. **Validation** — TOML is validated against the schema in `action-vault/vault-env.sh`
|
||||||
3. **PR Creation** — A PR is created on `disinto-ops` with:
|
3. **PR Creation** — A PR is created on `disinto-ops` with:
|
||||||
- Branch: `vault/<action-id>`
|
- Branch: `vault/<action-id>`
|
||||||
- Title: `vault: <action-id>`
|
- Title: `vault: <action-id>`
|
||||||
|
|
@ -90,12 +90,12 @@ To verify the protection is working:
|
||||||
|
|
||||||
- #73 — Vault redesign proposal
|
- #73 — Vault redesign proposal
|
||||||
- #74 — Vault action TOML schema
|
- #74 — Vault action TOML schema
|
||||||
- #75 — Vault PR creation helper (`lib/vault.sh`)
|
- #75 — Vault PR creation helper (`lib/action-vault.sh`)
|
||||||
- #76 — Dispatcher rewrite (poll for merged vault PRs)
|
- #76 — Dispatcher rewrite (poll for merged vault PRs)
|
||||||
- #77 — Branch protection on ops repo (this issue)
|
- #77 — Branch protection on ops repo (this issue)
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
- [`lib/vault.sh`](../lib/vault.sh) — Vault PR creation helper
|
- [`lib/action-vault.sh`](../lib/action-vault.sh) — Vault PR creation helper
|
||||||
- [`vault/vault-env.sh`](../vault/vault-env.sh) — TOML validation
|
- [`action-vault/vault-env.sh`](../action-vault/vault-env.sh) — TOML validation
|
||||||
- [`lib/branch-protection.sh`](../lib/branch-protection.sh) — Branch protection helper
|
- [`lib/branch-protection.sh`](../lib/branch-protection.sh) — Branch protection helper
|
||||||
|
|
|
||||||
|
|
@ -177,7 +177,7 @@ DUST (trivial — single-line edit, rename, comment, style, whitespace):
|
||||||
|
|
||||||
VAULT (needs human decision or external resource):
|
VAULT (needs human decision or external resource):
|
||||||
File a vault procurement item using vault_request():
|
File a vault procurement item using vault_request():
|
||||||
source "$(dirname "$0")/../lib/vault.sh"
|
source "$(dirname "$0")/../lib/action-vault.sh"
|
||||||
TOML_CONTENT="# Vault action: <action_id>
|
TOML_CONTENT="# Vault action: <action_id>
|
||||||
context = \"<description of what decision/resource is needed>\"
|
context = \"<description of what decision/resource is needed>\"
|
||||||
unblocks = [\"#NNN\"]
|
unblocks = [\"#NNN\"]
|
||||||
|
|
|
||||||
|
|
@ -125,8 +125,8 @@ For each weakness you identify, choose one:
|
||||||
The prediction explains the theory. The vault PR triggers the proof
|
The prediction explains the theory. The vault PR triggers the proof
|
||||||
after human approval. When the planner runs next, evidence is already there.
|
after human approval. When the planner runs next, evidence is already there.
|
||||||
|
|
||||||
Vault dispatch (requires lib/vault.sh):
|
Vault dispatch (requires lib/action-vault.sh):
|
||||||
source "$PROJECT_REPO_ROOT/lib/vault.sh"
|
source "$PROJECT_REPO_ROOT/lib/action-vault.sh"
|
||||||
|
|
||||||
TOML_CONTENT="id = \"predict-<prediction_number>-<formula>\"
|
TOML_CONTENT="id = \"predict-<prediction_number>-<formula>\"
|
||||||
context = \"Test prediction #<prediction_number>: <theory summary> — focus: <specific test>\"
|
context = \"Test prediction #<prediction_number>: <theory summary> — focus: <specific test>\"
|
||||||
|
|
@ -154,7 +154,7 @@ tea is pre-configured with login "$TEA_LOGIN" and repo "$FORGE_REPO".
|
||||||
--title "<title>" --body "<body>" --labels "prediction/unreviewed"
|
--title "<title>" --body "<body>" --labels "prediction/unreviewed"
|
||||||
|
|
||||||
2. Dispatch formula via vault (if exploiting):
|
2. Dispatch formula via vault (if exploiting):
|
||||||
source "$PROJECT_REPO_ROOT/lib/vault.sh"
|
source "$PROJECT_REPO_ROOT/lib/action-vault.sh"
|
||||||
PR_NUM=$(vault_request "predict-NNN-<formula>" "$TOML_CONTENT")
|
PR_NUM=$(vault_request "predict-NNN-<formula>" "$TOML_CONTENT")
|
||||||
# See EXPLOIT section above for TOML_CONTENT format
|
# See EXPLOIT section above for TOML_CONTENT format
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ sourced as needed.
|
||||||
| `lib/worktree.sh` | Reusable git worktree management: `worktree_create(path, branch, [base_ref])` — create worktree, checkout base, fetch submodules. `worktree_recover(path, branch, [remote])` — detect existing worktree, reuse if on correct branch (sets `_WORKTREE_REUSED`), otherwise clean and recreate. `worktree_cleanup(path)` — `git worktree remove --force`, clear Claude Code project cache (`~/.claude/projects/` matching path). `worktree_cleanup_stale([max_age_hours])` — scan `/tmp` for orphaned worktrees older than threshold, skip preserved and active tmux worktrees, prune. `worktree_preserve(path, reason)` — mark worktree as preserved for debugging (writes `.worktree-preserved` marker, skipped by stale cleanup). | dev-agent.sh, supervisor-run.sh, planner-run.sh, predictor-run.sh, gardener-run.sh |
|
| `lib/worktree.sh` | Reusable git worktree management: `worktree_create(path, branch, [base_ref])` — create worktree, checkout base, fetch submodules. `worktree_recover(path, branch, [remote])` — detect existing worktree, reuse if on correct branch (sets `_WORKTREE_REUSED`), otherwise clean and recreate. `worktree_cleanup(path)` — `git worktree remove --force`, clear Claude Code project cache (`~/.claude/projects/` matching path). `worktree_cleanup_stale([max_age_hours])` — scan `/tmp` for orphaned worktrees older than threshold, skip preserved and active tmux worktrees, prune. `worktree_preserve(path, reason)` — mark worktree as preserved for debugging (writes `.worktree-preserved` marker, skipped by stale cleanup). | dev-agent.sh, supervisor-run.sh, planner-run.sh, predictor-run.sh, gardener-run.sh |
|
||||||
| `lib/pr-lifecycle.sh` | Reusable PR lifecycle library: `pr_create()`, `pr_find_by_branch()`, `pr_poll_ci()`, `pr_poll_review()`, `pr_merge()`, `pr_is_merged()`, `pr_walk_to_merge()`, `build_phase_protocol_prompt()`. Requires `lib/ci-helpers.sh`. | dev-agent.sh (future) |
|
| `lib/pr-lifecycle.sh` | Reusable PR lifecycle library: `pr_create()`, `pr_find_by_branch()`, `pr_poll_ci()`, `pr_poll_review()`, `pr_merge()`, `pr_is_merged()`, `pr_walk_to_merge()`, `build_phase_protocol_prompt()`. Requires `lib/ci-helpers.sh`. | dev-agent.sh (future) |
|
||||||
| `lib/issue-lifecycle.sh` | Reusable issue lifecycle library: `issue_claim()` (add in-progress, remove backlog), `issue_release()` (remove in-progress, add backlog), `issue_block()` (post diagnostic comment with secret redaction, add blocked label), `issue_close()`, `issue_check_deps()` (parse deps, check transitive closure; sets `_ISSUE_BLOCKED_BY`, `_ISSUE_SUGGESTION`), `issue_suggest_next()` (find next unblocked backlog issue; sets `_ISSUE_NEXT`), `issue_post_refusal()` (structured refusal comment with dedup). Label IDs cached in globals on first lookup. Sources `lib/secret-scan.sh`. | dev-agent.sh (future) |
|
| `lib/issue-lifecycle.sh` | Reusable issue lifecycle library: `issue_claim()` (add in-progress, remove backlog), `issue_release()` (remove in-progress, add backlog), `issue_block()` (post diagnostic comment with secret redaction, add blocked label), `issue_close()`, `issue_check_deps()` (parse deps, check transitive closure; sets `_ISSUE_BLOCKED_BY`, `_ISSUE_SUGGESTION`), `issue_suggest_next()` (find next unblocked backlog issue; sets `_ISSUE_NEXT`), `issue_post_refusal()` (structured refusal comment with dedup). Label IDs cached in globals on first lookup. Sources `lib/secret-scan.sh`. | dev-agent.sh (future) |
|
||||||
| `lib/vault.sh` | **Vault PR helper** — create vault action PRs on ops repo via Forgejo API (works from containers without SSH). `vault_request <action_id> <toml_content>` validates TOML (using `validate_vault_action` from `vault/vault-env.sh`), creates branch `vault/<action-id>`, writes `vault/actions/<action-id>.toml`, creates PR targeting `main` with title `vault: <action-id>` and body from context field, returns PR number. Idempotent: if PR exists, returns existing number. **Low-tier bypass**: if the action's `blast_radius` classifies as `low` (via `vault/classify.sh`), `vault_request` calls `_vault_commit_direct()` which commits directly to ops `main` using `FORGE_ADMIN_TOKEN` — no PR, no approval wait. Returns `0` (not a PR number) for direct commits. Requires `FORGE_TOKEN`, `FORGE_ADMIN_TOKEN` (low-tier only), `FORGE_URL`, `FORGE_REPO`, `FORGE_OPS_REPO`. Uses the calling agent's own token (saves/restores `FORGE_TOKEN` around sourcing `vault-env.sh`), so approval workflow respects individual agent identities. | dev-agent (vault actions), future vault dispatcher |
|
| `lib/action-vault.sh` | **Vault PR helper** — create vault action PRs on ops repo via Forgejo API (works from containers without SSH). `vault_request <action_id> <toml_content>` validates TOML (using `validate_vault_action` from `action-vault/vault-env.sh`), creates branch `vault/<action-id>`, writes `vault/actions/<action-id>.toml`, creates PR targeting `main` with title `vault: <action-id>` and body from context field, returns PR number. Idempotent: if PR exists, returns existing number. **Low-tier bypass**: if the action's `blast_radius` classifies as `low` (via `action-vault/classify.sh`), `vault_request` calls `_vault_commit_direct()` which commits directly to ops `main` using `FORGE_ADMIN_TOKEN` — no PR, no approval wait. Returns `0` (not a PR number) for direct commits. Requires `FORGE_TOKEN`, `FORGE_ADMIN_TOKEN` (low-tier only), `FORGE_URL`, `FORGE_REPO`, `FORGE_OPS_REPO`. Uses the calling agent's own token (saves/restores `FORGE_TOKEN` around sourcing `vault-env.sh`), so approval workflow respects individual agent identities. | dev-agent (vault actions), future vault dispatcher |
|
||||||
| `lib/branch-protection.sh` | Branch protection helpers for Forgejo repos. `setup_vault_branch_protection()` — configures admin-only merge protection on main (require 1 approval, restrict merge to admin role, block direct pushes). `setup_profile_branch_protection()` — same protection for `.profile` repos. `verify_branch_protection()` — checks protection is correctly configured. `remove_branch_protection()` — removes protection (cleanup/testing). Handles race condition after initial push: retries with backoff if Forgejo hasn't processed the branch yet. Requires `FORGE_TOKEN`, `FORGE_URL`, `FORGE_OPS_REPO`. | bin/disinto (hire-an-agent) |
|
| `lib/branch-protection.sh` | Branch protection helpers for Forgejo repos. `setup_vault_branch_protection()` — configures admin-only merge protection on main (require 1 approval, restrict merge to admin role, block direct pushes). `setup_profile_branch_protection()` — same protection for `.profile` repos. `verify_branch_protection()` — checks protection is correctly configured. `remove_branch_protection()` — removes protection (cleanup/testing). Handles race condition after initial push: retries with backoff if Forgejo hasn't processed the branch yet. Requires `FORGE_TOKEN`, `FORGE_URL`, `FORGE_OPS_REPO`. | bin/disinto (hire-an-agent) |
|
||||||
| `lib/agent-sdk.sh` | `agent_run([--resume SESSION_ID] [--worktree DIR] PROMPT)` — one-shot `claude -p` invocation with session persistence. Saves session ID to `SID_FILE`, reads it back on resume. `agent_recover_session()` — restore previous session ID from `SID_FILE` on startup. **Nudge guard**: skips nudge injection if the worktree is clean and no push is expected, preventing spurious re-invocations. Callers must define `SID_FILE`, `LOGFILE`, and `log()` before sourcing. **Concurrency**: external `flock` on `session.lock` is gated behind `CLAUDE_EXTERNAL_LOCK=1` (default off). When unset, each container's per-session `CLAUDE_CONFIG_DIR` isolation lets Claude Code's native lockfile handle OAuth refresh — no external serialization needed. Set `CLAUDE_EXTERNAL_LOCK=1` to re-enable the old flock wrapper as a rollback mechanism. See [`docs/CLAUDE-AUTH-CONCURRENCY.md`](../docs/CLAUDE-AUTH-CONCURRENCY.md) and AD-002 (#647). | formula-driven agents (dev-agent, planner-run, predictor-run, gardener-run) |
|
| `lib/agent-sdk.sh` | `agent_run([--resume SESSION_ID] [--worktree DIR] PROMPT)` — one-shot `claude -p` invocation with session persistence. Saves session ID to `SID_FILE`, reads it back on resume. `agent_recover_session()` — restore previous session ID from `SID_FILE` on startup. **Nudge guard**: skips nudge injection if the worktree is clean and no push is expected, preventing spurious re-invocations. Callers must define `SID_FILE`, `LOGFILE`, and `log()` before sourcing. **Concurrency**: external `flock` on `session.lock` is gated behind `CLAUDE_EXTERNAL_LOCK=1` (default off). When unset, each container's per-session `CLAUDE_CONFIG_DIR` isolation lets Claude Code's native lockfile handle OAuth refresh — no external serialization needed. Set `CLAUDE_EXTERNAL_LOCK=1` to re-enable the old flock wrapper as a rollback mechanism. See [`docs/CLAUDE-AUTH-CONCURRENCY.md`](../docs/CLAUDE-AUTH-CONCURRENCY.md) and AD-002 (#647). | formula-driven agents (dev-agent, planner-run, predictor-run, gardener-run) |
|
||||||
| `lib/forge-setup.sh` | `setup_forge()` — Forgejo instance provisioning: creates admin user, bot accounts, org, repos (code + ops), configures webhooks, sets repo topics. Extracted from `bin/disinto`. Requires `FORGE_URL`, `FORGE_TOKEN`, `FACTORY_ROOT`. **Password storage (#361)**: after creating each bot account, stores its password in `.env` as `FORGE_<BOT>_PASS` (e.g. `FORGE_PASS`, `FORGE_REVIEW_PASS`, etc.) for use by `forge-push.sh`. | bin/disinto (init) |
|
| `lib/forge-setup.sh` | `setup_forge()` — Forgejo instance provisioning: creates admin user, bot accounts, org, repos (code + ops), configures webhooks, sets repo topics. Extracted from `bin/disinto`. Requires `FORGE_URL`, `FORGE_TOKEN`, `FACTORY_ROOT`. **Password storage (#361)**: after creating each bot account, stores its password in `.env` as `FORGE_<BOT>_PASS` (e.g. `FORGE_PASS`, `FORGE_REVIEW_PASS`, etc.) for use by `forge-push.sh`. | bin/disinto (init) |
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# vault.sh — Helper for agents to create vault PRs on ops repo
|
# action-vault.sh — Helper for agents to create vault PRs on ops repo
|
||||||
#
|
#
|
||||||
# Source after lib/env.sh:
|
# Source after lib/env.sh:
|
||||||
# source "$(dirname "$0")/../lib/env.sh"
|
# source "$(dirname "$0")/../lib/env.sh"
|
||||||
# source "$(dirname "$0")/lib/vault.sh"
|
# source "$(dirname "$0")/lib/action-vault.sh"
|
||||||
#
|
#
|
||||||
# Required globals: FORGE_TOKEN, FORGE_URL, FORGE_REPO, FORGE_OPS_REPO
|
# Required globals: FORGE_TOKEN, FORGE_URL, FORGE_REPO, FORGE_OPS_REPO
|
||||||
# Optional: OPS_REPO_ROOT (local path for ops repo)
|
# Optional: OPS_REPO_ROOT (local path for ops repo)
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
# vault_request <action_id> <toml_content> — Create vault PR, return PR number
|
# vault_request <action_id> <toml_content> — Create vault PR, return PR number
|
||||||
#
|
#
|
||||||
# The function:
|
# The function:
|
||||||
# 1. Validates TOML content using validate_vault_action() from vault/vault-env.sh
|
# 1. Validates TOML content using validate_vault_action() from action-vault/vault-env.sh
|
||||||
# 2. Creates a branch on the ops repo: vault/<action-id>
|
# 2. Creates a branch on the ops repo: vault/<action-id>
|
||||||
# 3. Writes TOML to vault/actions/<action-id>.toml on that branch
|
# 3. Writes TOML to vault/actions/<action-id>.toml on that branch
|
||||||
# 4. Creates PR targeting main with title "vault: <action-id>"
|
# 4. Creates PR targeting main with title "vault: <action-id>"
|
||||||
|
|
@ -133,7 +133,7 @@ vault_request() {
|
||||||
printf '%s' "$toml_content" > "$tmp_toml"
|
printf '%s' "$toml_content" > "$tmp_toml"
|
||||||
|
|
||||||
# Source vault-env.sh for validate_vault_action
|
# Source vault-env.sh for validate_vault_action
|
||||||
local vault_env="${FACTORY_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}/vault/vault-env.sh"
|
local vault_env="${FACTORY_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}/action-vault/vault-env.sh"
|
||||||
if [ ! -f "$vault_env" ]; then
|
if [ ! -f "$vault_env" ]; then
|
||||||
echo "ERROR: vault-env.sh not found at $vault_env" >&2
|
echo "ERROR: vault-env.sh not found at $vault_env" >&2
|
||||||
return 1
|
return 1
|
||||||
|
|
@ -161,7 +161,7 @@ vault_request() {
|
||||||
ops_api="$(_vault_ops_api)"
|
ops_api="$(_vault_ops_api)"
|
||||||
|
|
||||||
# Classify the action to determine if PR bypass is allowed
|
# Classify the action to determine if PR bypass is allowed
|
||||||
local classify_script="${FACTORY_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}/vault/classify.sh"
|
local classify_script="${FACTORY_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}/action-vault/classify.sh"
|
||||||
local vault_tier
|
local vault_tier
|
||||||
vault_tier=$("$classify_script" "${VAULT_ACTION_FORMULA:-}" "${VAULT_BLAST_RADIUS_OVERRIDE:-}") || {
|
vault_tier=$("$classify_script" "${VAULT_ACTION_FORMULA:-}" "${VAULT_BLAST_RADIUS_OVERRIDE:-}") || {
|
||||||
# Classification failed, default to high tier (require PR)
|
# Classification failed, default to high tier (require PR)
|
||||||
|
|
@ -719,7 +719,7 @@ setup_forge() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Add all bot users as collaborators with appropriate permissions
|
# Add all bot users as collaborators with appropriate permissions
|
||||||
# dev-bot: write (PR creation via lib/vault.sh)
|
# dev-bot: write (PR creation via lib/action-vault.sh)
|
||||||
# review-bot: read (PR review)
|
# review-bot: read (PR review)
|
||||||
# planner-bot: write (prerequisites.md, memory)
|
# planner-bot: write (prerequisites.md, memory)
|
||||||
# gardener-bot: write (backlog grooming)
|
# gardener-bot: write (backlog grooming)
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# Source vault.sh for _vault_log helper
|
# Source action-vault.sh for _vault_log helper
|
||||||
source "${FACTORY_ROOT}/lib/vault.sh"
|
source "${FACTORY_ROOT}/lib/action-vault.sh"
|
||||||
|
|
||||||
# Assert required globals are set before using this module.
|
# Assert required globals are set before using this module.
|
||||||
_assert_release_globals() {
|
_assert_release_globals() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue