Merge remote-tracking branch 'origin/main' into garrytan/workspace-aware-ship

Rebumped v1.8.0.0 -> v1.11.0.0 (minor-past main's v1.10.1.0) using
bin/gstack-next-version — the same queue-aware path this branch introduces.
CHANGELOG repositioned so v1.11.0.0 sits above main's new entries
(v1.10.1.0 / v1.10.0.0 / v1.9.0.0).

Conflicts resolved:
- VERSION, package.json: rebumped to v1.11.0.0 (util-picked)
- bin/gstack-config: merged both lists (workspace_root + gbrain keys)
- CHANGELOG.md: hoisted v1.11.0.0 entry above main's new entries

Pre-existing failures in main (4) documented but not fixed in this PR:
1. gstack-brain-sync secret scan > blocks bearer-json (brain-sync tests)
2. no files larger than 2MB (security-bench fixture, already TODO'd)
3. selectTests > skill-specific change (touchfiles scoping)
4. Opus 4.7 overlay pacing directive (expectation stale after v1.10.1.0
   removed the Fan out nudge)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-04-23 21:20:25 -07:00
parent 416a56a5c8
commit a64d70ba35
87 changed files with 14392 additions and 788 deletions
+30 -3
View File
@@ -286,11 +286,38 @@ Log the operational learning now. Then say what you logged.`,
// Add a remote so the agent can derive a project name
run('git', ['remote', 'add', 'origin', 'https://github.com/acme/billing-app.git']);
// Extract AskUserQuestion format instructions from generated SKILL.md
const skillMd = fs.readFileSync(path.join(ROOT, 'SKILL.md'), 'utf-8');
// Extract AskUserQuestion format instructions from a generated SKILL.md.
// ROOT/SKILL.md is the browse skill (Tier 1) and does NOT contain the
// "## AskUserQuestion Format" section — that block is only emitted for
// Tier 2+ skills by scripts/resolvers/preamble.ts. Use office-hours/SKILL.md
// (Tier 3) which always has the format guidance baked in. Falls back to
// the first SKILL.md that contains the header so a future template move
// doesn't break this test again.
let skillMdPath = path.join(ROOT, 'office-hours', 'SKILL.md');
let skillMd = '';
if (fs.existsSync(skillMdPath)) {
skillMd = fs.readFileSync(skillMdPath, 'utf-8');
}
if (!skillMd.includes('## AskUserQuestion Format')) {
// Fallback: scan top-level skill dirs for the first match.
const skillDirs = fs.readdirSync(ROOT, { withFileTypes: true })
.filter(d => d.isDirectory())
.map(d => path.join(ROOT, d.name, 'SKILL.md'));
for (const candidate of skillDirs) {
if (!fs.existsSync(candidate)) continue;
const content = fs.readFileSync(candidate, 'utf-8');
if (content.includes('## AskUserQuestion Format')) {
skillMd = content;
skillMdPath = candidate;
break;
}
}
}
const aqStart = skillMd.indexOf('## AskUserQuestion Format');
const aqEnd = skillMd.indexOf('\n## ', aqStart + 1);
const aqBlock = skillMd.slice(aqStart, aqEnd > 0 ? aqEnd : undefined);
const aqBlock = aqStart >= 0
? skillMd.slice(aqStart, aqEnd > 0 ? aqEnd : undefined)
: '';
const outputPath = path.join(sessionDir, 'question-output.md');