@airmark/quiver 0.32.1 → 0.33.0

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 (76) hide show
  1. package/README.md +54 -18
  2. package/package.json +8 -6
  3. package/quills/af4141/0.1.0/Quill.yaml +1 -1
  4. package/quills/afmc_moa/0.0.1/Quill.yaml +10 -17
  5. package/quills/classic_resume/0.0.1/Quill.yaml +361 -0
  6. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/LICENSE +21 -0
  7. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/fonts/EBGaramond/EBGaramond-Bold.ttf +0 -0
  8. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/fonts/EBGaramond/EBGaramond-BoldItalic.ttf +0 -0
  9. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/fonts/EBGaramond/EBGaramond-Italic.ttf +0 -0
  10. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/fonts/EBGaramond/EBGaramond-Regular.ttf +0 -0
  11. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/fonts/EBGaramond/OFL.txt +94 -0
  12. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/src/components.typ +181 -0
  13. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/src/config.typ +53 -0
  14. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/src/layout.typ +57 -0
  15. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/src/lib.typ +6 -0
  16. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/src/util.typ +32 -0
  17. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/typst.toml +26 -0
  18. package/quills/classic_resume/0.0.1/plate.typ +143 -0
  19. package/quills/cyber_ribbon_chart/0.0.1/Quill.yaml +320 -0
  20. package/quills/cyber_ribbon_chart/0.0.1/plate.typ +428 -0
  21. package/quills/daf1206/0.1.0/Quill.yaml +1 -2
  22. package/quills/daf4392/0.1.0/Quill.yaml +15 -1
  23. package/quills/daf4392/0.1.0/plate.typ +2 -2
  24. package/quills/usaf_letter/0.1.0/Quill.yaml +214 -0
  25. package/quills/usaf_letter/0.1.0/assets/dod_seal.png +0 -0
  26. package/quills/usaf_letter/0.1.0/assets/dow_seal.png +0 -0
  27. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/.gitignore +7 -0
  28. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/LICENSE +201 -0
  29. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/Cinzel/Cinzel-Regular.ttf +0 -0
  30. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/Cinzel/LICENSE +93 -0
  31. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/CopperplateCC/CopperplateCC-Bold.otf +0 -0
  32. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/CopperplateCC/CopperplateCC-Heavy.otf +0 -0
  33. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/CopperplateCC/LICENSE.md +79 -0
  34. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/LiberationMono/LICENSE +102 -0
  35. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/LiberationMono/LiberationMono-Regular.ttf +0 -0
  36. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/NimbusRomanNo9L/GNU General Public License.txt +340 -0
  37. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/NimbusRomanNo9L/NimbusRomNo9L-Med.otf +0 -0
  38. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/NimbusRomanNo9L/NimbusRomNo9L-MedIta.otf +0 -0
  39. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/NimbusRomanNo9L/NimbusRomNo9L-Reg.otf +0 -0
  40. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/NimbusRomanNo9L/NimbusRomNo9L-RegIta.otf +0 -0
  41. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/src/backmatter.typ +32 -0
  42. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/src/config.typ +45 -0
  43. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/src/frontmatter.typ +226 -0
  44. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/src/lib.typ +35 -0
  45. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/src/mainmatter.typ +140 -0
  46. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/src/primitives.typ +544 -0
  47. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/src/utils.typ +334 -0
  48. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/typst.toml +22 -0
  49. package/quills/usaf_letter/0.1.0/plate.typ +124 -0
  50. package/quills/usaf_memo/0.2.0/Quill.yaml +1 -1
  51. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/LICENSE +201 -21
  52. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/typst.toml +1 -1
  53. package/quills/usaf_memo/0.3.0/Quill.yaml +75 -56
  54. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/LICENSE +201 -21
  55. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel-Regular.ttf +0 -0
  56. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +29 -17
  57. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/body.typ +97 -126
  58. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/config.typ +12 -45
  59. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +81 -87
  60. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +58 -66
  61. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/lib.typ +14 -36
  62. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +47 -19
  63. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +178 -121
  64. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/utils.typ +41 -141
  65. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/typst.toml +3 -8
  66. package/quills/usaf_memo/0.3.0/plate.typ +89 -85
  67. package/templates/af4141.md +23 -0
  68. package/templates/appointment_letter.md +58 -0
  69. package/templates/daf1206.md +23 -0
  70. package/templates/daf4392.md +34 -0
  71. package/templates/pass_request.md +48 -0
  72. package/templates/rebuttal.md +63 -0
  73. package/templates/templates.json +58 -0
  74. package/templates/usaf_template.md +30 -0
  75. package/templates/ussf_template.md +30 -0
  76. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel[wght].ttf +0 -0
