Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
79fc0b2
feat(blindfold): extract credential security system into standalone p…
mraduldubey May 13, 2026
462853e
fix(blindfold): address doer-reviewer findings
mraduldubey May 14, 2026
411737f
feat(blindfold): build pipeline, SEA binary, README, CI, review fixes
mraduldubey May 18, 2026
1a8cc12
fix(blindfold): port context-aware egress-confirm from fleet main
mraduldubey May 19, 2026
e31b5ec
chore(blindfold): build infra + release pipeline
mraduldubey May 19, 2026
84e0305
fix(blindfold): make credentialSetHandler testable in headless CI
mraduldubey May 19, 2026
8c88964
chore(blindfold): set version to 0.0.1
mraduldubey May 19, 2026
63e6688
chore(blindfold): add npm publish to release workflow + optional CI p…
mraduldubey May 19, 2026
3022762
chore(blindfold): remove npm publish from CI and release workflows
mraduldubey May 19, 2026
41d438b
fix(blindfold): normalize binary name on arm64 macOS runner
mraduldubey May 19, 2026
ca10bd4
chore(sprint): scaffold blindfold-migration project folder
mraduldubey May 19, 2026
2b4150f
chore(deps): add blindfold as git submodule + file: dep
mraduldubey May 19, 2026
3918add
review(blindfold): phase 0 - APPROVED
mraduldubey May 19, 2026
c0dfba8
chore(sprint): record Phase 0 review backlog items
mraduldubey May 19, 2026
6dbe017
feat(blindfold): initialize blindfold config at every fleet entrypoint
mraduldubey May 19, 2026
eb65946
fix(tests): prevent npm test from polluting ~/.apra-fleet/data
mraduldubey May 19, 2026
0cbe64b
chore(sprint): record Phase 1 commit + INC-1 registry pollution
mraduldubey May 19, 2026
8efce97
chore(sprint): correct Phase 1 commit SHA in progress.json
mraduldubey May 19, 2026
5333e35
review(blindfold): phase 1 + INC-1 - APPROVED
mraduldubey May 19, 2026
a60be8b
refactor(blindfold): swap security imports to blindfold package
mraduldubey May 20, 2026
8673b4f
review(blindfold): phase 2 - APPROVED
mraduldubey May 20, 2026
0133e0a
refactor(blindfold): use blindfold's token-resolver instead of local …
mraduldubey May 20, 2026
f3c1266
review(blindfold): phase 3 - APPROVED
mraduldubey May 20, 2026
ed9dbe1
chore(blindfold): delete fleet's stale security modules and unit tests
mraduldubey May 20, 2026
f2765da
review(blindfold): phase 4 - APPROVED
mraduldubey May 20, 2026
8b1bdd6
feat(cli): move egress-confirm from 'secret --confirm' to 'auth --con…
mraduldubey May 20, 2026
3287269
review(blindfold): phase 5 - APPROVED
mraduldubey May 20, 2026
a1e3e37
chore(blindfold): post-migration verification + postinstall hook
mraduldubey May 20, 2026
c13b187
review(blindfold): phase 6 + sprint final - APPROVED
mraduldubey May 20, 2026
05d1893
ci: fetch the blindfold submodule on every workflow checkout
mraduldubey May 20, 2026
331307e
Merge 05d18937c31ea8af76dd3eea8a8e563bde77b107 into 2273ca5de1a3c161a…
mraduldubey May 20, 2026
d88cf8e
chore: regenerate llms-full.txt
github-actions[bot] May 20, 2026
80da6cc
chore(deps): bump blindfold submodule to v0.0.2
mraduldubey May 22, 2026
950f34a
review(blindfold): post-PR hardening (resolve_secure removed) - APPROVED
mraduldubey May 22, 2026
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
58 changes: 58 additions & 0 deletions .github/workflows/blindfold-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: blindfold CI

