iconflow 0.5.0__tar.gz
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.
- iconflow-0.5.0/.claude-plugin/marketplace.json +32 -0
- iconflow-0.5.0/AGENTS.md +179 -0
- iconflow-0.5.0/CHANGELOG.md +353 -0
- iconflow-0.5.0/CONTRIBUTING.md +260 -0
- iconflow-0.5.0/LICENSE +201 -0
- iconflow-0.5.0/LICENSES.md +244 -0
- iconflow-0.5.0/MANIFEST.in +24 -0
- iconflow-0.5.0/NOTICE +64 -0
- iconflow-0.5.0/PKG-INFO +555 -0
- iconflow-0.5.0/README.md +515 -0
- iconflow-0.5.0/SECURITY.md +42 -0
- iconflow-0.5.0/THIRD_PARTY_NOTICES.md +31 -0
- iconflow-0.5.0/TRADEMARKS.md +59 -0
- iconflow-0.5.0/brand/LICENSE +52 -0
- iconflow-0.5.0/brand/iconflow.toml +43 -0
- iconflow-0.5.0/brand/master-review.json +42 -0
- iconflow-0.5.0/brand/master.svg +18 -0
- iconflow-0.5.0/brand/tray.svg +26 -0
- iconflow-0.5.0/demo/LICENSE +37 -0
- iconflow-0.5.0/demo/iconflow.toml +43 -0
- iconflow-0.5.0/demo/master-review.json +42 -0
- iconflow-0.5.0/demo/master.svg +18 -0
- iconflow-0.5.0/demo/tray.svg +26 -0
- iconflow-0.5.0/docs/AGENT_CONTRACT.md +122 -0
- iconflow-0.5.0/docs/BRAND_SYSTEM.md +188 -0
- iconflow-0.5.0/docs/CONCEPTING.md +248 -0
- iconflow-0.5.0/docs/DESIGN_PLAYBOOK.md +352 -0
- iconflow-0.5.0/docs/EMOJI_MATRIX.md +107 -0
- iconflow-0.5.0/docs/EVOLUTION.md +139 -0
- iconflow-0.5.0/docs/GALLERY.md +72 -0
- iconflow-0.5.0/docs/I18N_PLAN.md +208 -0
- iconflow-0.5.0/docs/ISSUE_SEEDS.md +114 -0
- iconflow-0.5.0/docs/LAUNCH_READINESS.md +233 -0
- iconflow-0.5.0/docs/LAUNCH_SITE.md +221 -0
- iconflow-0.5.0/docs/LEARNINGS.md +809 -0
- iconflow-0.5.0/docs/LICENSE +18 -0
- iconflow-0.5.0/docs/MILESTONE_v0.5.md +97 -0
- iconflow-0.5.0/docs/OUTPUT_TARGETS.md +313 -0
- iconflow-0.5.0/docs/PROOF_ACTION.md +138 -0
- iconflow-0.5.0/docs/PROVENANCE.md +216 -0
- iconflow-0.5.0/docs/RELEASING.md +193 -0
- iconflow-0.5.0/docs/REVIEW_CHECKLIST.md +76 -0
- iconflow-0.5.0/docs/SHOWCASE_PLAN.md +109 -0
- iconflow-0.5.0/docs/SOCIAL_SIGNALS.md +94 -0
- iconflow-0.5.0/docs/STYLE_CATALOG.md +146 -0
- iconflow-0.5.0/docs/SVG_TECHNIQUES.md +330 -0
- iconflow-0.5.0/docs/WORKFLOW.md +127 -0
- iconflow-0.5.0/docs/assets/LICENSE +36 -0
- iconflow-0.5.0/docs/assets/concept-bake.png +0 -0
- iconflow-0.5.0/docs/assets/hero-flow.svg +119 -0
- iconflow-0.5.0/docs/assets/review-proof.png +0 -0
- iconflow-0.5.0/docs/assets/social-preview.png +0 -0
- iconflow-0.5.0/docs/assets/social-preview.svg +65 -0
- iconflow-0.5.0/docs/assets/style-gallery.png +0 -0
- iconflow-0.5.0/examples/README.md +205 -0
- iconflow-0.5.0/examples/community-case/LICENSE +16 -0
- iconflow-0.5.0/examples/community-case/README.md +28 -0
- iconflow-0.5.0/iconflow/__init__.py +16 -0
- iconflow-0.5.0/iconflow/__main__.py +8 -0
- iconflow-0.5.0/iconflow/agentkit.py +520 -0
- iconflow-0.5.0/iconflow/assemble.py +325 -0
- iconflow-0.5.0/iconflow/build.py +338 -0
- iconflow-0.5.0/iconflow/casebook.py +820 -0
- iconflow-0.5.0/iconflow/cli.py +1632 -0
- iconflow-0.5.0/iconflow/config.py +654 -0
- iconflow-0.5.0/iconflow/htmlhead.py +146 -0
- iconflow-0.5.0/iconflow/qa.py +499 -0
- iconflow-0.5.0/iconflow/rasterize.py +287 -0
- iconflow-0.5.0/iconflow/resources/__init__.py +3 -0
- iconflow-0.5.0/iconflow/review.py +857 -0
- iconflow-0.5.0/iconflow/shortcut.py +189 -0
- iconflow-0.5.0/iconflow/styles.py +227 -0
- iconflow-0.5.0/iconflow.egg-info/PKG-INFO +555 -0
- iconflow-0.5.0/iconflow.egg-info/SOURCES.txt +141 -0
- iconflow-0.5.0/iconflow.egg-info/dependency_links.txt +1 -0
- iconflow-0.5.0/iconflow.egg-info/entry_points.txt +2 -0
- iconflow-0.5.0/iconflow.egg-info/requires.txt +8 -0
- iconflow-0.5.0/iconflow.egg-info/top_level.txt +1 -0
- iconflow-0.5.0/licenses/CC-BY-4.0.txt +396 -0
- iconflow-0.5.0/licenses/CC-BY-NC-ND-4.0.txt +403 -0
- iconflow-0.5.0/licenses/CC-BY-SA-4.0.txt +428 -0
- iconflow-0.5.0/licenses/CC0-1.0.txt +121 -0
- iconflow-0.5.0/pyproject.toml +94 -0
- iconflow-0.5.0/requirements.txt +5 -0
- iconflow-0.5.0/scripts/build_archive.py +629 -0
- iconflow-0.5.0/scripts/build_emoji_matrix.py +556 -0
- iconflow-0.5.0/scripts/build_gallery.py +648 -0
- iconflow-0.5.0/scripts/build_i18n.py +1094 -0
- iconflow-0.5.0/scripts/build_social_signals.py +710 -0
- iconflow-0.5.0/scripts/deploy-site.ps1 +76 -0
- iconflow-0.5.0/scripts/proof_receipt.py +270 -0
- iconflow-0.5.0/scripts/render_social_preview.py +59 -0
- iconflow-0.5.0/scripts/setup.ps1 +19 -0
- iconflow-0.5.0/scripts/setup.sh +23 -0
- iconflow-0.5.0/scripts/verify_distribution.py +211 -0
- iconflow-0.5.0/setup.cfg +4 -0
- iconflow-0.5.0/skills/.claude-plugin/plugin.json +26 -0
- iconflow-0.5.0/skills/LICENSE +18 -0
- iconflow-0.5.0/skills/commands/icon.md +46 -0
- iconflow-0.5.0/skills/commands/setup.md +56 -0
- iconflow-0.5.0/skills/iconflow/LICENSE +18 -0
- iconflow-0.5.0/skills/iconflow/SKILL.md +249 -0
- iconflow-0.5.0/skills/iconflow/agents/openai.yaml +4 -0
- iconflow-0.5.0/templates/LICENSE +24 -0
- iconflow-0.5.0/templates/grid-overlay.svg +22 -0
- iconflow-0.5.0/templates/master.svg +27 -0
- iconflow-0.5.0/templates/presets/blueprint.svg +27 -0
- iconflow-0.5.0/templates/presets/cel-shaded.svg +32 -0
- iconflow-0.5.0/templates/presets/chrome.svg +35 -0
- iconflow-0.5.0/templates/presets/clay.svg +25 -0
- iconflow-0.5.0/templates/presets/cut-paper.svg +23 -0
- iconflow-0.5.0/templates/presets/duotone-cut.svg +26 -0
- iconflow-0.5.0/templates/presets/enamel-pin.svg +24 -0
- iconflow-0.5.0/templates/presets/flat-geometric.svg +16 -0
- iconflow-0.5.0/templates/presets/glass-stack.svg +31 -0
- iconflow-0.5.0/templates/presets/gradient-glow.svg +34 -0
- iconflow-0.5.0/templates/presets/ink-brush.svg +17 -0
- iconflow-0.5.0/templates/presets/isometric.svg +22 -0
- iconflow-0.5.0/templates/presets/line-mark.svg +19 -0
- iconflow-0.5.0/templates/presets/mascot.svg +26 -0
- iconflow-0.5.0/templates/presets/pixel-grid.svg +15 -0
- iconflow-0.5.0/templates/presets/risograph.svg +25 -0
- iconflow-0.5.0/templates/presets/stained-glass.svg +31 -0
- iconflow-0.5.0/templates/presets/stencil-cut.svg +24 -0
- iconflow-0.5.0/templates/presets/woodcut.svg +19 -0
- iconflow-0.5.0/templates/presets/woven.svg +21 -0
- iconflow-0.5.0/tests/test_agentkit.py +369 -0
- iconflow-0.5.0/tests/test_assemble.py +114 -0
- iconflow-0.5.0/tests/test_browser_security.py +64 -0
- iconflow-0.5.0/tests/test_build.py +242 -0
- iconflow-0.5.0/tests/test_casebook.py +184 -0
- iconflow-0.5.0/tests/test_cli.py +260 -0
- iconflow-0.5.0/tests/test_config.py +403 -0
- iconflow-0.5.0/tests/test_contract.py +533 -0
- iconflow-0.5.0/tests/test_distribution.py +159 -0
- iconflow-0.5.0/tests/test_htmlhead.py +42 -0
- iconflow-0.5.0/tests/test_licensing.py +345 -0
- iconflow-0.5.0/tests/test_qa.py +224 -0
- iconflow-0.5.0/tests/test_rasterize.py +73 -0
- iconflow-0.5.0/tests/test_repo_contract.py +368 -0
- iconflow-0.5.0/tests/test_review.py +115 -0
- iconflow-0.5.0/tests/test_shortcut.py +69 -0
- iconflow-0.5.0/tests/test_website.py +911 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "iconflow",
|
|
3
|
+
"description": "IconFlow — reviewed, platform-ready icon families from one semantic SVG master.",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "snowyukitty",
|
|
6
|
+
"url": "https://github.com/snowyukitty"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "iconflow",
|
|
11
|
+
"source": "./skills",
|
|
12
|
+
"description": "Design, review at 16px, and ship a distinctive icon family from one semantic SVG master — favicon, PWA, Tauri, Electron, and tray, behind a fail-closed quality gate.",
|
|
13
|
+
"category": "design",
|
|
14
|
+
"tags": [
|
|
15
|
+
"icon",
|
|
16
|
+
"favicon",
|
|
17
|
+
"svg",
|
|
18
|
+
"design",
|
|
19
|
+
"pwa",
|
|
20
|
+
"electron",
|
|
21
|
+
"tauri",
|
|
22
|
+
"tray"
|
|
23
|
+
],
|
|
24
|
+
"author": {
|
|
25
|
+
"name": "snowyukitty"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://ai-iconflow.com",
|
|
28
|
+
"repository": "https://github.com/snowyukitty/ai-iconflow",
|
|
29
|
+
"license": "CC-BY-SA-4.0"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
iconflow-0.5.0/AGENTS.md
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: CC-BY-SA-4.0
|
|
2
|
+
SPDX-FileCopyrightText: 2026 snowyukitty · https://ai-iconflow.com
|
|
3
|
+
Reusing this prose requires attribution and the same license.
|
|
4
|
+
Applying the methods it describes requires nothing: icons you design
|
|
5
|
+
with IconFlow are entirely yours. See LICENSES.md section 1. -->
|
|
6
|
+
# AGENTS.md — how an AI agent uses IconFlow
|
|
7
|
+
|
|
8
|
+
You are the **designer**. IconFlow gives you a design playbook, reusable SVG
|
|
9
|
+
building blocks, and a deterministic engine that turns ONE SVG into every icon
|
|
10
|
+
format — plus a render-and-review loop so you can see and fix your work before
|
|
11
|
+
shipping. This file is the contract for Claude, Codex, and any other agent.
|
|
12
|
+
|
|
13
|
+
## The procedure (follow in order)
|
|
14
|
+
|
|
15
|
+
Before step 0, resolve the runner. `python -m iconflow` below means the
|
|
16
|
+
`iconflow` command on PATH when the package is installed (`uv tool install
|
|
17
|
+
iconflow`, `pipx install iconflow`, or `pip install iconflow` — once
|
|
18
|
+
published on PyPI); from a source checkout use that checkout's venv interpreter
|
|
19
|
+
(`.venv\Scripts\python.exe` on Windows or `.venv/bin/python` on POSIX). Run
|
|
20
|
+
`-m iconflow setup` once if needed, and use that one runner for every command
|
|
21
|
+
below. When invoked from another repository, keep the shell in the consuming
|
|
22
|
+
project so its config and final sources land there; use absolute paths for
|
|
23
|
+
toolkit docs and `work/<slug>/` drafts. See *Environment* for both modes.
|
|
24
|
+
|
|
25
|
+
0. **Read** `docs/LEARNINGS.md` — the rules distilled from every previously
|
|
26
|
+
shipped icon. This is what makes the system self-evolving: past mistakes
|
|
27
|
+
are only worth their cost if you apply them now. Optionally run
|
|
28
|
+
`python -m iconflow case stats` to see the current weakest axis and any
|
|
29
|
+
house-cliché warning before you start. Treat that signal as diagnostic; it
|
|
30
|
+
does not itself authorize editing this shared toolkit.
|
|
31
|
+
1. **Read** `docs/DESIGN_PLAYBOOK.md`. From the consuming project, create its
|
|
32
|
+
`iconflow.toml` with `python -m iconflow init --out iconflow.toml`, then
|
|
33
|
+
record the app intent, user job, one-word
|
|
34
|
+
essence, personality, existing brand palette, clichés, signature-device
|
|
35
|
+
hypothesis, and exact output targets. A visual decision without a product
|
|
36
|
+
job is not a complete brief. For privacy-sensitive work, reduce the brief to
|
|
37
|
+
a neutral user-job verb rather than a sensitive category noun.
|
|
38
|
+
2. **Diverge for distinctiveness** (`docs/CONCEPTING.md`) — DO NOT skip; this is
|
|
39
|
+
why most AI icons look generic. Generate 4+ concepts via different lenses,
|
|
40
|
+
apply the cliché filter, add ONE signature device. Draft 2–3 finalist SVGs.
|
|
41
|
+
3. **Bake-off** the finalists:
|
|
42
|
+
`python -m iconflow compare a.svg b.svg c.svg --out bake.png` →
|
|
43
|
+
**Read `bake.png`**, run the silhouette + row tests, promote the most
|
|
44
|
+
distinctive-yet-legible winner to `master.svg`. Run the name-the-thing test
|
|
45
|
+
at both 128px and 16px; change the viewpoint if the noun changes. With color
|
|
46
|
+
removed, test vertical cuts above detached round accents as punctuation and
|
|
47
|
+
offset their centerlines by at least two output pixels (~128 viewBox units).
|
|
48
|
+
(Shortcut for simple jobs: inspect the current catalog with
|
|
49
|
+
`python -m iconflow styles`, start with
|
|
50
|
+
`python -m iconflow new <preset>`, and still apply a signature device.)
|
|
51
|
+
4. **Author the SVG** by editing `master.svg`, using `docs/SVG_TECHNIQUES.md`
|
|
52
|
+
(§10 = signature devices, §11 = semantic source/target variants). One bold
|
|
53
|
+
idea, on the 1024 grid, inside the safe area. If a full-card app icon also
|
|
54
|
+
needs a tray target, author a linked mark-only `tray.svg`; do not assume its
|
|
55
|
+
card alpha is a meaningful menu-bar silhouette.
|
|
56
|
+
5. **Check + review:**
|
|
57
|
+
`python -m iconflow check master.svg` → fix every warning. With a linked
|
|
58
|
+
tray source, add `--tray-svg tray.svg --tray-template-mode <mode>`: it audits
|
|
59
|
+
the macOS template the build will emit and reports one that kept none of the
|
|
60
|
+
colour mark's features.
|
|
61
|
+
`python -m iconflow review --config iconflow.toml --html review.html` →
|
|
62
|
+
**Read `review.png` and open the Review Lab**. Inspect actual-size pixels,
|
|
63
|
+
visual silhouette, alpha footprint, adaptive crops, and every selected
|
|
64
|
+
target transform. Score against `docs/REVIEW_CHECKLIST.md` and export the
|
|
65
|
+
JSON receipt. Distinctiveness is a gate—do not ship below 4/5 on it. If any
|
|
66
|
+
axis <4, make the one change that helps most and re-render. Usually 2–3 passes.
|
|
67
|
+
If managed browser policy blocks the Lab, inspect the static sheet and exact
|
|
68
|
+
target assets at real sizes, then use a complete source-hash-bound approved
|
|
69
|
+
fallback; record the blocked interactive check honestly and keep every gate.
|
|
70
|
+
6. **Ship** into the consuming project:
|
|
71
|
+
`python -m iconflow ship --config iconflow.toml --review master-review.json`.
|
|
72
|
+
`ship` re-runs automated QA, verifies the receipt belongs to the current SVG,
|
|
73
|
+
tray source, selected targets, colors, scheme, radius, and template mode, and
|
|
74
|
+
requires all six axes ≥4. The low-level `build`
|
|
75
|
+
command remains for callers that own an equivalent quality gate. See
|
|
76
|
+
`docs/OUTPUT_TARGETS.md` for the exact target file sets.
|
|
77
|
+
7. **Report** the brief essence, the cliché avoided, the signature device chosen,
|
|
78
|
+
final rubric scores, and the produced file list.
|
|
79
|
+
8. **Record the case** (mandatory — this closes the self-evolution loop):
|
|
80
|
+
`python -m iconflow case new --slug <slug> --essence <word> --device "..." --device-family <family> --device-detail "..." --concept-lens <lens> --cliche "..." --first "legibility=3 ..." --final "legibility=4 ..." --iterations N --lesson "..."`
|
|
81
|
+
then fill in the created file's *Summary* / *What failed first* sections.
|
|
82
|
+
Run `python -m iconflow case lint`, `case stats`, and (for a visual audit)
|
|
83
|
+
`case atlas`. If stats says **DISTILL NOW** or flags an evolution target,
|
|
84
|
+
edit the shared toolkit only when the current work supplies new,
|
|
85
|
+
generalizable evidence and shared-toolkit writes are in scope. Otherwise
|
|
86
|
+
report the signal to the owner. When authorized, follow `docs/EVOLUTION.md`
|
|
87
|
+
and fold the lessons into the docs before ending.
|
|
88
|
+
Public cases from privacy-sensitive work use neutral labels and omit sensitive
|
|
89
|
+
category nouns, private repository names, local paths, and identifying
|
|
90
|
+
operational details while preserving reusable visual evidence.
|
|
91
|
+
|
|
92
|
+
## Working files
|
|
93
|
+
Put draft SVGs, bake sheets, and review renders in `work/<slug>/` (gitignored),
|
|
94
|
+
not the repo root — e.g. `work/myapp/a.svg`, `work/myapp/bake.png`. The final
|
|
95
|
+
`master.svg` belongs in the consuming project; the case file in `casebook/`.
|
|
96
|
+
|
|
97
|
+
## Non-negotiables
|
|
98
|
+
- Always run **review** and actually inspect both the static sheet and selected
|
|
99
|
+
target contexts before shipping. An icon is judged at 16px and after platform
|
|
100
|
+
transforms, not at the size you draw it.
|
|
101
|
+
- Keep the editable `master.svg` in the project (it's the source of truth; rebuild
|
|
102
|
+
any time).
|
|
103
|
+
- Don't ship if `check` has warnings, the receipt does not match the current
|
|
104
|
+
source/targets, or any rubric axis <4/5.
|
|
105
|
+
- Don't end a session without recording the case (`iconflow case new`) — an
|
|
106
|
+
unrecorded icon teaches the system nothing.
|
|
107
|
+
|
|
108
|
+
## Environment
|
|
109
|
+
- Needs Python 3.10+ + Playwright Chromium + Pillow. Two ways to have the runner:
|
|
110
|
+
- **PATH install (primary, once `iconflow` is published on PyPI):**
|
|
111
|
+
`uv tool install iconflow`, `pipx install iconflow`, or
|
|
112
|
+
`pip install iconflow` in a venv. Then `iconflow` (≡ `python -m iconflow`)
|
|
113
|
+
is on PATH; run `iconflow setup` once (the only network step) and
|
|
114
|
+
`iconflow doctor` to prove the environment. Every document this file cites
|
|
115
|
+
is packaged with the wheel and served by the CLI: `iconflow docs` lists
|
|
116
|
+
them, `iconflow docs DESIGN_PLAYBOOK` prints one, and
|
|
117
|
+
`iconflow docs --out ./iconflow-docs` exports the set. No checkout needed.
|
|
118
|
+
- **Checkout / contributor (editable) mode — the only mode until PyPI is live:**
|
|
119
|
+
clone the repository and run `scripts/setup.ps1` (Windows) or
|
|
120
|
+
`scripts/setup.sh` (macOS/Linux). Each creates `.venv`, installs the checkout
|
|
121
|
+
editable into it, runs `iconflow setup`, and installs the open Agent Skill
|
|
122
|
+
into the common personal discovery locations. Use that venv interpreter
|
|
123
|
+
(`.venv\Scripts\python.exe` / `.venv/bin/python`) as the runner.
|
|
124
|
+
- One-time `python -m iconflow setup` installs the Chromium runtime in either mode.
|
|
125
|
+
- Pure stdlib + two pip deps. No API keys, no external services, fully offline.
|
|
126
|
+
- Rendering runs network-isolated with page JavaScript, external resources, and
|
|
127
|
+
animation disabled. Treat a safety warning as source content to remove, not a
|
|
128
|
+
renderer feature to re-enable.
|
|
129
|
+
- Machine consumers (CI, other agents) read `--json` envelopes and the 0/1/2 exit
|
|
130
|
+
codes from `docs/AGENT_CONTRACT.md`; the PR Proof action in
|
|
131
|
+
`docs/PROOF_ACTION.md` is the reference consumer.
|
|
132
|
+
|
|
133
|
+
## Invocation from another project
|
|
134
|
+
With a PATH install nothing else is needed: run `iconflow ...` from the
|
|
135
|
+
consuming repository; its `iconflow.toml`, `master.svg`, receipt, and casebook
|
|
136
|
+
stay there.
|
|
137
|
+
|
|
138
|
+
From a checkout, the smoothest cross-project use is still the toolkit venv,
|
|
139
|
+
which the setup scripts already install editable:
|
|
140
|
+
```
|
|
141
|
+
path\to\iconflow\.venv\Scripts\python.exe -m iconflow ...
|
|
142
|
+
```
|
|
143
|
+
(or `python -m pip install -e path\to\iconflow` into any other interpreter).
|
|
144
|
+
If it is not installed editable, run commands from the `iconflow` checkout and
|
|
145
|
+
pass absolute paths to candidate SVGs and output files.
|
|
146
|
+
|
|
147
|
+
For Windows desktop shortcuts, prefer the high-level helper when launching a
|
|
148
|
+
PowerShell script:
|
|
149
|
+
```
|
|
150
|
+
python -m iconflow shortcut --powershell-script D:\app\launch.ps1 \
|
|
151
|
+
--icon D:\app\icons\build\icon.ico --name "My App" --out desktop --verify
|
|
152
|
+
```
|
|
153
|
+
`--verify` reads the `.lnk` back after creation, which catches quoting and CJK
|
|
154
|
+
path issues immediately. Add `--content-address-icon` for delivery: it copies the
|
|
155
|
+
icon to `shortcut-icon-<sha12>.ico`, points the shortcut at the immutable alias,
|
|
156
|
+
and implies `--verify`, avoiding Explorer's stale path-keyed icon pixels.
|
|
157
|
+
|
|
158
|
+
## Getting this procedure into another agent
|
|
159
|
+
|
|
160
|
+
The procedure above ships as an open-format Agent Skill so a session in some
|
|
161
|
+
other repository follows the same gates without being handed this file.
|
|
162
|
+
|
|
163
|
+
- **Claude Code** — install the plugin, which carries the skill plus the
|
|
164
|
+
`/iconflow:icon` and `/iconflow:setup` commands:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
/plugin marketplace add snowyukitty/ai-iconflow
|
|
168
|
+
/plugin install iconflow@iconflow
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
- **Codex, Copilot, and other Agent Skills clients** — `iconflow skill install`
|
|
172
|
+
deploys `SKILL.md` into `~/.claude/skills/`, `~/.agents/skills/`, and
|
|
173
|
+
`~/.copilot/skills/` straight from the installed package; `--project` writes
|
|
174
|
+
into the current repository instead. Both the setup scripts and a wheel
|
|
175
|
+
install use this one code path, so a deployed copy never drifts from the
|
|
176
|
+
canonical `skills/iconflow/SKILL.md`. Edit the canonical source and rerun the
|
|
177
|
+
installer rather than editing a deployed copy.
|
|
178
|
+
- **Anything else** — `iconflow skill print` writes the whole procedure to
|
|
179
|
+
stdout, and every agent can follow this file and call the same CLI.
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to IconFlow are documented here. The project uses Semantic
|
|
4
|
+
Versioning for published releases; repository-only development before the
|
|
5
|
+
first published release remains under `Unreleased`.
|
|
6
|
+
|
|
7
|
+
## 0.5.0 - 2026-08-22
|
|
8
|
+
|
|
9
|
+
First public release. IconFlow had been developed in a private repository since
|
|
10
|
+
2026-06-23; this is the version that made it installable.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **The distribution is now `iconflow`, renamed from `ai-iconflow` before any
|
|
16
|
+
upload.** `pip install iconflow` gives you an `iconflow` command — the
|
|
17
|
+
property the entire adoption story rests on, since an agent told to use
|
|
18
|
+
IconFlow types the obvious thing first. The CLI, the product, the agent skill,
|
|
19
|
+
the Claude Code plugin, and the slash commands were all already called
|
|
20
|
+
`iconflow`; the distribution was the only piece out of step, and the `ai-`
|
|
21
|
+
prefix additionally misdescribed a toolkit that deliberately has no image
|
|
22
|
+
model and no API key. The README's claim that the package "remains named
|
|
23
|
+
`ai-iconflow` for compatibility" was compatibility with nothing: nothing had
|
|
24
|
+
ever been published.
|
|
25
|
+
|
|
26
|
+
123 references across 36 files, done before the name could become permanent —
|
|
27
|
+
PyPI has no rename. The domain `ai-iconflow.com`, the GitHub repository
|
|
28
|
+
`snowyukitty/ai-iconflow`, and the Cloudflare Pages project keep their names;
|
|
29
|
+
none of them has to match the distribution. The translation catalogs needed no
|
|
30
|
+
work, because the one user-visible occurrence sits inside a `<code>` element
|
|
31
|
+
that `build_i18n.py` carries as a placeholder — 708 strings still verify
|
|
32
|
+
across four languages.
|
|
33
|
+
|
|
34
|
+
- **Per-file attribution across the whole source tree, and a CLA.** The engine
|
|
35
|
+
stays `Apache-2.0` — a modified fork inside someone else's closed product is
|
|
36
|
+
permitted, and that permissiveness is what makes the tool safe to adopt. What
|
|
37
|
+
a redistributor still owes is attribution, so every one of the 41 Python files
|
|
38
|
+
now carries `SPDX-License-Identifier: Apache-2.0` and a copyright line.
|
|
39
|
+
`NOTICE` binds a distribution; a per-file header travels with an individual
|
|
40
|
+
file, which is what makes a stripped copy identifiable later. Apache-2.0 §4
|
|
41
|
+
obliges a redistributor to keep those notices, to say that files changed, and
|
|
42
|
+
to reproduce `NOTICE` — and a fork produced by pointing an agent at the
|
|
43
|
+
repository typically drops all of it. `docs/PROVENANCE.md` §3b writes down
|
|
44
|
+
exactly what is required, which distinctive gate codes survive modification,
|
|
45
|
+
and the asymmetry that matters: the engine is Apache, but the playbook is
|
|
46
|
+
CC BY-SA and the proof corpus is CC BY-NC-ND, so copying the code gets the
|
|
47
|
+
mechanism without the method.
|
|
48
|
+
- [`CLA.md`](CLA.md) — contributors keep their copyright (it is a license, not
|
|
49
|
+
an assignment) and grant the right to **relicense**, so one outside pull
|
|
50
|
+
request cannot freeze IconFlow's licensing permanently. §6 states the reason
|
|
51
|
+
openly rather than leaving it implied. Wired into `CONTRIBUTING.md`, both PR
|
|
52
|
+
templates, and `LICENSES.md` §8; `tests/test_licensing.py` fails if a source
|
|
53
|
+
file loses its header or a referrer loses the link.
|
|
54
|
+
|
|
55
|
+
- **A three-tier licence split, built so that the icons users make stay theirs.**
|
|
56
|
+
The repository is no longer under one licence, and
|
|
57
|
+
[`LICENSES.md`](LICENSES.md) is the map: the engine, scripts, and site code
|
|
58
|
+
stay `Apache-2.0`; the technique scaffolds in `templates/` become `CC0-1.0`;
|
|
59
|
+
the written methodology in `docs/`, `casebook/`, and `skills/` becomes
|
|
60
|
+
`CC-BY-SA-4.0`; IconFlow's product mark and the imagery that ships inside the
|
|
61
|
+
package — `brand/`, `demo/`, `docs/assets/` — becomes `CC-BY-4.0` on top of
|
|
62
|
+
the existing trademark policy; and the published corpus that does *not* ship —
|
|
63
|
+
`showcase/`, `gallery/`, `examples/`, and the 137 Living Archive studies —
|
|
64
|
+
becomes `CC-BY-NC-ND-4.0`. Each tier carries its own `LICENSE`, 241 files
|
|
65
|
+
carry an SPDX header, the full texts are vendored in `licenses/`, and the
|
|
66
|
+
wheel declares `Apache-2.0 AND CC0-1.0 AND CC-BY-SA-4.0 AND CC-BY-4.0` —
|
|
67
|
+
every one a free licence, so the distribution stays packageable. Nothing
|
|
68
|
+
noncommercial is shipped; the identity is protected by trademark, which is
|
|
69
|
+
the right instrument for it.
|
|
70
|
+
- **The scaffolds are CC0 for one specific reason, and it is load-bearing.**
|
|
71
|
+
Under `Apache-2.0` an icon evolved from `iconflow new flat-geometric` would
|
|
72
|
+
technically be a derivative work owing attribution and a licence copy when
|
|
73
|
+
shipped. `CC0-1.0` removes that chain: **no attribution, no share-alike, no
|
|
74
|
+
commercial restriction reaches through the tool into anything a user
|
|
75
|
+
designs**, and applying the published method creates no obligation either
|
|
76
|
+
because copyright covers the playbook's wording, not its design rules.
|
|
77
|
+
`LICENSES.md` §1, `NOTICE`, the README, the agent skill, `/llms.txt`, and the
|
|
78
|
+
new `iconflow license` (with `--json`) all say so, and
|
|
79
|
+
`tests/test_licensing.py` fails the build if a restrictive tier ever leaks
|
|
80
|
+
into a user-facing resource.
|
|
81
|
+
- `iconflow new` now **strips the licence header** from the scaffold it copies.
|
|
82
|
+
Left in, it rode `master.svg` all the way into the `favicon.svg` a user serves
|
|
83
|
+
in production — an IconFlow URL embedded in someone's shipped asset, which is
|
|
84
|
+
precisely the attribution §1 promises never to require. The CC0 grant is
|
|
85
|
+
printed to the terminal instead, where it is information for the person rather
|
|
86
|
+
than for their visitors' browsers.
|
|
87
|
+
- `iconflow demo` writes a `LICENSE-NOTICE.md` beside the family it
|
|
88
|
+
materializes, because that one command deliberately copies **IconFlow's own
|
|
89
|
+
product mark** into a directory the user chose. It says what the directory
|
|
90
|
+
holds, that it is not a starting point, and which commands are.
|
|
91
|
+
`iconflow docs --out` likewise reports that its export is CC BY-SA reference
|
|
92
|
+
material to keep out of version control.
|
|
93
|
+
- The Remix Lab bends IconFlow's actual product mark, so its output carries the
|
|
94
|
+
mark's own `CC-BY-4.0` — derivatives and commercial use allowed, attribution
|
|
95
|
+
required — stated on the site in all five languages, in `brand/LICENSE`, and
|
|
96
|
+
in `LICENSES.md` §5. A no-derivatives term on something a visitor was invited
|
|
97
|
+
to remix would be dishonest; an unconditional CC0 grant on output derived from
|
|
98
|
+
the official logo would be too broad, and the lab now points anyone who wants
|
|
99
|
+
a start with no conditions at all to the CC0 scaffolds behind `iconflow new`.
|
|
100
|
+
`examples/community-case/` *is* carved out to CC0, because that fixture exists
|
|
101
|
+
to be copied and a no-derivatives term on a template is a contradiction.
|
|
102
|
+
- **Two adversarial reviews (Codex `gpt-5.6-sol`, Grok `grok-4.6`) attacked the
|
|
103
|
+
split before publication and found real holes, all closed here.** The
|
|
104
|
+
scaffold's own licence header was riding `master.svg` into the `favicon.svg`
|
|
105
|
+
users serve; `LICENSES.md` §1 claimed *every* file the toolkit writes is CC0
|
|
106
|
+
when `docs --out` and `skill install` write CC BY-SA reference material;
|
|
107
|
+
`CONTRIBUTING.md` still declared all contributions Apache-2.0, which would
|
|
108
|
+
have re-created the very problem CC0 on the scaffolds exists to avoid; the
|
|
109
|
+
`demo` notice could be suppressed by a pre-planted symlink; and `robots.txt`
|
|
110
|
+
was blocking the on-demand fetchers that agents use on a person's behalf,
|
|
111
|
+
which costs discovery and does nothing about training. §1 now also carries an
|
|
112
|
+
explicit catch-all: any IconFlow boilerplate embodied in a generated artifact
|
|
113
|
+
is supplied under CC0, and the section states plainly what no licence can
|
|
114
|
+
promise — that an icon is copyrightable, registrable, or clear of other marks.
|
|
115
|
+
`tests/test_licensing.py` runs a real `build` and fails if any produced file
|
|
116
|
+
contains an IconFlow notice, URL, or SPDX tag.
|
|
117
|
+
|
|
118
|
+
- **Provenance that makes copying provable rather than preventable.** All 137
|
|
119
|
+
published archive studies carry an RDF `<metadata>` block naming the work,
|
|
120
|
+
its author, its licence, and its canonical URL; `scripts/build_archive.py`
|
|
121
|
+
writes it and `--verify-only` fails without it.
|
|
122
|
+
[`docs/PROVENANCE.md`](docs/PROVENANCE.md) records the evidence trail, a dated
|
|
123
|
+
registry of the coined terminology that fingerprints this corpus, how to check
|
|
124
|
+
a suspected copy — and, plainly, what none of this can do.
|
|
125
|
+
- `website/llms.txt` states terms for AI systems and doubles as an agent-facing
|
|
126
|
+
index; `robots.txt` asks named training crawlers to stay out of `/archive/`,
|
|
127
|
+
`/gallery/`, and `/how-icons-are-made/` in every language while leaving the
|
|
128
|
+
front door and `/getting-started/` open to everyone, because being found by
|
|
129
|
+
agents is the point. Both are voluntary, and both say so.
|
|
130
|
+
- `NOTICE` became substantive. Apache-2.0 §4(d) obliges every redistributor to
|
|
131
|
+
reproduce it, so it is the one attribution a fork cannot quietly drop: it now
|
|
132
|
+
carries the maintainer attribution, the per-directory licence map, the
|
|
133
|
+
trademark reservation, and the user-output carve-out.
|
|
134
|
+
- `CONTRIBUTING.md` gains the tier table, the rule that new files carry an SPDX
|
|
135
|
+
header, and a Developer Certificate of Origin sign-off requirement
|
|
136
|
+
(`git commit -s`) so the copyright chain stays clean enough to enforce.
|
|
137
|
+
|
|
138
|
+
- **A one-command front door for other people's agents.** IconFlow ships as a
|
|
139
|
+
Claude Code plugin: `/plugin marketplace add snowyukitty/ai-iconflow` then
|
|
140
|
+
`/plugin install iconflow@iconflow` installs the design procedure plus the
|
|
141
|
+
`/iconflow:icon` and `/iconflow:setup` slash commands. The catalog is
|
|
142
|
+
`.claude-plugin/marketplace.json` and the plugin itself is the `skills/`
|
|
143
|
+
directory (`skills/.claude-plugin/plugin.json`), so the published plugin is
|
|
144
|
+
five files rather than the whole repository, and its skill *is* the canonical
|
|
145
|
+
`skills/iconflow/SKILL.md` — there is no second copy to drift.
|
|
146
|
+
- `iconflow skill install|print|path`: deploys the Agent Skill into
|
|
147
|
+
`~/.claude/skills/`, `~/.agents/skills/`, and `~/.copilot/skills/` (and clears
|
|
148
|
+
the superseded `~/.codex/skills/iconflow/` duplicate) **straight from the
|
|
149
|
+
installed package**, so a Codex or Copilot session no longer needs a clone to
|
|
150
|
+
get the procedure. `--project` writes into the current repository and `--dir`
|
|
151
|
+
names a location. `scripts/setup.ps1` and `scripts/setup.sh` now call this one
|
|
152
|
+
command instead of each maintaining its own copy of the discovery-root list —
|
|
153
|
+
the place those two scripts were free to drift apart.
|
|
154
|
+
- `iconflow docs [NAME] [--out DIR] [--path] [--json]`: lists, prints, or
|
|
155
|
+
exports the packaged reference documents the procedure cites. An agent that
|
|
156
|
+
installed a wheel used to need
|
|
157
|
+
`python -c "from importlib.resources import files; ..."` and a walk through
|
|
158
|
+
`site-packages` to read `DESIGN_PLAYBOOK.md`; it now runs
|
|
159
|
+
`iconflow docs DESIGN_PLAYBOOK`. `doctor` verifies the packaged skill along
|
|
160
|
+
with the other resources, and the wheel carries `SKILL.md` and its Codex
|
|
161
|
+
metadata under `iconflow/resources/skill/`.
|
|
162
|
+
- Two independent reviews of the front door (Codex `gpt-5.6-sol` and Grok
|
|
163
|
+
`grok-4.6`, sealed read-only ATD delegations) found the same defects, all
|
|
164
|
+
fixed here: the source-checkout branch of resource resolution now demands
|
|
165
|
+
this project's own `pyproject.toml` beside the package before it is trusted,
|
|
166
|
+
so an unrelated distribution's top-level `site-packages/docs` can no longer
|
|
167
|
+
shadow the packaged playbook; `importlib.resources.files(None)` silently
|
|
168
|
+
resolving to IconFlow's own package turned an unknown resource set into a
|
|
169
|
+
wrong answer instead of an error; `skill install` reads every packaged file
|
|
170
|
+
before writing any destination, so a broken install fails closed rather than
|
|
171
|
+
leaving an empty skill directory that shadows a working one; the superseded
|
|
172
|
+
`~/.codex/skills/iconflow/` deployment is retired by deleting only the files
|
|
173
|
+
IconFlow wrote and then removing the directory only if nothing else is left,
|
|
174
|
+
instead of an unconditional `rmtree`; every deployed write refuses to follow
|
|
175
|
+
a symlink out of its target; and `--path` reports honestly when an install
|
|
176
|
+
keeps resources inside a zip rather than printing a path nothing can open.
|
|
177
|
+
- The skill was rewritten for an agent working in **someone else's**
|
|
178
|
+
repository. It no longer resolves a two-mode `<AI_PROJECTS>/iconflow`
|
|
179
|
+
placeholder against the maintainer's private workspace layout: the runner is
|
|
180
|
+
`iconflow` on PATH, reference documents come from `iconflow docs <NAME>`,
|
|
181
|
+
drafts go to the consuming project's `work/<slug>/`, and cases land in its own
|
|
182
|
+
`./casebook`. Both reviews caught the same two regressions in that rewrite
|
|
183
|
+
and both are repaired: the PyPI warning now leads with a hard stop *before*
|
|
184
|
+
any index install command, because an agent runs the first command it reads;
|
|
185
|
+
and the guardrails the old procedure carried — one bold idea on the 1024 grid
|
|
186
|
+
inside the safe area, reporting the brief's essence, and the rule that a
|
|
187
|
+
recolored preset is not a finished icon — are back. The managed-browser
|
|
188
|
+
fallback used to strand an agent by describing the approved-config route and
|
|
189
|
+
then telling it to `ship --review` anyway; it now names both routes exactly.
|
|
190
|
+
`tests/test_agentkit.py` fails the build if a workspace path, a `cd` into the
|
|
191
|
+
toolkit, a dropped quality gate, an index install command that precedes its
|
|
192
|
+
warning, or a broken exemplar image link comes back.
|
|
193
|
+
|
|
194
|
+
- **The site speaks five languages.** English under `website/` stays the source
|
|
195
|
+
of truth; `scripts/build_i18n.py` extracts every translatable string into
|
|
196
|
+
`website/i18n/en.json` (keyed by a slug plus a hash of the English text, so a
|
|
197
|
+
copy edit invalidates its translations instead of silently keeping a stale
|
|
198
|
+
one) and renders `/es/`, `/ja/`, `/zh-hant/`, and `/zh-hans/` copies of `/`,
|
|
199
|
+
`/getting-started/`, `/how-icons-are-made/`, `/archive/`, and the 404 page.
|
|
200
|
+
The build **fails closed**: one missing key drops that whole language rather
|
|
201
|
+
than mixing English into a translated page, and a translation that loses a
|
|
202
|
+
markup placeholder or a `{size}`/`{count}` token is rejected the same way.
|
|
203
|
+
Every page carries the complete `hreflang` set with `x-default`, a canonical
|
|
204
|
+
URL in its own language, a language switcher in the header and footer, and a
|
|
205
|
+
matching `sitemap.xml` entry with `xhtml:link` alternates; `_headers` gains a
|
|
206
|
+
revalidation stanza per language route. Inline markup inside a sentence
|
|
207
|
+
survives translation as numbered placeholders, so commands such as
|
|
208
|
+
`iconflow check` stay verbatim inside translated prose. Copy that used to be
|
|
209
|
+
hard-coded in `app.js`, `archive.js`, `playground.js`, and one CSS
|
|
210
|
+
`content:` rule now lives in `data-*` attributes on the markup, which is what
|
|
211
|
+
makes it translatable at all. CJK typography uses installed system faces only
|
|
212
|
+
(no webfont: `font-src 'self'`) and resets the Latin display tracking.
|
|
213
|
+
Evidence is never translated — the 137 archive readings, mark names, file
|
|
214
|
+
names, hashes, and score strings stay exactly as they ship, and the build
|
|
215
|
+
now **fails closed when a translation drops one**: if the English says
|
|
216
|
+
`Chromium`, `master.svg`, `PyPI` or `16px`, every language has to say it too.
|
|
217
|
+
Terminology, honesty rules, and per-language style are pinned in
|
|
218
|
+
`website/i18n/GLOSSARY.md`, whose terminology table is parsed by
|
|
219
|
+
`--status`, which reports per-language adherence so a term splitting into two
|
|
220
|
+
renderings surfaces as a number instead of waiting for a reader to notice.
|
|
221
|
+
A controlled four-model benchmark (111 curated zh-Hant strings, one prompt,
|
|
222
|
+
candidates shuffled per string, mapping withheld until the picks were
|
|
223
|
+
recorded) settled the drafting comparison and, more usefully, exposed
|
|
224
|
+
consistency defects in the shipped catalogs that string-by-string review had
|
|
225
|
+
missed; `docs/I18N_PLAN.md` records the method, the numbers and the caveats.
|
|
226
|
+
|
|
227
|
+
- **Agent Contract v1** (`docs/AGENT_CONTRACT.md`): `doctor`, `check`, `review`, `ship`, and `demo` accept `--json` and emit exactly one envelope on stdout (`schema`, `command`, `status`, `exit_code`, `warnings`, `advisories`, `outputs`, `errors`) with human lines on stderr. QA warnings now carry stable codes (`svg-safety`, `viewbox`, `stroke-floor`, `coverage-16`, `contrast`, `maskable-detail`, `distinctiveness-text`; advisory `tray-template-featureless`), `ship` blocks report `receipt-stale-source`, `receipt-stale-contract`, `receipt-not-ready`, `score-below-floor`, or `qa-warnings`, and every `doctor` FAIL carries a copy-paste `fix` (Chromium: the exact `<python> -m iconflow setup`). The exit-code matrix is pinned to `0` ok / `1` blocked by an IconFlow gate / `2` usage, configuration, or runtime failure: `review` now exits `1` when automated QA warnings exist, `check` with only advisories exits `0`, and an incomplete, unapproved, or stale approved-config fallback is a gate block (`1`) rather than a configuration error. Successful ships report Review Packet v1 provenance (`toolchain`, and `artifacts` / `reviewer` when a receipt carries them; unknown receipt keys are tolerated). `review --receipt-template receipt.json` writes an unscored, source-bound receipt an agent can score and pass to `ship --review`.
|
|
228
|
+
- `iconflow demo --out DIR [--setup] [--json] [--force]`: materializes the packaged, already-reviewed brand family (`iconflow.resources.demo`, copied from `brand/` into `demo/` and shipped on the wheel via `importlib.resources`) and runs `doctor` → `check` → `review` (sheet + Review Lab) → `ship` against the bundled receipt, reporting each step and the worst exit code. Editing the materialized `master.svg` and re-running `ship` fails closed with `receipt-stale-source`.
|
|
229
|
+
- The **PR Proof GitHub Action** (`.github/actions/proof`, wired by `.github/workflows/icon-proof.yml` on `pull_request` for `**/*.svg`, `**/iconflow.toml`, and receipts): installs the pinned package, caches Playwright Chromium, runs `check --json` and `review --json` for every touched `iconflow.toml`, validates the receipt read-only through `scripts/proof_receipt.py` (`receipt-stale-source` / `receipt-stale-contract`), uploads the review sheet, writes a job summary parsed only from the Agent Contract envelopes, and fails on a QA warning or stale receipt with `contents: read` and no secrets. Documented in `docs/PROOF_ACTION.md`.
|
|
230
|
+
- The contributor funnel: a checkbox-driven case PR template (`.github/PULL_REQUEST_TEMPLATE/case.md`), the minimal receipt-bound `examples/community-case/` fixture (Keepsake Knot), a CONTRIBUTING "First 30 minutes" section with the install table and case lane, `docs/ISSUE_SEEDS.md` with eight bounded good-first-issue drafts, and skill/AGENTS wording that resolves `iconflow` on PATH first with the checkout as contributor mode.
|
|
231
|
+
- A browser-side **Remix Lab** on the homepage: the Petal, Balloon, and Canopy Haypile sources from one brief, live palette, card-radius, scale, mirror, and card controls, exact native 16–128px canvases rasterized by the visitor's own browser, a 16× pixel zoom, a colour-removed silhouette, an alpha-template preview, and Download SVG / Copy SVG / Copy agent brief actions. Nothing is uploaded; the lab labels its output as unreviewed and points at `check`, `review`, and `ship`.
|
|
232
|
+
- The **Living Archive**: every identity direction IconFlow drew while searching for its own mark — 137 original SVG studies across 7 rounds (proof machines, living care, expanded living, hidden brand, orchard & garden, canopy cargo, organic neko), each with an exact 16px proof, its status (study, gated finalist, promoted, or the temporary product mark), and its one-line reading. `scripts/build_archive.py` promotes the gitignored exploration into tracked `website/assets/archive/` assets and a `catalog.json`, regenerates `/archive/` (filters, deep links, detail dialog) and the homepage blocks between marker comments, and has a clean-clone `--verify-only` gate that the website tests run. The homepage now opens with archive marks drifting around the current mark, a three-row marquee wall of the whole archive, and a strip of the nineteen directions that passed the gate.
|
|
233
|
+
- A first-class methodology page, `/how-icons-are-made/`: the nine-stage pipeline with its two human stages marked, the user-job brief, divergence and the signature-device test, editable 1024-grid SVG and deterministic generation, exact Chromium rendering, what `check` and the similarity audits really test, human review and source-bound receipts, vector-versus-raster, the clean-room boundary and trademark caveat, and a five-tier relative cost model with no invented prices. Every claim sits beside a real repository artifact; the route is in the sitemap, the cache headers, the primary navigation, and the website contract tests.
|
|
234
|
+
- Four distilled rules, `docs/LEARNINGS.md` L51–L54 (dense control families keep the noun and give state its own rail; a coloured band on a dark block is a folder tab until a wedge and a cut say otherwise; repeated teeth cannot say "torn" at 16px; scan the 128/256px strips for spikes before scoring craft), folded into `DESIGN_PLAYBOOK.md` §6 and `REVIEW_CHECKLIST.md`, with the two recorded cases that produced them.
|
|
235
|
+
- An advisory macOS tray-template audit, `iconflow check <master> --tray-svg <tray.svg> [--tray-template-mode auto|alpha|contrast]`, surfaced by `review` as well. It compares the interior detail of the colour tray asset against the enclosed holes of the derived template and reports a template that kept none of the mark's features — the failure that ships a featureless black lozenge to the menu bar. Advisory by design: it audits a linked variant, so it informs the designer without gating `ship`.
|
|
236
|
+
- Two worked `examples/` icon families built through the full gated loop from one brief, `iconflow-balloon` (Balloon Haypile) and `iconflow-parachute` (Canopy Haypile), each with its editable master and tray source, source-bound receipt, shipped web/Tauri/Electron/tray outputs, and casebook record.
|
|
237
|
+
- Five distilled rules, `docs/LEARNINGS.md` L46–L50, folded into `CONCEPTING.md` §3, `DESIGN_PLAYBOOK.md` §2/§5, `SVG_TECHNIQUES.md` §11, and `OUTPUT_TARGETS.md`.
|
|
238
|
+
- Twenty structurally distinct, small-size-first technique scaffolds, a
|
|
239
|
+
machine-readable `iconflow styles --json` catalog, and a Chromium-rendered
|
|
240
|
+
`styles --gallery` proof matrix with per-family tray guidance.
|
|
241
|
+
- A launch-site product narrative and a 24-brief, cross-theme showcase plan
|
|
242
|
+
designed to turn reviewed icon cases into website and video evidence.
|
|
243
|
+
- A responsive, dependency-free promotional site with an interactive native-pixel
|
|
244
|
+
Proof Lab, technique gallery, accessible controls, security headers, and a
|
|
245
|
+
canonical production deployment at `ai-iconflow.com`, with
|
|
246
|
+
`iconflow.pages.dev` retained as a permanent compatibility redirect.
|
|
247
|
+
- An agent-first `/getting-started/` guide with copyable cross-platform setup,
|
|
248
|
+
an honest agent/CLI responsibility split, the complete quality-gated loop,
|
|
249
|
+
exact output families, current limitations beside the workflow, and
|
|
250
|
+
crawlable `WebSite` / `SoftwareSourceCode` metadata without invented ratings.
|
|
251
|
+
- Cross-platform setup scripts that deploy the open-format IconFlow skill to
|
|
252
|
+
Codex, Claude Code, open Agent Skills, and GitHub Copilot discovery homes.
|
|
253
|
+
- Nine reviewed Theme Worlds now prove subject range beyond the fixed Flow Gate
|
|
254
|
+
specimen: relationship, cat, dog, fish, original character, and game. Each
|
|
255
|
+
includes an editable SVG, source-bound receipt, native 16px render, shipped
|
|
256
|
+
web assets, and a casebook record.
|
|
257
|
+
- A 100-case Gallery spanning specific product worlds and construction
|
|
258
|
+
grammars. Every case exposes an editable SVG, exact native 16px proof,
|
|
259
|
+
silhouette, contract-bound review receipt, and reusable case record; eleven
|
|
260
|
+
weaker or repetitive directions were removed from 111 generated candidates.
|
|
261
|
+
- Two separately labeled clean-room practice collections: Social Signals maps
|
|
262
|
+
20 user jobs across all 20 techniques, and Emoji Matrix provides a complete
|
|
263
|
+
20-by-20 field of 400 source-bound specimens.
|
|
264
|
+
- A clean-clone `build_gallery.py --verify-only` gate that rechecks all 100
|
|
265
|
+
tracked sources, receipts, renders, case records, and deploy copies without
|
|
266
|
+
the gitignored candidate-adjudication workspace.
|
|
267
|
+
- A clean-room style research record covering current upstream licenses,
|
|
268
|
+
small-size lessons, and explicit no-asset-copy provenance.
|
|
269
|
+
- Apache-2.0 project licensing, package license metadata, attribution notices,
|
|
270
|
+
and a separate trademark policy protecting the official IconFlow identity.
|
|
271
|
+
- Browser integration tests proving that external SVG resources do not reach
|
|
272
|
+
the network and that animated input renders repeatably.
|
|
273
|
+
- Distribution-content verification and a non-publishing release-candidate
|
|
274
|
+
workflow with checksums and wheel reproducibility checks.
|
|
275
|
+
- Security, provenance, contribution, issue, pull-request, and release guidance.
|
|
276
|
+
|
|
277
|
+
### Changed
|
|
278
|
+
|
|
279
|
+
- Pre-publish UI/UX pass on the site, synthesized from three independent audits (Codex, Grok, Gemini via ATD): the hero rail is a real native-size scrubber with a pixel loupe; the primary navigation is six real destinations with the menu collapsing at 1000px on every page; the works wall sits directly under the hero with a persistent Pause/Resume control while the archive's explanation and finalist strip moved below the case studies; visible `:focus-visible` rings on every control, 44px coarse-pointer targets, `scroll-padding-top` for the fixed header, honest reduced-motion (animations off, not 0.01ms), raised contrast on dimmed headings and captions, intrinsic dimensions on every image, `aria-labelledby` on the technique dialog, Escape/outside-click for the mobile menu, `role="button"` archive cards, "passed review" instead of "gated", a one-line definition of the receipt, US "color" everywhere, a product-describing `<title>`, `og:image` dimensions/alt, versioned CSS/JS URLs, and revalidation headers for every canonical route.
|
|
280
|
+
- Every remaining Flow Gate brand asset now shows the current Petal Haypile mark: the homepage proof PNGs (`/assets/proof/icon-16…256.png`), the Proof Lab receipt scores and hash, the bake-off and review-sheet evidence images, the README hero, and the social preview SVG/PNG. Flow Gate stays only where it is explicitly historical or the fixed technique specimen.
|
|
281
|
+
- The Emoji Matrix explorer and complete matrix raise every mono micro label to 13px on desktop and at least 12px on tablet, widen the axis columns to fit, and open on the `u2764-fe0f--mascot` cell instead of the first catalog cell (hash and query URLs still win).
|
|
282
|
+
- `brand/tray.svg` gained one broad transparent eye cut so the macOS alpha template keeps a face; the receipt and contract hashes were re-bound and the tray outputs re-shipped (web/Tauri/Electron outputs were byte-identical).
|
|
283
|
+
- Setup now installs the Codex/Open Agent Skills user copy only under
|
|
284
|
+
`~/.agents/skills/iconflow/` and removes the legacy
|
|
285
|
+
`~/.codex/skills/iconflow/` duplicate that current Codex also discovers.
|
|
286
|
+
- The promotional site's canonical host is now `ai-iconflow.com`. Canonical
|
|
287
|
+
links, Open Graph URLs, structured data, `robots.txt`, and the sitemap point
|
|
288
|
+
at the apex, and exactly one host serves content. `www.ai-iconflow.com` and
|
|
289
|
+
`iconflow.pages.dev` redirect through the shell project's `_redirects`;
|
|
290
|
+
`iconflow.pages.dev` redirects through a Pages Functions middleware, because
|
|
291
|
+
Pages supports no domain-level `_redirects` rule and a project cannot
|
|
292
|
+
host-match its own default host. Deployment previews still serve, so they
|
|
293
|
+
stay testable. `rel=canonical` was not sufficient on its own: it advises
|
|
294
|
+
crawlers, while root-relative internal links kept a visitor who landed on the
|
|
295
|
+
old host there for the whole session.
|
|
296
|
+
- The site's CSP drops its two pinned inline-script hashes for plain
|
|
297
|
+
`script-src 'self'`. A Chromium probe confirmed that `application/ld+json`
|
|
298
|
+
raises no `securitypolicyviolation` under `script-src 'self'` and stays
|
|
299
|
+
readable from the DOM, so the hashes protected nothing while invalidating the
|
|
300
|
+
CSP on every structured-data edit. Every executable script is an external
|
|
301
|
+
file, so the policy is now strictly tighter: no inline allowance at all, with
|
|
302
|
+
a test that fails if an executable inline script is ever added.
|
|
303
|
+
- Site deploys go through `scripts/deploy-site.ps1`, which pins each directory
|
|
304
|
+
to its Pages project and verifies the host contract afterwards. The mapping is
|
|
305
|
+
easy to get wrong in both directions: deploying the content tree from the
|
|
306
|
+
repository root silently ships no Functions bundle, and deploying the redirect
|
|
307
|
+
shell to the content project would make the apex redirect to itself.
|
|
308
|
+
- Manual review approvals are bound to the complete source, project, target,
|
|
309
|
+
color, Electron, and semantic tray-source transform contract.
|
|
310
|
+
- `iconflow new` refuses to overwrite an existing destination unless `--force`
|
|
311
|
+
is explicit.
|
|
312
|
+
- CI uses least-privilege permissions, immutable action revisions, timeouts,
|
|
313
|
+
Python 3.10 through 3.14 coverage, and installed-wheel browser tests.
|
|
314
|
+
- Automated QA can reuse one isolated Chromium rasterizer across a collection,
|
|
315
|
+
avoiding one browser startup per SVG without weakening any check.
|
|
316
|
+
- Source-bound SVG hashes normalize line endings, keeping review receipts valid
|
|
317
|
+
across LF and CRLF worktrees, and distribution verification runs without
|
|
318
|
+
importing the uninstalled source package.
|
|
319
|
+
- Casebook metadata is normalized across the full corpus, with strict lint and
|
|
320
|
+
the generated Atlas covering 181 reviewed or shipped cases.
|
|
321
|
+
- Windows package guidance now treats manifest-defined dimensions and filenames
|
|
322
|
+
as part of the reviewed asset contract instead of relying on implicit scaling.
|
|
323
|
+
- The release-candidate clean-wheel smoke now installs its Chromium runtime
|
|
324
|
+
before exercising render-backed checks.
|
|
325
|
+
|
|
326
|
+
### Fixed
|
|
327
|
+
|
|
328
|
+
- The unit-test matrix had failed on every push since 2026-08-20 because the
|
|
329
|
+
review CLI test let the tray-template audit launch Chromium inside a job that
|
|
330
|
+
has none; the audit is mocked like the other renderers, and the contract
|
|
331
|
+
tests compare paths canonically (macOS `/private` symlinks, Windows 8.3 temp
|
|
332
|
+
names) and patch `iconflow.build.build` through the module object.
|
|
333
|
+
- The homepage hero's decorative rail looked like a slider and did nothing; it
|
|
334
|
+
is now a labelled range input that previews the mark at native sizes. The
|
|
335
|
+
floating archive marks no longer occlude the stage labels.
|
|
336
|
+
|
|
337
|
+
### Security
|
|
338
|
+
|
|
339
|
+
- SVG input now rejects DTD/entity declarations, malformed or non-SVG XML,
|
|
340
|
+
documents over 4 MiB, more than 50,000 elements, or nesting over 128 levels.
|
|
341
|
+
- Build output rejects existing symlinks, junctions, and reparse points before
|
|
342
|
+
generated files are written.
|
|
343
|
+
- Windows shortcut scripts now use securely created unique temporary files.
|
|
344
|
+
|
|
345
|
+
## 0.4.0 - 2026-07-21
|
|
346
|
+
|
|
347
|
+
- Introduced the brief-to-concept-to-review workflow, multi-target icon engine,
|
|
348
|
+
six-axis quality gate, Review Lab receipts, and evolving casebook.
|
|
349
|
+
|
|
350
|
+
`0.4.0` was the package version while the work above accumulated; nothing was
|
|
351
|
+
tagged or published under it. The package now carries `0.5.0` as the first
|
|
352
|
+
public release candidate (see `docs/MILESTONE_v0.5.md`); the *Unreleased*
|
|
353
|
+
section folds into `0.5.0` when the owner tags it.
|