package/README.md CHANGED
@@ -7,14 +7,17 @@ and aligned to the current Quillmark spec.
7
7
 
8
8
  ## Contents
9
9
 
10
- | Quill | Version | Description |
11
- |--------------|---------|-----------------------------------------------------------------------------------|
12
- | `usaf_memo` | 0.3.0 | USAF / DAF Official Memorandum (AFH 33-337) |
13
- | `usaf_memo` | 0.2.0 | Previous release, retained so documents pinned to `@0.2` keep resolving |
14
- | `af4141` | 0.1.0 | AF Form 4141 — Individual's Record of Duties and Experience (Ground Environment) |
15
- | `daf1206` | 0.1.0 | DAF Form 1206 — Nomination for Award |
16
- | `daf4392` | 0.1.0 | DAF Form 4392 — Pre-Departure Safety Briefing (Page 2) |
17
- | `afmc_moa` | 0.0.1 | DoD Memorandum of Agreement (DoDI 4000.19) |
10
+ | Quill | Version | Description |
11
+ |----------------------|---------|----------------------------------------------------------------------------------|
12
+ | `usaf_memo` | 0.3.0 | USAF / DAF Official Memorandum (AFH 33-337) |
13
+ | `usaf_memo` | 0.2.0 | Previous release, retained so documents pinned to `@0.2` keep resolving |
14
+ | `usaf_letter` | 0.1.0 | USAF / DAF Personal Letter (AFH 33-337) |
15
+ | `af4141` | 0.1.0 | AF Form 4141 — Individual's Record of Duties and Experience (Ground Environment) |
16
+ | `daf1206` | 0.1.0 | DAF Form 1206 — Nomination for Award |
17
+ | `daf4392` | 0.1.0 | DAF Form 4392 — Pre-Departure Safety Briefing (Page 2) |
18
+ | `afmc_moa` | 0.0.1 | DoD Memorandum of Agreement (DoDI 4000.19) |
19
+ | `classic_resume` | 0.0.1 | Classic single-page resume |
20
+ | `cyber_ribbon_chart` | 0.0.1 | 17X Cyber Operations Officer ribbon chart and career vector planner |
18
21
 
19
22
  ## Install
20
23
 
@@ -22,8 +25,8 @@ and aligned to the current Quillmark spec.
22
25
  npm install @airmark/quiver @quillmark/quiver @quillmark/wasm
23
26
  ```
24
27
 
25
- This package ships only the source-quiver assets (`Quiver.yaml` + `quills/`) and
26
- exposes no JavaScript API. Loading is `@quillmark/quiver`'s, rendering is
28
+ This package ships the source-quiver assets (`Quiver.yaml` + `quills/`) and the
29
+ official [templates](#templates), and exposes no JavaScript API. Loading is `@quillmark/quiver`'s, rendering is
27
30
  `@quillmark/wasm`'s.
28
31
 
29
32
  ## Usage
@@ -94,8 +97,28 @@ quills/
94
97
  plate.typ
95
98
  assets/
96
99
  packages/
100
+ templates/
101
+ templates.json
102
+ <file>.md
97
103
  ```
98
104
 
105
+ ## Templates
106
+
107
+ `templates/` holds the official starter documents Tongue to Quill offers in its
108
+ template library. They sit beside the quiver rather than inside it: the quiver
109
+ loaders never read them, and a consumer reaches them as files, through
110
+ `@airmark/quiver/templates/templates.json` and the Markdown it names. Each entry
111
+ is `{ id, name, description, file, tags }`, and every listed template is live.
112
+
113
+ An entry's `id` is permanent. Tongue to Quill derives the template's row id and
114
+ its shareable short code from it, so renaming one retires the old template (its
115
+ stars and its short code with it) and publishes a new one. Removing an entry
116
+ retires it the same way.
117
+
118
+ `npm test` renders every template against this quiver after `quillkit test`, and
119
+ a warning fails it as an error does, so a quill change that breaks a template
120
+ fails here rather than on the app's build.
121
+
99
122
  ## Working on a quill
100
123
 
101
124
  Two verbs, and they answer different questions.
@@ -106,17 +129,17 @@ this collection's own `node_modules`, so the versions pinned here are the format
106
129
  the quiver is packed in and the wasm the gate renders through.
107
130
 
108
131
  **Does it work?** `quillkit test` loads the collection with `fromDir`, compiles
109
- every quill, and renders each one's example document — the blueprint seeded from
110
- the `example:` values in `Quill.yaml`. It is the gate CI runs, so a validation
111
- failure surfaces here rather than on a consumer's build:
132
+ every quill, and renders each one's seed: every field absent, rendering its
133
+ `default:` or its blank. It is the gate CI runs, so a validation failure
134
+ surfaces here rather than on a consumer's build:
112
135
 
113
136
  ```bash
114
137
  npm install
115
138
  npm test
116
139
  ```
117
140
 
118
- The gate renders nothing the schema did not write, so the coverage is the
119
- `example:` block: a field with no example is a field no render exercises.
141
+ The gate renders no answer, so a page with a long list or a wrapping value in
142
+ it is a design fixture's to exercise (`design/`), not the gate's.
120
143
 
121
144
  **What is it like to use?** `npm run dev` is `quillkit studio`: it packs this
122
145
  quiver, serves the studio client over it, and repacks on every save — pick a
@@ -134,7 +157,9 @@ wasm it was built against, and nothing at runtime reconciles the two. The gate
134
157
  is authoritative, studio is advisory.
135
158
 
136
159
  `npm run site` writes the arrangement a deploy serves into `site/` — the client
137
- at the root, a built quiver at `quiver/` beneath it — without serving it. CI
160
+ at the root, a built quiver at `quiver/` beneath it — without serving it. It
161
+ passes `--drafts`, so the `0.0.x` prototypes are packed beside the releases and
162
+ every deploy previews them as `npm run dev` does. CI
138
163
  uploads that on every run, so a pull request — a fork's included — is reviewed
139
164
  by downloading the artifact and serving the directory.
140
165
 
@@ -142,7 +167,18 @@ by downloading the artifact and serving the directory.
142
167
  that same command and keeps the deploy here: nothing outside this repository
143
168
  holds `pages: write`.
144
169
 
170
+ `vercel.json` deploys the same layout to Vercel, where a pull request gets a
171
+ preview URL instead of an artifact to download. It carries the build, the output
172
+ directory and the one cache rule a host owes this layout — `assets/*` immutable,
173
+ which is the engine, and everything else already right by default. Importing the
174
+ repository is the rest of the setup. Both deploys run off `main` and neither
175
+ knows about the other.
176
+
145
177
  ## License
146
178
 
147
- Apache-2.0. Individual quills carry their own licensing terms; see the
148
- `packages/` directory inside each quill for upstream font and template licenses.
179
+ Apache-2.0, the quill packages under `quills/` included, except
180
+ `classic_resume`'s `ttq-classic-resume`, which is MIT. Two things a quill
181
+ carries are not the project's to license: the fonts its package bundles, which
182
+ keep their own upstream terms — see the `packages/` directory inside each quill
183
+ — and the DoD and DoW seals under `quills/*/*/assets/`, which are US
184
+ Government insignia and whose use is governed as such.
package/package.json CHANGED
@@ -1,28 +1,30 @@
1
1
  {
2
2
  "name": "@airmark/quiver",
3
- "version": "0.32.1",
3
+ "version": "0.33.0",
4
4
  "description": "Airmark Quiver — Air Force and DAF document Quills for Quillmark.",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  "./Quiver.yaml": "./Quiver.yaml",
8
8
  "./quills/*": "./quills/*",
9
+ "./templates/*": "./templates/*",
9
10
  "./package.json": "./package.json"
10
11
  },
11
12
  "files": [
12
13
  "quills",
14
+ "templates",
13
15
  "Quiver.yaml"
14
16
  ],
15
17
  "engines": {
16
18
  "node": ">=24"
17
19
  },
18
20
  "devDependencies": {
19
- "@quillmark/quiver": "0.26.0",
20
- "@quillmark/wasm": "^0.109.1",
21
- "quillkit": "0.5.3"
21
+ "@quillmark/quiver": "0.30.0",
22
+ "@quillmark/wasm": "^0.116.0",
23
+ "quillkit": "0.9.0"
22
24
  },
23
25
  "scripts": {
24
- "test": "quillkit test",
25
- "site": "quillkit site --out site",
26
+ "test": "quillkit test && node scripts/check-templates.mjs",
27
+ "site": "quillkit site --out site --drafts",
26
28
  "dev": "quillkit studio"
27
29
  },
28
30
  "keywords": [
@@ -35,9 +35,9 @@ main:
35
35
 
36
36
  card_kinds:
37
37
  experience:
38
+ title: Record of Experience
38
39
  description: Each card represents one row in the Record of Experience table. Rows fill page 1 (up to 16 rows) then page 2 (up to 21 rows), for a maximum of 37 rows.
39
40
  ui:
40
- title: Record of Experience
41
41
  groups: [record]
42
42
  body:
43
43
  enabled: false
@@ -173,33 +173,29 @@ main:
173
173
 
174
174
  card_kinds:
175
175
  background:
176
+ title: Background
176
177
  description: "Background section (DoDI 4000.19 paragraph 1) explaining the circumstances leading to this MOA. Authored as its own card, but rendered inline as the body's numbered paragraphs — same chained decimal numbering as the rest of the body, no page break. Exactly one is expected; if more than one is supplied, only the first is used. Renders before authorities."
177
- ui:
178
- title: Background
179
178
  body:
180
179
  example: |
181
180
  BACKGROUND: [If there is a need to discuss background, do so here. Normally, there is no need to discuss the background or provide justification for the MOA, particularly if between OSD or DoD Components. Occasionally, however, there is a desire to explain the need for the MOA; particularly where it is not self-evident from the purpose or it is with another federal agency.]
182
181
 
183
182
  authorities:
183
+ title: Authorities
184
184
  description: "Authorities section citing the legal basis for this MOA. Authored as its own card, but rendered inline as the body's numbered paragraphs — same chained decimal numbering as the rest of the body, no page break. Exactly one is expected; if more than one is supplied, only the first is used. Renders after background, before purpose_and_scope."
185
- ui:
186
- title: Authorities
187
185
  body:
188
186
  example: |
189
187
  AUTHORITIES: [State the legal authority upon which the reimbursable MOA is based, such as the Economy Act, or any other legal or significant authority that authorizes any such actions associated with this MOA. Discuss the authorities of the Parties here. If the other Party is another federal agency and insists on stating what it believes to be its own authority, preface that assertion with "The [Party] asserts the following authority:" The DoD has no obligation to agree with such assertions of authority by other federal agencies.]
190
188
 
191
189
  purpose_and_scope:
190
+ title: Purpose and Scope
192
191
  description: "Purpose and Scope section describing what this MOA establishes. Authored as its own card, but rendered inline as the body's numbered paragraphs — same chained decimal numbering as the rest of the body, no page break. Exactly one is expected; if more than one is supplied, only the first is used. Renders after authorities, before responsibilities_of_the_parties."
193
- ui:
194
- title: Purpose and Scope
195
192
  body:
196
193
  example: |
197
194
  PURPOSE AND SCOPE: [State the purpose and the scope of the MOA here. Always use this paragraph.]
198
195
 
199
196
  responsibilities_of_the_parties:
197
+ title: Responsibilities of the Parties
200
198
  description: "Responsibilities of the Parties section listing each party's obligations under this MOA. Authored as its own card, but rendered inline as the body's numbered paragraphs — same chained decimal numbering as the rest of the body, no page break. Exactly one is expected; if more than one is supplied, only the first is used. Renders after purpose_and_scope, before personnel."
201
- ui:
202
- title: Responsibilities of the Parties
203
199
  body:
204
200
  example: |
205
201
  RESPONSIBILITIES OF THE PARTIES:
@@ -212,17 +208,15 @@ card_kinds:
212
208
  - [insert as many responsibilities as necessary but ensure that they apply to both Parties]
213
209
 
214
210
  personnel:
211
+ title: Personnel
215
212
  description: "Personnel section describing each party's responsibility for its own personnel costs. Authored as its own card, but rendered inline as the body's numbered paragraphs — same chained decimal numbering as the rest of the body, no page break. Exactly one is expected; if more than one is supplied, only the first is used. Renders after responsibilities_of_the_parties, before general_provisions."
216
- ui:
217
- title: Personnel
218
213
  body:
219
214
  example: |
220
215
  PERSONNEL: [Explain each Party's responsibility for all costs of its personnel, including pay and benefits, support, and travel, if applicable to the agreement. Each Party is responsible for supervision and management of its personnel. For shared supervision or management, explain the process to accomplish that.]
221
216
 
222
217
  general_provisions:
218
+ title: General Provisions
223
219
  description: "General Provisions section covering points of contact, termination, expiration, and other standard MOA terms. Authored as its own card, but rendered inline as the body's numbered paragraphs — same chained decimal numbering as the rest of the body, no page break. Exactly one is expected; if more than one is supplied, only the first is used. Renders after personnel, before financial_details."
224
- ui:
225
- title: General Provisions
226
220
  body:
227
221
  example: |
228
222
  GENERAL PROVISIONS:
@@ -249,9 +243,8 @@ card_kinds:
249
243
  - OTHER FEDERAL AGENCIES. This MOA does not bind any federal agency, other than the Parties, nor waive required compliance with any law or regulation.
250
244
 
251
245
  financial_details:
246
+ title: Financial Details
252
247
  description: "Financial Details section (DoDI 4000.19 paragraph 7) covering availability of funds, billing, payment, and Economy Act determination. Authored as its own card, but rendered inline as the body's numbered paragraphs — same chained decimal numbering as the rest of the body, no page break. Exactly one is expected; if more than one is supplied, only the first is used. Renders after general_provisions, before list_of_attachments."
253
- ui:
254
- title: Financial Details
255
248
  body:
256
249
  example: |
257
250
  FINANCIAL DETAILS [include Attachment A in all reimbursable MOAs; if the MOA is not reimbursable add, "This MOA does not provide for reimbursement between the Parties"]:
@@ -263,9 +256,8 @@ card_kinds:
263
256
  - ECONOMY ACT DETERMINATION AND FINDINGS (D&F). If the MOA is being entered into in accordance with Section 1535 of Title 31, United States Code (the Economy Act), both Parties agree that the requirements listed in Paragraph (a) of the Economy Act have been met. [Add the following sentence if the provider is an OSD or DoD Component] The provider has determined that the capabilities exist to render the requested support without jeopardizing its assigned missions. [Add the following sentence only if a separate, written Economy Act D&F is required.] Any required Economy Act D&F has been completed.
264
257
 
265
258
  list_of_attachments:
259
+ title: List of Attachments
266
260
  description: "List of Attachments section enumerating this MOA's attachments. Authored as its own card, but rendered inline as the body's numbered paragraphs — same chained decimal numbering as the rest of the body, no page break. Exactly one is expected; if more than one is supplied, only the first is used. Renders last, after financial_details, immediately before the signature blocks."
267
- ui:
268
- title: List of Attachments
269
261
  body:
270
262
  example: |
271
263
  LIST OF ATTACHMENTS:
@@ -273,9 +265,10 @@ card_kinds:
273
265
  - [List each attachment here, e.g. "Attachment A, Financial Details".]
274
266
 
275
267
  attachment:
268
+ title: Attachment
276
269
  description: "A lettered attachment to the MOA, starting at Attachment B (Attachment A is reserved for the reimbursable financial-details page and is generated automatically when 'reimbursable' is true). Each card starts on its own page."
277
270
  ui:
278
- title: Attachment
271
+ groups: [attachment]
279
272
  body:
280
273
  example: |
281
274
  [Describe the attachment's content here.]
@@ -0,0 +1,361 @@
1
+ quill:
2
+ name: classic_resume
3
+ version: 0.0.1
4
+ backend: typst
5
+ description: Classic single-page resume
6
+
7
+ typst:
8
+ plate_file: plate.typ
9
+
10
+ # A resume is a stack of sections, and each kind of section is a card kind: a
11
+ # heading, optional prose under it, and the rows that section holds. The rows
12
+ # are the section's own, so an entry cannot land under the wrong heading.
13
+ main:
14
+ ui:
15
+ groups: [identity, page]
16
+ # Everything prints under a section heading, so main carries no body: a
17
+ # summary is a Summary card.
18
+ body:
19
+ enabled: false
20
+ fields:
21
+ name:
22
+ type: string
23
+ example: John Doe
24
+ ui:
25
+ group: identity
26
+ description: "Your name, set large at the top. It is the document's level 1 heading, and becomes the exported PDF's title and author."
27
+
28
+ contacts:
29
+ type: array
30
+ items:
31
+ type: string
32
+ example:
33
+ - john.doe@example.com
34
+ - (555) 123-4567
35
+ - github.com/johndoe
36
+ - linkedin.com/in/johndoe
37
+ - Pittsburgh, PA
38
+ ui:
39
+ group: identity
40
+ description: "The line under your name, one contact per line here, printed across the page separated by a diamond. Order them by how much you want them used."
41
+
42
+ link_contacts:
43
+ type: boolean
44
+ default: true
45
+ ui:
46
+ group: identity
47
+ compact: true
48
+ description: "Turn contacts that look like an email address, a web address or a phone number into live links in the PDF. Anything else — a city, a clearance level — is printed as written."
49
+
50
+ paper:
51
+ type: enum
52
+ values:
53
+ - us-letter
54
+ - a4
55
+ default: us-letter
56
+ ui:
57
+ group: page
58
+ compact: true
59
+ description: "Page size."
60
+
61
+ font_size:
62
+ type: number
63
+ default: 12
64
+ ui:
65
+ group: page
66
+ compact: true
67
+ description: "Body text size in points; decimals allowed, such as 11.5. Along with the margin, this is the lever for fitting a resume onto one page — drop a half point before you drop a bullet."
68
+
69
+ margin:
70
+ type: number
71
+ default: 0.5
72
+ ui:
73
+ group: page
74
+ compact: true
75
+ description: "Page margin in inches, the same on all four sides. The layout is dense by design; below about 0.4 a printer starts clipping."
76
+
77
+
78
+ # Each kind carries the same heading pair and optional prose under it. A blank
79
+ # title prints the kind's usual heading, which the plate holds.
80
+ card_kinds:
81
+ summary:
82
+ title: Summary
83
+ description: "A heading and prose under it. With a title of its own it is any section that is only prose — an objective, a statement of interest."
84
+ ui:
85
+ groups: [heading]
86
+ body:
87
+ example: |
88
+ Security engineer of eight years, most of it on detection pipelines other people have to keep running.
89
+ fields:
90
+ title:
91
+ type: plaintext
92
+ inline: true
93
+ default: ""
94
+ ui:
95
+ group: heading
96
+ description: &title_description "Printed in uppercase over a rule. Leave blank for the usual heading: Summary, Work Experience, Education, Projects, Skills or Certifications."
97
+ extra: &extra
98
+ type: richtext
99
+ inline: true
100
+ default: ""
101
+ ui:
102
+ group: heading
103
+ compact: true
104
+ description: "Qualifier set after the title in the same style, such as a date range or a clarifier. Italicize with *asterisks*. Leave blank for the usual case."
105
+
106
+ experience:
107
+ title: Experience
108
+ description: "Jobs, most recent first: employer and dates on the first line, role and location on the second, details under them."
109
+ ui:
110
+ groups: [heading]
111
+ body: &section_body
112
+ # Empty is a heading straight over its rows, which is the usual section.
113
+ example: ""
114
+ fields:
115
+ title:
116
+ type: plaintext
117
+ inline: true
118
+ default: ""
119
+ ui:
120
+ group: heading
121
+ description: *title_description
122
+ extra: *extra
123
+ jobs:
124
+ type: array
125
+ items:
126
+ type: object
127
+ properties:
128
+ company:
129
+ type: plaintext
130
+ inline: true
131
+ example: Templar Archives Research Division
132
+ description: "Set in bold at the left of the first line."
133
+ dates: &dates
134
+ type: plaintext
135
+ inline: true
136
+ default: ""
137
+ example: August 2024 – Present
138
+ description: "Set in bold at the right, opposite the name. Free text rather than a date, so a range reads as you write it: 'August 2024 – Present', 'December 2025'. Keep the form the same down the page."
139
+ role:
140
+ type: plaintext
141
+ inline: true
142
+ default: ""
143
+ example: Psionic Research Analyst
144
+ description: "Your title, set in italics under the employer. Leave blank to omit."
145
+ location: &location
146
+ type: plaintext
147
+ inline: true
148
+ default: ""
149
+ example: Pittsburgh, PA
150
+ description: "Set in italics at the right of the second line. 'Pittsburgh, PA', 'Remote'. Leave blank to omit; with the line's other half blank too, the second line is not printed."
151
+ details: &details
152
+ type: richtext
153
+ default: ""
154
+ example: |
155
+ - What you did, and what came of it.
156
+ description: "Set under the entry. Usually a bulleted list, one line each and strongest first; a sentence, *italics* and **bold** set as well, and a heading sets as a bold line. Leave blank for nothing under the entry."
157
+ example:
158
+ - company: Templar Archives Research Division
159
+ dates: August 2024 – Present
160
+ role: Psionic Research Analyst
161
+ location: Aiur
162
+ details: |
163
+ - Analyzed Khala disruption patterns, developing countermeasures to protect neural link infrastructure.
164
+ description: "One row per job. A row is never split across a page break."
165
+
166
+ education:
167
+ title: Education
168
+ description: "Schools, most recent first: school and date on the first line, degree and location on the second."
169
+ ui:
170
+ groups: [heading]
171
+ body: *section_body
172
+ fields:
173
+ title:
174
+ type: plaintext
175
+ inline: true
176
+ default: ""
177
+ ui:
178
+ group: heading
179
+ description: *title_description
180
+ extra: *extra
181
+ schools:
182
+ type: array
183
+ items:
184
+ type: object
185
+ properties:
186
+ school:
187
+ type: plaintext
188
+ inline: true
189
+ example: Carnegie Mellon University
190
+ description: "Set in bold at the left of the first line."
191
+ dates:
192
+ <<: *dates
193
+ example: May 2024
194
+ degree:
195
+ type: plaintext
196
+ inline: true
197
+ default: ""
198
+ example: BS, Data Science
199
+ description: "Degree and field, set in italics under the school. Leave blank to omit."
200
+ location: *location
201
+ details:
202
+ <<: *details
203
+ example: |
204
+ - Distinguished Graduate (top 10%).
205
+ description: "Honors, activities, coursework, set under the entry. Most degrees need none."
206
+ example:
207
+ - school: Carnegie Mellon University
208
+ dates: December 2025
209
+ degree: Master of Information Technology Strategy
210
+ location: Pittsburgh, PA
211
+ description: "One row per school or degree."
212
+
213
+ projects:
214
+ title: Projects
215
+ description: "Projects: name and link on the first line, details under them."
216
+ ui:
217
+ groups: [heading]
218
+ body: *section_body
219
+ fields:
220
+ title:
221
+ type: plaintext
222
+ inline: true
223
+ default: ""
224
+ ui:
225
+ group: heading
226
+ description: *title_description
227
+ extra: *extra
228
+ projects:
229
+ type: array
230
+ items:
231
+ type: object
232
+ properties:
233
+ name:
234
+ type: plaintext
235
+ inline: true
236
+ example: Quillmark
237
+ description: "Set in bold at the left."
238
+ url:
239
+ type: string
240
+ default: ""
241
+ example: https://github.com/nibsbin/quillmark
242
+ description: "Set small and italic at the right, and made a live link when it starts with http. Anything else is printed as written, so '<closed source>' stands in for a project with nothing to link. Leave blank to omit."
243
+ details: *details
244
+ example:
245
+ - name: Quillmark
246
+ url: https://github.com/nibsbin/quillmark
247
+ details: |
248
+ - Parameterization engine for typesetting documents from markdown.
249
+ description: "One row per project."
250
+
251
+ skills:
252
+ title: Skills
253
+ description: "Labelled lists of skills, filled across the columns and then down."
254
+ ui:
255
+ groups: [heading]
256
+ body: *section_body
257
+ fields:
258
+ title:
259
+ type: plaintext
260
+ inline: true
261
+ default: ""
262
+ ui:
263
+ group: heading
264
+ description: *title_description
265
+ extra: *extra
266
+ skills:
267
+ type: array
268
+ ui:
269
+ layout: table
270
+ items:
271
+ type: object
272
+ properties:
273
+ label:
274
+ type: plaintext
275
+ inline: true
276
+ example: Programming
277
+ description: "Set in bold on its own line above the text."
278
+ text:
279
+ type: plaintext
280
+ inline: true
281
+ example: Python, R, JS, Rust, PowerShell, CI/CD
282
+ title: Items
283
+ description: "The items under that label, usually comma separated. Printed as written — markup is the one thing a labeled row does not carry."
284
+ example:
285
+ - label: Programming
286
+ text: "Python, R, JS, C#, Rust, PowerShell, CI/CD"
287
+ - label: Cloud
288
+ text: "AWS EC2/S3, Helm, Docker, Serverless"
289
+ description: "One label and its items per row."
290
+ columns: &columns
291
+ type: integer
292
+ default: 2
293
+ ui:
294
+ compact: true
295
+ description: "Number of columns. Two suits items that run most of a line; three suits single words."
296
+
297
+ certifications:
298
+ title: Certifications
299
+ description: "A list of certifications, filled across the columns and then down."
300
+ ui:
301
+ groups: [heading]
302
+ body: *section_body
303
+ fields:
304
+ title:
305
+ type: plaintext
306
+ inline: true
307
+ default: ""
308
+ ui:
309
+ group: heading
310
+ description: *title_description
311
+ extra: *extra
312
+ items:
313
+ type: array
314
+ items:
315
+ type: richtext
316
+ inline: true
317
+ example:
318
+ - Offensive Security Certified Professional (OSCP)
319
+ - GIAC Cyber Threat Intelligence (GCTI)
320
+ description: "One item per line. Keep each to a line at the column width. Italicize with *asterisks*."
321
+ columns: *columns
322
+
323
+ other:
324
+ title: Other section
325
+ description: "A section the kinds above do not name — volunteer work, military service, publications, a competition. Rows take the Experience shape with neutral names."
326
+ ui:
327
+ groups: [heading]
328
+ body: *section_body
329
+ fields:
330
+ title:
331
+ type: plaintext
332
+ inline: true
333
+ example: Cyber Competition
334
+ ui:
335
+ group: heading
336
+ description: "Printed in uppercase over a rule. Other has no usual heading, so this one is yours to write."
337
+ extra: *extra
338
+ entries:
339
+ type: array
340
+ default: []
341
+ items:
342
+ type: object
343
+ properties:
344
+ heading:
345
+ type: plaintext
346
+ inline: true
347
+ example: 1st in NCX 2023
348
+ description: "Set in bold at the left of the first line."
349
+ dates: *dates
350
+ subtitle:
351
+ type: plaintext
352
+ inline: true
353
+ default: ""
354
+ description: "Set in italics under the heading. Leave blank to omit."
355
+ location: *location
356
+ details: *details
357
+ example:
358
+ - heading: 1st in NCX 2023
359
+ details: |
360
+ - Developed strategies, defensive scripts, and exploits for the Cyber Combat event.
361
+ description: "One row per item. A section that is only prose is a Summary with a title of its own."
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Nibs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.