astro-archify 0.3.4

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.
Files changed (30) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +169 -0
  3. package/astro-archify-integration.d.ts +100 -0
  4. package/astro-archify-integration.js +0 -0
  5. package/package.json +64 -0
  6. package/vendor/archify/LICENSE +22 -0
  7. package/vendor/archify/NOTICE.md +48 -0
  8. package/vendor/archify/assets/template.html +14787 -0
  9. package/vendor/archify/renderers/architecture/grid.mjs +62 -0
  10. package/vendor/archify/renderers/architecture/render-architecture.mjs +1089 -0
  11. package/vendor/archify/renderers/dataflow/render-dataflow.mjs +482 -0
  12. package/vendor/archify/renderers/lifecycle/render-lifecycle.mjs +570 -0
  13. package/vendor/archify/renderers/sequence/render-sequence.mjs +468 -0
  14. package/vendor/archify/renderers/shared/brand-marks.mjs +563 -0
  15. package/vendor/archify/renderers/shared/cli.mjs +220 -0
  16. package/vendor/archify/renderers/shared/desktop-readability.mjs +26 -0
  17. package/vendor/archify/renderers/shared/diagnostics.mjs +116 -0
  18. package/vendor/archify/renderers/shared/engineering-profiles.mjs +157 -0
  19. package/vendor/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  20. package/vendor/archify/renderers/shared/generated-validators.mjs +13 -0
  21. package/vendor/archify/renderers/shared/geometry.mjs +1334 -0
  22. package/vendor/archify/renderers/shared/i18n.mjs +594 -0
  23. package/vendor/archify/renderers/shared/layout-report.mjs +40 -0
  24. package/vendor/archify/renderers/shared/legend.mjs +217 -0
  25. package/vendor/archify/renderers/shared/output-path.mjs +321 -0
  26. package/vendor/archify/renderers/shared/repository-evidence.mjs +235 -0
  27. package/vendor/archify/renderers/shared/text-fit.mjs +49 -0
  28. package/vendor/archify/renderers/shared/utils.mjs +232 -0
  29. package/vendor/archify/renderers/shared/validator.mjs +86 -0
  30. package/vendor/archify/renderers/workflow/render-workflow.mjs +749 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jose Sebastian
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.
package/README.md ADDED
@@ -0,0 +1,169 @@
1
+ # astro-archify
2
+
3
+ An Astro integration for rendering [Archify](https://github.com/tt-a1i/archify) system diagrams — architecture, workflow, sequence, data flow, and lifecycle — from JSON IR code blocks in your markdown/MDX content.
4
+
5
+ Archify turns a typed JSON intermediate representation (IR) into a fully self-contained, already-interactive HTML artifact — inline SVG plus a small pan/zoom/focus viewer, with every script and its ~4800 lines of CSS inlined (the one exception is a Google Fonts `<link>`, which degrades gracefully if it can't load). This integration renders that artifact **at build time** using Archify's own renderer — bundled into this package, see [Attribution](#attribution) — and embeds it as a sandboxed `<iframe>`, so you get Archify's real viewer, not a re-implementation of it.
6
+
7
+ This is a different rendering model than diagram libraries like Mermaid: there is no client-side JS bundle to ship, because Archify does its layout work in Node during your Astro build, not in the browser.
8
+
9
+ There's no separate CLI to install — `npm install astro-archify` is everything you need.
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ npm install astro-archify
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ ```js
20
+ // astro.config.mjs
21
+ import { defineConfig } from 'astro/config';
22
+ import archify from 'astro-archify';
23
+
24
+ export default defineConfig({
25
+ integrations: [archify()]
26
+ });
27
+ ```
28
+
29
+ Then, in markdown or MDX:
30
+
31
+ ````markdown
32
+ ```archify
33
+ {
34
+ "schema_version": 1,
35
+ "diagram_type": "architecture",
36
+ "meta": { "title": "Sample Web App" },
37
+ "components": [
38
+ { "id": "api", "type": "backend", "label": "API", "pos": [40, 40], "size": [120, 60] },
39
+ { "id": "db", "type": "database", "label": "Database", "pos": [260, 40], "size": [120, 60] }
40
+ ],
41
+ "connections": [
42
+ { "from": "api", "to": "db", "label": "SQL" }
43
+ ]
44
+ }
45
+ ```
46
+ ````
47
+
48
+ The `diagram_type` field in the IR (`architecture`, `workflow`, `sequence`, `dataflow`, or `lifecycle`) selects the renderer. You can also make the type explicit in the fence's language string instead of relying on the JSON body:
49
+
50
+ ````markdown
51
+ ```archify:sequence
52
+ { ... }
53
+ ```
54
+ ````
55
+
56
+ ## Integration Order (Important!)
57
+
58
+ When using with Starlight or other markdown-processing integrations, place archify **first**:
59
+
60
+ ```js
61
+ import { defineConfig } from 'astro/config';
62
+ import starlight from '@astrojs/starlight';
63
+ import archify from 'astro-archify';
64
+
65
+ export default defineConfig({
66
+ integrations: [
67
+ archify(), // ⚠️ Must come BEFORE starlight
68
+ starlight({ title: 'My Docs' })
69
+ ]
70
+ });
71
+ ```
72
+
73
+ ## Configuration
74
+
75
+ ```js
76
+ archify({
77
+ // Advanced: use a different Archify checkout instead of the copy bundled
78
+ // with this package. Must be a directory laid out like Archify's own
79
+ // package root (containing renderers/<type>/render-<type>.mjs and
80
+ // assets/template.html). Most projects never need this.
81
+ rendererRoot: '/path/to/a/newer/archify/checkout',
82
+
83
+ // Archify quality profile: 'standard' | 'showcase'
84
+ quality: 'showcase',
85
+
86
+ // Fail the build instead of rendering a visible inline error block
87
+ strict: false,
88
+
89
+ // Initial iframe height in px, shown before the artifact reports its
90
+ // real content height
91
+ height: 480,
92
+
93
+ // The iframe never shrinks below this height (defaults to `height`)
94
+ minHeight: 480,
95
+
96
+ // The iframe never grows past this height, even for a very tall diagram
97
+ maxHeight: 4000,
98
+
99
+ // Wrapper class name
100
+ className: 'archify-diagram',
101
+
102
+ // iframe sandbox attribute
103
+ sandbox: 'allow-scripts allow-popups allow-downloads',
104
+
105
+ // iframe `allow` (Permissions Policy) attribute — needed for the
106
+ // viewer's clipboard-copy export and fullscreen presentation stage
107
+ allow: 'clipboard-write; fullscreen',
108
+
109
+ // Subdirectory diagram artifacts are served from, e.g. /_archify/<id>.html.
110
+ // Change only if it collides with existing content.
111
+ outDir: '_archify',
112
+
113
+ // Render timeout, in milliseconds
114
+ timeout: 30000
115
+ })
116
+ ```
117
+
118
+ ## Astro Compatibility
119
+
120
+ `astro-archify` follows the same markdown-engine detection as [astro-mermaid](https://github.com/joesaby/astro-mermaid) to work across Astro 4 through 7:
121
+
122
+ | Astro version | Markdown engine | How Archify hooks in |
123
+ |---------------|-----------------|-----------------------|
124
+ | 7+ | Sätteri (`@astrojs/markdown-satteri`, the new default) | a Sätteri **mdast plugin** |
125
+ | 6.4 – 6.x | `unified()` processor | a remark plugin via `markdown.processor` |
126
+ | < 6.4 | legacy pipeline | `markdown.remarkPlugins` |
127
+
128
+ ## How It Works
129
+
130
+ 1. **Build time**: for each `archify` code fence, the JSON IR is written to a temp file and rendered by running Archify's own renderer script for that diagram type — `node vendor/archify/renderers/<type>/render-<type>.mjs <input.json> <output.html>` — as a subprocess. That's a real requirement, not just caution: Archify's renderer scripts call `process.exit()` directly on both success and failure, so they have to run out-of-process — importing them directly into the Astro build would let one bad diagram take down the whole build.
131
+ 2. The resulting self-contained HTML artifact is content-addressed (hashed from its diagram type, quality profile, and JSON source) and cached in memory under that id — so the same diagram appearing on multiple pages, or an unchanged diagram across incremental rebuilds, only renders once.
132
+ 3. Each artifact is served from its own real URL, `/_archify/<id>.html` by default — written to the final output directory on `astro:build:done` (which runs after Astro's own build, including copying `publicDir`, so this can't race or be clobbered), and served straight from memory by dev middleware in `astro dev`. The code fence is replaced with a sandboxed `<iframe src="/_archify/<id>.html">` plus a plain "Open full view ↗" link to that same URL.
133
+ 4. **Runtime**: the browser loads Archify's own artifact directly from that URL, inside the iframe — including its full viewer: guide overlay, node finder, guided story/chapter navigation, semantic passport panel, presentation stage, and PNG/JPEG/SVG/WebM exports. This integration doesn't reimplement any of that, and doesn't inline or re-encode it into the page either — it's a normal, separately-cacheable HTTP response.
134
+
135
+ Archify's viewer assumes it owns the full browser viewport, so a fixed-size box would clip it badly. To avoid that, a small bridge script is appended to each artifact (the only modification this package makes to Archify's output) that reports its real content height to the parent page — on load and via `ResizeObserver` as the reader interacts with the viewer (opening a panel, entering presentation mode, etc.) — and the iframe grows or shrinks to match, bounded by `minHeight`/`maxHeight`.
136
+
137
+ If a diagram fails to render (invalid JSON, an unknown `diagram_type`, or a schema/composition error from Archify itself), a visible inline error block is rendered in its place — using Archify's own structured diagnostic message and suggested fix when it provides one — and a build warning is logged. Set `strict: true` to fail the build instead.
138
+
139
+ ### A note on SSR
140
+
141
+ Static builds (`output: 'static'`, the default) are fully supported. Under SSR (`output: 'server'`/`'hybrid'`), `astro:build:done`'s output directory is the client asset directory, which most adapters already serve as static files — so this should generally still work, but it's adapter-dependent and less thoroughly tested than the static case.
142
+
143
+ ## Attribution
144
+
145
+ Archify's own renderer and viewer are vendored into this package at [`vendor/archify/`](./vendor/archify) — copied from [tt-a1i/archify](https://github.com/tt-a1i/archify) (MIT licensed) at commit `12106be`, and used unmodified. See [`vendor/archify/NOTICE.md`](./vendor/archify/NOTICE.md) for exactly what was copied, why, and how to update it.
146
+
147
+ To be clear about the boundary: **everything under `vendor/archify/` is Archify's own code**, doing Archify's own layout, rendering, and the entire interactive viewer. Everything else in this repository — the remark/Sätteri plugin glue that finds `archify` code fences, spawning the renderer as a subprocess, content-addressed caching, serving artifacts from their own URLs, the iframe embedding and its auto-resize bridge, the Astro markdown-engine compatibility shim, the tests, and the demo — is original to `astro-archify` (the markdown-engine detection follows the same pattern used in [astro-mermaid](https://github.com/joesaby/astro-mermaid), also by this author).
148
+
149
+ ## Styling
150
+
151
+ Archify inlines its entire viewer stylesheet (~4800 lines) into every artifact — the only external stylesheet is a Google Fonts `<link>`, which degrades gracefully if it can't load. Combined with the iframe embedding, this means a diagram always renders pixel-identical to opening the artifact standalone: your site's CSS can never leak into it, and its CSS can never leak into your site.
152
+
153
+ ## Demo
154
+
155
+ See [`demo/`](./demo) for a minimal Astro project rendering Archify's own architecture, sequence, and workflow examples.
156
+
157
+ ## Supported Diagram Types
158
+
159
+ - Architecture
160
+ - Workflow
161
+ - Sequence
162
+ - Data flow
163
+ - Lifecycle
164
+
165
+ See the [Archify repository](https://github.com/tt-a1i/archify) for the full JSON IR schemas and authoring guide.
166
+
167
+ ## License
168
+
169
+ MIT © [Jose Sebastian](https://github.com/joesaby)
@@ -0,0 +1,100 @@
1
+ import type { AstroIntegration } from 'astro';
2
+
3
+ export interface AstroArchifyOptions {
4
+ /**
5
+ * Advanced: path to an Archify package root to use instead of the copy
6
+ * vendored into this package (see vendor/archify/NOTICE.md). Must be a
7
+ * directory laid out like Archify's own package root — containing
8
+ * `renderers/<type>/render-<type>.mjs` and `assets/template.html` for
9
+ * each diagram type.
10
+ */
11
+ rendererRoot?: string;
12
+
13
+ /**
14
+ * Archify rendering quality profile, forwarded as `ARCHIFY_QUALITY_PROFILE`.
15
+ */
16
+ quality?: 'standard' | 'showcase';
17
+
18
+ /**
19
+ * Fail the Astro build when a diagram fails to render, instead of
20
+ * embedding a visible inline error block.
21
+ * @default false
22
+ */
23
+ strict?: boolean;
24
+
25
+ /**
26
+ * Initial height of the diagram's iframe, shown before the artifact
27
+ * reports its real content height (see `minHeight`/`maxHeight`). A
28
+ * number is treated as pixels.
29
+ * @default 480
30
+ */
31
+ height?: number;
32
+
33
+ /**
34
+ * The iframe never shrinks below this height once auto-resized.
35
+ * @default the value of `height`
36
+ */
37
+ minHeight?: number;
38
+
39
+ /**
40
+ * The iframe never grows past this height even if Archify's viewer
41
+ * (guide overlay, story mode, semantic passport panel, etc.) reports a
42
+ * taller content size.
43
+ * @default 4000
44
+ */
45
+ maxHeight?: number;
46
+
47
+ /**
48
+ * CSS class name applied to the diagram wrapper element.
49
+ * @default 'archify-diagram'
50
+ */
51
+ className?: string;
52
+
53
+ /**
54
+ * `sandbox` attribute applied to the diagram's iframe.
55
+ * @default 'allow-scripts allow-popups allow-downloads'
56
+ */
57
+ sandbox?: string;
58
+
59
+ /**
60
+ * `allow` (Permissions Policy) attribute applied to the diagram's
61
+ * iframe, needed for the viewer's clipboard-copy export and fullscreen
62
+ * presentation stage to work inside the embed.
63
+ * @default 'clipboard-write; fullscreen'
64
+ */
65
+ allow?: string;
66
+
67
+ /**
68
+ * Subdirectory (under the site root, respecting a configured `base`)
69
+ * that rendered diagram artifacts are served from — e.g. `/_archify/<id>.html`.
70
+ * Change this only if it collides with existing content.
71
+ * @default '_archify'
72
+ */
73
+ outDir?: string;
74
+
75
+ /**
76
+ * Render timeout in milliseconds.
77
+ * @default 30000
78
+ */
79
+ timeout?: number;
80
+ }
81
+
82
+ /**
83
+ * Astro integration for rendering Archify system diagrams (architecture,
84
+ * workflow, sequence, dataflow, lifecycle) from JSON IR code fences.
85
+ *
86
+ * @example
87
+ * ```js
88
+ * import { defineConfig } from 'astro/config';
89
+ * import archify from 'astro-archify';
90
+ *
91
+ * export default defineConfig({
92
+ * integrations: [
93
+ * archify({
94
+ * quality: 'showcase'
95
+ * })
96
+ * ]
97
+ * });
98
+ * ```
99
+ */
100
+ export default function astroArchify(options?: AstroArchifyOptions): AstroIntegration;
Binary file
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "astro-archify",
3
+ "version": "0.3.4",
4
+ "description": "An Astro integration that renders Archify system diagrams (architecture, workflow, sequence, dataflow, lifecycle) from JSON IR code blocks at build time, with Archify's renderer bundled in",
5
+ "type": "module",
6
+ "main": "./astro-archify-integration.js",
7
+ "types": "./astro-archify-integration.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./astro-archify-integration.js",
11
+ "types": "./astro-archify-integration.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "astro-archify-integration.js",
16
+ "astro-archify-integration.d.ts",
17
+ "vendor/archify",
18
+ "README.md"
19
+ ],
20
+ "keywords": [
21
+ "astro",
22
+ "astro-integration",
23
+ "archify",
24
+ "diagrams",
25
+ "markdown",
26
+ "architecture",
27
+ "system-design",
28
+ "sequence-diagram"
29
+ ],
30
+ "author": "Jose Sebastian",
31
+ "license": "MIT",
32
+ "peerDependencies": {
33
+ "astro": ">=4"
34
+ },
35
+ "dependencies": {
36
+ "unist-util-visit": "^5.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "@astrojs/markdown-satteri": "^0.3.2",
40
+ "@semantic-release/changelog": "^6.0.3",
41
+ "@semantic-release/git": "^10.0.1",
42
+ "@semantic-release/github": "^11.0.6",
43
+ "@semantic-release/npm": "^12.0.2",
44
+ "astro": "^6.4.6",
45
+ "remark-parse": "^11.0.0",
46
+ "semantic-release": "^24.2.9",
47
+ "unified": "^11.0.5",
48
+ "vitest": "^4.1.8"
49
+ },
50
+ "scripts": {
51
+ "test": "vitest",
52
+ "test:ui": "vitest --ui",
53
+ "test:coverage": "vitest --coverage",
54
+ "update:vendor": "node scripts/update-vendor.mjs"
55
+ },
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "git+https://github.com/joesaby/astro-archify.git"
59
+ },
60
+ "homepage": "https://github.com/joesaby/astro-archify#readme",
61
+ "bugs": {
62
+ "url": "https://github.com/joesaby/astro-archify/issues"
63
+ }
64
+ }
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 tt-a1i (Archify)
4
+ Copyright (c) 2025 Cocoon AI (original "architecture-diagram-generator")
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
@@ -0,0 +1,48 @@
1
+ # Vendored from Archify
2
+
3
+ This directory contains source code copied verbatim from [tt-a1i/archify](https://github.com/tt-a1i/archify), used under its MIT license (see `LICENSE` in this directory).
4
+
5
+ - **Source**: https://github.com/tt-a1i/archify
6
+ - **Pinned commit**: `12106be58b34f94b108ab30f6ac0eb37c16a8f71`
7
+ - **Upstream version**: `2.16.0-dev.0` (per `archify/package.json` at that commit)
8
+ - **Vendored on**: 2026-08-28
9
+
10
+ ## What was copied, and why
11
+
12
+ `astro-archify` needs Archify's diagram renderers (JSON IR → self-contained HTML with inline SVG and its interactive viewer) to work without requiring a separately-installed `archify` CLI on `PATH`. The files below are the exact, minimal set those five renderers depend on, found by statically tracing their import graph — nothing else from the upstream repository (its CLI commands other than `render`, its architecture-compare/preview/visual-check tooling, its schema files, its scripts, its examples, its agent-skill prompt) is included or needed.
13
+
14
+ ```
15
+ renderers/architecture/render-architecture.mjs
16
+ renderers/architecture/grid.mjs
17
+ renderers/workflow/render-workflow.mjs
18
+ renderers/sequence/render-sequence.mjs
19
+ renderers/dataflow/render-dataflow.mjs
20
+ renderers/lifecycle/render-lifecycle.mjs
21
+ renderers/shared/*.mjs (16 files: layout, geometry, text-fit, legend,
22
+ brand marks, i18n, diagnostics, validation, etc.)
23
+ assets/template.html (the viewer: CSS + interactive runtime JS)
24
+ ```
25
+
26
+ These files are otherwise **unmodified** from upstream. `astro-archify`'s own code (in the repository root — `astro-archify-integration.js` and friends) invokes them exactly as Archify's own CLI does internally: as a Node subprocess, with the same `argv`/environment-variable contract (`node render-<type>.mjs <input.json> <output.html>`, `ARCHIFY_QUALITY_PROFILE`, `ARCHIFY_DIAGNOSTIC_FORMAT=json`). None of astro-archify's own rendering, embedding, resize, or Astro-integration logic is derived from Archify's code — see the root `README.md`'s "Attribution" section for that boundary.
27
+
28
+ Confirmed at vendoring time: this file set has **zero npm runtime dependencies** — only Node.js builtins (`fs`, `path`, `crypto`, `child_process`, `url`, `dns/promises`, `http`, `https`, `net`). Archify's own `ajv`/`parse5`/`saxes`/`simple-icons` devDependencies are build-time-only (schema/brand-mark codegen) and are not required to run these files.
29
+
30
+ ## Keeping this in sync (patching)
31
+
32
+ This is a point-in-time copy, not a live dependency — upstream fixes and features do not arrive automatically. To pull in a newer Archify:
33
+
34
+ ```bash
35
+ git clone https://github.com/tt-a1i/archify /tmp/archify-latest
36
+ npm run update:vendor -- /tmp/archify-latest
37
+ ```
38
+
39
+ This re-traces the same import graph used to vendor these files originally (see `scripts/update-vendor.mjs`), overwrites this directory with whatever changed, and prints a summary of what's new or changed plus the exact "Pinned commit" / "Upstream version" values to put in this file. Then:
40
+
41
+ ```bash
42
+ git diff vendor/archify/ # review what actually changed upstream
43
+ # update the Pinned commit / Upstream version / Vendored on fields above
44
+ npm test
45
+ cd demo && npm install && npm run build # rebuild and spot-check a page
46
+ ```
47
+
48
+ The script only touches files under `vendor/archify/` — it never edits this file, `git`, or anything outside `vendor/`.