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,236 @@
1
+ 'use strict';
2
+
3
+ var identity = require('./nodes/identity.js');
4
+
5
+ const BREAK = Symbol('break visit');
6
+ const SKIP = Symbol('skip children');
7
+ const REMOVE = Symbol('remove node');
8
+ /**
9
+ * Apply a visitor to an AST node or document.
10
+ *
11
+ * Walks through the tree (depth-first) starting from `node`, calling a
12
+ * `visitor` function with three arguments:
13
+ * - `key`: For sequence values and map `Pair`, the node's index in the
14
+ * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.
15
+ * `null` for the root node.
16
+ * - `node`: The current node.
17
+ * - `path`: The ancestry of the current node.
18
+ *
19
+ * The return value of the visitor may be used to control the traversal:
20
+ * - `undefined` (default): Do nothing and continue
21
+ * - `visit.SKIP`: Do not visit the children of this node, continue with next
22
+ * sibling
23
+ * - `visit.BREAK`: Terminate traversal completely
24
+ * - `visit.REMOVE`: Remove the current node, then continue with the next one
25
+ * - `Node`: Replace the current node, then continue by visiting it
26
+ * - `number`: While iterating the items of a sequence or map, set the index
27
+ * of the next step. This is useful especially if the index of the current
28
+ * node has changed.
29
+ *
30
+ * If `visitor` is a single function, it will be called with all values
31
+ * encountered in the tree, including e.g. `null` values. Alternatively,
32
+ * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,
33
+ * `Alias` and `Scalar` node. To define the same visitor function for more than
34
+ * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)
35
+ * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most
36
+ * specific defined one will be used for each node.
37
+ */
38
+ function visit(node, visitor) {
39
+ const visitor_ = initVisitor(visitor);
40
+ if (identity.isDocument(node)) {
41
+ const cd = visit_(null, node.contents, visitor_, Object.freeze([node]));
42
+ if (cd === REMOVE)
43
+ node.contents = null;
44
+ }
45
+ else
46
+ visit_(null, node, visitor_, Object.freeze([]));
47
+ }
48
+ // Without the `as symbol` casts, TS declares these in the `visit`
49
+ // namespace using `var`, but then complains about that because
50
+ // `unique symbol` must be `const`.
51
+ /** Terminate visit traversal completely */
52
+ visit.BREAK = BREAK;
53
+ /** Do not visit the children of the current node */
54
+ visit.SKIP = SKIP;
55
+ /** Remove the current node */
56
+ visit.REMOVE = REMOVE;
57
+ function visit_(key, node, visitor, path) {
58
+ const ctrl = callVisitor(key, node, visitor, path);
59
+ if (identity.isNode(ctrl) || identity.isPair(ctrl)) {
60
+ replaceNode(key, path, ctrl);
61
+ return visit_(key, ctrl, visitor, path);
62
+ }
63
+ if (typeof ctrl !== 'symbol') {
64
+ if (identity.isCollection(node)) {
65
+ path = Object.freeze(path.concat(node));
66
+ for (let i = 0; i < node.items.length; ++i) {
67
+ const ci = visit_(i, node.items[i], visitor, path);
68
+ if (typeof ci === 'number')
69
+ i = ci - 1;
70
+ else if (ci === BREAK)
71
+ return BREAK;
72
+ else if (ci === REMOVE) {
73
+ node.items.splice(i, 1);
74
+ i -= 1;
75
+ }
76
+ }
77
+ }
78
+ else if (identity.isPair(node)) {
79
+ path = Object.freeze(path.concat(node));
80
+ const ck = visit_('key', node.key, visitor, path);
81
+ if (ck === BREAK)
82
+ return BREAK;
83
+ else if (ck === REMOVE)
84
+ node.key = null;
85
+ const cv = visit_('value', node.value, visitor, path);
86
+ if (cv === BREAK)
87
+ return BREAK;
88
+ else if (cv === REMOVE)
89
+ node.value = null;
90
+ }
91
+ }
92
+ return ctrl;
93
+ }
94
+ /**
95
+ * Apply an async visitor to an AST node or document.
96
+ *
97
+ * Walks through the tree (depth-first) starting from `node`, calling a
98
+ * `visitor` function with three arguments:
99
+ * - `key`: For sequence values and map `Pair`, the node's index in the
100
+ * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.
101
+ * `null` for the root node.
102
+ * - `node`: The current node.
103
+ * - `path`: The ancestry of the current node.
104
+ *
105
+ * The return value of the visitor may be used to control the traversal:
106
+ * - `Promise`: Must resolve to one of the following values
107
+ * - `undefined` (default): Do nothing and continue
108
+ * - `visit.SKIP`: Do not visit the children of this node, continue with next
109
+ * sibling
110
+ * - `visit.BREAK`: Terminate traversal completely
111
+ * - `visit.REMOVE`: Remove the current node, then continue with the next one
112
+ * - `Node`: Replace the current node, then continue by visiting it
113
+ * - `number`: While iterating the items of a sequence or map, set the index
114
+ * of the next step. This is useful especially if the index of the current
115
+ * node has changed.
116
+ *
117
+ * If `visitor` is a single function, it will be called with all values
118
+ * encountered in the tree, including e.g. `null` values. Alternatively,
119
+ * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,
120
+ * `Alias` and `Scalar` node. To define the same visitor function for more than
121
+ * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)
122
+ * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most
123
+ * specific defined one will be used for each node.
124
+ */
125
+ async function visitAsync(node, visitor) {
126
+ const visitor_ = initVisitor(visitor);
127
+ if (identity.isDocument(node)) {
128
+ const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node]));
129
+ if (cd === REMOVE)
130
+ node.contents = null;
131
+ }
132
+ else
133
+ await visitAsync_(null, node, visitor_, Object.freeze([]));
134
+ }
135
+ // Without the `as symbol` casts, TS declares these in the `visit`
136
+ // namespace using `var`, but then complains about that because
137
+ // `unique symbol` must be `const`.
138
+ /** Terminate visit traversal completely */
139
+ visitAsync.BREAK = BREAK;
140
+ /** Do not visit the children of the current node */
141
+ visitAsync.SKIP = SKIP;
142
+ /** Remove the current node */
143
+ visitAsync.REMOVE = REMOVE;
144
+ async function visitAsync_(key, node, visitor, path) {
145
+ const ctrl = await callVisitor(key, node, visitor, path);
146
+ if (identity.isNode(ctrl) || identity.isPair(ctrl)) {
147
+ replaceNode(key, path, ctrl);
148
+ return visitAsync_(key, ctrl, visitor, path);
149
+ }
150
+ if (typeof ctrl !== 'symbol') {
151
+ if (identity.isCollection(node)) {
152
+ path = Object.freeze(path.concat(node));
153
+ for (let i = 0; i < node.items.length; ++i) {
154
+ const ci = await visitAsync_(i, node.items[i], visitor, path);
155
+ if (typeof ci === 'number')
156
+ i = ci - 1;
157
+ else if (ci === BREAK)
158
+ return BREAK;
159
+ else if (ci === REMOVE) {
160
+ node.items.splice(i, 1);
161
+ i -= 1;
162
+ }
163
+ }
164
+ }
165
+ else if (identity.isPair(node)) {
166
+ path = Object.freeze(path.concat(node));
167
+ const ck = await visitAsync_('key', node.key, visitor, path);
168
+ if (ck === BREAK)
169
+ return BREAK;
170
+ else if (ck === REMOVE)
171
+ node.key = null;
172
+ const cv = await visitAsync_('value', node.value, visitor, path);
173
+ if (cv === BREAK)
174
+ return BREAK;
175
+ else if (cv === REMOVE)
176
+ node.value = null;
177
+ }
178
+ }
179
+ return ctrl;
180
+ }
181
+ function initVisitor(visitor) {
182
+ if (typeof visitor === 'object' &&
183
+ (visitor.Collection || visitor.Node || visitor.Value)) {
184
+ return Object.assign({
185
+ Alias: visitor.Node,
186
+ Map: visitor.Node,
187
+ Scalar: visitor.Node,
188
+ Seq: visitor.Node
189
+ }, visitor.Value && {
190
+ Map: visitor.Value,
191
+ Scalar: visitor.Value,
192
+ Seq: visitor.Value
193
+ }, visitor.Collection && {
194
+ Map: visitor.Collection,
195
+ Seq: visitor.Collection
196
+ }, visitor);
197
+ }
198
+ return visitor;
199
+ }
200
+ function callVisitor(key, node, visitor, path) {
201
+ if (typeof visitor === 'function')
202
+ return visitor(key, node, path);
203
+ if (identity.isMap(node))
204
+ return visitor.Map?.(key, node, path);
205
+ if (identity.isSeq(node))
206
+ return visitor.Seq?.(key, node, path);
207
+ if (identity.isPair(node))
208
+ return visitor.Pair?.(key, node, path);
209
+ if (identity.isScalar(node))
210
+ return visitor.Scalar?.(key, node, path);
211
+ if (identity.isAlias(node))
212
+ return visitor.Alias?.(key, node, path);
213
+ return undefined;
214
+ }
215
+ function replaceNode(key, path, node) {
216
+ const parent = path[path.length - 1];
217
+ if (identity.isCollection(parent)) {
218
+ parent.items[key] = node;
219
+ }
220
+ else if (identity.isPair(parent)) {
221
+ if (key === 'key')
222
+ parent.key = node;
223
+ else
224
+ parent.value = node;
225
+ }
226
+ else if (identity.isDocument(parent)) {
227
+ parent.contents = node;
228
+ }
229
+ else {
230
+ const pt = identity.isAlias(parent) ? 'alias' : 'scalar';
231
+ throw new Error(`Cannot replace node with ${pt} parent`);
232
+ }
233
+ }
234
+
235
+ exports.visit = visit;
236
+ exports.visitAsync = visitAsync;
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "yaml",
3
+ "version": "2.9.1",
4
+ "license": "ISC",
5
+ "author": "Eemeli Aro <eemeli@gmail.com>",
6
+ "funding": "https://github.com/sponsors/eemeli",
7
+ "repository": "github:eemeli/yaml",
8
+ "description": "JavaScript parser and stringifier for YAML",
9
+ "keywords": [
10
+ "YAML",
11
+ "parser",
12
+ "stringifier"
13
+ ],
14
+ "homepage": "https://eemeli.org/yaml/",
15
+ "files": [
16
+ "browser/",
17
+ "dist/",
18
+ "util.js"
19
+ ],
20
+ "type": "commonjs",
21
+ "main": "./dist/index.js",
22
+ "bin": "./bin.mjs",
23
+ "browser": {
24
+ "./dist/index.js": "./browser/index.js",
25
+ "./dist/util.js": "./browser/dist/util.js",
26
+ "./util.js": "./browser/dist/util.js"
27
+ },
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "node": "./dist/index.js",
32
+ "default": "./browser/index.js"
33
+ },
34
+ "./package.json": "./package.json",
35
+ "./util": {
36
+ "types": "./dist/util.d.ts",
37
+ "node": "./dist/util.js",
38
+ "default": "./browser/dist/util.js"
39
+ }
40
+ },
41
+ "scripts": {
42
+ "build": "npm run build:node && npm run build:browser",
43
+ "build:browser": "rollup -c config/rollup.browser-config.mjs",
44
+ "build:node": "rollup -c config/rollup.node-config.mjs",
45
+ "clean": "git clean -fdxe node_modules",
46
+ "lint": "eslint config/ src/",
47
+ "prettier": "prettier --write .",
48
+ "prestart": "rollup --sourcemap -c config/rollup.node-config.mjs",
49
+ "start": "node --enable-source-maps -i -e 'YAML=require(\"./dist/index.js\");const{parse,parseDocument,parseAllDocuments}=YAML'",
50
+ "test": "jest --config config/jest.config.js",
51
+ "test:all": "npm test && npm run test:types && npm run test:dist && npm run test:dist:types",
52
+ "test:browsers": "cd playground && npm test",
53
+ "test:dist": "npm run build:node && jest --config config/jest.config.js",
54
+ "test:dist:types": "tsc --allowJs --moduleResolution node --noEmit --target es5 dist/index.js",
55
+ "test:types": "tsc --noEmit && tsc --noEmit -p tests/tsconfig.json",
56
+ "docs:install": "cd docs-slate && bundle install",
57
+ "predocs:deploy": "node docs/prepare-docs.mjs",
58
+ "docs:deploy": "cd docs-slate && ./deploy.sh",
59
+ "predocs": "node docs/prepare-docs.mjs",
60
+ "docs": "cd docs-slate && bundle exec middleman server",
61
+ "preversion": "npm test && npm run build",
62
+ "prepublishOnly": "npm run clean && npm test && npm run build"
63
+ },
64
+ "browserslist": "defaults, not ie 11",
65
+ "prettier": {
66
+ "arrowParens": "avoid",
67
+ "semi": false,
68
+ "singleQuote": true,
69
+ "trailingComma": "none"
70
+ },
71
+ "devDependencies": {
72
+ "@babel/core": "^7.12.10",
73
+ "@babel/plugin-transform-typescript": "^7.12.17",
74
+ "@babel/preset-env": "^7.12.11",
75
+ "@eslint/js": "^9.9.1",
76
+ "@rollup/plugin-babel": "^6.0.3",
77
+ "@rollup/plugin-replace": "^6.0.3",
78
+ "@rollup/plugin-typescript": "^12.1.1",
79
+ "@types/jest": "^29.2.4",
80
+ "@types/node": "^20.11.20",
81
+ "babel-jest": "^29.0.1",
82
+ "eslint": "^9.9.1",
83
+ "eslint-config-prettier": "^10.1.8",
84
+ "fast-check": "^2.12.0",
85
+ "jest": "^29.0.1",
86
+ "jest-resolve": "^29.7.0",
87
+ "jest-ts-webcompat-resolver": "^1.0.0",
88
+ "prettier": "^3.0.2",
89
+ "rollup": "^4.12.0",
90
+ "tslib": "^2.8.1",
91
+ "typescript": "^5.7.2",
92
+ "typescript-eslint": "^8.4.0"
93
+ },
94
+ "engines": {
95
+ "node": ">= 14.6"
96
+ }
97
+ }
@@ -0,0 +1,2 @@
1
+ // Re-exporter for Node.js < 12.16.0
2
+ module.exports = require('./dist/util.js')
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "gcf-aif-ext",
3
+ "version": "0.2.0",
4
+ "description": "Game Context Framework for AI Factory",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Oleg (VirtualMaestro)",
8
+ "aiFactoryCompatibility": ">=2.0.0 <3.0.0",
9
+ "keywords": [
10
+ "ai-factory",
11
+ "gcf",
12
+ "gamedev",
13
+ "extension"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/VirtualMaestro/GCF.git"
18
+ },
19
+ "homepage": "https://github.com/VirtualMaestro/GCF#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/VirtualMaestro/GCF/issues"
22
+ },
23
+ "engines": {
24
+ "node": ">=22.14"
25
+ },
26
+ "scripts": {
27
+ "test": "node --test",
28
+ "prepack": "node -e \"const p=require('./package.json'),e=require('./extension.json');if(p.version!==e.version)throw new Error('version mismatch: package.json '+p.version+' vs extension.json '+e.version)\""
29
+ },
30
+ "files": [
31
+ "extension.json",
32
+ "injections",
33
+ "lib",
34
+ "skills",
35
+ "commands",
36
+ "templates",
37
+ "schemas",
38
+ "profiles",
39
+ "hooks",
40
+ "LICENSE",
41
+ "README.md"
42
+ ],
43
+ "dependencies": {
44
+ "cnlp-kit": "^3.1.3",
45
+ "yaml": "^2.5.1"
46
+ },
47
+ "bundleDependencies": [
48
+ "cnlp-kit",
49
+ "yaml"
50
+ ],
51
+ "devDependencies": {
52
+ "ajv": "^8.20.0"
53
+ }
54
+ }
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: card
3
+ description: The CNL-P profile of a GCF feature card — the six slots a card body carries, in order.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: declarative
9
+
10
+ headings:
11
+ - none: the body is flat and the document is named by its frontmatter or its fixed path
12
+
13
+ frontmatter_fields:
14
+ - schema
15
+ - id
16
+ - slug
17
+ - status
18
+ - route
19
+ - system
20
+ - depends
21
+ - source
22
+ - tune_count
23
+ - built_at
24
+ - created
25
+
26
+ lexicon_exempt:
27
+ - none: every field of a card body is read at planning time and must stay unambiguous
28
+
29
+ sections:
30
+ - key: behavior
31
+ form: bullet-list
32
+ required: yes
33
+ note: player input -> state change -> feedback, one observable statement per line
34
+
35
+ - key: contract
36
+ form: bullet-list
37
+ required: yes
38
+ note: entities, components and data flows the feature adds; paths and entry points, never member lists or values
39
+
40
+ - key: feel
41
+ form: bullet-list
42
+ required: yes
43
+ note: a comparison line (like X, not like Y) plus envelope lines; envelopes are the only legal numbers in gcf documents
44
+
45
+ - key: interactions
46
+ form: bullet-list
47
+ required: yes
48
+ note: existing mechanics this feature crosses; a soft line may end with an "[until: ...]" annotation
49
+
50
+ - key: constraints
51
+ form: bullet-list
52
+ required: yes
53
+ note: negative constraints, one prohibition per line, checkable by an analyzer or a reviewer
54
+
55
+ - key: miss_criterion
56
+ form: scalar
57
+ required: yes
58
+ note: the one question the game in hand answers; the human answers it at the verdict
59
+
60
+ custom_sections:
61
+ - none: a card block that is not listed above is prose looking for a home
62
+
63
+ enforcement:
64
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
65
+ - frontmatter is validated separately by `schemas/card.schema.json` in the gcf pre-commit hook
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: pillars
3
+ description: The CNL-P profile of gcf/PILLARS.md — the pillars and negative invariants read in every readset.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: declarative
9
+
10
+ headings:
11
+ - none: the body is flat and the document is named by its frontmatter or its fixed path
12
+
13
+ frontmatter_fields:
14
+ - none: the file is a singleton at a fixed path and carries no machine fields
15
+
16
+ lexicon_exempt:
17
+ - none: nothing is exempt in the most-read document of the project
18
+
19
+ sections:
20
+ - key: pillars
21
+ form: record-list
22
+ required: yes
23
+ record_keys: statement, invariant, review_question
24
+ note: pillar count <= 7 and the token budget are enforced by the gcf audit core, not the checker
25
+
26
+ custom_sections:
27
+ - none: a pillar that needs more than its three keys is not a pillar yet
28
+
29
+ enforcement:
30
+ - `npx cnlp check`, over the file a `cnlp.config.json` corpus entry maps to this profile
31
+ - `ai-factory gcf audit` checks the count and token budget
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: system
3
+ description: The CNL-P profile of a GCF subsystem state document — overwritten in place at every verdict.
4
+ ---
5
+
6
+ format: cnlp-format.md
7
+
8
+ mood: declarative
9
+
10
+ headings:
11
+ - none: the body is flat and the document is named by its frontmatter or its fixed path
12
+
13
+ frontmatter_fields:
14
+ - system
15
+ - updated_by
16
+
17
+ lexicon_exempt:
18
+ - none: the whole document is a readset member on every task touching the subsystem
19
+
20
+ sections:
21
+ - key: purpose
22
+ form: bullet-list
23
+ required: yes
24
+ note: what this subsystem is and why it exists, 2..5 lines of intent
25
+
26
+ - key: code
27
+ form: bullet-list
28
+ required: yes
29
+ note: paths and entry points only; member lists, signatures and balance values live in code
30
+
31
+ - key: behavior
32
+ form: bullet-list
33
+ required: yes
34
+ note: validated observable behaviors, one line each, appended by collapse
35
+
36
+ - key: feel
37
+ form: bullet-list
38
+ required: no
39
+ note: envelopes still in force, kept as constraints for future retunes
40
+
41
+ - key: constraints
42
+ form: bullet-list
43
+ required: yes
44
+ note: negative constraints and invariants accumulated from cards and hard implementations
45
+
46
+ - key: open
47
+ form: bullet-list
48
+ required: no
49
+ note: lines carrying a live "[until: ...]" annotation, moved here by collapse
50
+
51
+ custom_sections:
52
+ - none: a fact that fits no block above belongs to code or to a card, not here
53
+
54
+ enforcement:
55
+ - `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
56
+ - the gcf P2 linter adds its own forbidden-content patterns on top in the pre-commit hook
@@ -0,0 +1,30 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/VirtualMaestro/GCF/schemas/card.schema.json",
4
+ "title": "GCF card frontmatter",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "id", "slug", "status", "route", "system", "depends", "source", "tune_count", "created"],
8
+ "properties": {
9
+ "schema": { "const": 1 },
10
+ "id": { "type": "string", "pattern": "^card-\\d{3}$" },
11
+ "slug": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
12
+ "status": { "enum": ["proposed", "built", "tuning"] },
13
+ "route": { "enum": ["soft", "hard"] },
14
+ "system": {
15
+ "type": "array",
16
+ "minItems": 1,
17
+ "items": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" }
18
+ },
19
+ "depends": {
20
+ "type": "array",
21
+ "items": { "type": "string", "pattern": "^card-\\d{3}$" }
22
+ },
23
+ "source": { "type": "string", "pattern": "^(GDD#[A-Za-z0-9_-]+|manual|inferred)$" },
24
+ "tune_count": { "type": "integer", "minimum": 0 },
25
+ "built_at": {
26
+ "anyOf": [{ "type": "null" }, { "type": "string", "pattern": "^[0-9a-f]{7,40}$" }]
27
+ },
28
+ "created": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }
29
+ }
30
+ }
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: gcf-adopt
3
+ description: Put a project that already has code on GCF rails - subsystem dictionary, entry points, pillars, no retro-documentation. Use when a working game adopts GCF or the user says "заехать на существующий проект".
4
+ ---
5
+
6
+ mode: adoption
7
+
8
+ purpose:
9
+ - give an existing codebase the 3 things GCF runs on and code cannot hold: a subsystem name dictionary, entry-point paths, pillars
10
+ - keep the empty blocks empty: behavior, feel and constraints arrive at the first verdict that touches the subsystem
11
+
12
+ inputs:
13
+ - none: the skill reads the working directory and asks the human for the names and the intent
14
+
15
+ preconditions:
16
+ - the project is a git repository with AI Factory initialized
17
+ - the game already has code: a project with none starts at `/gcf-vision` instead
18
+
19
+ forbidden_behaviors:
20
+ - do not write `behavior`, `feel` or `constraints` out of reading code: a line derivable from code stays in code (П2)
21
+ - do not open cards or backlog lines for what is already implemented: adoption puts nobody into work
22
+ - do not schedule a retro playtest for a mechanic that already ships
23
+ - do not write a pillar or a subsystem name the human did not confirm: both are human authorship
24
+ - do not read code files whole: names, paths and entry points are the whole input
25
+
26
+ workflow:
27
+ 1. run `ai-factory gcf init` and report what it created; when `backlog.md` and `PILLARS.md` still hold the template examples, clear those example lines so INDEX does not count them
28
+ 2. scan the code tree by names only - directories, `*.asmdef`, feature classes, entry points - and propose a subsystem list with a path per entry
29
+ 3. ask the human to edit and confirm the names; a name they reject or doubt becomes a D1 record in `gcf/open-questions.md`, not a file
30
+ 4. write `gcf/systems/<name>.md` per confirmed subsystem from the package template, frontmatter `system: <name>` and `updated_by: adopt`
31
+ 5. fill `code:` with <= 2 bullets, the directory and the entry point: more bullets means 2 subsystems, and the П2 linter rejects 3 bullets naming CamelCase identifiers
32
+ 6. fill `purpose:` with one line of intent the human confirmed: the INDEX row of a subsystem is its first `purpose` bullet
33
+ 7. fill `behavior:` and `constraints:` with 1 placeholder each, annotated `[until: manual(first verdict touching <name>)]`: the profile requires both blocks, and a `manual(...)` trigger is not an audit finding
34
+ 8. write a constraint the human states out loud into `constraints:`, and do not interview subsystem by subsystem for more: unanswered questions on adoption day are the staleness this framework exists to remove
35
+ 9. draft `PILLARS.md` by the interview in the `gcf-init` skill, steps 3..5, and do not restate that interview here
36
+ 10. run `npx cnlp check`, then `ai-factory gcf lint` over each new systems doc, then `ai-factory gcf index`
37
+ 11. ask the human to run `ai-factory gcf hooks-install`; when it refuses over a foreign pre-commit, hand them the chain line it prints
38
+ 12. state the next step: an old design document goes through `/gcf-ingest`, new work starts at `/gcf-card`
39
+
40
+ invocation:
41
+ - run once, when a project that already has code adopts GCF
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: gcf-audit
3
+ description: Run the GCF consistency audit - stale until records, idle built cards, tune limits, P2 linter findings, plus a semantic contradiction pass. Use at session start or when the user says "аудит gcf".
4
+ ---
5
+
6
+ mode: inspection
7
+
8
+ purpose:
9
+ - report what rotted: the deterministic core finds the mechanical violations, this skill adds the semantic pass
10
+
11
+ inputs:
12
+ - none: the audit reads the whole gcf/ tree
13
+
14
+ forbidden_behaviors:
15
+ - do not fix findings silently: report, and change files only on an explicit go-ahead
16
+ - do not read `gcf/source/` during the semantic pass: audit covers the living layer only
17
+
18
+ workflow:
19
+ 1. run `ai-factory gcf audit --json` and read the report
20
+ 2. state the first line verbatim: stale built cards block dependent work, so they lead
21
+ 3. for each stale until record: name the file, the trigger that fired and the line to re-check
22
+ 4. semantic pass, only when the mechanical report is clean or the human asks: read the systems docs of ONE subsystem the human names and report pairs of lines that contradict each other as D1 questions
23
+ 5. list the pragmas: each `gcf:allow` is a standing exception, and a growing list is the linter rotting
24
+ 6. propose the next actions, ranked, proposed actions <= 3: playtest, answer a D1, or collapse a stale record
25
+
26
+ invocation:
27
+ - run at session start, after a long break, or on demand