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.
- package/CLAUDE.md +1 -1
- package/VERSION +1 -1
- package/bin/kodelyth-ecc.js +54 -5
- package/install.ps1 +30 -13
- package/install.sh +11 -4
- package/package.json +1 -1
- package/rules/common/agent-intent-routing.md +96 -195
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -47
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -41
- package/.github/ISSUE_TEMPLATE/good_first_issue.md +0 -36
- package/.github/ISSUE_TEMPLATE/new_agent.md +0 -52
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -53
- package/.github/workflows/ci.yml +0 -45
- package/.github/workflows/publish.yml +0 -60
- package/brand/concepts.svg +0 -109
- package/brand/convert.js +0 -161
- package/brand/favicon.svg +0 -7
- package/brand/fb-cover.svg +0 -34
- package/brand/fb-profile.svg +0 -21
- package/brand/kodelyth-dark.svg +0 -24
- package/brand/kodelyth-light.svg +0 -24
- package/brand/kodelyth-mark.svg +0 -20
- package/brand/package.json +0 -12
- package/docs/dashboard.md +0 -211
- package/docs/evolve.md +0 -303
- package/docs/mcp-clients.md +0 -167
- package/docs/mcp.md +0 -178
- package/docs/replay.md +0 -244
- package/docs/supply-chain.md +0 -207
- package/docs/swarm.md +0 -243
- package/skills/skill-comply/tests/test_grader.py +0 -137
- package/skills/skill-comply/tests/test_parser.py +0 -90
- package/social/card-agents.svg +0 -104
- package/social/card-install.svg +0 -58
- package/social/card-main.svg +0 -54
- package/social/facebook-v150.svg +0 -110
- package/social/fb-ad-main.svg +0 -128
- package/social/fb-post-features.svg +0 -118
- package/social/fb-post-launch.svg +0 -144
- package/social/fb-post-platforms.svg +0 -135
- package/social/github-social-preview.svg +0 -151
- package/social/hype-compound-learning.svg +0 -129
- package/social/hype-devil-mode.svg +0 -240
- package/social/hype-mcp-server.svg +0 -148
- package/social/hype-parallel-agents.svg +0 -162
- package/social/hype-stats-hero.svg +0 -138
- package/social/og-image.svg +0 -151
- package/social/readme-agents.svg +0 -138
- package/social/readme-hero.svg +0 -102
- package/social/section-agents.svg +0 -69
- package/social/section-author.svg +0 -66
- package/social/section-dashboard.svg +0 -71
- package/social/section-devil.svg +0 -66
- package/social/section-hooks.svg +0 -63
- package/social/section-install.svg +0 -54
- package/social/section-learning.svg +0 -64
- package/social/section-mcp.svg +0 -58
- package/social/section-memory.svg +0 -69
- package/social/section-parallel.svg +0 -84
- package/social/section-routing.svg +0 -63
- package/social/twitter-threads.md +0 -621
- package/social/x-card-agents-grid.svg +0 -120
- package/social/x-card-free.svg +0 -71
- package/social/x-card-hook.svg +0 -94
- package/tests/dashboard/data.test.js +0 -391
- package/tests/dashboard/server.test.js +0 -257
- package/tests/evolve/analyze.test.js +0 -169
- package/tests/evolve/proposals.test.js +0 -173
- package/tests/evolve/stats.test.js +0 -167
- package/tests/hooks/branch-name-check.test.js +0 -184
- package/tests/hooks/smart-suggest.test.js +0 -149
- package/tests/hooks/test-reminder.test.js +0 -181
- package/tests/mcp/catalog.test.js +0 -98
- package/tests/mcp/client.test.js +0 -113
- package/tests/mcp/resources-prompts.test.js +0 -70
- package/tests/mcp/tools.test.js +0 -159
- package/tests/memory/auto-recall.test.js +0 -132
- package/tests/memory/instincts.test.js +0 -258
- package/tests/memory/store.test.js +0 -203
- package/tests/replay/bundle.test.js +0 -181
- package/tests/replay/replay.test.js +0 -131
- package/tests/router/classify.test.js +0 -164
- package/tests/run-all.js +0 -55
- package/tests/safety/patterns.test.js +0 -94
- package/tests/safety/prompt-injection-guard.test.js +0 -111
- package/tests/safety/token-budget.test.js +0 -119
- package/tests/supply-chain/manifest.test.js +0 -147
- package/tests/supply-chain/sbom.test.js +0 -170
- package/tests/supply-chain/verify.test.js +0 -146
- 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 -->
|
package/.github/workflows/ci.yml
DELETED
|
@@ -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
|
package/brand/concepts.svg
DELETED
|
@@ -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>
|
package/brand/fb-cover.svg
DELETED
|
@@ -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>
|
package/brand/fb-profile.svg
DELETED
|
@@ -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>
|
package/brand/kodelyth-dark.svg
DELETED
|
@@ -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>
|
package/brand/kodelyth-light.svg
DELETED
|
@@ -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>
|
package/brand/kodelyth-mark.svg
DELETED
|
@@ -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>
|
package/brand/package.json
DELETED