gcf-aif-ext 0.2.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 (294) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/commands/gcf.js +173 -0
  4. package/extension.json +24 -0
  5. package/hooks/pre-commit.js +91 -0
  6. package/injections/commit-status.md +6 -0
  7. package/injections/plan-context.md +8 -0
  8. package/injections/review-pillars.md +7 -0
  9. package/lib/anchors.js +109 -0
  10. package/lib/audit-core.js +102 -0
  11. package/lib/context.js +77 -0
  12. package/lib/frontmatter.js +26 -0
  13. package/lib/gcf-paths.js +60 -0
  14. package/lib/git.js +19 -0
  15. package/lib/id.js +42 -0
  16. package/lib/index-gen.js +51 -0
  17. package/lib/linter.js +61 -0
  18. package/lib/playtest-list.js +13 -0
  19. package/lib/safe-path.js +71 -0
  20. package/lib/transitions.js +30 -0
  21. package/lib/validate-card.js +48 -0
  22. package/lib/verdict-fs.js +126 -0
  23. package/node_modules/cnlp-kit/CHANGELOG.md +625 -0
  24. package/node_modules/cnlp-kit/LICENSE +21 -0
  25. package/node_modules/cnlp-kit/README.md +242 -0
  26. package/node_modules/cnlp-kit/bin/cnlp.js +334 -0
  27. package/node_modules/cnlp-kit/cnlp-format.md +470 -0
  28. package/node_modules/cnlp-kit/package.json +40 -0
  29. package/node_modules/cnlp-kit/profiles/adr.md +129 -0
  30. package/node_modules/cnlp-kit/profiles/api.md +87 -0
  31. package/node_modules/cnlp-kit/profiles/concept.md +70 -0
  32. package/node_modules/cnlp-kit/profiles/docset.md +103 -0
  33. package/node_modules/cnlp-kit/profiles/guide.md +51 -0
  34. package/node_modules/cnlp-kit/profiles/profile.md +69 -0
  35. package/node_modules/cnlp-kit/profiles/reference.md +61 -0
  36. package/node_modules/cnlp-kit/profiles/skill.md +75 -0
  37. package/node_modules/cnlp-kit/profiles/task.md +65 -0
  38. package/node_modules/cnlp-kit/quality-rules.md +69 -0
  39. package/node_modules/cnlp-kit/skills/cnlp-docset/SKILL.md +73 -0
  40. package/node_modules/cnlp-kit/skills/cnlp-migrate/SKILL.md +64 -0
  41. package/node_modules/cnlp-kit/src/cnlp.js +534 -0
  42. package/node_modules/cnlp-kit/src/config.js +352 -0
  43. package/node_modules/yaml/LICENSE +13 -0
  44. package/node_modules/yaml/README.md +172 -0
  45. package/node_modules/yaml/bin.mjs +11 -0
  46. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  47. package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  48. package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  49. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  50. package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  51. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  52. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  53. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  54. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  55. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  56. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +226 -0
  57. package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  58. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  59. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  60. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  61. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  62. package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  63. package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  64. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  65. package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  66. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  67. package/node_modules/yaml/browser/dist/errors.js +57 -0
  68. package/node_modules/yaml/browser/dist/index.js +17 -0
  69. package/node_modules/yaml/browser/dist/log.js +11 -0
  70. package/node_modules/yaml/browser/dist/nodes/Alias.js +118 -0
  71. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  72. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  73. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  74. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  75. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  76. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  77. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  78. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  79. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  80. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  81. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  82. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  83. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  84. package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  85. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  86. package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  87. package/node_modules/yaml/browser/dist/public-api.js +102 -0
  88. package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  89. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  90. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  91. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  92. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  93. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  94. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  95. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  96. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  97. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  98. package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  99. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  100. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  101. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  102. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  103. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  104. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  105. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  106. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  107. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  108. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  109. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  110. package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  111. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  112. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  113. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  114. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  115. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  116. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  117. package/node_modules/yaml/browser/dist/util.js +11 -0
  118. package/node_modules/yaml/browser/dist/visit.js +233 -0
  119. package/node_modules/yaml/browser/index.js +5 -0
  120. package/node_modules/yaml/browser/package.json +3 -0
  121. package/node_modules/yaml/dist/cli.d.ts +8 -0
  122. package/node_modules/yaml/dist/cli.mjs +201 -0
  123. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  124. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  125. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  126. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  127. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  128. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  129. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  130. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  131. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  132. package/node_modules/yaml/dist/compose/composer.js +224 -0
  133. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  134. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  135. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  136. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  137. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  138. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  139. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  140. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  141. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  142. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  143. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  144. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +228 -0
  145. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  146. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  147. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  148. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  149. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  150. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  151. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  152. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  153. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  154. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  155. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  156. package/node_modules/yaml/dist/doc/Document.js +337 -0
  157. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  158. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  159. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  160. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  161. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  162. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  163. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  164. package/node_modules/yaml/dist/doc/directives.js +178 -0
  165. package/node_modules/yaml/dist/errors.d.ts +21 -0
  166. package/node_modules/yaml/dist/errors.js +62 -0
  167. package/node_modules/yaml/dist/index.d.ts +25 -0
  168. package/node_modules/yaml/dist/index.js +50 -0
  169. package/node_modules/yaml/dist/log.d.ts +3 -0
  170. package/node_modules/yaml/dist/log.js +19 -0
  171. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  172. package/node_modules/yaml/dist/nodes/Alias.js +120 -0
  173. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  174. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  175. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  176. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  177. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  178. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  179. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  180. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  181. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  182. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  183. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  184. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  185. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  186. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  187. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  188. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  189. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  190. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  191. package/node_modules/yaml/dist/options.d.ts +350 -0
  192. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  193. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  194. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  195. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  196. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  197. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  198. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  199. package/node_modules/yaml/dist/parse/cst.js +112 -0
  200. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  201. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  202. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  203. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  204. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  205. package/node_modules/yaml/dist/parse/parser.js +980 -0
  206. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  207. package/node_modules/yaml/dist/public-api.js +107 -0
  208. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  209. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  210. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  211. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  212. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  213. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  214. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  215. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  216. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  217. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  218. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  219. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  220. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  221. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  222. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  223. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  224. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  225. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  226. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  227. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  228. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  229. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  230. package/node_modules/yaml/dist/schema/tags.js +99 -0
  231. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  232. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  233. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  234. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  235. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  236. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  237. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  238. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  239. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  240. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  241. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  242. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  243. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  244. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  245. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  246. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  247. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  248. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  249. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  250. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  251. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  252. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  253. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  254. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  255. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  256. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  257. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  258. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  259. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  260. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  261. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  262. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  263. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  264. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  265. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  266. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  267. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  268. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  269. package/node_modules/yaml/dist/test-events.js +134 -0
  270. package/node_modules/yaml/dist/util.d.ts +16 -0
  271. package/node_modules/yaml/dist/util.js +28 -0
  272. package/node_modules/yaml/dist/visit.d.ts +102 -0
  273. package/node_modules/yaml/dist/visit.js +236 -0
  274. package/node_modules/yaml/package.json +97 -0
  275. package/node_modules/yaml/util.js +2 -0
  276. package/package.json +54 -0
  277. package/profiles/card.md +65 -0
  278. package/profiles/pillars.md +31 -0
  279. package/profiles/system.md +56 -0
  280. package/schemas/card.schema.json +30 -0
  281. package/skills/gcf-adopt/SKILL.md +41 -0
  282. package/skills/gcf-audit/SKILL.md +27 -0
  283. package/skills/gcf-card/SKILL.md +35 -0
  284. package/skills/gcf-debate/SKILL.md +33 -0
  285. package/skills/gcf-ingest/SKILL.md +38 -0
  286. package/skills/gcf-init/SKILL.md +32 -0
  287. package/skills/gcf-verdict/SKILL.md +32 -0
  288. package/skills/gcf-vision/SKILL.md +33 -0
  289. package/templates/PILLARS.md +8 -0
  290. package/templates/backlog.md +4 -0
  291. package/templates/card.md +34 -0
  292. package/templates/cnlp.config.json +8 -0
  293. package/templates/config.yml +8 -0
  294. package/templates/system.md +22 -0
