@litfamily/lithermes 1.0.17 → 1.0.18
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/README.md +8 -8
- package/README_Ko-KR.md +8 -8
- package/assets/lithermes-plugin/payload-version.json +40 -36
- package/assets/lithermes-plugin/plugin.yaml +1 -1
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +2 -2
- package/assets/lithermes-plugin/skills/lit-docx/references/page-composition.md +1 -3
- package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_md_to_docx.py +9 -9
- package/assets/lithermes-plugin/skills/lit-docx/scripts/docx_design.py +9 -9
- package/assets/lithermes-plugin/skills/lit-docx/scripts/docx_layout.py +6 -6
- package/assets/lithermes-plugin/skills/lit-docx/templates/tonalities/brief.yaml +0 -1
- package/assets/lithermes-plugin/skills/lit-docx/templates/tonalities/journal.yaml +0 -1
- package/assets/lithermes-plugin/skills/lit-docx/templates/tonalities/manual.yaml +0 -1
- package/assets/lithermes-plugin/skills/lit-docx/templates/tonalities/memo.yaml +0 -1
- package/assets/lithermes-plugin/skills/lit-docx/templates/tonalities/proposal.yaml +0 -1
- package/assets/lithermes-plugin/skills/lit-docx/templates/tonalities/report.yaml +0 -1
- package/assets/lithermes-plugin/skills/lit-pptx/FORBIDDEN_TERMS.json +55 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/atlas.md +2 -2
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/chalk.md +2 -3
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/gazette.md +2 -2
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/ledger.md +5 -5
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/night.md +3 -3
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/paper.md +2 -2
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/signal.md +3 -3
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/studio.md +2 -3
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/deck_output.py +8 -8
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-pack.js +96 -96
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/template-registry.js +1 -1
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/qa_deck.py +7 -7
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/validate_pptx.py +8 -3
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +0 -13
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +0 -13
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +0 -13
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +2 -15
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/night/pack.yaml +0 -13
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/paper/pack.yaml +0 -13
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/signal/pack.yaml +0 -13
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/studio/pack.yaml +0 -13
- package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +2 -2
- package/package.json +1 -1
- package/readme-assets/badge-version.svg +1 -1
package/README.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
1
|
+
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitHermes robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
|
|
2
2
|
|
|
3
|
-
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
3
|
+
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
7
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
6
|
+
<a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/badge-version.svg" alt="1.0.18" /></a>
|
|
7
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/badge-license.svg" alt="MIT license" /></a>
|
|
8
8
|
</p>
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
12
|
-
<a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
13
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
11
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/lucide-book-open.svg" width="16" alt="" /> Guide</a>
|
|
12
|
+
<a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition film</a>
|
|
13
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
# LitHermes
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
A plugin for **Hermes Agent**. Add `lit` to a request, and Hermes plans the task, does it, checks it, and leaves a note the next session can pick up.
|
|
21
21
|
|
|
22
|
-
**[Full guide and skills gallery on GitHub](https://github.com/wjgoarxiv/lithermes#readme)** · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
22
|
+
**[Full guide and skills gallery on GitHub](https://github.com/wjgoarxiv/lithermes#readme)** · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/README_Ko-KR.md)
|
|
23
23
|
|
|
24
24
|
## Install
|
|
25
25
|
|
package/README_Ko-KR.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
1
|
+
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitHermes 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
|
|
2
2
|
|
|
3
|
-
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
3
|
+
<p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B 마크" /></p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
7
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
6
|
+
<a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/badge-version.svg" alt="1.0.18" /></a>
|
|
7
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/badge-license.svg" alt="MIT license" /></a>
|
|
8
8
|
</p>
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
12
|
-
<a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
13
|
-
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
11
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/lucide-book-open.svg" width="16" alt="" /> 안내</a>
|
|
12
|
+
<a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition 영상</a>
|
|
13
|
+
<a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
# LitHermes
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
**Hermes Agent**용 플러그인입니다. 요청에 `lit`을 붙이면 Hermes가 작업을 계획하고, 실행하고, 확인한 뒤 다음 세션이 이어받을 기록을 남깁니다.
|
|
21
21
|
|
|
22
|
-
**[전체 안내와 스킬 갤러리는 GitHub에서](https://github.com/wjgoarxiv/lithermes/blob/main/README_Ko-KR.md)** · [English](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.
|
|
22
|
+
**[전체 안내와 스킬 갤러리는 GitHub에서](https://github.com/wjgoarxiv/lithermes/blob/main/README_Ko-KR.md)** · [English](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.18/README.md)
|
|
23
23
|
|
|
24
24
|
## 설치
|
|
25
25
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"syncedAt": "2026-10-
|
|
2
|
+
"syncedAt": "2026-10-09T14:26:45.780Z",
|
|
3
3
|
"source": "bundled-payload",
|
|
4
|
-
"sourceHash": "
|
|
4
|
+
"sourceHash": "93739a54eef0d7a4b744fc5769de447cf320844a7e07053160931e652db950e6",
|
|
5
5
|
"files": [
|
|
6
6
|
{
|
|
7
7
|
"path": "NOTICE.md",
|
|
@@ -181,7 +181,7 @@
|
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
183
|
"path": "plugin.yaml",
|
|
184
|
-
"sha256": "
|
|
184
|
+
"sha256": "13c4c5fee9821983a18377e6e9f50adf5ff898af6b9807461b9d1a961aa7d2a1"
|
|
185
185
|
},
|
|
186
186
|
{
|
|
187
187
|
"path": "provider_metrics.py",
|
|
@@ -1285,7 +1285,7 @@
|
|
|
1285
1285
|
},
|
|
1286
1286
|
{
|
|
1287
1287
|
"path": "skills/frontend-ui-ux/references/complete-contract.md",
|
|
1288
|
-
"sha256": "
|
|
1288
|
+
"sha256": "ed61f0cab8901e98e006bb194ab7f1fc383284b0880700acfbf943e6fbccf489"
|
|
1289
1289
|
},
|
|
1290
1290
|
{
|
|
1291
1291
|
"path": "skills/frontend-ui-ux/references/composition.md",
|
|
@@ -3093,7 +3093,7 @@
|
|
|
3093
3093
|
},
|
|
3094
3094
|
{
|
|
3095
3095
|
"path": "skills/lit-docx/references/page-composition.md",
|
|
3096
|
-
"sha256": "
|
|
3096
|
+
"sha256": "5d6d845d3ad1cf8b44607961a1e148a678828358324d0dff6e04ab2d0f04d7d0"
|
|
3097
3097
|
},
|
|
3098
3098
|
{
|
|
3099
3099
|
"path": "skills/lit-docx/references/slop_phrase_list.yaml",
|
|
@@ -3133,7 +3133,7 @@
|
|
|
3133
3133
|
},
|
|
3134
3134
|
{
|
|
3135
3135
|
"path": "skills/lit-docx/scripts/convert_md_to_docx.py",
|
|
3136
|
-
"sha256": "
|
|
3136
|
+
"sha256": "be4fdb8c3f831ed157747f36670465bf891b2467ff6b584d14276039dced9dda"
|
|
3137
3137
|
},
|
|
3138
3138
|
{
|
|
3139
3139
|
"path": "skills/lit-docx/scripts/convert_md_to_pdf.py",
|
|
@@ -3145,7 +3145,7 @@
|
|
|
3145
3145
|
},
|
|
3146
3146
|
{
|
|
3147
3147
|
"path": "skills/lit-docx/scripts/docx_design.py",
|
|
3148
|
-
"sha256": "
|
|
3148
|
+
"sha256": "37c9102ec8533f69536d23b46a1c9d3da8b9f23defbb532e3e796d108b119aee"
|
|
3149
3149
|
},
|
|
3150
3150
|
{
|
|
3151
3151
|
"path": "skills/lit-docx/scripts/docx_gate.py",
|
|
@@ -3153,7 +3153,7 @@
|
|
|
3153
3153
|
},
|
|
3154
3154
|
{
|
|
3155
3155
|
"path": "skills/lit-docx/scripts/docx_layout.py",
|
|
3156
|
-
"sha256": "
|
|
3156
|
+
"sha256": "b47e702721b24e3f8360c000ddb3499d7d65da2feb58a52650a25c5ec8baae27"
|
|
3157
3157
|
},
|
|
3158
3158
|
{
|
|
3159
3159
|
"path": "skills/lit-docx/scripts/edit_docx.py",
|
|
@@ -3241,27 +3241,27 @@
|
|
|
3241
3241
|
},
|
|
3242
3242
|
{
|
|
3243
3243
|
"path": "skills/lit-docx/templates/tonalities/brief.yaml",
|
|
3244
|
-
"sha256": "
|
|
3244
|
+
"sha256": "41bf481cd799b28ee53538a3cf88a58c4b2f9db365d1ca1ee10b3adfcad1ab8e"
|
|
3245
3245
|
},
|
|
3246
3246
|
{
|
|
3247
3247
|
"path": "skills/lit-docx/templates/tonalities/journal.yaml",
|
|
3248
|
-
"sha256": "
|
|
3248
|
+
"sha256": "0a7ae34ccd6e91f289c472bfeb8bcfd6736005f15c55a63dd4cc43e55606ec57"
|
|
3249
3249
|
},
|
|
3250
3250
|
{
|
|
3251
3251
|
"path": "skills/lit-docx/templates/tonalities/manual.yaml",
|
|
3252
|
-
"sha256": "
|
|
3252
|
+
"sha256": "cc965f5523c7cbaa4c1d0bc06e5260641dfc8113b77f2c252862a397eb97ce84"
|
|
3253
3253
|
},
|
|
3254
3254
|
{
|
|
3255
3255
|
"path": "skills/lit-docx/templates/tonalities/memo.yaml",
|
|
3256
|
-
"sha256": "
|
|
3256
|
+
"sha256": "37ef41eafd19a05246713523c01eb886af3d754c7d23162b2f3015dab8854772"
|
|
3257
3257
|
},
|
|
3258
3258
|
{
|
|
3259
3259
|
"path": "skills/lit-docx/templates/tonalities/proposal.yaml",
|
|
3260
|
-
"sha256": "
|
|
3260
|
+
"sha256": "b1b7f4875a89208939ca82d69e6cfb30c35b64ea91d67d5aecc98fe04bde3bfc"
|
|
3261
3261
|
},
|
|
3262
3262
|
{
|
|
3263
3263
|
"path": "skills/lit-docx/templates/tonalities/report.yaml",
|
|
3264
|
-
"sha256": "
|
|
3264
|
+
"sha256": "23ac1d24f8936c6d522e19354d5948f0d00dce6d60c34fa42e37adafcc68cb8c"
|
|
3265
3265
|
},
|
|
3266
3266
|
{
|
|
3267
3267
|
"path": "skills/lit-handoff/ORIGIN.json",
|
|
@@ -3539,6 +3539,10 @@
|
|
|
3539
3539
|
"path": "skills/lit-plan/SKILL.md",
|
|
3540
3540
|
"sha256": "650e2e90ee3d932416cde84b6db380e3664db585d5f70a356d274a540f486200"
|
|
3541
3541
|
},
|
|
3542
|
+
{
|
|
3543
|
+
"path": "skills/lit-pptx/FORBIDDEN_TERMS.json",
|
|
3544
|
+
"sha256": "8ef78f42a519c513c9291d8145dedd6180d4130e31553d1036821f1afd61cc81"
|
|
3545
|
+
},
|
|
3542
3546
|
{
|
|
3543
3547
|
"path": "skills/lit-pptx/NOTICE",
|
|
3544
3548
|
"sha256": "8a32f7ace88e748624b8f3fd019ba9a740f6d8b1893254fee5f1b76bb44b6ad2"
|
|
@@ -3729,35 +3733,35 @@
|
|
|
3729
3733
|
},
|
|
3730
3734
|
{
|
|
3731
3735
|
"path": "skills/lit-pptx/references/tonalities/atlas.md",
|
|
3732
|
-
"sha256": "
|
|
3736
|
+
"sha256": "37cbc87a2347aa2b640fb5d99dfd641e7bdc2d05d5764ffb92c911450000eda5"
|
|
3733
3737
|
},
|
|
3734
3738
|
{
|
|
3735
3739
|
"path": "skills/lit-pptx/references/tonalities/chalk.md",
|
|
3736
|
-
"sha256": "
|
|
3740
|
+
"sha256": "b6d10b50437a6e46e498425fa0bd4d2e3943b33af7180d9935e87b79d9f8ce5f"
|
|
3737
3741
|
},
|
|
3738
3742
|
{
|
|
3739
3743
|
"path": "skills/lit-pptx/references/tonalities/gazette.md",
|
|
3740
|
-
"sha256": "
|
|
3744
|
+
"sha256": "d26daffd3c7229f1cf017ebe130e3be1fff04ef6a8c2d71bec62ab101f740aba"
|
|
3741
3745
|
},
|
|
3742
3746
|
{
|
|
3743
3747
|
"path": "skills/lit-pptx/references/tonalities/ledger.md",
|
|
3744
|
-
"sha256": "
|
|
3748
|
+
"sha256": "530dd885b308a92607aa3d961399d54975869960ff82e312d61052e861f092a5"
|
|
3745
3749
|
},
|
|
3746
3750
|
{
|
|
3747
3751
|
"path": "skills/lit-pptx/references/tonalities/night.md",
|
|
3748
|
-
"sha256": "
|
|
3752
|
+
"sha256": "c60f7f08c79fe71f4d2b7c567f77109eb9b0c17a8d59509aca62ff47cb8119ac"
|
|
3749
3753
|
},
|
|
3750
3754
|
{
|
|
3751
3755
|
"path": "skills/lit-pptx/references/tonalities/paper.md",
|
|
3752
|
-
"sha256": "
|
|
3756
|
+
"sha256": "e33f03bada9548a29086a71055d8c4ecc1cd4cd346dbd8d8d4490c13a0d7c424"
|
|
3753
3757
|
},
|
|
3754
3758
|
{
|
|
3755
3759
|
"path": "skills/lit-pptx/references/tonalities/signal.md",
|
|
3756
|
-
"sha256": "
|
|
3760
|
+
"sha256": "4af361cb2bdf658f032a77adf9095c56ff37be083c1eeb60b9937dfe0e2c1993"
|
|
3757
3761
|
},
|
|
3758
3762
|
{
|
|
3759
3763
|
"path": "skills/lit-pptx/references/tonalities/studio.md",
|
|
3760
|
-
"sha256": "
|
|
3764
|
+
"sha256": "82b93ab9369fc2e9cc3ee375bd714a975f321af56480922533ab70a01cb8dce0"
|
|
3761
3765
|
},
|
|
3762
3766
|
{
|
|
3763
3767
|
"path": "skills/lit-pptx/runtime/package-lock.json",
|
|
@@ -3785,7 +3789,7 @@
|
|
|
3785
3789
|
},
|
|
3786
3790
|
{
|
|
3787
3791
|
"path": "skills/lit-pptx/scripts/deck_output.py",
|
|
3788
|
-
"sha256": "
|
|
3792
|
+
"sha256": "928cf0a8e22988c059b787047439362f6056413b1b2b494b4bb0e32f8e4211eb"
|
|
3789
3793
|
},
|
|
3790
3794
|
{
|
|
3791
3795
|
"path": "skills/lit-pptx/scripts/embed_fonts.py",
|
|
@@ -3845,7 +3849,7 @@
|
|
|
3845
3849
|
},
|
|
3846
3850
|
{
|
|
3847
3851
|
"path": "skills/lit-pptx/scripts/lib/render-pack.js",
|
|
3848
|
-
"sha256": "
|
|
3852
|
+
"sha256": "967783ec4023c66c9f849f811e9b48e884f20ee6ac9e1bef264f7b794c2b3346"
|
|
3849
3853
|
},
|
|
3850
3854
|
{
|
|
3851
3855
|
"path": "skills/lit-pptx/scripts/lib/slide-ast.js",
|
|
@@ -3857,15 +3861,15 @@
|
|
|
3857
3861
|
},
|
|
3858
3862
|
{
|
|
3859
3863
|
"path": "skills/lit-pptx/scripts/lib/template-registry.js",
|
|
3860
|
-
"sha256": "
|
|
3864
|
+
"sha256": "145cefcf8d21b54045c6fc67ae059755a2fed7e375918c0af0e23826ddd21d79"
|
|
3861
3865
|
},
|
|
3862
3866
|
{
|
|
3863
3867
|
"path": "skills/lit-pptx/scripts/qa_deck.py",
|
|
3864
|
-
"sha256": "
|
|
3868
|
+
"sha256": "5ce04775a3737276fd7518240e104525c52ce020cf22b311714af19b8fa8755b"
|
|
3865
3869
|
},
|
|
3866
3870
|
{
|
|
3867
3871
|
"path": "skills/lit-pptx/scripts/validate_pptx.py",
|
|
3868
|
-
"sha256": "
|
|
3872
|
+
"sha256": "dbca7e6106ac9f767d61c8f1f9c113624991b9d12526df3b26ac52f8145f029a"
|
|
3869
3873
|
},
|
|
3870
3874
|
{
|
|
3871
3875
|
"path": "skills/lit-pptx/slide-formats/markdown-slide-spec-v1.md",
|
|
@@ -3937,35 +3941,35 @@
|
|
|
3937
3941
|
},
|
|
3938
3942
|
{
|
|
3939
3943
|
"path": "skills/lit-pptx/templates/tonalities/atlas/pack.yaml",
|
|
3940
|
-
"sha256": "
|
|
3944
|
+
"sha256": "9eb26f4796425816ec2691270c6d7a566482b148234bef0e259192726d5ee1a3"
|
|
3941
3945
|
},
|
|
3942
3946
|
{
|
|
3943
3947
|
"path": "skills/lit-pptx/templates/tonalities/chalk/pack.yaml",
|
|
3944
|
-
"sha256": "
|
|
3948
|
+
"sha256": "b54ab8c33219a5df54e6965b825d5688f338d74986d0fbc80300d089e6801f1e"
|
|
3945
3949
|
},
|
|
3946
3950
|
{
|
|
3947
3951
|
"path": "skills/lit-pptx/templates/tonalities/gazette/pack.yaml",
|
|
3948
|
-
"sha256": "
|
|
3952
|
+
"sha256": "1c210b4e537b4233647d40c34f9d42cd3564838180f32a964c453a0f8f2ee6b1"
|
|
3949
3953
|
},
|
|
3950
3954
|
{
|
|
3951
3955
|
"path": "skills/lit-pptx/templates/tonalities/ledger/pack.yaml",
|
|
3952
|
-
"sha256": "
|
|
3956
|
+
"sha256": "7a697afe423be320c1450a85d23ea8e77280fb5ada175b3838068cf0138d259e"
|
|
3953
3957
|
},
|
|
3954
3958
|
{
|
|
3955
3959
|
"path": "skills/lit-pptx/templates/tonalities/night/pack.yaml",
|
|
3956
|
-
"sha256": "
|
|
3960
|
+
"sha256": "7142a4695e245056a1a38243028c502580b7b075c3c31e78a5512700e2cbf760"
|
|
3957
3961
|
},
|
|
3958
3962
|
{
|
|
3959
3963
|
"path": "skills/lit-pptx/templates/tonalities/paper/pack.yaml",
|
|
3960
|
-
"sha256": "
|
|
3964
|
+
"sha256": "70f3bf8ee490abcf6e56968adbc6c3a218a2377724be6f3414a7cec000ea5d0f"
|
|
3961
3965
|
},
|
|
3962
3966
|
{
|
|
3963
3967
|
"path": "skills/lit-pptx/templates/tonalities/signal/pack.yaml",
|
|
3964
|
-
"sha256": "
|
|
3968
|
+
"sha256": "c4c92302e739b1a9f4fde25b2961272207a56a943cb8dde94cbd3a401b05a7d8"
|
|
3965
3969
|
},
|
|
3966
3970
|
{
|
|
3967
3971
|
"path": "skills/lit-pptx/templates/tonalities/studio/pack.yaml",
|
|
3968
|
-
"sha256": "
|
|
3972
|
+
"sha256": "fc1ed798a6a8fc192fdc27dfcb08f2ef4bfb72e63e9233c0b2c85ec75d76558f"
|
|
3969
3973
|
},
|
|
3970
3974
|
{
|
|
3971
3975
|
"path": "skills/lit-recap/SKILL.md",
|
|
@@ -4401,7 +4405,7 @@
|
|
|
4401
4405
|
},
|
|
4402
4406
|
{
|
|
4403
4407
|
"path": "skills/visual-qa/references/complete-contract.md",
|
|
4404
|
-
"sha256": "
|
|
4408
|
+
"sha256": "ef0594bda950ddedc47f7a438759a461fdd9c8f718cd0dd04d2f1792ae7c6ae5"
|
|
4405
4409
|
},
|
|
4406
4410
|
{
|
|
4407
4411
|
"path": "skills/visual-qa/schemas/evidence-manifest-v1alpha1.schema.json",
|
|
@@ -445,7 +445,7 @@ isolated Hermes home. Use `--hermes-home`; never `--home`.
|
|
|
445
445
|
|
|
446
446
|
```text
|
|
447
447
|
$ node packages/lithermes-installer/bin/lithermes.js install --yes --offline --no-hud --hermes-home "$ISOLATED"
|
|
448
|
-
Installed LitHermes 1.0.
|
|
448
|
+
Installed LitHermes 1.0.18
|
|
449
449
|
plugin: $ISOLATED/plugins/lithermes
|
|
450
450
|
model config: updated
|
|
451
451
|
|
|
@@ -462,7 +462,7 @@ installed payload: PASS
|
|
|
462
462
|
enabled config: PASS
|
|
463
463
|
|
|
464
464
|
$ hermes lithermes doctor
|
|
465
|
-
[OK] plugin.yaml readable (version 1.0.
|
|
465
|
+
[OK] plugin.yaml readable (version 1.0.18)
|
|
466
466
|
[OK] skills bundled: 36
|
|
467
467
|
[OK] litgoal durable runtime importable
|
|
468
468
|
```
|
|
@@ -6,7 +6,7 @@ threshold is never the fix.
|
|
|
6
6
|
## Grid and margins by density
|
|
7
7
|
|
|
8
8
|
A4; sides never under 25 mm, bottom never under top, text block 150-160 mm. Pack defaults are
|
|
9
|
-
density 9 (Proposal 8)
|
|
9
|
+
density 9 (Proposal 8).
|
|
10
10
|
|
|
11
11
|
| Density | Margins top / bottom / left / right (mm) | Text block (mm) | Body size | Pitch ko / en | Word multiple ko / en |
|
|
12
12
|
|---|---|---|---|---|---|
|
|
@@ -120,8 +120,6 @@ node <installed-plugin>/skills/lit-pptx/bin/office.mjs gate report.docx --source
|
|
|
120
120
|
| `folio.total` | "page / total" counts real pages |
|
|
121
121
|
| `sidebar.overlap` | a floating sidebar ends before the next heading |
|
|
122
122
|
|
|
123
|
-
The median fill is reported against the pack target, not failed.
|
|
124
|
-
|
|
125
123
|
### Restraint checks (A4.11)
|
|
126
124
|
|
|
127
125
|
Fail on tonality documents, advise elsewhere; `date.iso` holds everywhere.
|
|
@@ -246,7 +246,7 @@ def shape_table(doc, table, texts: list[list[str]]) -> None:
|
|
|
246
246
|
for ci in range(cols):
|
|
247
247
|
column = [row[ci] for row in texts if ci < len(row)]
|
|
248
248
|
want.append(max([width_of(t) for t in column] + [4.0]))
|
|
249
|
-
# Each column first gets its natural width
|
|
249
|
+
# Each column first gets its natural width, capped at 45% of the line.
|
|
250
250
|
unit = Inches(0.085)
|
|
251
251
|
cap = usable * 0.45
|
|
252
252
|
natural = [min(w * unit, cap) for w in want]
|
|
@@ -376,7 +376,7 @@ def html_to_docx(html: str, doc: Document, md_path: Path):
|
|
|
376
376
|
html_to_docx(str(element), doc, md_path)
|
|
377
377
|
|
|
378
378
|
|
|
379
|
-
# =========================================================================== M1
|
|
379
|
+
# =========================================================================== M1: Journal workflow
|
|
380
380
|
|
|
381
381
|
|
|
382
382
|
def _load_yaml():
|
|
@@ -651,7 +651,7 @@ def apply_table_style(doc, design: dict) -> None:
|
|
|
651
651
|
for table in doc.tables:
|
|
652
652
|
table.style = None # detach Table Grid
|
|
653
653
|
if table.autofit and table.rows and table.columns:
|
|
654
|
-
# A table no builder has measured yet gets a fixed page-width grid, so Word cannot squeeze its cells
|
|
654
|
+
# A table no builder has measured yet gets a fixed page-width grid, so Word cannot squeeze its cells.
|
|
655
655
|
section = doc.sections[0]
|
|
656
656
|
available = section.page_width - section.left_margin - section.right_margin
|
|
657
657
|
weights = [
|
|
@@ -699,14 +699,14 @@ def apply_table_style(doc, design: dict) -> None:
|
|
|
699
699
|
_add_border("insideV", "nil", "0") # explicit no verticals
|
|
700
700
|
tblPr.append(tblBorders)
|
|
701
701
|
|
|
702
|
-
# Bold header row + add bottom border only to header cells so the thicker rule sits under the header
|
|
702
|
+
# Bold header row + add bottom border only to header cells so the thicker rule sits under the header.
|
|
703
703
|
if table.rows:
|
|
704
704
|
header_row = table.rows[0]
|
|
705
705
|
for cell in header_row.cells:
|
|
706
706
|
for p in cell.paragraphs:
|
|
707
707
|
for r in p.runs:
|
|
708
708
|
r.bold = True
|
|
709
|
-
# Remove insideH to prevent inner body rules
|
|
709
|
+
# Remove insideH to prevent inner body rules.
|
|
710
710
|
insideH = tblBorders.find(qn("w:insideH"))
|
|
711
711
|
if insideH is not None:
|
|
712
712
|
insideH.set(qn("w:val"), "nil")
|
|
@@ -900,7 +900,7 @@ def apply_cjk_font_pairing(doc, font_cfg: dict) -> None:
|
|
|
900
900
|
def _walk(paragraphs):
|
|
901
901
|
for para in paragraphs:
|
|
902
902
|
for run in para.runs:
|
|
903
|
-
# Only fix runs that already have a font set to something other than the registry-banned default
|
|
903
|
+
# Only fix runs that already have a font set to something other than the registry-banned default.
|
|
904
904
|
current_name = run.font.name
|
|
905
905
|
if current_name and current_name != "Courier New":
|
|
906
906
|
_set_run_fonts(run, latin, cjk)
|
|
@@ -973,7 +973,7 @@ def inject_title_block(doc, frontmatter: dict, design: dict) -> None:
|
|
|
973
973
|
)
|
|
974
974
|
_add_run(tp, str(title), tb.get("title", {}).get("size_pt", 18), bold=True)
|
|
975
975
|
|
|
976
|
-
# Report-style frontmatter
|
|
976
|
+
# Report-style frontmatter adds a subtitle and a byline.
|
|
977
977
|
if frontmatter.get("subtitle"):
|
|
978
978
|
sp = _p_center(13, space_after=6)
|
|
979
979
|
_add_run(sp, str(frontmatter["subtitle"]), 13)
|
|
@@ -1223,7 +1223,7 @@ def convert_md_to_docx(
|
|
|
1223
1223
|
|
|
1224
1224
|
# Pre-MD micro-typography filters
|
|
1225
1225
|
if detected_locale in ("ko", "mixed"):
|
|
1226
|
-
# On every path
|
|
1226
|
+
# On every path, Korean text loses ISO dates before the dash filter.
|
|
1227
1227
|
body = docx_design.korean_dates(body)
|
|
1228
1228
|
if frontmatter.get("date"):
|
|
1229
1229
|
frontmatter["date"] = docx_design.format_date(frontmatter["date"], "ko")
|
|
@@ -1233,7 +1233,7 @@ def convert_md_to_docx(
|
|
|
1233
1233
|
text = fix_quotes(fix_dashes(text, dash_rules))
|
|
1234
1234
|
return normalize_double_spaces(fix_ellipsis(fix_unit_spacing(text)))
|
|
1235
1235
|
|
|
1236
|
-
#
|
|
1236
|
+
# Only text between ::: fence lines is typeset.
|
|
1237
1237
|
pieces = re.split(r"^([ \t]*:{3,}.*)$", body, flags=re.M)
|
|
1238
1238
|
body = "".join(piece if index % 2 else typeset(piece) for index, piece in enumerate(pieces))
|
|
1239
1239
|
|
|
@@ -59,7 +59,7 @@ LABELS = {
|
|
|
59
59
|
}
|
|
60
60
|
PACK_KEYS = {"schema_version", "tonality", "summary", "dials", "docx", "design"}
|
|
61
61
|
DESIGN_KEYS = {"ramp", "numbering", "h1_rule", "title_block", "contents", "summary_form", "conclusion_first", "running_head", "justify",
|
|
62
|
-
"palette", "accent_on", "page_geometry", "components", "figure_style", "
|
|
62
|
+
"palette", "accent_on", "page_geometry", "components", "figure_style", "spacing"}
|
|
63
63
|
ACCENT_PLACES = ("title_rule", "callout_rule", "sidebar_rule")
|
|
64
64
|
DIRECTIVE_KEYS = {
|
|
65
65
|
"cover": {"variant", "image", "kicker"},
|
|
@@ -101,7 +101,7 @@ def _half(x: float) -> float:
|
|
|
101
101
|
return math.floor(x * 2 + 0.5) / 2
|
|
102
102
|
|
|
103
103
|
|
|
104
|
-
# Margins (top, bottom, left, right) in mm by density
|
|
104
|
+
# Margins (top, bottom, left, right) in mm by density; sides never go under 25 mm.
|
|
105
105
|
MARGINS = [(2, (30, 32, 30, 30)), (4, (28, 30, 28, 28)), (6, (27, 29, 27, 27)), (8, (26, 28, 26, 26)), (9, (25, 27, 25, 25)), (10, (24, 26, 25, 25))]
|
|
106
106
|
|
|
107
107
|
|
|
@@ -776,7 +776,7 @@ def setup_styles(doc, T: Tonality):
|
|
|
776
776
|
set_run_fonts(doc.styles[name].element.get_or_add_rPr(), *head_font)
|
|
777
777
|
except KeyError:
|
|
778
778
|
pass
|
|
779
|
-
# Every style the document carries is in ink, including the ones this build does not use
|
|
779
|
+
# Every style the document carries is in ink, including the ones this build does not use.
|
|
780
780
|
for el in doc.styles.element.iter(qn("w:color")):
|
|
781
781
|
el.set(qn("w:val"), ink)
|
|
782
782
|
for key in ("themeColor", "themeShade", "themeTint"):
|
|
@@ -990,7 +990,7 @@ def add_columns(ctx, d: Directive):
|
|
|
990
990
|
gap = float(d.attrs.get("gap") or T.column_gap_mm)
|
|
991
991
|
parts = COLUMN_BREAK.split(d.body)
|
|
992
992
|
if len(parts) > 1 and n > 1:
|
|
993
|
-
# The author placed the break
|
|
993
|
+
# The author placed the break, one cell per part.
|
|
994
994
|
side_by_side(ctx, parts[: n - 1] + ["\n\n".join(parts[n - 1:])], gap, d.attrs.get("rule") in ("true", "1"))
|
|
995
995
|
return
|
|
996
996
|
ctx.section_break(cols=n, gap=gap, rule=d.attrs.get("rule") in ("true", "1"))
|
|
@@ -1452,12 +1452,12 @@ def treat_headings(doc, T: Tonality):
|
|
|
1452
1452
|
continue # a level under a missing parent stays unnumbered
|
|
1453
1453
|
number = heading_number(scheme, counters, level)
|
|
1454
1454
|
if number and scheme == "roman-ko":
|
|
1455
|
-
# The institute manner
|
|
1455
|
+
# The institute manner sets "Ⅴ. 소요 예산" with one space.
|
|
1456
1456
|
_prefix_runs(p, [(number, None, T.colour("ink"), True), (" ", None, T.colour("ink"), False)])
|
|
1457
1457
|
elif number:
|
|
1458
1458
|
_prefix_runs(p, [(number, None, T.colour("ink"), True), "\t"])
|
|
1459
1459
|
numbered.append((p, level, number))
|
|
1460
|
-
# Decimal numbers
|
|
1460
|
+
# Decimal numbers hang one width per level.
|
|
1461
1461
|
hang = {}
|
|
1462
1462
|
for _, level, number in numbered:
|
|
1463
1463
|
need = _advance(number, T.sizes[f"h{level}"]) * 1.1 / 2.835 + 3
|
|
@@ -1637,7 +1637,7 @@ def keep_heading_with_table(doc):
|
|
|
1637
1637
|
while after is not None and between(after):
|
|
1638
1638
|
Paragraph(after, doc._body).paragraph_format.keep_with_next = True
|
|
1639
1639
|
after = after.getnext()
|
|
1640
|
-
# A short lead (about two lines) and a table of up to eight body rows
|
|
1640
|
+
# A short lead (about two lines) and a table of up to eight body rows move together.
|
|
1641
1641
|
rows = len(after.findall(qn("w:tr"))) if after is not None and after.tag == qn("w:tbl") else 99
|
|
1642
1642
|
if after is not None and after.tag == qn("w:tbl") and rows <= 9 and len(re.sub(r"\s+", "", "".join(t.text or "" for t in lead.iter(qn("w:t"))))) <= 200:
|
|
1643
1643
|
p.paragraph_format.keep_with_next = True
|
|
@@ -1979,7 +1979,7 @@ def finish_tables(doc, T: Tonality, lang: str):
|
|
|
1979
1979
|
nxt = table._tbl.getnext()
|
|
1980
1980
|
noted = nxt is not None and nxt.tag == qn("w:p") and bool(SOURCE_LINE.match("".join(t.text or "" for t in nxt.iter(qn("w:t"))).strip()))
|
|
1981
1981
|
rows = list(table.rows)
|
|
1982
|
-
# A long table (header + 6 body rows or more) may break between rows, header repeated,
|
|
1982
|
+
# A long table (header + 6 body rows or more) may break between rows, header repeated, with a quarter page left.
|
|
1983
1983
|
head, filled = 0, 0.0
|
|
1984
1984
|
while head < len(rows) and (head < 4 or filled < 0.25 * frame_h):
|
|
1985
1985
|
filled += heights[head]
|
|
@@ -2350,7 +2350,7 @@ def build(doc, front: dict, body: str, T: Tonality, render_md, lang: str, filter
|
|
|
2350
2350
|
_check(cover.attrs.get("variant") or "typographic", COVERS, f"line {cover.line}: cover variant")
|
|
2351
2351
|
if not front.get("title"):
|
|
2352
2352
|
raise DesignError(f"line {cover.line}: a cover takes its title from frontmatter title:, which is missing")
|
|
2353
|
-
# Key figures never stand on a cover
|
|
2353
|
+
# Key figures never stand on a cover.
|
|
2354
2354
|
figures = [b for b in split_directives(cover.body, cover.line) if isinstance(b, Directive) and b.name == "keyfigures"]
|
|
2355
2355
|
if figures and not T.neutral:
|
|
2356
2356
|
if "keyfigures" in T.allowed_kinds:
|
|
@@ -83,7 +83,7 @@ def norm(text: str) -> str:
|
|
|
83
83
|
return text.translate(str.maketrans({"–": "-", "—": "-", "‘": "'", "’": "'", "“": '"', "”": '"'}))
|
|
84
84
|
|
|
85
85
|
|
|
86
|
-
# ── heading.declarative ───────────────────────────────────────────────────── A heading names what its section
|
|
86
|
+
# ── heading.declarative ───────────────────────────────────────────────────── A heading names what its section covers.
|
|
87
87
|
|
|
88
88
|
KO_SENTENCE = re.compile(r"(?:니다|[어아해세에예네지군래게]요|죠|[었았였했겠됐](?:다|음)|[가-힣]다|[가-힣](?:함|됨)|(?:있|없)음)$")
|
|
89
89
|
KO_LABEL_WORDS = {"바다", "판다", "소다", "람다", "캐나다", "어젠다", "아젠다", "포함", "보다", "함", "다", "중심", "가능성", "다음"}
|
|
@@ -480,7 +480,7 @@ def structure(path: Path) -> dict:
|
|
|
480
480
|
body = ET.fromstring(z.read("word/document.xml")).find(W + "body")
|
|
481
481
|
caps = [((t.find(f"{W}tblPr/{W}tblCaption").get(W + "val") if t.find(f"{W}tblPr/{W}tblCaption") is not None else "") or "")
|
|
482
482
|
for t in body.iter(W + "tbl")]
|
|
483
|
-
# A cover page
|
|
483
|
+
# A cover page ends its section before any heading.
|
|
484
484
|
cover_page = False
|
|
485
485
|
sects = [el.find(f"{W}pPr/{W}sectPr") for el in body if el.tag == W + "p" and el.find(f"{W}pPr/{W}sectPr") is not None]
|
|
486
486
|
sects.append(body.find(W + "sectPr"))
|
|
@@ -734,11 +734,11 @@ def paged(info: dict, pages: list[dict], tonality: bool, front: dict | None = No
|
|
|
734
734
|
if not exempt and fill < FILL_MIN:
|
|
735
735
|
found.append(finding("fill.page", "FAIL", i, f"page {i} is filled to {fill:.2f} of its frame (floor {FILL_MIN})",
|
|
736
736
|
"Let the next block move up: drop a forced break, keep a short section with its neighbour, or move a table under its text."))
|
|
737
|
-
# A memo that spills under a quarter of a page onto page 2 is a one-page memo set loosely
|
|
737
|
+
# A memo that spills under a quarter of a page onto page 2 is a one-page memo set loosely.
|
|
738
738
|
if info.get("memo") and n == 2 and fills[-1]["fill"] < MEMO_SPILL:
|
|
739
739
|
found.append(finding("memo.fit", "FAIL", 2, f"the memo runs onto a second page filled to {fills[-1]['fill']:.2f} of its frame",
|
|
740
740
|
"Set the memo on one page: the Memo pack's tight spacing, or shorten the text by the lines that spill."))
|
|
741
|
-
# A second page filled under a third of its frame is a one-page document set loosely or a block left over
|
|
741
|
+
# A second page filled under a third of its frame is a one-page document set loosely or a block left over.
|
|
742
742
|
if not info.get("memo") and n >= 2:
|
|
743
743
|
last = fills[-1]["fill"]
|
|
744
744
|
if n == 2 and last < SPILL_SECOND:
|
|
@@ -809,7 +809,7 @@ def paged(info: dict, pages: list[dict], tonality: bool, front: dict | None = No
|
|
|
809
809
|
if block["t"] == "h":
|
|
810
810
|
find(block["text"])
|
|
811
811
|
elif block["t"] == "tbl" and block["component"] in ("keyfigures", "callout", "sidebar"):
|
|
812
|
-
# A component box is short by design
|
|
812
|
+
# A component box is short by design.
|
|
813
813
|
hits = []
|
|
814
814
|
for text in block.get("cells", []):
|
|
815
815
|
if len(text) < 2:
|
|
@@ -919,7 +919,7 @@ def paged(info: dict, pages: list[dict], tonality: bool, front: dict | None = No
|
|
|
919
919
|
# the box's own lines share its left edge; body lines that open alike stand elsewhere
|
|
920
920
|
mine = []
|
|
921
921
|
if anchor:
|
|
922
|
-
# the
|
|
922
|
+
# The box is its title line and the lines that follow it.
|
|
923
923
|
mine = [anchor]
|
|
924
924
|
for bx in sorted((b for b in boxes if b[1] > anchor[1] and b[0] >= anchor[0] - 24), key=lambda b: b[1]):
|
|
925
925
|
if bx[1] - mine[-1][3] > 20:
|