mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-01 19:25:10 +02:00
feat: OpenClaw integration v2 — prompt is the bridge (v0.15.9.0) (#816)
* feat: add includeSkills to HostConfig + update OpenClaw config Add includeSkills allowlist field with union logic (include minus skip). Update OpenClaw to generate only 4 native methodology skills (office-hours, plan-ceo-review, investigate, retro). Remove staticFiles.SOUL.md reference (pointed to non-existent file). * feat: OpenClaw integration — gstack-lite/full generation + spawned session detection Add includeSkills filter to gen-skill-docs pipeline. Generate gstack-lite (planning discipline for spawned coding sessions) and gstack-full (complete feature pipeline) for OpenClaw host. Add OPENCLAW_SESSION env var detection in preamble for spawned session auto-detect. Update setup --host openclaw to print redirect message. * docs: OpenClaw architecture doc + regenerate all SKILL.md with spawned session detection Add docs/OPENCLAW.md with 4-tier dispatch routing and integration architecture. Generate gstack-lite and gstack-full prompt templates. Regenerate all SKILL.md files with OPENCLAW_SESSION env var check in preamble. * test: update golden baselines + OpenClaw includeSkills tests Update golden SKILL.md baselines for preamble SPAWNED_SESSION change. Replace staticFiles SOUL.md test with includeSkills validation. * chore: bump version and changelog (v0.15.9.0) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove all Wintermute references from source files Replace with generic "orchestrator" or "OpenClaw" as appropriate. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add Plan dispatch tier — full review gauntlet for Claude Code project planning New gstack-plan template chains /office-hours → /autoplan (CEO + eng + design + DX + codex adversarial), saves the reviewed plan, and reports back to the orchestrator. The orchestrator persists the plan link to its own memory store. 5 tiers now: Simple, Medium, Heavy, Full, Plan. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -507,11 +507,16 @@ for (const currentHost of hostsToRun) {
|
||||
let hasChanges = false;
|
||||
const tokenBudget: Array<{ skill: string; lines: number; tokens: number }> = [];
|
||||
|
||||
const currentHostConfig = getHostConfig(currentHost);
|
||||
for (const tmplPath of findTemplates()) {
|
||||
// Skip skills listed in host config's generation.skipSkills
|
||||
const currentHostConfig = getHostConfig(currentHost);
|
||||
const dir = path.basename(path.dirname(tmplPath));
|
||||
|
||||
// includeSkills allowlist (union logic: include minus skip)
|
||||
if (currentHostConfig.generation.includeSkills?.length) {
|
||||
if (!currentHostConfig.generation.includeSkills.includes(dir)) continue;
|
||||
}
|
||||
// skipSkills denylist (subtracts from includeSkills or full set)
|
||||
if (currentHostConfig.generation.skipSkills?.length) {
|
||||
const dir = path.basename(path.dirname(tmplPath));
|
||||
if (currentHostConfig.generation.skipSkills.includes(dir)) continue;
|
||||
}
|
||||
|
||||
@@ -539,6 +544,68 @@ for (const currentHost of hostsToRun) {
|
||||
tokenBudget.push({ skill: relOutput, lines, tokens });
|
||||
}
|
||||
|
||||
// Generate gstack-lite and gstack-full for OpenClaw host
|
||||
if (currentHost === 'openclaw' && !DRY_RUN) {
|
||||
const openclawDir = path.join(ROOT, 'openclaw');
|
||||
if (!fs.existsSync(openclawDir)) fs.mkdirSync(openclawDir, { recursive: true });
|
||||
|
||||
const gstackLite = `# gstack-lite Planning Discipline
|
||||
|
||||
Injected by the orchestrator into spawned Claude Code sessions. Append to existing CLAUDE.md.
|
||||
|
||||
## Planning Discipline
|
||||
1. Read every file you will modify. Understand existing patterns first.
|
||||
2. Before writing code, state your plan: what, why, which files, test case, risk.
|
||||
3. When ambiguous, prefer: completeness over shortcuts, existing patterns over new ones,
|
||||
reversible choices over irreversible ones, safe defaults over clever ones.
|
||||
4. Self-review your changes before reporting done. Check for: missed files, broken
|
||||
imports, untested paths, style inconsistencies.
|
||||
5. Report when done: what shipped, what decisions you made, anything uncertain.
|
||||
`;
|
||||
fs.writeFileSync(path.join(openclawDir, 'gstack-lite-CLAUDE.md'), gstackLite);
|
||||
console.log('GENERATED: openclaw/gstack-lite-CLAUDE.md');
|
||||
|
||||
const gstackFull = `# gstack-full Pipeline
|
||||
|
||||
Injected by the orchestrator for complete feature builds. Append to existing CLAUDE.md.
|
||||
|
||||
## Full Pipeline
|
||||
1. Read CLAUDE.md and understand the project context.
|
||||
2. Run /autoplan to review your approach (CEO + eng + design review pipeline).
|
||||
3. Implement the approved plan. Follow the planning discipline above.
|
||||
4. Run /ship to create a PR with tests, changelog, and version bump.
|
||||
5. Report back: PR URL, what shipped, decisions made, anything uncertain.
|
||||
|
||||
Do not ask for human input until the PR is ready for review.
|
||||
`;
|
||||
fs.writeFileSync(path.join(openclawDir, 'gstack-full-CLAUDE.md'), gstackFull);
|
||||
console.log('GENERATED: openclaw/gstack-full-CLAUDE.md');
|
||||
|
||||
const gstackPlan = `# gstack-plan: Full Review Gauntlet
|
||||
|
||||
Injected by the orchestrator when the user wants to plan a Claude Code project.
|
||||
Append to existing CLAUDE.md.
|
||||
|
||||
## Planning Pipeline
|
||||
1. Read CLAUDE.md and understand the project context.
|
||||
2. Run /office-hours to produce a design doc (problem statement, premises, alternatives).
|
||||
3. Run /autoplan to review the design (CEO + eng + design + DX reviews + codex adversarial).
|
||||
4. Save the final reviewed plan to a file the orchestrator can reference later.
|
||||
Write it to: plans/<project-slug>-plan-<date>.md in the current repo.
|
||||
Include the design doc, all review decisions, and the implementation sequence.
|
||||
5. Report back to the orchestrator:
|
||||
- Plan file path
|
||||
- One-paragraph summary of what was designed and the key decisions
|
||||
- List of accepted scope expansions (if any)
|
||||
- Recommended next step (usually: spawn a new session with gstack-full to implement)
|
||||
|
||||
Do not implement anything. This is planning only.
|
||||
The orchestrator will persist the plan link to its own memory/knowledge store.
|
||||
`;
|
||||
fs.writeFileSync(path.join(openclawDir, 'gstack-plan-CLAUDE.md'), gstackPlan);
|
||||
console.log('GENERATED: openclaw/gstack-plan-CLAUDE.md');
|
||||
}
|
||||
|
||||
if (DRY_RUN && hasChanges) {
|
||||
console.error(`\nGenerated SKILL.md files are stale (${currentHost} host). Run: bun run gen:skill-docs --host ${currentHost}`);
|
||||
if (HOST_ARG_VAL !== 'all') process.exit(1);
|
||||
|
||||
@@ -62,6 +62,8 @@ export interface HostConfig {
|
||||
metadataFormat?: string | null;
|
||||
/** Skill directories to exclude from generation for this host. */
|
||||
skipSkills?: string[];
|
||||
/** Skill directories to include (allowlist). Union logic: include minus skip. */
|
||||
includeSkills?: string[];
|
||||
};
|
||||
|
||||
// --- Content Rewrites ---
|
||||
|
||||
@@ -89,6 +89,8 @@ fi
|
||||
_ROUTING_DECLINED=$(${ctx.paths.binDir}/gstack-config get routing_declined 2>/dev/null || echo "false")
|
||||
echo "HAS_ROUTING: $_HAS_ROUTING"
|
||||
echo "ROUTING_DECLINED: $_ROUTING_DECLINED"
|
||||
# Detect spawned session (OpenClaw or other orchestrator)
|
||||
[ -n "$OPENCLAW_SESSION" ] && echo "SPAWNED_SESSION: true" || true
|
||||
\`\`\``;
|
||||
}
|
||||
|
||||
@@ -226,6 +228,15 @@ Say "No problem. You can add routing rules later by running \`gstack-config set
|
||||
This only happens once per project. If \`HAS_ROUTING\` is \`yes\` or \`ROUTING_DECLINED\` is \`true\`, skip this entirely.`;
|
||||
}
|
||||
|
||||
function generateSpawnedSessionCheck(): string {
|
||||
return `If \`SPAWNED_SESSION\` is \`"true"\`, you are running inside a session spawned by an
|
||||
AI orchestrator (e.g., OpenClaw). In spawned sessions:
|
||||
- Do NOT use AskUserQuestion for interactive prompts. Auto-choose the recommended option.
|
||||
- Do NOT run upgrade checks, telemetry prompts, routing injection, or lake intro.
|
||||
- Focus on completing the task and reporting results via prose output.
|
||||
- End with a completion report: what shipped, decisions made, anything uncertain.`;
|
||||
}
|
||||
|
||||
function generateAskUserFormat(_ctx: TemplateContext): string {
|
||||
return `## AskUserQuestion Format
|
||||
|
||||
@@ -675,6 +686,7 @@ export function generatePreamble(ctx: TemplateContext): string {
|
||||
generateTelemetryPrompt(ctx),
|
||||
generateProactivePrompt(ctx),
|
||||
generateRoutingInjection(ctx),
|
||||
generateSpawnedSessionCheck(),
|
||||
generateVoiceDirective(tier),
|
||||
...(tier >= 2 ? [generateContextRecovery(ctx), generateAskUserFormat(ctx), generateCompletenessSection()] : []),
|
||||
...(tier >= 3 ? [generateRepoModeSection(), generateSearchBeforeBuildingSection(ctx)] : []),
|
||||
|
||||
Reference in New Issue
Block a user