@@ -0,0 +1,87 @@
1
+ ---
2
+ name: api
3
+ description: The CNL-P profile of an API page — one capability of a library, the symbols that spell it, its contract, and 1 example.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: declarative
9
+
10
+ headings:
11
+ - none: an API page is one flat run of blocks, and the file name carries the title
12
+
13
+ frontmatter_fields:
14
+ - none: an API page is reached through the index, which already carries its name
15
+
16
+ lexicon_exempt:
17
+ - none: an API page has no frontmatter, so nothing is exempt
18
+
19
+ sections:
20
+ - key: purpose
21
+ form: bullet-list
22
+ required: yes
23
+ note: what the capability is for, and the question a reader arrives with
24
+
25
+ - key: symbols
26
+ form: bullet-list
27
+ required: yes
28
+ note: the exact symbols covered; a group of overloads is 1 page, because a reader picks between them once and then stops reading
29
+
30
+ - key: signature
31
+ form: keyed-block
32
+ required: yes
33
+ note: the declarations verbatim in a fenced block, in the language of the library
34
+
35
+ - key: parameters
36
+ form: record-list
37
+ required: no
38
+ record_keys: name, means
39
+ optional_record_keys: type, default
40
+ note: only what a reader cannot read off the signature; a parameter whose name states its meaning costs a line and adds nothing
41
+
42
+ - key: returns
43
+ form: bullet-list
44
+ required: no
45
+ note: what comes back, and what a caller does with it
46
+
47
+ - key: errors
48
+ form: bullet-list
49
+ required: no
50
+ note: what fails, and the condition that causes it
51
+
52
+ - key: constraints
53
+ form: bullet-list
54
+ required: no
55
+ note: what a caller cannot violate, each as a limit or as a state that holds before the call
56
+
57
+ - key: choose
58
+ form: record-list
59
+ required: no
60
+ record_keys: when, use
61
+ note: the rule for picking between the symbols above; a page covering 1 symbol deletes this block
62
+
63
+ - key: example
64
+ form: keyed-block
65
+ required: yes
66
+ record_keys: shows
67
+ note: 1 canonical use, with shows stating what it demonstrates, written in the names the set's running example uses; a compositional example is a task page, not a second example here
68
+
69
+ - key: pitfalls
70
+ form: bullet-list
71
+ required: no
72
+ note: what a reader writes wrong, each with what to write instead
73
+
74
+ - key: see_also
75
+ form: record-list
76
+ required: yes
77
+ record_keys: page, relation, reason
78
+ record_values: relation = needs, next, alternative, detail, supersedes
79
+ note: relation is needs, next, alternative, detail or supersedes; reason lets a reader decide without opening the page, and supersedes names a page of another docset that replaces this one
80
+
81
+ custom_sections:
82
+ - none: a project fills this from the vocabulary its own API pages already use
83
+
84
+ enforcement:
85
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
86
+ - any issue is an error: an API page is read as the contract of a call a reader is about to write
87
+ - `npx cnlp check` resolves every `page:` value, and reports a page no other page reaches, once the project declares `docsets:`
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: concept
3
+ description: The CNL-P profile of a concept page — one model a reader holds before the API pages that rest on it read correctly.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: declarative
9
+
10
+ headings:
11
+ - none: a concept page is one flat run of blocks, and the file name carries the title
12
+
13
+ frontmatter_fields:
14
+ - none: a concept page is reached through the index, which already carries its name
15
+
16
+ lexicon_exempt:
17
+ - none: a concept page has no frontmatter, so nothing is exempt
18
+
19
+ sections:
20
+ - key: purpose
21
+ form: bullet-list
22
+ required: yes
23
+ note: what the model explains, and which pages stop reading correctly without it
24
+
25
+ - key: model
26
+ form: bullet-list
27
+ required: yes
28
+ note: what the thing is, 1 statement per line, in the reader's terms rather than in the library's internals
29
+
30
+ - key: terms
31
+ form: record-list
32
+ required: no
33
+ record_keys: term, means
34
+ note: a word the library uses in its own sense; a word that means what it usually means costs a line and adds nothing
35
+
36
+ - key: invariants
37
+ form: bullet-list
38
+ required: yes
39
+ note: what a caller cannot violate, and what breaks when it does; this is the block an API page points back to instead of restating
40
+
41
+ - key: lifecycle
42
+ form: numbered-list
43
+ required: no
44
+ note: the order of states, for a thing a caller creates, drives and releases
45
+
46
+ - key: example
47
+ form: keyed-block
48
+ required: yes
49
+ record_keys: shows
50
+ note: 1 canonical use, with shows stating what it demonstrates, written in the names the set's running example uses so the 2 compose
51
+
52
+ - key: pitfalls
53
+ form: bullet-list
54
+ required: no
55
+ note: what a reader gets wrong about the model, each with what holds instead
56
+
57
+ - key: see_also
58
+ form: record-list
59
+ required: yes
60
+ record_keys: page, relation, reason
61
+ record_values: relation = needs, next, alternative, detail, supersedes
62
+ note: relation is needs, next, alternative, detail or supersedes; reason lets a reader decide without opening the page, and supersedes names a page of another docset that replaces this one
63
+
64
+ custom_sections:
65
+ - none: a project fills this from the vocabulary its own concept pages already use
66
+
67
+ enforcement:
68
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
69
+ - any issue is an error: a concept page is what every API page resting on it points to
70
+ - `npx cnlp check` resolves every `page:` value, and reports a page no other page reaches, once the project declares `docsets:`
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: docset
3
+ description: The CNL-P profile of a docset index — the entry page of a library's agent documentation, and the closed list of what that library offers.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: imperative
9
+
10
+ headings:
11
+ - none: an index is one flat run of blocks, and the file name carries the title
12
+
13
+ frontmatter_fields:
14
+ - none: an index is read by path, so it carries no routing contract to restate
15
+
16
+ lexicon_exempt:
17
+ - none: an index has no frontmatter, so nothing is exempt
18
+
19
+ sections:
20
+ - key: identity
21
+ form: keyed-block
22
+ required: yes
23
+ record_keys: library, version, source
24
+ optional_record_keys: derived_from
25
+ note: the library covered and the revision it was read at; derived_from names what the pages were written from, because a page written from prose carries less weight than one written from a signature
26
+
27
+ - key: purpose
28
+ form: bullet-list
29
+ required: yes
30
+ note: what the library does, and the kind of task a reader reaches for it with
31
+
32
+ - key: read_protocol
33
+ form: numbered-list
34
+ required: yes
35
+ note: how to walk this docset: the common case is written from `canonical_use:`, a page opens for any call whose contract the reader lacks, and a step telling the reader to stop reading is the defect
36
+
37
+ - key: install
38
+ form: bullet-list
39
+ required: no
40
+ note: how a project takes the dependency; delete the block when the docset covers a dependency the project already carries
41
+
42
+ - key: canonical_use
43
+ form: keyed-block
44
+ required: yes
45
+ record_keys: shows
46
+ note: 1 complete working use of the library, carrying every load-bearing element; a reader holding only the index writes the common case from this block, and an index without one is a table of contents, which is enough for nothing
47
+
48
+ - key: walkthrough
49
+ form: record-list
50
+ required: yes
51
+ record_keys: part, page
52
+ note: each part of `canonical_use:` and the page owning its detail; a record and not a comment inside the fence, because a fence is opaque and a link inside one reaches no reader and no check
53
+
54
+ - key: concepts
55
+ form: record-list
56
+ required: yes
57
+ record_keys: page, does
58
+ note: the models a reader holds before any page reads correctly; a record and not a line, so every link in a docset is a `page:` value and a resolver guesses at none of them
59
+
60
+ - key: tasks
61
+ form: record-list
62
+ required: yes
63
+ record_keys: page, does
64
+ note: the goals a reader arrives with; a catalog keyed on capability routes a reader holding a symbol and leaves one holding a goal to guess
65
+
66
+ - key: catalog
67
+ form: record-list
68
+ required: yes
69
+ record_keys: capability, does, status
70
+ optional_record_keys: page, read, instead, fingerprint
71
+ record_values: status = covered, source, avoid
72
+ note: "every capability the library offers, in 1 record each; status is covered, source or avoid, and a symbol absent here is a symbol the library lacks; fingerprint changes when the source does, so a record without one cannot report drift"
73
+
74
+ - key: excluded
75
+ form: bullet-list
76
+ required: yes
77
+ note: a whole region the docset leaves out, with the reason; a region named in neither this block nor the catalog reads as an omission nobody decided
78
+
79
+ - key: companions
80
+ form: record-list
81
+ required: yes
82
+ record_keys: docset, when, owns
83
+ note: another docset covering what this library does not; `when:` is "always" once its index carries `overrides:`, since a reader loading it on demand misses the correction; "- none" when the library stands alone
84
+
85
+ - key: overrides
86
+ form: record-list
87
+ required: no
88
+ record_keys: page, by, reason
89
+ note: "a page of another docset that stops holding once this package is present, and the page here that replaces it; `page:` names the foreign page and carries its docset prefix, `by:` names the local one and carries none"
90
+
91
+ - key: version_notes
92
+ form: bullet-list
93
+ required: no
94
+ note: what changed in the covered version, for a reader arriving from an older one
95
+
96
+ custom_sections:
97
+ - none: a project fills this from the vocabulary its own docsets already use
98
+
99
+ enforcement:
100
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
101
+ - any issue is an error: an index routes every other page, so a wrong index misroutes the whole docset
102
+ - `npx cnlp check` resolves every `page:`, `by:` and `docset:` value once the project declares `docsets:`
103
+ - `npx cnlp check` holds `status` to covered, source and avoid; what a status implies — a `read:` on source, an `instead:` on avoid — is caught by review
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: guide
3
+ description: The CNL-P profile of a repository guide — the sections AGENTS.md uses to tell an agent how to edit this repository, in order.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: imperative
9
+
10
+ headings:
11
+ - none: a guide is one flat run of sections, and the file name carries the title
12
+
13
+ frontmatter_fields:
14
+ - none: a guide is read by path, so it carries no routing contract to restate
15
+
16
+ lexicon_exempt:
17
+ - none: a guide has no frontmatter, so nothing is exempt
18
+
19
+ sections:
20
+ - key: purpose
21
+ form: bullet-list
22
+ required: yes
23
+ note: what the file governs, and when to read it
24
+
25
+ - key: read_first
26
+ form: bullet-list
27
+ required: no
28
+ note: what an editor has to understand before the first edit, such as which file is the authority on what
29
+
30
+ - key: workflow
31
+ form: numbered-list
32
+ required: no
33
+ note: the order of work for the edit this guide governs
34
+
35
+ - key: forbidden_behaviors
36
+ form: bullet-list
37
+ required: no
38
+ note: what an edit never does, each with the reason it breaks something
39
+
40
+ - key: verification
41
+ form: bullet-list
42
+ required: no
43
+ note: the command that proves the edit conforms, and how its output is read
44
+
45
+ custom_sections:
46
+ - none: a project fills this from the vocabulary its own guide already uses
47
+
48
+ enforcement:
49
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
50
+ - any issue is an error: a guide is read before an agent edits the corpus, so a wrong guide corrupts every file that follows
51
+ - a repository without Node holds this profile by review against the standard instead
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: profile
3
+ description: The CNL-P profile of a profile — the blocks profiles/<name>.md declares, in order.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: declarative
9
+
10
+ headings:
11
+ - none: a profile is one flat run of blocks
12
+
13
+ frontmatter_fields:
14
+ - name
15
+ - description
16
+
17
+ lexicon_exempt:
18
+ - none: a profile is read by whoever writes a document of the kind it describes
19
+
20
+ sections:
21
+ - key: format
22
+ form: scalar
23
+ required: yes
24
+ note: the standard this profile's documents obey, by path
25
+
26
+ - key: mood
27
+ form: scalar
28
+ required: yes
29
+ note: imperative or declarative; the register the body is written in, and the value that gates the active-voice rule
30
+
31
+ - key: headings
32
+ form: bullet-list
33
+ required: yes
34
+ note: the ## headings in order, or "- none" for a flat body
35
+
36
+ - key: frontmatter_fields
37
+ form: bullet-list
38
+ required: yes
39
+ note: the fields the body may not restate
40
+
41
+ - key: lexicon_exempt
42
+ form: bullet-list
43
+ required: yes
44
+ note: frontmatter fields the lexicon does not police; frontmatter is not checked, so this is for the reader
45
+
46
+ - key: sections
47
+ form: record-list
48
+ required: yes
49
+ record_keys: key, form, required
50
+ optional_record_keys: heading, record_keys, optional_record_keys, record_values, note
51
+ note: the blocks in order, held to §7 of the format; form is one of the 5 in the format, required is yes or no, and record_values closes a record key to a vocabulary
52
+
53
+ - key: custom_sections
54
+ form: bullet-list
55
+ required: yes
56
+ note: names a document of this kind may add, or "- none"
57
+
58
+ - key: enforcement
59
+ form: bullet-list
60
+ required: yes
61
+ note: the command or test that checks this profile, and its severity
62
+
63
+ custom_sections:
64
+ - none: a profile declares values, so a block outside this list is a rule that escaped the format
65
+
66
+ enforcement:
67
+ - `npm test` (`test/profile.test.js`), over every file in `profiles/`
68
+ - any issue is an error: a profile that is wrong makes every document of its kind wrong
69
+ - this file is checked against itself; nothing checks that, and the recursion stops here
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: reference
3
+ description: The CNL-P profile of a reference file — the sections a checklist or a protocol under references/ uses, in order.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: imperative
9
+
10
+ headings:
11
+ - none: a reference file is one flat run of sections, and the file name carries the title
12
+
13
+ frontmatter_fields:
14
+ - none: a reference file is read by path, so it carries no routing contract to restate
15
+
16
+ lexicon_exempt:
17
+ - none: a reference file has no frontmatter, so nothing is exempt
18
+
19
+ sections:
20
+ - key: purpose
21
+ form: bullet-list
22
+ required: yes
23
+ note: what the file is loaded for, and when
24
+
25
+ - key: scope
26
+ form: bullet-list
27
+ required: no
28
+ note: what this file owns, and which file owns a neighbouring topic
29
+
30
+ - key: read_first
31
+ form: bullet-list
32
+ required: no
33
+ note: the terms and gates a `checks:` item depends on, when reading an item alone would misfire
34
+
35
+ - key: workflow
36
+ form: numbered-list
37
+ required: no
38
+ note: how to find the patterns, before the block that names them; a checklist with nothing to run deletes this block
39
+
40
+ - key: checks
41
+ form: bullet-list
42
+ required: no
43
+ note: "a project states the line form a `checks:` item takes, and holds it by a test of its own until the format can declare it"
44
+
45
+ - key: non_findings
46
+ form: bullet-list
47
+ required: no
48
+ note: patterns the reader would otherwise flag, each with the reason it is not a finding
49
+
50
+ - key: forbidden_behaviors
51
+ form: bullet-list
52
+ required: no
53
+ note: when the file drives a change rather than a review
54
+
55
+ custom_sections:
56
+ - none: a project fills this from the vocabulary its own reference files already use
57
+
58
+ enforcement:
59
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
60
+ - any issue is an error: a reference file is read as executable instructions, so there is no draft state to warn about
61
+ - a repository without Node holds this profile by review against the standard instead
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: skill
3
+ description: The CNL-P profile of an agent skill — the sections a SKILL.md body uses, in order.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: imperative
9
+
10
+ headings:
11
+ - none: a skill body is one flat run of sections, and frontmatter `name` carries the title
12
+
13
+ frontmatter_fields:
14
+ - name
15
+ - description
16
+
17
+ lexicon_exempt:
18
+ - description: it feeds skill routing and needs the phrasing an operator would actually use
19
+
20
+ sections:
21
+ - key: mode
22
+ form: scalar
23
+ required: yes
24
+ note: a human label; no machine consumer reads it
25
+
26
+ - key: purpose
27
+ form: bullet-list
28
+ required: yes
29
+
30
+ - key: inputs
31
+ form: bullet-list
32
+ required: yes
33
+ note: "- none with the reason when the skill discovers its own"
34
+
35
+ - key: preconditions
36
+ form: bullet-list
37
+ required: no
38
+ note: when state must hold before step 1
39
+
40
+ - key: scope
41
+ form: bullet-list
42
+ required: no
43
+ note: only when workflow does not already bound it
44
+
45
+ - key: forbidden_behaviors
46
+ form: bullet-list
47
+ required: no
48
+ note: when the skill has prohibitions
49
+
50
+ - key: outputs
51
+ form: bullet-list
52
+ required: no
53
+ note: only when nothing else states what the run produces
54
+
55
+ - key: quality_rules
56
+ form: bullet-list
57
+ required: no
58
+ note: the shared rubric, copied verbatim into every skill that carries it
59
+
60
+ - key: workflow
61
+ form: numbered-list
62
+ required: yes
63
+ note: reference material states "- none" with the reason instead of carrying steps
64
+
65
+ - key: invocation
66
+ form: bullet-list
67
+ required: yes
68
+
69
+ custom_sections:
70
+ - none: a project fills this from the inventory step of cnlp-migrate, before rewriting any skill
71
+
72
+ enforcement:
73
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
74
+ - any issue is an error: a skill ships as executable instructions, so there is no draft state to warn about
75
+ - a repository without Node holds this profile by review against the standard instead
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: task
3
+ description: The CNL-P profile of a task page — how to reach one outcome with the library, in steps, with the compositional example the API pages leave out.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: imperative
9
+
10
+ headings:
11
+ - none: a task page is one flat run of blocks, and the file name carries the title
12
+
13
+ frontmatter_fields:
14
+ - none: a task page is reached through the index, which already carries its name
15
+
16
+ lexicon_exempt:
17
+ - none: a task page has no frontmatter, so nothing is exempt
18
+
19
+ sections:
20
+ - key: goal
21
+ form: scalar
22
+ required: yes
23
+ note: the outcome, in the words a reader arrives with rather than in the library's terms
24
+
25
+ - key: preconditions
26
+ form: bullet-list
27
+ required: no
28
+ note: what holds before step 1; delete the block when the steps start from nothing
29
+
30
+ - key: workflow
31
+ form: numbered-list
32
+ required: yes
33
+ note: the steps, each naming the call it makes and sending the reader to the API page for the contract
34
+
35
+ - key: example
36
+ form: keyed-block
37
+ required: yes
38
+ record_keys: shows
39
+ note: the composition the steps produce, whole and runnable, in the names the set's running example uses; this is where a multi-call example lives, so an API page stays small
40
+
41
+ - key: verification
42
+ form: bullet-list
43
+ required: no
44
+ note: how a reader proves the result works, by a command or by an observable state
45
+
46
+ - key: failure_modes
47
+ form: record-list
48
+ required: no
49
+ record_keys: symptom, cause, fix
50
+ note: what a reader sees when a step went wrong, keyed on the symptom because that is what the reader has in hand
51
+
52
+ - key: see_also
53
+ form: record-list
54
+ required: yes
55
+ record_keys: page, relation, reason
56
+ record_values: relation = needs, next, alternative, detail, supersedes
57
+ note: relation is needs, next, alternative, detail or supersedes; reason lets a reader decide without opening the page, and supersedes names a page of another docset that replaces this one
58
+
59
+ custom_sections:
60
+ - none: a project fills this from the vocabulary its own task pages already use
61
+
62
+ enforcement:
63
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
64
+ - any issue is an error: a task page ships as executable instructions, so there is no draft state to warn about
65
+ - `npx cnlp check` resolves every `page:` value, and reports a page no other page reaches, once the project declares `docsets:`
@@ -0,0 +1,69 @@
1
+ # The shared rubric — a seed, not a standard
2
+
3
+ `quality_rules:` is the one block a repository copies **verbatim** into every skill that
4
+ carries it. There is no include mechanism in the skill runtime, so the duplication is
5
+ deliberate, and a byte-identity test you write in your own repository — the last section
6
+ says how — is what keeps the copies from drifting until 2 skills judge the same work by
7
+ different rules.
8
+
9
+ This file is a starting point. Prune it before use: a rule that names an artifact your skills
10
+ do not have teaches the agent to look for nothing. Nothing here is part of the standard, and
11
+ no check reads it.
12
+
13
+ ## The long variant
14
+
15
+ ```
16
+ quality_rules:
17
+ - measure every option by what serves the project best over its lifetime
18
+ - state delivery cost, risk, and timeline explicitly for the operator
19
+ - do not let your own convenience in this session stand in for them
20
+ - name the project invariants the change touches: module boundaries, public APIs, data schemas, and the decision records in force
21
+ - cite the concrete rule, decision record, architecture document, or code location each judgment rests on
22
+ - no ground named, no recommendation: research until you can name it, never fill the gap with a guess
23
+ - present at least 2 viable approaches when the change touches a module boundary, public API, data schema, or architectural invariant
24
+ - if only 1 approach is viable, say so and why the others are not
25
+ - give per approach: consequences over the next 6–12 months of project evolution, effect on coupling, hidden risks
26
+ - reject each alternative in its strongest version, and name the reason
27
+ - do not accept "faster to write", "easier", or "smaller diff for me now" as justification for violating an invariant or an established convention of the codebase
28
+ - justify any divergent local pattern explicitly: two ways of doing one thing is a real cost
29
+ - name a large blast radius — many call sites, data migrations, compatibility breaks — as the genuine risk and cost it is
30
+ - prefer the smaller change at equal architectural correctness, and add no abstractions for hypothetical needs
31
+ - an obligation costs what it takes to satisfy: name the failure each one prevents, and drop the obligation whose cost is above that failure
32
+ - count effort already sunk into existing code as nothing by itself; the compatibility and migration cost of replacing it does count
33
+ - when the correct option costs more, present it alongside the cheap one, each with its cost, risk, and reversibility
34
+ - demand stronger grounds for hard-to-reverse choices such as data schemas and public APIs
35
+ - end with exactly 1 explicit recommendation; the operator decides, never silently downgrade to the cheap option
36
+ - revise a recommendation only on a new fact, a new constraint, a found reasoning error, a clarified goal, or an explicit operator decision, and name what changed
37
+ - disagreement alone is not new information: a flip with no new grounds means the original was ungrounded
38
+ ```
39
+
40
+ Carried by the skills that choose between options and recommend one.
41
+
42
+ ## The short variant
43
+
44
+ ```
45
+ quality_rules:
46
+ - the decision is already made: do not re-litigate it
47
+ - ground every verdict in a concrete rule, a decision record, a plan step, or a code location
48
+ - no ground named, no verdict: research until you can name it, never guess
49
+ - report code diverging from the decision as a deviation, with evidence
50
+ - do not resolve a deviation by reshaping the judgment to fit it
51
+ - do not excuse a deviation because fixing it would be laborious
52
+ - follow the project's existing conventions and invariants for tactical choices
53
+ - do not accept agent convenience — "faster", "easier" for this session — as an argument
54
+ - revise a verdict only on a new fact, a found reasoning error, or an explicit operator decision, and name what changed
55
+ - disagreement alone is not new information
56
+ ```
57
+
58
+ Carried by the skills that check work against a decision already taken.
59
+
60
+ ## Keeping the copies identical
61
+
62
+ The rubric only stays shared if something asserts it. Write a test in your own repository that
63
+ lists which skills carry which variant and asserts the block is byte-identical within each
64
+ group. Without it, the first hand-edit to one copy goes unnoticed and the rubric stops being
65
+ shared — which is exactly what happened to the first project that adopted this file and never
66
+ ported the test.
67
+
68
+ `cnlp check` does not do this for you: the checker reads the profile, and the profile declares
69
+ that `quality_rules:` is a bullet-list, not what the bullets say.