Skip to content

Spec: Server side ad templates creative-opportunities cli#724

Open
prk-Jr wants to merge 3 commits into
server-side-ad-templates-implfrom
ts-config-cli-spec
Open

Spec: Server side ad templates creative-opportunities cli#724
prk-Jr wants to merge 3 commits into
server-side-ad-templates-implfrom
ts-config-cli-spec

Conversation

@prk-Jr
Copy link
Copy Markdown
Collaborator

@prk-Jr prk-Jr commented May 20, 2026

Summary

  • Spec for ts-config, a standalone CLI that validates, matches, lints, and checks creative-opportunities.toml without requiring a Rust toolchain — directly addressing the JS auditor onboarding gap raised in Build a standalone validation tool for creative-opportunities.toml #701
  • Defines a two-tool architecture: Rust binary (validate/match/lint/check, mirrors runtime glob and slot-ID logic) and Node.js tool (generates slot config from live publisher pages via Playwright)
  • Covers all design decisions, edge cases, error type scaffold, JSON output contracts, and concrete test shapes for both Phase 1A (Rust) and Phase 1B (Node.js)

Changes

File Change
docs/superpowers/specs/2026-05-19-ts-config-cli-design.md New: full design spec for ts-config CLI (1440 lines)

Closes

Closes #701

Test plan

  • cargo test --workspace
  • cargo clippy --workspace --all-targets --all-features -- -D warnings
  • cargo fmt --all -- --check
  • JS tests: cd crates/js/lib && npx vitest run
  • JS format: cd crates/js/lib && npm run format
  • Docs format: cd docs && npm run format
  • WASM build: cargo build --package trusted-server-adapter-fastly --release --target wasm32-wasip1
  • Manual testing via fastly compute serve

Spec-only PR — no production code changed. WASM build and manual testing not applicable.

Checklist

  • Changes follow CLAUDE.md conventions
  • No unwrap() in production code — use expect("should ...")
  • Uses tracing macros (not println!)
  • New code has tests
  • No secrets or credentials committed

Defines the `ts-config` CLI tool for validating, matching, linting, and
checking `creative-opportunities.toml` without a Rust toolchain. Also covers
the Node.js `ts-config-generate` browser-automation tool for generating slot
configs from live publisher pages.

Key decisions:
- Rust binary for validate/match/lint/check (mirrors runtime glob + slot ID logic)
- Node.js/Playwright for generate (browser automation, reuses js-asset-auditor stack)
- Phase 1A (Rust) ships independently; Phase 1B (Node.js) waits on feature/js-asset-auditor
- Layer 1 init script uses addInitScript function form to scope settle correctly
- googletag.cmd.push interception closes race with deferred GPT setup pattern
- EmptySlotId variant distinct from InvalidSlotId in ValidateError enum
- Concrete test shapes for both Rust unit/integration and Node.js unit/integration
@prk-Jr prk-Jr self-assigned this May 20, 2026
@prk-Jr prk-Jr marked this pull request as draft May 20, 2026 12:25
@prk-Jr prk-Jr marked this pull request as ready for review May 21, 2026 14:57
@prk-Jr prk-Jr changed the title Add ts-config CLI design spec Spec: Server side ad templates creative-opportunities cli May 22, 2026
- Align gam_unit_path/div_id with runtime Option<String>: optional but non-empty if present
- Expand validate rules from 10 to 11: add missing_leading_slash, empty_gam_unit_path, empty_div_id
- Add ValidateError variants for all three new rules
- Add fixture matrix rows for new rules (missing-leading-slash, empty-gam-unit-path, empty-div-id)
- Add fake-publisher-direct.html fixture for direct defineSlot coverage (Layer 1 patchGoogletag)
- Fix Layer 1/2 labelling throughout: direct defineSlot is Layer 1, not Layer 2
- Clarify "match does not validate" as skipping semantic validation after typed load
- Define slot ID derivation algorithm: tokenize, filter generics/single-chars/hash fragments, fallback to unitPath
- Define generator behaviour when all sizes are unsupported: omit slot, warn to stderr
- Add APS correlation tests for size-only and name/size conflict (Step C rules 5 and 7)
- Add unit test for short-prefix no-merge (<4 chars)
- Update cross-page reconciliation rule 3: prefix must be ≥ 4 chars
- Fix /20** invalidity: generator emits /20*, tests updated
- Fix APS fetchBids setter recursion: use value descriptor after patching
- Fix JSON kind registry: add empty_gam_unit_path and empty_div_id
- Fix JSON field-path contract: all examples now use full TOML paths (slots[N].field)
- Fix stale rule-count references and "Two/three fixtures" wording
- Add --target-dir "$(pwd)/target" to all CLI cargo commands including CI test command
- Specify [lints.clippy] for excluded CLI crate (print_stdout allow, print_stderr warn)
src/match_cmd.rs ← glob matching
src/report.rs ← output formatting (human + JSON)

packages/js-asset-auditor/ ← Node.js package (feature/js-asset-auditor branch)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the claude code package will be removed, in favor of the ts cli.

the ts cli / edgezero cli will have auditing and config store primitives, so I'd hold off and rework this when those are in place

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants