kodelyth-ecc 1.8.0 → 1.8.2

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 (91) hide show
  1. package/CLAUDE.md +1 -1
  2. package/VERSION +1 -1
  3. package/bin/kodelyth-ecc.js +54 -5
  4. package/install.ps1 +30 -13
  5. package/install.sh +11 -4
  6. package/package.json +1 -1
  7. package/rules/common/agent-intent-routing.md +96 -195
  8. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -47
  9. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  10. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -41
  11. package/.github/ISSUE_TEMPLATE/good_first_issue.md +0 -36
  12. package/.github/ISSUE_TEMPLATE/new_agent.md +0 -52
  13. package/.github/PULL_REQUEST_TEMPLATE.md +0 -53
  14. package/.github/workflows/ci.yml +0 -45
  15. package/.github/workflows/publish.yml +0 -60
  16. package/brand/concepts.svg +0 -109
  17. package/brand/convert.js +0 -161
  18. package/brand/favicon.svg +0 -7
  19. package/brand/fb-cover.svg +0 -34
  20. package/brand/fb-profile.svg +0 -21
  21. package/brand/kodelyth-dark.svg +0 -24
  22. package/brand/kodelyth-light.svg +0 -24
  23. package/brand/kodelyth-mark.svg +0 -20
  24. package/brand/package.json +0 -12
  25. package/docs/dashboard.md +0 -211
  26. package/docs/evolve.md +0 -303
  27. package/docs/mcp-clients.md +0 -167
  28. package/docs/mcp.md +0 -178
  29. package/docs/replay.md +0 -244
  30. package/docs/supply-chain.md +0 -207
  31. package/docs/swarm.md +0 -243
  32. package/skills/skill-comply/tests/test_grader.py +0 -137
  33. package/skills/skill-comply/tests/test_parser.py +0 -90
  34. package/social/card-agents.svg +0 -104
  35. package/social/card-install.svg +0 -58
  36. package/social/card-main.svg +0 -54
  37. package/social/facebook-v150.svg +0 -110
  38. package/social/fb-ad-main.svg +0 -128
  39. package/social/fb-post-features.svg +0 -118
  40. package/social/fb-post-launch.svg +0 -144
  41. package/social/fb-post-platforms.svg +0 -135
  42. package/social/github-social-preview.svg +0 -151
  43. package/social/hype-compound-learning.svg +0 -129
  44. package/social/hype-devil-mode.svg +0 -240
  45. package/social/hype-mcp-server.svg +0 -148
  46. package/social/hype-parallel-agents.svg +0 -162
  47. package/social/hype-stats-hero.svg +0 -138
  48. package/social/og-image.svg +0 -151
  49. package/social/readme-agents.svg +0 -138
  50. package/social/readme-hero.svg +0 -102
  51. package/social/section-agents.svg +0 -69
  52. package/social/section-author.svg +0 -66
  53. package/social/section-dashboard.svg +0 -71
  54. package/social/section-devil.svg +0 -66
  55. package/social/section-hooks.svg +0 -63
  56. package/social/section-install.svg +0 -54
  57. package/social/section-learning.svg +0 -64
  58. package/social/section-mcp.svg +0 -58
  59. package/social/section-memory.svg +0 -69
  60. package/social/section-parallel.svg +0 -84
  61. package/social/section-routing.svg +0 -63
  62. package/social/twitter-threads.md +0 -621
  63. package/social/x-card-agents-grid.svg +0 -120
  64. package/social/x-card-free.svg +0 -71
  65. package/social/x-card-hook.svg +0 -94
  66. package/tests/dashboard/data.test.js +0 -391
  67. package/tests/dashboard/server.test.js +0 -257
  68. package/tests/evolve/analyze.test.js +0 -169
  69. package/tests/evolve/proposals.test.js +0 -173
  70. package/tests/evolve/stats.test.js +0 -167
  71. package/tests/hooks/branch-name-check.test.js +0 -184
  72. package/tests/hooks/smart-suggest.test.js +0 -149
  73. package/tests/hooks/test-reminder.test.js +0 -181
  74. package/tests/mcp/catalog.test.js +0 -98
  75. package/tests/mcp/client.test.js +0 -113
  76. package/tests/mcp/resources-prompts.test.js +0 -70
  77. package/tests/mcp/tools.test.js +0 -159
  78. package/tests/memory/auto-recall.test.js +0 -132
  79. package/tests/memory/instincts.test.js +0 -258
  80. package/tests/memory/store.test.js +0 -203
  81. package/tests/replay/bundle.test.js +0 -181
  82. package/tests/replay/replay.test.js +0 -131
  83. package/tests/router/classify.test.js +0 -164
  84. package/tests/run-all.js +0 -55
  85. package/tests/safety/patterns.test.js +0 -94
  86. package/tests/safety/prompt-injection-guard.test.js +0 -111
  87. package/tests/safety/token-budget.test.js +0 -119
  88. package/tests/supply-chain/manifest.test.js +0 -147
  89. package/tests/supply-chain/sbom.test.js +0 -170
  90. package/tests/supply-chain/verify.test.js +0 -146
  91. package/tests/swarm/build-plan.test.js +0 -188
@@ -1,52 +0,0 @@
1
- ---
2
- name: New agent proposal
3
- about: Propose a new specialist agent for ECC
4
- title: '[AGENT] '
5
- labels: enhancement, new-agent
6
- assignees: ''
7
- ---
8
-
9
- ## Agent name
10
-
11
- <!-- e.g. `rate-limiter-specialist`, `database-migrator` -->
12
-
13
- ## One-line description
14
-
15
- <!-- What does this agent do? Max 15 words. -->
16
-
17
- ## Problem it solves
18
-
19
- <!-- What pain does this agent remove? What does a developer have to do manually today that this agent would handle? -->
20
-
21
- ## Persona
22
-
23
- <!-- Who is this agent? Describe their experience, scale they've worked at, what makes their advice different from a generic answer. -->
24
-
25
- ## Trigger patterns
26
-
27
- <!-- When should intent routing auto-invoke this agent? Give 5–10 natural-language phrases a user might type. -->
28
-
29
- - "..."
30
- - "..."
31
- - "..."
32
-
33
- ## Example interaction
34
-
35
- <!-- Show a realistic input and the kind of response this agent would give. -->
36
-
37
- **User:** ...
38
-
39
- **Agent:** ...
40
-
41
- ## Does this overlap with an existing agent?
42
-
43
- <!-- Check the agent list. If it overlaps with e.g. `debug-detective` or `performance-optimizer`, explain what makes this distinct. -->
44
-
45
- ## Kodelyth Standard checklist
46
-
47
- - [ ] The agent has a specific, named persona with years of experience and scale context
48
- - [ ] The agent responds to the human situation, not just the technical question
49
- - [ ] Responses give exact file paths, before/after code, or specific commands — not abstract advice
50
- - [ ] No emoji in agent responses
51
- - [ ] Ends with `> Powered by Kodelyth — [tagline]`
52
- - [ ] No `model:` field in frontmatter
@@ -1,53 +0,0 @@
1
- ## What this PR does
2
-
3
- <!-- One paragraph. What was broken or missing, what you changed, and why this is the right approach. -->
4
-
5
- ## Type of change
6
-
7
- - [ ] Bug fix (broken behavior, wrong count, install failure)
8
- - [ ] New agent
9
- - [ ] New skill
10
- - [ ] New command
11
- - [ ] New hook
12
- - [ ] Rule update
13
- - [ ] Install script change
14
- - [ ] Documentation
15
- - [ ] Other: ___
16
-
17
- ## Checklist
18
-
19
- ### All PRs
20
- - [ ] `npm test` passes (`node tests/run-all.js`)
21
- - [ ] No hardcoded version numbers or counts that will drift
22
- - [ ] No `.DS_Store`, `node_modules`, or generated files committed
23
-
24
- ### New agent
25
- - [ ] File at `agents/<name>.md`
26
- - [ ] No `model:` field in frontmatter
27
- - [ ] Has a specific persona with experience/scale context
28
- - [ ] Responds to human situation, not just the technical question
29
- - [ ] Ends with `> Powered by Kodelyth — [tagline]`
30
- - [ ] Trigger patterns added to `rules/common/agent-intent-routing.md`
31
- - [ ] Agent added to `rules/common/agents.md`
32
- - [ ] README agent table updated
33
-
34
- ### New skill
35
- - [ ] File at `skills/<name>/SKILL.md`
36
- - [ ] Description is accurate and testable
37
-
38
- ### Install script change (`install.sh` / `install.ps1`)
39
- - [ ] Both `install.sh` and `install.ps1` updated (feature parity)
40
- - [ ] Tested on at least one platform
41
- - [ ] No new hardcoded counts (use dynamic `find` instead)
42
-
43
- ### Rule change
44
- - [ ] Rule is general enough to apply across languages/frameworks
45
- - [ ] Not duplicating guidance already in another rule file
46
-
47
- ## Testing
48
-
49
- <!-- How did you verify this works? -->
50
-
51
- ## Related issues
52
-
53
- <!-- Closes #123 -->
@@ -1,45 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
-
9
- jobs:
10
- test:
11
- name: Test (Node ${{ matrix.node }})
12
- runs-on: ${{ matrix.os }}
13
-
14
- strategy:
15
- matrix:
16
- node: [18, 20, 22]
17
- os: [ubuntu-latest, macos-latest, windows-latest]
18
-
19
- steps:
20
- - uses: actions/checkout@v4
21
-
22
- - name: Set up Node.js
23
- uses: actions/setup-node@v4
24
- with:
25
- node-version: ${{ matrix.node }}
26
-
27
- - name: Verify install script syntax (bash)
28
- if: runner.os != 'Windows'
29
- run: bash -n install.sh
30
-
31
- - name: Verify bin entry point syntax
32
- run: node --check bin/kodelyth-ecc.js
33
-
34
- - name: Run test suite
35
- run: node tests/run-all.js
36
-
37
- - name: Verify memory module syntax
38
- run: |
39
- node --check scripts/memory/store.js
40
- node --check scripts/memory/inject.js
41
- node --check scripts/memory/extract.js
42
- node --check scripts/memory/cli.js
43
- node --check hooks/memory/inject-start.js
44
- node --check hooks/memory/capture-stop.js
45
- shell: bash
@@ -1,60 +0,0 @@
1
- name: Publish to npm
2
-
3
- on:
4
- release:
5
- types: [published]
6
-
7
- jobs:
8
- publish:
9
- name: npm publish
10
- runs-on: ubuntu-latest
11
-
12
- permissions:
13
- contents: read
14
- id-token: write # for npm provenance
15
-
16
- steps:
17
- - uses: actions/checkout@v4
18
-
19
- - name: Set up Node.js
20
- uses: actions/setup-node@v4
21
- with:
22
- node-version: 22
23
- registry-url: https://registry.npmjs.org
24
-
25
- - name: Verify package version matches release tag
26
- run: |
27
- PKG_VERSION=$(node -p "require('./package.json').version")
28
- TAG_VERSION="${GITHUB_REF_NAME#v}"
29
- if [ "$PKG_VERSION" != "$TAG_VERSION" ]; then
30
- echo "ERROR: package.json version ($PKG_VERSION) does not match release tag ($TAG_VERSION)"
31
- exit 1
32
- fi
33
- echo "Version check passed: $PKG_VERSION"
34
-
35
- - name: Run tests before publish
36
- run: node tests/run-all.js
37
-
38
- - name: Publish to npm
39
- run: npm publish --provenance --access public
40
- env:
41
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
42
-
43
- # ── Phase 2.9: SLSA / SBOM ───────────────────────────────────────────
44
- # npm publish above already issues SLSA Level 3 build provenance via
45
- # npm's sigstore integration (--provenance). Below we additionally emit a
46
- # CycloneDX SBOM and a content manifest, both attached to the release.
47
- - name: Generate CycloneDX SBOM
48
- run: node bin/kodelyth-ecc.js sbom --out kodelyth-ecc-sbom.cdx.json
49
-
50
- - name: Generate content manifest
51
- run: node bin/kodelyth-ecc.js manifest --out kodelyth-ecc-manifest.json
52
-
53
- - name: Upload SBOM + manifest to the GitHub release
54
- env:
55
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
56
- run: |
57
- gh release upload "$GITHUB_REF_NAME" \
58
- kodelyth-ecc-sbom.cdx.json \
59
- kodelyth-ecc-manifest.json \
60
- --clobber
@@ -1,109 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 920 400" width="920" height="400"
2
- font-family="'Space Grotesk','Inter',system-ui,-apple-system,sans-serif">
3
-
4
- <rect width="920" height="400" fill="#ffffff"/>
5
-
6
- <!-- grid lines -->
7
- <line x1="230" y1="0" x2="230" y2="400" stroke="#f1f5f9" stroke-width="1"/>
8
- <line x1="460" y1="0" x2="460" y2="400" stroke="#f1f5f9" stroke-width="1"/>
9
- <line x1="690" y1="0" x2="690" y2="400" stroke="#f1f5f9" stroke-width="1"/>
10
- <line x1="0" y1="195" x2="920" y2="195" stroke="#f1f5f9" stroke-width="1"/>
11
-
12
-
13
- <!-- ═══ ROW 1 ═══════════════════════════════════════════════════════════ -->
14
-
15
- <!-- 01 · Stroke chevron — the baseline -->
16
- <text x="115" y="26" font-size="9" font-weight="600" fill="#cbd5e1" text-anchor="middle" letter-spacing="3">01</text>
17
- <g transform="translate(115,95)">
18
- <polyline points="-16,-28 16,0 -16,28"
19
- stroke="#0f172a" stroke-width="7.5"
20
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
21
- </g>
22
- <text x="115" y="158" font-size="13" font-weight="700" fill="#0f172a" text-anchor="middle" letter-spacing="1.5">KODELYTH</text>
23
- <text x="115" y="175" font-size="8.5" fill="#94a3b8" text-anchor="middle" letter-spacing="2.5">STROKE</text>
24
-
25
-
26
- <!-- 02 · Filled chevron (open back) -->
27
- <text x="345" y="26" font-size="9" font-weight="600" fill="#cbd5e1" text-anchor="middle" letter-spacing="3">02</text>
28
- <g transform="translate(345,95)">
29
- <polygon points="-14,-29 18,0 -14,29 -3,29 11,0 -3,-29" fill="#0f172a"/>
30
- </g>
31
- <text x="345" y="158" font-size="13" font-weight="700" fill="#0f172a" text-anchor="middle" letter-spacing="1.5">KODELYTH</text>
32
- <text x="345" y="175" font-size="8.5" fill="#94a3b8" text-anchor="middle" letter-spacing="2.5">FILLED OPEN</text>
33
-
34
-
35
- <!-- 03 · Filled triangle (closed back — most Vercel) -->
36
- <text x="575" y="26" font-size="9" font-weight="600" fill="#cbd5e1" text-anchor="middle" letter-spacing="3">03</text>
37
- <g transform="translate(575,95)">
38
- <polygon points="-18,-28 20,0 -18,28" fill="#0f172a"/>
39
- </g>
40
- <text x="575" y="158" font-size="13" font-weight="700" fill="#0f172a" text-anchor="middle" letter-spacing="1.5">KODELYTH</text>
41
- <text x="575" y="175" font-size="8.5" fill="#94a3b8" text-anchor="middle" letter-spacing="2.5">SOLID WEDGE</text>
42
-
43
-
44
- <!-- 04 · Double chevron >> -->
45
- <text x="805" y="26" font-size="9" font-weight="600" fill="#cbd5e1" text-anchor="middle" letter-spacing="3">04</text>
46
- <g transform="translate(805,95)">
47
- <polyline points="-22,-26 -2,0 -22,26"
48
- stroke="#0f172a" stroke-width="5.5"
49
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
50
- <polyline points="-4,-26 16,0 -4,26"
51
- stroke="#0f172a" stroke-width="5.5"
52
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
53
- </g>
54
- <text x="805" y="158" font-size="13" font-weight="700" fill="#0f172a" text-anchor="middle" letter-spacing="1.5">KODELYTH</text>
55
- <text x="805" y="175" font-size="8.5" fill="#94a3b8" text-anchor="middle" letter-spacing="2.5">DOUBLE</text>
56
-
57
-
58
- <!-- ═══ ROW 2 ═══════════════════════════════════════════════════════════ -->
59
-
60
- <!-- 05 · Chevron + apex dot -->
61
- <text x="115" y="216" font-size="9" font-weight="600" fill="#cbd5e1" text-anchor="middle" letter-spacing="3">05</text>
62
- <g transform="translate(115,285)">
63
- <polyline points="-18,-27 10,0 -18,27"
64
- stroke="#0f172a" stroke-width="6.5"
65
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
66
- <circle cx="20" cy="0" r="6" fill="#0f172a"/>
67
- </g>
68
- <text x="115" y="348" font-size="13" font-weight="700" fill="#0f172a" text-anchor="middle" letter-spacing="1.5">KODELYTH</text>
69
- <text x="115" y="365" font-size="8.5" fill="#94a3b8" text-anchor="middle" letter-spacing="2.5">CHEVRON + NODE</text>
70
-
71
-
72
- <!-- 06 · Bracket form — chevron with horizontal arms -->
73
- <text x="345" y="216" font-size="9" font-weight="600" fill="#cbd5e1" text-anchor="middle" letter-spacing="3">06</text>
74
- <g transform="translate(345,285)">
75
- <line x1="-20" y1="-26" x2="0" y2="-26" stroke="#0f172a" stroke-width="5.5" stroke-linecap="round"/>
76
- <polyline points="0,-26 18,0 0,26"
77
- stroke="#0f172a" stroke-width="5.5"
78
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
79
- <line x1="0" y1="26" x2="-20" y2="26" stroke="#0f172a" stroke-width="5.5" stroke-linecap="round"/>
80
- </g>
81
- <text x="345" y="348" font-size="13" font-weight="700" fill="#0f172a" text-anchor="middle" letter-spacing="1.5">KODELYTH</text>
82
- <text x="345" y="365" font-size="8.5" fill="#94a3b8" text-anchor="middle" letter-spacing="2.5">BRACKET</text>
83
-
84
-
85
- <!-- 07 · Upward caret ^ (Vercel-adjacent, growth direction) -->
86
- <text x="575" y="216" font-size="9" font-weight="600" fill="#cbd5e1" text-anchor="middle" letter-spacing="3">07</text>
87
- <g transform="translate(575,285)">
88
- <polyline points="-26,20 0,-22 26,20"
89
- stroke="#0f172a" stroke-width="7.5"
90
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
91
- </g>
92
- <text x="575" y="348" font-size="13" font-weight="700" fill="#0f172a" text-anchor="middle" letter-spacing="1.5">KODELYTH</text>
93
- <text x="575" y="365" font-size="8.5" fill="#94a3b8" text-anchor="middle" letter-spacing="2.5">CARET UP</text>
94
-
95
-
96
- <!-- 08 · Ghost depth — bold front + faint back -->
97
- <text x="805" y="216" font-size="9" font-weight="600" fill="#cbd5e1" text-anchor="middle" letter-spacing="3">08</text>
98
- <g transform="translate(805,285)">
99
- <polyline points="-26,-26 -6,0 -26,26"
100
- stroke="#0f172a" stroke-width="4" opacity="0.2"
101
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
102
- <polyline points="-12,-27 14,0 -12,27"
103
- stroke="#0f172a" stroke-width="7.5"
104
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
105
- </g>
106
- <text x="805" y="348" font-size="13" font-weight="700" fill="#0f172a" text-anchor="middle" letter-spacing="1.5">KODELYTH</text>
107
- <text x="805" y="365" font-size="8.5" fill="#94a3b8" text-anchor="middle" letter-spacing="2.5">DEPTH</text>
108
-
109
- </svg>
package/brand/convert.js DELETED
@@ -1,161 +0,0 @@
1
- /**
2
- * brand/convert.js
3
- * Converts all Kodelyth SVG brand assets to high-quality PNG
4
- * Uses Chrome (puppeteer-core) for pixel-perfect font + geometry rendering
5
- *
6
- * Usage: node brand/convert.js
7
- */
8
-
9
- const puppeteer = require('puppeteer-core');
10
- const path = require('path');
11
- const fs = require('fs');
12
-
13
- const CHROME = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome';
14
- const BRAND_DIR = __dirname;
15
-
16
- const ASSETS = [
17
- // Facebook social assets — 2× for retina sharpness
18
- {
19
- input: 'fb-profile.svg',
20
- output: 'fb-profile.png',
21
- width: 800,
22
- height: 800,
23
- label: 'Facebook profile picture (800×800 @2x)',
24
- },
25
- {
26
- input: 'fb-cover.svg',
27
- output: 'fb-cover.png',
28
- width: 1640,
29
- height: 624,
30
- label: 'Facebook cover photo (1640×624 @2x)',
31
- },
32
-
33
- // Standalone mark — 3× for print + high-res usage
34
- {
35
- input: 'kodelyth-mark.svg',
36
- output: 'kodelyth-mark.png',
37
- width: 1200,
38
- height: 1200,
39
- label: 'Kodelyth mark (1200×1200 @3x)',
40
- },
41
-
42
- // Horizontal lockups — 3×
43
- {
44
- input: 'kodelyth-dark.svg',
45
- output: 'kodelyth-dark.png',
46
- width: 1380,
47
- height: 360,
48
- label: 'Lockup dark (1380×360 @3x)',
49
- },
50
- {
51
- input: 'kodelyth-light.svg',
52
- output: 'kodelyth-light.png',
53
- width: 1380,
54
- height: 360,
55
- label: 'Lockup light (1380×360 @3x)',
56
- },
57
-
58
- // Favicon — all required sizes
59
- {
60
- input: 'favicon.svg',
61
- output: 'favicon-16.png',
62
- width: 16,
63
- height: 16,
64
- label: 'Favicon 16×16',
65
- },
66
- {
67
- input: 'favicon.svg',
68
- output: 'favicon-32.png',
69
- width: 32,
70
- height: 32,
71
- label: 'Favicon 32×32',
72
- },
73
- {
74
- input: 'favicon.svg',
75
- output: 'favicon-180.png',
76
- width: 180,
77
- height: 180,
78
- label: 'Apple Touch Icon 180×180',
79
- },
80
- ];
81
-
82
- async function convertAsset(page, asset) {
83
- const inputPath = path.join(BRAND_DIR, asset.input);
84
- const outputPath = path.join(BRAND_DIR, asset.output);
85
-
86
- if (!fs.existsSync(inputPath)) {
87
- console.error(` SKIP ${asset.input} — file not found`);
88
- return;
89
- }
90
-
91
- const svgContent = fs.readFileSync(inputPath, 'utf8');
92
-
93
- await page.setViewport({
94
- width: asset.width,
95
- height: asset.height,
96
- deviceScaleFactor: 2, // render at 2× internal resolution for anti-aliasing
97
- });
98
-
99
- // Wrap SVG in a minimal HTML page — more reliable than opening SVG directly
100
- const html = `<!DOCTYPE html>
101
- <html>
102
- <head>
103
- <meta charset="utf-8">
104
- <style>
105
- * { margin: 0; padding: 0; box-sizing: border-box; }
106
- html, body { width: ${asset.width}px; height: ${asset.height}px; overflow: hidden; background: transparent; }
107
- svg { display: block; width: ${asset.width}px !important; height: ${asset.height}px !important; }
108
- </style>
109
- </head>
110
- <body>${svgContent}</body>
111
- </html>`;
112
-
113
- await page.setContent(html, { waitUntil: 'domcontentloaded', timeout: 10000 });
114
-
115
- await page.screenshot({
116
- path: outputPath,
117
- type: 'png',
118
- clip: { x: 0, y: 0, width: asset.width, height: asset.height },
119
- omitBackground: false,
120
- });
121
-
122
- const kb = Math.round(fs.statSync(outputPath).size / 1024);
123
- console.log(` [DONE] ${asset.output.padEnd(28)} ${asset.label} (${kb} KB)`);
124
- }
125
-
126
- async function main() {
127
- console.log('\nKodelyth Brand — SVG → PNG Converter');
128
- console.log('--------------------------------------');
129
-
130
- const browser = await puppeteer.launch({
131
- executablePath: CHROME,
132
- headless: 'new',
133
- args: [
134
- '--no-sandbox',
135
- '--disable-setuid-sandbox',
136
- '--disable-web-security', // allow file:// access
137
- '--force-device-scale-factor=1',
138
- ],
139
- });
140
-
141
- const page = await browser.newPage();
142
-
143
- // Disable all animations so screenshots are clean
144
- await page.addStyleTag({
145
- content: '*, *::before, *::after { animation: none !important; transition: none !important; }',
146
- });
147
-
148
- for (const asset of ASSETS) {
149
- await convertAsset(page, asset);
150
- }
151
-
152
- await browser.close();
153
-
154
- console.log('\nAll PNGs written to brand/');
155
- console.log('--------------------------------------\n');
156
- }
157
-
158
- main().catch(err => {
159
- console.error('Conversion failed:', err.message);
160
- process.exit(1);
161
- });
package/brand/favicon.svg DELETED
@@ -1,7 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
2
- <rect width="32" height="32" fill="#0a0a0a"/>
3
- <polyline points="7,5 23,16 7,27"
4
- stroke="#ffffff" stroke-width="5"
5
- stroke-linecap="round" stroke-linejoin="round"
6
- fill="none"/>
7
- </svg>
@@ -1,34 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 820 312" width="820" height="312"
2
- font-family="'Space Grotesk','Inter',system-ui,-apple-system,sans-serif">
3
-
4
- <!-- Facebook Page Cover Photo — 820×312px -->
5
- <!-- Safe zone for mobile: center 640×312 — all content within 90px left/right margins -->
6
-
7
- <rect width="820" height="312" fill="#0a0a0a"/>
8
-
9
- <!-- Ghost Depth mark — centered, optically balanced in 312px height -->
10
- <g stroke-linecap="round" stroke-linejoin="round" fill="none" stroke="#ffffff">
11
-
12
- <!-- ghost — trails left, recedes behind -->
13
- <polyline points="370,67 401,120 370,173"
14
- stroke-width="5.5" stroke-opacity="0.22"/>
15
-
16
- <!-- solid — primary mark -->
17
- <polyline points="395,65 443,120 395,175"
18
- stroke-width="18"/>
19
-
20
- </g>
21
-
22
- <!-- Wordmark -->
23
- <text x="410" y="232"
24
- text-anchor="middle"
25
- font-size="44" font-weight="700" fill="#ffffff"
26
- letter-spacing="3.5">KODELYTH</text>
27
-
28
- <!-- Tagline -->
29
- <text x="410" y="257"
30
- text-anchor="middle"
31
- font-size="18" font-weight="400" fill="#ffffff" fill-opacity="0.58"
32
- letter-spacing="3">Build everything.</text>
33
-
34
- </svg>
@@ -1,21 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400">
2
-
3
- <!-- Facebook Page Profile Picture — 400×400 -->
4
- <!-- Facebook crops to circle — mark centered within circular safe zone -->
5
-
6
- <rect width="400" height="400" fill="#0a0a0a"/>
7
-
8
- <!-- Kodelyth Mark — Ghost Depth (white on dark) -->
9
- <g stroke-linecap="round" stroke-linejoin="round" fill="none" stroke="#ffffff">
10
-
11
- <!-- ghost — trails left, recedes behind solid -->
12
- <polyline points="128,104 184,200 128,296"
13
- stroke-width="10" stroke-opacity="0.22"/>
14
-
15
- <!-- solid — primary mark -->
16
- <polyline points="172,100 260,200 172,300"
17
- stroke-width="32"/>
18
-
19
- </g>
20
-
21
- </svg>
@@ -1,24 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 120" width="460" height="120"
2
- font-family="'Space Grotesk','Inter',system-ui,-apple-system,sans-serif">
3
-
4
- <rect width="460" height="120" fill="#0a0a0a"/>
5
-
6
- <!-- Kodelyth Mark — Ghost Depth (white on dark) -->
7
- <g stroke-linecap="round" stroke-linejoin="round" fill="none" stroke="#ffffff">
8
-
9
- <!-- ghost — reduced arm span, tighter stroke, optical depth layer -->
10
- <polyline points="49,38 68,60 49,82"
11
- stroke-width="3.5" stroke-opacity="0.2"/>
12
-
13
- <!-- solid — reduced arm to balance mark:cap ratio 2.4:1 -->
14
- <polyline points="64,35 95,60 64,85"
15
- stroke-width="11"/>
16
-
17
- </g>
18
-
19
- <!-- Wordmark — baseline lifted to optically align with mark center y=60 -->
20
- <text x="125" y="73"
21
- font-size="36" font-weight="700" fill="#ffffff"
22
- letter-spacing="3">KODELYTH</text>
23
-
24
- </svg>
@@ -1,24 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 120" width="460" height="120"
2
- font-family="'Space Grotesk','Inter',system-ui,-apple-system,sans-serif">
3
-
4
- <rect width="460" height="120" fill="#ffffff"/>
5
-
6
- <!-- Kodelyth Mark — Ghost Depth (dark on light) -->
7
- <g stroke-linecap="round" stroke-linejoin="round" fill="none" stroke="#0f172a">
8
-
9
- <!-- ghost — reduced arm span, tighter stroke, optical depth layer -->
10
- <polyline points="49,38 68,60 49,82"
11
- stroke-width="3.5" stroke-opacity="0.15"/>
12
-
13
- <!-- solid — reduced arm to balance mark:cap ratio 2.4:1 -->
14
- <polyline points="64,35 95,60 64,85"
15
- stroke-width="11"/>
16
-
17
- </g>
18
-
19
- <!-- Wordmark — baseline lifted to optically align with mark center y=60 -->
20
- <text x="125" y="73"
21
- font-size="36" font-weight="700" fill="#0f172a"
22
- letter-spacing="3">KODELYTH</text>
23
-
24
- </svg>
@@ -1,20 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400">
2
-
3
- <rect width="400" height="400" fill="#ffffff"/>
4
-
5
- <!-- Kodelyth Mark — Ghost Depth -->
6
- <!-- Ghost trails LEFT of the solid — peeks out from behind the left arms -->
7
- <!-- Solid is the dominant forward-facing mark -->
8
- <g stroke-linecap="round" stroke-linejoin="round" fill="none" stroke="#0f172a">
9
-
10
- <!-- ghost — left of solid, lighter stroke, recedes behind -->
11
- <polyline points="128,104 184,200 128,296"
12
- stroke-width="10" stroke-opacity="0.15"/>
13
-
14
- <!-- solid — primary mark, full weight, forward -->
15
- <polyline points="172,100 260,200 172,300"
16
- stroke-width="32"/>
17
-
18
- </g>
19
-
20
- </svg>
@@ -1,12 +0,0 @@
1
- {
2
- "name": "kodelyth-brand",
3
- "version": "1.0.0",
4
- "private": true,
5
- "description": "Brand asset conversion tools for Kodelyth",
6
- "scripts": {
7
- "convert": "node convert.js"
8
- },
9
- "dependencies": {
10
- "puppeteer-core": "^24.43.1"
11
- }
12
- }