fix: port ci and markdown cleanup from backlog

This commit is contained in:
Affaan Mustafa
2026-04-02 17:09:21 -07:00
parent 70be8f9f44
commit a60d5fbc00
10 changed files with 44 additions and 34 deletions

View File

@@ -112,3 +112,6 @@ Keep this file detailed for only the current sprint, blockers, and next actions.
- 2026-04-01: Added `manim-video` as the reusable technical explainer lane and seeded it with a starter network-graph scene so launch and systems animations do not depend on one-off scratch scripts. - 2026-04-01: Added `manim-video` as the reusable technical explainer lane and seeded it with a starter network-graph scene so launch and systems animations do not depend on one-off scratch scripts.
- 2026-04-02: Re-extracted `social-graph-ranker` as a standalone primitive because the weighted bridge-decay model is reusable outside the full lead workflow. `lead-intelligence` now points to it for canonical graph ranking instead of carrying the full algorithm explanation inline, while `connections-optimizer` stays the broader operator layer for pruning, adds, and outbound review packs. - 2026-04-02: Re-extracted `social-graph-ranker` as a standalone primitive because the weighted bridge-decay model is reusable outside the full lead workflow. `lead-intelligence` now points to it for canonical graph ranking instead of carrying the full algorithm explanation inline, while `connections-optimizer` stays the broader operator layer for pruning, adds, and outbound review packs.
- 2026-04-02: Applied the same consolidation rule to the writing lane. `brand-voice` remains the canonical voice system, while `content-engine`, `crosspost`, `article-writing`, and `investor-outreach` now keep only workflow-specific guidance instead of duplicating a second Affaan/ECC voice model or repeating the full ban list in multiple places. - 2026-04-02: Applied the same consolidation rule to the writing lane. `brand-voice` remains the canonical voice system, while `content-engine`, `crosspost`, `article-writing`, and `investor-outreach` now keep only workflow-specific guidance instead of duplicating a second Affaan/ECC voice model or repeating the full ban list in multiple places.
- 2026-04-02: Closed fresh auto-generated bundle PRs `#1182` and `#1183` under the existing policy. Useful ideas from generator output must be ported manually into canonical repo surfaces instead of merging `.claude`/bundle PRs wholesale.
- 2026-04-02: Ported the safe one-file macOS observer fix from `#1164` directly into `main` as a POSIX `mkdir` fallback for `continuous-learning-v2` lazy-start locking, then closed the PR as superseded by direct port.
- 2026-04-02: Ported the safe core of `#1153` directly into `main`: markdownlint cleanup for orchestration/docs surfaces plus the Windows `USERPROFILE` and path-normalization fixes in `install-apply` / `repair` tests. Local validation after installing repo deps: `node tests/scripts/install-apply.test.js`, `node tests/scripts/repair.test.js`, and targeted `yarn markdownlint` all passed.

View File

@@ -24,20 +24,20 @@ Apply the orchestration skills instead of maintaining a second workflow spec her
- Keep handoffs structured, but let the skills define the maintained sequencing rules. - Keep handoffs structured, but let the skills define the maintained sequencing rules.
Security Reviewer: [summary] Security Reviewer: [summary]
FILES CHANGED ### FILES CHANGED
-------------
[List all files modified] [List all files modified]
TEST RESULTS ### TEST RESULTS
------------
[Test pass/fail summary] [Test pass/fail summary]
SECURITY STATUS ### SECURITY STATUS
---------------
[Security findings] [Security findings]
RECOMMENDATION ### RECOMMENDATION
--------------
[SHIP / NEEDS WORK / BLOCKED] [SHIP / NEEDS WORK / BLOCKED]
``` ```
@@ -111,7 +111,7 @@ Telemetry:
This keeps planner, implementer, reviewer, and loop workers legible from the operator surface. This keeps planner, implementer, reviewer, and loop workers legible from the operator surface.
## Arguments ## Workflow Arguments
$ARGUMENTS: $ARGUMENTS:
- `feature <description>` - Full feature workflow - `feature <description>` - Full feature workflow

View File

