mirror of https://github.com/garrytan/gstack.git
fix(make-pdf): move setup before preamble footer
This commit is contained in:
parent
9d92f8e9c2
commit
a6b32b71af
|
|
@ -102,6 +102,42 @@ echo "CHECKPOINT_PUSH: $_CHECKPOINT_PUSH"
|
||||||
[ -n "$OPENCLAW_SESSION" ] && echo "SPAWNED_SESSION: true" || true
|
[ -n "$OPENCLAW_SESSION" ] && echo "SPAWNED_SESSION: true" || true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## MAKE-PDF SETUP (run this check BEFORE any make-pdf command)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
||||||
|
P=""
|
||||||
|
[ -n "$MAKE_PDF_BIN" ] && [ -x "$MAKE_PDF_BIN" ] && P="$MAKE_PDF_BIN"
|
||||||
|
[ -z "$P" ] && [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/make-pdf/dist/pdf" ] && P="$_ROOT/.claude/skills/gstack/make-pdf/dist/pdf"
|
||||||
|
[ -z "$P" ] && P="$HOME/.claude/skills/gstack/make-pdf/dist/pdf"
|
||||||
|
if [ -x "$P" ]; then
|
||||||
|
echo "MAKE_PDF_READY: $P"
|
||||||
|
alias _p_="$P" # shellcheck alias helper (not exported)
|
||||||
|
export P # available as $P in subsequent blocks within the same skill invocation
|
||||||
|
else
|
||||||
|
echo "MAKE_PDF_NOT_AVAILABLE (run './setup' in the gstack repo to build it)"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
If `MAKE_PDF_NOT_AVAILABLE` is printed: tell the user the binary is not
|
||||||
|
built. Have them run `./setup` from the gstack repo, then retry.
|
||||||
|
|
||||||
|
If `MAKE_PDF_READY` is printed: `$P` is the binary path for the rest of
|
||||||
|
the skill. Use `$P` (not an explicit path) so the skill body stays portable.
|
||||||
|
|
||||||
|
Core commands:
|
||||||
|
- `$P generate <input.md> [output.pdf]` — render markdown to PDF (80% use case)
|
||||||
|
- `$P generate --cover --toc essay.md out.pdf` — full publication layout
|
||||||
|
- `$P generate --watermark DRAFT memo.md draft.pdf` — diagonal DRAFT watermark
|
||||||
|
- `$P preview <input.md>` — render HTML and open in browser (fast iteration)
|
||||||
|
- `$P setup` — verify browse + Chromium + pdftotext and run a smoke test
|
||||||
|
- `$P --help` — full flag reference
|
||||||
|
|
||||||
|
Output contract:
|
||||||
|
- `stdout`: ONLY the output path on success. One line.
|
||||||
|
- `stderr`: progress (`Rendering HTML... Generating PDF...`) unless `--quiet`.
|
||||||
|
- Exit 0 success / 1 bad args / 2 render error / 3 Paged.js timeout / 4 browse unavailable.
|
||||||
|
|
||||||
## Plan Mode Safe Operations
|
## Plan Mode Safe Operations
|
||||||
|
|
||||||
In plan mode, allowed because they inform the plan: `$B`, `$D`, `codex exec`/`codex review`, writes to `~/.gstack/`, writes to the plan file, and `open` for generated artifacts.
|
In plan mode, allowed because they inform the plan: `$B`, `$D`, `codex exec`/`codex review`, writes to `~/.gstack/`, writes to the plan file, and `open` for generated artifacts.
|
||||||
|
|
@ -489,42 +525,6 @@ On Linux, install `fonts-liberation` for correct rendering — Helvetica and Ari
|
||||||
aren't present by default, and Liberation Sans is the standard metric-compatible
|
aren't present by default, and Liberation Sans is the standard metric-compatible
|
||||||
fallback. CI and Docker builds install it automatically via Dockerfile.ci.
|
fallback. CI and Docker builds install it automatically via Dockerfile.ci.
|
||||||
|
|
||||||
## MAKE-PDF SETUP (run this check BEFORE any make-pdf command)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
||||||
P=""
|
|
||||||
[ -n "$MAKE_PDF_BIN" ] && [ -x "$MAKE_PDF_BIN" ] && P="$MAKE_PDF_BIN"
|
|
||||||
[ -z "$P" ] && [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/make-pdf/dist/pdf" ] && P="$_ROOT/.claude/skills/gstack/make-pdf/dist/pdf"
|
|
||||||
[ -z "$P" ] && P="$HOME/.claude/skills/gstack/make-pdf/dist/pdf"
|
|
||||||
if [ -x "$P" ]; then
|
|
||||||
echo "MAKE_PDF_READY: $P"
|
|
||||||
alias _p_="$P" # shellcheck alias helper (not exported)
|
|
||||||
export P # available as $P in subsequent blocks within the same skill invocation
|
|
||||||
else
|
|
||||||
echo "MAKE_PDF_NOT_AVAILABLE (run './setup' in the gstack repo to build it)"
|
|
||||||
fi
|
|
||||||
```
|
|
||||||
|
|
||||||
If `MAKE_PDF_NOT_AVAILABLE` is printed: tell the user the binary is not
|
|
||||||
built. Have them run `./setup` from the gstack repo, then retry.
|
|
||||||
|
|
||||||
If `MAKE_PDF_READY` is printed: `$P` is the binary path for the rest of
|
|
||||||
the skill. Use `$P` (not an explicit path) so the skill body stays portable.
|
|
||||||
|
|
||||||
Core commands:
|
|
||||||
- `$P generate <input.md> [output.pdf]` — render markdown to PDF (80% use case)
|
|
||||||
- `$P generate --cover --toc essay.md out.pdf` — full publication layout
|
|
||||||
- `$P generate --watermark DRAFT memo.md draft.pdf` — diagonal DRAFT watermark
|
|
||||||
- `$P preview <input.md>` — render HTML and open in browser (fast iteration)
|
|
||||||
- `$P setup` — verify browse + Chromium + pdftotext and run a smoke test
|
|
||||||
- `$P --help` — full flag reference
|
|
||||||
|
|
||||||
Output contract:
|
|
||||||
- `stdout`: ONLY the output path on success. One line.
|
|
||||||
- `stderr`: progress (`Rendering HTML... Generating PDF...`) unless `--quiet`.
|
|
||||||
- Exit 0 success / 1 bad args / 2 render error / 3 Paged.js timeout / 4 browse unavailable.
|
|
||||||
|
|
||||||
## Core patterns
|
## Core patterns
|
||||||
|
|
||||||
### 80% case — memo/letter
|
### 80% case — memo/letter
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,6 @@ On Linux, install `fonts-liberation` for correct rendering — Helvetica and Ari
|
||||||
aren't present by default, and Liberation Sans is the standard metric-compatible
|
aren't present by default, and Liberation Sans is the standard metric-compatible
|
||||||
fallback. CI and Docker builds install it automatically via Dockerfile.ci.
|
fallback. CI and Docker builds install it automatically via Dockerfile.ci.
|
||||||
|
|
||||||
{{MAKE_PDF_SETUP}}
|
|
||||||
|
|
||||||
## Core patterns
|
## Core patterns
|
||||||
|
|
||||||
### 80% case — memo/letter
|
### 80% case — memo/letter
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@ import { generateContextHealth } from './preamble/generate-context-health';
|
||||||
// Tier 3+ repo mode + search
|
// Tier 3+ repo mode + search
|
||||||
import { generateRepoModeSection } from './preamble/generate-repo-mode-section';
|
import { generateRepoModeSection } from './preamble/generate-repo-mode-section';
|
||||||
import { generateSearchBeforeBuildingSection } from './preamble/generate-search-before-building';
|
import { generateSearchBeforeBuildingSection } from './preamble/generate-search-before-building';
|
||||||
|
import { generateMakePdfSetup } from './make-pdf';
|
||||||
|
|
||||||
// Standalone export used directly by the resolver registry
|
// Standalone export used directly by the resolver registry
|
||||||
export { generateTestFailureTriage } from './preamble/generate-test-failure-triage';
|
export { generateTestFailureTriage } from './preamble/generate-test-failure-triage';
|
||||||
|
|
@ -81,7 +82,8 @@ export function generatePreamble(ctx: TemplateContext): string {
|
||||||
}
|
}
|
||||||
const sections = [
|
const sections = [
|
||||||
generatePreambleBash(ctx),
|
generatePreambleBash(ctx),
|
||||||
// Plan-mode-skill semantics at position 1: after bash (so _SESSION_ID /
|
...(ctx.skillName === 'make-pdf' ? [generateMakePdfSetup(ctx)] : []),
|
||||||
|
// Plan-mode-skill semantics stays near the top: after bash (so _SESSION_ID /
|
||||||
// _BRANCH / _TEL env vars are live) and before all onboarding gates so
|
// _BRANCH / _TEL env vars are live) and before all onboarding gates so
|
||||||
// models read the authoritative "AskUserQuestion satisfies plan mode's
|
// models read the authoritative "AskUserQuestion satisfies plan mode's
|
||||||
// end-of-turn" rule before any other instruction. Renders for all skills
|
// end-of-turn" rule before any other instruction. Renders for all skills
|
||||||
|
|
|
||||||
|
|
@ -1098,6 +1098,26 @@ describe('Plan status footer in preamble', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// --- make-pdf setup ordering ---
|
||||||
|
|
||||||
|
describe('make-pdf setup ordering', () => {
|
||||||
|
test('MAKE-PDF SETUP appears before generic preamble footer sections', () => {
|
||||||
|
const content = fs.readFileSync(path.join(ROOT, 'make-pdf', 'SKILL.md'), 'utf-8');
|
||||||
|
const preambleIdx = content.indexOf('## Preamble (run first)');
|
||||||
|
const setupIdx = content.indexOf('## MAKE-PDF SETUP');
|
||||||
|
const planModeIdx = content.indexOf('## Plan Mode Safe Operations');
|
||||||
|
const telemetryIdx = content.indexOf('## Telemetry (run last)');
|
||||||
|
const workflowIdx = content.indexOf('# make-pdf: publication-quality PDFs from markdown');
|
||||||
|
|
||||||
|
expect(preambleIdx).toBeGreaterThanOrEqual(0);
|
||||||
|
expect(setupIdx).toBeGreaterThan(preambleIdx);
|
||||||
|
expect(setupIdx).toBeLessThan(planModeIdx);
|
||||||
|
expect(setupIdx).toBeLessThan(telemetryIdx);
|
||||||
|
expect(setupIdx).toBeLessThan(workflowIdx);
|
||||||
|
expect(content.match(/^## MAKE-PDF SETUP/gm)?.length ?? 0).toBe(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// --- Skill invocation during plan mode in preamble ---
|
// --- Skill invocation during plan mode in preamble ---
|
||||||
|
|
||||||
describe('Skill invocation during plan mode in preamble', () => {
|
describe('Skill invocation during plan mode in preamble', () => {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue