@litfamily/litopencode 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.
Files changed (32) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README-Ko-KR.md +10 -10
  3. package/README.md +10 -10
  4. package/dist/deliverable-hedge-guard.js +3 -1
  5. package/dist/hooks.js +2 -1
  6. package/docs/assets/readme/badge-version.svg +1 -1
  7. package/package.json +1 -1
  8. package/skills/lit-docx/scripts/docx_design.py +1 -1
  9. package/skills/lit-docx/templates/tonalities/brief.yaml +0 -1
  10. package/skills/lit-docx/templates/tonalities/journal.yaml +0 -1
  11. package/skills/lit-docx/templates/tonalities/manual.yaml +0 -1
  12. package/skills/lit-docx/templates/tonalities/memo.yaml +0 -1
  13. package/skills/lit-docx/templates/tonalities/proposal.yaml +0 -1
  14. package/skills/lit-docx/templates/tonalities/report.yaml +0 -1
  15. package/skills/lit-pptx/references/tonalities/atlas.md +3 -4
  16. package/skills/lit-pptx/references/tonalities/chalk.md +2 -2
  17. package/skills/lit-pptx/references/tonalities/gazette.md +3 -3
  18. package/skills/lit-pptx/references/tonalities/ledger.md +6 -7
  19. package/skills/lit-pptx/references/tonalities/night.md +3 -3
  20. package/skills/lit-pptx/references/tonalities/paper.md +4 -5
  21. package/skills/lit-pptx/references/tonalities/signal.md +3 -4
  22. package/skills/lit-pptx/references/tonalities/studio.md +3 -3
  23. package/skills/lit-pptx/scripts/validate_pptx.py +10 -4
  24. package/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +0 -6
  25. package/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +0 -6
  26. package/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +0 -6
  27. package/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +2 -8
  28. package/skills/lit-pptx/templates/tonalities/night/pack.yaml +0 -6
  29. package/skills/lit-pptx/templates/tonalities/paper/pack.yaml +0 -6
  30. package/skills/lit-pptx/templates/tonalities/signal/pack.yaml +0 -6
  31. package/skills/lit-pptx/templates/tonalities/studio/pack.yaml +0 -6
  32. package/skills/managed-skill-manifest.json +24 -24
package/CHANGELOG.md CHANGED
@@ -5,6 +5,12 @@ are tracked separately from this product history.
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## 1.0.18 - 2026-10-09
9
+
10
+ - The prose check that runs before a file is written now works inside OpenCode. It used to start under OpenCode's own program instead of Node and to look for the new text in the wrong place, so it never saw a write. It now stops an added line such as an unrequested source label before the file is saved, adds a short note after the write when the wording only needs a second look, and checks the text of the Word, PowerPoint and PDF files a session creates.
11
+ - The eight deck looks and six document looks no longer list settings the engines never applied, such as tabular figures, chart annotation, picture bleed and crop, and page-fill targets, and their reference pages no longer promise them. Decks and documents come out exactly as before.
12
+ - The deck check treats a one-word placeholder term such as "todo", "tbd", "fixme" or "placeholder" as a word. A word like "Mastodon" no longer fails a deck, while "TODO:", "TODOs" and "(TBD)" still do.
13
+
8
14
  ## 1.0.17 - 2026-10-08
9
15
 
10
16
  - `lit-pptx` now decides how a deck should look before it builds anything. It reads what the deck is for and who will see it, then picks one of eight looks: one for dense reviews that are read closely, one for pitches, one for decks led by pictures, one for teaching, one for research talks, one for Korean briefing pages, one for editorial portfolios and one for data talks on a dark screen. The reply names the look, says why it fits and offers two alternatives. A bare request gets no style questions.
package/README-Ko-KR.md CHANGED
@@ -1,6 +1,6 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitOpenCode 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitOpenCode 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
2
2
 
3
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/readme/ascii-readme.svg" width="480" alt="LIT ASCII B 마크" /></p>
3
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/readme/ascii-readme.svg" width="480" alt="LIT ASCII B 마크" /></p>
4
4
 
5
5
  <details>
6
6
  <summary>ASCII 로고 복사</summary>
@@ -32,14 +32,14 @@
32
32
 
33
33
  # LitOpenCode
34
34
 
35
- [English](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/README.md) · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/README-Ko-KR.md)
35
+ [English](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/README.md) · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/README-Ko-KR.md)
36
36
 
37
37
  > **불씨를 건네받았다.**<br>
38
38
  > **이제, 당신의 작업에 옮길 차례다.**
39
39
 
40
40
  <p align="center">
41
- <a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/readme/badge-version.svg" alt="1.0.17" /></a>
42
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/readme/badge-license.svg" alt="MIT 라이선스" /></a>
41
+ <a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/readme/badge-version.svg" alt="1.0.18" /></a>
42
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/readme/badge-license.svg" alt="MIT 라이선스" /></a>
43
43
  </p>
44
44
 
45
45
  LitOpenCode는 OpenCode에 워크플로 agent, 슬래시 명령, 로컬 근거 기록을 더합니다.
@@ -99,7 +99,7 @@ OpenAI 제공자를 쓰면 새로 설치했을 때 계획과 검토는 GPT-6 Ast
99
99
  - planner는 계획만 세웁니다. `lit-plan`은 `edit`, `bash`, `task` 권한이 거부되어 있고, 더 느슨한 `balanced`나 `yolo` 모드를 직접 골라도 그대로입니다.
100
100
  - LitOpenCode는 대화형으로 시작할 때와 install이나 doctor가 성공한 뒤에 스스로 업데이트할 수 있습니다. 끄려면 `--no-auto-update`를 붙이거나 `LITOPENCODE_NO_AUTO_UPDATE=1`을 설정하세요.
101
101
  - 스킬 학습 기능은 제거되었습니다. 이전 릴리스가 프로젝트의 `.litopencode` 폴더에 남긴 학습 기록은 더 이상 쓰이지 않으니, 남겨 두든 지우든 편한 대로 하면 됩니다.
102
- - Jev 스킬 힌트는 선택 기능이고 기본값은 꺼짐입니다. 켜면 조건에 맞는 프롬프트가 TypeSafe로 전송되니, 먼저 [Jev 스킬 힌트 참조 문서](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/reference-Ko-KR.md#jev-스킬-힌트-선택)를 읽어 보세요. 알림과 doctor 줄이 어떻게 보이는지는 [GitHub 페이지](https://github.com/wjgoarxiv/litopencode/blob/master/README-Ko-KR.md#화면에서-보이는-것)에서 볼 수 있습니다.
102
+ - Jev 스킬 힌트는 선택 기능이고 기본값은 꺼짐입니다. 켜면 조건에 맞는 프롬프트가 TypeSafe로 전송되니, 먼저 [Jev 스킬 힌트 참조 문서](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/reference-Ko-KR.md#jev-스킬-힌트-선택)를 읽어 보세요. 알림과 doctor 줄이 어떻게 보이는지는 [GitHub 페이지](https://github.com/wjgoarxiv/litopencode/blob/master/README-Ko-KR.md#화면에서-보이는-것)에서 볼 수 있습니다.
103
103
  - 뭔가 이상하면 `npm exec --package @litfamily/litopencode@latest -- litopencode doctor`로 패키지와 설정 상태를 확인하세요.
104
104
 
105
105
  ## 제거
@@ -110,11 +110,11 @@ OpenAI 제공자를 쓰면 새로 설치했을 때 계획과 검토는 GPT-6 Ast
110
110
  npm uninstall -g @litfamily/litopencode
111
111
  ```
112
112
 
113
- 남겨 둘 만한 설치 파일과 기록은 [제거 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/reference-Ko-KR.md#제거)에 정리되어 있습니다.
113
+ 남겨 둘 만한 설치 파일과 기록은 [제거 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/reference-Ko-KR.md#제거)에 정리되어 있습니다.
114
114
 
115
115
  ## 더 보기
116
116
 
117
117
  - [GitHub 전체 안내](https://github.com/wjgoarxiv/litopencode/blob/master/README-Ko-KR.md)
118
- - [워크플로 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/reference-Ko-KR.md) · [English reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/reference.md)
119
- - [마이그레이션 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/migration.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/CHANGELOG.md) · [개인정보와 네트워크 동작](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/privacy.md)
120
- - [MIT 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/LICENSE) · [ASCII 글꼴 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/readme/JetBrainsMono-OFL.txt)
118
+ - [워크플로 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/reference-Ko-KR.md) · [English reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/reference.md)
119
+ - [마이그레이션 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/migration.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/CHANGELOG.md) · [개인정보와 네트워크 동작](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/privacy.md)
120
+ - [MIT 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/LICENSE) · [ASCII 글꼴 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/readme/JetBrainsMono-OFL.txt)
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitOpenCode robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitOpenCode 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/litopencode@1.0.17/docs/assets/readme/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
3
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/readme/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
4
4
 
5
5
  <details>
6
6
  <summary>Copy ASCII logo</summary>
@@ -32,13 +32,13 @@
32
32
 
33
33
  # LitOpenCode
34
34
 
35
- [English](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/README.md) · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/README-Ko-KR.md)
35
+ [English](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/README.md) · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/README-Ko-KR.md)
36
36
 
37
37
  **Keep the work lit.**
38
38
 
39
39
  <p align="center">
40
- <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/readme/badge-version.svg" alt="1.0.17" /></a>
41
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
40
+ <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/readme/badge-version.svg" alt="1.0.18" /></a>
41
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
42
42
  </p>
43
43
 
44
44
  LitOpenCode adds workflow agents, slash commands, and a local evidence ledger to OpenCode.
@@ -98,7 +98,7 @@ With the OpenAI provider, a fresh install uses GPT-6 Astra (`gpt-6-astra`) at `x
98
98
  - The planner only plans. `lit-plan` has `edit`, `bash` and `task` denied, and it stays that way even if you choose the looser `balanced` or `yolo` mode.
99
99
  - LitOpenCode can update itself when it starts interactively and after an install or doctor run succeeds. To turn that off, pass `--no-auto-update` or set `LITOPENCODE_NO_AUTO_UPDATE=1`.
100
100
  - Skill learning has been removed. Learning records an earlier release left in a project's `.litopencode` folder are no longer used; keep or delete them as you like.
101
- - The Jev skill hint is optional and off by default. Turning it on sends eligible prompts to TypeSafe, so read the [Jev skill hint reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/reference.md#jev-skill-hint-optional) first. The GitHub page shows [what the toast and the doctor line look like](https://github.com/wjgoarxiv/litopencode#what-you-will-see).
101
+ - The Jev skill hint is optional and off by default. Turning it on sends eligible prompts to TypeSafe, so read the [Jev skill hint reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/reference.md#jev-skill-hint-optional) first. The GitHub page shows [what the toast and the doctor line look like](https://github.com/wjgoarxiv/litopencode#what-you-will-see).
102
102
  - If something seems off, `npm exec --package @litfamily/litopencode@latest -- litopencode doctor` checks the package and your configuration.
103
103
 
104
104
  ## Uninstall
@@ -109,11 +109,11 @@ There's no uninstall command. Remove the `@litfamily/litopencode` entry from the
109
109
  npm uninstall -g @litfamily/litopencode
110
110
  ```
111
111
 
112
- The [removal reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/reference.md#remove) covers the installed files and records you may want to keep.
112
+ The [removal reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/reference.md#remove) covers the installed files and records you may want to keep.
113
113
 
114
114
  ## More
115
115
 
116
116
  - [Full guide on GitHub](https://github.com/wjgoarxiv/litopencode#readme)
117
- - [Workflow reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/reference.md) · [한국어 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/reference-Ko-KR.md)
118
- - [Migration notes](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/migration.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/CHANGELOG.md) · [Privacy and network behavior](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/privacy.md)
119
- - [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/LICENSE) · [ASCII font license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.17/docs/assets/readme/JetBrainsMono-OFL.txt)
117
+ - [Workflow reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/reference.md) · [한국어 상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/reference-Ko-KR.md)
118
+ - [Migration notes](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/migration.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/CHANGELOG.md) · [Privacy and network behavior](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/privacy.md)
119
+ - [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/LICENSE) · [ASCII font license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.18/docs/assets/readme/JetBrainsMono-OFL.txt)
@@ -2,6 +2,7 @@ import { spawn } from "node:child_process";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
+ import { childNodeExecutable } from "./cli/auto-update.js";
5
6
  import { mutatedFilePaths } from "./tool-guards.js";
6
7
  const defaultTimeoutMs = 1500;
7
8
  const maxTextBytes = 4 * 1024 * 1024;
@@ -108,7 +109,8 @@ function runJsonProcess(command, args, input, timeoutMs) {
108
109
  });
109
110
  }
110
111
  async function defaultScan(request, timeoutMs) {
111
- const raw = await runJsonProcess(process.execPath, [detectorWorker], JSON.stringify(request), timeoutMs);
112
+ // Inside OpenCode, process.execPath is the Bun host binary, which cannot run the worker script.
113
+ const raw = await runJsonProcess(childNodeExecutable(), [detectorWorker], JSON.stringify(request), timeoutMs);
112
114
  const parsed = JSON.parse(raw);
113
115
  if (!Array.isArray(parsed.findings))
114
116
  throw new Error("detector returned an invalid response");
package/dist/hooks.js CHANGED
@@ -7,7 +7,8 @@ export function createToolExecuteBeforeHook(options = {}) {
7
7
  return async (input, output) => {
8
8
  await applyTaskRecursionGuard(input, options.getSession);
9
9
  applyLitOpenCodeToolBeforeHook(input, output);
10
- await options.deliverableHedgeGuard?.before(input);
10
+ // OpenCode sends the tool arguments only in output.args before a call.
11
+ await options.deliverableHedgeGuard?.before({ ...input, args: output.args ?? input.args });
11
12
  };
12
13
  }
13
14
  export function createToolExecuteAfterHook(options = {}) {
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.17"><title>release: 1.0.17</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="390" transform="scale(.1)">release</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.17</text></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.18"><title>release: 1.0.18</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="390" transform="scale(.1)">release</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.18</text></g></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litfamily/litopencode",
3
- "version": "1.0.17",
3
+ "version": "1.0.18",
4
4
  "description": "LitOpenCode OpenCode plugin bootstrap package.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -58,7 +58,7 @@ LABELS = {
58
58
  }
59
59
  PACK_KEYS = {"schema_version", "tonality", "summary", "dials", "docx", "design"}
60
60
  DESIGN_KEYS = {"ramp", "numbering", "h1_rule", "title_block", "contents", "summary_form", "conclusion_first", "running_head", "justify",
61
- "palette", "accent_on", "page_geometry", "components", "figure_style", "fill", "spacing"}
61
+ "palette", "accent_on", "page_geometry", "components", "figure_style", "spacing"}
62
62
  ACCENT_PLACES = ("title_rule", "callout_rule", "sidebar_rule")
63
63
  DIRECTIVE_KEYS = {
64
64
  "cover": {"variant", "image", "kicker"},
@@ -26,4 +26,3 @@ design:
26
26
  allowed: [callout, columns]
27
27
  callout_max: 1
28
28
  figure_style: {max_height_ratio: 0.40}
29
- fill: {min_page_fill: 0.35, target_median_fill: 0.80}
@@ -23,4 +23,3 @@ design:
23
23
  components:
24
24
  allowed: [callout]
25
25
  figure_style: {max_height_ratio: 0.40}
26
- fill: {min_page_fill: 0.35, target_median_fill: 0.80}
@@ -24,4 +24,3 @@ design:
24
24
  allowed: [callout, sidebar, columns]
25
25
  sidebar: {default_width: third, float: right}
26
26
  figure_style: {max_height_ratio: 0.45}
27
- fill: {min_page_fill: 0.35, target_median_fill: 0.80}
@@ -22,6 +22,5 @@ design:
22
22
  components:
23
23
  allowed: []
24
24
  figure_style: {max_height_ratio: 0.40}
25
- fill: {min_page_fill: 0.35, target_median_fill: 0.80}
26
25
  # A memo keeps to one page while its content allows: the low end of the line pitch, closer heading space.
27
26
  spacing: tight
@@ -24,4 +24,3 @@ design:
24
24
  callout_max: 1
25
25
  keyfigures: {per_row: 3}
26
26
  figure_style: {max_height_ratio: 0.60}
27
- fill: {min_page_fill: 0.35, target_median_fill: 0.75}
@@ -24,4 +24,3 @@ design:
24
24
  allowed: [keyfigures, callout, columns]
25
25
  keyfigures: {per_row: 3}
26
26
  figure_style: {max_height_ratio: 0.45}
27
- fill: {min_page_fill: 0.35, target_median_fill: 0.80}
@@ -34,7 +34,7 @@ colour; the pack's own accent is a quiet navy. Pack file: `templates/tonalities/
34
34
  ## Type
35
35
 
36
36
  Pretendard throughout. Compact ramp at density 10. Titles at normal tracking, display slightly
37
- tight; figures proportional.
37
+ tight.
38
38
 
39
39
  ## Dials
40
40
 
@@ -73,9 +73,8 @@ Display devices: cover `plate`, statement `drench`, big number on a tint, closin
73
73
 
74
74
  - Tables `light-grid`: no header fill, row rules, no banding, numbers right-aligned, totals bold.
75
75
  A table can only appear inside a family that holds one (kpi-row, a closing).
76
- - Charts: hairline gridlines, direct labels, annotation off.
77
- - Images: bleed allowed, crop allowed, no frame; pictures are cropped to their box with their own
78
- proportions, never stretched.
76
+ - Charts: hairline gridlines, direct labels.
77
+ - Images: no frame; pictures are cropped to their box with their own proportions, never stretched.
79
78
 
80
79
  ## Decoration vocabulary
81
80
 
@@ -74,8 +74,8 @@ Display devices: cover `rail`, statement `drench`, big number on a tint, closing
74
74
 
75
75
  - Tables `header-fill`: a pale apricot header with dark rust labels, row rules, no banding, numbers
76
76
  right-aligned, totals bold.
77
- - Charts (if a chart appears in a table-insight): hairline gridlines, direct labels, annotation on.
78
- - Images bleed on one side only, no crop, no frame.
77
+ - Charts (if a chart appears in a table-insight): hairline gridlines, direct labels.
78
+ - Images: no frame.
79
79
 
80
80
  ## Decoration vocabulary
81
81
 
@@ -33,7 +33,7 @@ Pack file: `templates/tonalities/gazette/pack.yaml`.
33
33
 
34
34
  ## Type
35
35
 
36
- Pretendard throughout. Compact ramp at density 10 (body 13 pt, tables 11 pt). Figures tabular.
36
+ Pretendard throughout. Compact ramp at density 10 (body 13 pt, tables 11 pt).
37
37
 
38
38
  ## Dials
39
39
 
@@ -71,8 +71,8 @@ outline, and `index: true`: a section page repeats the agenda with the current p
71
71
 
72
72
  - Tables `header-fill`: slate blue header with white labels, a full grid of rules, pale slate
73
73
  banding, numbers right-aligned, totals bold. The densest table style of the eight.
74
- - Charts: hairline gridlines, direct labels, annotation off.
75
- - Images: no bleed, no crop, hairline frame.
74
+ - Charts: hairline gridlines, direct labels.
75
+ - Images: hairline frame.
76
76
 
77
77
  ## Decoration vocabulary
78
78
 
@@ -1,6 +1,6 @@
1
1
  # Ledger
2
2
 
3
- Ledger sets a deck like a set of accounts made readable: small exact type, tabular figures, and
3
+ Ledger sets a deck like a set of accounts made readable: small exact type, with
4
4
  tables and figure rows doing most of the talking. Colour is rationed to two jobs, marking the
5
5
  current period and the one number that matters. Pack file: `templates/tonalities/ledger/pack.yaml`.
6
6
 
@@ -36,8 +36,7 @@ current period and the one number that matters. Pack file: `templates/tonalities
36
36
 
37
37
  Pretendard Regular and Bold throughout (A2Z display and numerals only with `faces: a2z`). At
38
38
  density 10 the compact ramp applies: body 13 pt, labels and table cells 11 pt, sources 9 pt, titles
39
- 26 pt. Figures are tabular (`type-voice.figures: tabular`), so columns of numbers align digit for
40
- digit. Titles track slightly tight; Latin text is sentence case.
39
+ 26 pt. Titles track slightly tight.
41
40
 
42
41
  ## Dials
43
42
 
@@ -78,10 +77,10 @@ with the current part marked.
78
77
  ## Tables and charts
79
78
 
80
79
  - Tables in the `ledger` style: the header row is the deck's one dark mass (dark teal field, white
81
- labels); rules under the header and above the totals only; no banding; numbers right-aligned in
82
- tabular figures; totals bold.
83
- - Charts: hairline gridlines, direct labels, one accent on muted series, annotation on.
84
- - Images (rare here): side bleed only, no crop, hairline frame.
80
+ labels); rules under the header and above the totals only; no banding; numbers right-aligned;
81
+ totals bold.
82
+ - Charts: hairline gridlines, direct labels, one accent on muted series.
83
+ - Images (rare here): hairline frame.
85
84
 
86
85
  ## Decoration vocabulary
87
86
 
@@ -33,7 +33,7 @@ is dark from cover to closing. Pack file: `templates/tonalities/night/pack.yaml`
33
33
 
34
34
  ## Type
35
35
 
36
- Pretendard throughout. Compact ramp at density 10; display tracks tight (−2); figures tabular. On a
36
+ Pretendard throughout. Compact ramp at density 10; display tracks tight (−2). On a
37
37
  dark ground thin light type below 18 pt is avoided, which is why Night never uses a light weight.
38
38
 
39
39
  ## Dials
@@ -72,11 +72,11 @@ Display devices: cover `numeral`, statement `open`, big number on a tint, closin
72
72
 
73
73
  - Tables `header-fill`: dark slate header with off-white labels, row rules, no banding, numbers
74
74
  right-aligned, totals bold, the protagonist row tinted umber.
75
- - Charts: hairline gridlines, direct labels, amber on one series with the rest muted, annotation on.
75
+ - Charts: hairline gridlines, direct labels, amber on one series with the rest muted.
76
76
  Charts are drawn native and editable, with the pack's body face named for Hangul axis labels.
77
77
  The amber goes to the current series: the latest period, else the measured series over its plan
78
78
  or target, else the last.
79
- - Images: side bleed only, crop allowed, no frame.
79
+ - Images: no frame.
80
80
  - Figures brought in as pictures: a chart or diagram exported on white stands here as a white card
81
81
  with small grey labels. Put its dark variant beside it, named with `.dark` before the extension
82
82
  (`assets/flow.png` and `assets/flow.dark.png`); Night draws the variant at full size, and the gate
@@ -31,8 +31,7 @@ method". Pack file: `templates/tonalities/paper/pack.yaml`.
31
31
 
32
32
  ## Type
33
33
 
34
- Pretendard throughout. Compact ramp at density 10; titles at normal tracking; figures tabular so
35
- result columns align.
34
+ Pretendard throughout. Compact ramp at density 10; titles at normal tracking.
36
35
 
37
36
  ## Dials
38
37
 
@@ -71,10 +70,10 @@ Display devices: cover `rules`, statement `rules`, big number in an `outline`, c
71
70
  ## Tables and charts
72
71
 
73
72
  - Tables in `booktabs` style: no header fill, horizontal rules over and under the header and at
74
- the foot only, no vertical rules, no banding, numbers right-aligned in tabular figures, totals bold.
73
+ the foot only, no vertical rules, no banding, numbers right-aligned, totals bold.
75
74
  - Charts: hairline gridlines, direct labels, series in order (the first series takes the crimson,
76
- so put the proposed method first), annotation off.
77
- - Images: no bleed, no crop, no frame; every figure has a numbered caption from its alt text.
75
+ so put the proposed method first).
76
+ - Images: no frame; every figure has a numbered caption from its alt text.
78
77
 
79
78
  ## Decoration vocabulary
80
79
 
@@ -37,8 +37,7 @@ Because the accent is red, a loss is never red here; write the sign (`▼ 4%`, `
37
37
  ## Type
38
38
 
39
39
  Pretendard throughout; A2Z only on request. Compact ramp at density 10 (body 13, title 26,
40
- display 36). Display text tracks tighter (−2) than titles (−1); figures are proportional, which
41
- suits large single numbers more than columns.
40
+ display 36). Display text tracks tighter (−2) than titles (−1).
42
41
 
43
42
  ## Dials
44
43
 
@@ -78,8 +77,8 @@ Display devices: cover `drench`, statement `open`, big number on a `field` panel
78
77
 
79
78
  - Tables `open`: no header fill, rules at top and bottom only, no banding, numbers right-aligned,
80
79
  totals bold, and the protagonist row tinted pale coral.
81
- - Charts: no gridlines, direct labels, the accent on one series and the rest muted, annotation on.
82
- - Images may bleed and crop; no frame.
80
+ - Charts: no gridlines, direct labels, the accent on one series and the rest muted.
81
+ - Images: no frame.
83
82
 
84
83
  ## Decoration vocabulary
85
84
 
@@ -32,7 +32,7 @@ tinted panels, and a dark ochre accent marks the one thing to look at. Pack file
32
32
 
33
33
  ## Type
34
34
 
35
- Pretendard throughout. Compact ramp at density 10; display tracks tight (−2). Figures proportional.
35
+ Pretendard throughout. Compact ramp at density 10; display tracks tight (−2).
36
36
 
37
37
  ## Dials
38
38
 
@@ -76,9 +76,9 @@ big number on a tint, closing step in a `band`.
76
76
 
77
77
  - Tables `open`: no header fill, one rule under the header, no banding, numbers right-aligned,
78
78
  totals bold. Studio lists no table family, so tables appear only as KPI rows and closing asks.
79
- - Charts: no gridlines, direct labels, the accent on one series, annotation on. Column hairlines run
79
+ - Charts: no gridlines, direct labels, the accent on one series. Column hairlines run
80
80
  in the gutter beside a chart's takeaways.
81
- - Images may bleed and crop; no frame.
81
+ - Images: no frame.
82
82
 
83
83
  ## Decoration vocabulary
84
84
 
@@ -52,18 +52,24 @@ def _load_terms() -> tuple[list[str], list[str], bool, bool]:
52
52
  )
53
53
 
54
54
 
55
- def _build_regex(terms: list[str], case_insensitive: bool, whole_word: bool) -> re.Pattern[str] | None:
55
+ def _build_regex(terms: list[str], case_insensitive: bool, whole_word: bool, latin_words: bool = False) -> re.Pattern[str] | None:
56
56
  if not terms:
57
57
  return None
58
58
  # An acronym (RAM, FTO) is a word in capitals: matched as that word, so "diagram" or "program"
59
- # does not contain it. Every other term keeps the file's case and word settings.
59
+ # does not contain it. With latin_words, a one-word Latin term (todo, tbd) is matched as a word or
60
+ # its plain plural ("TODOs") in any case, so "Mastodon" does not contain it. Every other term keeps
61
+ # the file's case and word settings.
60
62
  acronyms = [term for term in terms if re.fullmatch(r"[A-Z]{2,5}", term)]
61
- escaped = [re.escape(term) for term in terms if term not in acronyms]
63
+ words = [term for term in terms if latin_words and term not in acronyms and re.fullmatch(r"[A-Za-z]+", term)]
64
+ escaped = [re.escape(term) for term in terms if term not in acronyms and term not in words]
62
65
  pattern = "|".join(escaped)
63
66
  if whole_word and pattern:
64
67
  pattern = rf"(?:(?<=\W)|^)(?:{pattern})(?:(?=\W)|$)"
65
68
  if case_insensitive and pattern:
66
69
  pattern = f"(?i:{pattern})"
70
+ if words:
71
+ word_pattern = rf"(?<![A-Za-z])(?:{'|'.join(map(re.escape, words))})s?(?![A-Za-z])"
72
+ pattern = "|".join(filter(None, [pattern, f"(?i:{word_pattern})" if case_insensitive else word_pattern]))
67
73
  if acronyms:
68
74
  pattern = "|".join(filter(None, [pattern, rf"(?<![A-Za-z])(?:{'|'.join(map(re.escape, acronyms))})(?![A-Za-z])"]))
69
75
  return re.compile(pattern)
@@ -138,7 +144,7 @@ def _slide_has_title(slide, slide_height: int | None) -> bool:
138
144
  def lint(path: str | Path) -> dict[str, Any]:
139
145
  prs = Presentation(str(path))
140
146
  hard_terms, soft_terms, case_insensitive, whole_word = _load_terms()
141
- hard_re = _build_regex(hard_terms, case_insensitive, whole_word)
147
+ hard_re = _build_regex(hard_terms, case_insensitive, whole_word, latin_words=True)
142
148
  soft_re = _build_regex(soft_terms, case_insensitive, whole_word)
143
149
 
144
150
  missing_titles: list[int] = []
@@ -47,8 +47,6 @@ hero: false
47
47
  type-voice:
48
48
  title-tracking: 0
49
49
  display-tracking: -1
50
- latin-case: sentence
51
- figures: proportional
52
50
 
53
51
  density: 10
54
52
  variance: 7
@@ -85,16 +83,12 @@ table:
85
83
  header-ink: ink
86
84
  rules: rows
87
85
  banding: none
88
- numbers: right-tabular
89
86
  totals: bold
90
87
  chart:
91
88
  gridlines: hairline
92
89
  labels: direct
93
90
  highlight: accent-on-muted
94
- annotation: off
95
91
  image:
96
- bleed: allowed
97
- crop: allowed
98
92
  frame: none
99
93
 
100
94
  fill-order: [anchor-visual, change-family, distribute, step-up]
@@ -47,8 +47,6 @@ hero: false
47
47
  type-voice:
48
48
  title-tracking: -1
49
49
  display-tracking: -1
50
- latin-case: sentence
51
- figures: proportional
52
50
 
53
51
  density: 10
54
52
  variance: 6
@@ -91,16 +89,12 @@ table:
91
89
  header-ink: accent-deep
92
90
  rules: rows
93
91
  banding: none
94
- numbers: right-tabular
95
92
  totals: bold
96
93
  chart:
97
94
  gridlines: hairline
98
95
  labels: direct
99
96
  highlight: accent-on-muted
100
- annotation: on
101
97
  image:
102
- bleed: side-only
103
- crop: none
104
98
  frame: none
105
99
 
106
100
  fill-order: [distribute, step-up, change-family, anchor-visual]
@@ -48,8 +48,6 @@ hero: false
48
48
  type-voice:
49
49
  title-tracking: -1
50
50
  display-tracking: -1
51
- latin-case: sentence
52
- figures: tabular
53
51
 
54
52
  density: 10
55
53
  variance: 4
@@ -86,16 +84,12 @@ table:
86
84
  header-ink: on-field
87
85
  rules: grid
88
86
  banding: surface
89
- numbers: right-tabular
90
87
  totals: bold
91
88
  chart:
92
89
  gridlines: hairline
93
90
  labels: direct
94
91
  highlight: accent-on-muted
95
- annotation: off
96
92
  image:
97
- bleed: none
98
- crop: none
99
93
  frame: hairline
100
94
 
101
95
  fill-order: [step-up, distribute, change-family, anchor-visual]
@@ -1,5 +1,5 @@
1
- # Ledger: a set of accounts made readable. Small, exact type, numbers in tabular
2
- # figures, tables and KPI rows doing most of the talking; colour marks only "this
1
+ # Ledger: a set of accounts made readable. Small, exact type, tables and KPI rows
2
+ # doing most of the talking; colour marks only "this
3
3
  # period" and the one figure that matters. Wrong for a live pitch with little data
4
4
  # or for a briefing that is read as prose.
5
5
  id: ledger
@@ -48,8 +48,6 @@ hero: false
48
48
  type-voice:
49
49
  title-tracking: -1
50
50
  display-tracking: -1
51
- latin-case: sentence
52
- figures: tabular
53
51
 
54
52
  density: 10
55
53
  variance: 5
@@ -87,16 +85,12 @@ table:
87
85
  header-ink: on-field
88
86
  rules: header-and-totals
89
87
  banding: none
90
- numbers: right-tabular
91
88
  totals: bold
92
89
  chart:
93
90
  gridlines: hairline
94
91
  labels: direct
95
92
  highlight: accent-on-muted
96
- annotation: on
97
93
  image:
98
- bleed: side-only
99
- crop: none
100
94
  frame: hairline
101
95
 
102
96
  fill-order: [step-up, distribute, anchor-visual, change-family]
@@ -47,8 +47,6 @@ hero: false
47
47
  type-voice:
48
48
  title-tracking: -1
49
49
  display-tracking: -2
50
- latin-case: sentence
51
- figures: tabular
52
50
 
53
51
  density: 10
54
52
  variance: 6
@@ -85,17 +83,13 @@ table:
85
83
  header-ink: ink
86
84
  rules: rows
87
85
  banding: none
88
- numbers: right-tabular
89
86
  totals: bold
90
87
  protagonist: accent-tint
91
88
  chart:
92
89
  gridlines: hairline
93
90
  labels: direct
94
91
  highlight: accent-on-muted
95
- annotation: on
96
92
  image:
97
- bleed: side-only
98
- crop: allowed
99
93
  frame: none
100
94
 
101
95
  fill-order: [anchor-visual, step-up, distribute, change-family]
@@ -47,8 +47,6 @@ hero: false
47
47
  type-voice:
48
48
  title-tracking: 0
49
49
  display-tracking: -1
50
- latin-case: sentence
51
- figures: tabular
52
50
 
53
51
  density: 10
54
52
  variance: 5
@@ -91,16 +89,12 @@ table:
91
89
  header-ink: ink
92
90
  rules: booktabs
93
91
  banding: none
94
- numbers: right-tabular
95
92
  totals: bold
96
93
  chart:
97
94
  gridlines: hairline
98
95
  labels: direct
99
96
  highlight: series-order
100
- annotation: off
101
97
  image:
102
- bleed: none
103
- crop: none
104
98
  frame: none
105
99
 
106
100
  fill-order: [anchor-visual, distribute, step-up, change-family]
@@ -48,8 +48,6 @@ hero: false
48
48
  type-voice:
49
49
  title-tracking: -1
50
50
  display-tracking: -2
51
- latin-case: sentence
52
- figures: proportional
53
51
 
54
52
  density: 10
55
53
  variance: 6
@@ -86,17 +84,13 @@ table:
86
84
  header-ink: ink
87
85
  rules: top-bottom
88
86
  banding: none
89
- numbers: right-tabular
90
87
  totals: bold
91
88
  protagonist: accent-tint
92
89
  chart:
93
90
  gridlines: none
94
91
  labels: direct
95
92
  highlight: accent-on-muted
96
- annotation: on
97
93
  image:
98
- bleed: allowed
99
- crop: allowed
100
94
  frame: none
101
95
 
102
96
  fill-order: [step-up, change-family, anchor-visual, distribute]
@@ -47,8 +47,6 @@ hero: false
47
47
  type-voice:
48
48
  title-tracking: -1
49
49
  display-tracking: -2
50
- latin-case: sentence
51
- figures: proportional
52
50
 
53
51
  density: 10
54
52
  variance: 8
@@ -85,16 +83,12 @@ table:
85
83
  header-ink: ink
86
84
  rules: header-rule
87
85
  banding: none
88
- numbers: right-tabular
89
86
  totals: bold
90
87
  chart:
91
88
  gridlines: none
92
89
  labels: direct
93
90
  highlight: accent-on-muted
94
- annotation: on
95
91
  image:
96
- bleed: allowed
97
- crop: allowed
98
92
  frame: none
99
93
 
100
94
  fill-order: [change-family, step-up, anchor-visual, distribute]
@@ -3496,35 +3496,35 @@
3496
3496
  },
3497
3497
  {
3498
3498
  "path": "references/tonalities/atlas.md",
3499
- "sha256": "6ffea9e214ba51eb8119b38280e88d892255baf546ce508e8807e2aaa025c7b1"
3499
+ "sha256": "d14b91f16d0806fbc0b10c47a3ed7e70da1ceb15554233eb2f7d98fe4142e533"
3500
3500
  },
3501
3501
  {
3502
3502
  "path": "references/tonalities/chalk.md",
3503
- "sha256": "a563b5d7167144d8e2437f5a10b889c6a956b20743c9f804b1c6270b375a87e7"
3503
+ "sha256": "64820aa7af08a8055bc8fba13be4b9931c2d7c89e9e24c010c820827d5adecba"
3504
3504
  },
3505
3505
  {
3506
3506
  "path": "references/tonalities/gazette.md",
3507
- "sha256": "3bff34e6fae94ccae96db13817483e5f27be166a00616f96f13653453e1d3f3d"
3507
+ "sha256": "c2d0a132216b3e90a24f5f4b3077e9a96d7b380c72a14f3dbea638679e617a63"
3508
3508
  },
3509
3509
  {
3510
3510
  "path": "references/tonalities/ledger.md",
3511
- "sha256": "44aee4353bca00a06c163aa5e9b2cb9acba96fb03c09d4bf1cad34512f5e97ca"
3511
+ "sha256": "f65609d7597b7401da8e36e4dae641545f1b1defefc7fc7c3951ff671b7ae954"
3512
3512
  },
3513
3513
  {
3514
3514
  "path": "references/tonalities/night.md",
3515
- "sha256": "c4d7f67bbc988a326eb992ad1e888729ed755fd1d282e4ed6da6cf4d9268f983"
3515
+ "sha256": "de252baa2378ad4b1322633a84499292a98d6ad87c5bef3266b19e862d48ff50"
3516
3516
  },
3517
3517
  {
3518
3518
  "path": "references/tonalities/paper.md",
3519
- "sha256": "b3106e5cefd4e7d36ce3ee15d33ee5bd07e07cd297f30eb118d92a526d225882"
3519
+ "sha256": "309078f91112dd8b38618688b3cf3a3f3907b1223bfc17c5897c0f9af21ddcb6"
3520
3520
  },
3521
3521
  {
3522
3522
  "path": "references/tonalities/signal.md",
3523
- "sha256": "d7b5a2e2ff0d66cb5562df5ec98b4418737a1d7e21199958c32500673e9223f2"
3523
+ "sha256": "4db11121ed61483a9c9ff42d1a6810eaed91c163a5a53b29d0a2b2cff4345de5"
3524
3524
  },
3525
3525
  {
3526
3526
  "path": "references/tonalities/studio.md",
3527
- "sha256": "848178f9666e857843be3c83e9fe21def4a1ec666c7854b6d6d6afabc53934c9"
3527
+ "sha256": "4ea17f436916dfb514a4f41e7e77c34b948147d304c57572766b9cc9ccb48d51"
3528
3528
  },
3529
3529
  {
3530
3530
  "path": "requirements.in",
@@ -3632,7 +3632,7 @@
3632
3632
  },
3633
3633
  {
3634
3634
  "path": "scripts/validate_pptx.py",
3635
- "sha256": "3a0830acf3a647878bacd599f4ade17462a83c0a24cbda378bb69a6a05b4d362"
3635
+ "sha256": "5309464302eaf8c2984818fa96703c8bb06da7f10ae1e633b056ab23c587dbce"
3636
3636
  },
3637
3637
  {
3638
3638
  "path": "specs/markdown-slide-spec-v1.md",
@@ -3712,35 +3712,35 @@
3712
3712
  },
3713
3713
  {
3714
3714
  "path": "templates/tonalities/atlas/pack.yaml",
3715
- "sha256": "1a55367348e8304266e6038a34ec1c84060e3667c9f42c1707e2818c01b535da"
3715
+ "sha256": "9ab2b4ee7ff517bb2102e4d5621ca061d7963bb10d699ff1c312dc7be4aa7f4f"
3716
3716
  },
3717
3717
  {
3718
3718
  "path": "templates/tonalities/chalk/pack.yaml",
3719
- "sha256": "e386a50ad64fd12a8457af60379682892c3e41e2ff5a536afee0a2167ffa00a7"
3719
+ "sha256": "5aed521353fca689ffc82d7749d611e87fa1cd63735e364bdb1bf60645120281"
3720
3720
  },
3721
3721
  {
3722
3722
  "path": "templates/tonalities/gazette/pack.yaml",
3723
- "sha256": "b9f58d62e14bd18d004a928210e01678db923895c8d117f8f93d06286c31ce6c"
3723
+ "sha256": "8711484cd457829afa60990922611d9b2efd3930a0138345e389b15fa8115c1b"
3724
3724
  },
3725
3725
  {
3726
3726
  "path": "templates/tonalities/ledger/pack.yaml",
3727
- "sha256": "67a4a4fa8ecd9d98c0780d3a49610ccc83993d4f20ee7a875d1fe3c32f3da369"
3727
+ "sha256": "28d874b3512ace3e726d03021a128e72c6966b91fbaa72d6b63d9c1761c786fb"
3728
3728
  },
3729
3729
  {
3730
3730
  "path": "templates/tonalities/night/pack.yaml",
3731
- "sha256": "631c84ee1388b8d69673bf392b704d4d4061433b12957a29c16c37dd5875eb33"
3731
+ "sha256": "f151a840cc2253d4132891ed6135ed4c6e597379434fcee34540ee566590b1cc"
3732
3732
  },
3733
3733
  {
3734
3734
  "path": "templates/tonalities/paper/pack.yaml",
3735
- "sha256": "f93ab4059ddfd2bcfff93e73112d158620b80f770a9b9fdac678ed4615e5b3e7"
3735
+ "sha256": "4b386272a7ed9e420777bb48daf55caf591cf4e443adb11c5e621b1e3626d0f3"
3736
3736
  },
3737
3737
  {
3738
3738
  "path": "templates/tonalities/signal/pack.yaml",
3739
- "sha256": "db5d0acb28b845ec3049afb84678f1d03d4670e0a607a1aeb9e7141e3fcbb9eb"
3739
+ "sha256": "784ba047d0e993b7e7d8ebb6c0d354ad0666468801f0ccb3008ff370f0a1acf9"
3740
3740
  },
3741
3741
  {
3742
3742
  "path": "templates/tonalities/studio/pack.yaml",
3743
- "sha256": "4fb169a8c2cd4807fadfcbead64e3cf85927fb7d61da2796090ec31ad5c80a25"
3743
+ "sha256": "3e6778f16c846220b4f4e66ab3e8149d6c382fe01b007a57d59f03bbcc73363b"
3744
3744
  }
3745
3745
  ]
3746
3746
  },
@@ -3883,7 +3883,7 @@
3883
3883
  },
3884
3884
  {
3885
3885
  "path": "scripts/docx_design.py",
3886
- "sha256": "26dcb3f4b98807dd6deb872a3623a5a8263492a61ef060453b420784c001d8ef"
3886
+ "sha256": "c50193501d2326f381ed0c2b3f295592ca0d53eac764aa32233e3f2ebb19002d"
3887
3887
  },
3888
3888
  {
3889
3889
  "path": "scripts/docx_layout.py",
@@ -3975,27 +3975,27 @@
3975
3975
  },
3976
3976
  {
3977
3977
  "path": "templates/tonalities/brief.yaml",
3978
- "sha256": "73a466263bad4f876671de0121b117223f0659f896d99cabde76e8d6a86385f5"
3978
+ "sha256": "41bf481cd799b28ee53538a3cf88a58c4b2f9db365d1ca1ee10b3adfcad1ab8e"
3979
3979
  },
3980
3980
  {
3981
3981
  "path": "templates/tonalities/journal.yaml",
3982
- "sha256": "aae647c0d62e6b801923651df754933e92c3db8c07c0fe7e12977e1c8473e028"
3982
+ "sha256": "0a7ae34ccd6e91f289c472bfeb8bcfd6736005f15c55a63dd4cc43e55606ec57"
3983
3983
  },