@@ -177,7 +177,7 @@ Next steps:
## Edge Cases ## Edge Cases
- **No `gh` CLI**: Stop with: "GitHub CLI (`gh`) is required. Install: https://cli.github.com/" - **No `gh` CLI**: Stop with: "GitHub CLI (`gh`) is required. Install: <https://cli.github.com/>"
- **Not authenticated**: Stop with: "Run `gh auth login` first." - **Not authenticated**: Stop with: "Run `gh auth login` first."
- **Force push needed**: If remote has diverged and rebase was done, use `git push --force-with-lease` (never `--force`). - **Force push needed**: If remote has diverged and rebase was done, use `git push --force-with-lease` (never `--force`).
- **Multiple PR templates**: If `.github/PULL_REQUEST_TEMPLATE/` has multiple files, list them and ask user to choose. - **Multiple PR templates**: If `.github/PULL_REQUEST_TEMPLATE/` has multiple files, list them and ask user to choose.

View File

@@ -25,9 +25,11 @@ function readJson(filePath) {
const REPO_ROOT = path.join(__dirname, '..', '..'); const REPO_ROOT = path.join(__dirname, '..', '..');
function run(args = [], options = {}) { function run(args = [], options = {}) {
const homeDir = options.homeDir || process.env.HOME;
const env = { const env = {
...process.env, ...process.env,
HOME: options.homeDir || process.env.HOME, HOME: homeDir,
USERPROFILE: homeDir,
...(options.env || {}), ...(options.env || {}),
}; };
@@ -365,10 +367,13 @@ function runTests() {
const settings = readJson(path.join(claudeRoot, 'settings.json')); const settings = readJson(path.join(claudeRoot, 'settings.json'));
const installedHooks = readJson(path.join(claudeRoot, 'hooks', 'hooks.json')); const installedHooks = readJson(path.join(claudeRoot, 'hooks', 'hooks.json'));
const normSep = (s) => s.replace(/\\/g, '/');
const expectedFragment = normSep(path.join(claudeRoot, 'scripts', 'hooks', 'auto-tmux-dev.js'));
const autoTmuxEntry = settings.hooks.PreToolUse.find(entry => entry.id === 'pre:bash:auto-tmux-dev'); const autoTmuxEntry = settings.hooks.PreToolUse.find(entry => entry.id === 'pre:bash:auto-tmux-dev');
assert.ok(autoTmuxEntry, 'settings.json should include the auto tmux hook'); assert.ok(autoTmuxEntry, 'settings.json should include the auto tmux hook');
assert.ok( assert.ok(
autoTmuxEntry.hooks[0].command.includes(path.join(claudeRoot, 'scripts', 'hooks', 'auto-tmux-dev.js')), normSep(autoTmuxEntry.hooks[0].command).includes(expectedFragment),
'settings.json should use the installed Claude root for hook commands' 'settings.json should use the installed Claude root for hook commands'
); );
assert.ok( assert.ok(
@@ -379,7 +384,7 @@ function runTests() {
const installedAutoTmuxEntry = installedHooks.hooks.PreToolUse.find(entry => entry.id === 'pre:bash:auto-tmux-dev'); const installedAutoTmuxEntry = installedHooks.hooks.PreToolUse.find(entry => entry.id === 'pre:bash:auto-tmux-dev');
assert.ok(installedAutoTmuxEntry, 'hooks/hooks.json should include the auto tmux hook'); assert.ok(installedAutoTmuxEntry, 'hooks/hooks.json should include the auto tmux hook');
assert.ok( assert.ok(
installedAutoTmuxEntry.hooks[0].command.includes(path.join(claudeRoot, 'scripts', 'hooks', 'auto-tmux-dev.js')), normSep(installedAutoTmuxEntry.hooks[0].command).includes(expectedFragment),
'hooks/hooks.json should use the installed Claude root for hook commands' 'hooks/hooks.json should use the installed Claude root for hook commands'
); );
assert.ok( assert.ok(

View File

@@ -38,9 +38,11 @@ function writeState(filePath, options) {
} }
function runNode(scriptPath, args = [], options = {}) { function runNode(scriptPath, args = [], options = {}) {
const homeDir = options.homeDir || process.env.HOME;
const env = { const env = {
...process.env, ...process.env,
HOME: options.homeDir || process.env.HOME, HOME: homeDir,
USERPROFILE: homeDir,
}; };
try { try {