site-kit 1.0.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.
- site_kit-1.0.0/LICENSE +21 -0
- site_kit-1.0.0/PKG-INFO +437 -0
- site_kit-1.0.0/README.md +411 -0
- site_kit-1.0.0/pyproject.toml +57 -0
- site_kit-1.0.0/setup.cfg +4 -0
- site_kit-1.0.0/src/compliance_pages.py +1541 -0
- site_kit-1.0.0/src/link_page_kit.py +613 -0
- site_kit-1.0.0/src/site_audit.py +816 -0
- site_kit-1.0.0/src/site_kit.egg-info/PKG-INFO +437 -0
- site_kit-1.0.0/src/site_kit.egg-info/SOURCES.txt +20 -0
- site_kit-1.0.0/src/site_kit.egg-info/dependency_links.txt +1 -0
- site_kit-1.0.0/src/site_kit.egg-info/entry_points.txt +2 -0
- site_kit-1.0.0/src/site_kit.egg-info/top_level.txt +6 -0
- site_kit-1.0.0/src/site_kit.py +639 -0
- site_kit-1.0.0/src/wall_of_love.py +816 -0
- site_kit-1.0.0/src/widget_kit.py +973 -0
- site_kit-1.0.0/tests/test_compliance_pages.py +581 -0
- site_kit-1.0.0/tests/test_link_page_kit.py +551 -0
- site_kit-1.0.0/tests/test_site_audit.py +773 -0
- site_kit-1.0.0/tests/test_site_kit.py +501 -0
- site_kit-1.0.0/tests/test_wall_of_love.py +693 -0
- site_kit-1.0.0/tests/test_widget_kit.py +580 -0
site_kit-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jasveer Singh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
site_kit-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: site-kit
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Is this static site ready to launch? A pre-launch audit, legal-page generator, widget fragments, a link page and a testimonials wall as one local CLI with a single launch-check receipt.
|
|
5
|
+
Author: Jasveer Singh
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/jasveerai88/site-kit
|
|
8
|
+
Project-URL: Repository, https://github.com/jasveerai88/site-kit
|
|
9
|
+
Project-URL: Issues, https://github.com/jasveerai88/site-kit/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/jasveerai88/site-kit/blob/main/CHANGELOG.md
|
|
11
|
+
Keywords: static-site,site-audit,seo,privacy-policy-generator,widgets,link-in-bio,testimonials,cli
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
|
|
21
|
+
Classifier: Topic :: Utilities
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Dynamic: license-file
|
|
26
|
+
|
|
27
|
+
<h1 align="center">site-kit</h1>
|
|
28
|
+
|
|
29
|
+
<p align="center"><strong>Is this site ready to launch? The audit, the legal pages, the widgets, the link page and the testimonials wall — checked together, in one local run.</strong></p>
|
|
30
|
+
|
|
31
|
+
<p align="center">
|
|
32
|
+
<img alt="tests: 324 passing" src="https://img.shields.io/badge/tests-324%20passing-brightgreen">
|
|
33
|
+
<img alt="python 3.10 | 3.11 | 3.12" src="https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue">
|
|
34
|
+
<img alt="version 1.0.0" src="https://img.shields.io/badge/version-1.0.0-orange">
|
|
35
|
+
<img alt="dependencies: none" src="https://img.shields.io/badge/dependencies-0-brightgreen">
|
|
36
|
+
<img alt="license: MIT" src="https://img.shields.io/badge/license-MIT-blue">
|
|
37
|
+
</p>
|
|
38
|
+
|
|
39
|
+
<p align="center"><img alt="site-kit demo: one launch-check run over a site folder with one planted fault per module — a page with no title, a legal profile missing its retention fact, a countdown aimed at 2020, a duplicated link and a duplicated testimonial — ending in a NOT READY verdict" src="demo.gif" width="880"></p>
|
|
40
|
+
|
|
41
|
+
Launching a small static site is one job seen from
|
|
42
|
+
five sides. The pages need a pre-launch audit (titles,
|
|
43
|
+
meta, alt text, links that resolve). The legal pages
|
|
44
|
+
have to exist — privacy, terms, cookies, a consent
|
|
45
|
+
banner — and they have to say only what is actually
|
|
46
|
+
true of the business. Then the boring widgets every
|
|
47
|
+
site re-buys as subscriptions: an FAQ, pricing, a
|
|
48
|
+
countdown, social proof. A link-in-bio page. A
|
|
49
|
+
testimonials wall. Five tools used to do these five
|
|
50
|
+
jobs separately, and nobody installs five tools for
|
|
51
|
+
one launch.
|
|
52
|
+
|
|
53
|
+
site-kit is the five as one suite. Each module keeps
|
|
54
|
+
its source tool's checks, generators, verdict words
|
|
55
|
+
and honesty limits — the engines are ported
|
|
56
|
+
byte-identical, not rewritten — and a combined
|
|
57
|
+
`launch-check` runs every module over a single site
|
|
58
|
+
folder and prints one launch-readiness receipt:
|
|
59
|
+
per-module verdicts, the exact findings, and one
|
|
60
|
+
READY / NOT READY line. No LLM. No network. Nothing
|
|
61
|
+
uploaded; site data never leaves the machine.
|
|
62
|
+
|
|
63
|
+
**What a verdict means — read this first.** A PASS or
|
|
64
|
+
a READY means the folder satisfies the checks
|
|
65
|
+
*encoded in these modules* — never that the site is
|
|
66
|
+
legally compliant or that any platform will accept
|
|
67
|
+
it. The legal pages are templates generated from the
|
|
68
|
+
facts a profile states; they are **not legal advice**.
|
|
69
|
+
|
|
70
|
+
## The receipt family
|
|
71
|
+
|
|
72
|
+
One grammar — *claims on one side, evidence on the
|
|
73
|
+
other, every verdict cited* — across the fleet:
|
|
74
|
+
|
|
75
|
+
- **[skill-vet](https://github.com/jasveerai88/skill-vet)
|
|
76
|
+
— is it dangerous?** Vets agent skills for stealing,
|
|
77
|
+
spying and hidden sending before you install them.
|
|
78
|
+
- **[permission-audit](https://github.com/jasveerai88/permission-audit)
|
|
79
|
+
— what can the agent actually do?** Audits Claude
|
|
80
|
+
Code permission rules against the documented
|
|
81
|
+
deny → ask → allow semantics.
|
|
82
|
+
- **[done-claim-auditor](https://github.com/jasveerai88/done-claim-auditor)
|
|
83
|
+
— did the agent do what it claimed?** Audits session
|
|
84
|
+
transcripts for done-claims the evidence contradicts.
|
|
85
|
+
- **[skill-claims](https://github.com/jasveerai88/skill-claims)
|
|
86
|
+
— is the package honest?** Checks an agent skill's
|
|
87
|
+
prose promises against its static behaviour.
|
|
88
|
+
- **[spec-receipt](https://github.com/jasveerai88/spec-receipt)
|
|
89
|
+
— does the code still match the spec?** Per-item
|
|
90
|
+
drift verdicts between a Markdown spec and the code's
|
|
91
|
+
declared surfaces.
|
|
92
|
+
- **[preflight-agent](https://github.com/jasveerai88/preflight-agent)
|
|
93
|
+
— is the agent setup safe to run?** Five setup checks
|
|
94
|
+
(clone-guard, secret-guard, hook-doctor, fleet-audit,
|
|
95
|
+
skill-sprawl) as one scan.
|
|
96
|
+
- **[charity-compliance](https://github.com/jasveerai88/charity-compliance)
|
|
97
|
+
— is this charity ready to file?** Donation receipts
|
|
98
|
+
and the T3010 return as one filing-readiness check.
|
|
99
|
+
- **site-kit — is this site ready to launch?** The
|
|
100
|
+
family's static-site member: the same discipline
|
|
101
|
+
pointed at a deploy folder instead of a codebase, a
|
|
102
|
+
charity's books or an agent's setup.
|
|
103
|
+
|
|
104
|
+
Two more fleet members run the same play on their own
|
|
105
|
+
ground: **[faceless-qc-lite](https://github.com/jasveerai88/faceless-qc-lite)**
|
|
106
|
+
— is this video ready to upload? — the pre-upload QC
|
|
107
|
+
suite for faceless video channels, and
|
|
108
|
+
**[gst-hst-tracker](https://github.com/jasveerai88/gst-hst-tracker)**
|
|
109
|
+
— quarterly GST/HST set-aside and the $30,000
|
|
110
|
+
small-supplier threshold for Canadian sole proprietors.
|
|
111
|
+
|
|
112
|
+
## Quick start
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
pipx install site-kit # or: pip install site-kit
|
|
116
|
+
site-kit launch-check path/to/site-folder
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
*(The PyPI name goes live when v1.0.0 is published;
|
|
120
|
+
until then use a source checkout: `pip install .`, or
|
|
121
|
+
`pipx install git+https://github.com/jasveerai88/site-kit`.)*
|
|
122
|
+
|
|
123
|
+
Or each module on its own:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
site-kit site-audit audit SITE_DIR [--json]
|
|
127
|
+
site-kit compliance-pages check --profile PROFILE.json [--as-of YYYY-MM-DD] [--json]
|
|
128
|
+
site-kit compliance-pages make --profile PROFILE.json --out DIR [--json]
|
|
129
|
+
site-kit widget-kit make --config CONFIG.json --out DIR [--json]
|
|
130
|
+
site-kit link-page-kit preview CONFIG.json [--json]
|
|
131
|
+
site-kit link-page-kit build CONFIG.json [-o index.html] [--json]
|
|
132
|
+
site-kit wall-of-love preview TESTIMONIALS.json [--json]
|
|
133
|
+
site-kit wall-of-love build TESTIMONIALS.json [-o wall.html] [--json]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Pure Python 3.10+ standard library. Local only, no
|
|
137
|
+
network. Exit codes everywhere: **0** pass, **1**
|
|
138
|
+
findings, **2** usage or input error. Every command
|
|
139
|
+
accepts `--json` and prints exactly one JSON object.
|
|
140
|
+
|
|
141
|
+
From a source checkout, the fixture builder in
|
|
142
|
+
`examples/` builds one fictional small-business site
|
|
143
|
+
(Exampleton Trail Gear) two ways — a clean folder and
|
|
144
|
+
a faulty one with exactly one planted fault per
|
|
145
|
+
module:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
python3 examples/make_fixture.py faulty
|
|
149
|
+
site-kit launch-check faulty --as-of 2026-04-01 # exit 1 — NOT READY
|
|
150
|
+
python3 examples/make_fixture.py clean --clean
|
|
151
|
+
site-kit launch-check clean --as-of 2026-04-01 # exit 0 — READY
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
(`--as-of` pins the generation date compliance-pages
|
|
155
|
+
prints on its check, so the receipt is reproducible.)
|
|
156
|
+
|
|
157
|
+
## The modules
|
|
158
|
+
|
|
159
|
+
| Command | Question it answers | Verdict words |
|
|
160
|
+
|---|---|---|
|
|
161
|
+
| `site-audit` | Does the deploy folder pass the pre-launch audit? | PASS / FAIL — errors block; warnings and info are labelled judgement calls |
|
|
162
|
+
| `compliance-pages` | Does the profile state every fact the legal pages need? | COMPLETE / INCOMPLETE, with each gap named as the `[TO FILL: ...]` placeholder it would ship as |
|
|
163
|
+
| `widget-kit` | Does the widgets config render clean? | The fragments it wrote, plus a warning for every defect the render exposes |
|
|
164
|
+
| `link-page-kit` | Is the link-page config structurally sound? | Checks passed, listed one by one; warnings for duplicates and defects |
|
|
165
|
+
| `wall-of-love` | Is the testimonials file sound? | Checks passed, listed one by one; warnings for duplicates and defects |
|
|
166
|
+
| `launch-check` | Is this site — all five sides together — ready to launch? | READY / NOT READY, one receipt over every module; a module with no input is SKIPPED with the reason, never passed |
|
|
167
|
+
|
|
168
|
+
**site-audit** — titles, meta, headings, alt text,
|
|
169
|
+
internal-link resolution, JSON-LD validity, sitemap
|
|
170
|
+
and robots, as a prioritised plain-language fix list.
|
|
171
|
+
Internal references are checked against the folder on
|
|
172
|
+
disk; external links are never fetched.
|
|
173
|
+
|
|
174
|
+
**compliance-pages** — privacy, terms and cookie
|
|
175
|
+
pages plus a self-hosted consent banner, generated
|
|
176
|
+
from one site-profile JSON. Templates state only the
|
|
177
|
+
facts the profile gives them; anything unstated ships
|
|
178
|
+
as a loud `[TO FILL: ...]` placeholder, never as an
|
|
179
|
+
invented fact. `check` reports the gaps without
|
|
180
|
+
generating anything; `make` writes the pages.
|
|
181
|
+
|
|
182
|
+
**widget-kit** — the four boring widgets as static
|
|
183
|
+
fragments you own: FAQ (with JSON-LD generated from
|
|
184
|
+
the same items), pricing, countdown, social proof.
|
|
185
|
+
No view metering, no third-party script phoning home.
|
|
186
|
+
|
|
187
|
+
**link-page-kit** — one config file in, one
|
|
188
|
+
self-contained link page out: a Linktree replacement
|
|
189
|
+
with no trackers, no monthly fee and no lock-in.
|
|
190
|
+
Dangerous URLs are refused; the page references only
|
|
191
|
+
your own links.
|
|
192
|
+
|
|
193
|
+
**wall-of-love** — a testimonials file in, one
|
|
194
|
+
self-contained wall page out, with schema.org JSON-LD
|
|
195
|
+
generated from the same data as the wall — the
|
|
196
|
+
aggregate and the count cannot drift.
|
|
197
|
+
|
|
198
|
+
**launch-check** discovers each module's input in the
|
|
199
|
+
folder (deterministically, recursive in sorted order,
|
|
200
|
+
`.git` never entered, extension matching
|
|
201
|
+
case-insensitive) and runs the module's read-only
|
|
202
|
+
mode:
|
|
203
|
+
|
|
204
|
+
| Module | Input it discovers | Combined-run mode |
|
|
205
|
+
|---|---|---|
|
|
206
|
+
| site-audit | the folder itself, when it holds `.html`/`.htm` pages | `audit` |
|
|
207
|
+
| compliance-pages | a `.json` with a `business` object and a `pages` list naming privacy/terms/cookies | `check` (never `make`) |
|
|
208
|
+
| widget-kit | a `.json` with a `widgets` list | `make`, trial-rendered into a fixed-name temporary folder that is removed when the run ends |
|
|
209
|
+
| link-page-kit | a `.json` with a `name` and a `links` list | `preview` (never `build`) |
|
|
210
|
+
| wall-of-love | a `.json` with a `testimonials` list, else a `.csv` whose header names `name` and `quote` | `preview` |
|
|
211
|
+
|
|
212
|
+
One file serves at most one module. A module with no
|
|
213
|
+
discoverable input reports **SKIPPED** with the
|
|
214
|
+
reason — skipped is never counted as passed. READY
|
|
215
|
+
requires at least one module to have run and every
|
|
216
|
+
module that ran to be clean; an empty folder is NOT
|
|
217
|
+
READY. The run writes nothing into the folder it
|
|
218
|
+
checks.
|
|
219
|
+
|
|
220
|
+
## The receipt
|
|
221
|
+
|
|
222
|
+
The faulty fixture plants exactly one fault per
|
|
223
|
+
module: a page whose `<title>` was removed; a legal
|
|
224
|
+
profile with its `retention` fact deleted; a countdown
|
|
225
|
+
aimed at 2020-01-01; a link list with its first link
|
|
226
|
+
duplicated at the end; a testimonials file where two
|
|
227
|
+
people carry the same quote verbatim. This is the
|
|
228
|
+
complete, unedited output of
|
|
229
|
+
`site-kit launch-check faulty --as-of 2026-04-01`
|
|
230
|
+
(exit 1):
|
|
231
|
+
|
|
232
|
+
```text
|
|
233
|
+
site-kit v1.0.0 — launch-check · folder faulty
|
|
234
|
+
5 module(s) run · 0 clean · 5 with findings · 0 skipped
|
|
235
|
+
|
|
236
|
+
===== site-audit — the deploy folder vs the pre-launch audit checks =====
|
|
237
|
+
site-audit v0.1.0 — audit · folder faulty
|
|
238
|
+
1 page(s) · sitemap.xml present · robots.txt present
|
|
239
|
+
Local only: internal references are checked against the folder on disk; external links are never fetched.
|
|
240
|
+
|
|
241
|
+
ERRORS — fix before launch (1):
|
|
242
|
+
[title-missing] index.html — the page has no <title> (or it is empty) — browsers and search results will show the URL instead
|
|
243
|
+
fix: add a <title> in the <head> naming this page
|
|
244
|
+
|
|
245
|
+
Per-page summary (counts only):
|
|
246
|
+
index.html — 1 error(s) · 0 warning(s) · 0 info
|
|
247
|
+
|
|
248
|
+
Summary: 1 finding(s) · 1 error(s) · 0 warning(s) · 0 info across 1 page(s)
|
|
249
|
+
Verdict: FAIL — 1 error(s) to fix before launch.
|
|
250
|
+
|
|
251
|
+
===== compliance-pages — the site profile vs the facts the legal pages need =====
|
|
252
|
+
compliance-pages v0.1.0 — check · profile profile.json
|
|
253
|
+
Variant: canada · pages make would generate: privacy, terms, cookies (+ consent.js, banner.html, manifest.txt always)
|
|
254
|
+
Generation date: 2026-04-01
|
|
255
|
+
|
|
256
|
+
GAPS — facts the documents need that the profile does not state (1):
|
|
257
|
+
- retention → [TO FILL: how long collected information is kept]
|
|
258
|
+
|
|
259
|
+
Verdict: INCOMPLETE — fill the gaps above in the profile; anything left unstated ships as a loud [TO FILL: ...] placeholder, never as an invented fact.
|
|
260
|
+
|
|
261
|
+
===== widget-kit — the widgets config, validated by a trial render =====
|
|
262
|
+
widget-kit v0.1.0 — make · config widgets.json
|
|
263
|
+
Wrote 1 fragment(s) into /tmp/site-kit-launch-check/widgets:
|
|
264
|
+
sale.html — 772 bytes · countdown · target 1 Jan 2020, 00:00 (UTC-08:00)
|
|
265
|
+
Warnings:
|
|
266
|
+
! widgets[0] (countdown): countdown target '2020-01-01T00:00:00-08:00' is already in the past — the fragment will show its ended_text
|
|
267
|
+
(fragments above were trial-rendered into a temporary directory and discarded — nothing was written into this folder)
|
|
268
|
+
|
|
269
|
+
===== link-page-kit — the link-page config vs the structural checks =====
|
|
270
|
+
link-page-kit v0.1.0 — preview · config links.json
|
|
271
|
+
Maya Chen · 7 link(s), 2 social(s) · page weight 3,267 bytes
|
|
272
|
+
|
|
273
|
+
Links, in order:
|
|
274
|
+
1. Watch on YouTube — https://youtube.com/@KelownaTrailcast — New video every Friday
|
|
275
|
+
2. Follow on Instagram — https://instagram.com/kelownatrailcast
|
|
276
|
+
3. Trailcast stickers — my shop — https://example.org/shop/stickers — Ships within Canada
|
|
277
|
+
4. Listen to the podcast — https://example.org/trailcast
|
|
278
|
+
5. Trail conditions map — https://example.org/trail-conditions
|
|
279
|
+
6. Email me — mailto:maya@example.org — Sponsorships and ride invites
|
|
280
|
+
7. Watch on YouTube — https://youtube.com/@KelownaTrailcast — New video every Friday
|
|
281
|
+
|
|
282
|
+
Socials:
|
|
283
|
+
1. TikTok — https://tiktok.com/@kelownatrailcast
|
|
284
|
+
2. X — https://x.com/kelownatrailcast
|
|
285
|
+
|
|
286
|
+
Checks passed:
|
|
287
|
+
✓ name present
|
|
288
|
+
✓ 7 link(s), every label present
|
|
289
|
+
✓ every URL uses an allowed scheme (https, http, mailto, tel)
|
|
290
|
+
✓ single file, no external requests besides the configured links, socials and avatar
|
|
291
|
+
✓ avatar is referenced, not embedded
|
|
292
|
+
✓ accent colour is a valid hex value
|
|
293
|
+
Warnings:
|
|
294
|
+
! duplicate URL: 'https://youtube.com/@KelownaTrailcast' (links[6] 'Watch on YouTube') is the same target as links[0] 'Watch on YouTube'
|
|
295
|
+
|
|
296
|
+
===== wall-of-love — the testimonials file vs the wall checks =====
|
|
297
|
+
wall-of-love v0.1.0 — preview · file testimonials.json
|
|
298
|
+
Exampleton Trail Gear · 2 testimonial(s) · page weight 3,321 bytes
|
|
299
|
+
Aggregate: 4.5 out of 5 from 2 rated testimonial(s) · review count 2
|
|
300
|
+
|
|
301
|
+
Testimonials, in display order (rating, then newest):
|
|
302
|
+
1. Ana Ruiz — ★★★★★
|
|
303
|
+
2. Ben Osei — ★★★★☆
|
|
304
|
+
|
|
305
|
+
Checks passed:
|
|
306
|
+
✓ 2 testimonial(s), every name and quote present
|
|
307
|
+
✓ every rating present is an integer from 1 to 5
|
|
308
|
+
✓ single file, no external requests besides the configured logo, avatars and source links
|
|
309
|
+
✓ JSON-LD generated from the same data as the wall — aggregate and count cannot drift
|
|
310
|
+
✓ aggregate 4.5 from 2 rated testimonial(s)
|
|
311
|
+
Warnings:
|
|
312
|
+
! duplicate quote: testimonials[1] ('Ben Osei') repeats testimonials[0] verbatim — the wall shows what the file holds, but a repeated quote reads as padding
|
|
313
|
+
|
|
314
|
+
VERDICT: NOT READY — findings in site-audit, compliance-pages, widget-kit, link-page-kit, wall-of-love — fix each module's section above before launch.
|
|
315
|
+
|
|
316
|
+
site-kit is a local checking and generation aid. launch-check writes nothing into the folder it checks (widget fragments are trial-rendered into a temporary directory and discarded). A READY verdict means every module that ran reported clean under its own rules — never that the site is legally compliant or will pass any platform or app-store review. compliance-pages generates templates from the facts a profile states; they are not legal advice — have them reviewed before relying on them.
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
The clean folder, same command (exit 0):
|
|
320
|
+
|
|
321
|
+
```text
|
|
322
|
+
site-kit v1.0.0 — launch-check · folder clean
|
|
323
|
+
5 module(s) run · 5 clean · 0 with findings · 0 skipped
|
|
324
|
+
[...]
|
|
325
|
+
VERDICT: READY — every module that ran was clean (site-audit, compliance-pages, widget-kit, link-page-kit, wall-of-love). READY covers only the modules' own checks — it is never a statement of legal compliance or platform acceptance.
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Contracts
|
|
329
|
+
|
|
330
|
+
- Every command accepts `--json` and prints exactly one
|
|
331
|
+
JSON object. Module commands emit exactly the object
|
|
332
|
+
their standalone tool emits; `launch-check` emits one
|
|
333
|
+
combined object whose per-module sections are the
|
|
334
|
+
modules' own objects plus their `exit_code` (skipped
|
|
335
|
+
modules carry `status`, `reason`, `clean: null`).
|
|
336
|
+
- Exit codes everywhere: **0** pass, **1** findings,
|
|
337
|
+
**2** usage or input error. Errors — argparse
|
|
338
|
+
included — are `{"error": "..."}` in `--json` mode.
|
|
339
|
+
Never a traceback.
|
|
340
|
+
- Read-only where it matters: `launch-check` writes
|
|
341
|
+
nothing into the folder it checks, and site data
|
|
342
|
+
never leaves the machine. The generators write only
|
|
343
|
+
where their own `--out` / `-o` points, and only when
|
|
344
|
+
you run them directly.
|
|
345
|
+
|
|
346
|
+
## Why this suite exists — the merge
|
|
347
|
+
|
|
348
|
+
site-kit is flagship B4 of the fleet audit
|
|
349
|
+
(FLEET-AUDIT-2026-11-04), which ordered 18 quiet tools
|
|
350
|
+
merged into 4 flagships — and it is the last of the
|
|
351
|
+
four. site-audit, compliance-pages, widget-kit,
|
|
352
|
+
link-page-kit and wall-of-love were each shipped,
|
|
353
|
+
tested tools, but they are five sides of one job, and
|
|
354
|
+
nobody was installing all five to answer "are we ready
|
|
355
|
+
to launch?" The engines are ported **byte-identical**
|
|
356
|
+
to their sources — no check, generator, verdict word
|
|
357
|
+
or honesty limit changed; each module still reports
|
|
358
|
+
its own v0.1.0 inside its sections. What is new is
|
|
359
|
+
only the dispatcher and the combined run, plus two
|
|
360
|
+
dispatcher-side lessons from stage 1, both about
|
|
361
|
+
determinism: widget-kit's trial render first used a
|
|
362
|
+
random temporary path, which leaked into its own
|
|
363
|
+
reported output directory and made repeat receipts
|
|
364
|
+
differ — it now renders into a fixed-name temporary
|
|
365
|
+
folder, removed when the run ends — and claim-tracking
|
|
366
|
+
ensures one discovered file serves at most one module,
|
|
367
|
+
so a config can never be silently double-counted.
|
|
368
|
+
|
|
369
|
+
One behaviour was observed in stage 1 and deliberately
|
|
370
|
+
**not** changed: compliance-pages' `check` treats
|
|
371
|
+
`--as-of` as a reported value and never parses it (only
|
|
372
|
+
`make` validates the date). That is the engine's own
|
|
373
|
+
source behaviour; engines are ported, not improved.
|
|
374
|
+
|
|
375
|
+
## Tests
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
python3 -m unittest discover -s tests
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
324 tests: the five source suites ported (71 + 34 +
|
|
382
|
+
48 + 62 + 76 = 291; the only edit is each suite's
|
|
383
|
+
examples paths, since examples now live per-module
|
|
384
|
+
under `examples/<module>/`) plus 33 dispatcher /
|
|
385
|
+
launch-check tests covering routing, the JSON/error
|
|
386
|
+
contract, discovery, skip honesty, the planted-fault
|
|
387
|
+
fixture (one fault per module, each asserted exactly),
|
|
388
|
+
read-only behaviour and byte-identical repeat runs. All
|
|
389
|
+
pass on a clean checkout — including in a copy with
|
|
390
|
+
every executable bit stripped (the suites drive the
|
|
391
|
+
engines through the Python interpreter).
|
|
392
|
+
|
|
393
|
+
## Honest limits
|
|
394
|
+
|
|
395
|
+
- **A checking and generation aid, not legal advice.**
|
|
396
|
+
READY is a statement about the modules' own checks
|
|
397
|
+
only — not legal compliance, not platform or
|
|
398
|
+
app-store acceptance. Have generated legal pages
|
|
399
|
+
reviewed before relying on them.
|
|
400
|
+
- The audit reads static `.html`/`.htm` files on disk;
|
|
401
|
+
it says nothing about server behaviour, and external
|
|
402
|
+
links are never fetched — link checks are structural,
|
|
403
|
+
never liveness.
|
|
404
|
+
- The legal templates state only the facts a profile
|
|
405
|
+
gives them. A profile that omits a fact produces a
|
|
406
|
+
loud `[TO FILL: ...]` placeholder, not an invention —
|
|
407
|
+
but filling placeholders in is a human's job, and a
|
|
408
|
+
COMPLETE verdict means the profile was complete, not
|
|
409
|
+
that its facts are true.
|
|
410
|
+
- The wall shows what the testimonials file holds.
|
|
411
|
+
Nothing here verifies that a testimonial is genuine;
|
|
412
|
+
a fabricated review in the input becomes a fabricated
|
|
413
|
+
review on the wall. The JSON-LD aggregate is computed
|
|
414
|
+
from the same data, so it cannot drift from the wall —
|
|
415
|
+
it also cannot make the data honest.
|
|
416
|
+
- Generators write only where their own `--out` / `-o`
|
|
417
|
+
points. `launch-check` never writes into the folder
|
|
418
|
+
it checks; widget fragments inside it are
|
|
419
|
+
trial-rendered into a temporary folder and discarded.
|
|
420
|
+
|
|
421
|
+
## Contributing & security
|
|
422
|
+
|
|
423
|
+
See CONTRIBUTING.md (stdlib only, engines ported not
|
|
424
|
+
rewritten, skipped is not clean) and SECURITY.md
|
|
425
|
+
(private vulnerability reporting; the suite is
|
|
426
|
+
local-only, and its combined run is read-only by
|
|
427
|
+
design).
|
|
428
|
+
|
|
429
|
+
## Support
|
|
430
|
+
|
|
431
|
+
If this suite saved you a launch-day surprise,
|
|
432
|
+
sponsoring keeps the receipt family maintained:
|
|
433
|
+
https://github.com/sponsors/jasveerai88
|
|
434
|
+
|
|
435
|
+
## License
|
|
436
|
+
|
|
437
|
+
MIT — see LICENSE.
|