@agentsfleet/orly 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bash
2
- # design-tokens.sh — enforce design-system token discipline across
3
- # ui/packages/{app,website}/**/*.tsx.
2
+ # design-tokens.sh — enforce design-system token discipline and flat fills
3
+ # across the app, website, and shared design system.
4
4
  #
5
5
  # Dispatch façade: dispatch/write_ts_adhere_bun.md (Design Tokens / DESIGN TOKEN GATE)
6
6
  # Fires in: CONFORM (via `make harness-verify` in `agentsfleet`).
@@ -62,6 +62,23 @@ PATTERNS=(
62
62
  '(text|bg|border)-(red|blue|green|yellow|purple|indigo|violet|pink|orange|gray|slate|zinc|neutral)-[0-9]:::use semantic tokens (text-destructive, text-error, text-success, …)'
63
63
  )
64
64
 
65
+ readonly GRADIENT_REGEX='(repeating-)?(linear|radial|conic)-gradient[[:space:]]*\('
66
+
67
+ # Consumers may select a font role, but only the design system defines it.
68
+ check_font_ownership() {
69
+ local f="$1"
70
+ case "$f" in ui/packages/design-system/*) return ;; esac
71
+ awk '
72
+ {
73
+ source = $0
74
+ gsub(/font-family[[:space:]]*:[[:space:]]*var\(--ff-(sans|mono|display)\)/, "")
75
+ invalid = /font-family[[:space:]]*:|fontFamily[[:space:]]*:[[:space:]]*["\047]|--(ff|font)-(sans|mono|display)[[:space:]]*:|font-\[/
76
+ if (FILENAME ~ /^ui\/packages\/app\// && /font-display|DisplayXL|DisplayLG/) invalid = 1
77
+ if (invalid) printf "%s:%d:%s\n", FILENAME, FNR, source
78
+ }
79
+ ' "$f"
80
+ }
81
+
65
82
  # ── File scope ───────────────────────────────────────────────────────────
66
83
  in_scope() {
67
84
  local f="$1"
@@ -70,8 +87,17 @@ in_scope() {
70
87
  *tests/e2e/*) return 1 ;;
71
88
  ui/packages/app/*.tsx|ui/packages/app/*.jsx) return 0 ;;
72
89
  ui/packages/website/*.tsx|ui/packages/website/*.jsx) return 0 ;;
73
- ui/packages/app/**/*.tsx|ui/packages/app/**/*.jsx) return 0 ;;
74
- ui/packages/website/**/*.tsx|ui/packages/website/**/*.jsx) return 0 ;;
90
+ *) return 1 ;;
91
+ esac
92
+ }
93
+
94
+ in_gradient_scope() {
95
+ local f="$1"
96
+ case "$f" in
97
+ *.test.*|*.spec.*|*/tests/*|*/coverage/*|*/dist/*|*/.next/*|*/node_modules/*) return 1 ;;
98
+ ui/packages/app/*.css|ui/packages/app/*.js|ui/packages/app/*.jsx|ui/packages/app/*.mjs|ui/packages/app/*.ts|ui/packages/app/*.tsx) return 0 ;;
99
+ ui/packages/website/*.css|ui/packages/website/*.js|ui/packages/website/*.jsx|ui/packages/website/*.mjs|ui/packages/website/*.ts|ui/packages/website/*.tsx) return 0 ;;
100
+ ui/packages/design-system/*.css|ui/packages/design-system/*.js|ui/packages/design-system/*.jsx|ui/packages/design-system/*.mjs|ui/packages/design-system/*.ts|ui/packages/design-system/*.tsx) return 0 ;;
75
101
  *) return 1 ;;
76
102
  esac
77
103
  }
@@ -79,12 +105,14 @@ in_scope() {
79
105
  case "$MODE" in
80
106
  --staged|staged)
81
107
  FILES=$(git diff --cached --name-only --diff-filter=ACMRT 2>/dev/null || true)
108
+ GRADIENT_CANDIDATES="$FILES"
82
109
  ;;
83
110
  --all|all)
84
111
  # `git ls-files` reports the index, which includes staged content —
85
112
  # so pre-commit-style invocations see staged-but-not-committed files
86
113
  # without needing a `--staged` flag.
87
114
  FILES=$(git ls-files -- 'ui/packages/app/*.tsx' 'ui/packages/app/*.jsx' 'ui/packages/website/*.tsx' 'ui/packages/website/*.jsx' 2>/dev/null || true)
115
+ GRADIENT_CANDIDATES=$(git ls-files -- ui/packages/app ui/packages/website ui/packages/design-system 2>/dev/null || true)
88
116
  ;;
89
117
  *)
90
118
  echo "usage: $0 [--all|--staged]" >&2
@@ -127,10 +155,34 @@ if [ "${#SCOPED_FILES[@]}" -gt 0 ]; then
127
155
  done
128
156
  fi
129
157
 
158
+ GRADIENT_FILES=()
159
+ while IFS= read -r f; do
160
+ [ -z "$f" ] && continue
161
+ [ ! -f "$f" ] && continue
162
+ in_gradient_scope "$f" || continue
163
+ GRADIENT_FILES+=("$f")
164
+ while IFS= read -r match; do
165
+ [ -z "$match" ] && continue
166
+ printf '%s\n -> define fonts in design-system tokens.css; use sans for app UI and mono for technical values\n' "$match"
167
+ SEEN_FILES_LIST="${SEEN_FILES_LIST}${f}"$'\n'
168
+ FAIL=1
169
+ done < <(check_font_ownership "$f")
170
+ done <<< "$GRADIENT_CANDIDATES"
171
+
172
+ if [ "${#GRADIENT_FILES[@]}" -gt 0 ]; then
173
+ while IFS= read -r match; do
174
+ [ -z "$match" ] && continue
175
+ f="${match%%:*}"
176
+ printf '%s\n -> use a solid design-system color token; gradients are forbidden\n' "$match"
177
+ SEEN_FILES_LIST="${SEEN_FILES_LIST}${f}"$'\n'
178
+ FAIL=1
179
+ done < <(grep -nHE "$GRADIENT_REGEX" "${GRADIENT_FILES[@]}" 2>/dev/null || true)
180
+ fi
181
+
130
182
  FILES_WITH_VIOLATIONS=$(printf '%s' "$SEEN_FILES_LIST" | sort -u | grep -c . || true)
131
183
 
132
184
  if [ "$FAIL" = "0" ]; then
133
- echo "OK: design-token discipline — no arbitraries that have a token equivalent (mode=$MODE)"
185
+ echo "OK: design-token discipline — named utilities and flat fills verified (mode=$MODE)"
134
186
  exit 0
135
187
  fi
136
188
 
@@ -40,8 +40,10 @@ a gate skip.
40
40
  names, money amounts stay verbatim.
41
41
  - **Internal cleanup** gets aggressive trimming, not a paragraph.
42
42
  - **History is archived, not rewritten** — past entries are an immutable record.
43
- - **Rate constants** stay pinned across the three files (`tenant_billing.zig`,
44
- `rates.ts`, `rates.mdx`) — a changelog money/rate claim must match all three.
43
+ - **Rate constants** are pinned by `cross_runtime_rates.rs`, which reads the
44
+ app and Command-Line Interface (CLI) mirrors against the Rust constant. A
45
+ changelog money or rate claim must match those, and `rates.mdx` in the docs
46
+ repository, which no test can reach.
45
47
 
46
48
  ## Required output (self-audit line before committing the changelog)
47
49
 
@@ -14,5 +14,5 @@ Editing `~/Projects/docs/changelog.mdx` or any other Mintlify `<Update>` block.
14
14
  - **Internal cleanup / refactor entries get the most aggressive trimming.** One lead paragraph + one bullet list. Skip "Test coverage" sections unless the test count is the headline. Indy's exact direction: *"Keep internal code cleanup, refactor to a minimal."*
15
15
  - **Never drop load-bearing facts.** Error codes (`UZ-AUTH-003`), endpoint paths + method + body shape + status code, env var names + defaults, schema column / table names, CLI subcommand + flag names, migration steps, money amounts. Tighten prose, not meaning.
16
16
  - **Historical entries are archives.** Brevity-pass them; never rewrite the past. A typo correction (e.g. `$0.001` → `$0.01` when it was never true) is allowed and must be called out in the commit message.
17
- - **Rate constants flow through three pinned files only:** `rustd/crates/afd_billing/src/nanos.rs`, `ui/packages/website/src/lib/rates.ts`, `~/Projects/docs/snippets/rates.mdx`. Bumping a rate requires a paired Pull Request (PR) across the docs repo — there is no automated guard. In `*.mdx`, use `import { STARTER_CREDIT, EVENT_RATE, STAGE_RATE } from "/snippets/rates.mdx"` instead of hand-typing `$5`.
17
+ - **Rate constants stay pinned across the runtime surfaces, and a test says so.** `rustd/crates/afd_billing/tests/cross_runtime_rates.rs` reads `ui/packages/app/lib/types.ts` and `cli/src/constants/billing.ts` and fails when either drifts from `rustd/crates/afd_billing/src/nanos.rs` — a test beside the constant it defends, not a gate nothing invokes. Public docs are the one surface it cannot reach: when a rate changes, update `~/Projects/docs/snippets/rates.mdx` in a paired Pull Request (PR). In `*.mdx`, import its named values rather than hand-typing money amounts.
18
18
  - **The Mintlify reference Indy pasted (May 1 / May 8 entries) is canonical voice.** Mirror its rhythm, not its product nouns.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentsfleet/orly",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "description": "Repository-scoped engineering harness: renders agent rules, materialises the gates that enforce them, and proves the PR boundary \u2014 for any coding agent.",
5
5
  "license": "MIT",
6
6
  "type": "module",