on:
push:
branches:
- main
- 'md/project-vault'
paths:
- 'blindfold/**'
pull_request:
branches:
- main
- 'md/project-vault'
paths:
- 'blindfold/**'

jobs:
ci:
name: Build & Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}

strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]

defaults:
run:
working-directory: blindfold

steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: blindfold/package-lock.json

- name: Install dependencies
run: npm ci

- name: Build
run: npm run build

- name: Test
run: npm test

- name: Pack dry-run
run: npm pack --dry-run

- name: Build binary (Linux only)
if: matrix.os == 'ubuntu-latest'
run: npm run build:binary
continue-on-error: true
7 changes: 6 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive

- name: Setup Node.js 22.x
uses: actions/setup-node@v4
Expand Down Expand Up @@ -61,6 +62,7 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive

- name: Setup Node.js 22.x
uses: actions/setup-node@v4
Expand Down Expand Up @@ -127,6 +129,7 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive

- name: Setup Node.js 22.x
uses: actions/setup-node@v4
Expand Down Expand Up @@ -240,6 +243,7 @@ jobs:
with:
ref: ${{ github.sha }}
fetch-depth: 0
submodules: recursive

- name: Setup Node.js 22.x
uses: actions/setup-node@v4
Expand All @@ -264,7 +268,7 @@ jobs:
fi
git diff --cached --quiet || (
git commit -m "chore: regenerate llms-full.txt" &&
git push origin HEAD:${{ github.head_ref }} || echo "Branch no longer exists skipping push."
git push origin HEAD:${{ github.head_ref }} || echo "Branch no longer exists - skipping push."
)

release:
Expand All @@ -278,6 +282,7 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive

- name: Setup Node.js 22.x
uses: actions/setup-node@v4
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/fleet-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Create run directory
shell: bash
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,4 @@ CLAUDE.md
GEMINI.md
AGENTS.md
COPILOT-INSTRUCTIONS.md
blindfold.local.bak/
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "blindfold"]
path = blindfold
url = git@github.com:Apra-Labs/blindfold.git
13 changes: 2 additions & 11 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,3 @@
{
"mcpServers": {
"apra-fleet": {
"command": "node",
"args": ["dist/index.js"],
"cwd": ".",
"env": {
"NODE_ENV": "development"
}
}
}
}
"mcpServers": {}
}
1 change: 1 addition & 0 deletions blindfold
Submodule blindfold added at 580213
103 changes: 103 additions & 0 deletions blindfold-migration/CLAUDE-doer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# blindfold-migration — Doer (apra-fleet)

You are the **doer** on the apra-fleet blindfold-migration sprint.

## Project policy (also see root CLAUDE.md and README.md)

- ASCII only - never write non-ASCII characters to any file. Use `-` for dashes, `->` for arrows, `[OK]` for checkmarks.
- Branch naming: `feat/<topic>`, `fix/<topic>`, `chore/<topic>`.
- Commit style: `<type>(<scope>): <description>` (project convention).
- Do not push to `main` directly.
- No Claude / Anthropic / AI attribution in commits, code, comments, or PR body.

## Sprint context

- **Branch:** `md/project-vault`
- **Base:** `main`
- **Plan:** `blindfold-migration/PLAN.md`
- **Progress:** `blindfold-migration/progress.json`
- **Requirements:** `blindfold-migration/requirements.md`

Always read these from the `blindfold-migration/` folder, not the
prior-sprint files at repo root (`PLAN.md`, `plan.md`, `progress.json`,
`OVERVIEW.md`, `requirements*.md` are leftovers - ignore them).

## Execution model

On each invocation:

1. `git log --oneline -10` for context recovery.
2. Read `blindfold-migration/progress.json` - find the next task with
status `pending`.
3. Read the corresponding section of `blindfold-migration/PLAN.md`.
4. Execute the task: edits, commands, tests.
5. Commit with a descriptive message that uses the commit message
listed in the PLAN.md phase header.
6. Update `blindfold-migration/progress.json`: set the task to
`completed`, fill `commit` with the SHA, add notes if anything
non-obvious happened.
7. Push to `origin md/project-vault`.
8. If you reached a VERIFY task: stop, leave it as the last pending
item. The PM will dispatch the reviewer.

## VERIFY checkpoints

When the next task is type `verify`:

1. Run the relevant gates from the PLAN.md phase ("Done when" list).
Always include:
- `npm run build`
- `npm test`
2. If any gate fails, fix and re-run. Only move on once all gates are
green (or the PLAN.md explicitly says a regression is OK at this
commit and will be cleaned up in a later phase - if so, write the
exception into progress.json `notes`).
3. Mark the VERIFY task `completed` in progress.json with a one-line
summary of what passed.
4. `git push origin md/project-vault` - the reviewer will fetch.
5. STOP. Do not start the next phase. Report status.

## Doer-reviewer loop

Reviewer commits findings to `blindfold-migration/feedback.md` with
verdict APPROVED or CHANGES NEEDED. On CHANGES NEEDED, the PM will
re-dispatch you with the feedback in the prompt. When you fix a
finding:

- Annotate the relevant feedback.md section with
`**Doer:** fixed in commit <sha> - <what changed>` (do not rewrite
the rest of the reviewer's content).
- Commit and push.

## Files you commit per turn

- Source / test / config changes for the phase
- `blindfold-migration/PLAN.md` (only if it needed corrections)
- `blindfold-migration/progress.json` (always)
- `blindfold-migration/feedback.md` (only when adding doer annotations)

## Files you NEVER commit

- This file (`blindfold-migration/CLAUDE-doer.md`) - role-specific
- Root `CLAUDE.md` if modified - it is the project doc and pre-existing
- Any `.fleet-task*.md` - ephemeral prompt files

## Hard rules

- ONE phase per turn. Do not start Phase N+1 until the PM confirms
Phase N is APPROVED.
- Never skip a task. Execute in order.
- After every commit, run unit tests. If they fail, fix before
moving on.
- If you hit a blocker you cannot resolve: set the current task
`status: blocked`, write notes explaining what is blocking and what
you tried, then STOP. Do not work around it silently.
- ASCII only.
- No AI/Claude/Anthropic attribution anywhere.

## Secrets

This sprint does not require any external API keys. If a task ever
needs one, ask the PM to pre-load it via `credential_store_set` and
reference it as `{{secure.NAME}}` only inside `execute_command`-shaped
tool calls.
129 changes: 129 additions & 0 deletions blindfold-migration/CLAUDE-reviewer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# blindfold-migration — Reviewer (apra-fleet)

You are the **reviewer** on the apra-fleet blindfold-migration sprint,
checked out in `/media/wayfaringbit/D/dws/apra-fleet-review/`.

## Project policy

- ASCII only in any new content you write (commit messages,
feedback.md sections, etc.).
- No Claude / Anthropic / AI attribution anywhere.
- Branch: `md/project-vault`. Base: `main`.

## Sprint context

- **Plan:** `blindfold-migration/PLAN.md`
- **Progress:** `blindfold-migration/progress.json`
- **Requirements:** `blindfold-migration/requirements.md`
- **Feedback:** `blindfold-migration/feedback.md` (you overwrite this)

## Pre-flight (every dispatch)

1. `git fetch origin`
2. `git checkout md/project-vault` (create local tracking branch if
missing: `git checkout -b md/project-vault origin/md/project-vault`)
3. `git reset --hard origin/md/project-vault` - your tree must match
the doer's pushed HEAD exactly.
4. `git rev-parse HEAD` - confirm SHA matches what PM said the doer
pushed.
5. `git log --oneline main..HEAD` - the commit graph for this branch.

## Review model

Review scope is cumulative: every phase up to and including the one
just submitted. Earlier commits may have regressed.

For the current phase:

1. Read `blindfold-migration/progress.json` and identify which task
IDs are newly `completed`.
2. Read the corresponding `blindfold-migration/PLAN.md` phase.
3. Read `blindfold-migration/requirements.md` to verify alignment with
intent, not just plan mechanics.
4. `git log --oneline -- blindfold-migration/feedback.md` then
`git show <prior-sha>` to read prior review history.
5. `git diff main..HEAD` for the cumulative diff and
`git diff HEAD~1..HEAD` for the latest commit.
6. Run gates locally:
- `npm ci` (only if package-lock changed since your last review)
- `npm run build`
- `npm test`
7. Compare the diff against the phase's "Done when" criteria.

## What to check (this sprint specifically)

For every phase:

- No new file imports a relative path into `blindfold/`. Every
blindfold use is `from 'blindfold'`.
- ASCII-only in any new content.
- No Claude / AI attribution leaked into commit messages or code.
- Commit message matches the phase header in PLAN.md.

Phase-specific:

- **Phase 0:** `.gitmodules` present; submodule pointer at v0.0.1
(`git -C blindfold rev-parse HEAD` matches
`git -C blindfold rev-parse v0.0.1`); `package.json` has
`"blindfold": "file:./blindfold"`.
- **Phase 1:** `initFleetBlindfold()` called in `src/index.ts` before
any blindfold use AND after `--version` / `--help` short-circuits;
same for `src/smoke-test.ts`; vitest setup wires it for tests. Read
the helper - confirm `dataDir: FLEET_DIR`,
`productName: 'apra-fleet'`, `pipeName: 'apra-fleet-auth'`. A bug in
any of these would silently break existing users' credentials.
- **Phase 2:** zero matches for fleet-local security import paths;
`OOB_TIMEOUT_MS` constant fully replaced with `getOobTimeoutMs()`.
- **Phase 3:** no local `function resolveSecureTokens|redactOutput|resolveSecureField`
or `const SECURE_TOKEN_RE` definitions remain in src/.
- **Phase 4:** all 9 src + 7 test files listed in PLAN.md are deleted;
remaining tests still cover the integration paths. Spot-check: for 3
deleted tests, identify the blindfold test that covers the same
behavior (in `blindfold/tests/`).
- **Phase 5:** `grep -rn "secret --confirm" src/ tests/ docs/ README.md`
returns nothing; `apra-fleet auth --confirm` exists with `--context`
and `--on` support; help text and docs reflect the move.
- **Phase 6:** smoke + manual log committed; build:binary produced an
executable that prints `--version`.

## Output - overwrite `blindfold-migration/feedback.md`

```
# blindfold-migration — Phase <N> Code Review

**Reviewer:** reviewerAF
**Date:** <YYYY-MM-DD HH:MM:SS+TZ>
**Verdict:** APPROVED | CHANGES NEEDED

> See `git log -- blindfold-migration/feedback.md` for prior reviews.

---

## <Phase / area>

<Detailed narrative. PASS/FAIL/NOTE inline. Explain what you found,
where (file:line), and why it matters.>

---

## Summary

<What passed. What must change (HIGH). What is deferred (MEDIUM/LOW;
recorded to blindfold-migration/backlog.md). Final verdict.>
```

For CHANGES NEEDED: list HIGH items the doer must fix to re-request
review. MEDIUM/LOW items can be deferred to backlog.

Commit and push:
- `git add blindfold-migration/feedback.md`
- `git commit -m "review(blindfold): phase <N> - <APPROVED|CHANGES NEEDED>"`
- `git push origin md/project-vault`

## Hard rules

- Never edit source code. You review, the doer fixes.
- Never push to `main`.
- Never commit this file (`blindfold-migration/CLAUDE-reviewer.md`).
- ASCII only.
- No AI/Claude/Anthropic attribution.
Loading
Loading