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.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/commands/gcf.js +173 -0
- package/extension.json +24 -0
- package/hooks/pre-commit.js +91 -0
- package/injections/commit-status.md +6 -0
- package/injections/plan-context.md +8 -0
- package/injections/review-pillars.md +7 -0
- package/lib/anchors.js +109 -0
- package/lib/audit-core.js +102 -0
- package/lib/context.js +77 -0
- package/lib/frontmatter.js +26 -0
- package/lib/gcf-paths.js +60 -0
- package/lib/git.js +19 -0
- package/lib/id.js +42 -0
- package/lib/index-gen.js +51 -0
- package/lib/linter.js +61 -0
- package/lib/playtest-list.js +13 -0
- package/lib/safe-path.js +71 -0
- package/lib/transitions.js +30 -0
- package/lib/validate-card.js +48 -0
- package/lib/verdict-fs.js +126 -0
- package/node_modules/cnlp-kit/CHANGELOG.md +625 -0
- package/node_modules/cnlp-kit/LICENSE +21 -0
- package/node_modules/cnlp-kit/README.md +242 -0
- package/node_modules/cnlp-kit/bin/cnlp.js +334 -0
- package/node_modules/cnlp-kit/cnlp-format.md +470 -0
- package/node_modules/cnlp-kit/package.json +40 -0
- package/node_modules/cnlp-kit/profiles/adr.md +129 -0
- package/node_modules/cnlp-kit/profiles/api.md +87 -0
- package/node_modules/cnlp-kit/profiles/concept.md +70 -0
- package/node_modules/cnlp-kit/profiles/docset.md +103 -0
- package/node_modules/cnlp-kit/profiles/guide.md +51 -0
- package/node_modules/cnlp-kit/profiles/profile.md +69 -0
- package/node_modules/cnlp-kit/profiles/reference.md +61 -0
- package/node_modules/cnlp-kit/profiles/skill.md +75 -0
- package/node_modules/cnlp-kit/profiles/task.md +65 -0
- package/node_modules/cnlp-kit/quality-rules.md +69 -0
- package/node_modules/cnlp-kit/skills/cnlp-docset/SKILL.md +73 -0
- package/node_modules/cnlp-kit/skills/cnlp-migrate/SKILL.md +64 -0
- package/node_modules/cnlp-kit/src/cnlp.js +534 -0
- package/node_modules/cnlp-kit/src/config.js +352 -0
- package/node_modules/yaml/LICENSE +13 -0
- package/node_modules/yaml/README.md +172 -0
- package/node_modules/yaml/bin.mjs +11 -0
- package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +226 -0
- package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/node_modules/yaml/browser/dist/errors.js +57 -0
- package/node_modules/yaml/browser/dist/index.js +17 -0
- package/node_modules/yaml/browser/dist/log.js +11 -0
- package/node_modules/yaml/browser/dist/nodes/Alias.js +118 -0
- package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/node_modules/yaml/browser/dist/util.js +11 -0
- package/node_modules/yaml/browser/dist/visit.js +233 -0
- package/node_modules/yaml/browser/index.js +5 -0
- package/node_modules/yaml/browser/package.json +3 -0
- package/node_modules/yaml/dist/cli.d.ts +8 -0
- package/node_modules/yaml/dist/cli.mjs +201 -0
- package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/node_modules/yaml/dist/compose/composer.js +224 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +228 -0
- package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/node_modules/yaml/dist/doc/Document.js +337 -0
- package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/node_modules/yaml/dist/doc/directives.js +178 -0
- package/node_modules/yaml/dist/errors.d.ts +21 -0
- package/node_modules/yaml/dist/errors.js +62 -0
- package/node_modules/yaml/dist/index.d.ts +25 -0
- package/node_modules/yaml/dist/index.js +50 -0
- package/node_modules/yaml/dist/log.d.ts +3 -0
- package/node_modules/yaml/dist/log.js +19 -0
- package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/Alias.js +120 -0
- package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/node_modules/yaml/dist/options.d.ts +350 -0
- package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/node_modules/yaml/dist/parse/cst.js +112 -0
- package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/node_modules/yaml/dist/parse/parser.js +980 -0
- package/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/node_modules/yaml/dist/public-api.js +107 -0
- package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/node_modules/yaml/dist/schema/tags.js +99 -0
- package/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/node_modules/yaml/dist/test-events.js +134 -0
- package/node_modules/yaml/dist/util.d.ts +16 -0
- package/node_modules/yaml/dist/util.js +28 -0
- package/node_modules/yaml/dist/visit.d.ts +102 -0
- package/node_modules/yaml/dist/visit.js +236 -0
- package/node_modules/yaml/package.json +97 -0
- package/node_modules/yaml/util.js +2 -0
- package/package.json +54 -0
- package/profiles/card.md +65 -0
- package/profiles/pillars.md +31 -0
- package/profiles/system.md +56 -0
- package/schemas/card.schema.json +30 -0
- package/skills/gcf-adopt/SKILL.md +41 -0
- package/skills/gcf-audit/SKILL.md +27 -0
- package/skills/gcf-card/SKILL.md +35 -0
- package/skills/gcf-debate/SKILL.md +33 -0
- package/skills/gcf-ingest/SKILL.md +38 -0
- package/skills/gcf-init/SKILL.md +32 -0
- package/skills/gcf-verdict/SKILL.md +32 -0
- package/skills/gcf-vision/SKILL.md +33 -0
- package/templates/PILLARS.md +8 -0
- package/templates/backlog.md +4 -0
- package/templates/card.md +34 -0
- package/templates/cnlp.config.json +8 -0
- package/templates/config.yml +8 -0
- 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
|
+
}
|
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
|
+
}
|
package/profiles/card.md
ADDED
|
@@ -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
|