3984
3984
  {
3985
3985
  "path": "templates/tonalities/manual.yaml",
3986
- "sha256": "de31b0bfa3dc46d172b84af6d60ade9ac1411ba0fb34bb2e402e3a0f80486c67"
3986
+ "sha256": "cc965f5523c7cbaa4c1d0bc06e5260641dfc8113b77f2c252862a397eb97ce84"
3987
3987
  },
3988
3988
  {
3989
3989
  "path": "templates/tonalities/memo.yaml",
3990
- "sha256": "70181fdc23f51b80c5584bd073c54db216a4a8601aa95f07507a9280e85d2f01"
3990
+ "sha256": "a78c339a193470e6762ffa03b948f44943eb25a5221c12ccbc06a1b2e7cb9e74"
3991
3991
  },
3992
3992
  {
3993
3993
  "path": "templates/tonalities/proposal.yaml",
3994
- "sha256": "7cf710c09ae8d30a208f59167e9b47f0222a2184231a68047aa596f2c7e135d4"
3994
+ "sha256": "b1b7f4875a89208939ca82d69e6cfb30c35b64ea91d67d5aecc98fe04bde3bfc"
3995
3995
  },
3996
3996
  {
3997
3997
  "path": "templates/tonalities/report.yaml",
3998
- "sha256": "ad8312bba2752e142ef40b560c13339f5411be73acb0f01634a4e744b215e5d8"
3998
+ "sha256": "23ac1d24f8936c6d522e19354d5948f0d00dce6d60c34fa42e37adafcc68cb8c"
3999
3999
  }
4000
4000
  ]
4001
4001
  }