faf-cli 7.13.0 → 7.13.1
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/README.md +11 -2
- package/dist/cli.js +279 -279
- package/dist/cli.js.map +28 -28
- package/dist/core/safe-write.d.ts +97 -0
- package/dist/core/slots.d.ts +2 -2
- package/dist/core/typed-none.d.ts +1 -1
- package/dist/detect/assemble.d.ts +1 -1
- package/dist/index.js +156 -156
- package/dist/index.js.map +24 -24
- package/package.json +1 -1
- package/project.faf +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../node_modules/yaml/dist/nodes/identity.js", "../node_modules/yaml/dist/visit.js", "../node_modules/yaml/dist/doc/directives.js", "../node_modules/yaml/dist/doc/anchors.js", "../node_modules/yaml/dist/doc/applyReviver.js", "../node_modules/yaml/dist/nodes/toJS.js", "../node_modules/yaml/dist/nodes/Node.js", "../node_modules/yaml/dist/nodes/Alias.js", "../node_modules/yaml/dist/nodes/Scalar.js", "../node_modules/yaml/dist/doc/createNode.js", "../node_modules/yaml/dist/nodes/Collection.js", "../node_modules/yaml/dist/stringify/stringifyComment.js", "../node_modules/yaml/dist/stringify/foldFlowLines.js", "../node_modules/yaml/dist/stringify/stringifyString.js", "../node_modules/yaml/dist/stringify/stringify.js", "../node_modules/yaml/dist/stringify/stringifyPair.js", "../node_modules/yaml/dist/log.js", "../node_modules/yaml/dist/schema/yaml-1.1/merge.js", "../node_modules/yaml/dist/nodes/addPairToJSMap.js", "../node_modules/yaml/dist/nodes/Pair.js", "../node_modules/yaml/dist/stringify/stringifyCollection.js", "../node_modules/yaml/dist/nodes/YAMLMap.js", "../node_modules/yaml/dist/schema/common/map.js", "../node_modules/yaml/dist/nodes/YAMLSeq.js", "../node_modules/yaml/dist/schema/common/seq.js", "../node_modules/yaml/dist/schema/common/string.js", "../node_modules/yaml/dist/schema/common/null.js", "../node_modules/yaml/dist/schema/core/bool.js", "../node_modules/yaml/dist/stringify/stringifyNumber.js", "../node_modules/yaml/dist/schema/core/float.js", "../node_modules/yaml/dist/schema/core/int.js", "../node_modules/yaml/dist/schema/core/schema.js", "../node_modules/yaml/dist/schema/json/schema.js", "../node_modules/yaml/dist/schema/yaml-1.1/binary.js", "../node_modules/yaml/dist/schema/yaml-1.1/pairs.js", "../node_modules/yaml/dist/schema/yaml-1.1/omap.js", "../node_modules/yaml/dist/schema/yaml-1.1/bool.js", "../node_modules/yaml/dist/schema/yaml-1.1/float.js", "../node_modules/yaml/dist/schema/yaml-1.1/int.js", "../node_modules/yaml/dist/schema/yaml-1.1/set.js", "../node_modules/yaml/dist/schema/yaml-1.1/timestamp.js", "../node_modules/yaml/dist/schema/yaml-1.1/schema.js", "../node_modules/yaml/dist/schema/tags.js", "../node_modules/yaml/dist/schema/Schema.js", "../node_modules/yaml/dist/stringify/stringifyDocument.js", "../node_modules/yaml/dist/doc/Document.js", "../node_modules/yaml/dist/errors.js", "../node_modules/yaml/dist/compose/resolve-props.js", "../node_modules/yaml/dist/compose/util-contains-newline.js", "../node_modules/yaml/dist/compose/util-flow-indent-check.js", "../node_modules/yaml/dist/compose/util-map-includes.js", "../node_modules/yaml/dist/compose/resolve-block-map.js", "../node_modules/yaml/dist/compose/resolve-block-seq.js", "../node_modules/yaml/dist/compose/resolve-end.js", "../node_modules/yaml/dist/compose/resolve-flow-collection.js", "../node_modules/yaml/dist/compose/compose-collection.js", "../node_modules/yaml/dist/compose/resolve-block-scalar.js", "../node_modules/yaml/dist/compose/resolve-flow-scalar.js", "../node_modules/yaml/dist/compose/compose-scalar.js", "../node_modules/yaml/dist/compose/util-empty-scalar-position.js", "../node_modules/yaml/dist/compose/compose-node.js", "../node_modules/yaml/dist/compose/compose-doc.js", "../node_modules/yaml/dist/compose/composer.js", "../node_modules/yaml/dist/parse/cst-scalar.js", "../node_modules/yaml/dist/parse/cst-stringify.js", "../node_modules/yaml/dist/parse/cst-visit.js", "../node_modules/yaml/dist/parse/cst.js", "../node_modules/yaml/dist/parse/lexer.js", "../node_modules/yaml/dist/parse/line-counter.js", "../node_modules/yaml/dist/parse/parser.js", "../node_modules/yaml/dist/public-api.js", "../src/core/slots.ts", "../src/ui/colors.ts", "../src/core/tiers.ts", "../src/wasm/kernel.ts", "../src/core/about.ts", "../src/core/scorer.ts", "../src/core/schema.ts", "../src/interop/faf.ts", "../node_modules/yaml/dist/index.js", "../src/core/safe-write.ts", "../src/core/shape.ts", "../src/core/yaml-edit.ts", "../src/core/faf-source.ts", "../src/core/cwd-guard.ts", "../src/core/drift.ts", "../src/interop/projecthtml.ts", "../src/core/render-hash.ts", "../src/core/json-edit.ts", "../src/interop/servercard.ts", "../src/interop/cards.ts", "../src/fafm/types.ts", "../src/fafm/soul.ts", "../src/fafm/from-claude-dir.ts", "../src/core/interview.ts", "../src/core/loop.ts", "../src/commands/bench.ts", "../src/detect/turbo-cat.ts", "../src/detect/turbo-cat-knowledge.ts", "../src/detect/dart.ts", "../src/detect/go.ts", "../src/detect/csharp.ts", "../src/detect/jvm.ts", "../src/detect/ruby.ts", "../src/detect/swift.ts", "../src/detect/relentless.ts", "../src/core/version.ts", "../src/detect/scanner.ts", "../src/detect/frameworks.ts", "../src/detect/stack.ts", "../src/interrogate/
|
|
3
|
+
"sources": ["../node_modules/yaml/dist/nodes/identity.js", "../node_modules/yaml/dist/visit.js", "../node_modules/yaml/dist/doc/directives.js", "../node_modules/yaml/dist/doc/anchors.js", "../node_modules/yaml/dist/doc/applyReviver.js", "../node_modules/yaml/dist/nodes/toJS.js", "../node_modules/yaml/dist/nodes/Node.js", "../node_modules/yaml/dist/nodes/Alias.js", "../node_modules/yaml/dist/nodes/Scalar.js", "../node_modules/yaml/dist/doc/createNode.js", "../node_modules/yaml/dist/nodes/Collection.js", "../node_modules/yaml/dist/stringify/stringifyComment.js", "../node_modules/yaml/dist/stringify/foldFlowLines.js", "../node_modules/yaml/dist/stringify/stringifyString.js", "../node_modules/yaml/dist/stringify/stringify.js", "../node_modules/yaml/dist/stringify/stringifyPair.js", "../node_modules/yaml/dist/log.js", "../node_modules/yaml/dist/schema/yaml-1.1/merge.js", "../node_modules/yaml/dist/nodes/addPairToJSMap.js", "../node_modules/yaml/dist/nodes/Pair.js", "../node_modules/yaml/dist/stringify/stringifyCollection.js", "../node_modules/yaml/dist/nodes/YAMLMap.js", "../node_modules/yaml/dist/schema/common/map.js", "../node_modules/yaml/dist/nodes/YAMLSeq.js", "../node_modules/yaml/dist/schema/common/seq.js", "../node_modules/yaml/dist/schema/common/string.js", "../node_modules/yaml/dist/schema/common/null.js", "../node_modules/yaml/dist/schema/core/bool.js", "../node_modules/yaml/dist/stringify/stringifyNumber.js", "../node_modules/yaml/dist/schema/core/float.js", "../node_modules/yaml/dist/schema/core/int.js", "../node_modules/yaml/dist/schema/core/schema.js", "../node_modules/yaml/dist/schema/json/schema.js", "../node_modules/yaml/dist/schema/yaml-1.1/binary.js", "../node_modules/yaml/dist/schema/yaml-1.1/pairs.js", "../node_modules/yaml/dist/schema/yaml-1.1/omap.js", "../node_modules/yaml/dist/schema/yaml-1.1/bool.js", "../node_modules/yaml/dist/schema/yaml-1.1/float.js", "../node_modules/yaml/dist/schema/yaml-1.1/int.js", "../node_modules/yaml/dist/schema/yaml-1.1/set.js", "../node_modules/yaml/dist/schema/yaml-1.1/timestamp.js", "../node_modules/yaml/dist/schema/yaml-1.1/schema.js", "../node_modules/yaml/dist/schema/tags.js", "../node_modules/yaml/dist/schema/Schema.js", "../node_modules/yaml/dist/stringify/stringifyDocument.js", "../node_modules/yaml/dist/doc/Document.js", "../node_modules/yaml/dist/errors.js", "../node_modules/yaml/dist/compose/resolve-props.js", "../node_modules/yaml/dist/compose/util-contains-newline.js", "../node_modules/yaml/dist/compose/util-flow-indent-check.js", "../node_modules/yaml/dist/compose/util-map-includes.js", "../node_modules/yaml/dist/compose/resolve-block-map.js", "../node_modules/yaml/dist/compose/resolve-block-seq.js", "../node_modules/yaml/dist/compose/resolve-end.js", "../node_modules/yaml/dist/compose/resolve-flow-collection.js", "../node_modules/yaml/dist/compose/compose-collection.js", "../node_modules/yaml/dist/compose/resolve-block-scalar.js", "../node_modules/yaml/dist/compose/resolve-flow-scalar.js", "../node_modules/yaml/dist/compose/compose-scalar.js", "../node_modules/yaml/dist/compose/util-empty-scalar-position.js", "../node_modules/yaml/dist/compose/compose-node.js", "../node_modules/yaml/dist/compose/compose-doc.js", "../node_modules/yaml/dist/compose/composer.js", "../node_modules/yaml/dist/parse/cst-scalar.js", "../node_modules/yaml/dist/parse/cst-stringify.js", "../node_modules/yaml/dist/parse/cst-visit.js", "../node_modules/yaml/dist/parse/cst.js", "../node_modules/yaml/dist/parse/lexer.js", "../node_modules/yaml/dist/parse/line-counter.js", "../node_modules/yaml/dist/parse/parser.js", "../node_modules/yaml/dist/public-api.js", "../src/core/slots.ts", "../src/ui/colors.ts", "../src/core/tiers.ts", "../src/wasm/kernel.ts", "../src/core/about.ts", "../src/core/scorer.ts", "../src/core/schema.ts", "../src/interop/faf.ts", "../node_modules/yaml/dist/index.js", "../src/core/safe-write.ts", "../src/core/shape.ts", "../src/core/yaml-edit.ts", "../src/core/faf-source.ts", "../src/core/cwd-guard.ts", "../src/core/drift.ts", "../src/interop/projecthtml.ts", "../src/core/render-hash.ts", "../src/core/json-edit.ts", "../src/interop/servercard.ts", "../src/interop/cards.ts", "../src/fafm/types.ts", "../src/fafm/soul.ts", "../src/fafm/from-claude-dir.ts", "../src/core/interview.ts", "../src/core/loop.ts", "../src/commands/bench.ts", "../src/detect/turbo-cat.ts", "../src/detect/turbo-cat-knowledge.ts", "../src/detect/dart.ts", "../src/detect/go.ts", "../src/detect/csharp.ts", "../src/detect/jvm.ts", "../src/detect/ruby.ts", "../src/detect/swift.ts", "../src/detect/relentless.ts", "../src/core/version.ts", "../src/detect/scanner.ts", "../src/detect/frameworks.ts", "../src/detect/stack.ts", "../src/interrogate/types.ts", "../src/interrogate/readme.ts", "../src/interrogate/cargo.ts", "../src/interrogate/compose.ts", "../src/interrogate/build-files.ts", "../src/interrogate/env.ts", "../src/interrogate/index.ts", "../src/core/typed-none.ts", "../src/detect/assemble.ts", "../src/detect/git-repo.ts", "../src/core/faf-dna.ts", "../src/interop/agents.ts", "../src/interop/claude.ts", "../src/interop/inject.ts", "../src/interop/commonmark.ts", "../src/interop/labels.ts", "../src/interop/gemini.ts", "../src/interop/cursorrules.ts", "../src/interop/copilot-instructions.ts", "../src/interop/claude-memory.ts", "../src/detect/enrich.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"'use strict';\n\nconst ALIAS = Symbol.for('yaml.alias');\nconst DOC = Symbol.for('yaml.document');\nconst MAP = Symbol.for('yaml.map');\nconst PAIR = Symbol.for('yaml.pair');\nconst SCALAR = Symbol.for('yaml.scalar');\nconst SEQ = Symbol.for('yaml.seq');\nconst NODE_TYPE = Symbol.for('yaml.node.type');\nconst isAlias = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === ALIAS;\nconst isDocument = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === DOC;\nconst isMap = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === MAP;\nconst isPair = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === PAIR;\nconst isScalar = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SCALAR;\nconst isSeq = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SEQ;\nfunction isCollection(node) {\n if (node && typeof node === 'object')\n switch (node[NODE_TYPE]) {\n case MAP:\n case SEQ:\n return true;\n }\n return false;\n}\nfunction isNode(node) {\n if (node && typeof node === 'object')\n switch (node[NODE_TYPE]) {\n case ALIAS:\n case MAP:\n case SCALAR:\n case SEQ:\n return true;\n }\n return false;\n}\nconst hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor;\n\nexports.ALIAS = ALIAS;\nexports.DOC = DOC;\nexports.MAP = MAP;\nexports.NODE_TYPE = NODE_TYPE;\nexports.PAIR = PAIR;\nexports.SCALAR = SCALAR;\nexports.SEQ = SEQ;\nexports.hasAnchor = hasAnchor;\nexports.isAlias = isAlias;\nexports.isCollection = isCollection;\nexports.isDocument = isDocument;\nexports.isMap = isMap;\nexports.isNode = isNode;\nexports.isPair = isPair;\nexports.isScalar = isScalar;\nexports.isSeq = isSeq;\n",
|
|
6
6
|
"'use strict';\n\nvar identity = require('./nodes/identity.js');\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove node');\n/**\n * Apply a visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n * - `key`: For sequence values and map `Pair`, the node's index in the\n * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n * `null` for the root node.\n * - `node`: The current node.\n * - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this node, continue with next\n * sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current node, then continue with the next one\n * - `Node`: Replace the current node, then continue by visiting it\n * - `number`: While iterating the items of a sequence or map, set the index\n * of the next step. This is useful especially if the index of the current\n * node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nfunction visit(node, visitor) {\n const visitor_ = initVisitor(visitor);\n if (identity.isDocument(node)) {\n const cd = visit_(null, node.contents, visitor_, Object.freeze([node]));\n if (cd === REMOVE)\n node.contents = null;\n }\n else\n visit_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisit.SKIP = SKIP;\n/** Remove the current node */\nvisit.REMOVE = REMOVE;\nfunction visit_(key, node, visitor, path) {\n const ctrl = callVisitor(key, node, visitor, path);\n if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n replaceNode(key, path, ctrl);\n return visit_(key, ctrl, visitor, path);\n }\n if (typeof ctrl !== 'symbol') {\n if (identity.isCollection(node)) {\n path = Object.freeze(path.concat(node));\n for (let i = 0; i < node.items.length; ++i) {\n const ci = visit_(i, node.items[i], visitor, path);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n node.items.splice(i, 1);\n i -= 1;\n }\n }\n }\n else if (identity.isPair(node)) {\n path = Object.freeze(path.concat(node));\n const ck = visit_('key', node.key, visitor, path);\n if (ck === BREAK)\n return BREAK;\n else if (ck === REMOVE)\n node.key = null;\n const cv = visit_('value', node.value, visitor, path);\n if (cv === BREAK)\n return BREAK;\n else if (cv === REMOVE)\n node.value = null;\n }\n }\n return ctrl;\n}\n/**\n * Apply an async visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n * - `key`: For sequence values and map `Pair`, the node's index in the\n * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n * `null` for the root node.\n * - `node`: The current node.\n * - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `Promise`: Must resolve to one of the following values\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this node, continue with next\n * sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current node, then continue with the next one\n * - `Node`: Replace the current node, then continue by visiting it\n * - `number`: While iterating the items of a sequence or map, set the index\n * of the next step. This is useful especially if the index of the current\n * node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nasync function visitAsync(node, visitor) {\n const visitor_ = initVisitor(visitor);\n if (identity.isDocument(node)) {\n const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node]));\n if (cd === REMOVE)\n node.contents = null;\n }\n else\n await visitAsync_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisitAsync.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisitAsync.SKIP = SKIP;\n/** Remove the current node */\nvisitAsync.REMOVE = REMOVE;\nasync function visitAsync_(key, node, visitor, path) {\n const ctrl = await callVisitor(key, node, visitor, path);\n if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n replaceNode(key, path, ctrl);\n return visitAsync_(key, ctrl, visitor, path);\n }\n if (typeof ctrl !== 'symbol') {\n if (identity.isCollection(node)) {\n path = Object.freeze(path.concat(node));\n for (let i = 0; i < node.items.length; ++i) {\n const ci = await visitAsync_(i, node.items[i], visitor, path);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n node.items.splice(i, 1);\n i -= 1;\n }\n }\n }\n else if (identity.isPair(node)) {\n path = Object.freeze(path.concat(node));\n const ck = await visitAsync_('key', node.key, visitor, path);\n if (ck === BREAK)\n return BREAK;\n else if (ck === REMOVE)\n node.key = null;\n const cv = await visitAsync_('value', node.value, visitor, path);\n if (cv === BREAK)\n return BREAK;\n else if (cv === REMOVE)\n node.value = null;\n }\n }\n return ctrl;\n}\nfunction initVisitor(visitor) {\n if (typeof visitor === 'object' &&\n (visitor.Collection || visitor.Node || visitor.Value)) {\n return Object.assign({\n Alias: visitor.Node,\n Map: visitor.Node,\n Scalar: visitor.Node,\n Seq: visitor.Node\n }, visitor.Value && {\n Map: visitor.Value,\n Scalar: visitor.Value,\n Seq: visitor.Value\n }, visitor.Collection && {\n Map: visitor.Collection,\n Seq: visitor.Collection\n }, visitor);\n }\n return visitor;\n}\nfunction callVisitor(key, node, visitor, path) {\n if (typeof visitor === 'function')\n return visitor(key, node, path);\n if (identity.isMap(node))\n return visitor.Map?.(key, node, path);\n if (identity.isSeq(node))\n return visitor.Seq?.(key, node, path);\n if (identity.isPair(node))\n return visitor.Pair?.(key, node, path);\n if (identity.isScalar(node))\n return visitor.Scalar?.(key, node, path);\n if (identity.isAlias(node))\n return visitor.Alias?.(key, node, path);\n return undefined;\n}\nfunction replaceNode(key, path, node) {\n const parent = path[path.length - 1];\n if (identity.isCollection(parent)) {\n parent.items[key] = node;\n }\n else if (identity.isPair(parent)) {\n if (key === 'key')\n parent.key = node;\n else\n parent.value = node;\n }\n else if (identity.isDocument(parent)) {\n parent.contents = node;\n }\n else {\n const pt = identity.isAlias(parent) ? 'alias' : 'scalar';\n throw new Error(`Cannot replace node with ${pt} parent`);\n }\n}\n\nexports.visit = visit;\nexports.visitAsync = visitAsync;\n",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"'use strict';\n\n/**\n * Tracks newlines during parsing in order to provide an efficient API for\n * determining the one-indexed `{ line, col }` position for any offset\n * within the input.\n */\nclass LineCounter {\n constructor() {\n this.lineStarts = [];\n /**\n * Should be called in ascending order. Otherwise, call\n * `lineCounter.lineStarts.sort()` before calling `linePos()`.\n */\n this.addNewLine = (offset) => this.lineStarts.push(offset);\n /**\n * Performs a binary search and returns the 1-indexed { line, col }\n * position of `offset`. If `line === 0`, `addNewLine` has never been\n * called or `offset` is before the first known newline.\n */\n this.linePos = (offset) => {\n let low = 0;\n let high = this.lineStarts.length;\n while (low < high) {\n const mid = (low + high) >> 1; // Math.floor((low + high) / 2)\n if (this.lineStarts[mid] < offset)\n low = mid + 1;\n else\n high = mid;\n }\n if (this.lineStarts[low] === offset)\n return { line: low + 1, col: 1 };\n if (low === 0)\n return { line: 0, col: offset };\n const start = this.lineStarts[low - 1];\n return { line: low, col: offset - start + 1 };\n };\n }\n}\n\nexports.LineCounter = LineCounter;\n",
|
|
74
74
|
"'use strict';\n\nvar node_process = require('process');\nvar cst = require('./cst.js');\nvar lexer = require('./lexer.js');\n\nfunction includesToken(list, type) {\n for (let i = 0; i < list.length; ++i)\n if (list[i].type === type)\n return true;\n return false;\n}\nfunction findNonEmptyIndex(list) {\n for (let i = 0; i < list.length; ++i) {\n switch (list[i].type) {\n case 'space':\n case 'comment':\n case 'newline':\n break;\n default:\n return i;\n }\n }\n return -1;\n}\nfunction isFlowToken(token) {\n switch (token?.type) {\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n case 'flow-collection':\n return true;\n default:\n return false;\n }\n}\nfunction getPrevProps(parent) {\n switch (parent.type) {\n case 'document':\n return parent.start;\n case 'block-map': {\n const it = parent.items[parent.items.length - 1];\n return it.sep ?? it.start;\n }\n case 'block-seq':\n return parent.items[parent.items.length - 1].start;\n /* istanbul ignore next should not happen */\n default:\n return [];\n }\n}\n/** Note: May modify input array */\nfunction getFirstKeyStartProps(prev) {\n if (prev.length === 0)\n return [];\n let i = prev.length;\n loop: while (--i >= 0) {\n switch (prev[i].type) {\n case 'doc-start':\n case 'explicit-key-ind':\n case 'map-value-ind':\n case 'seq-item-ind':\n case 'newline':\n break loop;\n }\n }\n while (prev[++i]?.type === 'space') {\n /* loop */\n }\n return prev.splice(i, prev.length);\n}\nfunction arrayPushArray(target, source) {\n // May exhaust call stack with large `source` array\n if (source.length < 1e5)\n Array.prototype.push.apply(target, source);\n else\n for (let i = 0; i < source.length; ++i)\n target.push(source[i]);\n}\nfunction fixFlowSeqItems(fc) {\n if (fc.start.type === 'flow-seq-start') {\n for (const it of fc.items) {\n if (it.sep &&\n !it.value &&\n !includesToken(it.start, 'explicit-key-ind') &&\n !includesToken(it.sep, 'map-value-ind')) {\n if (it.key)\n it.value = it.key;\n delete it.key;\n if (isFlowToken(it.value)) {\n if (it.value.end)\n arrayPushArray(it.value.end, it.sep);\n else\n it.value.end = it.sep;\n }\n else\n arrayPushArray(it.start, it.sep);\n delete it.sep;\n }\n }\n }\n}\n/**\n * A YAML concrete syntax tree (CST) parser\n *\n * ```ts\n * const src: string = ...\n * for (const token of new Parser().parse(src)) {\n * // token: Token\n * }\n * ```\n *\n * To use the parser with a user-provided lexer:\n *\n * ```ts\n * function* parse(source: string, lexer: Lexer) {\n * const parser = new Parser()\n * for (const lexeme of lexer.lex(source))\n * yield* parser.next(lexeme)\n * yield* parser.end()\n * }\n *\n * const src: string = ...\n * const lexer = new Lexer()\n * for (const token of parse(src, lexer)) {\n * // token: Token\n * }\n * ```\n */\nclass Parser {\n /**\n * @param onNewLine - If defined, called separately with the start position of\n * each new line (in `parse()`, including the start of input).\n */\n constructor(onNewLine) {\n /** If true, space and sequence indicators count as indentation */\n this.atNewLine = true;\n /** If true, next token is a scalar value */\n this.atScalar = false;\n /** Current indentation level */\n this.indent = 0;\n /** Current offset since the start of parsing */\n this.offset = 0;\n /** On the same line with a block map key */\n this.onKeyLine = false;\n /** Top indicates the node that's currently being built */\n this.stack = [];\n /** The source of the current token, set in parse() */\n this.source = '';\n /** The type of the current token, set in parse() */\n this.type = '';\n // Must be defined after `next()`\n this.lexer = new lexer.Lexer();\n this.onNewLine = onNewLine;\n }\n /**\n * Parse `source` as a YAML stream.\n * If `incomplete`, a part of the last line may be left as a buffer for the next call.\n *\n * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens.\n *\n * @returns A generator of tokens representing each directive, document, and other structure.\n */\n *parse(source, incomplete = false) {\n if (this.onNewLine && this.offset === 0)\n this.onNewLine(0);\n for (const lexeme of this.lexer.lex(source, incomplete))\n yield* this.next(lexeme);\n if (!incomplete)\n yield* this.end();\n }\n /**\n * Advance the parser by the `source` of one lexical token.\n */\n *next(source) {\n this.source = source;\n if (node_process.env.LOG_TOKENS)\n console.log('|', cst.prettyToken(source));\n if (this.atScalar) {\n this.atScalar = false;\n yield* this.step();\n this.offset += source.length;\n return;\n }\n const type = cst.tokenType(source);\n if (!type) {\n const message = `Not a YAML token: ${source}`;\n yield* this.pop({ type: 'error', offset: this.offset, message, source });\n this.offset += source.length;\n }\n else if (type === 'scalar') {\n this.atNewLine = false;\n this.atScalar = true;\n this.type = 'scalar';\n }\n else {\n this.type = type;\n yield* this.step();\n switch (type) {\n case 'newline':\n this.atNewLine = true;\n this.indent = 0;\n if (this.onNewLine)\n this.onNewLine(this.offset + source.length);\n break;\n case 'space':\n if (this.atNewLine && source[0] === ' ')\n this.indent += source.length;\n break;\n case 'explicit-key-ind':\n case 'map-value-ind':\n case 'seq-item-ind':\n if (this.atNewLine)\n this.indent += source.length;\n break;\n case 'doc-mode':\n case 'flow-error-end':\n return;\n default:\n this.atNewLine = false;\n }\n this.offset += source.length;\n }\n }\n /** Call at end of input to push out any remaining constructions */\n *end() {\n while (this.stack.length > 0)\n yield* this.pop();\n }\n get sourceToken() {\n const st = {\n type: this.type,\n offset: this.offset,\n indent: this.indent,\n source: this.source\n };\n return st;\n }\n *step() {\n const top = this.peek(1);\n if (this.type === 'doc-end' && top?.type !== 'doc-end') {\n while (this.stack.length > 0)\n yield* this.pop();\n this.stack.push({\n type: 'doc-end',\n offset: this.offset,\n source: this.source\n });\n return;\n }\n if (!top)\n return yield* this.stream();\n switch (top.type) {\n case 'document':\n return yield* this.document(top);\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return yield* this.scalar(top);\n case 'block-scalar':\n return yield* this.blockScalar(top);\n case 'block-map':\n return yield* this.blockMap(top);\n case 'block-seq':\n return yield* this.blockSequence(top);\n case 'flow-collection':\n return yield* this.flowCollection(top);\n case 'doc-end':\n return yield* this.documentEnd(top);\n }\n /* istanbul ignore next should not happen */\n yield* this.pop();\n }\n peek(n) {\n return this.stack[this.stack.length - n];\n }\n *pop(error) {\n const token = error ?? this.stack.pop();\n /* istanbul ignore if should not happen */\n if (!token) {\n const message = 'Tried to pop an empty stack';\n yield { type: 'error', offset: this.offset, source: '', message };\n }\n else if (this.stack.length === 0) {\n yield token;\n }\n else {\n const top = this.peek(1);\n if (token.type === 'block-scalar') {\n // Block scalars use their parent rather than header indent\n token.indent = 'indent' in top ? top.indent : 0;\n }\n else if (token.type === 'flow-collection' && top.type === 'document') {\n // Ignore all indent for top-level flow collections\n token.indent = 0;\n }\n if (token.type === 'flow-collection')\n fixFlowSeqItems(token);\n switch (top.type) {\n case 'document':\n top.value = token;\n break;\n case 'block-scalar':\n top.props.push(token); // error\n break;\n case 'block-map': {\n const it = top.items[top.items.length - 1];\n if (it.value) {\n top.items.push({ start: [], key: token, sep: [] });\n this.onKeyLine = true;\n return;\n }\n else if (it.sep) {\n it.value = token;\n }\n else {\n Object.assign(it, { key: token, sep: [] });\n this.onKeyLine = !it.explicitKey;\n return;\n }\n break;\n }\n case 'block-seq': {\n const it = top.items[top.items.length - 1];\n if (it.value)\n top.items.push({ start: [], value: token });\n else\n it.value = token;\n break;\n }\n case 'flow-collection': {\n const it = top.items[top.items.length - 1];\n if (!it || it.value)\n top.items.push({ start: [], key: token, sep: [] });\n else if (it.sep)\n it.value = token;\n else\n Object.assign(it, { key: token, sep: [] });\n return;\n }\n /* istanbul ignore next should not happen */\n default:\n yield* this.pop();\n yield* this.pop(token);\n }\n if ((top.type === 'document' ||\n top.type === 'block-map' ||\n top.type === 'block-seq') &&\n (token.type === 'block-map' || token.type === 'block-seq')) {\n const last = token.items[token.items.length - 1];\n if (last &&\n !last.sep &&\n !last.value &&\n last.start.length > 0 &&\n findNonEmptyIndex(last.start) === -1 &&\n (token.indent === 0 ||\n last.start.every(st => st.type !== 'comment' || st.indent < token.indent))) {\n if (top.type === 'document')\n top.end = last.start;\n else\n top.items.push({ start: last.start });\n token.items.splice(-1, 1);\n }\n }\n }\n }\n *stream() {\n switch (this.type) {\n case 'directive-line':\n yield { type: 'directive', offset: this.offset, source: this.source };\n return;\n case 'byte-order-mark':\n case 'space':\n case 'comment':\n case 'newline':\n yield this.sourceToken;\n return;\n case 'doc-mode':\n case 'doc-start': {\n const doc = {\n type: 'document',\n offset: this.offset,\n start: []\n };\n if (this.type === 'doc-start')\n doc.start.push(this.sourceToken);\n this.stack.push(doc);\n return;\n }\n }\n yield {\n type: 'error',\n offset: this.offset,\n message: `Unexpected ${this.type} token in YAML stream`,\n source: this.source\n };\n }\n *document(doc) {\n if (doc.value)\n return yield* this.lineEnd(doc);\n switch (this.type) {\n case 'doc-start': {\n if (findNonEmptyIndex(doc.start) !== -1) {\n yield* this.pop();\n yield* this.step();\n }\n else\n doc.start.push(this.sourceToken);\n return;\n }\n case 'anchor':\n case 'tag':\n case 'space':\n case 'comment':\n case 'newline':\n doc.start.push(this.sourceToken);\n return;\n }\n const bv = this.startBlockValue(doc);\n if (bv)\n this.stack.push(bv);\n else {\n yield {\n type: 'error',\n offset: this.offset,\n message: `Unexpected ${this.type} token in YAML document`,\n source: this.source\n };\n }\n }\n *scalar(scalar) {\n if (this.type === 'map-value-ind') {\n const prev = getPrevProps(this.peek(2));\n const start = getFirstKeyStartProps(prev);\n let sep;\n if (scalar.end) {\n sep = scalar.end;\n sep.push(this.sourceToken);\n delete scalar.end;\n }\n else\n sep = [this.sourceToken];\n const map = {\n type: 'block-map',\n offset: scalar.offset,\n indent: scalar.indent,\n items: [{ start, key: scalar, sep }]\n };\n this.onKeyLine = true;\n this.stack[this.stack.length - 1] = map;\n }\n else\n yield* this.lineEnd(scalar);\n }\n *blockScalar(scalar) {\n switch (this.type) {\n case 'space':\n case 'comment':\n case 'newline':\n scalar.props.push(this.sourceToken);\n return;\n case 'scalar':\n scalar.source = this.source;\n // block-scalar source includes trailing newline\n this.atNewLine = true;\n this.indent = 0;\n if (this.onNewLine) {\n let nl = this.source.indexOf('\\n') + 1;\n while (nl !== 0) {\n this.onNewLine(this.offset + nl);\n nl = this.source.indexOf('\\n', nl) + 1;\n }\n }\n yield* this.pop();\n break;\n /* istanbul ignore next should not happen */\n default:\n yield* this.pop();\n yield* this.step();\n }\n }\n *blockMap(map) {\n const it = map.items[map.items.length - 1];\n // it.sep is true-ish if pair already has key or : separator\n switch (this.type) {\n case 'newline':\n this.onKeyLine = false;\n if (it.value) {\n const end = 'end' in it.value ? it.value.end : undefined;\n const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n if (last?.type === 'comment')\n end?.push(this.sourceToken);\n else\n map.items.push({ start: [this.sourceToken] });\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n it.start.push(this.sourceToken);\n }\n return;\n case 'space':\n case 'comment':\n if (it.value) {\n map.items.push({ start: [this.sourceToken] });\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n if (this.atIndentedComment(it.start, map.indent)) {\n const prev = map.items[map.items.length - 2];\n const end = prev?.value?.end;\n if (Array.isArray(end)) {\n arrayPushArray(end, it.start);\n end.push(this.sourceToken);\n map.items.pop();\n return;\n }\n }\n it.start.push(this.sourceToken);\n }\n return;\n }\n if (this.indent >= map.indent) {\n const atMapIndent = !this.onKeyLine && this.indent === map.indent;\n const atNextItem = atMapIndent &&\n (it.sep || it.explicitKey) &&\n this.type !== 'seq-item-ind';\n // For empty nodes, assign newline-separated not indented empty tokens to following node\n let start = [];\n if (atNextItem && it.sep && !it.value) {\n const nl = [];\n for (let i = 0; i < it.sep.length; ++i) {\n const st = it.sep[i];\n switch (st.type) {\n case 'newline':\n nl.push(i);\n break;\n case 'space':\n break;\n case 'comment':\n if (st.indent > map.indent)\n nl.length = 0;\n break;\n default:\n nl.length = 0;\n }\n }\n if (nl.length >= 2)\n start = it.sep.splice(nl[1]);\n }\n switch (this.type) {\n case 'anchor':\n case 'tag':\n if (atNextItem || it.value) {\n start.push(this.sourceToken);\n map.items.push({ start });\n this.onKeyLine = true;\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n it.start.push(this.sourceToken);\n }\n return;\n case 'explicit-key-ind':\n if (!it.sep && !it.explicitKey) {\n it.start.push(this.sourceToken);\n it.explicitKey = true;\n }\n else if (atNextItem || it.value) {\n start.push(this.sourceToken);\n map.items.push({ start, explicitKey: true });\n }\n else {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [this.sourceToken], explicitKey: true }]\n });\n }\n this.onKeyLine = true;\n return;\n case 'map-value-ind':\n if (it.explicitKey) {\n if (!it.sep) {\n if (includesToken(it.start, 'newline')) {\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n }\n else {\n const start = getFirstKeyStartProps(it.start);\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n });\n }\n }\n else if (it.value) {\n map.items.push({ start: [], key: null, sep: [this.sourceToken] });\n }\n else if (includesToken(it.sep, 'map-value-ind')) {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n });\n }\n else if (isFlowToken(it.key) &&\n !includesToken(it.sep, 'newline')) {\n const start = getFirstKeyStartProps(it.start);\n const key = it.key;\n const sep = it.sep;\n sep.push(this.sourceToken);\n // @ts-expect-error type guard is wrong here\n delete it.key;\n // @ts-expect-error type guard is wrong here\n delete it.sep;\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key, sep }]\n });\n }\n else if (start.length > 0) {\n // Not actually at next item\n it.sep = it.sep.concat(start, this.sourceToken);\n }\n else {\n it.sep.push(this.sourceToken);\n }\n }\n else {\n if (!it.sep) {\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n }\n else if (it.value || atNextItem) {\n map.items.push({ start, key: null, sep: [this.sourceToken] });\n }\n else if (includesToken(it.sep, 'map-value-ind')) {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [], key: null, sep: [this.sourceToken] }]\n });\n }\n else {\n it.sep.push(this.sourceToken);\n }\n }\n this.onKeyLine = true;\n return;\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar': {\n const fs = this.flowScalar(this.type);\n if (atNextItem || it.value) {\n map.items.push({ start, key: fs, sep: [] });\n this.onKeyLine = true;\n }\n else if (it.sep) {\n this.stack.push(fs);\n }\n else {\n Object.assign(it, { key: fs, sep: [] });\n this.onKeyLine = true;\n }\n return;\n }\n default: {\n const bv = this.startBlockValue(map);\n if (bv) {\n if (bv.type === 'block-seq') {\n if (!it.explicitKey &&\n it.sep &&\n !includesToken(it.sep, 'newline')) {\n yield* this.pop({\n type: 'error',\n offset: this.offset,\n message: 'Unexpected block-seq-ind on same line with key',\n source: this.source\n });\n return;\n }\n }\n else if (atMapIndent) {\n map.items.push({ start });\n }\n this.stack.push(bv);\n return;\n }\n }\n }\n }\n yield* this.pop();\n yield* this.step();\n }\n *blockSequence(seq) {\n const it = seq.items[seq.items.length - 1];\n switch (this.type) {\n case 'newline':\n if (it.value) {\n const end = 'end' in it.value ? it.value.end : undefined;\n const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n if (last?.type === 'comment')\n end?.push(this.sourceToken);\n else\n seq.items.push({ start: [this.sourceToken] });\n }\n else\n it.start.push(this.sourceToken);\n return;\n case 'space':\n case 'comment':\n if (it.value)\n seq.items.push({ start: [this.sourceToken] });\n else {\n if (this.atIndentedComment(it.start, seq.indent)) {\n const prev = seq.items[seq.items.length - 2];\n const end = prev?.value?.end;\n if (Array.isArray(end)) {\n arrayPushArray(end, it.start);\n end.push(this.sourceToken);\n seq.items.pop();\n return;\n }\n }\n it.start.push(this.sourceToken);\n }\n return;\n case 'anchor':\n case 'tag':\n if (it.value || this.indent <= seq.indent)\n break;\n it.start.push(this.sourceToken);\n return;\n case 'seq-item-ind':\n if (this.indent !== seq.indent)\n break;\n if (it.value || includesToken(it.start, 'seq-item-ind'))\n seq.items.push({ start: [this.sourceToken] });\n else\n it.start.push(this.sourceToken);\n return;\n }\n if (this.indent > seq.indent) {\n const bv = this.startBlockValue(seq);\n if (bv) {\n this.stack.push(bv);\n return;\n }\n }\n yield* this.pop();\n yield* this.step();\n }\n *flowCollection(fc) {\n const it = fc.items[fc.items.length - 1];\n if (this.type === 'flow-error-end') {\n let top;\n do {\n yield* this.pop();\n top = this.peek(1);\n } while (top?.type === 'flow-collection');\n }\n else if (fc.end.length === 0) {\n switch (this.type) {\n case 'comma':\n case 'explicit-key-ind':\n if (!it || it.sep)\n fc.items.push({ start: [this.sourceToken] });\n else\n it.start.push(this.sourceToken);\n return;\n case 'map-value-ind':\n if (!it || it.value)\n fc.items.push({ start: [], key: null, sep: [this.sourceToken] });\n else if (it.sep)\n it.sep.push(this.sourceToken);\n else\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n return;\n case 'space':\n case 'comment':\n case 'newline':\n case 'anchor':\n case 'tag':\n if (!it || it.value)\n fc.items.push({ start: [this.sourceToken] });\n else if (it.sep)\n it.sep.push(this.sourceToken);\n else\n it.start.push(this.sourceToken);\n return;\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar': {\n const fs = this.flowScalar(this.type);\n if (!it || it.value)\n fc.items.push({ start: [], key: fs, sep: [] });\n else if (it.sep)\n this.stack.push(fs);\n else\n Object.assign(it, { key: fs, sep: [] });\n return;\n }\n case 'flow-map-end':\n case 'flow-seq-end':\n fc.end.push(this.sourceToken);\n return;\n }\n const bv = this.startBlockValue(fc);\n /* istanbul ignore else should not happen */\n if (bv)\n this.stack.push(bv);\n else {\n yield* this.pop();\n yield* this.step();\n }\n }\n else {\n const parent = this.peek(2);\n if (parent.type === 'block-map' &&\n ((this.type === 'map-value-ind' && parent.indent === fc.indent) ||\n (this.type === 'newline' &&\n !parent.items[parent.items.length - 1].sep))) {\n yield* this.pop();\n yield* this.step();\n }\n else if (this.type === 'map-value-ind' &&\n parent.type !== 'flow-collection') {\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n fixFlowSeqItems(fc);\n const sep = fc.end.splice(1, fc.end.length);\n sep.push(this.sourceToken);\n const map = {\n type: 'block-map',\n offset: fc.offset,\n indent: fc.indent,\n items: [{ start, key: fc, sep }]\n };\n this.onKeyLine = true;\n this.stack[this.stack.length - 1] = map;\n }\n else {\n yield* this.lineEnd(fc);\n }\n }\n }\n flowScalar(type) {\n if (this.onNewLine) {\n let nl = this.source.indexOf('\\n') + 1;\n while (nl !== 0) {\n this.onNewLine(this.offset + nl);\n nl = this.source.indexOf('\\n', nl) + 1;\n }\n }\n return {\n type,\n offset: this.offset,\n indent: this.indent,\n source: this.source\n };\n }\n startBlockValue(parent) {\n switch (this.type) {\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return this.flowScalar(this.type);\n case 'block-scalar-header':\n return {\n type: 'block-scalar',\n offset: this.offset,\n indent: this.indent,\n props: [this.sourceToken],\n source: ''\n };\n case 'flow-map-start':\n case 'flow-seq-start':\n return {\n type: 'flow-collection',\n offset: this.offset,\n indent: this.indent,\n start: this.sourceToken,\n items: [],\n end: []\n };\n case 'seq-item-ind':\n return {\n type: 'block-seq',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [this.sourceToken] }]\n };\n case 'explicit-key-ind': {\n this.onKeyLine = true;\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n start.push(this.sourceToken);\n return {\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, explicitKey: true }]\n };\n }\n case 'map-value-ind': {\n this.onKeyLine = true;\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n return {\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n };\n }\n }\n return null;\n }\n atIndentedComment(start, indent) {\n if (this.type !== 'comment')\n return false;\n if (this.indent <= indent)\n return false;\n return start.every(st => st.type === 'newline' || st.type === 'space');\n }\n *documentEnd(docEnd) {\n if (this.type !== 'doc-mode') {\n if (docEnd.end)\n docEnd.end.push(this.sourceToken);\n else\n docEnd.end = [this.sourceToken];\n if (this.type === 'newline')\n yield* this.pop();\n }\n }\n *lineEnd(token) {\n switch (this.type) {\n case 'comma':\n case 'doc-start':\n case 'doc-end':\n case 'flow-seq-end':\n case 'flow-map-end':\n case 'map-value-ind':\n yield* this.pop();\n yield* this.step();\n break;\n case 'newline':\n this.onKeyLine = false;\n // fallthrough\n case 'space':\n case 'comment':\n default:\n // all other values are errors\n if (token.end)\n token.end.push(this.sourceToken);\n else\n token.end = [this.sourceToken];\n if (this.type === 'newline')\n yield* this.pop();\n }\n }\n}\n\nexports.Parser = Parser;\n",
|
|
75
75
|
"'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar errors = require('./errors.js');\nvar log = require('./log.js');\nvar identity = require('./nodes/identity.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\n\nfunction parseOptions(options) {\n const prettyErrors = options.prettyErrors !== false;\n const lineCounter$1 = options.lineCounter || (prettyErrors && new lineCounter.LineCounter()) || null;\n return { lineCounter: lineCounter$1, prettyErrors };\n}\n/**\n * Parse the input as a stream of YAML documents.\n *\n * Documents should be separated from each other by `...` or `---` marker lines.\n *\n * @returns If an empty `docs` array is returned, it will be of type\n * EmptyStream and contain additional stream information. In\n * TypeScript, you should use `'empty' in docs` as a type guard for it.\n */\nfunction parseAllDocuments(source, options = {}) {\n const { lineCounter, prettyErrors } = parseOptions(options);\n const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n const composer$1 = new composer.Composer(options);\n const docs = Array.from(composer$1.compose(parser$1.parse(source)));\n if (prettyErrors && lineCounter)\n for (const doc of docs) {\n doc.errors.forEach(errors.prettifyError(source, lineCounter));\n doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n }\n if (docs.length > 0)\n return docs;\n return Object.assign([], { empty: true }, composer$1.streamInfo());\n}\n/** Parse an input string into a single YAML.Document */\nfunction parseDocument(source, options = {}) {\n const { lineCounter, prettyErrors } = parseOptions(options);\n const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n const composer$1 = new composer.Composer(options);\n // `doc` is always set by compose.end(true) at the very latest\n let doc = null;\n for (const _doc of composer$1.compose(parser$1.parse(source), true, source.length)) {\n if (!doc)\n doc = _doc;\n else if (doc.options.logLevel !== 'silent') {\n doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0, 2), 'MULTIPLE_DOCS', 'Source contains multiple documents; please use YAML.parseAllDocuments()'));\n break;\n }\n }\n if (prettyErrors && lineCounter) {\n doc.errors.forEach(errors.prettifyError(source, lineCounter));\n doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n }\n return doc;\n}\nfunction parse(src, reviver, options) {\n let _reviver = undefined;\n if (typeof reviver === 'function') {\n _reviver = reviver;\n }\n else if (options === undefined && reviver && typeof reviver === 'object') {\n options = reviver;\n }\n const doc = parseDocument(src, options);\n if (!doc)\n return null;\n doc.warnings.forEach(warning => log.warn(doc.options.logLevel, warning));\n if (doc.errors.length > 0) {\n if (doc.options.logLevel !== 'silent')\n throw doc.errors[0];\n else\n doc.errors = [];\n }\n return doc.toJS(Object.assign({ reviver: _reviver }, options));\n}\nfunction stringify(value, replacer, options) {\n let _replacer = null;\n if (typeof replacer === 'function' || Array.isArray(replacer)) {\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n }\n if (typeof options === 'string')\n options = options.length;\n if (typeof options === 'number') {\n const indent = Math.round(options);\n options = indent < 1 ? undefined : indent > 8 ? { indent: 8 } : { indent };\n }\n if (value === undefined) {\n const { keepUndefined } = options ?? replacer ?? {};\n if (!keepUndefined)\n return undefined;\n }\n if (identity.isDocument(value) && !_replacer)\n return value.toString(options);\n return new Document.Document(value, _replacer, options).toString(options);\n}\n\nexports.parse = parse;\nexports.parseAllDocuments = parseAllDocuments;\nexports.parseDocument = parseDocument;\nexports.stringify = stringify;\n",
|
|
76
|
-
"import type { SlotDef, SlotCategory } from './types.js';\n\n/** All 33 Mk4 canonical slots */\nexport const SLOTS: SlotDef[] = [\n // Project Meta (3)\n { index: 1, path: 'project.name', label: 'Name', description: 'Project name', category: 'project' },\n { index: 2, path: 'project.goal', label: 'Goal', description: 'Goal (use case)', category: 'project' },\n { index: 3, path: 'project.main_language', label: 'Language', description: 'Primary language', category: 'project' },\n\n // Human Context (6)\n { index: 4, path: 'human_context.who', label: 'Who', description: 'Who is this for?', category: 'human' },\n { index: 5, path: 'human_context.what', label: 'What', description: 'What are they building', category: 'human' },\n { index: 6, path: 'human_context.why', label: 'Why', description: 'Why does it exist', category: 'human' },\n { index: 7, path: 'human_context.where', label: 'Where', description: 'Where does it run', category: 'human' },\n { index: 8, path: 'human_context.when', label: 'When', description: 'When was it started / timeline', category: 'human' },\n { index: 9, path: 'human_context.how', label: 'How', description: 'How is it built', category: 'human' },\n\n // Frontend Stack (4)\n { index: 10, path: 'stack.frontend', canonical: 'stack.framework', label: 'Framework', description: 'Framework (React, Svelte, etc.)', category: 'frontend' },\n { index: 11, path: 'stack.css_framework', canonical: 'stack.css', label: 'CSS', description: 'CSS framework', category: 'frontend' },\n { index: 12, path: 'stack.ui_library', label: 'UI Library', description: 'UI component library', category: 'frontend' },\n { index: 13, path: 'stack.state_management', canonical: 'stack.state', label: 'State', description: 'State management', category: 'frontend' },\n\n // Backend Stack (5)\n { index: 14, path: 'stack.backend', label: 'Backend', description: 'Backend framework', category: 'backend' },\n { index: 15, path: 'stack.api_type', canonical: 'stack.api', label: 'API', description: 'API style (REST, GraphQL, etc.)', category: 'backend' },\n { index: 16, path: 'stack.runtime', label: 'Runtime', description: 'Runtime (Node, Bun, Python, etc.)', category: 'backend' },\n { index: 17, path: 'stack.database', canonical: 'stack.db', label: 'Database', description: 'Database', category: 'backend' },\n { index: 18, path: 'stack.connection', label: 'Connection', description: 'Connection method (Prisma, etc.)', category: 'backend' },\n\n // Universal Stack (3)\n { index: 19, path: 'stack.hosting', label: 'Hosting', description: 'Hosting platform', category: 'universal' },\n { index: 20, path: 'stack.build', label: 'Build', description: 'Build tool', category: 'universal' },\n { index: 21, path: 'stack.cicd', label: 'CI/CD', description: 'CI/CD', category: 'universal' },\n\n // Enterprise Infra (5)\n { index: 22, path: 'stack.monorepo_tool', label: 'Monorepo', description: 'Monorepo tool', category: 'enterprise_infra' },\n { index: 23, path: 'stack.package_manager', canonical: 'stack.pkg_manager', label: 'Package Manager', description: 'Package manager', category: 'enterprise_infra' },\n { index: 24, path: 'stack.workspaces', label: 'Workspaces', description: 'Workspace configuration', category: 'enterprise_infra' },\n { index: 25, path: 'monorepo.packages_count', label: 'Packages', description: 'Number of packages', category: 'enterprise_infra' },\n { index: 26, path: 'monorepo.build_orchestrator', label: 'Build Orchestrator', description: 'Build orchestration tool', category: 'enterprise_infra' },\n\n // Enterprise App (4)\n { index: 27, path: 'stack.admin', label: 'Admin', description: 'Admin panel', category: 'enterprise_app' },\n { index: 28, path: 'stack.cache', label: 'Cache', description: 'Caching layer', category: 'enterprise_app' },\n { index: 29, path: 'stack.search', label: 'Search', description: 'Search engine', category: 'enterprise_app' },\n { index: 30, path: 'stack.storage', label: 'Storage', description: 'Object storage', category: 'enterprise_app' },\n\n // Enterprise Ops (3)\n { index: 31, path: 'monorepo.versioning_strategy', label: 'Versioning', description: 'Version strategy', category: 'enterprise_ops' },\n { index: 32, path: 'monorepo.shared_configs', label: 'Shared Configs', description: 'Shared configs', category: 'enterprise_ops' },\n { index: 33, path: 'monorepo.remote_cache', label: 'Remote Cache', description: 'Remote build cache', category: 'enterprise_ops' },\n];\n\n/** Slot lookup by path — dual-keyed (current on-wire `path` AND Mk4 `canonical`\n * where defined) so callers can look up by either name. See issue #66. */\nexport const SLOT_BY_PATH = new Map<string, SlotDef>(\n SLOTS.flatMap(s => s.canonical ? [[s.path, s], [s.canonical, s]] : [[s.path, s]])\n);\n\n/** Mk4 canonical → current on-wire path. Used by read helpers to resolve\n * a canonical name back to the path that read/write/kernel actually uses\n * today. Empty for slots whose path is already canonical. */\nexport const CANONICAL_TO_CURRENT: ReadonlyMap<string, string> = new Map(\n SLOTS.filter(s => s.canonical).map(s => [s.canonical as string, s.path])\n);\n\n/** Current on-wire path → Mk4 canonical. Used by display helpers when the\n * UI wants to surface the forward-spec name. */\nexport const CURRENT_TO_CANONICAL: ReadonlyMap<string, string> = new Map(\n SLOTS.filter(s => s.canonical).map(s => [s.path, s.canonical as string])\n);\n\n/** Resolve any path (legacy or canonical) to the slot definition. */\nexport function getSlotByAnyPath(path: string): SlotDef | undefined {\n return SLOT_BY_PATH.get(path);\n}\n\n/** Read a value from a .faf data object, checking both the slot's current\n * `path` and its Mk4 `canonical` (if defined). Returns the first non-undefined\n * value. Lets the cli read .faf files that contain either legacy or canonical\n * keys without forcing a migration. */\nexport function readSlotValue(\n data: Record<string, unknown>,\n slot: SlotDef\n): unknown {\n const tryPath = (p: string): unknown => {\n const parts = p.split('.');\n let cur: unknown = data;\n for (const part of parts) {\n if (cur && typeof cur === 'object' && part in (cur as Record<string, unknown>)) {\n cur = (cur as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return cur;\n };\n const primary = tryPath(slot.path);\n if (primary !== undefined) {return primary;}\n if (slot.canonical) {return tryPath(slot.canonical);}\n return undefined;\n}\n\n/** Slots grouped by category */\nexport function slotsByCategory(category: SlotCategory): SlotDef[] {\n return SLOTS.filter(s => s.category === category);\n}\n\n/** Base-tier slots (1-21) — used by score_faf */\nexport const BASE_SLOTS = SLOTS.filter(s => s.index <= 21);\n\n/** Enterprise-tier slots (1-33) — used by score_faf_enterprise */\nexport const ENTERPRISE_SLOTS = SLOTS;\n\n/** Placeholder values treated as Empty */\nexport const PLACEHOLDERS = new Set([\n 'describe your project goal',\n 'development teams',\n 'cloud platform',\n 'null',\n 'none',\n 'unknown',\n 'n/a',\n 'not applicable',\n]);\n\n/** `None`, `N/A`, `not applicable` (any case):\n * a typed none — counts as an empty slot. It scores 0 until filled; faf auto\n * fills a tech slot from a repo fact and otherwise keeps the words as typed.\n * Only in a tech slot the app-type leaves out does faf auto write\n * `slotignored` over them — the app-type's decision, never the words'. */\nexport const EXPLICIT_NONE: ReadonlySet<string> = new Set(['none', 'n/a', 'not applicable']);\n\n/** The value that marks a slot as not applicable (the What-Not). It comes\n * only from the app-type (shown to people as N/A); a typed word never means it. */\nexport const SLOTIGNORED = 'slotignored';\n\n/** True for a typed none — counts as an empty slot: `None`, `N/A`,\n * `not applicable`, `none` (any case, any padding). */\nexport function isExplicitNone(value: unknown): boolean {\n return typeof value === 'string' && EXPLICIT_NONE.has(value.trim().toLowerCase());\n}\n\n/** True for words typed into a slot that do not fill it: a typed none\n * (`None`, `N/A`, `not applicable`) or any other placeholder word\n * (`unknown`, `null` written as a string, …), any case, any padding. Like a\n * typed none, they count as an empty slot, and faf keeps them as typed until\n * a repo fact fills a tech slot (or, in a tech slot the app-type leaves out,\n * `faf auto` marks it `slotignored`). An empty value (`''`, YAML null) is\n * not typed words. */\nexport function isTypedWords(value: unknown): boolean {\n return typeof value === 'string' && value.trim() !== '' && isPlaceholder(value);\n}\n\n/** Check if a value is a placeholder (empty) */\nexport function isPlaceholder(value: unknown): boolean {\n if (value === null || value === undefined || value === '') {return true;}\n if (typeof value === 'string') {\n return PLACEHOLDERS.has(value.toLowerCase().trim());\n }\n if (Array.isArray(value) && value.length === 0) {return true;}\n if (typeof value === 'object' && Object.keys(value as object).length === 0) {return true;}\n return false;\n}\n\n/** The `# found:` note of a type detection chose with no classifying signal\n * (its `library` fallback). A type carrying it is faf's fallback, not a fact\n * about the repo: `faf auto` writes no `slotignored` over typed words on it,\n * and `faf score` promises none. */\nexport const NO_CLASSIFYING_SIGNALS = 'no classifying signals — fallback';\n\n/** The slots a `framework` repo leaves out although their categories are\n * active: framework source code has no CSS framework, UI library, database,\n * connection or hosting of its own. */\nconst FRAMEWORK_LEAVES_OUT: ReadonlySet<string> = new Set([\n 'stack.css_framework', 'stack.ui_library', 'stack.database', 'stack.connection', 'stack.hosting',\n]);\n\n/** Whether the app-type `type` uses `slot` — the one rule for which slots\n * count: the type's active categories, less the slots a `framework` repo\n * leaves out. `null` when `type` is not an app-type faf knows (then faf\n * cannot tell, and decides nothing from it). */\nexport function appTypeUsesSlot(type: unknown, slot: SlotDef): boolean | null {\n if (typeof type !== 'string' || !Object.prototype.hasOwnProperty.call(APP_TYPE_CATEGORIES, type)) {return null;}\n if (!APP_TYPE_CATEGORIES[type].includes(slot.category)) {return false;}\n return !(type === 'framework' && FRAMEWORK_LEAVES_OUT.has(slot.path));\n}\n\n/** App-type to active category mapping. The canonical 24-type ladder —\n * detectable apps + `encyclopedia` (curated knowledge) + `intent` (seed).\n * About is NOT an app_type — it is a repo role (`about.represents`).\n * (See v6.6.md doctrine memory + fafipedia-vs-grokipedia-architecture.)\n * Sorted ascending by active slot count for readability.\n *\n * v6.5.0 changes vs prior:\n * - Added `universal` to cli / library / mcp / frontend / data-science.\n * These types ship/build/CI somewhere — slotignoring those slots was\n * losing real signal. (cli/library: 9→12; mcp/data-science: 14→17;\n * frontend: 13→16.)\n * - Order is by ascending slot count, not insertion order.\n */\nexport const APP_TYPE_CATEGORIES: Record<string, SlotCategory[]> = {\n // 9 slots — minimal (project meta + human only)\n documentation: ['project', 'human'],\n // intent: the human-intent SEED type, produced by builder.faf.one — a human\n // captures name/goal + the 6 Ws (no stack yet). Same 9 active slots as\n // documentation, but named honestly: it is intent awaiting a stack. An AI that\n // fills the stack re-types it to the real app_type (cli/mcp/frontend/…). Reads\n // honestly even if abandoned (\"intent captured, never built\").\n intent: ['project', 'human'],\n // encyclopedia: same shape as documentation — content repo with project\n // metadata + human context. Used by FAFipedia and similar curated-knowledge\n // surfaces. Per fafipedia-vs-grokipedia-architecture doctrine, this is the\n // structured, git-versioned, agent-consumable knowledge layer. Each .fafi\n // file under an encyclopedia repo is itself a valid .faf (inclusion marker).\n encyclopedia: ['project', 'human'],\n\n // 12 slots — project + human + universal (build/ci/hosting matters)\n cli: ['project', 'human', 'universal'],\n library: ['project', 'human', 'universal'],\n sdk: ['project', 'human', 'universal'],\n wasm: ['project', 'human', 'universal'],\n html: ['project', 'human', 'universal'],\n // server-card: a published MCP Server Card (discovery manifest) — artifact-class\n // like sdk/wasm/html. Identity + human context + build/ship matter; frontend,\n // backend and DB are N/A. By design it carries the FAF context-block in the\n // card's `_meta[\"one.faf/context\"]` by default — so anyone generating a Server\n // Card through FAF gets FAF context for free. See faf-server-card-ref.\n 'server-card': ['project', 'human', 'universal'],\n\n // 16 slots — project + frontend + human + universal\n frontend: ['project', 'frontend', 'human', 'universal'],\n website: ['project', 'frontend', 'human', 'universal'],\n mobile: ['project', 'frontend', 'human', 'universal'],\n // Swift / Apple client apps (iOS/macOS/…) — same ladder as mobile; name is\n // `app` so SPM libraries/servers/CLIs are not forced into \"mobile\".\n app: ['project', 'frontend', 'human', 'universal'],\n // browser/chrome extension — popup/content-script UI + build/CI/store\n // (manifest_version), NO backend. Detected via manifest_version in scanner.ts.\n extension: ['project', 'frontend', 'human', 'universal'],\n\n // 17 slots — project + backend + universal + human\n mcp: ['project', 'backend', 'human', 'universal'],\n backend: ['project', 'backend', 'universal', 'human'],\n 'data-science': ['project', 'backend', 'human', 'universal'],\n\n // 21 slots — full base ladder\n fullstack: ['project', 'frontend', 'backend', 'universal', 'human'],\n svelte: ['project', 'frontend', 'backend', 'universal', 'human'],\n framework: ['project', 'frontend', 'backend', 'universal', 'human'],\n 'monorepo-root': ['project', 'human', 'enterprise_infra', 'enterprise_app', 'enterprise_ops'],\n\n // 24-25 slots — platform / SaaS shapes (base + selected enterprise)\n mcpaas: ['project', 'backend', 'universal', 'human', 'enterprise_app', 'enterprise_ops'],\n saas: ['project', 'frontend', 'backend', 'universal', 'human', 'enterprise_app'],\n\n // 33 slots — full enterprise\n enterprise: ['project', 'frontend', 'backend', 'universal', 'human', 'enterprise_infra', 'enterprise_app', 'enterprise_ops'],\n};\n",
|
|
76
|
+
"import type { SlotDef, SlotCategory } from './types.js';\n\n/** All 33 Mk4 canonical slots */\nexport const SLOTS: SlotDef[] = [\n // Project Meta (3)\n { index: 1, path: 'project.name', label: 'Name', description: 'Project name', category: 'project' },\n { index: 2, path: 'project.goal', label: 'Goal', description: 'Goal (use case)', category: 'project' },\n { index: 3, path: 'project.main_language', label: 'Language', description: 'Primary language', category: 'project' },\n\n // Human Context (6)\n { index: 4, path: 'human_context.who', label: 'Who', description: 'Who is this for?', category: 'human' },\n { index: 5, path: 'human_context.what', label: 'What', description: 'What are they building', category: 'human' },\n { index: 6, path: 'human_context.why', label: 'Why', description: 'Why does it exist', category: 'human' },\n { index: 7, path: 'human_context.where', label: 'Where', description: 'Where does it run', category: 'human' },\n { index: 8, path: 'human_context.when', label: 'When', description: 'When was it started / timeline', category: 'human' },\n { index: 9, path: 'human_context.how', label: 'How', description: 'How is it built', category: 'human' },\n\n // Frontend Stack (4)\n { index: 10, path: 'stack.frontend', canonical: 'stack.framework', label: 'Framework', description: 'Framework (React, Svelte, etc.)', category: 'frontend' },\n { index: 11, path: 'stack.css_framework', canonical: 'stack.css', label: 'CSS', description: 'CSS framework', category: 'frontend' },\n { index: 12, path: 'stack.ui_library', label: 'UI Library', description: 'UI component library', category: 'frontend' },\n { index: 13, path: 'stack.state_management', canonical: 'stack.state', label: 'State', description: 'State management', category: 'frontend' },\n\n // Backend Stack (5)\n { index: 14, path: 'stack.backend', label: 'Backend', description: 'Backend framework', category: 'backend' },\n { index: 15, path: 'stack.api_type', canonical: 'stack.api', label: 'API', description: 'API style (REST, GraphQL, etc.)', category: 'backend' },\n { index: 16, path: 'stack.runtime', label: 'Runtime', description: 'Runtime (Node, Bun, Python, etc.)', category: 'backend' },\n { index: 17, path: 'stack.database', canonical: 'stack.db', label: 'Database', description: 'Database', category: 'backend' },\n { index: 18, path: 'stack.connection', label: 'Connection', description: 'Connection method (Prisma, etc.)', category: 'backend' },\n\n // Universal Stack (3)\n { index: 19, path: 'stack.hosting', label: 'Hosting', description: 'Hosting platform', category: 'universal' },\n { index: 20, path: 'stack.build', label: 'Build', description: 'Build tool', category: 'universal' },\n { index: 21, path: 'stack.cicd', label: 'CI/CD', description: 'CI/CD', category: 'universal' },\n\n // Enterprise Infra (5)\n { index: 22, path: 'stack.monorepo_tool', label: 'Monorepo', description: 'Monorepo tool', category: 'enterprise_infra' },\n { index: 23, path: 'stack.package_manager', canonical: 'stack.pkg_manager', label: 'Package Manager', description: 'Package manager', category: 'enterprise_infra' },\n { index: 24, path: 'stack.workspaces', label: 'Workspaces', description: 'Workspace configuration', category: 'enterprise_infra' },\n { index: 25, path: 'monorepo.packages_count', label: 'Packages', description: 'Number of packages', category: 'enterprise_infra' },\n { index: 26, path: 'monorepo.build_orchestrator', label: 'Build Orchestrator', description: 'Build orchestration tool', category: 'enterprise_infra' },\n\n // Enterprise App (4)\n { index: 27, path: 'stack.admin', label: 'Admin', description: 'Admin panel', category: 'enterprise_app' },\n { index: 28, path: 'stack.cache', label: 'Cache', description: 'Caching layer', category: 'enterprise_app' },\n { index: 29, path: 'stack.search', label: 'Search', description: 'Search engine', category: 'enterprise_app' },\n { index: 30, path: 'stack.storage', label: 'Storage', description: 'Object storage', category: 'enterprise_app' },\n\n // Enterprise Ops (3)\n { index: 31, path: 'monorepo.versioning_strategy', label: 'Versioning', description: 'Version strategy', category: 'enterprise_ops' },\n { index: 32, path: 'monorepo.shared_configs', label: 'Shared Configs', description: 'Shared configs', category: 'enterprise_ops' },\n { index: 33, path: 'monorepo.remote_cache', label: 'Remote Cache', description: 'Remote build cache', category: 'enterprise_ops' },\n];\n\n/** Slot lookup by path — dual-keyed (current on-wire `path` AND Mk4 `canonical`\n * where defined) so callers can look up by either name. See issue #66. */\nexport const SLOT_BY_PATH = new Map<string, SlotDef>(\n SLOTS.flatMap(s => s.canonical ? [[s.path, s], [s.canonical, s]] : [[s.path, s]])\n);\n\n/** Mk4 canonical → current on-wire path. Used by read helpers to resolve\n * a canonical name back to the path that read/write/kernel actually uses\n * today. Empty for slots whose path is already canonical. */\nexport const CANONICAL_TO_CURRENT: ReadonlyMap<string, string> = new Map(\n SLOTS.filter(s => s.canonical).map(s => [s.canonical as string, s.path])\n);\n\n/** Current on-wire path → Mk4 canonical. Used by display helpers when the\n * UI wants to surface the forward-spec name. */\nexport const CURRENT_TO_CANONICAL: ReadonlyMap<string, string> = new Map(\n SLOTS.filter(s => s.canonical).map(s => [s.path, s.canonical as string])\n);\n\n/** Resolve any path (legacy or canonical) to the slot definition. */\nexport function getSlotByAnyPath(path: string): SlotDef | undefined {\n return SLOT_BY_PATH.get(path);\n}\n\n/** Read a value from a .faf data object, checking both the slot's current\n * `path` and its Mk4 `canonical` (if defined). Returns the first non-undefined\n * value. Lets the cli read .faf files that contain either legacy or canonical\n * keys without forcing a migration. */\nexport function readSlotValue(\n data: Record<string, unknown>,\n slot: SlotDef\n): unknown {\n const tryPath = (p: string): unknown => {\n const parts = p.split('.');\n let cur: unknown = data;\n for (const part of parts) {\n if (cur && typeof cur === 'object' && part in (cur as Record<string, unknown>)) {\n cur = (cur as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return cur;\n };\n const primary = tryPath(slot.path);\n if (primary !== undefined) {return primary;}\n if (slot.canonical) {return tryPath(slot.canonical);}\n return undefined;\n}\n\n/** Slots grouped by category */\nexport function slotsByCategory(category: SlotCategory): SlotDef[] {\n return SLOTS.filter(s => s.category === category);\n}\n\n/** Base-tier slots (1-21) — used by score_faf */\nexport const BASE_SLOTS = SLOTS.filter(s => s.index <= 21);\n\n/** Enterprise-tier slots (1-33) — used by score_faf_enterprise */\nexport const ENTERPRISE_SLOTS = SLOTS;\n\n/** Placeholder values treated as Empty */\nexport const PLACEHOLDERS = new Set([\n 'describe your project goal',\n 'development teams',\n 'cloud platform',\n 'null',\n 'none',\n 'unknown',\n 'n/a',\n 'not applicable',\n]);\n\n/** `None`, `N/A`, `not applicable` (any case):\n * a typed none — counts as an empty slot. It scores 0 until filled; faf auto\n * fills a tech slot from a repo fact and otherwise keeps the words as typed.\n * Only in a tech slot the app-type leaves out does faf auto write\n * `slotignored` over them — the app-type's decision, never the words'. */\nexport const EXPLICIT_NONE: ReadonlySet<string> = new Set(['none', 'n/a', 'not applicable']);\n\n/** The value that marks a slot as not required and not scored (the What-Not).\n * It comes only from the app-type; a typed word never means it. */\nexport const SLOTIGNORED = 'slotignored';\n\n/** True for a typed none — counts as an empty slot: `None`, `N/A`,\n * `not applicable`, `none` (any case, any padding). */\nexport function isExplicitNone(value: unknown): boolean {\n return typeof value === 'string' && EXPLICIT_NONE.has(value.trim().toLowerCase());\n}\n\n/** True for words typed into a slot that do not fill it: a typed none\n * (`None`, `N/A`, `not applicable`) or any other placeholder word\n * (`unknown`, `null` written as a string, …), any case, any padding. Like a\n * typed none, they count as an empty slot, and faf keeps them as typed until\n * a repo fact fills a tech slot (or, in a tech slot the app-type leaves out,\n * `faf auto` marks it `slotignored`). An empty value (`''`, YAML null) is\n * not typed words. */\nexport function isTypedWords(value: unknown): boolean {\n return typeof value === 'string' && value.trim() !== '' && isPlaceholder(value);\n}\n\n/** Check if a value is a placeholder (empty) */\nexport function isPlaceholder(value: unknown): boolean {\n if (value === null || value === undefined || value === '') {return true;}\n if (typeof value === 'string') {\n return PLACEHOLDERS.has(value.toLowerCase().trim());\n }\n if (Array.isArray(value) && value.length === 0) {return true;}\n if (typeof value === 'object' && Object.keys(value as object).length === 0) {return true;}\n return false;\n}\n\n/** The `# found:` note of a type detection chose with no classifying signal\n * (its `library` fallback). A type carrying it is faf's fallback, not a fact\n * about the repo: `faf auto` writes no `slotignored` over typed words on it,\n * and `faf score` promises none. */\nexport const NO_CLASSIFYING_SIGNALS = 'no classifying signals — fallback';\n\n/** The slots a `framework` repo leaves out although their categories are\n * active: framework source code has no CSS framework, UI library, database,\n * connection or hosting of its own. */\nconst FRAMEWORK_LEAVES_OUT: ReadonlySet<string> = new Set([\n 'stack.css_framework', 'stack.ui_library', 'stack.database', 'stack.connection', 'stack.hosting',\n]);\n\n/** Whether the app-type `type` uses `slot` — the one rule for which slots\n * count: the type's active categories, less the slots a `framework` repo\n * leaves out. `null` when `type` is not an app-type faf knows (then faf\n * cannot tell, and decides nothing from it). */\nexport function appTypeUsesSlot(type: unknown, slot: SlotDef): boolean | null {\n if (typeof type !== 'string' || !Object.prototype.hasOwnProperty.call(APP_TYPE_CATEGORIES, type)) {return null;}\n if (!APP_TYPE_CATEGORIES[type].includes(slot.category)) {return false;}\n return !(type === 'framework' && FRAMEWORK_LEAVES_OUT.has(slot.path));\n}\n\n/** App-type to active category mapping. The canonical 24-type ladder —\n * detectable apps + `encyclopedia` (curated knowledge) + `intent` (seed).\n * About is NOT an app_type — it is a repo role (`about.represents`).\n * (See v6.6.md doctrine memory + fafipedia-vs-grokipedia-architecture.)\n * Sorted ascending by active slot count for readability.\n *\n * v6.5.0 changes vs prior:\n * - Added `universal` to cli / library / mcp / frontend / data-science.\n * These types ship/build/CI somewhere — slotignoring those slots was\n * losing real signal. (cli/library: 9→12; mcp/data-science: 14→17;\n * frontend: 13→16.)\n * - Order is by ascending slot count, not insertion order.\n */\nexport const APP_TYPE_CATEGORIES: Record<string, SlotCategory[]> = {\n // 9 slots — minimal (project meta + human only)\n documentation: ['project', 'human'],\n // intent: the human-intent SEED type, produced by builder.faf.one — a human\n // captures name/goal + the 6 Ws (no stack yet). Same 9 active slots as\n // documentation, but named honestly: it is intent awaiting a stack. An AI that\n // fills the stack re-types it to the real app_type (cli/mcp/frontend/…). Reads\n // honestly even if abandoned (\"intent captured, never built\").\n intent: ['project', 'human'],\n // encyclopedia: same shape as documentation — content repo with project\n // metadata + human context. Used by FAFipedia and similar curated-knowledge\n // surfaces. Per fafipedia-vs-grokipedia-architecture doctrine, this is the\n // structured, git-versioned, agent-consumable knowledge layer. Each .fafi\n // file under an encyclopedia repo is itself a valid .faf (inclusion marker).\n encyclopedia: ['project', 'human'],\n\n // 12 slots — project + human + universal (build/ci/hosting matters)\n cli: ['project', 'human', 'universal'],\n library: ['project', 'human', 'universal'],\n sdk: ['project', 'human', 'universal'],\n wasm: ['project', 'human', 'universal'],\n html: ['project', 'human', 'universal'],\n // server-card: a published MCP Server Card (discovery manifest) — artifact-class\n // like sdk/wasm/html. Identity + human context + build/ship matter; frontend,\n // backend and DB are slotignored. By design it carries the FAF context-block in the\n // card's `_meta[\"one.faf/context\"]` by default — so anyone generating a Server\n // Card through FAF gets FAF context for free. See faf-server-card-ref.\n 'server-card': ['project', 'human', 'universal'],\n\n // 16 slots — project + frontend + human + universal\n frontend: ['project', 'frontend', 'human', 'universal'],\n website: ['project', 'frontend', 'human', 'universal'],\n mobile: ['project', 'frontend', 'human', 'universal'],\n // Swift / Apple client apps (iOS/macOS/…) — same ladder as mobile; name is\n // `app` so SPM libraries/servers/CLIs are not forced into \"mobile\".\n app: ['project', 'frontend', 'human', 'universal'],\n // browser/chrome extension — popup/content-script UI + build/CI/store\n // (manifest_version), NO backend. Detected via manifest_version in scanner.ts.\n extension: ['project', 'frontend', 'human', 'universal'],\n\n // 17 slots — project + backend + universal + human\n mcp: ['project', 'backend', 'human', 'universal'],\n backend: ['project', 'backend', 'universal', 'human'],\n 'data-science': ['project', 'backend', 'human', 'universal'],\n\n // 21 slots — full base ladder\n fullstack: ['project', 'frontend', 'backend', 'universal', 'human'],\n svelte: ['project', 'frontend', 'backend', 'universal', 'human'],\n framework: ['project', 'frontend', 'backend', 'universal', 'human'],\n 'monorepo-root': ['project', 'human', 'enterprise_infra', 'enterprise_app', 'enterprise_ops'],\n\n // 24-25 slots — platform / SaaS shapes (base + selected enterprise)\n mcpaas: ['project', 'backend', 'universal', 'human', 'enterprise_app', 'enterprise_ops'],\n saas: ['project', 'frontend', 'backend', 'universal', 'human', 'enterprise_app'],\n\n // 33 slots — full enterprise\n enterprise: ['project', 'frontend', 'backend', 'universal', 'human', 'enterprise_infra', 'enterprise_app', 'enterprise_ops'],\n};\n",
|
|
77
77
|
"// ANSI color helpers — zero deps\n// Design: black/white text by default. Cyan + orange are the only brand colors.\nconst esc = (code: string) => (s: string) => `\\x1b[${code}m${s}\\x1b[0m`;\n\nexport const bold = esc('1');\nexport const dim = esc('2');\nexport const italic = esc('3');\n\n// Brand colors only — no red/green/yellow rainbow.\n// FAF_HEX is the single source of record for brand hex — ANSI fns below\n// AND HTML renders (project.html) derive from it. Change here, propagates.\nexport const FAF_HEX = {\n cyan: '#00D4D4', // Silver tier · interaction\n cyanDeep: '#0E8C8C', // Bronze tier — same cyan lane, one rung down\n orange: '#FF6B35', // Trophy/Gold · CTAs\n} as const;\n\nexport const fafCyan = (s: string) => `\\x1b[38;2;0;212;212m${s}\\x1b[0m`; // #00D4D4\nexport const fafCyanDeep = (s: string) => `\\x1b[38;2;14;140;140m${s}\\x1b[0m`; // #0E8C8C\nexport const orange = (s: string) => `\\x1b[38;5;208m${s}\\x1b[0m`;\n",
|
|
78
78
|
"import type { TierInfo } from './types.js';\nimport { bold, dim, fafCyan, fafCyanDeep, orange } from '../ui/colors.js';\n\n/** Tier boundaries — ordered from highest to lowest\n *\n * Indicators (work surfaces — CLI · code · docs · receipts):\n * ✪ Proof Seal (Trophy 100% — work glyph; social still uses 🏆; brand uses Trophy Mark PNG)\n * ★ filled star (gold — orange)\n * ◆ filled diamond (silver — cyan)\n * ◇ open diamond (bronze — deep cyan, one rung below silver)\n * ● filled circle (mid tiers)\n * ○ open circle (low — dim)\n * ♡ heart (empty — good luck)\n *\n * All three 100% glyphs mean the same score: ✪ work · 🏆 social · Trophy Mark (PNG) visual.\n */\nexport const TIERS: TierInfo[] = [\n { name: 'TROPHY', indicator: `${orange('✪')} ${orange('TROPHY')}`, threshold: 100 },\n { name: 'GOLD', indicator: `${orange(bold('★'))} ${orange('GOLD')}`, threshold: 99 },\n { name: 'SILVER', indicator: `${fafCyan('◆')} ${fafCyan('SILVER')}`, threshold: 95 },\n { name: 'BRONZE', indicator: `${fafCyanDeep('◇')} ${fafCyanDeep('BRONZE')}`, threshold: 85 },\n { name: 'GREEN', indicator: `${bold('●')} GREEN`, threshold: 70 },\n { name: 'YELLOW', indicator: `${dim('●')} YELLOW`, threshold: 55 },\n { name: 'RED', indicator: `${dim('○')} RED`, threshold: 1 },\n { name: 'WHITE', indicator: `${dim('♡')}`, threshold: 0 },\n];\n\n/** Get the display badge for a tier */\nexport function tierBadge(tier: TierInfo): string {\n return tier.indicator;\n}\n\n/** Get tier info for a given score */\nexport function getTier(score: number): TierInfo {\n for (const tier of TIERS) {\n if (score >= tier.threshold) {return tier;}\n }\n return TIERS[TIERS.length - 1]; // White\n}\n\n/** Get the next tier above the current score (for progress display) */\nexport function getNextTier(score: number): TierInfo | null {\n const current = getTier(score);\n const idx = TIERS.indexOf(current);\n return idx > 0 ? TIERS[idx - 1] : null;\n}\n",
|
|
79
79
|
"import type { KernelScoreResult, FafbInfo } from '../core/types.js';\n\n// faf-scoring-kernel is CommonJS with synchronous WASM loading\n \nlet kernel: typeof import('faf-scoring-kernel') | null = null;\n\nfunction getKernel(): typeof import('faf-scoring-kernel') {\n if (kernel) {return kernel;}\n try {\n const loaded = require('faf-scoring-kernel') as typeof import('faf-scoring-kernel');\n kernel = loaded;\n return loaded;\n } catch {\n throw new Error(\n 'faf-scoring-kernel not installed.\\n\\n Run: npm install faf-scoring-kernel\\n'\n );\n }\n}\n\n/** The text the kernel scores: a leading UTF-8 BOM (U+FEFF) left out. The\n * kernel reads a BOM before a file's second top-level key as a second YAML\n * document and throws; the file itself keeps its BOM. */\nconst withoutBom = (yaml: string): string => (yaml.startsWith('\\uFEFF') ? yaml.slice(1) : yaml);\n\n/** Score a .faf YAML string (21 base slots), as the file is. A typed None /\n * N/A / not applicable at a slot is an empty slot, as in every engine. A\n * leading BOM is not scored (`faf auto` and `faf score` read a BOM file). */\nexport function score(yaml: string): KernelScoreResult {\n return JSON.parse(getKernel().score_faf(withoutBom(yaml)));\n}\n\n/** Score a .faf YAML string (33 enterprise slots), as the file is (a leading BOM is not scored). */\nexport function scoreEnterprise(yaml: string): KernelScoreResult {\n return JSON.parse(getKernel().score_faf_enterprise(withoutBom(yaml)));\n}\n\n/** Validate .faf YAML (a leading BOM is left out, as in {@link score}: `faf check` reads a BOM file). */\nexport function validate(yaml: string): boolean {\n return getKernel().validate_faf(withoutBom(yaml));\n}\n\n/** Compile .faf YAML to FAFb binary (a leading BOM is not compiled, as in\n * {@link score}: `faf compile` and `faf refresh` read a BOM file). */\nexport function compile(yaml: string): Uint8Array {\n return getKernel().compile_fafb(withoutBom(yaml));\n}\n\n/** Decompile FAFb binary to JSON info */\nexport function decompile(bytes: Uint8Array): FafbInfo {\n return JSON.parse(getKernel().decompile_fafb(bytes));\n}\n\n/** Get FAFb file metadata */\nexport function fafbInfo(bytes: Uint8Array): FafbInfo {\n return JSON.parse(getKernel().fafb_info(bytes));\n}\n\n/** Get FAFb binary metadata (name, version, source) */\nexport interface FafbMeta {\n source: string;\n name: string;\n faf_version: string;\n}\n\nexport function scoreFafb(bytes: Uint8Array): FafbMeta {\n return JSON.parse(getKernel().score_fafb(bytes));\n}\n\n/** Get WASM SDK version */\nexport function sdkVersion(): string {\n return getKernel().sdk_version();\n}\n",
|
|
@@ -82,45 +82,45 @@
|
|
|
82
82
|
"import type { FafData } from './types.js';\nimport { REPRESENTS_RE, isAboutFaf } from './about.js';\n\n/** Validate a parsed .faf object */\nexport function validateFaf(data: unknown): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!data || typeof data !== 'object') {\n errors.push('File is not a valid YAML mapping');\n return { valid: false, errors };\n }\n\n const faf = data as FafData;\n\n if (!faf.faf_version) {\n errors.push('Missing required field: faf_version');\n }\n\n if (!faf.project?.name) {\n errors.push('Missing required field: project.name');\n }\n\n // about is a repo role, not an app_type.\n if (faf.app_type === 'about') {\n errors.push(\"about is not an app_type — declare about.represents (owner/repo) instead\");\n }\n\n // About Repo: the about: block is the signal. represents is required.\n if (faf.about !== undefined) {\n if (!isAboutFaf(faf) || typeof faf.about.represents !== 'string') {\n errors.push('about.represents is required (owner/repo of the source codebase)');\n } else if (!REPRESENTS_RE.test(faf.about.represents)) {\n errors.push(`about.represents must be \"owner/repo\" format (got: ${faf.about.represents})`);\n }\n if (faf.about.source_score !== undefined) {\n const s = faf.about.source_score;\n if (typeof s !== 'number' || s < 0 || s > 100) {\n errors.push(`about.source_score must be a number 0-100 (got: ${s})`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n",
|
|
83
83
|
"import { lstatSync } from 'fs';\nimport { join, dirname, basename, resolve } from 'path';\nimport { execFileSync } from 'child_process';\nimport { YAMLParseError, isMap, isScalar, parse, stringify, type Document } from 'yaml';\nimport type { FafData } from '../core/types.js';\nimport { asFafMapping, describeShape } from '../core/shape.js';\nimport { isPlaceholder } from '../core/slots.js';\nimport { SafePathError, readBytesIfPresent, readUtf8, resolveInside, safeWriteFile } from '../core/safe-write.js';\nimport { editYaml, keptAliases, mergeData, restoreAliases, restoreAnchors, type KeptAlias } from '../core/yaml-edit.js';\nimport { fafSourceOf, isFill, setFafSource, type FafSource } from '../core/faf-source.js';\n\n/** The real path to read for the .faf at `path`. A link must stay inside the\n * folder the .faf sits in and end at a .faf/.fafm file — `project.faf →\n * ~/.aws/credentials` or `project.faf → .env` throws a SafePathError, and\n * nothing is read. */\nfunction fafToRead(path: string): string {\n const full = resolve(path);\n return resolveInside(dirname(full), full, { read: true });\n}\n\n/** yaml's YAMLParseError behind `e` (thrown by yaml, or the cause of\n * parseForEdit's refusal), or null. */\nfunction yamlParseError(e: unknown): YAMLParseError | null {\n if (e instanceof YAMLParseError) {return e;}\n const cause = (e as { cause?: unknown } | null)?.cause;\n return cause instanceof YAMLParseError ? cause : null;\n}\n\n/** A .faf that is not valid YAML, as one line (SafePathError `not-yaml`):\n * \"<file> is not valid YAML (<reason>, line N) — faf left it unchanged\". */\nfunction notValidYaml(path: string, err: YAMLParseError): SafePathError {\n const reason = err.message.split('\\n')[0].replace(/ at line \\d+, column \\d+:?\\s*$/, '').replace(/:\\s*$/, '');\n const line = err.linePos?.[0]?.line;\n const full = resolve(path);\n return new SafePathError('not-yaml', full, `${full} is not valid YAML (${reason}${line === undefined ? '' : `, line ${line}`}) — faf left it unchanged`, { cause: err });\n}\n\n/** Run `call` — a call into faf's scoring kernel with the text of the .faf\n * at `path` (or the bytes of the .fafb there) — and turn a rejection by the\n * kernel into the one-line refusal. The kernel throws a bare string (or an\n * Error) for text it cannot read, some of which yaml reads (a 30-digit\n * integer, nesting past the kernel's depth limit); that becomes a\n * SafePathError (`not-yaml`): \"<file>: faf's scoring kernel could not read\n * it (<reason>) — faf left it unchanged\". A SafePathError from `call` passes\n * through as it is. Every command that hands project.faf (or a .fafb) to\n * the kernel calls it through here, after it has read the file as a .faf\n * ({@link readFaf}, or {@link readFafFromString} with the path); one that\n * edits project.faf (`faf auto`, `faf go`, `faf sync --direction pull`)\n * asks the kernel before it writes, so the line is true. `faf diff` and\n * `faf log` score a version the kernel cannot read as 0 instead. */\nexport function withKernel<T>(path: string, call: () => T): T {\n try {\n return call();\n } catch (e) {\n if (e instanceof SafePathError) {throw e;}\n const why = (e instanceof Error ? e.message : String(e)).split('\\n')[0].trim();\n const full = resolve(path);\n throw new SafePathError('not-yaml', full, `${full}: faf's scoring kernel could not read it (${why}) — faf left it unchanged`, { cause: e });\n }\n}\n\n/** Read and parse a .faf file. Always a mapping: an empty file reads as `{}`;\n * a file that parses to a scalar or a list throws a SafePathError\n * (`not-yaml`, one line) instead of handing callers a value they would\n * spread into character keys. A file\n * that is not valid YAML throws a SafePathError (`not-yaml`): \"<file> is not\n * valid YAML (<reason>, line N) — faf left it unchanged\". A link that\n * leaves the folder, or does not end at a .faf/.fafm file, is refused, and so\n * is a file that is not UTF-8. The data remembers the text it was read from:\n * writeFaf refuses to write it back over a file that changed since. */\nexport function readFaf(path: string): FafData {\n const real = fafToRead(path);\n const text = readUtf8(real);\n let parsed: unknown;\n try {\n parsed = parse(text);\n } catch (e) {\n const yamlError = yamlParseError(e);\n if (yamlError) {throw notValidYaml(path, yamlError);}\n throw e;\n }\n const data = asFafMapping(parsed, path) as FafData;\n setFafSource(data, { real, text });\n return data;\n}\n\n/** Serialize .faf data to YAML text — the exact bytes writeFaf writes for a\n * new file (an existing file is updated in place instead).\n *\n * If `data._meta.found` is present, it's stripped before serialization and\n * rendered as a `# found: <list>` YAML comment next to the `type:` field —\n * Glass Hood doctrine: the user sees WHY the cli classified the project as\n * it did. `_meta` is a runtime hint, never a serialized .faf field. Used by\n * writeFaf and by `faf git --stdout`. */\nexport function serializeFaf(data: FafData): string {\n const meta = (data as FafData & { _meta?: { found?: string[] } })._meta;\n // Strip _meta before serialization — it's never part of the .faf schema.\n const cleanData: FafData = { ...data };\n delete (cleanData as Record<string, unknown>)._meta;\n\n let text = stringify(cleanData, { lineWidth: 0 });\n\n // Inject `# found: ...` next to `type:` if rationale was provided.\n if (meta?.found && meta.found.length > 0) {\n const comment = meta.found.join(' + ');\n // Match ` type: <value>` — only inject if there isn't already a comment.\n text = text.replace(\n /^(\\s+type:\\s+\\S+)(\\s*)$/m,\n (match, prefix: string, trailing: string) => {\n if (trailing.includes('#')) {return match;}\n return `${prefix} # found: ${comment}`;\n },\n );\n }\n\n return text;\n}\n\n/** What {@link updateFafFile} did. */\nexport interface UpdateFafResult {\n /** True when the file changed on disk; false when the change was a no-op and\n * nothing was written. */\n written: boolean;\n /** The file's text after the update (its original text when nothing changed). */\n text: string;\n /** Aliases the change would have replaced, left as written: `path` is where\n * (`stack`), `alias` what the file says there (`*base`). faf never replaces\n * or expands an alias; the change at that path is not written. */\n keptAliases?: KeptAlias[];\n}\n\nexport type { KeptAlias };\n\n/**\n * Update an existing .faf in place, keeping every byte the change does not\n * touch. The file is parsed with yaml's `parseDocument`; `mutate` changes the\n * Document through its node APIs (`doc.setIn(['stack', 'database'], 'Postgres')`,\n * `doc.deleteIn([...])`, `doc.getIn([...], true)`); only the text of the nodes\n * that changed is rewritten. Comments, blank lines, key order, quoting, scalar\n * source text (`version: 1.10`, `0x1F90`, a 20-digit integer), anchors, unknown\n * keys (a user's own `_meta` included), CRLF, a BOM and the `%YAML` / `---` /\n * `...` framing survive — nothing folds at 80 columns. When the change leaves\n * the data as it was, nothing is written (`written: false`), even if faf's own\n * layout of the file would differ.\n *\n * An alias the change replaces (`doc.set('stack', …)` over `stack: *base`)\n * is put back: faf never replaces or expands an alias, so that path stays as\n * written and is listed in `keptAliases`; the rest of the change is written.\n *\n * The file must exist. The same link rules as {@link readFaf} (a link must\n * stay in the folder and end at a .faf/.fafm file) and the atomic write of\n * `safeWriteFile` apply; the write itself goes only through a link to a file\n * of the same name. A file that is not valid YAML (SafePathError `not-yaml`,\n * one line), or not UTF-8, is refused (nothing written); so is a file that\n * parses to a scalar or a list — the same `not-yaml` refusal readFaf gives,\n * before `mutate` is called — anything `mutate` throws, and a file that\n * changed on disk while faf was writing.\n */\nexport function updateFafFile(path: string, mutate: (doc: Document) => void): UpdateFafResult {\n return updateFaf(path, mutate, undefined);\n}\n\n/** updateFafFile, checked against `base` — the read the caller's data came\n * from — when it is a read of this same file. `after` runs on the changed\n * Document once its aliases are back (with the file's data before the\n * change), and may list more of them. `keepAnchors` (a fill): a node with an\n * anchor that an alias reads is put back as written too. */\nfunction updateFaf(\n path: string,\n mutate: (doc: Document) => void,\n base: FafSource | undefined,\n after?: (doc: Document, before: unknown) => KeptAlias[],\n keepAnchors = false,\n): UpdateFafResult {\n const real = fafToRead(path);\n const text = readUtf8(real);\n let kept: KeptAlias[] = [];\n let result: ReturnType<typeof editYaml>;\n try {\n result = editYaml(text, doc => {\n // A scalar or a list is refused before `mutate` sees it.\n refuseNotMapping(doc, path);\n const before = doc.clone();\n mutate(doc);\n kept = restoreAliases(before, doc);\n if (keepAnchors) {kept = [...kept, ...restoreAnchors(before, doc)];}\n if (after) {kept = [...kept, ...after(doc, before.toJS()).filter(k => !kept.some(x => x.path === k.path))];}\n }, path);\n } catch (e) {\n const yamlError = yamlParseError(e);\n if (yamlError) {throw notValidYaml(path, yamlError);}\n throw e;\n }\n if (!result.changed) {return { written: false, text, keptAliases: kept };}\n // The file must still be what the caller's data was read from (else a stale\n // read would write over a newer edit), and what faf read here.\n safeWriteFile(path, result.text, { expect: base && base.real === real ? base.text : text });\n return { written: true, text: result.text, keptAliases: kept };\n}\n\n/** Options for {@link writeFaf}. */\nexport interface WriteFafOptions {\n /** Write a fresh file from `data` even when one exists — the explicit\n * overwrite (`faf init --force`, `faf git --force`). Default: an existing\n * file is updated in place with {@link updateFafFile}. */\n replace?: boolean;\n /** Called for each alias of an existing file that `data` would change\n * (`stack: *base` while `data.stack` has more keys): faf leaves it as\n * written — it never replaces or expands an alias — and that path is not\n * written. For a fill (data from updateExistingFaf) it is also called for\n * each node with an anchor an alias reads that the fill would change\n * (`kind: 'anchor'`). `faf auto` prints one line for each. */\n onAliasKept?: (kept: KeptAlias) => void;\n}\n\n/** The one line faf prints for an alias (or an anchor an alias reads) it left as written. */\nexport function aliasKeptNote(kept: KeptAlias): string {\n if (kept.kind === 'anchor') {return `${kept.path} holds an anchor (${kept.alias}) that an alias reads — faf left it as written`;}\n return `${kept.path} is an alias (${kept.alias}) — faf left it as written`;\n}\n\n/** True when something is already at `path` (a file or a link). */\nfunction exists(path: string): boolean {\n try {\n lstatSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/** `project.type` as the file has it, before a write. */\nfunction projectType(doc: Document): unknown {\n const node = doc.getIn(['project', 'type'], true);\n return isScalar(node) ? node.value : node;\n}\n\n/** A .faf Document whose root is a scalar or a list is refused — the same\n * SafePathError (`not-yaml`) {@link readFaf} throws: \"<file>: a .faf must be\n * a YAML mapping (key: value pairs), but this one is a string (\"…\"). faf left\n * it unchanged — fix it by hand.\" An empty document passes. */\nfunction refuseNotMapping(doc: Document, path: string): void {\n const root = doc.contents;\n if (root !== null && root !== undefined && !isMap(root)) {\n throw new SafePathError('not-yaml', resolve(path), `${path}: a .faf must be a YAML mapping (key: value pairs), but this one is ${describeShape(doc.toJS())}. faf left it unchanged — fix it by hand.`);\n }\n}\n\n/** Make the .faf Document hold `data`, changing only what `data` changes:\n * the file's own data is read first and only the paths where `data` differs\n * from it are written ({@link mergeData}) — a value `data` merely repeats\n * (the text an alias read as, say) is never written over the node the file\n * has. faf's runtime `_meta` (detection rationale) is never written: a\n * `_meta` in `data` is faf's own unless the file already carries a `_meta`\n * key — then it is the user's, kept like any other key. The `# found:`\n * rationale is written only next to a `type:` this write fills; a type\n * already in the file is left exactly as it is. */\nfunction applyFafData(doc: Document, data: FafData, path: string): void {\n refuseNotMapping(doc, path);\n const root = doc.contents;\n const fileHasMeta = isMap(root) && root.items.some(p => isScalar(p.key) && p.key.value === '_meta');\n const { _meta: meta, ...rest } = data as FafData & { _meta?: { found?: string[] } };\n const typeBefore = projectType(doc);\n const before: unknown = isMap(root) ? doc.toJS() : {};\n const map = isMap(root) ? root : doc.createNode({});\n doc.contents = map;\n mergeData(doc, map, before, fileHasMeta ? { ...data } : rest);\n if (!fileHasMeta) {addFoundRationale(doc, meta?.found, typeBefore);}\n}\n\n/** `data` as applyFafData writes it: faf's runtime `_meta` left out unless\n * the file has a `_meta` of its own. */\nfunction withoutRuntimeMeta(doc: Document, data: FafData): unknown {\n const root = doc.contents;\n if (isMap(root) && root.items.some(p => isScalar(p.key) && p.key.value === '_meta')) {return data;}\n const { _meta: _ignored, ...rest } = data as FafData & { _meta?: unknown };\n return rest;\n}\n\n/** `# found: …` next to `project.type` — only when this write filled it. */\nfunction addFoundRationale(doc: Document, found: string[] | undefined, typeBefore: unknown): void {\n if (!found || found.length === 0 || !isPlaceholder(typeBefore)) {return;}\n const node = doc.getIn(['project', 'type'], true);\n if (isScalar(node) && !isPlaceholder(node.value) && (node.comment === null || node.comment === undefined)) {\n node.comment = ` found: ${found.join(' + ')}`;\n }\n}\n\n/** Write a .faf file from data — atomically (temp file, fsync, rename; a\n * failure leaves the original as it was), and never through a link that\n * leaves the folder or dangles (SafePathError). An in-project link is written\n * through and stays a link.\n *\n * An existing file is updated in place ({@link updateFafFile}): `data` is\n * compared with what the file holds, and only the values that changed are\n * rewritten — so comments, formatting, source text and key order survive, a\n * value `data` merely repeats (the text an alias `*g` read as, say) never\n * replaces the node the file has, and a write that changes nothing writes\n * nothing. A key the file has and `data` leaves out is kept (faf removes\n * nothing it did not write). Pass `{ replace: true }` to overwrite the file\n * with a fresh render instead. Returns false when nothing was written.\n *\n * An alias in the file (`stack: *base`) is never replaced or expanded: it\n * stays as written, and a change `data` makes under it is not written —\n * `opts.onAliasKept` hears of each such path. When `data` is a fill (from\n * updateExistingFaf), a node with an anchor that an alias reads is left as\n * written as well (filling it would change every alias), and reported the\n * same way with `kind: 'anchor'`.\n *\n * When `data` came from readFaf of this file (directly, or through\n * updateExistingFaf), the write is refused if the file changed on disk since\n * that read (SafePathError `changed`: \"not written; original kept\"), so an\n * edit made meanwhile is never written over. A new file is not written over\n * one that appeared meanwhile. */\nexport function writeFaf(path: string, data: FafData, opts: WriteFafOptions = {}): boolean {\n if (!opts.replace && exists(path)) {\n const result = updateFaf(path, doc => applyFafData(doc, data, path), fafSourceOf(data), (doc, before) => keptAliases(doc, withoutRuntimeMeta(doc, data), before), isFill(data));\n setFafSource(data, { real: fafToRead(path), text: result.text });\n for (const kept of result.keptAliases ?? []) {opts.onAliasKept?.(kept);}\n return result.written;\n }\n const full = resolve(path);\n const text = serializeFaf(data);\n const expect = exists(path) ? readBytesIfPresent(resolveInside(dirname(full), full)) : null;\n const real = safeWriteFile(path, text, { expect });\n setFafSource(data, { real, text });\n return true;\n}\n\n/** Read raw YAML text from a .faf file (the same link rules as readFaf; a\n * file that is not UTF-8 is refused). */\nexport function readFafRaw(path: string): string {\n return readUtf8(fafToRead(path));\n}\n\n/** Parse .faf data from a YAML string — e.g. the output of `git show <ref>:project.faf`.\n * The readers above are path-only; `faf diff` needs to parse a version that\n * lives in git history, never on disk. With `path` (the file the text was\n * read from) the text is read as {@link readFaf} reads a file: text that is\n * not valid YAML throws a SafePathError (`not-yaml`) naming it, and so does\n * text that parses to a scalar or a list (faf's shape check,\n * `asFafMapping`); empty text reads as `{}`. Without `path`, the parsed\n * value as it is, or yaml's own error. */\nexport function readFafFromString(text: string, path?: string): FafData {\n let parsed: unknown;\n try {\n parsed = parse(text);\n } catch (e) {\n const yamlError = yamlParseError(e);\n if (path !== undefined && yamlError) {throw notValidYaml(path, yamlError);}\n throw e;\n }\n return (path === undefined ? parsed : asFafMapping(parsed, path)) as FafData;\n}\n\n/** True when `full` is a .faf faf may read: a regular file, or a link that\n * stays inside `folder` and ends at a .faf/.fafm file. Nothing there, or a\n * folder that happens to be named `.faf`, is not a candidate. A link that\n * leaves `folder`, dangles or ends anywhere else throws a SafePathError —\n * refused out loud, never skipped (skipping would let `faf init` create a\n * file through it). */\nfunction isFafCandidate(folder: string, full: string): boolean {\n let st;\n try {\n st = lstatSync(full);\n } catch {\n return false;\n }\n if (!st.isSymbolicLink() && !st.isFile()) {return false;}\n resolveInside(folder, resolve(full), { read: true });\n return true;\n}\n\n/** Find the .faf file in a directory (walks up one level). The path is\n * returned as spelled; a symlinked candidate must pass the readFaf link rules\n * or this throws a SafePathError. */\nexport function findFafFile(dir: string = process.cwd()): string | null {\n const candidates = ['project.faf', '.faf'];\n // Use path.join for cross-platform separator handling — earlier\n // template-literal `${dir}/${name}` produced forward-slash paths\n // even on Windows, breaking strict path equality and any consumer\n // that path-compared the result.\n for (const name of candidates) {\n const full = join(dir, name);\n if (isFafCandidate(dir, full)) {return full;}\n }\n // Walk up one level — use path.dirname for cross-platform parent\n // resolution. The earlier regex `dir.replace(/\\/[^/]+$/, '')`\n // only matched POSIX separators and silently no-op'd on Windows.\n const parent = dirname(dir);\n if (parent !== dir) {\n for (const name of candidates) {\n const full = join(parent, name);\n if (isFafCandidate(parent, full)) {return full;}\n }\n }\n return null;\n}\n\n/** Repo-root-relative path of a .faf, computed BY git — runtime- and OS-independent.\n * Replaces `path.relative(top, fafPath)`, which breaks on Windows when git's\n * long-form `--show-toplevel` and an 8.3 short-name cwd (e.g. `RUNNER~1`) disagree.\n * git resolves both representations internally and emits forward slashes; works for\n * tracked AND untracked .faf (it's the cwd's location under the root, not file status).\n * Caller must already be inside a git repo. */\nexport function gitRepoRel(fafPath: string, cwd: string = process.cwd()): string {\n const prefix = execFileSync('git', ['-C', dirname(fafPath), 'rev-parse', '--show-prefix'], {\n cwd,\n encoding: 'utf-8',\n }).trim(); // '' at repo root, or 'sub/dir/' (trailing slash)\n return prefix + basename(fafPath);\n}\n",
|
|
84
84
|
"'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar Schema = require('./schema/Schema.js');\nvar errors = require('./errors.js');\nvar Alias = require('./nodes/Alias.js');\nvar identity = require('./nodes/identity.js');\nvar Pair = require('./nodes/Pair.js');\nvar Scalar = require('./nodes/Scalar.js');\nvar YAMLMap = require('./nodes/YAMLMap.js');\nvar YAMLSeq = require('./nodes/YAMLSeq.js');\nvar cst = require('./parse/cst.js');\nvar lexer = require('./parse/lexer.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\nvar publicApi = require('./public-api.js');\nvar visit = require('./visit.js');\n\n\n\nexports.Composer = composer.Composer;\nexports.Document = Document.Document;\nexports.Schema = Schema.Schema;\nexports.YAMLError = errors.YAMLError;\nexports.YAMLParseError = errors.YAMLParseError;\nexports.YAMLWarning = errors.YAMLWarning;\nexports.Alias = Alias.Alias;\nexports.isAlias = identity.isAlias;\nexports.isCollection = identity.isCollection;\nexports.isDocument = identity.isDocument;\nexports.isMap = identity.isMap;\nexports.isNode = identity.isNode;\nexports.isPair = identity.isPair;\nexports.isScalar = identity.isScalar;\nexports.isSeq = identity.isSeq;\nexports.Pair = Pair.Pair;\nexports.Scalar = Scalar.Scalar;\nexports.YAMLMap = YAMLMap.YAMLMap;\nexports.YAMLSeq = YAMLSeq.YAMLSeq;\nexports.CST = cst;\nexports.Lexer = lexer.Lexer;\nexports.LineCounter = lineCounter.LineCounter;\nexports.Parser = parser.Parser;\nexports.parse = publicApi.parse;\nexports.parseAllDocuments = publicApi.parseAllDocuments;\nexports.parseDocument = publicApi.parseDocument;\nexports.stringify = publicApi.stringify;\nexports.visit = visit.visit;\nexports.visitAsync = visit.visitAsync;\n",
|
|
85
|
-
"/**\n * Safe file access — the one primitive every faf writer, and every read of\n * project context, goes through. It is also the only module in faf that calls\n * a filesystem write, rename, delete, mkdir or chmod API (tests/write-guard\n * enforces that for all of src/).\n *\n * Rule 1 — stay inside the project. Before faf touches a path it resolves it on\n * disk (realpath: every link followed). If that leads outside the project\n * folder, faf refuses. A dangling link is refused — faf never creates a file at\n * the end of a link. Anything whose real path is inside a `.git` folder is\n * refused, always — with two narrow exceptions: faf's own git hook\n * (`allowGitHooks`: one file directly inside the repo's hooks folder), and\n * the repo's own git config file (`allowGitConfig`: the file `config`\n * directly in the folder git names for it), where `faf diff\n * --uninstall-driver` removes the section faf's install wrote.\n *\n * Rule 2 — a link leads to the same kind of file. faf follows a link only to a\n * file with the same name (CLAUDE.md → docs/CLAUDE.md), or from one AI context\n * file to another (CLAUDE.md → AGENTS.md; the set is FAF_CONTEXT_FILES). The\n * link itself survives: faf writes the file it points at. `CLAUDE.md →\n * README.md` or `project.html → package.json` is refused — faf would be\n * writing a file it was never asked to write. A read of project context\n * through a link must land on a .faf or .fafm file instead, so `project.faf →\n * .env` is refused even though .env is in the project — or, for a read of an\n * AI context file, on another AI context file (`faf recover` reads CLAUDE.md →\n * AGENTS.md), the rule the writers use.\n *\n * Rule 3 — never leave a half-written file. A write goes to a temp file in the\n * same folder, is flushed to disk (fsync), then renamed over the original in\n * one step, keeping the original's permissions. If any step fails the temp\n * file is removed and the original is exactly as it was: \"not written;\n * original kept\". A plain writeFileSync truncates first, so a full disk, a\n * quota or a killed process used to leave the user's file cut short. With\n * `expect` (the bytes the caller read), the file is read again just before the\n * rename and the write is refused if it changed in the meantime. Its mode is\n * checked too: a file made read-only, or given other permissions, while faf\n * was writing is not replaced.\n *\n * Rule 4 — text faf edits is UTF-8. readUtf8 decodes strictly: a UTF-16 file or\n * any bytes that are not UTF-8 are refused, never turned into U+FFFD and\n * written back.\n *\n * Rule 5 — a whole file faf renders replaces a file already there only when\n * faf can prove it wrote it: project.html, the cards, `faf server-card --out`,\n * a `faf taf --output` snapshot and a `faf decompile --output` file must be\n * byte for byte what faf last wrote (their render hash, render-hash.ts); a\n * `.fafb` must carry the FAFB header (see {@link safeReplaceOwned}). Anything\n * else is refused unless the caller passes `force` (the CLI's `--force`).\n */\nimport {\n accessSync,\n closeSync,\n constants,\n fchmodSync,\n fchownSync,\n fsyncSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readdirSync,\n readFileSync,\n readlinkSync,\n realpathSync,\n renameSync,\n rmSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from 'fs';\nimport { randomBytes } from 'crypto';\nimport { tmpdir } from 'os';\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'path';\n\n/** Why a path was refused. */\nexport type SafePathReason =\n | 'outside'\n | 'dangling'\n | 'not-a-file'\n | 'not-faf'\n | 'other-file'\n | 'git'\n | 'not-utf8'\n | 'changed'\n | 'not-owned'\n | 'not-yaml'\n | 'unplaceable';\n\n/**\n * A path faf will not read or write, or a file faf will not change. Nothing\n * was written; the file on disk is exactly as it was.\n * - `outside`, `dangling`, `not-a-file`, `not-faf`, `other-file`, `git`: the\n * path is refused (see {@link resolveInside}).\n * - `not-utf8`: the file is not UTF-8 (see {@link readUtf8}).\n * - `changed`: the file changed on disk after faf read it — its bytes, or its\n * mode (see the `expect` option of {@link safeWriteFile}).\n * - `not-owned`: a whole file faf renders is already there and faf cannot\n * prove it wrote every byte of it — it has no faf mark, or it was edited\n * since faf wrote it, or it is from before faf recorded a render hash (see\n * {@link safeReplaceOwned} and render-hash.ts).\n * - `not-yaml`: a .faf faf reads or edits is not valid YAML: \"<file> is not\n * valid YAML (<reason>, line N) — faf left it unchanged\"; or it parses to\n * a scalar or a list, not a mapping; or faf's scoring kernel cannot read\n * it (`faf score`, `faf compile`, `faf refresh`).\n * - `unplaceable`: faf could not place its managed block where its next run\n * finds it again, so it wrote nothing (see inject.ts).\n *\n * `onWrite` is true when faf refused at the write itself — it may have read\n * the file before (a `.faf` read through a link, say) — and false when it\n * refused before reading or writing anything.\n */\nexport class SafePathError extends Error {\n readonly reason: SafePathReason;\n /** The path as the caller named it (absolute). */\n readonly path: string;\n /** True when the refusal came at the write (faf may have read the file first). */\n readonly onWrite: boolean;\n\n constructor(reason: SafePathReason, path: string, message: string, opts: { onWrite?: boolean; cause?: unknown } = {}) {\n super(message, opts.cause === undefined ? undefined : { cause: opts.cause });\n this.name = 'SafePathError';\n this.reason = reason;\n this.path = path;\n this.onWrite = opts.onWrite === true;\n }\n}\n\nexport interface ResolveInsideOptions {\n /** Resolving for a read of project context: a link must end at a `.faf` or\n * `.fafm` file — or, when the name is an AI context file (CLAUDE.md), at\n * another AI context file (CLAUDE.md → AGENTS.md), the rule the writers\n * use. A plain file is read under the name the caller gave. */\n read?: boolean;\n /**\n * Resolving faf's own git hook (`faf hooks`) — one of the two exceptions\n * to the `.git` rule. `dir` must be the repo's hooks folder as git names it\n * (`git rev-parse --git-path hooks`, a folder named `hooks`), and `name` a\n * hook file sitting directly in it (`pre-commit`). Only that file may be\n * inside `.git`; nothing below or beside it. Links are still checked: a\n * link must stay inside the hooks folder's real folder and end at a file of\n * the same name.\n */\n allowGitHooks?: boolean;\n /**\n * Resolving the repo's own git config file (`faf diff --uninstall-driver`)\n * — the other exception to the `.git` rule. `dir` must be the folder git\n * names for it (the folder of `git rev-parse --git-path config`), and `name`\n * the file `config` directly in it. Only that file may be inside `.git`;\n * nothing below or beside it. A link must stay inside that folder and end\n * at a file named `config`.\n */\n allowGitConfig?: boolean;\n}\n\nexport interface SafeWriteOptions {\n /** The project folder the write must stay inside. Default: the file's own folder. */\n root?: string;\n /**\n * The bytes the caller read from the file. Just before the rename the file\n * is read again; when it no longer equals `expect`, the temp file is removed\n * and a SafePathError (`changed`) is thrown: \"<file> changed on disk while\n * faf was writing — not written; original kept\". A string is compared as its\n * UTF-8 bytes. `null` means the caller found no file there: if one has\n * appeared, the write is refused the same way (a missing file stays\n * missing). Omit it to write without the byte check (the mode check below\n * still runs).\n */\n expect?: string | Uint8Array | null;\n /** Write faf's own git hook: see {@link ResolveInsideOptions.allowGitHooks}. `root` is the hooks folder. */\n allowGitHooks?: boolean;\n /** Write the repo's own git config file: see {@link ResolveInsideOptions.allowGitConfig}. `root` is its folder. */\n allowGitConfig?: boolean;\n /** Permission bits for the written file. Default: the original's (a new\n * file gets the default create mode). */\n mode?: number;\n}\n\n/**\n * The files faf's block injector writes — one managed block, every other byte\n * of the file kept. Each injector writer (writeClaudeMd, writeAgentsMd,\n * writeGeminiMd, writeCursorrules, writeCopilotInstructions, writeMemoryMd,\n * writeLlmsTxt, writeClaudeMemory) takes its file name from this table, so\n * the set is exactly the files those writers target. A link from one of these\n * names to another (CLAUDE.md → AGENTS.md) may be followed.\n */\nexport const FAF_CONTEXT_FILES = Object.freeze({\n claude: 'CLAUDE.md',\n agents: 'AGENTS.md',\n gemini: 'GEMINI.md',\n cursorrules: '.cursorrules',\n copilot: 'copilot-instructions.md',\n memory: 'MEMORY.md',\n llms: 'llms.txt',\n} as const);\n\nconst CONTEXT_NAMES = new Set<string>(Object.values(FAF_CONTEXT_FILES).map(n => n.toLowerCase()));\n/** File names compare without case: a case-insensitive disk (macOS, Windows)\n * spells one name several ways. */\nconst sameName = (a: string, b: string): boolean => a.toLowerCase() === b.toLowerCase();\nconst isContextFile = (name: string): boolean => CONTEXT_NAMES.has(name.toLowerCase());\n\n/** True when a path runs through a `.git` folder, or is `.git` itself. */\nfunction inGitDir(p: string): boolean {\n return p.split(/[\\\\/]/).some(part => part.toLowerCase() === '.git');\n}\n\nconst FAF_FILE = /\\.fafm?$/i;\n/** A git hook's file name (`pre-commit`, `commit-msg`, …). */\nconst HOOK_NAME = /^[a-z][a-z0-9-]*$/;\nconst realpath = (p: string): string => realpathSync.native(p);\nconst errnoOf = (e: unknown): string | undefined => (e as NodeJS.ErrnoException | null)?.code;\n\n/** True when `p` is `root` or below it. Both must already be real paths. */\nfunction isInside(root: string, p: string): boolean {\n const rel = relative(root, p);\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));\n}\n\n/** Where a link points, as written in the link — for error messages only. */\nfunction linkText(p: string): string {\n try {\n return readlinkSync(p);\n } catch {\n return '?';\n }\n}\n\n/** What a resolve is for: a read of project context, and/or one of the two\n * files faf may reach inside `.git` (its git hook, the repo's git config) —\n * `inGit`: a file directly in `root` may be inside `.git`. */\ninterface ResolveMode {\n read: boolean;\n inGit: boolean;\n}\n\n/** Resolve the final component when it is a link: it must exist, stay inside\n * `root` and out of `.git` (a hook may sit directly in the hooks folder, the\n * git config directly in its folder),\n * be a regular file and — for a read of project context — be a .faf/.fafm\n * file; otherwise have the link's own name, or be an AI context file reached\n * from one. */\nfunction followLink(root: string, requested: string, link: string, mode: ResolveMode): string {\n let real: string;\n try {\n real = realpath(link);\n } catch (e) {\n const code = errnoOf(e);\n if (code === 'ENOENT' || code === 'ELOOP' || code === 'ENOTDIR') {\n throw new SafePathError(\n 'dangling',\n requested,\n `${requested} is a link to ${linkText(link)}, which does not exist. faf does not create files through a link — refused.`,\n );\n }\n throw e;\n }\n if (!isInside(root, real)) {\n throw new SafePathError('outside', requested, `${requested} is a link to ${real}, outside ${root} — refused.`);\n }\n if (inGitDir(real) && !(mode.inGit && dirname(real) === root)) {\n throw new SafePathError('git', requested, `${requested} is a link to ${real}, inside .git/ — refused.`);\n }\n if (!statSync(real).isFile()) {\n throw new SafePathError('not-a-file', requested, `${requested} is a link to ${real}, which is not a regular file — refused.`);\n }\n refuseOtherKind(requested, real, mode.read);\n return real;\n}\n\n/** The file at the end of a link must be the kind the caller asked for: for a\n * read of project context a .faf/.fafm file (or, for an AI context file,\n * another AI context file); otherwise a file with the link's own name, or an\n * AI context file when the link is one too. */\nfunction refuseOtherKind(requested: string, real: string, read: boolean): void {\n const asked = basename(requested);\n const got = basename(real);\n const contextToContext = isContextFile(asked) && isContextFile(got);\n if (read && !FAF_FILE.test(got) && !contextToContext) {\n const kind = isContextFile(asked) ? 'a .faf or .fafm file, nor another AI context file' : 'a .faf or .fafm file';\n throw new SafePathError('not-faf', requested, `${requested} is a link to ${real}, which is not ${kind} — refused.`);\n }\n if (!read && !sameName(asked, got) && !contextToContext) {\n throw new SafePathError(\n 'other-file',\n requested,\n `${requested} is a link to ${real}, a file with another name — refused (faf follows a link only to a file of the same name, or from one AI context file to another).`,\n );\n }\n}\n\n/** With allowGitHooks: `dir` must be a hooks folder and `requested` a hook\n * file directly in it — the whole of the exception. */\nfunction checkHookTarget(dir: string, requested: string, root: string, folder: string): void {\n if (basename(resolve(dir)) !== 'hooks' || !HOOK_NAME.test(basename(requested))) {\n throw new SafePathError('git', requested, `${requested} is not a git hook in a hooks folder — refused.`);\n }\n if (folder !== root) {\n throw new SafePathError('git', requested, `${requested} is not directly in the hooks folder ${root} — refused.`);\n }\n}\n\n/** With allowGitConfig: `requested` must be the file `config` directly in the\n * folder git names for it — the whole of the exception. */\nfunction checkConfigTarget(requested: string, root: string, folder: string): void {\n if (basename(requested) !== 'config' || folder !== root) {\n throw new SafePathError('git', requested, `${requested} is not the git config file directly in ${root} — refused.`);\n }\n}\n\n/**\n * Resolve `name` inside the project folder `dir` and return the real path to\n * read or write — or throw a SafePathError.\n *\n * - the folder the file sits in must resolve to `dir` or below it\n * - a path whose real form runs through `.git` → refused, always (the two\n * exceptions: `allowGitHooks`, a hook file directly in the hooks folder,\n * and `allowGitConfig`, the file `config` directly in its git folder)\n * - a file that does not exist yet → its path inside the project\n * - a regular file → its path (spelled as on disk)\n * - a link → the file it points at, when that exists, is a regular file, is\n * inside the project and out of `.git`, and has the link's own name (or\n * both names are AI context files: CLAUDE.md → AGENTS.md). With `read`, the\n * file must be a .faf/.fafm file instead (`project.faf → config/team.faf`),\n * or — for an AI context file — another AI context file.\n * - anything else (a link out, a dangling link, a link to a file with\n * another name, a folder, a device) → refused\n *\n * `name` may be relative to `dir` or absolute. `dir` and the folder `name` sits\n * in must exist (their ENOENT is thrown as is).\n */\nexport function resolveInside(dir: string, name: string, opts: ResolveInsideOptions = {}): string {\n const root = realpath(resolve(dir));\n const requested = resolve(dir, name);\n const folder = realpath(dirname(requested));\n if (!isInside(root, folder)) {\n throw new SafePathError('outside', requested, `${requested} is in ${folder}, outside ${root} — refused.`);\n }\n const hooks = opts.allowGitHooks === true;\n const gitConfig = opts.allowGitConfig === true;\n if (hooks) {checkHookTarget(dir, requested, root, folder);}\n if (gitConfig) {checkConfigTarget(requested, root, folder);}\n const target = join(folder, basename(requested));\n if (inGitDir(target) && !hooks && !gitConfig) {\n throw new SafePathError(\n 'git',\n requested,\n target === requested ? `${requested} is inside .git/ — refused.` : `${requested} resolves to ${target}, inside .git/ — refused.`,\n );\n }\n let st;\n try {\n st = lstatSync(target);\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return target;}\n throw e;\n }\n if (st.isSymbolicLink()) {return followLink(root, requested, target, { read: opts.read === true, inGit: hooks || gitConfig });}\n if (!st.isFile()) {\n throw new SafePathError('not-a-file', requested, `${requested} is not a regular file — refused.`);\n }\n // The name as it is on disk (a case-insensitive disk may spell it differently).\n return realpath(target);\n}\n\nconst UTF8 = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });\n\n/** `bytes` as text, strictly: see {@link readUtf8}. `path` names the file in the refusal. */\nfunction decodeUtf8(bytes: Uint8Array, path: string): string {\n const utf16Bom = bytes.length >= 2 && ((bytes[0] === 0xff && bytes[1] === 0xfe) || (bytes[0] === 0xfe && bytes[1] === 0xff));\n if (!utf16Bom) {\n try {\n return UTF8.decode(bytes);\n } catch {\n /* not UTF-8: refused below */\n }\n }\n throw new SafePathError('not-utf8', path, `${path} is not UTF-8 — faf left it unchanged`);\n}\n\n/**\n * Read a text file faf may write back — strictly as UTF-8. A UTF-8 BOM is kept\n * (U+FEFF at the start of the text, as a plain read gives it). A UTF-16 BOM\n * (FF FE or FE FF) or any byte sequence that is not UTF-8 is refused with a\n * SafePathError (`not-utf8`): \"<file> is not UTF-8 — faf left it unchanged\". A\n * lenient read would turn those bytes into U+FFFD, and the next write would\n * lose them. Other read errors (ENOENT, EACCES, …) are thrown as they are.\n * `path` is read as given: resolve it with {@link resolveInside} first.\n */\nexport function readUtf8(path: string): string {\n return decodeUtf8(readFileSync(path), path);\n}\n\n/** The bytes at `path`, or null when nothing is there (only ENOENT). */\nexport function readBytesIfPresent(path: string): Buffer | null {\n try {\n return readFileSync(path);\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return null;}\n throw e;\n }\n}\n\n/** What to keep from the file already at `target` — its permission bits and\n * owner — or undefined when there is none yet. */\ninterface Kept {\n /** Permission bits given to the new file (rwx for owner, group, other). */\n mode: number;\n /** Every mode bit as it was (setuid, setgid and sticky included), to notice a change. */\n perm: number;\n uid: number;\n gid: number;\n}\n\nfunction existingFile(target: string): Kept | undefined {\n try {\n const st = statSync(target);\n return { mode: st.mode & 0o777, perm: st.mode & 0o7777, uid: st.uid, gid: st.gid };\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return undefined;}\n throw e;\n }\n}\n\n/**\n * A write that failed partway — a full disk, a quota, a read-only file, a\n * killed rename — with the file on disk exactly as it was: \"<file>: not\n * written; original kept (<why>)\" (\"not written\" alone when there was no file).\n * `cause` is the error underneath. The CLI prints it as one line.\n */\nexport class NotWrittenError extends Error {\n /** The file that was not written. */\n readonly path: string;\n\n constructor(path: string, message: string, opts: { cause?: unknown } = {}) {\n super(message, { cause: opts.cause });\n this.path = path;\n }\n}\n\nconst changedOnDisk = (target: string): SafePathError =>\n new SafePathError('changed', target, `${target} changed on disk while faf was writing — not written; original kept`, { onWrite: true });\n\n/** Refuse the rename when the file is no longer what the caller read (its\n * bytes, with `expect`), or when its mode changed or it stopped being\n * writable since faf looked at it (`kept`): a file the user made read-only,\n * or gave other permissions, while faf was writing is left as it is. */\nfunction assertUnchanged(target: string, expect: SafeWriteOptions['expect'], kept: Kept | undefined): void {\n if (expect !== undefined) {\n const now = readBytesIfPresent(target);\n const want = expect === null ? null : typeof expect === 'string' ? Buffer.from(expect, 'utf-8') : Buffer.from(expect);\n const same = now === null || want === null ? now === want : now.equals(want);\n if (!same) {throw changedOnDisk(target);}\n }\n if (!kept) {return;}\n let st;\n try {\n st = statSync(target);\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return;} // gone: the byte check above decides\n throw e;\n }\n if ((st.mode & 0o7777) !== kept.perm) {throw changedOnDisk(target);}\n try {\n accessSync(target, constants.W_OK);\n } catch {\n throw changedOnDisk(target);\n }\n}\n\n/** Give the temp file the original's owner (best effort: only root, or a\n * group member for the group, may) and exactly its permission bits. */\nfunction keepOwnerAndMode(fd: number, kept: Kept): void {\n if (process.platform !== 'win32') {\n try { fchownSync(fd, kept.uid, kept.gid); } catch { /* not ours to give */ }\n }\n fchmodSync(fd, kept.mode); // the umask narrowed the create mode\n}\n\n/** Flush the folder entry after the rename. Best effort: the data is already\n * safe, and some platforms (Windows) cannot open a folder. */\nfunction syncFolder(folder: string): void {\n if (process.platform === 'win32') {return;}\n try {\n const fd = openSync(folder, 'r');\n try {\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n } catch {\n /* best effort */\n }\n}\n\n/** The temp file a write goes through; `fd` is set while it is open. */\ninterface TempFile {\n path: string;\n fd?: number;\n created: boolean;\n}\n\n/** Create the temp file (never opening anything already at its name — 'wx' is\n * O_CREAT | O_EXCL, a link included), write it in full, keep the original's\n * owner and mode (or give it `mode`), flush it to disk and close it. */\nfunction fillTemp(temp: TempFile, content: string | Uint8Array, kept: Kept | undefined, mode: number | undefined): void {\n temp.fd = openSync(temp.path, 'wx', mode ?? kept?.mode ?? 0o666);\n temp.created = true;\n writeFileSync(temp.fd, content);\n if (kept) {keepOwnerAndMode(temp.fd, kept);}\n if (mode !== undefined) {fchmodSync(temp.fd, mode);}\n fsyncSync(temp.fd);\n closeSync(temp.fd);\n temp.fd = undefined;\n}\n\n/** Close and remove a temp file after a failure. Never touches a file this\n * write did not create. */\nfunction discardTemp(temp: TempFile): void {\n if (temp.fd !== undefined) {\n try { closeSync(temp.fd); } catch { /* already failing */ }\n }\n if (temp.created) {\n try { unlinkSync(temp.path); } catch { /* already failing */ }\n }\n}\n\n/** Write `content` to `target` atomically: temp file in the same folder,\n * fsync, then — when the file is still what the caller read (`expect`), with\n * the same mode, and still writable — rename over. `target` must already be\n * resolved. */\nfunction replaceAtomically(target: string, content: string | Uint8Array, opts: SafeWriteOptions): void {\n const folder = dirname(target);\n const temp: TempFile = {\n path: join(folder, `.${basename(target).slice(0, 100)}.${process.pid}.${randomBytes(6).toString('hex')}.faf-tmp`),\n created: false,\n };\n const kept = existingFile(target);\n try {\n // A file faf may not write in place (read-only) is not replaced either.\n if (kept) {accessSync(target, constants.W_OK);}\n fillTemp(temp, content, kept, opts.mode);\n assertUnchanged(target, opts.expect, kept);\n renameSync(temp.path, target);\n } catch (e) {\n discardTemp(temp);\n if (e instanceof SafePathError) {throw e;}\n const why = errnoOf(e) ?? (e instanceof Error ? e.message : String(e));\n throw new NotWrittenError(target, `${target}: not written${kept ? '; original kept' : ''} (${why})`, { cause: e });\n }\n syncFolder(folder);\n}\n\n/** A refusal raised while writing: the same SafePathError, marked `onWrite`. */\nfunction atWrite(e: unknown): unknown {\n return e instanceof SafePathError && !e.onWrite ? new SafePathError(e.reason, e.path, e.message, { onWrite: true }) : e;\n}\n\n/**\n * Write a file inside a project, safely: resolved with {@link resolveInside}\n * (a link that leaves the project, dangles, or leads to a file with another\n * name, and anything in `.git`, is refused), then replaced atomically (temp\n * file in the same folder, fsync, rename; the original's permissions — and,\n * where the OS allows, its owner — kept). On any failure the original is\n * untouched and the Error says \"not written; original kept\". With `expect`,\n * a file that changed after the caller read it is not replaced either\n * (SafePathError `changed`); nor is one whose mode changed, or that became\n * read-only, while faf was writing. Returns the real path written — the\n * link's target when `path` is an in-project link.\n */\nexport function safeWriteFile(path: string, content: string | Uint8Array, opts: SafeWriteOptions = {}): string {\n const full = resolve(path);\n let target: string;\n try {\n target = resolveInside(opts.root ?? dirname(full), full, { allowGitHooks: opts.allowGitHooks, allowGitConfig: opts.allowGitConfig });\n } catch (e) {\n throw atWrite(e);\n }\n replaceAtomically(target, content, opts);\n return target;\n}\n\n/** Options for {@link safeReplaceOwned}. */\nexport interface ReplaceOwnedOptions {\n /** The project folder the write must stay inside. Default: the file's own folder. */\n root?: string;\n /** True when the bytes already at the path carry faf's own mark (faf wrote them). */\n owns: (existing: Buffer) => boolean;\n /** faf's mark in words, for the refusal: \"the `_meta[\\\"one.faf/context\\\"]` block\". */\n mark: string;\n /** Replace a file without the mark anyway — the explicit overwrite (`--force`). */\n force?: boolean;\n /** The bytes the caller read there earlier (`null`: no file then). When\n * given, the file must still hold them, else SafePathError `changed`. */\n expect?: string | Uint8Array | null;\n}\n\n/**\n * Write a whole file faf renders (project.html, a Server Card, an A2A card, a\n * `.fafb`), replacing a file already at `path` only when faf can prove it wrote\n * it: its bytes carry faf's own mark (`owns`). A file without the mark is\n * refused — SafePathError `not-owned`: \"<file> has no <mark>, so faf did not\n * write it — faf left it unchanged.\" — and stays byte for byte, unless `force`\n * asks to replace it. The link rules and the atomic write are\n * {@link safeWriteFile}'s, and the write is refused if the file changed on\n * disk after faf read it. Returns the real path written.\n */\nexport function safeReplaceOwned(path: string, content: string | Uint8Array, opts: ReplaceOwnedOptions): string {\n const full = resolve(path);\n const root = opts.root ?? dirname(full);\n const target = resolveInside(root, full);\n const existing = readBytesIfPresent(target);\n if (opts.expect !== undefined) {assertUnchanged(target, opts.expect, undefined);}\n if (existing !== null && opts.force !== true && !opts.owns(existing)) {\n throw new SafePathError('not-owned', full, `${full} has no ${opts.mark}, so faf did not write it — faf left it unchanged.`, { onWrite: true });\n }\n return safeWriteFile(target, content, { root, expect: existing });\n}\n\n/**\n * Create the folder `dir` inside the project folder `root`, with any missing\n * folders between them, and return its real path. `root` itself is the\n * caller's own folder: it is created as named when missing. Below it, faf\n * never creates a folder through a link: an existing folder on the way that\n * is a link leading out of `root` (or a dangling link) is refused, as is any\n * part inside `.git` and anything on the way that is not a folder — so\n * `.github → ~/elsewhere` cannot make faf create `~/elsewhere/workflows`.\n */\nexport function makeDirInside(root: string, dir: string = root): string {\n const top = resolve(root);\n mkdirSync(top, { recursive: true });\n const realRoot = realpath(top);\n const want = resolve(top, dir);\n const rel = relative(top, want);\n if (rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new SafePathError('outside', want, `${want} is outside ${realRoot} — refused.`, { onWrite: true });\n }\n let cur = realRoot;\n for (const part of rel.split(/[\\\\/]/).filter(Boolean)) {\n const next = join(cur, part);\n if (inGitDir(next)) {\n throw new SafePathError('git', want, `${want} runs through ${next}, inside .git/ — refused.`, { onWrite: true });\n }\n cur = stepInto(realRoot, want, next);\n }\n return cur;\n}\n\n/** One folder on the way down in makeDirInside: made when missing, followed\n * when it is a link that stays inside `root`, refused otherwise. */\nfunction stepInto(root: string, want: string, next: string): string {\n let st;\n try {\n st = lstatSync(next);\n } catch (e) {\n if (errnoOf(e) !== 'ENOENT') {throw e;}\n mkdirSync(next);\n return next;\n }\n let real = next;\n if (st.isSymbolicLink()) {\n try {\n real = realpath(next);\n } catch {\n throw new SafePathError('dangling', want, `${next} is a link to ${linkText(next)}, which does not exist. faf does not create folders through a link — refused.`, { onWrite: true });\n }\n if (!isInside(root, real)) {\n throw new SafePathError('outside', want, `${next} is a link to ${real}, outside ${root} — refused.`, { onWrite: true });\n }\n if (inGitDir(real)) {\n throw new SafePathError('git', want, `${next} is a link to ${real}, inside .git/ — refused.`, { onWrite: true });\n }\n }\n if (!statSync(real).isDirectory()) {\n throw new SafePathError('not-a-file', want, `${next} is not a folder — refused.`, { onWrite: true });\n }\n return real;\n}\n\n/**\n * Remove a file faf wrote — only when it still holds exactly `expect` (the\n * bytes faf wrote or read there) and is a regular file inside `root` (default:\n * its own folder), out of `.git`. A link is never removed (faf did not make\n * it), and a file whose bytes changed is left as it is (SafePathError\n * `changed`). Returns false when nothing was there.\n */\nexport function safeUnlink(path: string, opts: { root?: string; expect: string | Uint8Array }): boolean {\n const full = resolve(path);\n const realRoot = realpath(resolve(opts.root ?? dirname(full)));\n const folder = realpath(dirname(full));\n if (!isInside(realRoot, folder)) {\n throw new SafePathError('outside', full, `${full} is in ${folder}, outside ${realRoot} — refused.`, { onWrite: true });\n }\n const target = join(folder, basename(full));\n if (inGitDir(target)) {\n throw new SafePathError('git', full, `${full} is inside .git/ — refused.`, { onWrite: true });\n }\n let st;\n try {\n st = lstatSync(target);\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return false;}\n throw e;\n }\n if (!st.isFile()) {\n throw new SafePathError('not-a-file', full, `${full} is not a regular file faf wrote — left as it is.`, { onWrite: true });\n }\n assertUnchanged(target, opts.expect, undefined);\n unlinkSync(target);\n return true;\n}\n\n/** The temp folders makeTempDir made in this process — the only ones removeTempDir removes. */\nconst TEMP_DIRS = new Set<string>();\n\n/** The marker file makeTempDir writes into every temp folder it makes, and\n * its exact content: `faf clear` removes only a folder that carries it. */\nexport const TEMP_MARKER = '.faf-temp';\nconst TEMP_MARKER_TEXT = 'faf made this temp folder; `faf clear` removes it.\\n';\n\n/** Make a new temp folder for faf's own use — `<os temp>/<prefix>XXXXXX`, a\n * fresh name no one else can have made (mkdtemp) — write faf's marker file\n * into it ({@link TEMP_MARKER}), and return its real path. Anything faf puts\n * there (a clone, say) goes in a subfolder, beside the marker. */\nexport function makeTempDir(prefix: string): string {\n const dir = realpath(mkdtempSync(join(tmpdir(), prefix)));\n TEMP_DIRS.add(dir);\n const fd = openSync(join(dir, TEMP_MARKER), 'wx', 0o644);\n try {\n writeFileSync(fd, TEMP_MARKER_TEXT);\n } finally {\n closeSync(fd);\n }\n return dir;\n}\n\n/** Remove a temp folder {@link makeTempDir} made in this process, with what is\n * in it. Any other folder is refused (an Error; nothing removed). */\nexport function removeTempDir(dir: string): void {\n if (!TEMP_DIRS.has(dir)) {throw new Error(`${dir} is not a temp folder faf made — not removed`);}\n rmSync(dir, { recursive: true, force: true });\n TEMP_DIRS.delete(dir);\n}\n\n/** True when the folder `dir` carries makeTempDir's marker: a regular file\n * (never a link) holding exactly the marker text. */\nfunction hasTempMarker(dir: string): boolean {\n const marker = join(dir, TEMP_MARKER);\n try {\n if (!lstatSync(marker).isFile()) {return false;}\n return readFileSync(marker, 'utf-8') === TEMP_MARKER_TEXT;\n } catch {\n return false;\n }\n}\n\nconst escapeRe = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * Remove faf's own temp folders left behind by earlier runs (`faf clear`):\n * only folders faf made — entries of the OS temp folder named exactly as\n * mkdtemp names them (`prefix` plus six letters or digits), that are real\n * folders (a link is left alone), belong to this user and carry the marker\n * file {@link makeTempDir} writes into each one. A folder of yours that only\n * starts with the prefix (`faf-git-my-notes`) stays. Returns how many were\n * removed. A folder that cannot be read or removed is skipped.\n */\nexport function removeStaleTempDirs(prefix: string): number {\n const tmp = tmpdir();\n const uid = typeof process.getuid === 'function' ? process.getuid() : undefined;\n const shape = new RegExp(`^${escapeRe(prefix)}[A-Za-z0-9]{6}$`);\n let removed = 0;\n for (const entry of readdirSync(tmp)) {\n if (!shape.test(entry)) {continue;}\n const p = join(tmp, entry);\n try {\n const st = lstatSync(p);\n if (!st.isDirectory() || (uid !== undefined && st.uid !== uid) || !hasTempMarker(p)) {continue;}\n rmSync(p, { recursive: true, force: true });\n removed++;\n } catch {\n /* not ours to remove, or already gone */\n }\n }\n return removed;\n}\n",
|
|
85
|
+
"/**\n * Safe file access — the one primitive every faf writer, and every read of\n * project context, goes through. It is also the only module in faf that calls\n * a filesystem write, rename, delete, mkdir or chmod API (tests/write-guard\n * enforces that for all of src/).\n *\n * Rule 1 — stay inside the project. Before faf touches a path it resolves it on\n * disk (realpath: every link followed). If that leads outside the project\n * folder, faf refuses. A dangling link is refused — faf never creates a file at\n * the end of a link. Anything whose real path is inside a `.git` folder is\n * refused, always — with two narrow exceptions: faf's own git hook\n * (`allowGitHooks`: one file directly inside the repo's hooks folder), and\n * the repo's own git config file (`allowGitConfig`: the file `config`\n * directly in the folder git names for it), where `faf diff\n * --uninstall-driver` removes the section faf's install wrote.\n *\n * Rule 2 — a link leads to the same kind of file. faf follows a link only to a\n * file with the same name (CLAUDE.md → docs/CLAUDE.md), or from one AI context\n * file to another (CLAUDE.md → AGENTS.md; the set is FAF_CONTEXT_FILES). The\n * link itself survives: faf writes the file it points at. `CLAUDE.md →\n * README.md` or `project.html → package.json` is refused — faf would be\n * writing a file it was never asked to write. A read of project context\n * through a link must land on a .faf or .fafm file instead, so `project.faf →\n * .env` is refused even though .env is in the project — or, for a read of an\n * AI context file, on another AI context file (`faf recover` reads CLAUDE.md →\n * AGENTS.md), the rule the writers use.\n *\n * Rule 3 — never leave a half-written file. A write goes to a temp file in the\n * same folder, is flushed to disk (fsync), then renamed over the original in\n * one step, keeping the original's permissions. If any step fails the temp\n * file is removed and the original is exactly as it was: \"not written;\n * original kept\". A plain writeFileSync truncates first, so a full disk, a\n * quota or a killed process used to leave the user's file cut short. With\n * `expect` (the bytes the caller read), the file is read again just before the\n * rename and the write is refused if it changed in the meantime. Its mode is\n * checked too: a file made read-only, or given other permissions, while faf\n * was writing is not replaced.\n *\n * Rule 4 — text faf edits is UTF-8. readUtf8 decodes strictly: a UTF-16 file or\n * any bytes that are not UTF-8 are refused, never turned into U+FFFD and\n * written back.\n *\n * Rule 5 — a whole file faf renders replaces a file already there only when\n * faf can prove it wrote it: project.html, the cards, `faf server-card --out`,\n * a `faf taf --output` snapshot and a `faf decompile --output` file must be\n * byte for byte what faf last wrote (their render hash, render-hash.ts); a\n * `.fafb` must carry the FAFB header (see {@link safeReplaceOwned}). Anything\n * else is refused unless the caller passes `force` (the CLI's `--force`).\n *\n * Rule 6 — detection reads stay inside the project. The files faf reads to fill\n * slots and render context (README.md, package.json, pyproject.toml,\n * Cargo.toml, go.mod, …) go through {@link repoFile}: resolved on disk, every\n * link followed. A file whose real path, or the folder it sits in, leaves the\n * project folder, runs through `.git`, or is a dangling link is absent to\n * detection: it does not exist, and reading it gives nothing. A link that\n * stays inside the project is followed (README.md → docs/README.md).\n */\nimport {\n accessSync,\n closeSync,\n constants,\n existsSync,\n fchmodSync,\n fchownSync,\n fsyncSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readdirSync,\n readFileSync,\n readlinkSync,\n realpathSync,\n renameSync,\n rmSync,\n statSync,\n unlinkSync,\n writeFileSync,\n type Dirent,\n type Stats,\n} from 'fs';\nimport { randomBytes } from 'crypto';\nimport { tmpdir } from 'os';\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'path';\n\n/** Why a path was refused. */\nexport type SafePathReason =\n | 'outside'\n | 'dangling'\n | 'not-a-file'\n | 'not-faf'\n | 'other-file'\n | 'git'\n | 'not-utf8'\n | 'changed'\n | 'not-owned'\n | 'not-yaml'\n | 'unplaceable';\n\n/**\n * A path faf will not read or write, or a file faf will not change. Nothing\n * was written; the file on disk is exactly as it was.\n * - `outside`, `dangling`, `not-a-file`, `not-faf`, `other-file`, `git`: the\n * path is refused (see {@link resolveInside}).\n * - `not-utf8`: the file is not UTF-8 (see {@link readUtf8}).\n * - `changed`: the file changed on disk after faf read it — its bytes, or its\n * mode (see the `expect` option of {@link safeWriteFile}).\n * - `not-owned`: a whole file faf renders is already there and faf cannot\n * prove it wrote every byte of it — it has no faf mark, or it was edited\n * since faf wrote it, or it is from before faf recorded a render hash (see\n * {@link safeReplaceOwned} and render-hash.ts).\n * - `not-yaml`: a .faf faf reads or edits is not valid YAML: \"<file> is not\n * valid YAML (<reason>, line N) — faf left it unchanged\"; or it parses to\n * a scalar or a list, not a mapping; or faf's scoring kernel cannot read\n * it (`faf score`, `faf compile`, `faf refresh`).\n * - `unplaceable`: faf could not place its managed block where its next run\n * finds it again, so it wrote nothing (see inject.ts).\n *\n * `onWrite` is true when faf refused at the write itself — it may have read\n * the file before (a `.faf` read through a link, say) — and false when it\n * refused before reading or writing anything.\n */\nexport class SafePathError extends Error {\n readonly reason: SafePathReason;\n /** The path as the caller named it (absolute). */\n readonly path: string;\n /** True when the refusal came at the write (faf may have read the file first). */\n readonly onWrite: boolean;\n\n constructor(reason: SafePathReason, path: string, message: string, opts: { onWrite?: boolean; cause?: unknown } = {}) {\n super(message, opts.cause === undefined ? undefined : { cause: opts.cause });\n this.name = 'SafePathError';\n this.reason = reason;\n this.path = path;\n this.onWrite = opts.onWrite === true;\n }\n}\n\nexport interface ResolveInsideOptions {\n /** Resolving for a read of project context: a link must end at a `.faf` or\n * `.fafm` file — or, when the name is an AI context file (CLAUDE.md), at\n * another AI context file (CLAUDE.md → AGENTS.md), the rule the writers\n * use. A plain file is read under the name the caller gave. */\n read?: boolean;\n /**\n * Resolving faf's own git hook (`faf hooks`) — one of the two exceptions\n * to the `.git` rule. `dir` must be the repo's hooks folder as git names it\n * (`git rev-parse --git-path hooks`, a folder named `hooks`), and `name` a\n * hook file sitting directly in it (`pre-commit`). Only that file may be\n * inside `.git`; nothing below or beside it. Links are still checked: a\n * link must stay inside the hooks folder's real folder and end at a file of\n * the same name.\n */\n allowGitHooks?: boolean;\n /**\n * Resolving the repo's own git config file (`faf diff --uninstall-driver`)\n * — the other exception to the `.git` rule. `dir` must be the folder git\n * names for it (the folder of `git rev-parse --git-path config`), and `name`\n * the file `config` directly in it. Only that file may be inside `.git`;\n * nothing below or beside it. A link must stay inside that folder and end\n * at a file named `config`.\n */\n allowGitConfig?: boolean;\n}\n\nexport interface SafeWriteOptions {\n /** The project folder the write must stay inside. Default: the file's own folder. */\n root?: string;\n /**\n * The bytes the caller read from the file. Just before the rename the file\n * is read again; when it no longer equals `expect`, the temp file is removed\n * and a SafePathError (`changed`) is thrown: \"<file> changed on disk while\n * faf was writing — not written; original kept\". A string is compared as its\n * UTF-8 bytes. `null` means the caller found no file there: if one has\n * appeared, the write is refused the same way (a missing file stays\n * missing). Omit it to write without the byte check (the mode check below\n * still runs).\n */\n expect?: string | Uint8Array | null;\n /** Write faf's own git hook: see {@link ResolveInsideOptions.allowGitHooks}. `root` is the hooks folder. */\n allowGitHooks?: boolean;\n /** Write the repo's own git config file: see {@link ResolveInsideOptions.allowGitConfig}. `root` is its folder. */\n allowGitConfig?: boolean;\n /** Permission bits for the written file. Default: the original's (a new\n * file gets the default create mode). */\n mode?: number;\n}\n\n/**\n * The files faf's block injector writes — one managed block, every other byte\n * of the file kept. Each injector writer (writeClaudeMd, writeAgentsMd,\n * writeGeminiMd, writeCursorrules, writeCopilotInstructions, writeMemoryMd,\n * writeLlmsTxt, writeClaudeMemory) takes its file name from this table, so\n * the set is exactly the files those writers target. A link from one of these\n * names to another (CLAUDE.md → AGENTS.md) may be followed.\n */\nexport const FAF_CONTEXT_FILES = Object.freeze({\n claude: 'CLAUDE.md',\n agents: 'AGENTS.md',\n gemini: 'GEMINI.md',\n cursorrules: '.cursorrules',\n copilot: 'copilot-instructions.md',\n memory: 'MEMORY.md',\n llms: 'llms.txt',\n} as const);\n\nconst CONTEXT_NAMES = new Set<string>(Object.values(FAF_CONTEXT_FILES).map(n => n.toLowerCase()));\n/** File names compare without case: a case-insensitive disk (macOS, Windows)\n * spells one name several ways. */\nconst sameName = (a: string, b: string): boolean => a.toLowerCase() === b.toLowerCase();\nconst isContextFile = (name: string): boolean => CONTEXT_NAMES.has(name.toLowerCase());\n\n/** True when a path runs through a `.git` folder, or is `.git` itself. */\nfunction inGitDir(p: string): boolean {\n return p.split(/[\\\\/]/).some(part => part.toLowerCase() === '.git');\n}\n\nconst FAF_FILE = /\\.fafm?$/i;\n/** A git hook's file name (`pre-commit`, `commit-msg`, …). */\nconst HOOK_NAME = /^[a-z][a-z0-9-]*$/;\nconst realpath = (p: string): string => realpathSync.native(p);\nconst errnoOf = (e: unknown): string | undefined => (e as NodeJS.ErrnoException | null)?.code;\n\n/** True when `p` is `root` or below it. Both must already be real paths. */\nfunction isInside(root: string, p: string): boolean {\n const rel = relative(root, p);\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));\n}\n\n/** Where a link points, as written in the link — for error messages only. */\nfunction linkText(p: string): string {\n try {\n return readlinkSync(p);\n } catch {\n return '?';\n }\n}\n\n/** What a resolve is for: a read of project context, and/or one of the two\n * files faf may reach inside `.git` (its git hook, the repo's git config) —\n * `inGit`: a file directly in `root` may be inside `.git`. */\ninterface ResolveMode {\n read: boolean;\n inGit: boolean;\n}\n\n/** Resolve the final component when it is a link: it must exist, stay inside\n * `root` and out of `.git` (a hook may sit directly in the hooks folder, the\n * git config directly in its folder),\n * be a regular file and — for a read of project context — be a .faf/.fafm\n * file; otherwise have the link's own name, or be an AI context file reached\n * from one. */\nfunction followLink(root: string, requested: string, link: string, mode: ResolveMode): string {\n let real: string;\n try {\n real = realpath(link);\n } catch (e) {\n const code = errnoOf(e);\n if (code === 'ENOENT' || code === 'ELOOP' || code === 'ENOTDIR') {\n throw new SafePathError(\n 'dangling',\n requested,\n `${requested} is a link to ${linkText(link)}, which does not exist. faf does not create files through a link — refused.`,\n );\n }\n throw e;\n }\n if (!isInside(root, real)) {\n throw new SafePathError('outside', requested, `${requested} is a link to ${real}, outside ${root} — refused.`);\n }\n if (inGitDir(real) && !(mode.inGit && dirname(real) === root)) {\n throw new SafePathError('git', requested, `${requested} is a link to ${real}, inside .git/ — refused.`);\n }\n if (!statSync(real).isFile()) {\n throw new SafePathError('not-a-file', requested, `${requested} is a link to ${real}, which is not a regular file — refused.`);\n }\n refuseOtherKind(requested, real, mode.read);\n return real;\n}\n\n/** The file at the end of a link must be the kind the caller asked for: for a\n * read of project context a .faf/.fafm file (or, for an AI context file,\n * another AI context file); otherwise a file with the link's own name, or an\n * AI context file when the link is one too. */\nfunction refuseOtherKind(requested: string, real: string, read: boolean): void {\n const asked = basename(requested);\n const got = basename(real);\n const contextToContext = isContextFile(asked) && isContextFile(got);\n if (read && !FAF_FILE.test(got) && !contextToContext) {\n const kind = isContextFile(asked) ? 'a .faf or .fafm file, nor another AI context file' : 'a .faf or .fafm file';\n throw new SafePathError('not-faf', requested, `${requested} is a link to ${real}, which is not ${kind} — refused.`);\n }\n if (!read && !sameName(asked, got) && !contextToContext) {\n throw new SafePathError(\n 'other-file',\n requested,\n `${requested} is a link to ${real}, a file with another name — refused (faf follows a link only to a file of the same name, or from one AI context file to another).`,\n );\n }\n}\n\n/** With allowGitHooks: `dir` must be a hooks folder and `requested` a hook\n * file directly in it — the whole of the exception. */\nfunction checkHookTarget(dir: string, requested: string, root: string, folder: string): void {\n if (basename(resolve(dir)) !== 'hooks' || !HOOK_NAME.test(basename(requested))) {\n throw new SafePathError('git', requested, `${requested} is not a git hook in a hooks folder — refused.`);\n }\n if (folder !== root) {\n throw new SafePathError('git', requested, `${requested} is not directly in the hooks folder ${root} — refused.`);\n }\n}\n\n/** With allowGitConfig: `requested` must be the file `config` directly in the\n * folder git names for it — the whole of the exception. */\nfunction checkConfigTarget(requested: string, root: string, folder: string): void {\n if (basename(requested) !== 'config' || folder !== root) {\n throw new SafePathError('git', requested, `${requested} is not the git config file directly in ${root} — refused.`);\n }\n}\n\n/**\n * Resolve `name` inside the project folder `dir` and return the real path to\n * read or write — or throw a SafePathError.\n *\n * - the folder the file sits in must resolve to `dir` or below it\n * - a path whose real form runs through `.git` → refused, always (the two\n * exceptions: `allowGitHooks`, a hook file directly in the hooks folder,\n * and `allowGitConfig`, the file `config` directly in its git folder)\n * - a file that does not exist yet → its path inside the project\n * - a regular file → its path (spelled as on disk)\n * - a link → the file it points at, when that exists, is a regular file, is\n * inside the project and out of `.git`, and has the link's own name (or\n * both names are AI context files: CLAUDE.md → AGENTS.md). With `read`, the\n * file must be a .faf/.fafm file instead (`project.faf → config/team.faf`),\n * or — for an AI context file — another AI context file.\n * - anything else (a link out, a dangling link, a link to a file with\n * another name, a folder, a device) → refused\n *\n * `name` may be relative to `dir` or absolute. `dir` and the folder `name` sits\n * in must exist (their ENOENT is thrown as is).\n */\nexport function resolveInside(dir: string, name: string, opts: ResolveInsideOptions = {}): string {\n const root = realpath(resolve(dir));\n const requested = resolve(dir, name);\n const folder = realpath(dirname(requested));\n if (!isInside(root, folder)) {\n throw new SafePathError('outside', requested, `${requested} is in ${folder}, outside ${root} — refused.`);\n }\n const hooks = opts.allowGitHooks === true;\n const gitConfig = opts.allowGitConfig === true;\n if (hooks) {checkHookTarget(dir, requested, root, folder);}\n if (gitConfig) {checkConfigTarget(requested, root, folder);}\n const target = join(folder, basename(requested));\n if (inGitDir(target) && !hooks && !gitConfig) {\n throw new SafePathError(\n 'git',\n requested,\n target === requested ? `${requested} is inside .git/ — refused.` : `${requested} resolves to ${target}, inside .git/ — refused.`,\n );\n }\n let st;\n try {\n st = lstatSync(target);\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return target;}\n throw e;\n }\n if (st.isSymbolicLink()) {return followLink(root, requested, target, { read: opts.read === true, inGit: hooks || gitConfig });}\n if (!st.isFile()) {\n throw new SafePathError('not-a-file', requested, `${requested} is not a regular file — refused.`);\n }\n // The name as it is on disk (a case-insensitive disk may spell it differently).\n return realpath(target);\n}\n\nconst UTF8 = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });\n\n/** `bytes` as text, strictly: see {@link readUtf8}. `path` names the file in the refusal. */\nfunction decodeUtf8(bytes: Uint8Array, path: string): string {\n const utf16Bom = bytes.length >= 2 && ((bytes[0] === 0xff && bytes[1] === 0xfe) || (bytes[0] === 0xfe && bytes[1] === 0xff));\n if (!utf16Bom) {\n try {\n return UTF8.decode(bytes);\n } catch {\n /* not UTF-8: refused below */\n }\n }\n throw new SafePathError('not-utf8', path, `${path} is not UTF-8 — faf left it unchanged`);\n}\n\n/**\n * Read a text file faf may write back — strictly as UTF-8. A UTF-8 BOM is kept\n * (U+FEFF at the start of the text, as a plain read gives it). A UTF-16 BOM\n * (FF FE or FE FF) or any byte sequence that is not UTF-8 is refused with a\n * SafePathError (`not-utf8`): \"<file> is not UTF-8 — faf left it unchanged\". A\n * lenient read would turn those bytes into U+FFFD, and the next write would\n * lose them. Other read errors (ENOENT, EACCES, …) are thrown as they are.\n * `path` is read as given: resolve it with {@link resolveInside} first.\n */\nexport function readUtf8(path: string): string {\n return decodeUtf8(readFileSync(path), path);\n}\n\n/** The bytes at `path`, or null when nothing is there (only ENOENT). */\nexport function readBytesIfPresent(path: string): Buffer | null {\n try {\n return readFileSync(path);\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return null;}\n throw e;\n }\n}\n\n/**\n * Where detection may read `rel` in the project folder `dir` — its real path —\n * or null when detection treats it as absent (Rule 6). `rel` names a file or a\n * folder, relative to `dir` (as `join(dir, rel)`). Every link on the way is\n * followed, the folders included; the result is null when:\n * - nothing is there, or a link on the way dangles or loops\n * - the real path leaves `dir` (README.md → ~/.aws/credentials, or a folder\n * on the way that is a link out)\n * - the real path runs through `.git` (README.md → .git/config)\n * A link that stays inside `dir` is followed. `dir` is the folder detection\n * was handed: the project, or a folder below it that detection reads on its\n * own (a subfolder's manifest), so a link may not leave that folder either.\n */\nexport function repoFile(dir: string, rel: string): string | null {\n const full = resolve(join(dir, rel));\n if (!existsSync(full)) {return null;} // not there, or a dangling link\n let root: string;\n let real: string;\n try {\n root = realpath(detectionBoundary(dir));\n real = realpath(full);\n } catch {\n return null; // a loop, or gone meanwhile\n }\n if (!isInside(root, real) || inGitDir(relative(root, real))) {return null;}\n return real;\n}\n\n/** The project folders detection is running in, outermost first (see\n * {@link withRepoRoot}). */\nconst detectionRoots: string[] = [];\n\n/** The folder a read in `dir` may not leave: the outermost project folder\n * detection is running in that holds `dir`, or `dir` itself. */\nfunction detectionBoundary(dir: string): string {\n const base = resolve(dir);\n return detectionRoots.find(r => base === r || base.startsWith(r.endsWith(sep) ? r : r + sep)) ?? base;\n}\n\n/**\n * Run `scan` with `root` as the project folder for every detection read under\n * it: a read in a subfolder (web/package.json) may then follow a link to\n * anywhere inside `root` (../shared/web-package.json), not only inside that\n * subfolder. A link out of `root` is still absent. Subfolder scans use this.\n */\nexport function withRepoRoot<T>(root: string, scan: () => T): T {\n detectionRoots.push(resolve(root));\n try {\n return scan();\n } finally {\n detectionRoots.pop();\n }\n}\n\n/** True when `rel` (a file or a folder) is in the project folder `dir` for\n * detection: see {@link repoFile}. */\nexport function repoExists(dir: string, rel: string): boolean {\n return repoFile(dir, rel) !== null;\n}\n\n/** The text of the file `rel` in the project folder `dir` (UTF-8, read the way\n * detection reads it), or null when detection treats it as absent (see\n * {@link repoFile}), it is not a regular file, or it cannot be read. */\nexport function readRepoFile(dir: string, rel: string): string | null {\n const real = repoFile(dir, rel);\n if (real === null) {return null;}\n try {\n return statSync(real).isFile() ? readFileSync(real, 'utf-8') : null;\n } catch {\n return null;\n }\n}\n\n/** What `rel` is (its real path's stats) in the project folder `dir`, or null\n * when detection treats it as absent (see {@link repoFile}). */\nexport function statRepoFile(dir: string, rel: string): Stats | null {\n const real = repoFile(dir, rel);\n if (real === null) {return null;}\n try {\n return statSync(real);\n } catch {\n return null;\n }\n}\n\n/**\n * The entries of the folder `rel` (default: `dir` itself) in the project\n * folder `dir`, or null when detection treats the folder as absent (see\n * {@link repoFile}) or it cannot be read. A link among them that leaves `dir`,\n * dangles, or leads into `.git` is left out: detection does not see it. Each\n * entry says what it is itself (a link is a link, as readdirSync gives it).\n */\nexport function readRepoDir(dir: string, rel = '.'): Dirent[] | null {\n const real = repoFile(dir, rel);\n if (real === null) {return null;}\n let entries: Dirent[];\n try {\n entries = readdirSync(real, { withFileTypes: true });\n } catch {\n return null;\n }\n return entries.filter(e => !e.isSymbolicLink() || repoFile(dir, join(rel, e.name)) !== null);\n}\n\n/** What to keep from the file already at `target` — its permission bits and\n * owner — or undefined when there is none yet. */\ninterface Kept {\n /** Permission bits given to the new file (rwx for owner, group, other). */\n mode: number;\n /** Every mode bit as it was (setuid, setgid and sticky included), to notice a change. */\n perm: number;\n uid: number;\n gid: number;\n}\n\nfunction existingFile(target: string): Kept | undefined {\n try {\n const st = statSync(target);\n return { mode: st.mode & 0o777, perm: st.mode & 0o7777, uid: st.uid, gid: st.gid };\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return undefined;}\n throw e;\n }\n}\n\n/**\n * A write that failed partway — a full disk, a quota, a read-only file, a\n * killed rename — with the file on disk exactly as it was: \"<file>: not\n * written; original kept (<why>)\" (\"not written\" alone when there was no file).\n * `cause` is the error underneath. The CLI prints it as one line.\n */\nexport class NotWrittenError extends Error {\n /** The file that was not written. */\n readonly path: string;\n\n constructor(path: string, message: string, opts: { cause?: unknown } = {}) {\n super(message, { cause: opts.cause });\n this.path = path;\n }\n}\n\nconst changedOnDisk = (target: string): SafePathError =>\n new SafePathError('changed', target, `${target} changed on disk while faf was writing — not written; original kept`, { onWrite: true });\n\n/** Refuse the rename when the file is no longer what the caller read (its\n * bytes, with `expect`), or when its mode changed or it stopped being\n * writable since faf looked at it (`kept`): a file the user made read-only,\n * or gave other permissions, while faf was writing is left as it is. */\nfunction assertUnchanged(target: string, expect: SafeWriteOptions['expect'], kept: Kept | undefined): void {\n if (expect !== undefined) {\n const now = readBytesIfPresent(target);\n const want = expect === null ? null : typeof expect === 'string' ? Buffer.from(expect, 'utf-8') : Buffer.from(expect);\n const same = now === null || want === null ? now === want : now.equals(want);\n if (!same) {throw changedOnDisk(target);}\n }\n if (!kept) {return;}\n let st;\n try {\n st = statSync(target);\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return;} // gone: the byte check above decides\n throw e;\n }\n if ((st.mode & 0o7777) !== kept.perm) {throw changedOnDisk(target);}\n try {\n accessSync(target, constants.W_OK);\n } catch {\n throw changedOnDisk(target);\n }\n}\n\n/** Give the temp file the original's owner (best effort: only root, or a\n * group member for the group, may) and exactly its permission bits. */\nfunction keepOwnerAndMode(fd: number, kept: Kept): void {\n if (process.platform !== 'win32') {\n try { fchownSync(fd, kept.uid, kept.gid); } catch { /* not ours to give */ }\n }\n fchmodSync(fd, kept.mode); // the umask narrowed the create mode\n}\n\n/** Flush the folder entry after the rename. Best effort: the data is already\n * safe, and some platforms (Windows) cannot open a folder. */\nfunction syncFolder(folder: string): void {\n if (process.platform === 'win32') {return;}\n try {\n const fd = openSync(folder, 'r');\n try {\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n } catch {\n /* best effort */\n }\n}\n\n/** The temp file a write goes through; `fd` is set while it is open. */\ninterface TempFile {\n path: string;\n fd?: number;\n created: boolean;\n}\n\n/** Create the temp file (never opening anything already at its name — 'wx' is\n * O_CREAT | O_EXCL, a link included), write it in full, keep the original's\n * owner and mode (or give it `mode`), flush it to disk and close it. */\nfunction fillTemp(temp: TempFile, content: string | Uint8Array, kept: Kept | undefined, mode: number | undefined): void {\n temp.fd = openSync(temp.path, 'wx', mode ?? kept?.mode ?? 0o666);\n temp.created = true;\n writeFileSync(temp.fd, content);\n if (kept) {keepOwnerAndMode(temp.fd, kept);}\n if (mode !== undefined) {fchmodSync(temp.fd, mode);}\n fsyncSync(temp.fd);\n closeSync(temp.fd);\n temp.fd = undefined;\n}\n\n/** Close and remove a temp file after a failure. Never touches a file this\n * write did not create. */\nfunction discardTemp(temp: TempFile): void {\n if (temp.fd !== undefined) {\n try { closeSync(temp.fd); } catch { /* already failing */ }\n }\n if (temp.created) {\n try { unlinkSync(temp.path); } catch { /* already failing */ }\n }\n}\n\n/** Write `content` to `target` atomically: temp file in the same folder,\n * fsync, then — when the file is still what the caller read (`expect`), with\n * the same mode, and still writable — rename over. `target` must already be\n * resolved. */\nfunction replaceAtomically(target: string, content: string | Uint8Array, opts: SafeWriteOptions): void {\n const folder = dirname(target);\n const temp: TempFile = {\n path: join(folder, `.${basename(target).slice(0, 100)}.${process.pid}.${randomBytes(6).toString('hex')}.faf-tmp`),\n created: false,\n };\n const kept = existingFile(target);\n try {\n // A file faf may not write in place (read-only) is not replaced either.\n if (kept) {accessSync(target, constants.W_OK);}\n fillTemp(temp, content, kept, opts.mode);\n assertUnchanged(target, opts.expect, kept);\n renameSync(temp.path, target);\n } catch (e) {\n discardTemp(temp);\n if (e instanceof SafePathError) {throw e;}\n const why = errnoOf(e) ?? (e instanceof Error ? e.message : String(e));\n throw new NotWrittenError(target, `${target}: not written${kept ? '; original kept' : ''} (${why})`, { cause: e });\n }\n syncFolder(folder);\n}\n\n/** A refusal raised while writing: the same SafePathError, marked `onWrite`. */\nfunction atWrite(e: unknown): unknown {\n return e instanceof SafePathError && !e.onWrite ? new SafePathError(e.reason, e.path, e.message, { onWrite: true }) : e;\n}\n\n/**\n * Write a file inside a project, safely: resolved with {@link resolveInside}\n * (a link that leaves the project, dangles, or leads to a file with another\n * name, and anything in `.git`, is refused), then replaced atomically (temp\n * file in the same folder, fsync, rename; the original's permissions — and,\n * where the OS allows, its owner — kept). On any failure the original is\n * untouched and the Error says \"not written; original kept\". With `expect`,\n * a file that changed after the caller read it is not replaced either\n * (SafePathError `changed`); nor is one whose mode changed, or that became\n * read-only, while faf was writing. Returns the real path written — the\n * link's target when `path` is an in-project link.\n */\nexport function safeWriteFile(path: string, content: string | Uint8Array, opts: SafeWriteOptions = {}): string {\n const full = resolve(path);\n let target: string;\n try {\n target = resolveInside(opts.root ?? dirname(full), full, { allowGitHooks: opts.allowGitHooks, allowGitConfig: opts.allowGitConfig });\n } catch (e) {\n throw atWrite(e);\n }\n replaceAtomically(target, content, opts);\n return target;\n}\n\n/** Options for {@link safeReplaceOwned}. */\nexport interface ReplaceOwnedOptions {\n /** The project folder the write must stay inside. Default: the file's own folder. */\n root?: string;\n /** True when the bytes already at the path carry faf's own mark (faf wrote them). */\n owns: (existing: Buffer) => boolean;\n /** faf's mark in words, for the refusal: \"the `_meta[\\\"one.faf/context\\\"]` block\". */\n mark: string;\n /** Replace a file without the mark anyway — the explicit overwrite (`--force`). */\n force?: boolean;\n /** The bytes the caller read there earlier (`null`: no file then). When\n * given, the file must still hold them, else SafePathError `changed`. */\n expect?: string | Uint8Array | null;\n}\n\n/**\n * Write a whole file faf renders (project.html, a Server Card, an A2A card, a\n * `.fafb`), replacing a file already at `path` only when faf can prove it wrote\n * it: its bytes carry faf's own mark (`owns`). A file without the mark is\n * refused — SafePathError `not-owned`: \"<file> has no <mark>, so faf did not\n * write it — faf left it unchanged.\" — and stays byte for byte, unless `force`\n * asks to replace it. The link rules and the atomic write are\n * {@link safeWriteFile}'s, and the write is refused if the file changed on\n * disk after faf read it. Returns the real path written.\n */\nexport function safeReplaceOwned(path: string, content: string | Uint8Array, opts: ReplaceOwnedOptions): string {\n const full = resolve(path);\n const root = opts.root ?? dirname(full);\n const target = resolveInside(root, full);\n const existing = readBytesIfPresent(target);\n if (opts.expect !== undefined) {assertUnchanged(target, opts.expect, undefined);}\n if (existing !== null && opts.force !== true && !opts.owns(existing)) {\n throw new SafePathError('not-owned', full, `${full} has no ${opts.mark}, so faf did not write it — faf left it unchanged.`, { onWrite: true });\n }\n return safeWriteFile(target, content, { root, expect: existing });\n}\n\n/**\n * Create the folder `dir` inside the project folder `root`, with any missing\n * folders between them, and return its real path. `root` itself is the\n * caller's own folder: it is created as named when missing. Below it, faf\n * never creates a folder through a link: an existing folder on the way that\n * is a link leading out of `root` (or a dangling link) is refused, as is any\n * part inside `.git` and anything on the way that is not a folder — so\n * `.github → ~/elsewhere` cannot make faf create `~/elsewhere/workflows`.\n */\nexport function makeDirInside(root: string, dir: string = root): string {\n const top = resolve(root);\n mkdirSync(top, { recursive: true });\n const realRoot = realpath(top);\n const want = resolve(top, dir);\n const rel = relative(top, want);\n if (rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new SafePathError('outside', want, `${want} is outside ${realRoot} — refused.`, { onWrite: true });\n }\n let cur = realRoot;\n for (const part of rel.split(/[\\\\/]/).filter(Boolean)) {\n const next = join(cur, part);\n if (inGitDir(next)) {\n throw new SafePathError('git', want, `${want} runs through ${next}, inside .git/ — refused.`, { onWrite: true });\n }\n cur = stepInto(realRoot, want, next);\n }\n return cur;\n}\n\n/** One folder on the way down in makeDirInside: made when missing, followed\n * when it is a link that stays inside `root`, refused otherwise. */\nfunction stepInto(root: string, want: string, next: string): string {\n let st;\n try {\n st = lstatSync(next);\n } catch (e) {\n if (errnoOf(e) !== 'ENOENT') {throw e;}\n mkdirSync(next);\n return next;\n }\n let real = next;\n if (st.isSymbolicLink()) {\n try {\n real = realpath(next);\n } catch {\n throw new SafePathError('dangling', want, `${next} is a link to ${linkText(next)}, which does not exist. faf does not create folders through a link — refused.`, { onWrite: true });\n }\n if (!isInside(root, real)) {\n throw new SafePathError('outside', want, `${next} is a link to ${real}, outside ${root} — refused.`, { onWrite: true });\n }\n if (inGitDir(real)) {\n throw new SafePathError('git', want, `${next} is a link to ${real}, inside .git/ — refused.`, { onWrite: true });\n }\n }\n if (!statSync(real).isDirectory()) {\n throw new SafePathError('not-a-file', want, `${next} is not a folder — refused.`, { onWrite: true });\n }\n return real;\n}\n\n/**\n * Remove a file faf wrote — only when it still holds exactly `expect` (the\n * bytes faf wrote or read there) and is a regular file inside `root` (default:\n * its own folder), out of `.git`. A link is never removed (faf did not make\n * it), and a file whose bytes changed is left as it is (SafePathError\n * `changed`). Returns false when nothing was there.\n */\nexport function safeUnlink(path: string, opts: { root?: string; expect: string | Uint8Array }): boolean {\n const full = resolve(path);\n const realRoot = realpath(resolve(opts.root ?? dirname(full)));\n const folder = realpath(dirname(full));\n if (!isInside(realRoot, folder)) {\n throw new SafePathError('outside', full, `${full} is in ${folder}, outside ${realRoot} — refused.`, { onWrite: true });\n }\n const target = join(folder, basename(full));\n if (inGitDir(target)) {\n throw new SafePathError('git', full, `${full} is inside .git/ — refused.`, { onWrite: true });\n }\n let st;\n try {\n st = lstatSync(target);\n } catch (e) {\n if (errnoOf(e) === 'ENOENT') {return false;}\n throw e;\n }\n if (!st.isFile()) {\n throw new SafePathError('not-a-file', full, `${full} is not a regular file faf wrote — left as it is.`, { onWrite: true });\n }\n assertUnchanged(target, opts.expect, undefined);\n unlinkSync(target);\n return true;\n}\n\n/** The temp folders makeTempDir made in this process — the only ones removeTempDir removes. */\nconst TEMP_DIRS = new Set<string>();\n\n/** The marker file makeTempDir writes into every temp folder it makes, and\n * its exact content: `faf clear` removes only a folder that carries it. */\nexport const TEMP_MARKER = '.faf-temp';\nconst TEMP_MARKER_TEXT = 'faf made this temp folder; `faf clear` removes it.\\n';\n\n/** Make a new temp folder for faf's own use — `<os temp>/<prefix>XXXXXX`, a\n * fresh name no one else can have made (mkdtemp) — write faf's marker file\n * into it ({@link TEMP_MARKER}), and return its real path. Anything faf puts\n * there (a clone, say) goes in a subfolder, beside the marker. */\nexport function makeTempDir(prefix: string): string {\n const dir = realpath(mkdtempSync(join(tmpdir(), prefix)));\n TEMP_DIRS.add(dir);\n const fd = openSync(join(dir, TEMP_MARKER), 'wx', 0o644);\n try {\n writeFileSync(fd, TEMP_MARKER_TEXT);\n } finally {\n closeSync(fd);\n }\n return dir;\n}\n\n/** Remove a temp folder {@link makeTempDir} made in this process, with what is\n * in it. Any other folder is refused (an Error; nothing removed). */\nexport function removeTempDir(dir: string): void {\n if (!TEMP_DIRS.has(dir)) {throw new Error(`${dir} is not a temp folder faf made — not removed`);}\n rmSync(dir, { recursive: true, force: true });\n TEMP_DIRS.delete(dir);\n}\n\n/** True when the folder `dir` carries makeTempDir's marker: a regular file\n * (never a link) holding exactly the marker text. */\nfunction hasTempMarker(dir: string): boolean {\n const marker = join(dir, TEMP_MARKER);\n try {\n if (!lstatSync(marker).isFile()) {return false;}\n return readFileSync(marker, 'utf-8') === TEMP_MARKER_TEXT;\n } catch {\n return false;\n }\n}\n\nconst escapeRe = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * Remove faf's own temp folders left behind by earlier runs (`faf clear`):\n * only folders faf made — entries of the OS temp folder named exactly as\n * mkdtemp names them (`prefix` plus six letters or digits), that are real\n * folders (a link is left alone), belong to this user and carry the marker\n * file {@link makeTempDir} writes into each one. A folder of yours that only\n * starts with the prefix (`faf-git-my-notes`) stays. Returns how many were\n * removed. A folder that cannot be read or removed is skipped.\n */\nexport function removeStaleTempDirs(prefix: string): number {\n const tmp = tmpdir();\n const uid = typeof process.getuid === 'function' ? process.getuid() : undefined;\n const shape = new RegExp(`^${escapeRe(prefix)}[A-Za-z0-9]{6}$`);\n let removed = 0;\n for (const entry of readdirSync(tmp)) {\n if (!shape.test(entry)) {continue;}\n const p = join(tmp, entry);\n try {\n const st = lstatSync(p);\n if (!st.isDirectory() || (uid !== undefined && st.uid !== uid) || !hasTempMarker(p)) {continue;}\n rmSync(p, { recursive: true, force: true });\n removed++;\n } catch {\n /* not ours to remove, or already gone */\n }\n }\n return removed;\n}\n",
|
|
86
86
|
"/**\n * Shape guards — never spread a scalar.\n *\n * `{ ...'old-init' }` is `{ 0: 'o', 1: 'l', … }` and `{ ...[a, b] }` is\n * `{ 0: a, 1: b }`: spreading a value that is not a mapping silently turns the\n * user's text into index keys, and the next write saves them. Every place that\n * spreads or descends into a parsed .faf / .fafm value checks its shape first\n * and refuses with an Error that names what it found.\n */\nimport { SafePathError } from './safe-write.js';\n\n/** True for a YAML mapping: a plain object, not a list. */\nexport function isMapping(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Plain words for a value's YAML shape, for error messages: `a string (\"old-init\")`, `a list (2 items)`. */\nexport function describeShape(value: unknown): string {\n if (Array.isArray(value)) {return `a list (${value.length} item${value.length === 1 ? '' : 's'})`;}\n if (value === null || value === undefined) {return 'empty';}\n if (typeof value === 'string') {\n const shown = value.length > 40 ? `${value.slice(0, 40)}…` : value;\n return `a string (${JSON.stringify(shown)})`;\n }\n if (typeof value === 'object') {return 'a mapping';}\n return `a ${typeof value} (${String(value)})`;\n}\n\n/**\n * A parsed .faf document as a mapping. An empty document reads as `{}`; a\n * scalar or a list throws a SafePathError (`not-yaml`), so the CLI prints it\n * as one line — faf never rewrites a file whose shape it does not\n * understand. `source` names the file (or caller) in the error.\n */\nexport function asFafMapping(value: unknown, source: string): Record<string, unknown> {\n if (value === null || value === undefined) {return {};}\n if (!isMapping(value)) {\n throw new SafePathError(\n 'not-yaml',\n source,\n `${source}: a .faf must be a YAML mapping (key: value pairs), but this one is ${describeShape(value)}. ` +\n 'faf left it unchanged — fix it by hand.',\n );\n }\n return value;\n}\n",
|
|
87
87
|
"/**\n * Document-preserving YAML edits — how faf changes a .faf or .fafm that is\n * already on disk.\n *\n * The file is parsed with yaml's `parseDocument`, the change is made on the\n * Document through its node APIs (`set` / `setIn` / `delete`), and only the\n * text of the nodes that changed is rewritten. Every other byte stays as it\n * was: comments, blank lines, key order, quoting, scalar source text (`1.10`,\n * `0x1F90`, a 20-digit integer), anchors and aliases, unknown keys, CRLF line\n * ends and a BOM.\n *\n * Safety net: the spliced text is parsed again and must hold the same data as\n * the changed Document and serialise the same way (comments, styles, anchors;\n * blank lines aside). If it does not (a shape the splicer does not handle),\n * faf writes the Document's own serialisation instead — `toString({\n * lineWidth: 0 })`, which still keeps comments, anchors, unknown keys and the\n * source text of every number it did not change. A change that leaves the\n * data as it was returns the original text untouched — even when that\n * serialisation would differ — so callers skip the write.\n */\n\nimport {\n Document,\n YAMLMap,\n type Alias,\n YAMLSeq,\n isAlias,\n isCollection,\n isMap,\n isNode,\n isScalar,\n isSeq,\n parseDocument,\n type DocumentOptions,\n type Node,\n type Pair,\n type ParseOptions,\n type Scalar,\n type ScalarTag,\n type SchemaOptions,\n type Tags,\n type ToStringOptions,\n} from 'yaml';\nimport { isMapping } from './shape.js';\n\ntype YamlOptions = ParseOptions & DocumentOptions & SchemaOptions;\n\n/** The result of {@link editYaml}. */\nexport interface YamlEditResult {\n /** The new text — the original text when nothing changed. */\n text: string;\n /** False when the change left the document as it was. */\n changed: boolean;\n}\n\n// ─── Scalar source text ──────────────────────────────────────────────────────\n\nconst NUMBER_TAGS = new Set(['tag:yaml.org,2002:int', 'tag:yaml.org,2002:float']);\n\nfunction isScalarTag(tag: Tags[number]): tag is ScalarTag {\n return typeof tag === 'object' && tag.collection === undefined;\n}\n\n/** The number as it was written (`0x1F90`, `12345678901234567890`, `1e3`),\n * when the node still holds the value that text parses to. */\nfunction writtenNumber(node: Scalar, tags: readonly ScalarTag[]): string | undefined {\n const src = node.source;\n if (typeof src !== 'string' || src.includes('\\n') || typeof node.value !== 'number') {return undefined;}\n const tag = tags.find(t => t.default === true && t.test?.test(src));\n if (!tag || !NUMBER_TAGS.has(tag.tag)) {return undefined;}\n let parsed: unknown;\n try {\n parsed = tag.resolve(src, () => undefined, {});\n } catch {\n return undefined;\n }\n return Object.is(isScalar(parsed) ? parsed.value : parsed, node.value) ? src : undefined;\n}\n\n/** The core schema with number tags that re-emit an unchanged number's own\n * text (yaml would print `0x1F90` as `0x1f90` and round a 20-digit integer). */\nfunction keepNumberText(tags: Tags): Tags {\n const scalars = tags.filter(isScalarTag);\n return tags.map(tag => {\n if (!isScalarTag(tag) || !NUMBER_TAGS.has(tag.tag) || !tag.stringify) {return tag;}\n const inner = tag.stringify;\n return {\n ...tag,\n stringify: (item, ctx, onComment, onChompKeep) =>\n writtenNumber(item, scalars) ?? inner(item, ctx, onComment, onChompKeep),\n };\n });\n}\n\n/** Parse options for every document faf edits. */\nexport const EDIT_OPTIONS: YamlOptions = { keepSourceTokens: true, customTags: keepNumberText };\n\n/** What one `key:` line and the line under it say about the file's\n * indentation: a key step, or whether lists under keys are indented. */\nfunction indentHint(line: string, next: string): { indent?: number; indentSeq?: boolean } {\n const parent = /^( *)[^\\s#-][^#]*?:[ \\t]*(?:#.*)?$/.exec(line);\n const child = /^( *)(\\S)/.exec(next);\n if (!parent || !child || child[2] === '#') {return {};}\n const step = child[1].length - parent[1].length;\n if (child[2] === '-') {return step >= 0 ? { indentSeq: step > 0 } : {};}\n return step >= 1 && step <= 8 ? { indent: step } : {};\n}\n\n/** How the file indents: the step under a `key:` line (default 2), and whether\n * a list under a key is indented (`key:\\n - a`, the default) or not. */\nfunction styleOf(src: string): { indent: number; indentSeq: boolean } {\n const lines = src.split(/\\r?\\n/);\n let indent: number | undefined;\n let indentSeq: boolean | undefined;\n for (let i = 0; i + 1 < lines.length; i++) {\n const hint = indentHint(lines[i], lines[i + 1]);\n indent ??= hint.indent;\n indentSeq ??= hint.indentSeq;\n }\n return { indent: indent ?? 2, indentSeq: indentSeq ?? true };\n}\n\n/** Parse `src` for editing; a file that is not valid YAML is refused (an\n * Error whose `cause` is yaml's YAMLParseError, with its line). */\nexport function parseForEdit(src: string, name: string): Document {\n const doc = parseDocument(src, EDIT_OPTIONS);\n if (doc.errors.length > 0) {\n const why = doc.errors[0].message.split('\\n')[0];\n throw new Error(`${name}: not valid YAML (${why}) — faf left it unchanged.`, { cause: doc.errors[0] });\n }\n return doc;\n}\n\n// ─── Splicing ────────────────────────────────────────────────────────────────\n\ninterface Edit {\n start: number;\n end: number;\n text: string;\n seq: number;\n}\n\ninterface Ctx {\n src: string;\n eol: string;\n edits: Edit[];\n piece: ToStringOptions;\n}\n\ntype Slot =\n | { kind: 'value'; key: unknown; col: number }\n | { kind: 'item'; col: number }\n | { kind: 'root' };\n\nfunction push(ctx: Ctx, start: number, end: number, text: string): void {\n ctx.edits.push({ start, end, text, seq: ctx.edits.length });\n}\n\nfunction lineStart(src: string, pos: number): number {\n return src.lastIndexOf('\\n', pos - 1) + 1;\n}\n\n/** The end of the line `pos` is on, after its line break (or the end of text).\n * `pos` already at the start of a line is returned as is. */\nfunction lineEnd(src: string, pos: number): number {\n if (pos > 0 && src[pos - 1] === '\\n') {return pos;}\n const nl = src.indexOf('\\n', pos);\n return nl < 0 ? src.length : nl + 1;\n}\n\n/** `pos` without the line break that ends just before it. */\nfunction beforeBreak(src: string, pos: number): number {\n let q = pos;\n if (src[q - 1] === '\\n') {\n q--;\n if (src[q - 1] === '\\r') {q--;}\n }\n return q;\n}\n\n/** Neither null nor undefined. */\nfunction present<T>(v: T | null | undefined): v is T {\n return v !== null && v !== undefined;\n}\n\nfunction rangeOf(node: unknown): [number, number, number] | undefined {\n const r = isNode(node) ? (node as Node).range : undefined;\n return r ? [r[0], r[1], r[2]] : undefined;\n}\n\n/** A node `b` in the changed Document is the node `a` of the original when it\n * is a clone of it: same class, same source range. New nodes have no range. */\nfunction sameOrigin(a: unknown, b: unknown): boolean {\n const ra = rangeOf(a);\n const rb = rangeOf(b);\n return !!ra && !!rb && ra[0] === rb[0] && ra[1] === rb[1] && ra[2] === rb[2] &&\n (a as object).constructor === (b as object).constructor;\n}\n\nfunction isBlockNode(node: unknown): boolean {\n if (isScalar(node)) {return node.type === 'BLOCK_LITERAL' || node.type === 'BLOCK_FOLDED';}\n return isCollection(node) && !node.flow;\n}\n\ninterface Trivia {\n comment?: string | null;\n commentBefore?: string | null;\n spaceBefore?: boolean;\n anchor?: string;\n tag?: string;\n}\n\nfunction sameTrivia(a: Trivia, b: Trivia): boolean {\n return a.anchor === b.anchor && a.tag === b.tag && a.comment === b.comment &&\n a.commentBefore === b.commentBefore && !!a.spaceBefore === !!b.spaceBefore;\n}\n\nfunction sameScalar(a: Scalar, b: Scalar): boolean {\n return Object.is(a.value, b.value) && a.type === b.type && a.format === b.format &&\n a.minFractionDigits === b.minFractionDigits && sameTrivia(a, b);\n}\n\n/** Render `node` inside a one-item container and return what follows the\n * container's own prefix (`k:` or `-`). Continuation lines are shifted to\n * column `col`. `inline` is true for a single line that follows the prefix\n * after one space. */\nfunction render(ctx: Ctx, build: (doc: Document) => YAMLMap | YAMLSeq, prefix: number, col: number): { inline: boolean; text: string } {\n const doc = new Document(undefined, EDIT_OPTIONS);\n doc.contents = build(doc);\n const out = doc.toString(ctx.piece).replace(/\\n+$/, '');\n const rest = out.slice(prefix);\n const inline = rest.startsWith(' ') && !rest.includes('\\n');\n const pad = ' '.repeat(col);\n const text = rest.replace(/\\n(?=.)/g, `\\n${pad}`).replace(/\\n/g, ctx.eol);\n return { inline, text: inline ? rest.slice(1) : text };\n}\n\n/** `value` as the value of a pair whose key sits at column `col`. */\nfunction renderValue(ctx: Ctx, value: unknown, col: number): { inline: boolean; text: string } {\n return render(ctx, doc => {\n const map = new YAMLMap();\n map.items.push(doc.createPair('k', value));\n return map;\n }, 2, col);\n}\n\n/** `value` as a list item whose `-` sits at column `col` (the text after `- `). */\nfunction renderItem(ctx: Ctx, value: unknown, col: number): { inline: boolean; text: string } | null {\n const piece = render(ctx, () => {\n const seq = new YAMLSeq();\n seq.items.push(value);\n return seq;\n }, 1, col);\n if (piece.inline) {return piece;}\n return piece.text.startsWith(' ') ? { inline: false, text: piece.text.slice(1) } : null;\n}\n\n/** A copy of a node without its trailing comment, for rendering its value alone. */\nfunction valueOnly(node: unknown): unknown {\n if (!isNode(node) || !present((node as Trivia).comment)) {return node;}\n const copy = node.clone() as Node & Trivia;\n copy.comment = undefined;\n return copy;\n}\n\n/** `b` without the anchor and tag it shares with `a`. A node's range starts\n * at its value — `&g` and `!!str` sit in front of it and stay in the text —\n * so the new value is rendered without them, and only the value text inside\n * the range changes (`goal: &g Old` → `goal: &g New`, not `&g &g New`). */\nfunction withoutSharedProps(a: unknown, b: unknown): unknown {\n if (!isNode(a) || !isNode(b)) {return b;}\n const ta = a as Trivia;\n const tb = b as Trivia;\n if ((!ta.anchor && !ta.tag) || ta.anchor !== tb.anchor || ta.tag !== tb.tag) {return b;}\n const copy = b.clone() as Node & Trivia;\n copy.anchor = undefined;\n copy.tag = undefined;\n return copy;\n}\n\n/** Just after the `:` that follows `key`, or -1. */\nfunction afterColon(src: string, key: unknown): number {\n const r = rangeOf(key);\n if (!r) {return -1;}\n let i = r[2];\n while (src[i] === ' ' || src[i] === '\\t') {i++;}\n return src[i] === ':' ? i + 1 : -1;\n}\n\n/** Text for an empty value (`key:` with nothing after it) that gains one. */\nfunction fillEmpty(src: string, at: number, text: string): string {\n const lead = src[at - 1] === ' ' || src[at - 1] === '\\t' ? '' : ' ';\n const tail = src[at] === '#' ? ' ' : '';\n return `${lead}${text}${tail}`;\n}\n\n/** How a replaced node's old text ends, and what its new text looks like. */\ninterface Replacement {\n range: [number, number, number];\n /** The old node's trailing comment stays where it is. */\n keepTail: boolean;\n /** The new node's own trailing comment (rendered in `piece` when the tail goes). */\n newComment: string | null | undefined;\n piece: { inline: boolean; text: string };\n}\n\n/** How `a` is replaced by `b`. `fromColon`: the new text starts right after\n * the key's colon, over the node's anchor and tag too, so they are rendered\n * with it; otherwise the new text starts at the node's range, after them. */\nfunction planReplace(ctx: Ctx, a: unknown, b: unknown, slot: Slot, fromColon = false): Replacement | null {\n const range = rangeOf(a);\n if (!range || slot.kind === 'root') {return null;}\n const oldComment = (a as Trivia).comment;\n const newComment = isNode(b) ? (b as Trivia).comment : undefined;\n const keepTail = !present(oldComment) || oldComment === newComment;\n const valueText = keepTail ? valueOnly(b) : b;\n const shown = fromColon ? valueText : withoutSharedProps(a, valueText);\n const piece = slot.kind === 'value' ? renderValue(ctx, shown, slot.col) : renderItem(ctx, shown, slot.col);\n return piece ? { range, keepTail, newComment, piece } : null;\n}\n\n/** Where the old node's text ends: before its trailing comment when that\n * stays, after it when the comment goes with the node. */\nfunction replaceEnd(src: string, a: unknown, r: [number, number, number], keepTail: boolean): number {\n if (!keepTail) {return beforeBreak(src, lineEnd(src, r[2]));}\n return isBlockNode(a) ? beforeBreak(src, r[1]) : r[1];\n}\n\n/** Replace the node `a` (a pair's value, or a list item) with `b`; `addComment`\n * is a line comment the unchanged-style scalar gains. */\nfunction replace(ctx: Ctx, a: unknown, b: unknown, slot: Slot, addComment?: string): boolean {\n const inRange = planReplace(ctx, a, b, slot);\n if (!inRange) {return false;}\n const end = replaceEnd(ctx.src, a, inRange.range, inRange.keepTail);\n if (inRange.piece.inline && (!isBlockNode(a) || slot.kind === 'item')) {\n replaceInline(ctx, inRange, end, slot, addComment);\n return true;\n }\n // A multi-line value (or a block node replaced): no comment can be carried.\n const tailComment = inRange.keepTail ? (a as Trivia).comment : inRange.newComment;\n if (addComment !== undefined || present(tailComment)) {return false;}\n // A pair's value is rewritten from its key's colon, anchor and tag included.\n const plan = slot.kind === 'value' ? planReplace(ctx, a, b, slot, true) : inRange;\n return plan !== null && replaceBlock(ctx, plan.range[0], end, plan.piece, slot);\n}\n\n/** One line in, one line out: the new value takes the old value's place. */\nfunction replaceInline(ctx: Ctx, plan: Replacement, end: number, slot: Slot, addComment?: string): void {\n const [start, valueEnd] = plan.range;\n const empty = start === valueEnd && slot.kind === 'value';\n const text = empty ? fillEmpty(ctx.src, start, plan.piece.text) : plan.piece.text;\n push(ctx, start, end, text + (addComment === undefined ? '' : ` #${addComment}`));\n}\n\nfunction replaceBlock(ctx: Ctx, start: number, end: number, piece: { inline: boolean; text: string }, slot: Slot): boolean {\n if (slot.kind === 'item') {\n push(ctx, start, end, piece.text);\n return true;\n }\n if (slot.kind !== 'value') {return false;}\n const colon = afterColon(ctx.src, slot.key);\n if (colon < 0) {return false;}\n push(ctx, colon, end, piece.inline ? ` ${piece.text}` : piece.text);\n return true;\n}\n\n/** Same anchor, tag, leading comment and blank line (the trailing comment aside). */\nfunction sameLead(a: Trivia, b: Trivia): boolean {\n return sameTrivia({ ...a, comment: undefined }, { ...b, comment: undefined });\n}\n\n/** The line comment a scalar gains (it had none, the change gives it one). */\nfunction gainedComment(a: Scalar, b: Scalar): string | undefined {\n if (present(a.comment) || typeof b.comment !== 'string') {return undefined;}\n return b.comment.includes('\\n') ? undefined : b.comment;\n}\n\nfunction diffScalar(ctx: Ctx, a: Scalar, b: Scalar, slot: Slot): boolean {\n if (sameScalar(a, b)) {return true;}\n if (!sameLead(a, b)) {return false;}\n const added = gainedComment(a, b);\n if (a.comment !== b.comment && added === undefined) {return false;}\n return replace(ctx, a, b, slot, added);\n}\n\nfunction diffCollection(ctx: Ctx, a: YAMLMap | YAMLSeq, b: YAMLMap | YAMLSeq, slot: Slot): boolean {\n if (!sameTrivia(a, b) || !!a.flow !== !!b.flow) {return false;}\n if (a.flow) {\n return renderValue(ctx, a, 0).text === renderValue(ctx, b, 0).text || replace(ctx, a, b, slot);\n }\n // Every entry gone: the value becomes `{}` / `[]`, not an empty `key:`.\n if (b.items.length === 0) {return replace(ctx, a, b, slot);}\n return isMap(a) ? diffMap(ctx, a, b as YAMLMap) : diffSeq(ctx, a as YAMLSeq, b as YAMLSeq);\n}\n\nfunction diffNode(ctx: Ctx, a: unknown, b: unknown, slot: Slot): boolean {\n if (!sameOrigin(a, b)) {return replace(ctx, a, b, slot);}\n if (isScalar(a)) {return diffScalar(ctx, a, b as Scalar, slot);}\n if (isAlias(a)) {\n return (isAlias(b) && a.source === b.source && sameTrivia(a, b)) || replace(ctx, a, b, slot);\n }\n if (!isCollection(a) || !isCollection(b)) {return false;}\n return diffCollection(ctx, a as YAMLMap | YAMLSeq, b as YAMLMap | YAMLSeq, slot);\n}\n\n/** Column of a block collection's entries (first key, or first `-`). */\nfunction entryColumn(src: string, pos: number): number {\n return pos - lineStart(src, pos);\n}\n\n/** True when only spaces (and, for a list item, its `-`) precede `pos` on its line. */\nfunction startsLine(src: string, pos: number, dash: boolean): boolean {\n const lead = src.slice(lineStart(src, pos), pos);\n return dash ? /^ *- +$/.test(lead) || /^ *$/.test(lead) : /^ *$/.test(lead);\n}\n\nfunction hasLeadingTrivia(node: unknown): boolean {\n return isNode(node) && (present((node as Trivia).commentBefore) || !!(node as Trivia).spaceBefore);\n}\n\n/** End of an entry's last line (after its line break). */\nfunction entryEnd(ctx: Ctx, value: unknown, key?: unknown): number {\n const r = rangeOf(value) ?? rangeOf(key);\n return r ? lineEnd(ctx.src, r[2]) : -1;\n}\n\nfunction renderEntries(ctx: Ctx, container: YAMLMap | YAMLSeq, col: number): string {\n const doc = new Document(undefined, EDIT_OPTIONS);\n doc.contents = container;\n const pad = ' '.repeat(col);\n const lines = doc.toString(ctx.piece).replace(/\\n+$/, '').split('\\n');\n return lines.map(line => (line ? pad + line : line)).join(ctx.eol) + ctx.eol;\n}\n\n/** Insert text for new entries at `at` (a line start, or the end of a file\n * without a final line break — which then still ends without one). */\nfunction insertAt(ctx: Ctx, at: number, body: string): void {\n const openEnd = at === ctx.src.length && at > 0 && !ctx.src.endsWith('\\n');\n push(ctx, at, at, openEnd ? ctx.eol + body.slice(0, -ctx.eol.length) : body);\n}\n\n/** Insert new entries after the entry ending at `afterEnd` (or before the\n * first entry, `first`, when -1). */\nfunction insertEntries(ctx: Ctx, first: unknown, afterEnd: number, container: YAMLMap | YAMLSeq, col: number, dash: boolean): boolean {\n let at = afterEnd;\n if (at < 0) {\n const r = rangeOf(first);\n if (!r || hasLeadingTrivia(first) || !startsLine(ctx.src, r[0], dash)) {return false;}\n at = lineStart(ctx.src, r[0]);\n }\n insertAt(ctx, at, renderEntries(ctx, container, col));\n return true;\n}\n\n/** Start of the lines that belong to an entry: its own line, plus the comment\n * lines and blank lines the parser attached before it. */\nfunction entryStart(src: string, head: unknown, pos: number): number {\n let start = lineStart(src, pos);\n const t = head as Trivia;\n const comments = present(t.commentBefore);\n let blank = !!t.spaceBefore;\n while (start > 0) {\n const prev = lineStart(src, start - 1);\n const line = src.slice(prev, start).trim();\n if (comments && line.startsWith('#')) {\n start = prev;\n } else if (blank && line === '') {\n start = prev;\n blank = false;\n } else {\n break;\n }\n }\n return start;\n}\n\nfunction deleteEntry(ctx: Ctx, head: unknown, value: unknown, dash: boolean): boolean {\n const r = rangeOf(head);\n if (!r || !startsLine(ctx.src, r[0], dash)) {return false;}\n const end = entryEnd(ctx, value, head);\n if (end < 0) {return false;}\n push(ctx, entryStart(ctx.src, head, r[0]), end, '');\n return true;\n}\n\n/** Finds, for a node of the changed Document, the index of the original\n * entry it was cloned from (-1 for a new node). */\nfunction originIndex(items: readonly unknown[], pick: (x: unknown) => unknown): (b: unknown) => number {\n const at = new Map<string, number>();\n const id = (node: unknown): string | undefined => {\n const r = rangeOf(node);\n return r ? r.join(':') : undefined;\n };\n items.forEach((item, i) => {\n const key = id(pick(item));\n if (key !== undefined && !at.has(key)) {at.set(key, i);}\n });\n return (b) => {\n const key = id(pick(b));\n const i = key === undefined ? undefined : at.get(key);\n return i !== undefined && sameOrigin(pick(items[i]), pick(b)) ? i : -1;\n };\n}\n\nfunction sameKey(a: unknown, b: unknown): boolean {\n return isScalar(a) && isScalar(b) ? sameScalar(a, b) : a === b;\n}\n\nfunction diffMap(ctx: Ctx, a: YAMLMap, b: YAMLMap): boolean {\n const firstKey = a.items[0]?.key;\n const kr = rangeOf(firstKey);\n if (!kr) {return false;}\n const col = entryColumn(ctx.src, kr[0]);\n const matched = new Set<number>();\n const flush = (pending: Pair[], last: number): boolean => {\n if (pending.length === 0) {return true;}\n const container = new YAMLMap();\n container.items.push(...pending);\n const end = last < 0 ? -1 : entryEnd(ctx, a.items[last].value, a.items[last].key);\n return insertEntries(ctx, firstKey, end, container, col, false);\n };\n const origin = originIndex(a.items, p => (p as Pair).key);\n let last = -1;\n let pending: Pair[] = [];\n for (const bp of b.items) {\n const ai = origin(bp);\n if (ai < 0) {\n pending.push(bp);\n continue;\n }\n if (ai <= last || !flush(pending, last) || !sameKey(a.items[ai].key, bp.key)) {return false;}\n pending = [];\n if (!diffNode(ctx, a.items[ai].value, bp.value, { kind: 'value', key: a.items[ai].key, col })) {return false;}\n matched.add(ai);\n last = ai;\n }\n if (!flush(pending, last)) {return false;}\n return a.items.every((p, i) => matched.has(i) || deletePair(ctx, a, i));\n}\n\n/** Remove pair `i` of `map`. The first pair of a map that is a list item\n * (`- id: x`) shares its line with the `-`: the next key moves up to it. */\nfunction deletePair(ctx: Ctx, map: YAMLMap, i: number): boolean {\n const pair = map.items[i];\n const r = rangeOf(pair.key);\n if (!r) {return false;}\n if (startsLine(ctx.src, r[0], false)) {return deleteEntry(ctx, pair.key, pair.value, false);}\n const next = map.items[i + 1];\n const nr = rangeOf(next?.key);\n if (i !== 0 || !nr || hasLeadingTrivia(pair.key) || hasLeadingTrivia(next.key)) {return false;}\n push(ctx, r[0], nr[0], '');\n return true;\n}\n\nfunction diffSeq(ctx: Ctx, a: YAMLSeq, b: YAMLSeq): boolean {\n const sr = rangeOf(a);\n if (!sr || a.items.length === 0) {return false;}\n const col = entryColumn(ctx.src, sr[0]);\n const matched = new Set<number>();\n const flush = (pending: unknown[], last: number): boolean => {\n if (pending.length === 0) {return true;}\n const container = new YAMLSeq();\n container.items.push(...pending);\n const end = last < 0 ? -1 : entryEnd(ctx, a.items[last]);\n return insertEntries(ctx, a.items[0], end, container, col, true);\n };\n const origin = originIndex(a.items, x => x);\n let last = -1;\n let pending: unknown[] = [];\n for (const bi of b.items) {\n const ai = origin(bi);\n if (ai < 0) {\n pending.push(bi);\n continue;\n }\n if (ai <= last || !flush(pending, last)) {return false;}\n pending = [];\n if (!diffNode(ctx, a.items[ai], bi, { kind: 'item', col })) {return false;}\n matched.add(ai);\n last = ai;\n }\n if (!flush(pending, last)) {return false;}\n return a.items.every((item, i) => matched.has(i) || deleteEntry(ctx, item, item, true));\n}\n\n/** Apply non-overlapping edits, last first. Returns null on an overlap. */\nfunction applyEdits(src: string, edits: Edit[]): string | null {\n const sorted = [...edits].sort((x, y) => y.start - x.start || y.end - x.end || y.seq - x.seq);\n let out = src;\n let bound = Infinity;\n for (const e of sorted) {\n if (e.end > bound) {return null;}\n out = out.slice(0, e.start) + e.text + out.slice(e.end);\n bound = e.start;\n }\n return out;\n}\n\n/** An empty (or comments-only) document gains its first content. */\nfunction fillDocument(ctx: Ctx, base: Document, b: unknown): boolean {\n if (!isMap(b) && !isSeq(b)) {return false;}\n const lead = ctx.src.length > 0 && !ctx.src.endsWith('\\n') ? ctx.eol : '';\n const gap = base.commentBefore ? ctx.eol : '';\n push(ctx, ctx.src.length, ctx.src.length, lead + gap + renderEntries(ctx, b, 0));\n return true;\n}\n\nfunction spliceRoot(ctx: Ctx, base: Document, next: Document): boolean {\n if (base.commentBefore !== next.commentBefore || base.comment !== next.comment) {return false;}\n const a = base.contents;\n const b = next.contents;\n if (!present(a)) {return !present(b) || fillDocument(ctx, base, b);}\n return present(b) && diffNode(ctx, a, b, { kind: 'root' });\n}\n\nfunction splice(src: string, base: Document, next: Document, eol: string, piece: ToStringOptions): string | null {\n const ctx: Ctx = { src, eol, edits: [], piece };\n if (!spliceRoot(ctx, base, next)) {return null;}\n return applyEdits(src, ctx.edits);\n}\n\n/** Blank lines carry no data outside block scalars, and the parser may pin a\n * blank line to a neighbouring node; the data itself is compared separately. */\nconst withoutBlankLines = (text: string): string => text.replace(/^[ \\t]*\\n/gm, '');\n\n/** True when `text` parses to the same data as `next`, with the same comments,\n * styles and structure (its serialisation equals `want`, blank lines aside). */\nfunction reads(text: string, next: Document, want: string, opts: ToStringOptions): boolean {\n const doc = parseDocument(text, EDIT_OPTIONS);\n if (doc.errors.length > 0 || !sameJs(doc.toJS(), next.toJS())) {return false;}\n const got = doc.toString(opts);\n return got === want || withoutBlankLines(got) === withoutBlankLines(want);\n}\n\n/**\n * Parse `text`, let `mutate` change the Document, and return the new text with\n * every byte outside the changed nodes kept. `name` labels errors (a file that\n * is not valid YAML is refused — nothing is guessed). When the change leaves\n * the data as it was (the same values, whatever the nodes or their order),\n * the original `text` is returned with `changed: false`.\n */\nexport function editYaml(text: string, mutate: (doc: Document) => void, name = 'YAML'): YamlEditResult {\n const { text: out, changed } = editYamlDetailed(text, mutate, name);\n return { text: out, changed };\n}\n\n/** {@link editYaml}, also saying how the text was made: `spliced` is true when\n * only the changed nodes were rewritten, false when faf fell back to the\n * Document's own serialisation (or nothing changed). For tests. */\nexport function editYamlDetailed(\n text: string,\n mutate: (doc: Document) => void,\n name = 'YAML',\n): YamlEditResult & { spliced: boolean } {\n const bom = text.startsWith('\\uFEFF') ? '\\uFEFF' : '';\n const src = text.slice(bom.length);\n const base = parseForEdit(src, name);\n const next = cloneDocument(base);\n mutate(next);\n const unchanged = { text, changed: false, spliced: false };\n // A change that leaves the data as it was writes nothing — not even the\n // Document's own serialisation, which could differ from the file's text.\n if (sameJs(next.toJS(), base.toJS())) {return unchanged;}\n const canon: ToStringOptions = { lineWidth: 0, ...styleOf(src) };\n const want = next.toString(canon);\n if (want === base.toString(canon)) {return unchanged;}\n const eol = src.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const candidate = splice(src, base, next, eol, { ...canon, verifyAliasOrder: false });\n const spliced = candidate !== null && reads(candidate, next, want, canon);\n const out = spliced && candidate !== null ? candidate : want.replace(/\\r?\\n/g, eol);\n return { text: bom + out, changed: bom + out !== text, spliced };\n}\n\n/** `doc.clone()`, keeping the document-end marker (`...`): yaml's clone\n * copies the `%YAML` directive and the `---` start marker but drops `...`,\n * so every edit of a file ending in `...` fell back to a full rewrite. */\nfunction cloneDocument(doc: Document): Document {\n const copy = doc.clone();\n if (doc.directives && copy.directives) {copy.directives.docEnd = doc.directives.docEnd;}\n return copy;\n}\n\n// ─── Applying plain data to a Document ──────────────────────────────────────\n\n/** Deep equality of plain parsed values (mappings compared key by key). */\nexport function sameJs(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) {return true;}\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((x, i) => sameJs(x, b[i]));\n }\n if (isMapping(a) && isMapping(b)) {\n const ka = Object.keys(a);\n return ka.length === Object.keys(b).length && ka.every(k => k in b && sameJs(a[k], b[k]));\n }\n return false;\n}\n\nfunction keyText(pair: Pair): string | undefined {\n const k = isScalar(pair.key) ? pair.key.value : pair.key;\n return typeof k === 'string' || typeof k === 'number' || typeof k === 'boolean' ? String(k) : undefined;\n}\n\nfunction findPair(map: YAMLMap, key: string): Pair | undefined {\n return map.items.find(p => keyText(p) === key);\n}\n\nfunction nodeJs(doc: Document, node: unknown): unknown {\n return isNode(node) ? node.toJS(doc) : node;\n}\n\n/** How {@link applyMapData} treats keys the data does not name. */\nexport interface ApplyOptions {\n /** Remove keys of a mapping that the data leaves out (or sets `undefined`).\n * Default false: a key the data does not mention stays exactly as it is. */\n prune?: boolean;\n /** Leave every alias (`*name`) as written, whatever the data holds there:\n * it is never expanded or replaced (see {@link keptAliases}). */\n keepAliases?: boolean;\n}\n\n/** The node already holds `value`, or is an alias kept as written. */\nfunction staysAsWritten(doc: Document, node: unknown, value: unknown, opts: ApplyOptions): boolean {\n return (opts.keepAliases === true && isAlias(node)) || sameJs(nodeJs(doc, node), value);\n}\n\n/**\n * Set `node` to hold `value` with the fewest changes: a mapping is updated key\n * by key, a list item by item (items still there are kept as they are), a\n * scalar in place (its comment, quoting and position kept). Returns the node\n * to store — `node` itself, or a new node when the shape changed.\n */\nexport function applyValue(doc: Document, node: unknown, value: unknown, opts: ApplyOptions = {}): unknown {\n if (staysAsWritten(doc, node, value, opts)) {return node;}\n if (isMapping(value) && isMap(node)) {\n applyMapData(doc, node, value, opts);\n return node;\n }\n if (Array.isArray(value) && isSeq(node)) {\n applySeqData(doc, node, value, opts);\n return node;\n }\n if (!isMapping(value) && !Array.isArray(value) && isScalar(node)) {\n node.value = value;\n return node;\n }\n return withCommentOf(node, doc.createNode(value));\n}\n\n/** `created`, which takes the place of `old`, with `old`'s comments: a\n * scalar or an alias keeps its line comment (`summary: *g # note` →\n * `summary: New # note`); a scalar lifted to a mapping or a list\n * (`project: demo # note`, `stack: # note`) keeps it as a comment line above\n * the new entries, or on the key line when the new value is empty\n * (`stack: {} # note`). */\nfunction withCommentOf(old: unknown, created: Node): Node {\n if (!isScalar(old) && !isAlias(old)) {return created;}\n const was = old as Trivia;\n const target = created as Node & Trivia;\n if (isCollection(created) && created.items.length > 0 && !created.flow) {\n target.commentBefore = joinComments(target.commentBefore, was.commentBefore, was.comment);\n return created;\n }\n if (isCollection(created)) {created.flow = true;}\n target.comment = joinComments(target.comment ?? was.comment);\n target.commentBefore = joinComments(target.commentBefore ?? was.commentBefore);\n return created;\n}\n\n/** Comment texts joined as lines, or undefined when there are none. */\nfunction joinComments(...parts: Array<string | null | undefined>): string | undefined {\n const lines = parts.filter(present);\n return lines.length > 0 ? lines.join('\\n') : undefined;\n}\n\n/** Make `map` hold `data`: changed keys updated in place, new keys appended in\n * `data`'s order. Keys `data` leaves out stay, unless `prune` is set. */\nexport function applyMapData(doc: Document, map: YAMLMap, data: Record<string, unknown>, opts: ApplyOptions = {}): void {\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) {continue;}\n const pair = findPair(map, key);\n if (pair) {\n pair.value = applyValue(doc, pair.value, value, opts);\n } else {\n map.items.push(doc.createPair(key, value));\n }\n }\n if (!opts.prune) {return;}\n map.items = map.items.filter(p => {\n const key = keyText(p);\n return key === undefined || data[key] !== undefined;\n });\n}\n\n/**\n * Merge `data` into `map`, whose parsed value (the file as it was read) is\n * `before`, writing only the paths where `data` differs from `before`:\n * - a key whose value in `data` equals its value in `before` is not touched\n * — its node stays exactly as written, so an alias (`summary: *g`), a\n * merge key or a comment on it survives even when `data` spells out the\n * value the alias read as (a stale copy never replaces a live `*alias`);\n * - a changed mapping is merged key by key the same way;\n * - any other changed value is set with {@link applyValue};\n * - an alias (`stack: *base`) is never replaced or expanded, at any depth:\n * it stays as written, and a change `data` makes under it is not written\n * ({@link keptAliases} lists those paths);\n * - keys `data` leaves out (or sets `undefined`) stay; new keys are appended.\n * This is how writeFaf applies full .faf data to an existing file.\n */\nexport function mergeData(doc: Document, map: YAMLMap, before: unknown, data: Record<string, unknown>): void {\n const was: Record<string, unknown> = isMapping(before) ? before : {};\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) {continue;}\n const pair = findPair(map, key);\n if (!pair) {\n map.items.push(doc.createPair(key, value));\n } else if (Object.prototype.hasOwnProperty.call(was, key) && sameJs(was[key], value)) {\n continue; // unchanged: the node stays as written\n } else if (isMapping(value) && isMapping(was[key]) && isMap(pair.value)) {\n mergeData(doc, pair.value, was[key], value);\n } else {\n pair.value = applyValue(doc, pair.value, value, { keepAliases: true });\n }\n }\n}\n\n/** An alias faf left as written: where it is (`stack`, `key_files.2`) and\n * what it says (`*base`). With `kind: 'anchor'` the path holds an anchor an\n * alias reads (`alias` then says `&name`): `faf auto` would have filled it,\n * which would change every alias that reads it, so it is left as written. */\nexport interface KeptAlias {\n path: string;\n alias: string;\n kind?: 'alias' | 'anchor';\n}\n\n/** Every alias in a mapping or list, with its path — not looking through aliases. */\nfunction aliasesIn(node: unknown, path: readonly (string | number)[], out: Array<{ path: (string | number)[]; node: Alias }>): void {\n if (isAlias(node)) {\n out.push({ path: [...path], node });\n } else if (isMap(node)) {\n for (const pair of node.items) {\n const key = keyText(pair);\n if (key !== undefined) {aliasesIn(pair.value, [...path, key], out);}\n }\n } else if (isSeq(node)) {\n node.items.forEach((item, i) => aliasesIn(item, [...path, i], out));\n }\n}\n\n/** The plain value at `path` of parsed data, or undefined. */\nfunction jsAt(data: unknown, path: readonly (string | number)[]): unknown {\n let cur = data;\n for (const step of path) {\n if (Array.isArray(cur) && typeof step === 'number') {\n cur = cur[step];\n } else if (isMapping(cur) && typeof step === 'string') {\n cur = cur[step];\n } else {\n return undefined;\n }\n }\n return cur;\n}\n\n/** The aliases in `doc` where `data` changed the value the file held\n * (`before`) and the alias does not read as the new value — a change under\n * an alias that faf did not write, because it never replaces or expands an\n * alias. A value `data` only repeats (a stale copy of what the alias read\n * as) is not a change. */\nexport function keptAliases(doc: Document, data: unknown, before: unknown): KeptAlias[] {\n const found: Array<{ path: (string | number)[]; node: Alias }> = [];\n aliasesIn(doc.contents, [], found);\n return found\n .filter(({ path, node }) => {\n const want = jsAt(data, path);\n return want !== undefined && !sameJs(jsAt(before, path), want) && !sameJs(node.toJS(doc), want);\n })\n .map(({ path, node }) => ({ path: path.join('.'), alias: `*${node.source}` }));\n}\n\n/** The node at `path` of a Document, and a way to put another node in its\n * place — or null when nothing is there. A list item is put back only over a\n * node the change made (one with no place in the file); an item of the file\n * that moved there is left. */\nfunction slotAt(doc: Document, path: readonly (string | number)[]): { node: unknown; put: (n: Node) => boolean } | null {\n let parent: unknown = doc.contents;\n for (let i = 0; i < path.length - 1 && parent !== undefined; i++) {parent = childAt(parent, path[i]);}\n const step = path[path.length - 1];\n if (isMap(parent) && typeof step === 'string') {\n const pair = findPair(parent, step);\n return pair ? { node: pair.value, put: n => ((pair.value = n), true) } : null;\n }\n if (isSeq(parent) && typeof step === 'number' && step < parent.items.length) {\n const seq = parent;\n const node = seq.items[step];\n return { node, put: n => (rangeOf(node) === undefined ? ((seq.items[step] = n), true) : false) };\n }\n return null;\n}\n\n/** The value a mapping holds under `step`, or a list's item `step`. */\nfunction childAt(node: unknown, step: string | number): unknown {\n if (isMap(node) && typeof step === 'string') {return findPair(node, step)?.value;}\n if (isSeq(node) && typeof step === 'number') {return node.items[step];}\n return undefined;\n}\n\n/**\n * Put back every alias of `before` that `after` (the same Document, changed)\n * holds something else in place of: faf never replaces an alias, so that\n * path keeps the file's `*name` and its change is not written. A key the\n * change removed stays removed. Returns the aliases put back.\n */\nexport function restoreAliases(before: Document, after: Document): KeptAlias[] {\n const found: Array<{ path: (string | number)[]; node: Alias }> = [];\n aliasesIn(before.contents, [], found);\n const kept: KeptAlias[] = [];\n for (const { path, node } of found) {\n const slot = slotAt(after, path);\n if (!slot || (isAlias(slot.node) && slot.node.source === node.source)) {continue;}\n if (!slot.put(node.clone() as Alias)) {continue;}\n kept.push({ path: path.join('.'), alias: `*${node.source}` });\n }\n return kept;\n}\n\n/** Every node with an anchor in `names`, with its path — not looking through aliases. */\nfunction anchoredIn(node: unknown, path: readonly (string | number)[], names: ReadonlySet<string>, out: Array<{ path: (string | number)[]; node: Node }>): void {\n if (!isNode(node) || isAlias(node)) {return;}\n const anchor = (node as Trivia).anchor;\n if (anchor && names.has(anchor)) {out.push({ path: [...path], node });}\n if (isMap(node)) {\n for (const pair of node.items) {\n const key = keyText(pair);\n if (key !== undefined) {anchoredIn(pair.value, [...path, key], names, out);}\n }\n } else if (isSeq(node)) {\n node.items.forEach((item, i) => anchoredIn(item, [...path, i], names, out));\n }\n}\n\n/**\n * Put back every node of `before` that carries an anchor an alias reads\n * (`frontend: &x None` while `ui_library: *x`) and that `after` (the same\n * Document, changed) holds something else in place of: a fill there would\n * change the value of every alias that reads it, so faf leaves the node as\n * written and its change is not written. Returns those paths (`kind:\n * 'anchor'`, `alias` saying `&name`).\n */\nexport function restoreAnchors(before: Document, after: Document): KeptAlias[] {\n const aliases: Array<{ path: (string | number)[]; node: Alias }> = [];\n aliasesIn(before.contents, [], aliases);\n const names = new Set(aliases.map(a => a.node.source));\n if (names.size === 0) {return [];}\n const found: Array<{ path: (string | number)[]; node: Node }> = [];\n anchoredIn(before.contents, [], names, found);\n const kept: KeptAlias[] = [];\n for (const { path, node } of found) {\n const slot = slotAt(after, path);\n if (!slot) {continue;}\n const anchor = (node as Trivia).anchor as string;\n const same = isNode(slot.node) && (slot.node as Trivia).anchor === anchor && sameJs(node.toJS(before), (slot.node as Node).toJS(after));\n if (same || !slot.put(node.clone() as Node)) {continue;}\n kept.push({ path: path.join('.'), alias: `&${anchor}`, kind: 'anchor' });\n }\n return kept;\n}\n\n/** Index pairs [i, j] of a longest common subsequence of `a` and `b`. */\nfunction commonItems(a: readonly unknown[], b: readonly unknown[]): Array<[number, number]> {\n const n = a.length;\n const m = b.length;\n const len: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n len[i][j] = sameJs(a[i], b[j]) ? len[i + 1][j + 1] + 1 : Math.max(len[i + 1][j], len[i][j + 1]);\n }\n }\n const pairs: Array<[number, number]> = [];\n for (let i = 0, j = 0; i < n && j < m;) {\n if (sameJs(a[i], b[j])) {\n pairs.push([i, j]);\n i++;\n j++;\n } else if (len[i + 1][j] >= len[i][j + 1]) {\n i++;\n } else {\n j++;\n }\n }\n return pairs;\n}\n\n/** Make `seq` hold `data`. Items that are still there are kept as they are\n * (so removing or adding one item touches only that item); between them,\n * items are changed in place, then removed or added. */\nfunction applySeqData(doc: Document, seq: YAMLSeq, data: unknown[], opts: ApplyOptions): void {\n const old = seq.items;\n const oldJs = old.map(item => nodeJs(doc, item));\n const items: unknown[] = [];\n let i = 0;\n let j = 0;\n for (const [mi, mj] of [...commonItems(oldJs, data), [old.length, data.length] as [number, number]]) {\n for (; i < mi && j < mj; i++, j++) {items.push(applyValue(doc, old[i], data[j], opts));}\n for (; j < mj; j++) {items.push(doc.createNode(data[j]));}\n if (mi < old.length) {items.push(old[mi]);}\n i = mi + 1;\n j = mj + 1;\n }\n seq.items = items;\n}\n\n/**\n * Apply the change from `before` to `after` to `node`, touching nothing the\n * change does not name: for mappings, only keys added, removed or changed\n * between the two are written — a key in the file that neither side mentions\n * stays as it is. Returns the node to store.\n */\nexport function applyChange(doc: Document, node: unknown, before: unknown, after: unknown): unknown {\n if (sameJs(before, after)) {return node;}\n if (!isMapping(before) || !isMapping(after) || !isMap(node)) {return applyValue(doc, node, after);}\n const gone = new Set(Object.keys(before).filter(key => !(key in after) || after[key] === undefined));\n node.items = node.items.filter(p => {\n const key = keyText(p);\n return key === undefined || !gone.has(key);\n });\n for (const [key, value] of Object.entries(after)) {\n if (value === undefined) {continue;}\n const pair = findPair(node, key);\n if (!pair) {\n node.items.push(doc.createPair(key, value));\n } else if (!sameJs(before[key], value)) {\n pair.value = applyChange(doc, pair.value, before[key], value);\n }\n }\n return node;\n}\n\n/** The mapping at `path` (created when absent or empty). Throws when something\n * else is there — faf never replaces a scalar or a list to make room. */\nexport function mapAt(doc: Document, path: readonly string[], name: string): YAMLMap {\n let cur: unknown = doc.contents;\n if (cur === null || cur === undefined) {\n doc.contents = new YAMLMap();\n cur = doc.contents;\n }\n if (!isMap(cur)) {throw new Error(`${name}: the document is not a mapping — faf left it unchanged.`);}\n let map: YAMLMap = cur;\n for (const key of path) {\n const pair = findPair(map, key);\n if (pair && isMap(pair.value)) {\n map = pair.value;\n continue;\n }\n if (pair && !isEmptyValue(pair.value)) {throw new Error(`${name}: ${key} is not a mapping — faf left it unchanged.`);}\n const created = new YAMLMap();\n if (pair) {pair.value = filling(pair.value, created);} else {map.items.push(doc.createPair(key, created));}\n map = created;\n }\n return map;\n}\n\n/**\n * Apply the change `before` → `after` at `path` (see {@link applyChange}).\n * The parent mapping is created when absent; `after === undefined` removes the\n * key. Nothing is touched when the two are equal.\n */\nexport function changeAt(doc: Document, path: readonly string[], before: unknown, after: unknown, name: string): void {\n if (sameJs(before, after)) {return;}\n const parent = mapAt(doc, path.slice(0, -1), name);\n const key = path[path.length - 1];\n const pair = findPair(parent, key);\n if (after === undefined) {\n parent.items = parent.items.filter(p => p !== pair);\n } else if (!pair) {\n parent.items.push(doc.createPair(key, after));\n } else {\n pair.value = applyChange(doc, pair.value, before, after);\n }\n}\n\n/** The list at `path`, created (as an empty list) when absent or empty.\n * Throws when something else is there. */\nexport function seqAt(doc: Document, path: readonly string[], name: string): YAMLSeq {\n const parent = mapAt(doc, path.slice(0, -1), name);\n const key = path[path.length - 1];\n const pair = findPair(parent, key);\n if (pair && isSeq(pair.value)) {return pair.value;}\n if (pair && !isEmptyValue(pair.value)) {throw new Error(`${name}: ${path.join('.')} is not a list — faf left it unchanged.`);}\n const seq = new YAMLSeq();\n if (pair) {pair.value = filling(pair.value, seq);} else {parent.items.push(doc.createPair(key, seq));}\n return seq;\n}\n\n/** `created` taking the place of an empty value (`facts: # note`) that entries\n * are about to fill: the empty value's comment becomes a comment line above\n * those entries, so it is not lost. */\nfunction filling<T extends YAMLMap | YAMLSeq>(empty: unknown, created: T): T {\n if (!isScalar(empty)) {return created;}\n const lines = [empty.commentBefore, empty.comment].filter(present);\n if (lines.length > 0) {created.commentBefore = lines.join('\\n');}\n return created;\n}\n\n/** `key:` with nothing after it (or `~` / `null`). */\nfunction isEmptyValue(value: unknown): boolean {\n if (value === null || value === undefined) {return true;}\n return isScalar(value) && (value.value === null || value.value === undefined);\n}\n\n",
|
|
88
88
|
"/**\n * Where .faf data came from: the file readFaf read it from (its real path) and\n * the text it read. writeFaf checks a write of that data against it — when the\n * file changed on disk after the read, the write is refused instead of being\n * made over the newer edit. Kept apart from interop/faf.ts so the pure parts\n * of detection (updateExistingFaf) can carry it without importing a module\n * that runs git.\n */\n\n/** The file a data object was read from, and the text read. */\nexport interface FafSource {\n real: string;\n text: string;\n}\n\nconst sources = new WeakMap<object, FafSource>();\n\n/** The source recorded for `data`, if any. */\nexport function fafSourceOf(data: unknown): FafSource | undefined {\n return typeof data === 'object' && data !== null ? sources.get(data) : undefined;\n}\n\n/** Record that `data` holds what `source.text` (read from `source.real`) says. */\nexport function setFafSource(data: object, source: FafSource): void {\n sources.set(data, source);\n}\n\n/** Let `to` — data made from `from` (a copy with empty slots filled, say) —\n * carry the file `from` was read from. Returns `to`. */\nexport function carryFafSource<T extends object>(from: unknown, to: T): T {\n const source = fafSourceOf(from);\n if (source) {sources.set(to, source);}\n return to;\n}\n\nconst fills = new WeakSet<object>();\n\n/** Mark `data` as a fill of the file it was read from — what `faf auto`\n * (updateExistingFaf) makes: detected values in the file's empty slots.\n * writeFaf leaves a node with an anchor that an alias reads as written in\n * such data, since filling it would change every alias. Returns `data`. */\nexport function markAsFill<T extends object>(data: T): T {\n fills.add(data);\n return data;\n}\n\n/** True when `data` was marked with {@link markAsFill}. */\nexport function isFill(data: unknown): boolean {\n return typeof data === 'object' && data !== null && fills.has(data);\n}\n",
|
|
89
89
|
"import { statSync } from 'fs';\nimport { homedir } from 'os';\nimport { parse, resolve } from 'path';\nimport { bold, dim, fafCyan } from '../ui/colors.js';\n\n/**\n * Home / filesystem root are never a FAF project root.\n * Receipt: stranger ran `faf auto` in ~ and got Trophy DNA for \"wolfejam\" —\n * funny, not useful. Dev-notes already say `cd your-project`.\n *\n * Hard refuse for writers (auto / init / go / loop). No --force escape:\n * cd is the product.\n */\n\n/** Same directory on disk, however it is spelled: device + inode, not the path\n * string. Catches a case-variant spelling of home on case-insensitive\n * APFS, a symlink to home, and the macOS Data-volume firmlink of the home\n * folder. An unreadable path, or a filesystem that reports no inode (0),\n * is never \"the same\". */\nfunction sameDir(a: string, b: string): boolean {\n try {\n const sa = statSync(a, { bigint: true });\n const sb = statSync(b, { bigint: true });\n return sa.isDirectory() && sa.ino !== 0n && sa.dev === sb.dev && sa.ino === sb.ino;\n } catch {\n return false;\n }\n}\n\n/** Which non-project root `dir` is — home, the filesystem root — or null. */\nfunction nonProjectRootKind(dir: string): 'home' | 'root' | null {\n const resolved = resolve(dir);\n const home = resolve(homedir());\n const root = parse(resolved).root; // '/' on POSIX, 'C:\\' on Windows\n if (resolved === home) {return 'home';}\n // POSIX root or Windows drive root (C:\\ etc.)\n if (resolved === root || resolved === '/' || /^[A-Za-z]:[\\\\/]?$/.test(resolved)) {return 'root';}\n // Spelled differently — compare identity.\n if (sameDir(resolved, home)) {return 'home';}\n if (sameDir(resolved, root)) {return 'root';}\n return null;\n}\n\n/** True if dir is the user's home directory or the filesystem root — compared\n * by identity (device + inode), not by spelling. */\nexport function isNonProjectRoot(dir: string = process.cwd()): boolean {\n return nonProjectRootKind(dir) !== null;\n}\n\n/**\n * Exit 1 with a clear cd instruction if cwd cannot be a project root.\n * Call at the top of commands that create or interview project.faf.\n */\nexport function assertProjectCwd(dir: string = process.cwd(), command = 'faf'): void {\n const kind = nonProjectRootKind(dir);\n if (kind === null) {return;}\n\n const where = kind === 'home' ? 'your home directory (~)' : 'the filesystem root';\n console.error(`${fafCyan('faf')}: ${where} is not a project.`);\n console.error('');\n console.error(` ${bold('cd')} into a real repo (or any folder you mean to own), then run again:`);\n console.error(dim(` cd /path/to/your-project`));\n console.error(dim(` ${command}`));\n console.error('');\n console.error(dim(' Home will never be a git repo for this. project.faf belongs with the code.'));\n process.exit(1);\n}\n",
|
|
90
90
|
"/**\n * Context-drift engine — SINGLE SOURCE.\n *\n * A pure, snapshot comparison: given a `project.faf` and its directory, report\n * the mtime relationship between the .faf and each AI-context file it feeds\n * (CLAUDE.md, AGENTS.md, .cursorrules, GEMINI.md). A target NEWER than the .faf\n * has drifted — the human edited the context file and the DNA hasn't caught up.\n *\n * No console, no ANSI, no process.exit. The CLI `faf drift` renders the human\n * table on top of this; `faf drift --json` emits this shape with a metadata\n * header; the VS Code extension imports `computeDrift` directly (faf-cli as a\n * library, never a shell-out). One comparison, every consumer.\n */\n\nimport { existsSync, statSync } from 'fs';\nimport { dirname, join } from 'path';\n\n/** AI-context files the .faf feeds — the drift targets, in report order. */\nexport const CONTEXT_FILES = ['CLAUDE.md', 'AGENTS.md', '.cursorrules', 'GEMINI.md'];\n\n/** mtime window (ms) inside which a target counts as in sync with the .faf. */\nexport const DRIFT_TOLERANCE_MS = 1000;\n\n/** 'newer' = target newer than the .faf → needs sync. */\nexport type DriftStatus = 'newer' | 'older' | 'in-sync' | 'missing';\n\nexport interface DriftTarget {\n /** Context-file name, e.g. 'CLAUDE.md'. */\n file: string;\n /** Whether the file exists alongside the .faf. */\n exists: boolean;\n /** File mtime in epoch ms, or null when missing. */\n mtime_ms: number | null;\n /** 'newer' = target newer than the .faf → needs sync. */\n status: DriftStatus;\n /** mtime_ms - source_mtime_ms, or null when missing. */\n delta_ms: number | null;\n}\n\nexport interface DriftReport {\n /** The `project.faf` path compared against. */\n source: string;\n /** .faf mtime in epoch ms. */\n source_mtime_ms: number;\n targets: DriftTarget[];\n /** Count of targets with status 'newer' or 'older'. */\n drifted: number;\n /** Count of targets with status 'in-sync'. */\n in_sync: number;\n /** Count of targets with status 'missing'. */\n missing: number;\n}\n\n/**\n * Compare a `project.faf` against its AI-context files by mtime.\n *\n * @param fafPath path to `project.faf`\n * @param dir directory holding the context files; defaults to the .faf's\n * own directory. Never `process.cwd()` — the CLI passes it\n * explicitly, and a library caller (the VS Code extension)\n * passes the .faf's directory, which for a monorepo sub-package\n * is the package dir, not the workspace root.\n */\nexport function computeDrift(fafPath: string, dir: string = dirname(fafPath)): DriftReport {\n const sourceMtimeMs = statSync(fafPath).mtimeMs;\n\n const targets: DriftTarget[] = CONTEXT_FILES.map((file) => {\n const path = join(dir, file);\n if (!existsSync(path)) {\n return { file, exists: false, mtime_ms: null, status: 'missing', delta_ms: null };\n }\n\n const mtimeMs = statSync(path).mtimeMs;\n const deltaMs = mtimeMs - sourceMtimeMs;\n let status: DriftStatus;\n if (Math.abs(deltaMs) < DRIFT_TOLERANCE_MS) {\n status = 'in-sync';\n } else if (deltaMs > 0) {\n status = 'newer';\n } else {\n status = 'older';\n }\n\n return { file, exists: true, mtime_ms: mtimeMs, status, delta_ms: deltaMs };\n });\n\n return {\n source: fafPath,\n source_mtime_ms: sourceMtimeMs,\n targets,\n drifted: targets.filter((t) => t.status === 'newer' || t.status === 'older').length,\n in_sync: targets.filter((t) => t.status === 'in-sync').length,\n missing: targets.filter((t) => t.status === 'missing').length,\n };\n}\n",
|
|
91
|
-
"import { join } from 'path';\nimport { deprecate } from 'node:util';\nimport type { FafData, ScoreResult } from '../core/types.js';\nimport { FAF_HEX } from '../ui/colors.js';\nimport { writeRendered } from '../core/render-hash.js';\n\n/**\n * project.html — the visual render of project.faf.\n *\n * A \"show-me\" for .faf: rendered from the current project.faf, opens in any\n * browser, zero deps, self-contained. NOT a format, NOT a mime-type, NOT an\n * IANA application — a derived view that registers nothing and adds zero spec\n * surface. The inverse of style-source.html (that one is authored; this is\n * rendered). Deterministic on purpose: no timestamps, so a re-run only\n * diffs when project.faf actually changed (versioned like .fafb).\n *\n * Humans like visuals. We gave them one.\n */\n\n// Tier glyph + accent. Glyphs = canonical tier symbols (core/tiers.ts).\n// BRAND colors DERIVE from ui/colors.ts FAF_HEX (single source — change there,\n// propagates to CLI + here). STATUS: warning/error hex for HTML (CLI has no\n// status band colors). Two registers: brand (orange Trophy/Gold · cyan Silver ·\n// deep-cyan Bronze)\n// + status (HTML affords color the CLI can't). Green #00BF63 reserved for the\n// GO/✅ all-pass state, never a tier band. Neutral = theme grey, not brand.\nconst ORANGE = FAF_HEX.orange; // brand — derived\nconst CYAN = FAF_HEX.cyan; // brand — derived (Silver)\nconst CYAN_DEEP = FAF_HEX.cyanDeep; // brand — derived (Bronze: same lane, one rung down)\nconst WARNING = '#FF9500'; // --faf-warning (status: caution)\nconst ERROR = '#FF3B30'; // --faf-error (status: danger)\nconst NEUTRAL_BRIGHT = '#E6EDF3'; // theme grey — \"good, not done, no alarm\"\nconst NEUTRAL_DIM = '#6E7681'; // theme grey — empty\nconst TIER_VIS: Record<string, { glyph: string; color: string }> = {\n TROPHY: { glyph: '✪', color: ORANGE },\n GOLD: { glyph: '★', color: ORANGE },\n SILVER: { glyph: '◆', color: CYAN },\n BRONZE: { glyph: '◇', color: CYAN_DEEP },\n GREEN: { glyph: '●', color: NEUTRAL_BRIGHT },\n YELLOW: { glyph: '●', color: WARNING },\n RED: { glyph: '○', color: ERROR },\n WHITE: { glyph: '♡', color: NEUTRAL_DIM },\n};\n\n/** HTML-escape — project.faf content is arbitrary; never inject raw. */\nfunction esc(v: unknown): string {\n return String(v ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nconst SIX_W = ['who', 'what', 'why', 'where', 'when', 'how'] as const;\n\nfunction rows(entries: [string, unknown][]): string {\n return entries\n .filter(([, v]) => v !== undefined && v !== null && String(v).trim() !== '')\n .map(\n ([k, v]) =>\n `<div class=\"row\"><div class=\"k\">${esc(k)}</div><div class=\"v\">${esc(v)}</div></div>`,\n )\n .join('\\n');\n}\n\n/** Render project.faf data + its score into a self-contained HTML string. */\nexport function renderProjectHtml(\n data: FafData,\n result: ScoreResult,\n fafPath = 'project.faf',\n): string {\n const name = esc(data.project?.name ?? 'Project');\n const tierName = result.tier?.name ?? 'WHITE';\n const vis = TIER_VIS[tierName] ?? TIER_VIS.WHITE;\n const scoreText = result.inherited\n ? result.represents\n ? `inherited from ${esc(result.represents)}`\n : 'inherited'\n : `${result.score}%`;\n // Trophy = earned (not an About-repo inherited 100 — that one displays, doesn't earn).\n const isTrophy = tierName === 'TROPHY' && !result.inherited;\n\n // 6 W's first, in canonical order, then any other human_context keys.\n const hc = data.human_context ?? {};\n const sixW: [string, unknown][] = SIX_W.map((w) => [w, hc[w]]);\n const otherHc = Object.entries(hc).filter(\n ([k]) => !SIX_W.includes(k as (typeof SIX_W)[number]),\n );\n\n const projectMeta: [string, unknown][] = [\n ['goal', data.project?.goal],\n ['main_language', data.project?.main_language],\n ['type', data.project?.type],\n ['framework', (data.project as Record<string, unknown> | undefined)?.framework],\n ['faf_version', data.faf_version],\n ];\n\n const stackEntries = Object.entries(data.stack ?? {});\n const stackActive = stackEntries.filter(\n ([, v]) => v && v !== 'slotignored' && String(v).trim() !== '',\n );\n const stackIgnored = stackEntries.filter(([, v]) => v === 'slotignored').length;\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>${name} — project.faf</title>\n<meta name=\"description\" content=\"Visual render of project.faf. Authored by faf — humans like visuals, we gave them one.\">\n<meta name=\"robots\" content=\"index,follow\">\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;background:#0a0a0a;color:#e6edf3;line-height:1.55;padding:48px 20px}\n.wrap{max-width:880px;margin:0 auto}\n.bar{height:3px;border-radius:2px;background:linear-gradient(90deg,transparent,${vis.color},transparent);margin-bottom:40px}\nheader{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;margin-bottom:8px}\nh1{font-size:2.2rem;font-weight:800;letter-spacing:-1px}\n.badge{font-size:1.05rem;font-weight:800;color:${vis.color};white-space:nowrap}\n.score{font-size:1.05rem;font-weight:700;color:#8b949e}\n.eyebrow{font-size:11px;font-weight:700;letter-spacing:2px;text-transform:uppercase;color:#6e7681;margin-bottom:36px}\nsection{margin-bottom:34px}\nh2{font-size:12px;font-weight:700;letter-spacing:2px;text-transform:uppercase;color:${vis.color};margin-bottom:14px;padding-bottom:6px;border-bottom:1px solid rgba(255,255,255,.07)}\n.row{display:flex;gap:18px;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.04)}\n.k{flex:0 0 150px;color:#8b949e;font-size:.9rem;text-transform:capitalize}\n.v{flex:1;color:#e6edf3;font-size:.95rem;word-break:break-word}\n.meter{height:8px;border-radius:4px;background:rgba(255,255,255,.06);overflow:hidden;margin:6px 0 10px}\n.meter span{display:block;height:100%;background:${vis.color};width:${Math.max(0, Math.min(100, result.score))}%}\n.award{font-size:.95rem}\n.statline{margin-bottom:32px}\n.awd-pre{color:#6E7681}\n.awd-win{color:#FFFFFF;font-weight:700}\n.muted{color:#6e7681;font-size:.85rem}\nfooter{margin-top:48px;padding-top:20px;border-top:1px solid rgba(255,255,255,.07);font-size:.82rem;color:#6e7681}\nfooter strong{color:#e6edf3}\n@media(max-width:560px){.row{flex-direction:column;gap:2px}.k{flex:none}}\n</style>\n</head>\n<body>\n<div class=\"wrap\">\n<div class=\"bar\"></div>\n<div class=\"eyebrow\">project.faf · visual render</div>\n<header>\n<h1>${name}</h1>\n<span class=\"badge\">${vis.glyph} ${esc(tierName)}</span>\n<span class=\"score\">${scoreText}</span>\n</header>\n<div class=\"meter\"><span></span></div>\n${\n isTrophy\n ? '<p class=\"award statline\"><span class=\"awd-pre\">✅ All Required slots filled.</span> <span class=\"awd-win\">100% Trophy ✪ Awarded</span></p>'\n : `<p class=\"muted statline\">${result.populated}/${result.active} slots populated · ${result.total} total${stackIgnored ? ` · ${stackIgnored} N/A` : ''}</p>`\n}\n\n<section>\n<h2>The 6 W's</h2>\n${rows(sixW) || '<p class=\"muted\">No human_context yet.</p>'}\n${otherHc.length ? rows(otherHc) : ''}\n</section>\n\n<section>\n<h2>Project</h2>\n${rows(projectMeta) || '<p class=\"muted\">—</p>'}\n</section>\n\n<section>\n<h2>Stack</h2>\n${\n stackActive.length\n ? rows(stackActive)\n : '<p class=\"muted\">No active stack slots.</p>'\n}\n</section>\n\n<footer>\nRendered on-demand from your current <strong>${esc(fafPath)}</strong><br>\n<strong>Humans like visuals. <span style=\"color:#00D4D4\">We gave them one.</span></strong>\n</footer>\n</div>\n</body>\n</html>\n`;\n}\n\n/** The start of faf's mark in every project.html it renders: the description\n * line (`<meta name=\"description\" content=\"Visual render of project.faf. …\n * by faf — …\">`). */\nconst HTML_MARK = '<meta name=\"description\" content=\"Visual render of project.faf.';\n\n/** True when `bytes` are a project.html faf rendered: a line that is faf's\n * description meta (every faf release has written it). */\nexport function hasProjectHtmlMark(bytes: Uint8Array): boolean {\n return new TextDecoder()\n .decode(bytes)\n .split(/\\r?\\n/)\n .some(line => line.trim().startsWith(HTML_MARK) && line.includes(' by faf'));\n}\n\n/** Options for {@link writeProjectHtml}. */\nexport interface ProjectHtmlWriteOptions {\n /** Replace a project.html faf cannot prove it wrote — no faf mark, edited\n * since faf wrote it, or from before 7.13 — the explicit overwrite\n * (`--force`). Default: it is refused and left as it is. */\n force?: boolean;\n}\n\n/** Write project.html beside project.faf (repo root) — atomically, and never\n * through a link that leaves `dir` or dangles (SafePathError). The page\n * carries faf's render hash (`<meta name=\"faf-render\" content=\"sha256:…\">`,\n * the hash of the page without that line). A project.html already there is\n * replaced only when it is byte for byte what faf last wrote (its hash still\n * fits); a page edited since, a hand-written page, or a page from before 7.13\n * that is not exactly faf's render of `data` is refused (SafePathError\n * `not-owned`) and left byte for byte, unless `force`. */\nexport function writeProjectHtml(\n dir: string,\n data: FafData,\n result: ScoreResult,\n fafPath = 'project.faf',\n write: ProjectHtmlWriteOptions = {},\n): void {\n writeRendered(join(dir, 'project.html'), renderProjectHtml(data, result, fafPath), {\n root: dir,\n format: 'html',\n hasMark: hasProjectHtmlMark,\n mark: \"faf mark (the `Visual render of project.faf` description line)\",\n force: write.force,\n });\n}\n\n/** @deprecated Use {@link renderProjectHtml}. Removed in the next major. */\nexport const generateProjectHtml = deprecate(\n renderProjectHtml,\n 'faf-cli: generateProjectHtml is deprecated, use renderProjectHtml',\n 'FAF0001',\n);\n",
|
|
91
|
+
"import { join } from 'path';\nimport { deprecate } from 'node:util';\nimport type { FafData, ScoreResult } from '../core/types.js';\nimport { FAF_HEX } from '../ui/colors.js';\nimport { writeRendered } from '../core/render-hash.js';\n\n/**\n * project.html — the visual render of project.faf.\n *\n * A \"show-me\" for .faf: rendered from the current project.faf, opens in any\n * browser, zero deps, self-contained. NOT a format, NOT a mime-type, NOT an\n * IANA application — a derived view that registers nothing and adds zero spec\n * surface. The inverse of style-source.html (that one is authored; this is\n * rendered). Deterministic on purpose: no timestamps, so a re-run only\n * diffs when project.faf actually changed (versioned like .fafb).\n *\n * Humans like visuals. We gave them one.\n */\n\n// Tier glyph + accent. Glyphs = canonical tier symbols (core/tiers.ts).\n// BRAND colors DERIVE from ui/colors.ts FAF_HEX (single source — change there,\n// propagates to CLI + here). STATUS: warning/error hex for HTML (CLI has no\n// status band colors). Two registers: brand (orange Trophy/Gold · cyan Silver ·\n// deep-cyan Bronze)\n// + status (HTML affords color the CLI can't). Green #00BF63 reserved for the\n// GO/✅ all-pass state, never a tier band. Neutral = theme grey, not brand.\nconst ORANGE = FAF_HEX.orange; // brand — derived\nconst CYAN = FAF_HEX.cyan; // brand — derived (Silver)\nconst CYAN_DEEP = FAF_HEX.cyanDeep; // brand — derived (Bronze: same lane, one rung down)\nconst WARNING = '#FF9500'; // --faf-warning (status: caution)\nconst ERROR = '#FF3B30'; // --faf-error (status: danger)\nconst NEUTRAL_BRIGHT = '#E6EDF3'; // theme grey — \"good, not done, no alarm\"\nconst NEUTRAL_DIM = '#6E7681'; // theme grey — empty\nconst TIER_VIS: Record<string, { glyph: string; color: string }> = {\n TROPHY: { glyph: '✪', color: ORANGE },\n GOLD: { glyph: '★', color: ORANGE },\n SILVER: { glyph: '◆', color: CYAN },\n BRONZE: { glyph: '◇', color: CYAN_DEEP },\n GREEN: { glyph: '●', color: NEUTRAL_BRIGHT },\n YELLOW: { glyph: '●', color: WARNING },\n RED: { glyph: '○', color: ERROR },\n WHITE: { glyph: '♡', color: NEUTRAL_DIM },\n};\n\n/** HTML-escape — project.faf content is arbitrary; never inject raw. */\nfunction esc(v: unknown): string {\n return String(v ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nconst SIX_W = ['who', 'what', 'why', 'where', 'when', 'how'] as const;\n\nfunction rows(entries: [string, unknown][]): string {\n return entries\n .filter(([, v]) => v !== undefined && v !== null && String(v).trim() !== '')\n .map(\n ([k, v]) =>\n `<div class=\"row\"><div class=\"k\">${esc(k)}</div><div class=\"v\">${esc(v)}</div></div>`,\n )\n .join('\\n');\n}\n\n/** Render project.faf data + its score into a self-contained HTML string. */\nexport function renderProjectHtml(\n data: FafData,\n result: ScoreResult,\n fafPath = 'project.faf',\n): string {\n const name = esc(data.project?.name ?? 'Project');\n const tierName = result.tier?.name ?? 'WHITE';\n const vis = TIER_VIS[tierName] ?? TIER_VIS.WHITE;\n const scoreText = result.inherited\n ? result.represents\n ? `inherited from ${esc(result.represents)}`\n : 'inherited'\n : `${result.score}%`;\n // Trophy = earned (not an About-repo inherited 100 — that one displays, doesn't earn).\n const isTrophy = tierName === 'TROPHY' && !result.inherited;\n\n // 6 W's first, in canonical order, then any other human_context keys.\n const hc = data.human_context ?? {};\n const sixW: [string, unknown][] = SIX_W.map((w) => [w, hc[w]]);\n const otherHc = Object.entries(hc).filter(\n ([k]) => !SIX_W.includes(k as (typeof SIX_W)[number]),\n );\n\n const projectMeta: [string, unknown][] = [\n ['goal', data.project?.goal],\n ['main_language', data.project?.main_language],\n ['type', data.project?.type],\n ['framework', (data.project as Record<string, unknown> | undefined)?.framework],\n ['faf_version', data.faf_version],\n ];\n\n const stackEntries = Object.entries(data.stack ?? {});\n const stackActive = stackEntries.filter(\n ([, v]) => v && v !== 'slotignored' && String(v).trim() !== '',\n );\n const stackIgnored = stackEntries.filter(([, v]) => v === 'slotignored').length;\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>${name} — project.faf</title>\n<meta name=\"description\" content=\"Visual render of project.faf. Authored by faf — humans like visuals, we gave them one.\">\n<meta name=\"robots\" content=\"index,follow\">\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;background:#0a0a0a;color:#e6edf3;line-height:1.55;padding:48px 20px}\n.wrap{max-width:880px;margin:0 auto}\n.bar{height:3px;border-radius:2px;background:linear-gradient(90deg,transparent,${vis.color},transparent);margin-bottom:40px}\nheader{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;margin-bottom:8px}\nh1{font-size:2.2rem;font-weight:800;letter-spacing:-1px}\n.badge{font-size:1.05rem;font-weight:800;color:${vis.color};white-space:nowrap}\n.score{font-size:1.05rem;font-weight:700;color:#8b949e}\n.eyebrow{font-size:11px;font-weight:700;letter-spacing:2px;text-transform:uppercase;color:#6e7681;margin-bottom:36px}\nsection{margin-bottom:34px}\nh2{font-size:12px;font-weight:700;letter-spacing:2px;text-transform:uppercase;color:${vis.color};margin-bottom:14px;padding-bottom:6px;border-bottom:1px solid rgba(255,255,255,.07)}\n.row{display:flex;gap:18px;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.04)}\n.k{flex:0 0 150px;color:#8b949e;font-size:.9rem;text-transform:capitalize}\n.v{flex:1;color:#e6edf3;font-size:.95rem;word-break:break-word}\n.meter{height:8px;border-radius:4px;background:rgba(255,255,255,.06);overflow:hidden;margin:6px 0 10px}\n.meter span{display:block;height:100%;background:${vis.color};width:${Math.max(0, Math.min(100, result.score))}%}\n.award{font-size:.95rem}\n.statline{margin-bottom:32px}\n.awd-pre{color:#6E7681}\n.awd-win{color:#FFFFFF;font-weight:700}\n.muted{color:#6e7681;font-size:.85rem}\nfooter{margin-top:48px;padding-top:20px;border-top:1px solid rgba(255,255,255,.07);font-size:.82rem;color:#6e7681}\nfooter strong{color:#e6edf3}\n@media(max-width:560px){.row{flex-direction:column;gap:2px}.k{flex:none}}\n</style>\n</head>\n<body>\n<div class=\"wrap\">\n<div class=\"bar\"></div>\n<div class=\"eyebrow\">project.faf · visual render</div>\n<header>\n<h1>${name}</h1>\n<span class=\"badge\">${vis.glyph} ${esc(tierName)}</span>\n<span class=\"score\">${scoreText}</span>\n</header>\n<div class=\"meter\"><span></span></div>\n${\n isTrophy\n ? '<p class=\"award statline\"><span class=\"awd-pre\">✅ All Required slots filled.</span> <span class=\"awd-win\">100% Trophy ✪ Awarded</span></p>'\n : `<p class=\"muted statline\">${result.populated}/${result.active} slots populated · ${result.total} total${stackIgnored ? ` · ${stackIgnored} slotignored` : ''}</p>`\n}\n\n<section>\n<h2>The 6 W's</h2>\n${rows(sixW) || '<p class=\"muted\">No human_context yet.</p>'}\n${otherHc.length ? rows(otherHc) : ''}\n</section>\n\n<section>\n<h2>Project</h2>\n${rows(projectMeta) || '<p class=\"muted\">—</p>'}\n</section>\n\n<section>\n<h2>Stack</h2>\n${\n stackActive.length\n ? rows(stackActive)\n : '<p class=\"muted\">No active stack slots.</p>'\n}\n</section>\n\n<footer>\nRendered on-demand from your current <strong>${esc(fafPath)}</strong><br>\n<strong>Humans like visuals. <span style=\"color:#00D4D4\">We gave them one.</span></strong>\n</footer>\n</div>\n</body>\n</html>\n`;\n}\n\n/** The start of faf's mark in every project.html it renders: the description\n * line (`<meta name=\"description\" content=\"Visual render of project.faf. …\n * by faf — …\">`). */\nconst HTML_MARK = '<meta name=\"description\" content=\"Visual render of project.faf.';\n\n/** True when `bytes` are a project.html faf rendered: a line that is faf's\n * description meta (every faf release has written it). */\nexport function hasProjectHtmlMark(bytes: Uint8Array): boolean {\n return new TextDecoder()\n .decode(bytes)\n .split(/\\r?\\n/)\n .some(line => line.trim().startsWith(HTML_MARK) && line.includes(' by faf'));\n}\n\n/** Options for {@link writeProjectHtml}. */\nexport interface ProjectHtmlWriteOptions {\n /** Replace a project.html faf cannot prove it wrote — no faf mark, edited\n * since faf wrote it, or from before 7.13 — the explicit overwrite\n * (`--force`). Default: it is refused and left as it is. */\n force?: boolean;\n}\n\n/** Write project.html beside project.faf (repo root) — atomically, and never\n * through a link that leaves `dir` or dangles (SafePathError). The page\n * carries faf's render hash (`<meta name=\"faf-render\" content=\"sha256:…\">`,\n * the hash of the page without that line). A project.html already there is\n * replaced only when it is byte for byte what faf last wrote (its hash still\n * fits); a page edited since, a hand-written page, or a page from before 7.13\n * that is not exactly faf's render of `data` is refused (SafePathError\n * `not-owned`) and left byte for byte, unless `force`. */\nexport function writeProjectHtml(\n dir: string,\n data: FafData,\n result: ScoreResult,\n fafPath = 'project.faf',\n write: ProjectHtmlWriteOptions = {},\n): void {\n writeRendered(join(dir, 'project.html'), renderProjectHtml(data, result, fafPath), {\n root: dir,\n format: 'html',\n hasMark: hasProjectHtmlMark,\n mark: \"faf mark (the `Visual render of project.faf` description line)\",\n force: write.force,\n });\n}\n\n/** @deprecated Use {@link renderProjectHtml}. Removed in the next major. */\nexport const generateProjectHtml = deprecate(\n renderProjectHtml,\n 'faf-cli: generateProjectHtml is deprecated, use renderProjectHtml',\n 'FAF0001',\n);\n",
|
|
92
92
|
"/**\n * Whole-file ownership — faf replaces a whole file it renders (project.html,\n * the Server Card, the A2A card, `faf server-card --out`, a `faf taf --output`\n * snapshot, a `faf decompile --output` file) only when the file is byte for\n * byte what faf last wrote there.\n *\n * A mark (`Visual render of project.faf`, `_meta[\"one.faf/context\"]`) only\n * shows that faf wrote the file once: a hand edit made after that — a section\n * added to the page, a `tools` list or a `remotes` endpoint added to the card —\n * still carries the mark, and a rewrite would lose it. So every whole file faf\n * renders records a hash of its own content:\n *\n * - project.html: a `<meta name=\"faf-render\" content=\"sha256:…\">` line, the\n * hash of the document without that line;\n * - a JSON file: `_meta[\"one.faf/render\"] = \"sha256:…\"`, the hash of the\n * text without that key. The MCP Server Card and the registry server.json\n * schemas leave `_meta` open for namespaced keys; the A2A Agent Card has no\n * `_meta`, and the A2A spec says implementations SHOULD ignore a field they\n * do not know (the official Python and Go SDKs do).\n *\n * On a rewrite faf recomputes the hash. A match means faf owns every byte, so\n * it replaces the file. A mismatch means the file was edited since faf wrote\n * it: faf refuses in one line and leaves it byte for byte. A file with faf's\n * mark but no hash was written before 7.13: faf takes it as its own only when\n * it is exactly faf's render of the current project.faf (and then leaves it,\n * as there is nothing to change), else refuses once. `force` (`--force`)\n * replaces any of these.\n *\n * Line endings: a checkout with git's `core.autocrlf` ends every line of a\n * file faf wrote with CRLF. A file whose only difference from faf's text is\n * that — every line ending CRLF — is still faf's: the hash is compared with\n * the CRLF line ends read as LF, and the new render is written with CRLF.\n */\nimport { createHash } from 'crypto';\nimport { resolve } from 'path';\nimport { SafePathError, readBytesIfPresent, resolveInside, safeWriteFile } from './safe-write.js';\nimport { editJsonText, locateJsonKey, removeJsonKey } from './json-edit.js';\n\n/** The `_meta` key a JSON file faf renders carries its render hash under. */\nexport const RENDER_KEY = 'one.faf/render';\n\n/** `sha256:<hex>` of `text` (UTF-8). */\nexport function renderHash(text: string): string {\n return `sha256:${createHash('sha256').update(text, 'utf8').digest('hex')}`;\n}\n\nconst HASH = /^sha256:[0-9a-f]{64}$/;\n\n/** How faf records its hash in a file: an HTML meta line, or a JSON `_meta` key. */\nexport type RenderFormat = 'html' | 'json';\n\n// ── project.html ───────────────────────────────────────────────────────────────\n\nconst HTML_LINE = /^<meta name=\"faf-render\" content=\"(sha256:[0-9a-f]{64})\">$/;\n/** Any line that starts like faf's render line: one that is not exactly faf's\n * form (a trailing space, an upper-case hash) is faf's line, edited. */\nconst HTML_LINE_START = '<meta name=\"faf-render\"';\nconst HTML_ANCHOR = '<meta name=\"description\" content=\"Visual render of project.faf.';\n\n/** `doc` with faf's render line added after its description line (or at the top). */\nfunction stampHtml(doc: string): string {\n const lines = doc.split(/(?<=\\n)/);\n const at = lines.findIndex(l => l.startsWith(HTML_ANCHOR));\n lines.splice(at + 1, 0, `<meta name=\"faf-render\" content=\"${renderHash(doc)}\">\\n`);\n return lines.join('');\n}\n\n/** The hash a page carries and the page without its render line; 'many'\n * when it has more than one, or a line that starts like faf's render line\n * but is not exactly its form (edited since faf wrote it); null when it has\n * none. */\nfunction splitHtml(text: string): { hash: string; canonical: string } | 'many' | null {\n const lines = text.split(/(?<=\\n)/);\n const found: { at: number; hash: string }[] = [];\n let edited = false;\n lines.forEach((l, at) => {\n const bare = l.replace(/\\r?\\n$/, '');\n const m = HTML_LINE.exec(bare);\n if (m) {\n found.push({ at, hash: m[1] });\n } else if (bare.startsWith(HTML_LINE_START)) {\n edited = true;\n }\n });\n if (found.length === 0 && !edited) {return null;}\n if (found.length !== 1 || edited) {return 'many';}\n lines.splice(found[0].at, 1);\n return { hash: found[0].hash, canonical: lines.join('') };\n}\n\n// ── JSON ───────────────────────────────────────────────────────────────────────\n\nconst PATH = ['_meta', RENDER_KEY] as const;\n\n/** `text` with faf's render key added to `_meta` (made when missing) — a\n * text edit, so every other byte stays. */\nfunction stampJson(text: string): string {\n return editJsonText(text, { _meta: { [RENDER_KEY]: renderHash(text) } }).text;\n}\n\n/** `text` without a render key (with a `_meta` left empty by that, removed). */\nfunction withoutJsonKey(text: string): string {\n try {\n return removeJsonKey(text, PATH, { dropEmptyParent: true }) ?? text;\n } catch {\n return text;\n }\n}\n\n/** The hash a JSON file carries and its text without that key; 'many' when\n * the key (or `_meta`) is there more than once, or is not a hash; null when\n * it has none (or the text is not a JSON object). */\nfunction splitJson(text: string): { hash: string; canonical: string } | 'many' | null {\n let found: { count: number; value?: unknown };\n try {\n found = locateJsonKey(text, PATH);\n } catch {\n return null; // not a JSON object (or nested past what the reader takes)\n }\n if (found.count === 0) {return null;}\n if (found.count > 1 || typeof found.value !== 'string' || !HASH.test(found.value)) {return 'many';}\n const canonical = removeJsonKey(text, PATH, { dropEmptyParent: true });\n return canonical === null ? 'many' : { hash: found.value, canonical };\n}\n\n/** faf's canonical render (no render hash in it) with the hash added. */\nfunction stamp(format: RenderFormat, canonical: string): string {\n return format === 'html' ? stampHtml(canonical) : stampJson(canonical);\n}\n\n/** A render with any render hash already in it taken out — a render hash in a\n * file faf edits (a server.json copied from an earlier --out) is never hashed. */\nfunction canonicalOf(format: RenderFormat, render: string): string {\n if (format === 'json') {return withoutJsonKey(render);}\n const split = splitHtml(render);\n return split === null || split === 'many' ? render : split.canonical;\n}\n\n/**\n * Whether the bytes of a whole file faf renders are exactly what faf wrote:\n * `match` — they carry faf's render hash, the hash is that of the rest of the\n * file, and the file is laid out exactly as faf writes it; `mismatch` — they\n * carry a render hash that no longer fits, or (project.html) a render line\n * that is not exactly faf's form (the file was edited since faf wrote it);\n * `none` — they carry no render hash (a file from before 7.13, or one faf\n * never wrote). The bytes are taken as they are: see {@link writeRendered}\n * for a file git checked out with CRLF line ends.\n */\nexport function renderOwnership(bytes: Uint8Array, format: RenderFormat): 'match' | 'mismatch' | 'none' {\n const text = new TextDecoder().decode(bytes);\n const split = format === 'html' ? splitHtml(text) : splitJson(text);\n if (split === null) {return 'none';}\n if (split === 'many') {return 'mismatch';}\n const exact = Buffer.from(text, 'utf-8').equals(Buffer.from(bytes)); // valid UTF-8, nothing lost in decoding\n return exact && split.hash === renderHash(split.canonical) && stamp(format, split.canonical) === text ? 'match' : 'mismatch';\n}\n\n/** Options for {@link writeRendered}. */\nexport interface RenderedWriteOptions {\n /** The project folder the write must stay inside. */\n root: string;\n /** How the hash is recorded: `html` (project.html) or `json` (the cards, server.json, a snapshot). */\n format: RenderFormat;\n /** True when the bytes carry faf's older mark — a file faf wrote before render hashes. */\n hasMark: (bytes: Buffer) => boolean;\n /** That mark in words, for the refusal of a file without it. */\n mark: string;\n /** Replace the file whatever it holds — the explicit overwrite (`--force`). */\n force?: boolean;\n}\n\n/** What {@link writeRendered} did. */\nexport type RenderedResult = 'created' | 'updated' | 'unchanged';\n\n/** `bytes` with each CRLF line end read as LF, when every line of the file\n * ends CRLF (git's `core.autocrlf` checkout) and the bytes are UTF-8; null\n * otherwise (LF line ends, mixed ones, or none). */\nfunction crlfAsLf(bytes: Buffer): Buffer | null {\n const text = new TextDecoder().decode(bytes);\n if (!text.includes('\\r\\n') || /(?:^|[^\\r])\\n/.test(text) || !Buffer.from(text, 'utf-8').equals(bytes)) {return null;}\n return Buffer.from(text.replace(/\\r\\n/g, '\\n'), 'utf-8');\n}\n\n/** Ownership of the bytes on disk, or of their LF reading (`lf`) when only\n * the CRLF line ends keep them from being faf's. */\nfunction ownershipOf(existing: Buffer, lf: Buffer | null, format: RenderFormat): 'match' | 'mismatch' | 'none' {\n const raw = renderOwnership(existing, format);\n return raw !== 'match' && lf !== null && renderOwnership(lf, format) === 'match' ? 'match' : raw;\n}\n\n/**\n * Write the whole file faf renders at `path`: `render` (faf's text, without a\n * render hash) with faf's render hash added. The link rules and the atomic,\n * compare-before-rename write are safe-write's. A file already there is\n * replaced only when {@link renderOwnership} says `match`; with a `mismatch`,\n * or with no hash, it is refused (SafePathError `not-owned`) and left byte for\n * byte:\n * - \"<file> was edited since faf wrote it — faf left it unchanged. Use --force to replace it.\"\n * - with faf's older mark (written before 7.13): exactly faf's `render` →\n * nothing to change (`unchanged`); otherwise \"<file> has no faf render hash\n * (written before 7.13), so faf cannot tell whether it was edited — faf\n * left it unchanged. Use --force once to replace it; after that faf\n * recognises its own output.\"\n * - without the mark: \"<file> has no <mark>, so faf did not write it — faf left it unchanged.\"\n * `force` replaces it anyway. A file already holding exactly the new bytes is\n * not written again. A file whose every line ends CRLF (git's\n * `core.autocrlf`) is judged with those line ends read as LF, and is written\n * back with CRLF line ends.\n */\nexport function writeRendered(path: string, render: string, opts: RenderedWriteOptions): { path: string; result: RenderedResult } {\n const full = resolve(path);\n const target = resolveInside(opts.root, full);\n const canonical = canonicalOf(opts.format, render);\n const next = stamp(opts.format, canonical);\n const existing = readBytesIfPresent(target);\n if (existing === null) {\n safeWriteFile(target, next, { root: opts.root, expect: null });\n return { path: target, result: 'created' };\n }\n if (existing.equals(Buffer.from(next, 'utf-8'))) {return { path: target, result: 'unchanged' };}\n const lf = crlfAsLf(existing);\n const out = lf === null ? next : next.replace(/\\r?\\n/g, '\\r\\n');\n if (lf !== null && existing.equals(Buffer.from(out, 'utf-8'))) {return { path: target, result: 'unchanged' };}\n if (opts.force !== true && !ownedOrRefused(full, existing, lf, canonical, opts)) {return { path: target, result: 'unchanged' };}\n safeWriteFile(target, out, { root: opts.root, expect: existing });\n return { path: target, result: 'updated' };\n}\n\n/** For a file already there (`existing`; `lf`, its LF reading when every\n * line ends CRLF): true when faf may replace it (its render hash matches);\n * false when it is faf's pre-7.13 render of this very content (nothing to\n * change); otherwise a SafePathError `not-owned` — see {@link writeRendered}. */\nfunction ownedOrRefused(full: string, existing: Buffer, lf: Buffer | null, canonical: string, opts: RenderedWriteOptions): boolean {\n const state = ownershipOf(existing, lf, opts.format);\n if (state === 'match') {return true;}\n if (state === 'mismatch') {\n throw new SafePathError('not-owned', full, `${full} was edited since faf wrote it — faf left it unchanged. Use --force to replace it.`, { onWrite: true });\n }\n if (!opts.hasMark(existing)) {\n throw new SafePathError('not-owned', full, `${full} has no ${opts.mark}, so faf did not write it — faf left it unchanged.`, { onWrite: true });\n }\n const exact = Buffer.from(canonical, 'utf-8');\n if (existing.equals(exact) || (lf !== null && lf.equals(exact))) {return false;}\n throw new SafePathError(\n 'not-owned',\n full,\n `${full} has no faf render hash (written before 7.13), so faf cannot tell whether it was edited — faf left it unchanged. Use --force once to replace it; after that faf recognises its own output.`,\n { onWrite: true },\n );\n}\n",
|
|
93
93
|
"/**\n * Text-preserving JSON edits: change the value of a key, or add a key that is\n * missing, and keep every other byte of the file — key order, spacing, a\n * 20-digit integer, an array written on one line. faf uses it for the one\n * JSON file it shares with its owner, a registry `server.json`, where faf owns\n * only the identity keys (`faf server-card`, `faf cards --target registry`).\n *\n * A patch is a plain object. For each key: a plain-object value is a folder to\n * go into (the file's value must be an object too); any other value replaces\n * the value's text when it differs, or is added when the key is missing.\n * Nothing is ever deleted, and `undefined` is skipped. When the file cannot be\n * edited that way — not valid JSON, not an object, a key it repeats on the way,\n * a value faf would have to replace to go into it, or an object or array in the\n * file where faf sets a plain value — a JsonEditError says why in one line and\n * nothing is changed.\n *\n * Two more edits keep the same promise: {@link upsertJsonRows} updates or\n * appends faf's own rows in an array (the `faf cards` catalog), and\n * {@link removeJsonKey} takes out one key faf added (its render hash).\n */\n\n/** Why a JSON text cannot be edited in place (one line). */\nexport class JsonEditError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'JsonEditError';\n }\n}\n\ninterface JMember {\n key: string;\n keyStart: number;\n keyEnd: number;\n value: JNode;\n}\n\ninterface JNode {\n kind: 'object' | 'array' | 'string' | 'number' | 'literal';\n start: number;\n end: number;\n members: JMember[];\n /** The elements of an array, in order (empty for anything else). */\n items: JNode[];\n}\n\nconst WS = new Set([' ', '\\t', '\\n', '\\r']);\n\n/** A strict JSON parser (RFC 8259) that keeps where every key and value sits. */\nclass Parser {\n private i = 0;\n\n constructor(private readonly s: string) {}\n\n parse(): JNode {\n if (this.s.startsWith('\\uFEFF')) {this.i = 1;}\n const node = this.value();\n this.ws();\n if (this.i !== this.s.length) {this.fail('text after the end of the JSON value');}\n return node;\n }\n\n private fail(why: string): never {\n throw new JsonEditError(`not valid JSON (${why} at offset ${this.i})`);\n }\n\n private ws(): void {\n while (this.i < this.s.length && WS.has(this.s[this.i])) {this.i++;}\n }\n\n private value(): JNode {\n this.ws();\n const c = this.s[this.i];\n if (c === '{') {return this.object();}\n if (c === '[') {return this.array();}\n if (c === '\"') {\n const start = this.i;\n this.string();\n return { kind: 'string', start, end: this.i, members: [], items: [] };\n }\n if (c === '-' || (c >= '0' && c <= '9')) {return this.number();}\n for (const lit of ['true', 'false', 'null']) {\n if (this.s.startsWith(lit, this.i)) {\n const start = this.i;\n this.i += lit.length;\n return { kind: 'literal', start, end: this.i, members: [], items: [] };\n }\n }\n return this.fail(c === undefined ? 'unexpected end' : `unexpected ${JSON.stringify(c)}`);\n }\n\n private object(): JNode {\n const start = this.i++;\n const members: JMember[] = [];\n this.ws();\n if (this.s[this.i] === '}') {\n this.i++;\n return { kind: 'object', start, end: this.i, members, items: [] };\n }\n for (;;) {\n this.ws();\n if (this.s[this.i] !== '\"') {this.fail('expected a key');}\n const keyStart = this.i;\n const key = this.string();\n const keyEnd = this.i;\n this.ws();\n if (this.s[this.i] !== ':') {this.fail('expected \":\"');}\n this.i++;\n members.push({ key, keyStart, keyEnd, value: this.value() });\n this.ws();\n if (this.s[this.i] === ',') {\n this.i++;\n continue;\n }\n if (this.s[this.i] === '}') {\n this.i++;\n return { kind: 'object', start, end: this.i, members, items: [] };\n }\n this.fail('expected \",\" or \"}\"');\n }\n }\n\n private array(): JNode {\n const start = this.i++;\n const items: JNode[] = [];\n this.ws();\n if (this.s[this.i] === ']') {\n this.i++;\n return { kind: 'array', start, end: this.i, members: [], items };\n }\n for (;;) {\n items.push(this.value());\n this.ws();\n if (this.s[this.i] === ',') {\n this.i++;\n continue;\n }\n if (this.s[this.i] === ']') {\n this.i++;\n return { kind: 'array', start, end: this.i, members: [], items };\n }\n this.fail('expected \",\" or \"]\"');\n }\n }\n\n /** A string token; returns its value. */\n private string(): string {\n const start = this.i++;\n for (;;) {\n const c = this.s[this.i];\n if (c === undefined) {this.fail('unterminated string');}\n if (c === '\"') {break;}\n if (c < ' ') {this.fail('control character in a string');}\n if (c === '\\\\') {\n const e = this.s[this.i + 1];\n if (e === 'u') {\n if (!/^[0-9a-fA-F]{4}$/.test(this.s.slice(this.i + 2, this.i + 6))) {this.fail('bad \\\\u escape');}\n this.i += 6;\n continue;\n }\n if (!'\"\\\\/bfnrt'.includes(e ?? 'x')) {this.fail('bad escape');}\n this.i += 2;\n continue;\n }\n this.i++;\n }\n this.i++;\n return JSON.parse(this.s.slice(start, this.i)) as string;\n }\n\n private number(): JNode {\n const m = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/.exec(this.s.slice(this.i));\n if (!m) {this.fail('bad number');}\n const start = this.i;\n this.i += m[0].length;\n return { kind: 'number', start, end: this.i, members: [], items: [] };\n }\n}\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v);\n\n/** Deep equality of parsed JSON values. */\nfunction sameJson(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) {return true;}\n if (Array.isArray(a) && Array.isArray(b)) {return a.length === b.length && a.every((x, i) => sameJson(x, b[i]));}\n if (isPlainObject(a) && isPlainObject(b)) {\n const ka = Object.keys(a);\n return ka.length === Object.keys(b).length && ka.every(k => k in b && sameJson(a[k], b[k]));\n }\n return false;\n}\n\ninterface Edit {\n start: number;\n end: number;\n text: string;\n}\n\n/** Layout facts of the file, so added text looks like the text around it. */\ninterface Style {\n eol: string;\n unit: string;\n}\n\n/** Where to add a missing key: after the first of these keys the object has\n * (else after its last key). Keyed by the dotted path of the object ('' is the root). */\nexport type InsertAfter = Record<string, Record<string, readonly string[]>>;\n\nclass Editor {\n readonly edits: Edit[] = [];\n\n constructor(\n private readonly s: string,\n private readonly style: Style,\n private readonly after: InsertAfter,\n ) {}\n\n /** True when only blanks sit between the start of its line and `pos` (and\n * there is a line before: a key that starts a line of its own). */\n private startsLine(pos: number): boolean {\n const nl = this.s.lastIndexOf('\\n', pos - 1);\n return nl >= 0 && /^[ \\t]*$/.test(this.s.slice(nl + 1, pos));\n }\n\n /** The blanks before `pos` on its line, when `pos` starts the line; else ''. */\n private indentOf(pos: number): string {\n return this.startsLine(pos) ? this.s.slice(this.s.lastIndexOf('\\n', pos - 1) + 1, pos) : '';\n }\n\n /** `v` as JSON text for a value whose key line is indented `indent`: laid\n * out over lines like the file around it when `multi`, else on one line. */\n private render(v: unknown, indent: string, multi: boolean): string {\n if (!multi) {return JSON.stringify(v);}\n return JSON.stringify(v, null, this.style.unit).split('\\n').join(this.style.eol + indent);\n }\n\n /** Apply `patch` to the object `obj` (at dotted `path`; `multi` when the\n * object is laid out over lines). */\n apply(obj: JNode, patch: Record<string, unknown>, path: string, multi: boolean): void {\n const fill: Record<string, unknown> = {}; // keys for an empty object, written as one\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {continue;}\n const at = path ? `${path}.${key}` : key;\n const found = obj.members.filter(m => m.key === key);\n if (found.length > 1) {throw new JsonEditError(`the key \"${at}\" is there more than once`);}\n const member = found[0];\n if (!member) {\n if (obj.members.length === 0) {fill[key] = value;}\n else {this.insert(obj, key, value, path);}\n continue;\n }\n const lined = this.startsLine(member.keyStart);\n if (isPlainObject(value)) {\n if (member.value.kind !== 'object') {throw new JsonEditError(`\"${at}\" is not an object, so faf cannot add its keys to it`);}\n this.apply(member.value, value, at, lined || this.s.slice(member.value.start, member.value.end).includes('\\n'));\n continue;\n }\n const now: unknown = JSON.parse(this.s.slice(member.value.start, member.value.end));\n if (sameJson(now, value)) {continue;}\n if (member.value.kind === 'object' || member.value.kind === 'array') {\n // The reverse of the case above: faf would replace the whole object or\n // array (every key or item in it) with its plain value.\n throw new JsonEditError(`\"${at}\" is ${member.value.kind === 'object' ? 'an object' : 'an array'}, so faf will not replace it with a value`);\n }\n this.edits.push({ start: member.value.start, end: member.value.end, text: this.render(value, this.indentOf(member.keyStart), lined) });\n }\n if (Object.keys(fill).length > 0) {this.fillEmpty(obj, fill, multi);}\n }\n\n /** Write the keys of an empty object (`{}`) in one go, laid out like the file. */\n private fillEmpty(obj: JNode, keys: Record<string, unknown>, multi: boolean): void {\n const outer = this.indentOf(this.lineLead(obj.start));\n const text = multi\n ? this.render(keys, outer, true)\n : JSON.stringify(keys);\n this.edits.push({ start: obj.start, end: obj.end, text });\n }\n\n /** Add `key: value` to `obj`, in the layout the object already has. In an\n * object laid out over lines the new key gets a line of its own and no\n * existing line changes: it goes after the hinted key, or — when that is\n * the last key, or there is no hint — just before the last key (after it\n * would need a comma on the last key's line). On one line it goes after\n * the hinted key, else at the end. */\n private insert(obj: JNode, key: string, value: unknown, path: string): void {\n const members = obj.members;\n const last = members[members.length - 1];\n const hints = this.after[path]?.[key] ?? [];\n const hinted = hints.map(h => members.find(m => m.key === h)).find(m => m !== undefined);\n if (this.startsLine(members[0].keyStart)) {\n // Before `next` (a key that starts its own line), as a whole line.\n const next = hinted && hinted !== last ? members[members.indexOf(hinted) + 1] : last;\n const indent = this.indentOf(next.keyStart);\n const sep = this.s.slice(next.keyEnd, next.value.start); // ': ' as the file writes it\n const lineAt = this.s.lastIndexOf('\\n', next.keyStart - 1);\n const at = lineAt > 0 && this.s[lineAt - 1] === '\\r' ? lineAt - 1 : lineAt;\n const text = `${this.style.eol}${indent}${JSON.stringify(key)}${sep}${this.render(value, indent, true)},`;\n this.edits.push({ start: at, end: at, text });\n return;\n }\n const anchor = hinted ?? last;\n const sep = this.s.slice(anchor.keyEnd, anchor.value.start);\n const between = members.length > 1 ? this.s.slice(members[0].value.end, members[1].keyStart) : ', ';\n this.edits.push({ start: anchor.value.end, end: anchor.value.end, text: `${between}${JSON.stringify(key)}${sep}${this.render(value, '', false)}` });\n }\n\n /** Append `items` to the array `arr`, laid out like it: each on a line of\n * its own after the last item when the items sit on lines of their own,\n * else on the same line after the last item. An empty array is written\n * whole, over lines when `multi` (its key starts the line at `keyStart`). */\n append(arr: JNode, items: readonly unknown[], keyStart: number, multi: boolean): void {\n if (items.length === 0) {return;}\n if (arr.items.length === 0) {\n this.edits.push({ start: arr.start, end: arr.end, text: this.render(items, this.indentOf(keyStart), multi) });\n return;\n }\n const last = arr.items[arr.items.length - 1];\n if (this.startsLine(arr.items[0].start)) {\n const indent = this.indentOf(arr.items[0].start);\n const text = items.map(v => `,${this.style.eol}${indent}${this.render(v, indent, true)}`).join('');\n this.edits.push({ start: last.end, end: last.end, text });\n return;\n }\n const between = arr.items.length > 1 ? this.s.slice(arr.items[0].end, arr.items[1].start) : ', ';\n this.edits.push({ start: last.end, end: last.end, text: items.map(v => `${between}${this.render(v, '', false)}`).join('') });\n }\n\n /** The first non-blank position of the line `pos` is on. */\n private lineLead(pos: number): number {\n let at = this.s.lastIndexOf('\\n', pos - 1) + 1;\n while (at < pos && (this.s[at] === ' ' || this.s[at] === '\\t')) {at++;}\n return at;\n }\n}\n\n/** The file's line ending, and its indent unit (the root's first key\n * indent), else two spaces. */\nfunction styleOf(s: string, root: JNode): Style {\n const eol = s.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const first = root.members[0];\n const nl = first ? s.lastIndexOf('\\n', first.keyStart - 1) : -1;\n const lead = first && nl >= 0 ? s.slice(nl + 1, first.keyStart) : '';\n return { eol, unit: /^[ \\t]+$/.test(lead) ? lead : ' ' };\n}\n\n/**\n * Apply `patch` to the JSON `text`, changing only the value text of the keys\n * it names and adding the keys it has that the text lacks (see the file\n * header). Returns the new text and whether it changed. Throws a\n * JsonEditError, having changed nothing, when the text cannot be edited that\n * way. `after` says where a missing key goes (default: after the object's last key).\n */\nexport function editJsonText(\n text: string,\n patch: Record<string, unknown>,\n after: InsertAfter = {},\n): { text: string; changed: boolean } {\n const root = new Parser(text).parse();\n if (root.kind !== 'object') {throw new JsonEditError('the JSON is not an object');}\n const editor = new Editor(text, styleOf(text, root), after);\n editor.apply(root, patch, '', text.slice(root.start, root.end).includes('\\n'));\n return applyEdits(text, editor.edits);\n}\n\n/** `text` with `edits` made. Last edit first, so earlier offsets stay true;\n * two additions at one spot keep the order they were made in. */\nfunction applyEdits(text: string, edits: readonly Edit[]): { text: string; changed: boolean } {\n if (edits.length === 0) {return { text, changed: false };}\n const order = edits.map((e, i) => ({ e, i })).sort((a, b) => b.e.start - a.e.start || b.i - a.i);\n let out = text;\n for (const { e } of order) {\n out = out.slice(0, e.start) + e.text + out.slice(e.end);\n }\n return { text: out, changed: out !== text };\n}\n\n/** Parse `text` as a JSON object (JsonEditError otherwise). */\nfunction parseObject(text: string): JNode {\n const root = new Parser(text).parse();\n if (root.kind !== 'object') {throw new JsonEditError('the JSON is not an object');}\n return root;\n}\n\n/** The string value of `obj`'s key `key` (undefined when it has none, or the\n * value is not a string); JsonEditError when the key is there more than once. */\nfunction stringKey(text: string, obj: JNode, key: string, at: string): string | undefined {\n const found = obj.members.filter(m => m.key === key);\n if (found.length > 1) {throw new JsonEditError(`the key \"${at}.${key}\" is there more than once`);}\n const v = found[0]?.value;\n return v?.kind === 'string' ? (JSON.parse(text.slice(v.start, v.end)) as string) : undefined;\n}\n\n/**\n * Update or add rows in the array at the root key `key`, changing nothing\n * else: a row whose `id` value is exactly a row's in the file is updated in\n * place — only the values of its `update` keys change (or are added) — and any\n * other row is appended after the file's last item, laid out like the items\n * around it (the array, or the key, is added when missing). Every item faf\n * does not update stays byte for byte. Never matched by anything but `id`.\n * Throws a JsonEditError, having changed nothing, when the text cannot be\n * edited that way: not a JSON object, `key` not an array or there more than\n * once, a row's id there more than once, or a value faf sets that is an object\n * or array in the file.\n */\nexport function upsertJsonRows(\n text: string,\n key: string,\n rows: readonly Record<string, unknown>[],\n opts: { id: string; update: readonly string[] },\n): { text: string; changed: boolean } {\n const root = parseObject(text);\n const editor = new Editor(text, styleOf(text, root), {});\n const multiRoot = text.slice(root.start, root.end).includes('\\n');\n const found = root.members.filter(m => m.key === key);\n if (found.length > 1) {throw new JsonEditError(`the key \"${key}\" is there more than once`);}\n if (found.length === 0) {\n editor.apply(root, { [key]: rows }, '', multiRoot);\n return applyEdits(text, editor.edits);\n }\n const member = found[0];\n const arr = member.value;\n if (arr.kind !== 'array') {throw new JsonEditError(`\"${key}\" is not an array, so faf cannot add its rows to it`);}\n const append: Record<string, unknown>[] = [];\n for (const row of rows) {\n const want = row[opts.id];\n const hits = arr.items.filter((item, i) => item.kind === 'object' && stringKey(text, item, opts.id, `${key}[${i}]`) === want);\n if (hits.length > 1) {throw new JsonEditError(`the ${key} row ${JSON.stringify(want)} is there more than once`);}\n if (hits.length === 0) {\n append.push(row);\n continue;\n }\n const item = hits[0];\n const patch = Object.fromEntries(opts.update.map(k => [k, row[k]]));\n editor.apply(item, patch, `${key}[${arr.items.indexOf(item)}]`, text.slice(item.start, item.end).includes('\\n'));\n }\n editor.append(arr, append, member.keyStart, multiRoot);\n return applyEdits(text, editor.edits);\n}\n\n/** True when only blanks sit between the start of its line and `pos` (and\n * there is a line before it). */\nfunction startsLine(s: string, pos: number): boolean {\n const nl = s.lastIndexOf('\\n', pos - 1);\n return nl >= 0 && /^[ \\t]*$/.test(s.slice(nl + 1, pos));\n}\n\n/** The text to take out to remove `m` from `obj`, as the reverse of how\n * {@link editJsonText} adds a key: a key on a line of its own with a comma\n * after it goes with its line; a key after another goes with the separator\n * before it; the first key on the object's own line goes with the separator\n * after it; an only key leaves `{}`. */\nfunction removal(s: string, obj: JNode, m: JMember): Edit {\n if (obj.members.length === 1) {return { start: obj.start, end: obj.end, text: '{}' };}\n const i = obj.members.indexOf(m);\n if (startsLine(s, m.keyStart) && s[m.value.end] === ',') {\n const nl = s.lastIndexOf('\\n', m.keyStart - 1);\n return { start: nl > 0 && s[nl - 1] === '\\r' ? nl - 1 : nl, end: m.value.end + 1, text: '' };\n }\n if (i > 0) {return { start: obj.members[i - 1].value.end, end: m.value.end, text: '' };}\n return { start: m.keyStart, end: obj.members[1].keyStart, text: '' };\n}\n\n/** Walk `path` (each step a key of an object) from the root of `text`.\n * `count` is how many times the last key is there (0 when a step is missing\n * or not an object; more than 1 when the last key — or a key on the way — is\n * repeated). `chain` holds the object and member of every step when found. */\nfunction walk(text: string, path: readonly string[]): { count: number; chain: { obj: JNode; member: JMember }[] } {\n const chain: { obj: JNode; member: JMember }[] = [];\n let obj = parseObject(text);\n for (const key of path) {\n if (obj.kind !== 'object') {return { count: 0, chain };}\n const found = obj.members.filter(m => m.key === key);\n if (found.length !== 1) {return { count: found.length, chain };}\n chain.push({ obj, member: found[0] });\n obj = found[0].value;\n }\n return { count: 1, chain };\n}\n\n/**\n * The value at `path` in the JSON object `text` (each step a key of an\n * object): `count` 1 with its parsed `value`, 0 when a step is missing or not\n * an object, more than 1 when a key on the way is repeated. Throws a\n * JsonEditError when `text` is not a JSON object.\n */\nexport function locateJsonKey(text: string, path: readonly string[]): { count: number; value?: unknown } {\n const { count, chain } = walk(text, path);\n if (count !== 1) {return { count };}\n const v = chain[chain.length - 1].member.value;\n return { count, value: JSON.parse(text.slice(v.start, v.end)) as unknown };\n}\n\n/**\n * `text` with the key at `path` taken out — the reverse of {@link editJsonText}\n * adding it (see {@link removal}); every other byte stays. With\n * `dropEmptyParent`, when that key is its object's only key, the object's own\n * key is taken out instead. Returns null when the key is not there exactly\n * once; throws a JsonEditError when `text` is not a JSON object.\n */\nexport function removeJsonKey(text: string, path: readonly string[], opts: { dropEmptyParent?: boolean } = {}): string | null {\n const { count, chain } = walk(text, path);\n if (count !== 1 || chain.length === 0) {return null;}\n let step = chain[chain.length - 1];\n if (opts.dropEmptyParent && chain.length > 1 && step.obj.members.length === 1) {step = chain[chain.length - 2];}\n return applyEdits(text, [removal(text, step.obj, step.member)]).text;\n}\n",
|
|
94
94
|
"import { join } from 'path';\nimport { deprecate } from 'node:util';\nimport type { FafData } from '../core/types.js';\nimport { writeRendered } from '../core/render-hash.js';\nimport { editJsonText } from '../core/json-edit.js';\n\n/**\n * Build an MCP Server Card (SEP-2127) from a .faf.\n *\n * The card is a published discovery manifest. By design it carries the FAF\n * context-block in `_meta[\"one.faf/context\"]` — so every Server Card produced\n * through FAF ships FAF context by default. This emitter is the SINGLE SOURCE of\n * the block — faf-server-card-ref and `.fafa` provenance compose it (never\n * hand-roll), so every surface is byte-identical by construction: one context,\n * one source, every door.\n *\n * Honest-first: no score is baked (it would go stale on disk); the block points\n * to the .faf and asserts the score is deterministic. The card omits `remotes`\n * unless a deployment URL is supplied — it must not claim an endpoint it lacks.\n */\n\nexport interface ServerCardOptions {\n /** Pointer to the .faf context (default: ./project.faf). Pass an absolute URL\n * for a remote/served card (e.g. faf-server-card-ref at context.faf.one). */\n fafPointer?: string;\n /** Optional live endpoint; adds a streamable-http remote when set. */\n remoteUrl?: string;\n /** Optional \"verify the score here\" URL — makes verify-don't-trust actionable\n * (faf-server-card-ref uses https://faf.one). Omitted from the block if unset. */\n scoreEndpoint?: string;\n /** Override timestamp (tests); otherwise .faf `generated`, else now. */\n now?: string;\n}\n\nconst MEDIA_TYPE = 'application/vnd.faf+yaml';\nconst SCHEMA = 'https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json';\nconst NAME_RE = /^[a-zA-Z0-9.-]+\\/[a-zA-Z0-9._-]+$/;\n\n/** Derive a reverse-DNS `namespace/name` for the card. */\nfunction serverName(data: FafData): string {\n const raw = String(data.project?.name ?? 'project').trim();\n if (raw.includes('/') && NAME_RE.test(raw)) {return raw;} // already namespaced\n\n const homepage = (data.project?.homepage ??\n data.project?.website ??\n data.project?.url) as string | undefined;\n let ns = 'local';\n if (homepage) {\n try {\n const host = new URL(homepage).hostname.replace(/^www\\./, '');\n ns = host.split('.').reverse().join('.'); // faf.one -> one.faf\n } catch {\n /* keep 'local' */\n }\n }\n const name = raw.replace(/[^a-zA-Z0-9._-]/g, '-').replace(/^-+|-+$/g, '') || 'project';\n return `${ns}/${name}`;\n}\n\n/** Server Card `description` is capped at 100 chars; never empty. */\nfunction clampDescription(data: FafData): string {\n const src = String(\n data.project?.goal ?? data.context ?? data.project?.name ?? 'MCP server',\n )\n .replace(/\\s+/g, ' ')\n .trim();\n if (!src) {return 'MCP server';}\n return src.length <= 100 ? src : `${src.slice(0, 97).trimEnd() }...`;\n}\n\n/**\n * The canonical FAF context-block — the value of `_meta[\"one.faf/context\"]`,\n * identical across every surface (Server Card, registry `server.json`, `.fafa`):\n * one context, every door. Honest-first: no score baked (it would go stale on\n * disk); it points to the .faf and asserts the score is deterministic.\n */\nexport function fafContextBlock(\n data: FafData,\n opts: ServerCardOptions = {},\n): Record<string, unknown> {\n return {\n faf: opts.fafPointer ?? './project.faf',\n mediaType: MEDIA_TYPE,\n iana: `https://www.iana.org/assignments/media-types/${MEDIA_TYPE}`,\n deterministic: true,\n ...(opts.scoreEndpoint ? { scoreEndpoint: opts.scoreEndpoint } : {}),\n generated:\n (data.generated as string | undefined) ?? opts.now ?? new Date().toISOString(),\n };\n}\n\n/** Build the Server Card object from .faf data. */\nexport function buildServerCard(\n data: FafData,\n opts: ServerCardOptions = {},\n): Record<string, unknown> {\n const card: Record<string, unknown> = {\n $schema: SCHEMA,\n name: serverName(data),\n version: String(data.project?.version ?? '0.1.0'),\n description: clampDescription(data),\n };\n\n const title = registryTitle(data) ?? (data.project?.name as string | undefined);\n if (title && title.length <= 100) {card.title = title;}\n\n const homepage = (data.project?.homepage ??\n data.project?.website ??\n data.project?.url) as string | undefined;\n if (homepage) {card.websiteUrl = homepage;}\n\n if (opts.remoteUrl) {\n card.remotes = [{ type: 'streamable-http', url: opts.remoteUrl }];\n }\n\n // The canonical FAF context-block — parity with faf-server-card-ref + .fafa.\n card._meta = { 'one.faf/context': fafContextBlock(data, opts) };\n\n return card;\n}\n\nexport const REGISTRY_PUBLISHER_KEY = 'io.modelcontextprotocol.registry/publisher-provided';\nconst REGISTRY_META_CAP = 4096; // official registry cap on publisher-provided JSON (bytes)\n\n/**\n * Build the `_meta` for an MCP Registry `server.json`.\n *\n * The SAME canonical context-block as the Server Card, but nested under\n * `io.modelcontextprotocol.registry/publisher-provided` — the ONLY `_meta` key\n * the official registry preserves on publish. Top-level keys (the way the card\n * carries `one.faf/context`) are silently dropped by the registry. Throws if the\n * block exceeds the registry's 4KB cap. Merge the result into an existing\n * `server.json` `_meta`; don't regenerate the manifest (packages/mcpb are tuned).\n */\nexport function registryMeta(\n data: FafData,\n opts: ServerCardOptions = {},\n): Record<string, unknown> {\n const provided = { 'one.faf/context': fafContextBlock(data, opts) };\n const bytes = new TextEncoder().encode(JSON.stringify(provided)).length;\n if (bytes > REGISTRY_META_CAP) {\n throw new Error(\n `publisher-provided _meta is ${bytes}B — exceeds the registry ${REGISTRY_META_CAP}B cap`,\n );\n }\n return { [REGISTRY_PUBLISHER_KEY]: provided };\n}\n\n/** The canonical reverse-DNS registry name, e.g. `one.faf/claude-faf-mcp`.\n *\n * HOMEPAGE REQUIRED: the namespace is derived from `project.homepage`'s host\n * (faf.one -> one.faf). With no homepage/website/url the namespace falls back\n * to `local/<name>`. This can't silently ship — the migration is guarded\n * (`rewrite-server-json.ts` refuses any name that isn't `one.faf/*`) — but set\n * `homepage: https://faf.one` in the .faf to get the correct `one.faf/<name>`. */\nexport function registryName(data: FafData): string {\n return serverName(data);\n}\n\n/** The display title for a registry `server.json` — the human-readable card name\n * (e.g. \"Claude FAF\"), sourced from `project.title` in the .faf. This is the\n * SINGLE SOURCE of the title across the fleet: JS emitters import it, and the\n * `faf server-card` CLI uses it so Python/Rust repos compose the identical\n * value (compose-not-fork). Distinct from `registryName` (the reverse-DNS id).\n * Returns undefined when unset or >100 chars (the registry cap) so the field is\n * omitted rather than shipped invalid — GitHub's registry then derives a name\n * from the namespace, so set `project.title` to control the display. */\nexport function registryTitle(data: FafData): string | undefined {\n const raw = (data.project as { title?: unknown } | undefined)?.title;\n if (typeof raw === 'string') {\n const t = raw.trim();\n if (t && t.length <= 100) {return t;}\n }\n return undefined;\n}\n\n/** The parsed JSON in `bytes`, or undefined when they are not JSON. */\nfunction jsonOf(bytes: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(bytes).replace(/^\\uFEFF/, ''));\n } catch {\n return undefined;\n }\n}\n\nconst isObj = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\n\n/** True when `bytes` are a Server Card faf wrote: JSON carrying the FAF\n * context-block at `_meta[\"one.faf/context\"]`, as every card faf has\n * written does. */\nexport function hasServerCardMark(bytes: Uint8Array): boolean {\n const j = jsonOf(bytes);\n return isObj(j) && isObj(j._meta) && isObj(j._meta['one.faf/context']);\n}\n\n/** True when `bytes` are a registry `server.json` carrying faf's identity:\n * `_meta[REGISTRY_PUBLISHER_KEY][\"one.faf/context\"]`. */\nexport function hasRegistryMark(bytes: Uint8Array): boolean {\n const j = jsonOf(bytes);\n const provided = isObj(j) && isObj(j._meta) ? j._meta[REGISTRY_PUBLISHER_KEY] : undefined;\n return isObj(provided) && isObj(provided['one.faf/context']);\n}\n\n/** Options for the card writers ({@link writeServerCard}, `faf cards`). */\nexport interface CardWriteOptions {\n /** Replace a card faf cannot prove it wrote — no faf mark, edited since\n * faf wrote it, or from before 7.13 — the explicit overwrite (`--force`).\n * Default: such a file is refused and left as it is. */\n force?: boolean;\n}\n\n/** Write the Server Card to a `server-card` file. Returns the path.\n * Per experimental-ext-server-card#22 the reserved location is\n * `<streamable-http-url>/server-card` (no longer `.well-known`); serve the\n * emitted file there as `application/mcp-server-card+json`.\n *\n * The card carries faf's render hash at `_meta[\"one.faf/render\"]` (the hash\n * of the card without that key; the Server Card schema leaves `_meta` open\n * for namespaced keys). A `server-card` already there is replaced only when\n * it is byte for byte what faf last wrote (its hash still fits); a card edited\n * since, a hand-written card, or a card from before 7.13 that is not exactly\n * faf's render of `data` is refused (SafePathError `not-owned`) and left byte\n * for byte, unless `force`. The write is atomic and never goes through a link\n * that leaves `dir` or dangles. */\nexport function writeServerCard(\n dir: string,\n data: FafData,\n opts: ServerCardOptions = {},\n write: CardWriteOptions = {},\n): string {\n const card = buildServerCard(data, opts);\n const out = join(dir, 'server-card');\n writeRendered(out, `${JSON.stringify(card, null, 2) }\\n`, {\n root: dir,\n format: 'json',\n hasMark: hasServerCardMark,\n mark: 'FAF context-block (`_meta[\"one.faf/context\"]`)',\n force: write.force,\n });\n return out;\n}\n\n/** The identity faf owns in a registry `server.json`. */\nexport interface ServerJsonIdentity {\n /** The reverse-DNS registry name ({@link registryName}). */\n name: string;\n /** The display title ({@link registryTitle}); when undefined the file's own title is kept. */\n title?: string;\n /** A version to set (`--set-version`); when undefined the file's own is kept. */\n version?: string;\n /** The `_meta` faf writes ({@link registryMeta}). */\n meta: Record<string, unknown>;\n}\n\n/**\n * Put faf's identity into the text of a registry `server.json`, changing\n * nothing else: the `name` value, the `title` (only when faf has one — the\n * file's own title is kept otherwise), a `version` asked for, and the keys of\n * faf's context-block under `_meta[REGISTRY_PUBLISHER_KEY][\"one.faf/context\"]`.\n * Each is a text edit of that one value, or the key added when missing; no\n * field is deleted, and every other byte — key order, a 20-digit number, an\n * array on one line, spacing, CRLF — stays as it was. Throws a JsonEditError,\n * changing nothing, when the text cannot be edited that way (not valid JSON,\n * not an object, a key repeated on the way, a `_meta` that is not an object).\n */\nexport function patchServerJson(text: string, identity: ServerJsonIdentity): { text: string; changed: boolean } {\n const patch: Record<string, unknown> = {\n name: identity.name,\n title: identity.title,\n version: identity.version,\n _meta: identity.meta,\n };\n return editJsonText(text, patch, {\n '': { name: ['$schema'], title: ['name'], version: ['description', 'title', 'name'] },\n });\n}\n\n/** @deprecated Use {@link buildServerCard}. Removed in the next major. */\nexport const generateServerCard = deprecate(\n buildServerCard,\n 'faf-cli: generateServerCard is deprecated, use buildServerCard',\n 'FAF0002',\n);\n",
|
|
95
|
-
"import { existsSync, readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { deprecate } from 'node:util';\nimport { parse } from 'yaml';\nimport type { FafData } from '../core/types.js';\nimport { makeDirInside } from '../core/safe-write.js';\nimport { writeRendered, type RenderedResult } from '../core/render-hash.js';\nimport { upsertJsonRows } from '../core/json-edit.js';\nimport {\n fafContextBlock,\n buildServerCard,\n hasRegistryMark,\n hasServerCardMark,\n registryMeta,\n registryName,\n registryTitle,\n type ServerCardOptions,\n} from './servercard.js';\n\n/** A2A extension URI — dereference, not the MCP `_meta` key `one.faf/context`. */\nexport const A2A_CONTEXT_URI = 'https://faf.one/context';\nexport const A2A_PROTOCOL_BINDING = 'JSONRPC';\nexport const A2A_PROTOCOL_VERSION = '1.0';\n\nexport type CardTarget = 'a2a' | 'mcp' | 'registry' | 'catalog';\nexport const CARD_TARGETS: CardTarget[] = ['a2a', 'mcp', 'registry', 'catalog'];\n\nexport interface FafaAgent {\n name?: string;\n displayName?: string;\n id?: string;\n vendor?: string;\n version?: string;\n description?: string;\n homepage?: string;\n}\n\nexport interface FafaCapability {\n name?: string;\n description?: string;\n tags?: unknown;\n}\n\nexport interface FafaEndpoint {\n protocol?: string;\n transport?: string;\n location?: string;\n version?: string;\n}\n\nexport interface FafaDoc {\n agent?: FafaAgent;\n capabilities?: FafaCapability[];\n endpoints?: FafaEndpoint[];\n provenance?: Record<string, unknown>;\n metadata?: { persona?: string };\n [key: string]: unknown;\n}\n\nexport interface ProjectCardsOptions extends ServerCardOptions {\n /** Public URL of the emitted A2A card (catalog row). */\n a2aCardUrl?: string;\n /** Caller-supplied A2A door when `.fafa` has no `endpoints[].protocol: a2a`. */\n doorUrl?: string;\n}\n\nexport interface ProjectedA2A {\n name: string;\n description: string;\n supportedInterfaces: Array<{\n url: string;\n protocolBinding: string;\n protocolVersion: string;\n }>;\n provider: { organization: string; url: string };\n version: string;\n capabilities: {\n streaming: boolean;\n pushNotifications: boolean;\n extendedAgentCard: boolean;\n extensions: Array<{\n uri: string;\n description: string;\n required: boolean;\n params: Record<string, unknown>;\n }>;\n };\n defaultInputModes: string[];\n defaultOutputModes: string[];\n skills: Array<{\n id: string;\n name: string;\n description: string;\n tags: string[];\n }>;\n}\n\nexport interface CatalogEntry {\n identifier: string;\n displayName?: string;\n type: string;\n description?: string;\n url: string;\n updatedAt?: string;\n}\n\nexport interface AiCatalog {\n specVersion: string;\n host?: Record<string, unknown>;\n entries: CatalogEntry[];\n [key: string]: unknown;\n}\n\nexport interface ProjectedCards {\n block: Record<string, unknown>;\n a2a?: ProjectedA2A;\n mcp?: Record<string, unknown>;\n registry?: {\n name: string;\n title?: string;\n _meta: Record<string, unknown>;\n };\n catalog?: CatalogEntry[];\n}\n\nexport function readFafa(path: string): FafaDoc {\n return parse(readFileSync(path, 'utf-8')) as FafaDoc;\n}\n\n/** Discover agent.fafa / .fafa (cwd, then one parent). */\nexport function findFafaFile(dir: string = process.cwd()): string | null {\n const candidates = ['agent.fafa', '.fafa'];\n for (const name of candidates) {\n const full = join(dir, name);\n if (existsSync(full)) {return full;}\n }\n const parent = dirname(dir);\n if (parent !== dir) {\n for (const name of candidates) {\n const full = join(parent, name);\n if (existsSync(full)) {return full;}\n }\n }\n return null;\n}\n\nexport function a2aEndpoints(fafa: FafaDoc): FafaEndpoint[] {\n return (fafa.endpoints ?? []).filter(\n (e) => String(e.protocol ?? '').toLowerCase() === 'a2a' && e.location,\n );\n}\n\n/** Authored A2A endpoints, else a single `doorUrl`. Never invents a door. */\nexport function a2aDoors(fafa: FafaDoc, opts: ProjectCardsOptions = {}): FafaEndpoint[] {\n const fromDoc = a2aEndpoints(fafa);\n if (fromDoc.length > 0) {return fromDoc;}\n const door = opts.doorUrl?.trim();\n if (door) {\n return [{ protocol: 'a2a', location: door, version: A2A_PROTOCOL_VERSION }];\n }\n return [];\n}\n\n/** Build the A2A Agent Card (JSON) from a .fafa + .faf. */\nexport function buildA2ACard(\n fafa: FafaDoc,\n faf: FafData,\n opts: ProjectCardsOptions = {},\n): ProjectedA2A {\n const agent = fafa.agent ?? {};\n const doors = a2aDoors(fafa, opts);\n if (doors.length === 0) {\n throw new Error(\n \"No A2A endpoint in .fafa (need endpoints[].protocol: a2a + location). Will not invent a door.\",\n );\n }\n const name = String(agent.displayName ?? fafa.metadata?.persona ?? agent.name ?? '').trim();\n const description = String(agent.description ?? '').trim();\n const version = String(agent.version ?? '').trim();\n const organization = String(agent.vendor ?? '').trim();\n const homepage = String(agent.homepage ?? '').trim();\n if (!name || !description || !version || !organization || !homepage) {\n throw new Error(\n 'A2A card needs agent.displayName|name, description, version, vendor, homepage in .fafa',\n );\n }\n\n const block = fafContextBlock(faf, opts);\n const skills = (fafa.capabilities ?? []).map((c) => {\n const id = String(c.name ?? '').trim();\n if (!id) {throw new Error('A2A skill missing capabilities[].name');}\n const tags = Array.isArray(c.tags) ? c.tags.map(String) : [];\n return {\n id,\n name: id,\n description: String(c.description ?? '').trim() || id,\n tags,\n };\n });\n\n return {\n name,\n description,\n supportedInterfaces: doors.map((e) => ({\n url: String(e.location),\n protocolBinding: A2A_PROTOCOL_BINDING,\n protocolVersion: String(e.version ?? A2A_PROTOCOL_VERSION),\n })),\n provider: { organization, url: homepage },\n version,\n capabilities: {\n streaming: false,\n pushNotifications: false,\n extendedAgentCard: false,\n extensions: [\n {\n uri: A2A_CONTEXT_URI,\n description:\n 'FAF context provenance — the durable context block (one context, every door).',\n required: false,\n params: block,\n },\n ],\n },\n defaultInputModes: ['text/plain', 'application/json'],\n defaultOutputModes: ['text/plain', 'application/json'],\n skills,\n };\n}\n\n/** @deprecated Use {@link buildA2ACard}. Removed in the next major. */\nexport const generateA2ACard = deprecate(\n buildA2ACard,\n 'faf-cli: generateA2ACard is deprecated, use buildA2ACard',\n 'FAF0003',\n);\n\nfunction catalogHost(fafa: FafaDoc): string {\n const homepage = fafa.agent?.homepage;\n if (!homepage) {return 'local';}\n try {\n return new URL(homepage).hostname.replace(/^www\\./, '');\n } catch {\n return 'local';\n }\n}\n\nfunction catalogA2AUrl(fafa: FafaDoc, opts: ProjectCardsOptions): string {\n if (opts.a2aCardUrl) {return opts.a2aCardUrl;}\n const homepage = fafa.agent?.homepage;\n if (homepage) {\n try {\n return new URL('/.well-known/agent-card.json', homepage).href;\n } catch { /* fall through */ }\n }\n return '/.well-known/agent-card.json';\n}\n\nexport function catalogEntriesFor(\n fafa: FafaDoc,\n faf: FafData,\n opts: ProjectCardsOptions = {},\n): CatalogEntry[] {\n const host = catalogHost(fafa);\n const agent = fafa.agent ?? {};\n const slug = String(agent.name ?? 'agent');\n const now = opts.now ?? (faf.generated as string | undefined) ?? new Date().toISOString();\n const entries: CatalogEntry[] = [];\n\n if (a2aDoors(fafa, opts).length > 0) {\n entries.push({\n identifier: `urn:air:${host}:a2a:${slug}`,\n displayName: String(agent.displayName ?? agent.name ?? 'A2A Agent Card'),\n type: 'application/a2a-agent-card+json',\n description: 'A2A v1.0 Agent Card. Projected from .fafa.',\n url: catalogA2AUrl(fafa, opts),\n updatedAt: now,\n });\n }\n\n const fafaUrl = homepageWellKnown(fafa, 'fafa');\n if (fafaUrl) {\n entries.push({\n identifier: `urn:air:${host}:agent:${slug}`,\n displayName: String(agent.displayName ?? agent.name ?? '.fafa'),\n type: 'application/vnd.fafa+yaml',\n description: 'FAF agent passport (.fafa).',\n url: fafaUrl,\n updatedAt: now,\n });\n }\n\n return entries;\n}\n\nfunction homepageWellKnown(fafa: FafaDoc, name: string): string | undefined {\n const homepage = fafa.agent?.homepage;\n if (!homepage) {return undefined;}\n try {\n return new URL(`/.well-known/${name}`, homepage).href;\n } catch {\n return undefined;\n }\n}\n\n/** The row in `entries` that is faf's own row `row`: the one whose\n * identifier is exactly faf's (`urn:air:<host>:a2a:<slug>` or\n * `urn:air:<host>:agent:<slug>`). Never matched by type or URL — a row of\n * yours for another agent, or another card of the same type, is not faf's. */\nfunction catalogMatchIndex(entries: CatalogEntry[], row: CatalogEntry): number {\n return entries.findIndex((e) => e.identifier === row.identifier);\n}\n\n/** Upsert projector entries into an existing catalog. Leaves every other row\n * alone: a row is faf's only when its identifier is exactly faf's (never by\n * type or URL). On match, only url / type / updatedAt move — host copy\n * (title, tags) stays; any other faf row is appended. */\nexport function upsertCatalog(existing: AiCatalog | undefined, incoming: CatalogEntry[]): AiCatalog {\n const base: AiCatalog = existing\n ? { ...existing, entries: [...(existing.entries ?? [])] }\n : { specVersion: '1.0', entries: [] };\n for (const row of incoming) {\n const i = catalogMatchIndex(base.entries, row);\n if (i >= 0) {\n base.entries[i] = {\n ...base.entries[i],\n url: row.url,\n type: row.type,\n ...(row.updatedAt ? { updatedAt: row.updatedAt } : {}),\n };\n } else {\n base.entries.push(row);\n }\n }\n return base;\n}\n\n/** The keys of a catalog row faf updates in place (its own row only). */\nconst CATALOG_ROW_UPDATES = ['url', 'type', 'updatedAt'] as const;\n\n/**\n * {@link upsertCatalog} as a text edit of the catalog's JSON: faf's own rows\n * (identifier exactly faf's) get their url / type / updatedAt values changed\n * in place, faf's other rows are appended after the last entry, and every\n * other byte — your rows, their order and layout, other keys — stays. With no\n * text (no catalog yet) a new catalog is returned. Throws a JsonEditError,\n * changing nothing, when the catalog cannot be edited that way (not a JSON\n * object, `entries` not an array, faf's row there twice, …).\n */\nexport function upsertCatalogText(text: string | null, incoming: CatalogEntry[]): { text: string; changed: boolean } {\n if (text === null) {\n return { text: `${JSON.stringify({ specVersion: '1.0', entries: incoming }, null, 2)}\\n`, changed: true };\n }\n return upsertJsonRows(text, 'entries', incoming as unknown as Record<string, unknown>[], {\n id: 'identifier',\n update: CATALOG_ROW_UPDATES,\n });\n}\n\nexport function projectCards(input: {\n faf: FafData;\n fafa?: FafaDoc;\n targets?: CardTarget[];\n opts?: ProjectCardsOptions;\n}): ProjectedCards {\n const opts = input.opts ?? {};\n const wanted = new Set(input.targets?.length ? input.targets : CARD_TARGETS);\n const block = fafContextBlock(input.faf, opts);\n const out: ProjectedCards = { block };\n\n if (wanted.has('mcp')) {\n out.mcp = buildServerCard(input.faf, opts);\n }\n if (wanted.has('registry')) {\n const title = registryTitle(input.faf);\n out.registry = {\n name: registryName(input.faf),\n ...(title ? { title } : {}),\n _meta: registryMeta(input.faf, opts),\n };\n }\n\n if (wanted.has('a2a') || wanted.has('catalog')) {\n if (!input.fafa) {\n if (input.targets?.includes('a2a') || input.targets?.includes('catalog')) {\n throw new Error('A2A/catalog require a .fafa (agent.fafa). Will not invent an agent.');\n }\n }\n }\n\n if (wanted.has('a2a') && input.fafa) {\n if (a2aDoors(input.fafa, opts).length === 0) {\n if (input.targets?.includes('a2a')) {\n throw new Error(\n \"No A2A endpoint in .fafa (need endpoints[].protocol: a2a + location). Will not invent a door.\",\n );\n }\n } else {\n out.a2a = buildA2ACard(input.fafa, input.faf, opts);\n }\n }\n\n if (wanted.has('catalog') && input.fafa) {\n out.catalog = catalogEntriesFor(input.fafa, input.faf, opts);\n }\n\n assertSameBlock(out);\n return out;\n}\n\n/** Byte-identical context block on every emitted door. */\nexport function assertSameBlock(cards: ProjectedCards): void {\n const want = JSON.stringify(cards.block);\n const got: string[] = [];\n if (cards.a2a) {\n got.push(JSON.stringify(cards.a2a.capabilities.extensions[0].params));\n }\n if (cards.mcp) {\n const meta = cards.mcp._meta as { 'one.faf/context': unknown };\n got.push(JSON.stringify(meta['one.faf/context']));\n }\n if (cards.registry) {\n const pp = cards.registry._meta['io.modelcontextprotocol.registry/publisher-provided'] as {\n 'one.faf/context': unknown;\n };\n got.push(JSON.stringify(pp['one.faf/context']));\n }\n for (const g of got) {\n if (g !== want) {\n throw new Error('context block drifted across card targets — one projector, one block');\n }\n }\n}\n\n/** True when `bytes` are an A2A Agent Card faf wrote: JSON whose\n * `capabilities.extensions` carry the FAF context extension\n * ({@link A2A_CONTEXT_URI}), as every card faf has written does. */\nexport function hasA2ACardMark(bytes: Uint8Array): boolean {\n let j: unknown;\n try {\n j = JSON.parse(new TextDecoder().decode(bytes).replace(/^\\uFEFF/, ''));\n } catch {\n return false;\n }\n const caps = typeof j === 'object' && j !== null ? (j as { capabilities?: { extensions?: unknown } }).capabilities : undefined;\n const exts = caps?.extensions;\n return Array.isArray(exts) && exts.some(e => typeof e === 'object' && e !== null && (e as { uri?: unknown }).uri === A2A_CONTEXT_URI);\n}\n\n/** True when `bytes` carry any of faf's card marks: the MCP Server Card's\n * `_meta[\"one.faf/context\"]`, a registry server.json's publisher-provided\n * `one.faf/context`, or the A2A card's FAF context extension. */\nexport function hasFafCardMark(bytes: Uint8Array): boolean {\n return hasServerCardMark(bytes) || hasRegistryMark(bytes) || hasA2ACardMark(bytes);\n}\n\n/** Options for {@link writeJson}. */\nexport interface WriteJsonOptions {\n /** True when the bytes already at the path carry faf's older mark (a file\n * faf wrote before render hashes). Default: one of faf's card marks\n * ({@link hasFafCardMark}). */\n owns?: (existing: Buffer) => boolean;\n /** faf's mark in words, for the refusal. */\n mark?: string;\n /** Replace a file faf cannot prove it wrote anyway — the explicit overwrite (`--force`). */\n force?: boolean;\n}\n\n/** Write `value` as JSON (2-space, final newline) with faf's render hash at\n * `_meta[\"one.faf/render\"]` — atomically, and never through a link that\n * leaves `root` (default: the file's own folder) or dangles. The folder is\n * created when missing, never through a link that leaves `root`. A file\n * already there is replaced only when it is byte for byte what faf last wrote\n * (its render hash still fits); a file edited since, one without faf's mark,\n * or one from before 7.13 that is not exactly this JSON is refused\n * (SafePathError `not-owned`) and left byte for byte, unless `force`.\n * Returns what it did: `created`, `updated`, or `unchanged` (the file\n * already held exactly these bytes, and nothing was written). */\nexport function writeJson(path: string, value: unknown, root?: string, write: WriteJsonOptions = {}): RenderedResult {\n makeDirInside(root ?? dirname(path), dirname(path));\n return writeRendered(path, `${JSON.stringify(value, null, 2)}\\n`, {\n root: root ?? dirname(path),\n format: 'json',\n hasMark: write.owns ?? hasFafCardMark,\n mark: write.mark ?? 'FAF context-block (a faf card mark)',\n force: write.force,\n }).result;\n}\n\n/** True when `bytes` are JSON laid out exactly as faf writes it (2-space\n * JSON and a final newline), so re-writing it loses nothing: no hand\n * formatting, no repeated key, no number JSON cannot hold exactly. */\nexport function isFafJsonLayout(bytes: Uint8Array): boolean {\n const text = new TextDecoder().decode(bytes);\n try {\n return `${JSON.stringify(JSON.parse(text), null, 2)}\\n` === text;\n } catch {\n return false;\n }\n}\n\nexport function parseTargets(raw?: string): CardTarget[] | undefined {\n if (!raw) {return undefined;}\n const parts = raw.split(',').map((s) => s.trim().toLowerCase()).filter(Boolean);\n const bad = parts.filter((p) => !CARD_TARGETS.includes(p as CardTarget));\n if (bad.length) {\n throw new Error(`unknown card target: ${bad.join(', ')} (use ${CARD_TARGETS.join(',')})`);\n }\n return parts as CardTarget[];\n}\n",
|
|
95
|
+
"import { existsSync } from 'fs';\nimport { basename, dirname, join } from 'path';\nimport { deprecate } from 'node:util';\nimport { parse } from 'yaml';\nimport type { FafData } from '../core/types.js';\nimport { makeDirInside, readUtf8, resolveInside } from '../core/safe-write.js';\nimport { writeRendered, type RenderedResult } from '../core/render-hash.js';\nimport { upsertJsonRows } from '../core/json-edit.js';\nimport {\n fafContextBlock,\n buildServerCard,\n hasRegistryMark,\n hasServerCardMark,\n registryMeta,\n registryName,\n registryTitle,\n type ServerCardOptions,\n} from './servercard.js';\n\n/** A2A extension URI — dereference, not the MCP `_meta` key `one.faf/context`. */\nexport const A2A_CONTEXT_URI = 'https://faf.one/context';\nexport const A2A_PROTOCOL_BINDING = 'JSONRPC';\nexport const A2A_PROTOCOL_VERSION = '1.0';\n\nexport type CardTarget = 'a2a' | 'mcp' | 'registry' | 'catalog';\nexport const CARD_TARGETS: CardTarget[] = ['a2a', 'mcp', 'registry', 'catalog'];\n\nexport interface FafaAgent {\n name?: string;\n displayName?: string;\n id?: string;\n vendor?: string;\n version?: string;\n description?: string;\n homepage?: string;\n}\n\nexport interface FafaCapability {\n name?: string;\n description?: string;\n tags?: unknown;\n}\n\nexport interface FafaEndpoint {\n protocol?: string;\n transport?: string;\n location?: string;\n version?: string;\n}\n\nexport interface FafaDoc {\n agent?: FafaAgent;\n capabilities?: FafaCapability[];\n endpoints?: FafaEndpoint[];\n provenance?: Record<string, unknown>;\n metadata?: { persona?: string };\n [key: string]: unknown;\n}\n\nexport interface ProjectCardsOptions extends ServerCardOptions {\n /** Public URL of the emitted A2A card (catalog row). */\n a2aCardUrl?: string;\n /** Caller-supplied A2A door when `.fafa` has no `endpoints[].protocol: a2a`. */\n doorUrl?: string;\n}\n\nexport interface ProjectedA2A {\n name: string;\n description: string;\n supportedInterfaces: Array<{\n url: string;\n protocolBinding: string;\n protocolVersion: string;\n }>;\n provider: { organization: string; url: string };\n version: string;\n capabilities: {\n streaming: boolean;\n pushNotifications: boolean;\n extendedAgentCard: boolean;\n extensions: Array<{\n uri: string;\n description: string;\n required: boolean;\n params: Record<string, unknown>;\n }>;\n };\n defaultInputModes: string[];\n defaultOutputModes: string[];\n skills: Array<{\n id: string;\n name: string;\n description: string;\n tags: string[];\n }>;\n}\n\nexport interface CatalogEntry {\n identifier: string;\n displayName?: string;\n type: string;\n description?: string;\n url: string;\n updatedAt?: string;\n}\n\nexport interface AiCatalog {\n specVersion: string;\n host?: Record<string, unknown>;\n entries: CatalogEntry[];\n [key: string]: unknown;\n}\n\nexport interface ProjectedCards {\n block: Record<string, unknown>;\n a2a?: ProjectedA2A;\n mcp?: Record<string, unknown>;\n registry?: {\n name: string;\n title?: string;\n _meta: Record<string, unknown>;\n };\n catalog?: CatalogEntry[];\n}\n\nexport function readFafa(path: string): FafaDoc {\n // A .fafa that links out of its folder is refused (SafePathError), never read:\n // a hostile repo's agent.fafa -> ~/.aws/credentials would otherwise be parsed\n // and quoted in an error. A link to a same-name file inside the folder is fine.\n return parse(readUtf8(resolveInside(dirname(path), basename(path)))) as FafaDoc;\n}\n\n/** Discover agent.fafa / .fafa (cwd, then one parent). */\nexport function findFafaFile(dir: string = process.cwd()): string | null {\n const candidates = ['agent.fafa', '.fafa'];\n for (const name of candidates) {\n const full = join(dir, name);\n if (existsSync(full)) {return full;}\n }\n const parent = dirname(dir);\n if (parent !== dir) {\n for (const name of candidates) {\n const full = join(parent, name);\n if (existsSync(full)) {return full;}\n }\n }\n return null;\n}\n\nexport function a2aEndpoints(fafa: FafaDoc): FafaEndpoint[] {\n return (fafa.endpoints ?? []).filter(\n (e) => String(e.protocol ?? '').toLowerCase() === 'a2a' && e.location,\n );\n}\n\n/** Authored A2A endpoints, else a single `doorUrl`. Never invents a door. */\nexport function a2aDoors(fafa: FafaDoc, opts: ProjectCardsOptions = {}): FafaEndpoint[] {\n const fromDoc = a2aEndpoints(fafa);\n if (fromDoc.length > 0) {return fromDoc;}\n const door = opts.doorUrl?.trim();\n if (door) {\n return [{ protocol: 'a2a', location: door, version: A2A_PROTOCOL_VERSION }];\n }\n return [];\n}\n\n/** Build the A2A Agent Card (JSON) from a .fafa + .faf. */\nexport function buildA2ACard(\n fafa: FafaDoc,\n faf: FafData,\n opts: ProjectCardsOptions = {},\n): ProjectedA2A {\n const agent = fafa.agent ?? {};\n const doors = a2aDoors(fafa, opts);\n if (doors.length === 0) {\n throw new Error(\n \"No A2A endpoint in .fafa (need endpoints[].protocol: a2a + location). Will not invent a door.\",\n );\n }\n const name = String(agent.displayName ?? fafa.metadata?.persona ?? agent.name ?? '').trim();\n const description = String(agent.description ?? '').trim();\n const version = String(agent.version ?? '').trim();\n const organization = String(agent.vendor ?? '').trim();\n const homepage = String(agent.homepage ?? '').trim();\n if (!name || !description || !version || !organization || !homepage) {\n throw new Error(\n 'A2A card needs agent.displayName|name, description, version, vendor, homepage in .fafa',\n );\n }\n\n const block = fafContextBlock(faf, opts);\n const skills = (fafa.capabilities ?? []).map((c) => {\n const id = String(c.name ?? '').trim();\n if (!id) {throw new Error('A2A skill missing capabilities[].name');}\n const tags = Array.isArray(c.tags) ? c.tags.map(String) : [];\n return {\n id,\n name: id,\n description: String(c.description ?? '').trim() || id,\n tags,\n };\n });\n\n return {\n name,\n description,\n supportedInterfaces: doors.map((e) => ({\n url: String(e.location),\n protocolBinding: A2A_PROTOCOL_BINDING,\n protocolVersion: String(e.version ?? A2A_PROTOCOL_VERSION),\n })),\n provider: { organization, url: homepage },\n version,\n capabilities: {\n streaming: false,\n pushNotifications: false,\n extendedAgentCard: false,\n extensions: [\n {\n uri: A2A_CONTEXT_URI,\n description:\n 'FAF context provenance — the durable context block (one context, every door).',\n required: false,\n params: block,\n },\n ],\n },\n defaultInputModes: ['text/plain', 'application/json'],\n defaultOutputModes: ['text/plain', 'application/json'],\n skills,\n };\n}\n\n/** @deprecated Use {@link buildA2ACard}. Removed in the next major. */\nexport const generateA2ACard = deprecate(\n buildA2ACard,\n 'faf-cli: generateA2ACard is deprecated, use buildA2ACard',\n 'FAF0003',\n);\n\nfunction catalogHost(fafa: FafaDoc): string {\n const homepage = fafa.agent?.homepage;\n if (!homepage) {return 'local';}\n try {\n return new URL(homepage).hostname.replace(/^www\\./, '');\n } catch {\n return 'local';\n }\n}\n\nfunction catalogA2AUrl(fafa: FafaDoc, opts: ProjectCardsOptions): string {\n if (opts.a2aCardUrl) {return opts.a2aCardUrl;}\n const homepage = fafa.agent?.homepage;\n if (homepage) {\n try {\n return new URL('/.well-known/agent-card.json', homepage).href;\n } catch { /* fall through */ }\n }\n return '/.well-known/agent-card.json';\n}\n\nexport function catalogEntriesFor(\n fafa: FafaDoc,\n faf: FafData,\n opts: ProjectCardsOptions = {},\n): CatalogEntry[] {\n const host = catalogHost(fafa);\n const agent = fafa.agent ?? {};\n const slug = String(agent.name ?? 'agent');\n const now = opts.now ?? (faf.generated as string | undefined) ?? new Date().toISOString();\n const entries: CatalogEntry[] = [];\n\n if (a2aDoors(fafa, opts).length > 0) {\n entries.push({\n identifier: `urn:air:${host}:a2a:${slug}`,\n displayName: String(agent.displayName ?? agent.name ?? 'A2A Agent Card'),\n type: 'application/a2a-agent-card+json',\n description: 'A2A v1.0 Agent Card. Projected from .fafa.',\n url: catalogA2AUrl(fafa, opts),\n updatedAt: now,\n });\n }\n\n const fafaUrl = homepageWellKnown(fafa, 'fafa');\n if (fafaUrl) {\n entries.push({\n identifier: `urn:air:${host}:agent:${slug}`,\n displayName: String(agent.displayName ?? agent.name ?? '.fafa'),\n type: 'application/vnd.fafa+yaml',\n description: 'FAF agent passport (.fafa).',\n url: fafaUrl,\n updatedAt: now,\n });\n }\n\n return entries;\n}\n\nfunction homepageWellKnown(fafa: FafaDoc, name: string): string | undefined {\n const homepage = fafa.agent?.homepage;\n if (!homepage) {return undefined;}\n try {\n return new URL(`/.well-known/${name}`, homepage).href;\n } catch {\n return undefined;\n }\n}\n\n/** The row in `entries` that is faf's own row `row`: the one whose\n * identifier is exactly faf's (`urn:air:<host>:a2a:<slug>` or\n * `urn:air:<host>:agent:<slug>`). Never matched by type or URL — a row of\n * yours for another agent, or another card of the same type, is not faf's. */\nfunction catalogMatchIndex(entries: CatalogEntry[], row: CatalogEntry): number {\n return entries.findIndex((e) => e.identifier === row.identifier);\n}\n\n/** Upsert projector entries into an existing catalog. Leaves every other row\n * alone: a row is faf's only when its identifier is exactly faf's (never by\n * type or URL). On match, only url / type / updatedAt move — host copy\n * (title, tags) stays; any other faf row is appended. */\nexport function upsertCatalog(existing: AiCatalog | undefined, incoming: CatalogEntry[]): AiCatalog {\n const base: AiCatalog = existing\n ? { ...existing, entries: [...(existing.entries ?? [])] }\n : { specVersion: '1.0', entries: [] };\n for (const row of incoming) {\n const i = catalogMatchIndex(base.entries, row);\n if (i >= 0) {\n base.entries[i] = {\n ...base.entries[i],\n url: row.url,\n type: row.type,\n ...(row.updatedAt ? { updatedAt: row.updatedAt } : {}),\n };\n } else {\n base.entries.push(row);\n }\n }\n return base;\n}\n\n/** The keys of a catalog row faf updates in place (its own row only). */\nconst CATALOG_ROW_UPDATES = ['url', 'type', 'updatedAt'] as const;\n\n/**\n * {@link upsertCatalog} as a text edit of the catalog's JSON: faf's own rows\n * (identifier exactly faf's) get their url / type / updatedAt values changed\n * in place, faf's other rows are appended after the last entry, and every\n * other byte — your rows, their order and layout, other keys — stays. With no\n * text (no catalog yet) a new catalog is returned. Throws a JsonEditError,\n * changing nothing, when the catalog cannot be edited that way (not a JSON\n * object, `entries` not an array, faf's row there twice, …).\n */\nexport function upsertCatalogText(text: string | null, incoming: CatalogEntry[]): { text: string; changed: boolean } {\n if (text === null) {\n return { text: `${JSON.stringify({ specVersion: '1.0', entries: incoming }, null, 2)}\\n`, changed: true };\n }\n return upsertJsonRows(text, 'entries', incoming as unknown as Record<string, unknown>[], {\n id: 'identifier',\n update: CATALOG_ROW_UPDATES,\n });\n}\n\nexport function projectCards(input: {\n faf: FafData;\n fafa?: FafaDoc;\n targets?: CardTarget[];\n opts?: ProjectCardsOptions;\n}): ProjectedCards {\n const opts = input.opts ?? {};\n const wanted = new Set(input.targets?.length ? input.targets : CARD_TARGETS);\n const block = fafContextBlock(input.faf, opts);\n const out: ProjectedCards = { block };\n\n if (wanted.has('mcp')) {\n out.mcp = buildServerCard(input.faf, opts);\n }\n if (wanted.has('registry')) {\n const title = registryTitle(input.faf);\n out.registry = {\n name: registryName(input.faf),\n ...(title ? { title } : {}),\n _meta: registryMeta(input.faf, opts),\n };\n }\n\n if (wanted.has('a2a') || wanted.has('catalog')) {\n if (!input.fafa) {\n if (input.targets?.includes('a2a') || input.targets?.includes('catalog')) {\n throw new Error('A2A/catalog require a .fafa (agent.fafa). Will not invent an agent.');\n }\n }\n }\n\n if (wanted.has('a2a') && input.fafa) {\n if (a2aDoors(input.fafa, opts).length === 0) {\n if (input.targets?.includes('a2a')) {\n throw new Error(\n \"No A2A endpoint in .fafa (need endpoints[].protocol: a2a + location). Will not invent a door.\",\n );\n }\n } else {\n out.a2a = buildA2ACard(input.fafa, input.faf, opts);\n }\n }\n\n if (wanted.has('catalog') && input.fafa) {\n out.catalog = catalogEntriesFor(input.fafa, input.faf, opts);\n }\n\n assertSameBlock(out);\n return out;\n}\n\n/** Byte-identical context block on every emitted door. */\nexport function assertSameBlock(cards: ProjectedCards): void {\n const want = JSON.stringify(cards.block);\n const got: string[] = [];\n if (cards.a2a) {\n got.push(JSON.stringify(cards.a2a.capabilities.extensions[0].params));\n }\n if (cards.mcp) {\n const meta = cards.mcp._meta as { 'one.faf/context': unknown };\n got.push(JSON.stringify(meta['one.faf/context']));\n }\n if (cards.registry) {\n const pp = cards.registry._meta['io.modelcontextprotocol.registry/publisher-provided'] as {\n 'one.faf/context': unknown;\n };\n got.push(JSON.stringify(pp['one.faf/context']));\n }\n for (const g of got) {\n if (g !== want) {\n throw new Error('context block drifted across card targets — one projector, one block');\n }\n }\n}\n\n/** True when `bytes` are an A2A Agent Card faf wrote: JSON whose\n * `capabilities.extensions` carry the FAF context extension\n * ({@link A2A_CONTEXT_URI}), as every card faf has written does. */\nexport function hasA2ACardMark(bytes: Uint8Array): boolean {\n let j: unknown;\n try {\n j = JSON.parse(new TextDecoder().decode(bytes).replace(/^\\uFEFF/, ''));\n } catch {\n return false;\n }\n const caps = typeof j === 'object' && j !== null ? (j as { capabilities?: { extensions?: unknown } }).capabilities : undefined;\n const exts = caps?.extensions;\n return Array.isArray(exts) && exts.some(e => typeof e === 'object' && e !== null && (e as { uri?: unknown }).uri === A2A_CONTEXT_URI);\n}\n\n/** True when `bytes` carry any of faf's card marks: the MCP Server Card's\n * `_meta[\"one.faf/context\"]`, a registry server.json's publisher-provided\n * `one.faf/context`, or the A2A card's FAF context extension. */\nexport function hasFafCardMark(bytes: Uint8Array): boolean {\n return hasServerCardMark(bytes) || hasRegistryMark(bytes) || hasA2ACardMark(bytes);\n}\n\n/** Options for {@link writeJson}. */\nexport interface WriteJsonOptions {\n /** True when the bytes already at the path carry faf's older mark (a file\n * faf wrote before render hashes). Default: one of faf's card marks\n * ({@link hasFafCardMark}). */\n owns?: (existing: Buffer) => boolean;\n /** faf's mark in words, for the refusal. */\n mark?: string;\n /** Replace a file faf cannot prove it wrote anyway — the explicit overwrite (`--force`). */\n force?: boolean;\n}\n\n/** Write `value` as JSON (2-space, final newline) with faf's render hash at\n * `_meta[\"one.faf/render\"]` — atomically, and never through a link that\n * leaves `root` (default: the file's own folder) or dangles. The folder is\n * created when missing, never through a link that leaves `root`. A file\n * already there is replaced only when it is byte for byte what faf last wrote\n * (its render hash still fits); a file edited since, one without faf's mark,\n * or one from before 7.13 that is not exactly this JSON is refused\n * (SafePathError `not-owned`) and left byte for byte, unless `force`.\n * Returns what it did: `created`, `updated`, or `unchanged` (the file\n * already held exactly these bytes, and nothing was written). */\nexport function writeJson(path: string, value: unknown, root?: string, write: WriteJsonOptions = {}): RenderedResult {\n makeDirInside(root ?? dirname(path), dirname(path));\n return writeRendered(path, `${JSON.stringify(value, null, 2)}\\n`, {\n root: root ?? dirname(path),\n format: 'json',\n hasMark: write.owns ?? hasFafCardMark,\n mark: write.mark ?? 'FAF context-block (a faf card mark)',\n force: write.force,\n }).result;\n}\n\n/** True when `bytes` are JSON laid out exactly as faf writes it (2-space\n * JSON and a final newline), so re-writing it loses nothing: no hand\n * formatting, no repeated key, no number JSON cannot hold exactly. */\nexport function isFafJsonLayout(bytes: Uint8Array): boolean {\n const text = new TextDecoder().decode(bytes);\n try {\n return `${JSON.stringify(JSON.parse(text), null, 2)}\\n` === text;\n } catch {\n return false;\n }\n}\n\nexport function parseTargets(raw?: string): CardTarget[] | undefined {\n if (!raw) {return undefined;}\n const parts = raw.split(',').map((s) => s.trim().toLowerCase()).filter(Boolean);\n const bad = parts.filter((p) => !CARD_TARGETS.includes(p as CardTarget));\n if (bad.length) {\n throw new Error(`unknown card target: ${bad.join(', ')} (use ${CARD_TARGETS.join(',')})`);\n }\n return parts as CardTarget[];\n}\n",
|
|
96
96
|
"/**\n * .fafm types — INTEROP-aligned with claude-fafm-sdk 1.0.0\n * application/vnd.fafm+yaml v1.1\n */\n\nexport const PRIORITY_ORDER = ['ephemeral', 'standard', 'high', 'critical'] as const;\nexport type Priority = (typeof PRIORITY_ORDER)[number];\n\nexport const PRIORITY_RANK: Record<string, number> = Object.fromEntries(\n PRIORITY_ORDER.map((p, i) => [p, i]),\n);\n\nexport const KNOWLEDGE_TYPES = new Set(['user', 'feedback', 'project', 'reference']);\n\nexport const KNOWN_DOC_KEYS = new Set([\n 'version',\n 'profile',\n 'namepoint',\n 'created',\n 'last_etched',\n 'retention',\n 'index',\n 'memory',\n]);\n\nexport const KNOWN_MEMORY_KEYS = new Set(['facts', 'sessions', 'preferences', 'custom']);\n\nexport const LEGACY_PRIORITY: Record<string, Priority> = {\n low: 'ephemeral',\n medium: 'standard',\n};\n\nexport interface Fact {\n text: string;\n id?: string | null;\n type?: string | null;\n priority: Priority | string;\n tags: string[];\n links: string[];\n timestamp?: string | null;\n source?: string | null;\n /** Unknown fact fields (INTEROP §4) */\n extra: Record<string, unknown>;\n}\n\nexport type Profile = 'voice' | 'knowledge';\n\nexport interface SoulDoc {\n version: string;\n profile: string;\n namepoint: string;\n created: string;\n last_etched: string;\n retention: string;\n index: string[];\n memory: {\n facts: unknown[];\n sessions: unknown[];\n preferences: Record<string, unknown>;\n custom: Record<string, unknown>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n",
|
|
97
97
|
"/**\n * Soul — local .fafm model (TS mirror of claude-fafm-sdk 1.0 Soul).\n * INTEROP: load/save fidelity, residual preserve, recall SoT.\n *\n * A soul loaded from a file keeps that file's text. `save` writes only what\n * changed since the load (or the last save) into it — through the YAML\n * Document, so comments, key order, quoting, the `version`, a missing\n * `profile`, a hand-kept `index` and every unknown key stay as they were.\n * Known keys faf does not model in the shape the file has them (a `facts` or\n * `index` written as a mapping, `sessions` as a mapping, …) are kept verbatim;\n * a change that would have to rewrite one is refused, with nothing written.\n */\n\nimport { existsSync } from 'fs';\nimport { dirname, resolve } from 'path';\nimport { isMap as isYamlMap, stringify as stringifyYaml, type Document } from 'yaml';\nimport { SafePathError, readBytesIfPresent, readUtf8, resolveInside, safeWriteFile } from '../core/safe-write.js';\nimport { describeShape, isMapping } from '../core/shape.js';\nimport { applyChange, changeAt, editYaml, parseForEdit, sameJs, seqAt } from '../core/yaml-edit.js';\nimport {\n KNOWN_DOC_KEYS,\n KNOWN_MEMORY_KEYS,\n LEGACY_PRIORITY,\n PRIORITY_RANK,\n type Fact,\n type SoulDoc,\n} from './types.js';\n\nexport function utcNow(): string {\n return new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n}\n\nfunction isNil(v: unknown): v is null | undefined {\n return v === null || v === undefined;\n}\n\n/** Plain words for a YAML value's shape, for load errors. */\nfunction shapeOf(v: unknown): string {\n if (Array.isArray(v)) {return `a list (${v.length} item${v.length === 1 ? '' : 's'})`;}\n if (isNil(v)) {return 'empty';}\n if (typeof v === 'string') {return `a string (${JSON.stringify(v.length > 40 ? `${v.slice(0, 40)}…` : v)})`;}\n return `a ${typeof v}`;\n}\n\nconst isMap = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v);\n\n/** A soul file's real path and text. A soul.fafm link must stay inside its\n * folder and end at a .faf/.fafm file (SafePathError otherwise) — never read\n * ~/.aws/credentials as a soul — and the text must be UTF-8 (a soul that is\n * not is refused, never re-encoded). */\nfunction readSoulText(path: string): { real: string; text: string } {\n const full = resolve(path);\n const real = resolveInside(dirname(full), full, { read: true });\n return { real, text: readUtf8(real) };\n}\n\n/** Write `text` to `path` unless the file already holds exactly these bytes;\n * returns the real path. `loaded` is the file a soul was loaded from and the\n * text read: when this is that file, a text that is still `loaded.text` has\n * nothing new to write (whatever is on disk now stays), and otherwise the\n * file must still hold `loaded.text` — else it changed on disk after the\n * load, and the write is refused (SafePathError `changed`) rather than\n * written over the edit. Any other path — a soul made with no file, or a\n * save to a file the soul was not loaded from — must have no file there,\n * unless `replace` asks to write over it: a file already there is refused\n * with \"<file> already exists — not written; pass { replace: true } (faf\n * memory convert --force) to replace it\" (SafePathError `changed`: it is not\n * the no-file the soul was made for), and one that appears while faf writes\n * with the \"changed on disk\" line. Link rules and the atomic write are\n * safeWriteFile's. */\nfunction writeUnlessSame(path: string, text: string, loaded: { real: string; text: string } | undefined, replace: boolean): string {\n const full = resolve(path);\n const target = resolveInside(dirname(full), full);\n const ownFile = loaded !== undefined && loaded.real === target;\n if (ownFile && loaded.text === text) {return target;}\n let now: Buffer | null | undefined;\n try {\n now = readBytesIfPresent(target);\n } catch {\n now = undefined; // unreadable: the write below says why\n }\n if (now && now.equals(Buffer.from(text, 'utf-8'))) {return target;}\n if (!ownFile && !replace && now) {\n throw new SafePathError(\n 'changed',\n full,\n `${full} already exists — not written; pass { replace: true } (faf memory convert --force) to replace it`,\n { onWrite: true },\n );\n }\n const expect = ownFile ? loaded.text : replace ? now : null;\n return safeWriteFile(path, text, expect === undefined ? {} : { expect });\n}\n\nexport function canonicalPriority(p: string | null | undefined): string {\n if (isNil(p)) {return 'standard';}\n if (LEGACY_PRIORITY[p]) {return LEGACY_PRIORITY[p];}\n if (p in PRIORITY_RANK) {return p;}\n return 'standard';\n}\n\nconst KNOWN_FACT = new Set([\n 'text',\n 'id',\n 'type',\n 'priority',\n 'tags',\n 'links',\n 'timestamp',\n 'source',\n]);\n\nexport function factFromObj(obj: unknown): Fact {\n if (typeof obj === 'string') {\n return {\n text: obj,\n id: null,\n type: null,\n priority: 'standard',\n tags: [],\n links: [],\n timestamp: null,\n source: null,\n extra: {},\n };\n }\n if (!obj || typeof obj !== 'object' || !('text' in obj)) {\n throw new Error(`fact must be a string or a mapping with 'text': ${JSON.stringify(obj)}`);\n }\n const o = obj as Record<string, unknown>;\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) {\n if (!KNOWN_FACT.has(k)) {extra[k] = v;}\n }\n return {\n text: String(o.text),\n id: (o.id as string) ?? null,\n type: (o.type as string) ?? null,\n priority: canonicalPriority(o.priority as string | undefined),\n tags: Array.isArray(o.tags) ? (o.tags as string[]).slice() : [],\n links: Array.isArray(o.links) ? (o.links as string[]).slice() : [],\n timestamp: (o.timestamp as string) ?? null,\n source: (o.source as string) ?? null,\n extra,\n };\n}\n\nexport function factToObj(f: Fact): unknown {\n const bare =\n isNil(f.id) &&\n isNil(f.type) &&\n f.tags.length === 0 &&\n f.links.length === 0 &&\n isNil(f.timestamp) &&\n isNil(f.source) &&\n Object.keys(f.extra).length === 0 &&\n f.priority === 'standard';\n if (bare) {return f.text;}\n const out: Record<string, unknown> = { text: f.text };\n if (!isNil(f.id)) {out.id = f.id;}\n if (!isNil(f.type)) {out.type = f.type;}\n out.priority = f.priority;\n if (f.tags.length) {out.tags = f.tags;}\n if (f.links.length) {out.links = f.links;}\n if (!isNil(f.timestamp)) {out.timestamp = f.timestamp;}\n if (!isNil(f.source)) {out.source = f.source;}\n Object.assign(out, f.extra);\n return out;\n}\n\n/** A complete Fact: a bare string, or a partial object (text only, say), is\n * made whole with factFromObj; a complete Fact is kept as it is. */\nfunction asFact(value: unknown): Fact {\n const f = value as Fact;\n const whole = isMap(value) && typeof f.text === 'string' && Array.isArray(f.tags) &&\n Array.isArray(f.links) && isMap(f.extra) && typeof f.priority === 'string';\n return whole ? f : factFromObj(value);\n}\n\n/** A list item that is a fact (a string, or a mapping with `text`), or null. */\nfunction factFromItem(item: unknown): Fact | null {\n if (typeof item === 'string' || (isMap(item) && 'text' in item)) {return factFromObj(item);}\n return null;\n}\n\n/** Filters for {@link Soul.recall}. */\nexport interface RecallOptions {\n tags?: string[];\n type?: string;\n minPriority?: string;\n limit?: number | null;\n}\n\n/** Everything a soul models, as plain values — what the file held at load\n * (or at the last save), compared with the soul's state at save. */\ninterface SoulState {\n top: Record<string, unknown>;\n index: string[];\n sessions: unknown[];\n preferences: Record<string, unknown>;\n custom: Record<string, unknown>;\n extra: Record<string, unknown>;\n memoryExtra: Record<string, unknown>;\n /** Item position in memory.facts → the fact as it was written there. */\n facts: Map<number, unknown>;\n}\n\n/** Where a loaded soul came from. */\ninterface Origin {\n path: string;\n /** The file's real path (links followed), when the text came from disk. */\n real?: string;\n text: string;\n base: SoulState;\n /** Known keys the file has in a shape faf does not model, and that shape\n * (`memory.facts` → 'a mapping'). Kept verbatim. */\n residual: Map<string, string>;\n}\n\nconst TOP_KEYS = ['profile', 'namepoint', 'created', 'last_etched', 'retention'] as const;\n\nexport class Soul {\n namepoint: string;\n profile: string;\n retention: string;\n created: string;\n last_etched: string;\n private _facts: Fact[];\n private _byId: Map<string, number>;\n private _index: string[];\n private _sessions: unknown[];\n private _preferences: Record<string, unknown>;\n private _custom: Record<string, unknown>;\n private _extra: Record<string, unknown>;\n private _memoryExtra: Record<string, unknown>;\n private _version: string | undefined;\n /** The file the soul was loaded from or last saved to. Undefined while the\n * soul was made with no file (in memory, not saved yet): its first save\n * then refuses a file already at the path — one that appeared since the\n * caller found none — unless `replace`. */\n private _origin: Origin | undefined;\n /** Each loaded fact's item position in the file's memory.facts. */\n private _factAt = new WeakMap<Fact, number>();\n /** The index was faf-derived when the soul was loaded (or made, or last\n * saved) — the default save keeps it in step with the facts. */\n private _indexDerived = true;\n /** The index as it was then: an index changed in memory since is the\n * caller's, and the default save leaves it as it is. */\n private _indexAtRecord: string[] = [];\n\n constructor(\n namepoint: string,\n opts: {\n profile?: string;\n facts?: Fact[];\n retention?: string;\n created?: string | null;\n index?: string[];\n sessions?: unknown[];\n preferences?: Record<string, unknown>;\n custom?: Record<string, unknown>;\n extra?: Record<string, unknown>;\n memoryExtra?: Record<string, unknown>;\n } = {},\n ) {\n this.namepoint = namepoint;\n this.profile = opts.profile ?? 'knowledge';\n this.retention = opts.retention ?? 'forever';\n this.created = opts.created ?? utcNow();\n this.last_etched = this.created;\n // Bare strings are facts too: made whole so recall and save see `text`.\n this._facts = opts.facts ? opts.facts.map(asFact) : [];\n this._byId = new Map();\n this._facts.forEach((f, i) => {\n if (!isNil(f.id)) {this._byId.set(f.id, i);}\n });\n this._index = opts.index ? opts.index.slice() : [];\n this._sessions = opts.sessions ? structuredClone(opts.sessions) : [];\n this._preferences = opts.preferences ? { ...opts.preferences } : {};\n this._custom = opts.custom ? { ...opts.custom } : {};\n this._extra = opts.extra ? { ...opts.extra } : {};\n this._memoryExtra = opts.memoryExtra ? { ...opts.memoryExtra } : {};\n // A new soul's index is faf's: none given, or exactly the one faf derives.\n this._indexDerived = opts.index === undefined || sameJs(this._index, this.derivedIndex());\n this._indexAtRecord = this._index.slice();\n }\n\n get facts(): Fact[] {\n return this._facts;\n }\n\n get index(): string[] {\n return this._index;\n }\n\n get sessions(): unknown[] {\n return this._sessions;\n }\n\n get preferences(): Record<string, unknown> {\n return this._preferences;\n }\n\n get custom(): Record<string, unknown> {\n return this._custom;\n }\n\n get extra(): Record<string, unknown> {\n return this._extra;\n }\n\n get memoryExtra(): Record<string, unknown> {\n return this._memoryExtra;\n }\n\n /**\n * Load a soul. The root must be a mapping (anything else is refused). Known\n * keys in a shape faf does not model — `memory.facts` or `index` written as\n * a mapping, `memory.sessions` as a mapping, `memory.preferences` as a list,\n * `memory` itself as a list — load as empty and stay in the file verbatim;\n * so do list items in `memory.facts` that are not facts.\n */\n static load(path: string): Soul {\n if (!existsSync(path)) {\n throw new Error(`soul file not found: ${path}`);\n }\n const { real, text } = readSoulText(path);\n return Soul.fromText(text, path, real);\n }\n\n private static fromText(raw: string, path: string, real?: string): Soul {\n const doc: unknown = parseForEdit(raw, path).toJS();\n // Shape guard: a list or scalar root would be spread into index keys (or\n // dropped) and the next save would write that back. Refuse; change nothing.\n if (!isMap(doc)) {\n throw new Error(`soul is not a YAML mapping: ${path} is ${shapeOf(doc)}`);\n }\n const shape = new ShapeReader();\n const memory = shape.pick('memory', doc.memory, isMapping) ?? {};\n const soul = new Soul(String(doc.namepoint ?? path.replace(/.*\\//, '').replace(/\\.fafm$/, '')), {\n profile: String(doc.profile ?? 'voice'),\n retention: String(doc.retention ?? 'forever'),\n created: (doc.created as string) ?? null,\n ...shape.modelled(doc, memory),\n });\n (shape.pick('memory.facts', memory.facts, Array.isArray) ?? []).forEach((item, i) => {\n const fact = factFromItem(item);\n if (fact) {soul.adopt(fact, i);}\n });\n soul.last_etched = String(doc.last_etched ?? soul.created);\n soul._version = isNil(doc.version) ? undefined : String(doc.version);\n soul._origin = { path, real, text: raw, base: soul.state(), residual: shape.residual };\n soul.recordIndex();\n return soul;\n }\n\n /** Note whether the index is faf-derived now (at load, and after a save). */\n private recordIndex(): void {\n this._indexDerived = this.indexIsDerived();\n this._indexAtRecord = this._index.slice();\n }\n\n /** Take a fact read from item `i` of the file's memory.facts. */\n private adopt(fact: Fact, i: number): void {\n this._facts.push(fact);\n if (!isNil(fact.id)) {this._byId.set(fact.id, this._facts.length - 1);}\n this._factAt.set(fact, i);\n }\n\n static fromFile(path: string): Soul {\n return Soul.load(path);\n }\n\n toDoc(): SoulDoc {\n const memory: SoulDoc['memory'] = {\n facts: this._facts.map(factToObj),\n sessions: structuredClone(this._sessions),\n preferences: structuredClone(this._preferences),\n custom: structuredClone(this._custom),\n };\n for (const [k, v] of Object.entries(this._memoryExtra)) {\n if (!KNOWN_MEMORY_KEYS.has(k)) {memory[k] = structuredClone(v);}\n }\n const doc: SoulDoc = {\n version: this._version ?? '1.1',\n profile: this.profile,\n namepoint: this.namepoint,\n created: this.created,\n last_etched: this.last_etched,\n retention: this.retention,\n index: this._index.slice(),\n memory,\n };\n for (const [k, v] of Object.entries(this._extra)) {\n if (!KNOWN_DOC_KEYS.has(k)) {doc[k] = structuredClone(v);}\n }\n return doc;\n }\n\n toYaml(): string {\n return stringifyYaml(this.toDoc(), { lineWidth: 100 });\n }\n\n /** The index faf derives from the facts (INTEROP §5 formula,\n * `${id ?? '?'} — ${text[:width]}` per fact) — without changing the soul. */\n derivedIndex(width = 80): string[] {\n return this._facts.map((f) => `${f.id ?? '?'} — ${String(f.text).slice(0, width)}`);\n }\n\n /** True when the stored index is exactly the one faf derives from the facts\n * (so faf wrote it, and may rewrite it). A hand-kept index is not. */\n indexIsDerived(width = 80): boolean {\n return !this._origin?.residual.has('index') && sameJs(this._index, this.derivedIndex(width));\n }\n\n rebuildIndex(width = 80): string[] {\n this._index = this.derivedIndex(width);\n // Rebuilt by faf: the default save keeps it in step from here on.\n this._indexDerived = true;\n this._indexAtRecord = this._index.slice();\n return this._index;\n }\n\n /**\n * Write the soul — atomically (a failure leaves the original as it was)\n * and never through a link that leaves the folder or dangles.\n *\n * A soul loaded from a file is written as that file's text with only what\n * changed since the load (or the last save) edited into it; a save that\n * changes nothing writes nothing.\n *\n * The index: `reindex: true` rebuilds it from the facts, `reindex: false`\n * keeps it as it is. Left out, the index is rebuilt only when it was\n * faf-derived — {@link indexIsDerived} when the soul was loaded or last\n * saved; a new soul counts as derived unless it was given an index of its\n * own — and has not been changed in memory since. A hand-kept index is\n * never touched.\n * Refused, with nothing written: a change to a known key the file holds in\n * a shape faf does not model (adding a fact to `memory.facts` written as a\n * mapping, say); a save over the file the soul was loaded from (or last\n * saved to) when that file changed on disk since — SafePathError `changed`,\n * so an edit made meanwhile is never written over; and a save of a soul\n * made with no file (or to a path it was not loaded from) when a file is\n * already there — the same `changed` refusal, so a soul.fafm that appeared\n * after the caller found none is kept. `replace: true` is the explicit\n * overwrite of such a file (`faf memory convert --force`).\n */\n save(path: string, opts: { reindex?: boolean; replace?: boolean } = {}): string {\n const reindex = opts.reindex ?? (this._indexDerived && sameJs(this._index, this._indexAtRecord));\n if (reindex) {this.rebuildIndex();}\n const replace = opts.replace === true;\n const origin = this._origin;\n if (!origin) {\n const text = this.toYaml();\n // Made with no file: nothing may be there now (unless replace).\n const real = writeUnlessSame(path, text, undefined, replace);\n this.settle(path, text, new Map(this._facts.map((f, i) => [f, i])), real);\n return path;\n }\n let positions = new Map<Fact, number>();\n const { text } = editYaml(origin.text, (doc) => {\n positions = this.applyTo(doc, origin, reindex);\n }, path);\n // Refused, with nothing written, if the file changed on disk since the load.\n const real = writeUnlessSame(path, text, origin.real === undefined ? undefined : { real: origin.real, text: origin.text }, replace);\n this.settle(path, text, positions, real);\n return path;\n }\n\n toFile(path: string, opts: { reindex?: boolean; replace?: boolean } = {}): string {\n return this.save(path, opts);\n }\n\n /** After a save: the written text (at `real`) is the new origin. */\n private settle(path: string, text: string, positions: Map<Fact, number>, real: string): void {\n this._factAt = new WeakMap();\n for (const [f, i] of positions) {this._factAt.set(f, i);}\n this._origin = { path, real, text, base: this.state(), residual: this._origin?.residual ?? new Map() };\n this.recordIndex();\n }\n\n /** The soul's modelled state as plain values. */\n private state(): SoulState {\n const facts = new Map<number, unknown>();\n for (const f of this._facts) {\n const at = this._factAt.get(f);\n if (at !== undefined) {facts.set(at, structuredClone(factToObj(f)));}\n }\n return {\n top: Object.fromEntries(TOP_KEYS.map((k) => [k, this[k]])),\n index: this._index.slice(),\n sessions: structuredClone(this._sessions),\n preferences: structuredClone(this._preferences),\n custom: structuredClone(this._custom),\n extra: structuredClone(this._extra),\n memoryExtra: structuredClone(this._memoryExtra),\n facts,\n };\n }\n\n /** Refuse a change that would rewrite a key kept verbatim. */\n private static refuse(origin: Origin, key: string, what: string): never {\n throw new Error(\n `${origin.path}: ${key} is ${origin.residual.get(key)} in the file, not the shape faf writes — ` +\n `faf keeps it as it is and will not ${what}. Nothing written.`,\n );\n }\n\n /** Edit the loaded Document with what changed since `origin.base`; returns\n * each fact's item position in memory.facts afterwards. */\n private applyTo(doc: Document, origin: Origin, reindexed: boolean): Map<Fact, number> {\n const base = origin.base;\n const now = this.state();\n const name = origin.path;\n for (const key of TOP_KEYS) {\n if (base.top[key] !== now.top[key]) {doc.set(key, now.top[key]);}\n }\n if (!sameJs(base.index, now.index)) {\n if (origin.residual.has('index') && !reindexed) {Soul.refuse(origin, 'index', 'replace it');}\n changeAt(doc, ['index'], origin.residual.has('index') ? undefined : base.index, now.index, name);\n }\n for (const key of unionKeys(base.extra, now.extra)) {\n changeAt(doc, [key], base.extra[key], now.extra[key], name);\n }\n this.applyMemory(doc, origin, base, now);\n return this.applyFacts(doc, origin);\n }\n\n private applyMemory(doc: Document, origin: Origin, base: SoulState, now: SoulState): void {\n const parts: Array<[string, unknown, unknown]> = [\n ['sessions', base.sessions, now.sessions],\n ['preferences', base.preferences, now.preferences],\n ['custom', base.custom, now.custom],\n ...unionKeys(base.memoryExtra, now.memoryExtra).map(\n (k): [string, unknown, unknown] => [k, base.memoryExtra[k], now.memoryExtra[k]],\n ),\n ];\n for (const [key, before, after] of parts) {\n if (sameJs(before, after)) {continue;}\n if (origin.residual.has('memory')) {Soul.refuse(origin, 'memory', `change memory.${key}`);}\n if (origin.residual.has(`memory.${key}`)) {Soul.refuse(origin, `memory.${key}`, 'replace it');}\n changeAt(doc, ['memory', key], before, after, origin.path);\n }\n }\n\n /** Which facts are still at their place in the file, and which are new.\n * Kept facts must be in the file's order, new ones after them. */\n private sortFacts(origin: Origin): { kept: Array<[Fact, number]>; added: Fact[] } {\n const kept: Array<[Fact, number]> = [];\n const added: Fact[] = [];\n for (const f of this._facts) {\n const at = this._factAt.get(f);\n if (at === undefined) {\n added.push(f);\n continue;\n }\n if (added.length > 0 || (kept.length > 0 && at <= kept[kept.length - 1][1])) {\n throw new Error(`${origin.path}: the facts were reordered — faf keeps the order soul.fafm has. Nothing written.`);\n }\n kept.push([f, at]);\n }\n return { kept, added };\n }\n\n /** Facts: changed facts are edited where they are (only the fields that\n * changed), deleted ones removed, new ones appended. List items that are\n * not facts are never touched. */\n private applyFacts(doc: Document, origin: Origin): Map<Fact, number> {\n const { kept, added } = this.sortFacts(origin);\n const keptAt = new Set(kept.map(([, at]) => at));\n const gone = [...origin.base.facts.keys()].filter((at) => !keptAt.has(at)).sort((a, b) => b - a);\n const changed = kept.filter(([f, at]) => !sameJs(origin.base.facts.get(at), factToObj(f)));\n const positions = new Map<Fact, number>(kept);\n if (added.length === 0 && gone.length === 0 && changed.length === 0) {return positions;}\n for (const key of ['memory', 'memory.facts']) {\n if (origin.residual.has(key)) {Soul.refuse(origin, key, 'add facts to it');}\n }\n const seq = seqAt(doc, ['memory', 'facts'], origin.path);\n for (const [f, at] of changed) {\n seq.items[at] = editFact(doc, seq.items[at], origin.base.facts.get(at), factToObj(f));\n }\n for (const at of gone) {seq.items.splice(at, 1);}\n for (const [f, at] of kept) {positions.set(f, at - gone.filter((g) => g < at).length);}\n for (const f of added) {\n positions.set(f, seq.items.length);\n seq.items.push(doc.createNode(factToObj(f)));\n }\n return positions;\n }\n\n /** Insert or overwrite a Fact by id, preserving every field it carries (its\n * timestamp included) — the INTEROP merge primitive: on an existing id the\n * whole Fact is replaced. `etch` merges instead. */\n add(fact: Fact): Fact {\n const whole = asFact(fact);\n if (!isNil(whole.id) && this._byId.has(whole.id)) {\n const idx = this._byId.get(whole.id);\n if (idx !== undefined) {\n const at = this._factAt.get(this._facts[idx]);\n this._facts[idx] = whole;\n if (at !== undefined) {this._factAt.set(whole, at);}\n }\n } else {\n this._facts.push(whole);\n if (!isNil(whole.id)) {this._byId.set(whole.id, this._facts.length - 1);}\n }\n if (whole.timestamp && whole.timestamp > (this.last_etched || '')) {\n this.last_etched = whole.timestamp;\n }\n return whole;\n }\n\n /**\n * Write a fact. With an `id` that is already in the soul, the fact is\n * updated in place: the text and timestamp are new, and of the other fields\n * only those passed here change — links, source, tags, type, priority and\n * any extra fields the fact carries are kept (a priority is never lowered\n * unless one is passed). Otherwise the fact is appended.\n */\n etch(\n text: string,\n opts: {\n id?: string;\n type?: string;\n priority?: string;\n tags?: string[];\n links?: string[];\n source?: string;\n } = {},\n ): Fact {\n const existing = isNil(opts.id) ? null : this.getFact(opts.id);\n if (existing) {return this.add(mergeFact(existing, text, opts));}\n return this.add({\n text,\n id: opts.id ?? null,\n type: opts.type ?? null,\n priority: canonicalPriority(opts.priority),\n tags: opts.tags ? opts.tags.slice() : [],\n links: opts.links ? opts.links.slice() : [],\n timestamp: utcNow(),\n source: opts.source ?? null,\n extra: {},\n });\n }\n\n /**\n * Deterministic recall (INTEROP §6). Call it as `recall(query, filters)` or\n * `recall({ query, ...filters })`. Bare-string facts are facts: their text\n * is matched and returned like any other.\n */\n recall(\n query?: string | null | (RecallOptions & { query?: string | null }),\n opts: RecallOptions = {},\n ): Fact[] {\n const filters: RecallOptions = isMap(query) ? { ...query, ...opts } : opts;\n const text = isMap(query) ? query.query : query;\n const floor = PRIORITY_RANK[canonicalPriority(filters.minPriority ?? 'ephemeral')] ?? 0;\n const q = typeof text === 'string' ? text.toLowerCase() : '';\n const wantTags = new Set(filters.tags ?? []);\n const indexed: Array<[number, Fact]> = [];\n this._facts.forEach((f, i) => {\n if (q && !String(f.text ?? '').toLowerCase().includes(q)) {return;}\n if (wantTags.size > 0 && ![...wantTags].some((t) => (f.tags ?? []).includes(t))) {return;}\n if (!isNil(filters.type) && f.type !== filters.type) {return;}\n if ((PRIORITY_RANK[f.priority] ?? 1) < floor) {return;}\n indexed.push([i, f]);\n });\n indexed.sort((a, b) => {\n const pa = PRIORITY_RANK[a[1].priority] ?? 1;\n const pb = PRIORITY_RANK[b[1].priority] ?? 1;\n if (pb !== pa) {return pb - pa;}\n const ta = a[1].timestamp ?? '';\n const tb = b[1].timestamp ?? '';\n if (tb !== ta) {return tb < ta ? -1 : tb > ta ? 1 : 0;}\n return b[0] - a[0]; // insertion index desc\n });\n const results = indexed.map(([, f]) => f);\n if (!isNil(filters.limit)) {return results.slice(0, filters.limit);}\n return results;\n }\n\n getFact(id: string): Fact | null {\n const i = this._byId.get(id);\n return i === undefined ? null : this._facts[i];\n }\n\n deleteFact(id: string): boolean {\n const i = this._byId.get(id);\n if (i === undefined) {return false;}\n this._facts.splice(i, 1);\n this._byId.clear();\n this._facts.forEach((f, j) => {\n if (!isNil(f.id)) {this._byId.set(f.id, j);}\n });\n return true;\n }\n}\n\n/** `existing` with a new text and timestamp, and only the fields passed in\n * `opts` replaced; a priority is never lowered unless one is passed. */\nfunction mergeFact(\n existing: Fact,\n text: string,\n opts: { type?: string; priority?: string; tags?: string[]; links?: string[]; source?: string },\n): Fact {\n const or = <T>(passed: T | undefined, kept: T): T => (isNil(passed) ? kept : passed);\n return {\n ...existing,\n text,\n type: or(opts.type, existing.type),\n priority: isNil(opts.priority) ? existing.priority : canonicalPriority(opts.priority),\n tags: or(opts.tags, existing.tags).slice(),\n links: or(opts.links, existing.links).slice(),\n source: or(opts.source, existing.source),\n timestamp: utcNow(),\n extra: { ...existing.extra },\n };\n}\n\n/** Reads known keys, keeping those in a shape faf does not model as residual. */\nclass ShapeReader {\n readonly residual = new Map<string, string>();\n\n /** `value` when it fits; undefined (and noted as residual) when it does not. */\n pick<T>(key: string, value: unknown, fits: (v: unknown) => v is T): T | undefined {\n if (isNil(value)) {return undefined;}\n if (fits(value)) {return value;}\n this.residual.set(key, describeShape(value));\n return undefined;\n }\n\n /** The Soul constructor options for the index, memory subtrees and unknown keys. */\n modelled(doc: Record<string, unknown>, memory: Record<string, unknown>): {\n index: string[];\n sessions: unknown[];\n preferences: Record<string, unknown>;\n custom: Record<string, unknown>;\n extra: Record<string, unknown>;\n memoryExtra: Record<string, unknown>;\n } {\n return {\n index: (this.pick('index', doc.index, Array.isArray) ?? []).map(String),\n sessions: this.pick('memory.sessions', memory.sessions, Array.isArray) ?? [],\n preferences: structuredClone(this.pick('memory.preferences', memory.preferences, isMapping) ?? {}),\n custom: structuredClone(this.pick('memory.custom', memory.custom, isMapping) ?? {}),\n extra: residualKeys(doc, KNOWN_DOC_KEYS),\n memoryExtra: residualKeys(memory, KNOWN_MEMORY_KEYS),\n };\n }\n}\n\n/** Keys of `obj` outside `known`, deep-copied — the residual a soul carries. */\nfunction residualKeys(obj: Record<string, unknown>, known: ReadonlySet<string>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (!known.has(k)) {out[k] = structuredClone(v);}\n }\n return out;\n}\n\nfunction unionKeys(a: Record<string, unknown>, b: Record<string, unknown>): string[] {\n return [...new Set([...Object.keys(a), ...Object.keys(b)])];\n}\n\n/** Edit one fact item where it is: only the fields that changed. A bare-string\n * item that gains fields becomes a mapping; a mapping item stays one. */\nfunction editFact(doc: Document, node: unknown, before: unknown, after: unknown): unknown {\n if (!isYamlMap(node)) {return applyChange(doc, node, before, after);}\n const asMap = (v: unknown): unknown => (typeof v === 'string' ? { text: v } : v);\n return applyChange(doc, node, asMap(before), asMap(after));\n}\n",
|
|
98
98
|
"/**\n * fromClaudeDir — Claude Code memory store → knowledge Soul.\n * Cite: claude-fafm-sdk 1.0 / fafm-engine serialize_memory approach.\n * Not the proof convert_md_to_fafm (entries/v1.0 anti-pattern).\n */\n\nimport { readdirSync, readFileSync, statSync, existsSync } from 'fs';\nimport { join, basename, resolve } from 'path';\nimport { parse as parseYaml } from 'yaml';\nimport { Soul, utcNow } from './soul.js';\nimport { KNOWLEDGE_TYPES, type Fact } from './types.js';\n\nexport const DEFAULT_SKIP = new Set(['MEMORY.md', 'MEMORY-FULL.md', 'README.md']);\n\nconst LINK_RE = /\\[\\[([^\\]]+)\\]\\]/g;\n\nfunction isoMtime(path: string): string {\n const ms = statSync(path).mtimeMs;\n return new Date(ms).toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n}\n\nfunction parseFrontmatter(text: string): { fm: Record<string, unknown> | null; body: string } {\n if (!text.startsWith('---')) {return { fm: null, body: text };}\n const parts = text.split('---');\n if (parts.length < 3) {return { fm: null, body: text };}\n try {\n const fm = parseYaml(parts[1]);\n if (!fm || typeof fm !== 'object') {return { fm: null, body: parts.slice(2).join('---').trim() };}\n return { fm: fm as Record<string, unknown>, body: parts.slice(2).join('---').trim() };\n } catch {\n return { fm: null, body: text };\n }\n}\n\nfunction factFromTopic(path: string, body: string, fm: Record<string, unknown>): Fact | null {\n if (!fm.name) {return null;}\n const meta =\n fm.metadata && typeof fm.metadata === 'object'\n ? (fm.metadata as Record<string, unknown>)\n : {};\n const mtype = meta.type;\n if (typeof mtype !== 'string' || !KNOWLEDGE_TYPES.has(mtype)) {return null;}\n\n const name = String(fm.name).trim();\n const description =\n fm.description !== undefined && fm.description !== null && String(fm.description).trim()\n ? String(fm.description).trim()\n : '';\n const text = description || name;\n\n const extra: Record<string, unknown> = {};\n if (meta.originSessionId) {\n extra.provenance = [`session:${meta.originSessionId}`];\n }\n\n const links = [...new Set([...body.matchAll(LINK_RE)].map((m) => m[1]))].sort();\n\n return {\n text,\n id: name,\n type: mtype,\n priority: 'standard',\n tags: [],\n links,\n timestamp: isoMtime(path),\n source: `claude-code memory: ${basename(path)}`,\n extra,\n };\n}\n\n/**\n * Convert a Claude Code memory directory into a knowledge Soul.\n */\nexport function fromClaudeDir(\n path: string,\n opts: { namepoint?: string; skip?: Set<string> } = {},\n): Soul {\n const root = resolve(path);\n if (!existsSync(root)) {\n throw new Error(`Claude memory directory not found: ${root}`);\n }\n if (!statSync(root).isDirectory()) {\n throw new Error(`Claude memory path is not a directory: ${root}`);\n }\n\n const skip = opts.skip ?? DEFAULT_SKIP;\n const namepoint = opts.namepoint ?? `@claude-code:${basename(root)}`;\n\n const facts: Fact[] = [];\n const files = readdirSync(root)\n .filter((f) => f.endsWith('.md'))\n .sort();\n\n for (const file of files) {\n if (skip.has(file)) {continue;}\n const full = join(root, file);\n let text: string;\n try {\n text = readFileSync(full, 'utf-8');\n } catch {\n continue;\n }\n const { fm, body } = parseFrontmatter(text);\n if (!fm) {continue;}\n const fact = factFromTopic(full, body, fm);\n if (fact) {facts.push(fact);}\n }\n\n const stamps = facts.map((f) => f.timestamp).filter(Boolean) as string[];\n const created = stamps.length ? stamps.reduce((a, b) => (a < b ? a : b)) : utcNow();\n const last = stamps.length ? stamps.reduce((a, b) => (a > b ? a : b)) : created;\n\n const soul = new Soul(namepoint, {\n profile: 'knowledge',\n facts,\n created,\n });\n soul.last_etched = last;\n soul.rebuildIndex();\n return soul;\n}\n",
|
|
99
99
|
"/**\n * The 6Ws Interview — SINGLE SOURCE.\n *\n * The canonical question registry for filling a .faf by asking a human (or an\n * agent asking a human). faf-cli OWNS it; consumers (claude-faf-mcp's faf_go,\n * siblings, UIs) IMPORT it — never reimplement, never copy. Decided\n * 2026-06-10: the CLI exports, CFM consumes, zero drift. (CFM's previous\n * hand-maintained registry had already drifted — e.g. its `how` asked \"How\n * should AI assist?\" while the canonical slot semantic is \"How is it built /\n * used?\". This file is the arbiter; slots.ts is its spine.)\n *\n * Shape carries what interactive consumers need: question text, a short\n * header chip, input type, required flag, select options where a closed-ish\n * vocabulary exists. Question SEMANTICS align to core/slots.ts descriptions —\n * the slot is the meaning, the question is just its interview voice.\n *\n * Authoring doctrine baked into the prompts: 6Ws answers are terse LABELS\n * (3-4 words, hard cap <6) — a scannable spec card, not prose.\n */\n\nimport { SLOTS, SLOT_BY_PATH, isPlaceholder } from './slots.js';\nimport type { SeededContextDetailed } from '../detect/relentless.js';\n\n/** Bump when questions/options change — consumers can pin or report it. */\nexport const INTERVIEW_VERSION = 'faf-interview/1';\n\nexport interface InterviewOption {\n label: string;\n value: string;\n description: string;\n}\n\nexport interface InterviewQuestion<P extends string = string> {\n /** Canonical slot path (core/slots.ts is the spine). */\n path: P;\n question: string;\n /** Short chip/header label (max ~12 chars) for option-UI consumers. */\n header: string;\n type: 'text' | 'select';\n required: boolean;\n options?: InterviewOption[];\n}\n\n/**\n * The human/sourced boundary, as TYPES — the load-bearing line in FAF.\n *\n * HumanSlotPath = the 8 things only a human knows (name + goal + the 6Ws).\n * SourcedSlotPath = the slots detection fills (language + the stack).\n *\n * They are DISJOINT by construction. Typing the two interviews against these\n * makes it a COMPILE error to put a sourced slot in the human interview (or\n * vice-versa) — the \"Interview-16\" drift becomes unrepresentable at the Truth,\n * not merely caught by a downstream test. \"I'll remember\" is not a fix; a type\n * is. (claude-faf-mcp's wjttc-faf-go-boundary test is the belt; this is the\n * braces — the source itself can no longer drift.)\n */\nexport type HumanSlotPath =\n | 'project.name'\n | 'project.goal'\n | 'human_context.who'\n | 'human_context.what'\n | 'human_context.why'\n | 'human_context.where'\n | 'human_context.when'\n | 'human_context.how';\n\nexport type SourcedSlotPath =\n | 'project.main_language'\n | 'stack.frontend'\n | 'stack.backend'\n | 'stack.database'\n | 'stack.runtime'\n | 'stack.hosting'\n | 'stack.build'\n | 'stack.cicd';\n\nconst TERSE = '(terse — 3-4 words)';\n\n/**\n * THE 8-Q 6Ws INTERVIEW — the core. Project identity (name + goal) plus the\n * six Ws. Language is deliberately NOT here: detection finds it; humans are\n * only asked what machines cannot derive. The 6Ws are the underivable half.\n */\nexport const SIX_WS_INTERVIEW: InterviewQuestion<HumanSlotPath>[] = [\n {\n path: 'project.name',\n question: 'What is the name of this project?',\n header: 'Name',\n type: 'text',\n required: true,\n },\n {\n path: 'project.goal',\n question: 'What does this project do? (one sentence)',\n header: 'Goal',\n type: 'text',\n required: true,\n },\n {\n path: 'human_context.who',\n question: `Who is this for? ${TERSE}`,\n header: 'Who',\n type: 'text',\n required: true,\n },\n {\n path: 'human_context.what',\n question: `What are they building? ${TERSE}`,\n header: 'What',\n type: 'text',\n required: true,\n },\n {\n path: 'human_context.why',\n question: `Why does it exist? ${TERSE}`,\n header: 'Why',\n type: 'text',\n required: true,\n },\n {\n path: 'human_context.where',\n question: `Where does it run or ship? ${TERSE}`,\n header: 'Where',\n type: 'text',\n required: true,\n },\n {\n path: 'human_context.when',\n question: `When — timeline or stage? ${TERSE}`,\n header: 'When',\n type: 'text',\n required: true,\n },\n {\n path: 'human_context.how',\n question: `How is it built or used? ${TERSE}`,\n header: 'How',\n type: 'text',\n required: true,\n },\n];\n\n/**\n * Stack interview — asked only for slots ACTIVE for the app_type and still\n * empty. Selects where a common vocabulary exists; every select includes\n * Other (specify) and None where absence is legitimate.\n */\nexport const STACK_INTERVIEW: InterviewQuestion<SourcedSlotPath>[] = [\n {\n path: 'project.main_language',\n question: 'What is the primary programming language?',\n header: 'Language',\n type: 'select',\n required: true,\n options: [\n { label: 'TypeScript', value: 'TypeScript', description: 'JavaScript with types' },\n { label: 'JavaScript', value: 'JavaScript', description: 'Vanilla JS or Node.js' },\n { label: 'Python', value: 'Python', description: 'Python 3.x' },\n { label: 'Rust', value: 'Rust', description: 'Systems programming' },\n { label: 'Go', value: 'Go', description: 'Golang' },\n { label: 'Other', value: 'Other', description: 'Specify manually' },\n ],\n },\n {\n path: 'stack.frontend',\n question: 'What frontend framework does it use?',\n header: 'Frontend',\n type: 'select',\n required: false,\n options: [\n { label: 'React', value: 'React', description: 'React.js' },\n { label: 'Vue', value: 'Vue', description: 'Vue.js' },\n { label: 'Svelte', value: 'Svelte', description: 'Svelte/SvelteKit' },\n { label: 'Next.js', value: 'Next.js', description: 'React framework' },\n { label: 'None', value: 'None', description: 'No frontend' },\n { label: 'Other', value: 'Other', description: 'Specify manually' },\n ],\n },\n {\n path: 'stack.backend',\n question: 'What backend framework does it use?',\n header: 'Backend',\n type: 'select',\n required: false,\n options: [\n { label: 'Express', value: 'Express', description: 'Node.js Express' },\n { label: 'Fastify', value: 'Fastify', description: 'Node.js Fastify' },\n { label: 'Django', value: 'Django', description: 'Python Django' },\n { label: 'FastAPI', value: 'FastAPI', description: 'Python FastAPI' },\n { label: 'None', value: 'None', description: 'No backend' },\n { label: 'Other', value: 'Other', description: 'Specify manually' },\n ],\n },\n {\n path: 'stack.database',\n question: 'What database does it use?',\n header: 'Database',\n type: 'select',\n required: false,\n options: [\n { label: 'PostgreSQL', value: 'PostgreSQL', description: 'Postgres' },\n { label: 'MySQL', value: 'MySQL', description: 'MySQL/MariaDB' },\n { label: 'SQLite', value: 'SQLite', description: 'Embedded SQL' },\n { label: 'MongoDB', value: 'MongoDB', description: 'Document store' },\n { label: 'None', value: 'None', description: 'No database' },\n { label: 'Other', value: 'Other', description: 'Specify manually' },\n ],\n },\n {\n path: 'stack.runtime',\n question: 'What runtime does it run on?',\n header: 'Runtime',\n type: 'text',\n required: false,\n },\n {\n path: 'stack.hosting',\n question: 'Where is it hosted or distributed?',\n header: 'Hosting',\n type: 'text',\n required: false,\n },\n {\n path: 'stack.build',\n question: 'What is the build tool?',\n header: 'Build',\n type: 'text',\n required: false,\n },\n {\n path: 'stack.cicd',\n question: 'What CI/CD does it use?',\n header: 'CI/CD',\n type: 'text',\n required: false,\n },\n];\n\n/** The full ordered registry: the 8-Q core first, then stack. */\nexport const INTERVIEW: InterviewQuestion[] = [...SIX_WS_INTERVIEW, ...STACK_INTERVIEW];\n\n/** Lookup by slot path. */\nexport const INTERVIEW_BY_PATH = new Map<string, InterviewQuestion>(\n INTERVIEW.map((q) => [q.path, q]),\n);\n\n/**\n * Plain-object companion to INTERVIEW_BY_PATH. A Map JSON-serializes to `{}`,\n * which reads as \"the export shipped empty\" to any consumer that crosses a\n * serialization boundary (caught by the CFM compose handoff, 2026-06-12).\n * Bridge consumers that serialize should use THIS; in-process consumers can\n * use either.\n */\nexport const INTERVIEW_PATHS: Record<string, InterviewQuestion> = Object.fromEntries(\n INTERVIEW.map((q) => [q.path, q]),\n);\n\n/**\n * Interview voice for ANY slot: the registry question when one exists,\n * otherwise derived from the slot's canonical description — so slot-driven\n * flows (faf go) and registry-driven flows (faf_go) speak the same language.\n */\nexport function questionForSlot(path: string): string {\n const q = INTERVIEW_BY_PATH.get(path);\n if (q) {return q.question;}\n const slot = SLOT_BY_PATH.get(path) ?? SLOTS.find((s) => s.canonical === path);\n return slot ? `${slot.description}?`.replace(/\\?\\?$/, '?') : `${path}?`;\n}\n\n/**\n * The questions still worth asking for a given .faf: registry order, empty\n * (or placeholder) slots only, slotignored skipped — the What-Not is never\n * interviewed. `data` is the parsed .faf object.\n */\nexport function interviewForMissing(\n data: Record<string, unknown>,\n isEmpty: (value: unknown) => boolean,\n): InterviewQuestion[] {\n return INTERVIEW.filter((q) => {\n const parts = q.path.split('.');\n let cur: unknown = data;\n for (const part of parts) {\n if (cur && typeof cur === 'object' && part in (cur as Record<string, unknown>)) {\n cur = (cur as Record<string, unknown>)[part];\n } else {\n cur = undefined;\n break;\n }\n }\n if (cur === 'slotignored') {return false;}\n return isEmpty(cur);\n });\n}\n\n// ── Goal-seed (the 8Qs flow) ─────────────────────────────────────────────────\n//\n// Box 2 (Goal, the one sentence) is the single generative input. seedSixWsFromGoal\n// extracts ONLY verbatim facts the goal LITERALLY contains — the project's own\n// words — never synthesis, inference, or defaults. What it can't pull from the\n// goal text, it leaves empty (the human fills it). Generic/template values are\n// banned even when matched. Output is a set of SUGGESTIONS for the Table-of-8;\n// the human approves before anything is built.\n//\n// Facts only · generic banned · empty beats wrong.\n//\n// Seeds WHAT (the leading noun phrase), WHERE (named platforms/registries), and\n// WHO (a `for <audience>` clause) — the three a goal reliably states. WHY, WHEN,\n// HOW are NOT seeded: a goal rarely states them verbatim (why/when are the\n// human's; how is sourced by Turbo-Cat). Empirically tuned against the FAF fleet.\n\n/** Template slop — banned as a seed value even if literally matched. */\nconst GENERIC_SEED_BAN = new Set([\n 'developers', 'development teams', 'development team', 'teams', 'development',\n 'cloud platform', 'web platform', 'platform', 'best practices',\n 'improve development efficiency', 'development efficiency',\n 'modern development practices', 'modern development', 'test-driven development',\n 'production/stable', 'production', 'stable', 'app', 'project', 'tool',\n]);\n\n/** Platforms / registries / runtimes — WHERE a project ships or runs. Canonical\n * label : the literal token that proves it (word-boundary, case-insensitive). */\nconst WHERE_SIGNALS: Array<[label: string, re: RegExp]> = [\n ['npm', /\\bnpm\\b/i],\n ['PyPI', /\\bpypi\\b/i],\n ['crates.io', /\\bcrates\\.io\\b/i],\n ['Homebrew', /\\bhomebrew\\b/i],\n ['Docker', /\\bdocker\\b/i],\n ['Cloudflare', /\\bcloudflare\\b/i],\n ['Vercel', /\\bvercel\\b/i],\n ['Netlify', /\\bnetlify\\b/i],\n ['AWS', /\\baws\\b/i],\n ['Cloud Run', /\\bcloud run\\b/i],\n ['edge', /\\bedge\\b/i],\n ['browser', /\\bbrowser\\b/i],\n ['WASM', /\\bwasm\\b/i],\n ['GitHub', /\\bgithub\\b/i],\n ['MCP Registry', /\\bmcp registry\\b/i],\n ['Chrome Web Store', /\\bchrome web store\\b/i],\n ['Smithery', /\\bsmithery\\b/i],\n];\n\nconst seedIsGeneric = (s: string): boolean => GENERIC_SEED_BAN.has(s.toLowerCase().trim());\n\n// The 6Ws terse rule: 3-4 words, HARD CAP <6 (max 5) — generous enough for a\n// double-barrel name / compound term, never a sentence. Seeds obey it: take the\n// first ≤5 words, then trim any trailing connective/preposition so a cap never\n// leaves a dangling \"with\"/\"and\"/\"the\".\nconst TERSE_TAIL = /^(?:with|and|or|using|for|to|that|who|whom|whose|the|a|an|in|on|of|via|by|&)$/i;\nfunction tersify(s: string, max = 5): string {\n const words = s.trim().split(/\\s+/).filter(Boolean).slice(0, max);\n while (words.length && TERSE_TAIL.test(words[words.length - 1].replace(/[.,;:]+$/, ''))) {\n words.pop();\n }\n return words.join(' ');\n}\n\nexport interface GoalSeed {\n what?: string;\n where?: string;\n who?: string;\n}\n\n/**\n * Seed the human-context slots from the Goal sentence — verbatim facts only.\n * Returns a partial { what?, where?, who? }; absent keys = \"no fact, ask the\n * human\". Never returns why/when/how (not verbatim-extractable from a goal).\n */\nexport function seedSixWsFromGoal(goal: string): GoalSeed {\n const seed: GoalSeed = {};\n if (!goal || typeof goal !== 'string') {return seed;}\n const g = goal.trim();\n\n // WHAT — the leading noun phrase: drop a leading emoji/symbol, cut at the first\n // structural delimiter, keep a clean 2-6 word verbatim phrase that isn't generic.\n const lead = g\n .replace(/^[^A-Za-z0-9]+/, '')\n .split(/\\s+(?:for|that|which|to)\\s+|\\s+[—–]\\s+|\\s-\\s|:\\s|\\.\\s|,\\s/)[0]\n .trim();\n const whatTerse = tersify(lead); // 3-4 words, cap <6\n if (whatTerse.split(/\\s+/).filter(Boolean).length >= 2 && !seedIsGeneric(whatTerse)) {\n seed.what = whatTerse;\n }\n\n // WHERE — every platform/registry/runtime literally named, deduped, terse.\n const wheres = WHERE_SIGNALS.filter(([, re]) => re.test(g)).map(([label]) => label);\n if (wheres.length) {seed.where = wheres.slice(0, 4).join(', ');}\n\n // WHO — ONLY an explicit audience ROLE: `for developers/teams/engineers/…`,\n // captured to the sentence boundary, qualifier kept. A bare `for <ProperNoun>`\n // is NOT seeded: in a goal that names the TARGET it serves (the AI/tool/format),\n // not the audience — too ambiguous to be a fact. Bare role-word (= generic)\n // dropped. Empty beats wrong; the human states the audience.\n const forAud = g.match(/\\bfor ((?:[A-Za-z][\\w./+-]* )?(?:any |all )?(?:developers?|teams?|engineers?|builders?|users?|integrators?)\\b[^.,;:—]*)/i);\n const whoTerse = tersify((forAud?.[1] || '').trim().replace(/\\s+/g, ' ')); // cap <6\n if (whoTerse && !seedIsGeneric(whoTerse)) {\n seed.who = whoTerse;\n }\n\n return seed;\n}\n\n// ── Table-of-8 (the 8Qs flow keystone) ───────────────────────────────────────\n//\n// The canonical approval table: the 8 questions in flow order, each with its\n// current value, a goal-seeded suggestion where a fact supports one, and a\n// status the consumer renders — filled (already in the .faf), seeded (proposed\n// from a fact, awaiting Tab/Enter approval), or empty (only the human knows).\n// Single-sources the seed→show→approve step so every surface shows the SAME\n// table. Nothing is committed here; the human approves, THEN the .faf is built.\n\nexport type BoxStatus = 'filled' | 'seeded' | 'empty';\n\nexport interface TableOf8Row {\n n: number; // 1-8, flow order\n path: string; // e.g. 'human_context.who'\n header: string; // e.g. 'Who'\n question: string; // the interview prompt\n value: string; // current value, or a seeded suggestion, or ''\n status: BoxStatus;\n seeded: boolean; // true when value is a goal-fact suggestion (not yet in the .faf)\n /** Provenance for a SEEDED row — where the suggestion was sourced from, so the\n * human confirms informed: 'project goal' or a README locus ('README:## Why').\n * Absent on filled/empty rows. */\n source?: string;\n /** 0..1 confidence for a seeded row, by source quality. Absent otherwise. */\n confidence?: number;\n}\n\nexport interface TableOf8 {\n version: string;\n rows: TableOf8Row[]; // exactly 8\n filledCount: number;\n seededCount: number;\n emptyCount: number;\n complete: boolean; // no empty rows\n}\n\nfunction valueAtPath(data: Record<string, unknown>, path: string): unknown {\n let cur: unknown = data;\n for (const part of path.split('.')) {\n if (cur && typeof cur === 'object' && part in (cur as Record<string, unknown>)) {\n cur = (cur as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return cur;\n}\n\n/** A slot is \"filled\" only with a real value — not empty, not slotignored, not a placeholder. */\nfunction tableValueFilled(v: unknown): v is string {\n if (typeof v !== 'string') {return false;}\n const t = v.trim();\n if (!t || t === 'slotignored') {return false;}\n return !isPlaceholder(t);\n}\n\n/**\n * Build the Table-of-8 from a .faf object (any/empty) + an optional goal and an\n * optional sourced README extraction (relentlessContextDetailed). The goal seeds\n * WHO/WHAT/WHERE via seedSixWsFromGoal (facts only, source 'project goal'); the\n * detailed README form covers WHY/WHEN/HOW and any slot the goal didn't reach,\n * each carrying its own provenance. Rows the .faf already fills are 'filled';\n * seeded ones carry `source`+`confidence` so the human confirms informed; the\n * rest are 'empty' (ask the human). Goal wins over README where both have a\n * fact (the deliberate sentence beats the extraction). Pure.\n */\nexport function buildTableOf8(\n faf: Record<string, unknown>,\n opts: { goal?: string; detailed?: SeededContextDetailed } = {},\n): TableOf8 {\n const data = faf && typeof faf === 'object' ? faf : {};\n const fafGoal = valueAtPath(data, 'project.goal');\n const goalVal = (tableValueFilled(fafGoal) ? String(fafGoal).trim() : '') || (opts.goal ?? '').trim();\n const seed = seedSixWsFromGoal(goalVal);\n const detailed = (opts.detailed ?? {}) as Record<string, { value: string; source: string; confidence: number } | undefined>;\n const goalSeed: Record<string, string | undefined> = {\n 'project.goal': goalVal || undefined,\n 'human_context.what': seed.what,\n 'human_context.where': seed.where,\n 'human_context.who': seed.who,\n };\n\n // A seed for a path: the goal-fact (deliberate, wins) else the sourced README\n // extraction (covers why/when/how + fallback). Each carries its provenance.\n const seedFor = (path: string): { value: string; source: string; confidence: number } | undefined => {\n const g = goalSeed[path];\n if (g) {return { value: g, source: 'project goal', confidence: 0.9 };}\n const w = path.startsWith('human_context.') ? path.slice('human_context.'.length) : '';\n const d = w ? detailed[w] : undefined;\n return d ? { value: d.value, source: d.source, confidence: d.confidence } : undefined;\n };\n\n const rows: TableOf8Row[] = SIX_WS_INTERVIEW.map((q, i) => {\n const base = { n: i + 1, path: q.path, header: q.header, question: q.question };\n const cur = valueAtPath(data, q.path);\n if (tableValueFilled(cur)) {\n return { ...base, value: String(cur).trim(), status: 'filled', seeded: false };\n }\n const s = seedFor(q.path);\n if (s) {\n return { ...base, value: s.value, status: 'seeded', seeded: true, source: s.source, confidence: s.confidence };\n }\n return { ...base, value: '', status: 'empty', seeded: false };\n });\n\n const filledCount = rows.filter((r) => r.status === 'filled').length;\n const seededCount = rows.filter((r) => r.status === 'seeded').length;\n const emptyCount = rows.filter((r) => r.status === 'empty').length;\n return { version: INTERVIEW_VERSION, rows, filledCount, seededCount, emptyCount, complete: emptyCount === 0 };\n}\n",
|
|
100
100
|
"/**\n * The faf_loop decision core — the brain of \"100% or ask human\".\n *\n * A pure, snapshot decision: given a parsed .faf, classify its remaining gaps\n * as SOURCEABLE (detection can fill — language, stack: no human needed) or\n * HUMAN (only the human knows — the goal + the 6Ws), and return a verdict:\n *\n * done — nothing left (or already 100%). Stop, success.\n * can-source — sourceable gaps remain → the loop runs auto and re-scores.\n * needs-human — ONLY human gaps remain → the wall; ask (or seed-and-confirm).\n *\n * The classification IS the human/sourced boundary at runtime: a slot is human\n * iff its slot category is 'human' (the 6Ws) or it's the goal sentence. The\n * loop sources everything it can FIRST (minimise human asks); only when the\n * sourceable well is dry does it turn to the human. It never invents a human\n * slot to reach 100% — needs-human is a legitimate, honest terminal, not a\n * failure.\n *\n * This is the deterministic engine the CLI `faf loop` and the agentic\n * `/faf-loop` skill both decide from. Orchestration (run auto, re-score, the\n * no-progress + iteration-cap guards) lives in the command on top of this.\n */\n\nimport { INTERVIEW, questionForSlot } from './interview.js';\nimport { SLOT_BY_PATH, isPlaceholder } from './slots.js';\n\nexport type LoopStatus = 'done' | 'can-source' | 'needs-human';\n\nexport interface LoopGaps {\n /** Empty active slots only the human can give — the goal + the 6Ws. */\n human: string[];\n /** Empty active slots detection can fill — language + the stack. */\n sourceable: string[];\n}\n\nexport interface LoopVerdict {\n status: LoopStatus;\n score: number;\n gaps: LoopGaps;\n /** The questions to put to the human — populated only when status is\n * 'needs-human' (sourceable work is done; the human is all that's left). */\n ask: Array<{ path: string; question: string }>;\n}\n\n/** Default empty test: null/undefined, blank, or a placeholder token. The\n * What-Not (`slotignored`) is handled separately — it is never a gap. */\nexport function isEmptyValue(value: unknown): boolean {\n if (value === null || value === undefined) {return true;}\n if (typeof value === 'string') {\n const t = value.trim();\n return t === '' || isPlaceholder(t);\n }\n return false;\n}\n\nfunction valueAtPath(data: Record<string, unknown>, path: string): unknown {\n let cur: unknown = data;\n for (const part of path.split('.')) {\n if (cur && typeof cur === 'object' && part in (cur as Record<string, unknown>)) {\n cur = (cur as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return cur;\n}\n\n/** A path is HUMAN (only the human can give it) iff it is the goal sentence or\n * its slot category is 'human' (the 6Ws). Everything else — name, language,\n * the stack — is sourceable by detection. */\nexport function isHumanSlot(path: string): boolean {\n if (path === 'project.goal') {return true;}\n return SLOT_BY_PATH.get(path)?.category === 'human';\n}\n\n/**\n * Classify the empty, non-ignored interviewable slots of a .faf into human vs\n * sourceable. Scope = the interviewable slots (the 6Ws + name + goal + the core\n * stack); `slotignored` (the What-Not) is never a gap.\n */\nexport function classifyGaps(\n data: Record<string, unknown>,\n isEmpty: (value: unknown) => boolean = isEmptyValue,\n): LoopGaps {\n const human: string[] = [];\n const sourceable: string[] = [];\n for (const q of INTERVIEW) {\n const v = valueAtPath(data, q.path);\n if (v === 'slotignored') {continue;} // the What-Not is never interviewed\n if (!isEmpty(v)) {continue;} // already filled\n (isHumanSlot(q.path) ? human : sourceable).push(q.path);\n }\n return { human, sourceable };\n}\n\n/**\n * The loop verdict for a .faf snapshot. `score` is the current AI-readiness\n * score (the loop's termination test). Precedence is deliberate: source\n * everything possible BEFORE asking the human — so 'can-source' wins while any\n * sourceable gap remains, and 'needs-human' fires only once they're exhausted.\n */\nexport function loopVerdict(\n score: number,\n data: Record<string, unknown>,\n isEmpty: (value: unknown) => boolean = isEmptyValue,\n): LoopVerdict {\n const gaps = classifyGaps(data, isEmpty);\n let status: LoopStatus;\n if (score >= 100 || (gaps.human.length === 0 && gaps.sourceable.length === 0)) {\n status = 'done';\n } else if (gaps.sourceable.length > 0) {\n status = 'can-source';\n } else {\n status = 'needs-human';\n }\n const ask = status === 'needs-human' ? humanAsk(gaps) : [];\n return { status, score, gaps, ask };\n}\n\n/** The questions to put to the human for a set of gaps — its human slots,\n * paired with their interview prompt. The single source for the ask. */\nfunction humanAsk(gaps: LoopGaps): Array<{ path: string; question: string }> {\n return gaps.human.map((path) => ({ path, question: questionForSlot(path) }));\n}\n\n// ── Orchestration ────────────────────────────────────────────────────────────\n//\n// runLoop drives the snapshot verdict to a terminal: read → score → verdict →\n// (can-source) run auto → repeat. Dependencies are INJECTED so the driver is\n// pure and testable without real file IO; the CLI `faf loop` wires the real\n// read / score / auto. Two safety rails, because a loop that runs auto must\n// never spin: a hard round cap, and no-progress detection (if a round of auto\n// doesn't lift the score, the sourceable well is dry — stop, don't churn).\n\nexport type LoopRunStatus =\n | 'done' // reached 100% / no gaps — success\n | 'needs-human' // sourceable exhausted; only the human can finish (honest wall)\n | 'stuck' // sourceable gaps auto can't fill, and no human gaps to ask\n | 'capped' // hit the round cap still making progress\n | 'no-faf'; // nothing to read — caller must create one first\n\nexport interface LoopDeps {\n /** The current .faf as {data, yaml}, or null when none exists. */\n read(): { data: Record<string, unknown>; yaml: string } | null;\n /** Score raw .faf yaml → 0..100 (the termination test). */\n score(yaml: string): number;\n /** Source what detection can (auto): fill the stack and WRITE the .faf. */\n runAuto(): void;\n}\n\nexport interface LoopRunOptions {\n /** Hard cap on auto rounds (default 5). */\n maxRounds?: number;\n isEmpty?: (value: unknown) => boolean;\n}\n\nexport interface LoopRunResult {\n status: LoopRunStatus;\n score: number;\n /** Auto rounds actually run. */\n rounds: number;\n /** Score after each read — the climb, for narration. */\n history: number[];\n /** The human questions to put — populated only when status is 'needs-human'. */\n ask: Array<{ path: string; question: string }>;\n}\n\nexport function runLoop(deps: LoopDeps, opts: LoopRunOptions = {}): LoopRunResult {\n const maxRounds = Math.max(1, opts.maxRounds ?? 5);\n const isEmpty = opts.isEmpty ?? isEmptyValue;\n const history: number[] = [];\n let rounds = 0;\n\n // One iteration per read; at most maxRounds auto runs between them.\n for (let i = 0; i <= maxRounds; i++) {\n const snap = deps.read();\n if (!snap) {return { status: 'no-faf', score: 0, rounds, history, ask: [] };}\n\n const score = deps.score(snap.yaml);\n history.push(score);\n const verdict = loopVerdict(score, snap.data, isEmpty);\n\n if (verdict.status === 'done') {\n return { status: 'done', score, rounds, history, ask: [] };\n }\n if (verdict.status === 'needs-human') {\n return { status: 'needs-human', score, rounds, history, ask: verdict.ask };\n }\n\n // can-source — but did the LAST auto round actually move the score?\n if (history.length >= 2 && score <= history[history.length - 2]) {\n // No progress: the sourceable well is dry (auto can't fill what's left).\n // Defer to the human if there are human gaps; otherwise we're stuck.\n // Build the ask from gaps.human directly — `verdict.ask` is empty here\n // (the verdict is 'can-source', which never carries questions).\n return verdict.gaps.human.length\n ? { status: 'needs-human', score, rounds, history, ask: humanAsk(verdict.gaps) }\n : { status: 'stuck', score, rounds, history, ask: [] };\n }\n\n if (rounds >= maxRounds) {\n return { status: 'capped', score, rounds, history, ask: humanAsk(verdict.gaps) };\n }\n\n deps.runAuto();\n rounds++;\n }\n\n // Defined fallthrough (the cap check above returns first in practice).\n const last = history[history.length - 1] ?? 0;\n return { status: 'capped', score: last, rounds, history, ask: [] };\n}\n",
|
|
101
101
|
"/**\n * faf bench — the AI-grounding benchmark (P1, agent-native).\n *\n * Measures the thing FAF sells, falsifiably: AI works better and faster WITH\n * structured context. Two numbers, one harness — grounding ACCURACY (N\n * project questions, cold vs with-faf) and grounding COST (tokens to get\n * grounded, as reported by the runner).\n *\n * The unfair advantage: the .faf IS the answer key. Questions derive from the\n * populated active slots; grading is mechanical (normalize + versioned alias\n * map + significant-token containment — no judge, no rubric drift). The\n * question-set hash rides a ✪ receipt, parity-hash discipline.\n *\n * DOCTRINE (wolfejam 2026-06-11):\n * - \"A low score is an ALARM BELL — you are hemorrhaging tokens and the AI\n * is pretty much clueless about what you are doing, even trying to do.\"\n * Headline: \"Trouble ahead, expensive trouble.\"\n * - NEVER render a low score alone — always the pair (cold → with-faf), or\n * the alarm framing with headroom. The delta is the product; the cold\n * number belongs to the ABSENCE of context (\"without context\"), never to\n * FAF. Output always ends in a prescription, never a verdict.\n * - The 6Ws are UNDERIVABLE from code: cold exploration can dig out a stack\n * (you pay for the dig); it can never find intent.\n */\n\nimport { createHash } from 'crypto';\nimport { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { findFafFile, readFafFromString, readFafRaw, withKernel } from '../interop/faf.js';\nimport { readBytesIfPresent, resolveInside, safeReplaceOwned } from '../core/safe-write.js';\nimport { scoreFafYaml } from '../core/scorer.js';\nimport { SLOTS, readSlotValue, PLACEHOLDERS } from '../core/slots.js';\nimport { parse as parseYAML } from 'yaml';\nimport { bold, dim, fafCyan, orange } from '../ui/colors.js';\n\n/** Bump when phrasing, aliases, or grading rules change — part of the qset hash. */\nexport const BENCH_VERSION = 'faf-bench/1';\n\nexport interface BenchQuestion {\n n: number;\n path: string;\n question: string;\n}\n\n/** Stable question phrasing per slot path (fallback: templated from slot description). */\nconst PHRASINGS: Record<string, string> = {\n 'project.name': \"What is the project's name?\",\n 'project.goal': \"What is the project's goal — what is it for?\",\n 'project.main_language': 'What is the primary programming language?',\n 'human_context.who': 'Who is this project for?',\n 'human_context.what': 'What are they building?',\n 'human_context.why': 'Why does this project exist?',\n 'human_context.where': 'Where does it run or get distributed?',\n 'human_context.when': \"When — what is the project's timeline or stage?\",\n 'human_context.how': 'How is it built or used?',\n};\n\nfunction questionFor(path: string, description: string): string {\n return PHRASINGS[path] ?? `What is the project's ${description.replace(/\\s*\\(.*\\)$/, '').toLowerCase()}?`;\n}\n\n/**\n * Versioned alias groups — mechanical equivalences, no fuzzy scoring.\n * Members are compared post-normalization. Extend deliberately; every change\n * bumps the qset hash via BENCH_VERSION.\n */\nexport const ALIAS_GROUPS: string[][] = [\n ['typescript', 'ts'],\n ['javascript', 'js'],\n ['python', 'py', 'python3'],\n ['node', 'nodejs', 'node js', 'node.js'],\n ['github actions', 'gh actions', 'actions'],\n ['postgresql', 'postgres', 'pg'],\n ['kubernetes', 'k8s'],\n ['npm', 'npm registry'],\n ['cloudflare workers', 'cf workers', 'workers'],\n ['google cloud run', 'cloud run', 'gcp cloud run'],\n];\n\nconst ALIAS_LOOKUP = new Map<string, number>();\nALIAS_GROUPS.forEach((group, i) => group.forEach((m) => ALIAS_LOOKUP.set(m, i)));\n\nconst STOPWORDS = new Set([\n 'a', 'an', 'the', 'and', 'or', 'of', 'for', 'to', 'in', 'on', 'with', 'is',\n 'it', 'its', 'their', 'your', 'via', 'by', 'using', 'use', 'used',\n]);\n\nexport function normalizeAnswer(s: string): string {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9\\s.+#-]/g, ' ') // keep tech-name chars (c++, c#, node.js, faf-cli)\n .replace(/\\.(?=\\s|$)/g, ' ') // trailing dots\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction significantTokens(s: string): string[] {\n return normalizeAnswer(s).split(' ').filter((t) => t && !STOPWORDS.has(t));\n}\n\n/**\n * Mechanical match: exact normalized equality, alias-group equality, or\n * every significant token of the EXPECTED value present in the answer\n * (deterministic set containment — handles sentence-shaped 6W answers\n * without a judge). A miss is a miss.\n */\nexport function answersMatch(expected: string, given: string): boolean {\n const e = normalizeAnswer(expected);\n const g = normalizeAnswer(given);\n if (!e || !g) {return false;}\n if (e === g) {return true;}\n const ea = ALIAS_LOOKUP.get(e);\n if (ea !== undefined && ALIAS_LOOKUP.get(g) === ea) {return true;}\n const need = significantTokens(expected);\n if (need.length === 0) {return false;}\n const have = new Set(significantTokens(given));\n return need.every((t) => {\n if (have.has(t)) {return true;}\n const ta = ALIAS_LOOKUP.get(t);\n return ta !== undefined && [...have].some((h) => ALIAS_LOOKUP.get(h) === ta);\n });\n}\n\nexport interface QuestionSet {\n version: string;\n qsetHash: string;\n questions: BenchQuestion[];\n /** Internal answer key — NEVER printed by `questions`; used by `grade`. */\n answers: Record<number, string>;\n}\n\n/** Derive the question set + answer key from a project.faf (active populated slots only). */\nexport function deriveQuestionSet(yaml: string): QuestionSet {\n const result = scoreFafYaml(yaml);\n const data = parseYAML(yaml) as Record<string, unknown>;\n\n const questions: BenchQuestion[] = [];\n const answers: Record<number, string> = {};\n let n = 0;\n\n for (const slot of SLOTS) {\n // Active + populated only — slotignored is the What-Not, never a quiz topic.\n if (result.slots[slot.path] !== 'populated') {continue;}\n const value = readSlotValue(data, slot);\n if (typeof value !== 'string') {continue;}\n const v = value.trim();\n if (!v || PLACEHOLDERS.has(v.toLowerCase())) {continue;}\n n += 1;\n questions.push({ n, path: slot.path, question: questionFor(slot.path, slot.description) });\n answers[n] = v;\n }\n\n // Hash covers version + paths + phrasings (NOT answers — the key isn't the set).\n const projection = JSON.stringify({\n v: BENCH_VERSION,\n q: questions.map((q) => [q.path, q.question]),\n });\n const qsetHash = createHash('sha256').update(projection).digest('hex').slice(0, 12);\n\n return { version: BENCH_VERSION, qsetHash, questions, answers };\n}\n\n/**\n * The answer-key-safe projection of a QuestionSet — version + qsetHash +\n * questions, NEVER `answers`. Any \"give me the questions\" surface (MCP tools,\n * UIs) MUST hand out THIS, not the raw QuestionSet: a tool that prints the\n * answer key makes the benchmark a lie. The CLI's `bench questions` follows\n * the same rule.\n */\nexport function publicQuestions(qset: QuestionSet): {\n version: string;\n qsetHash: string;\n questions: BenchQuestion[];\n} {\n return { version: qset.version, qsetHash: qset.qsetHash, questions: qset.questions };\n}\n\nexport interface GradeResult {\n correct: number;\n total: number;\n misses: BenchQuestion[];\n perQuestion: { n: number; path: string; ok: boolean }[];\n}\n\nexport function gradeAnswers(qset: QuestionSet, given: Record<string, string>): GradeResult {\n const perQuestion = qset.questions.map((q) => {\n const ans = given[String(q.n)] ?? given[q.path] ?? '';\n return { n: q.n, path: q.path, ok: typeof ans === 'string' && ans.trim() !== '' && answersMatch(qset.answers[q.n], ans) };\n });\n const misses = qset.questions.filter((q) => !perQuestion[q.n - 1].ok);\n return { correct: perQuestion.filter((r) => r.ok).length, total: qset.questions.length, misses, perQuestion };\n}\n\nexport interface RunRecord {\n score: number;\n total: number;\n tokens?: number;\n model?: string;\n}\n\nexport interface BenchState {\n version: string;\n qsetHash: string;\n protocol: 'in-session';\n cold?: RunRecord;\n faf?: RunRecord;\n}\n\nconst STATE_FILE = '.faf-bench.json';\n\n/** True when `bytes` are a bench state faf wrote: its shape (version, qsetHash,\n * protocol) in faf's own layout (2-space JSON and a final newline). */\nfunction isBenchState(bytes: Uint8Array): boolean {\n const text = new TextDecoder().decode(bytes);\n try {\n const j = JSON.parse(text) as Partial<BenchState>;\n return typeof j === 'object' && j !== null && typeof j.version === 'string' && typeof j.qsetHash === 'string' &&\n j.protocol === 'in-session' && `${JSON.stringify(j, null, 2)}\\n` === text;\n } catch {\n return false;\n }\n}\n\n/** The saved bench state (null when there is none faf can use) and the bytes\n * read (null when no file) — read inside the project's link rules. */\nfunction loadState(dir: string): { state: BenchState | null; bytes: Buffer | null } {\n const bytes = readBytesIfPresent(resolveInside(dir, STATE_FILE));\n if (bytes === null || !isBenchState(bytes)) {return { state: null, bytes };}\n return { state: JSON.parse(bytes.toString('utf-8')) as BenchState, bytes };\n}\n\n/** Save the bench state — over nothing, or over a state faf wrote that is\n * still what was read (`read`); any other file is refused and left as it is. */\nfunction saveState(dir: string, state: BenchState, read: Buffer | null): void {\n safeReplaceOwned(join(dir, STATE_FILE), `${JSON.stringify(state, null, 2) }\\n`, {\n root: dir,\n owns: isBenchState,\n mark: 'faf bench state (2-space JSON with version, qsetHash and protocol)',\n expect: read,\n });\n}\n\n/** ✪ receipt — sha256 over the canonical projection; third-party verifiable.\n * Includes `repo` so the receipt attests WHICH project was benched — two repos\n * that score identically on the same qset get distinct receipts (bench-only;\n * independent of the parity/trust score hash). */\nexport function buildReceipt(state: BenchState, repo?: string): { projection: string; hash: string } {\n const projection = JSON.stringify({\n v: state.version,\n repo: repo ?? null,\n qset: state.qsetHash,\n protocol: state.protocol,\n cold: state.cold ?? null,\n faf: state.faf ?? null,\n });\n return { projection, hash: createHash('sha256').update(projection).digest('hex') };\n}\n\nconst tok = (t?: number) => (t === undefined ? '—' : `~${t.toLocaleString()}`);\n\nfunction printPair(state: BenchState, project: string): void {\n const c = state.cold!;\n const f = state.faf!;\n console.log(`\\n${bold(`faf bench — ${project}`)}\\n`);\n console.log(` ${dim('without context')} ${fafCyan('with .faf')}`);\n console.log(`answers ${c.score}/${c.total} ${bold(`${f.score}/${f.total}`)}`);\n console.log(`tokens ${tok(c.tokens)} ${tok(f.tokens)}`);\n const gap = c.total - c.score;\n if (gap > 0) {\n console.log(`\\n${dim(`The ${gap} missing answer${gap === 1 ? '' : 's'} were already in your repo — unstructured.`)}`);\n console.log(dim('Structured context closes the gap.'));\n }\n const r = buildReceipt(state, project);\n console.log(`\\n${orange('✪ BENCH RECEIPT')}`);\n console.log(dim(` qset: ${state.qsetHash} protocol: ${state.protocol} model: ${f.model ?? c.model ?? 'unreported'}`));\n console.log(dim(` cold ${c.score}/${c.total} · faf ${f.score}/${f.total} · sha256: ${r.hash.slice(0, 16)}…`));\n}\n\nfunction printColdAlarm(state: BenchState, project: string): void {\n const c = state.cold!;\n const gap = c.total - c.score;\n console.log(`\\n${bold(`faf bench — ${project}`)} ${orange('Trouble ahead, expensive trouble.')}\\n`);\n console.log(` ${dim('without context')}`);\n console.log(`answers ${c.score}/${c.total} ${dim('— the AI is guessing at what you are building')}`);\n if (c.tokens !== undefined) {\n console.log(`tokens ${tok(c.tokens)} ${dim('— re-derivation burn, paid again EVERY session')}`);\n }\n if (gap > 0) {\n console.log(`\\n${gap} answer${gap === 1 ? '' : 's'} missing: the stack it can dig out (you pay for the dig);`);\n console.log('what you are trying to DO, it cannot derive at any price.');\n console.log('Both are already in your repo — unstructured.');\n }\n console.log(`\\n${fafCyan('→ faf init && faf bench')} ${dim('(close the gap, get the receipt)')}`);\n}\n\nexport interface BenchOptions {\n json?: boolean;\n cold?: boolean;\n faf?: boolean;\n tokens?: string;\n model?: string;\n file?: string;\n submit?: boolean;\n endpoint?: string;\n}\n\nconst DEFAULT_BENCH_ENDPOINT = 'https://mcpaas.live/bench/submit';\n\n/** Fire-and-forget POST of a receipt to the public bench ledger. Never throws. */\nasync function submitReceipt(receipt: Record<string, string>, endpoint: string): Promise<void> {\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(receipt),\n });\n console.log(dim(res.ok ? ` ✪ submitted to ${endpoint}` : ` submit failed (${res.status})`));\n } catch {\n console.log(dim(' submit skipped (endpoint unreachable)'));\n }\n}\n\nexport function benchCommand(action?: string, answersFile?: string, options: BenchOptions = {}): void {\n const fafPath = options.file ?? findFafFile();\n if (!fafPath) {\n console.error(\"Error: project.faf not found\\n\\n Run 'faf init' to create one — bench needs the answer key.\");\n process.exit(2);\n }\n const yaml = readFafRaw(fafPath);\n // Read as a .faf first (not valid YAML, a scalar or a list: the one-line\n // refusal); what the scoring kernel cannot read is one line too.\n readFafFromString(yaml, fafPath);\n const qset = withKernel(fafPath, () => deriveQuestionSet(yaml));\n const dir = dirname(fafPath);\n const project = (parseYAML(yaml) as Record<string, any>)?.project?.name ?? dir.split('/').pop();\n\n if (qset.questions.length === 0) {\n console.error('Error: no populated slots to derive questions from.\\n\\n Run `faf go` to fill the .faf first.');\n process.exit(2);\n }\n\n // ── faf bench questions ─────────────────────────────────────────────\n if (action === 'questions') {\n if (options.json) {\n console.log(JSON.stringify({ version: qset.version, qsetHash: qset.qsetHash, questions: qset.questions.map(({ n, question }) => ({ n, question })) }, null, 2));\n return;\n }\n console.log(`\\n${bold(`faf bench — ${qset.questions.length} questions`)} ${dim(`qset ${qset.qsetHash}`)}\\n`);\n for (const q of qset.questions) {console.log(` ${String(q.n).padStart(2)}. ${q.question}`);}\n console.log(`\\n${dim('Answer terse — the value, not a sentence. Save as JSON: {\"1\": \"...\", \"2\": \"...\"}')}`);\n return;\n }\n\n // ── faf bench grade <answers.json> --cold | --faf ───────────────────\n if (action === 'grade') {\n if (!answersFile || !existsSync(answersFile)) {\n console.error('Error: faf bench grade <answers.json> — file not found.');\n process.exit(2);\n }\n const raw = JSON.parse(readFileSync(answersFile, 'utf-8'));\n const given: Record<string, string> = raw.answers ?? raw;\n const graded = gradeAnswers(qset, given);\n const run: RunRecord = {\n score: graded.correct,\n total: graded.total,\n ...(options.tokens ? { tokens: parseInt(options.tokens, 10) } : {}),\n ...(options.model ? { model: options.model } : {}),\n };\n\n const { state: prior, bytes: priorBytes } = loadState(dir);\n const state: BenchState =\n prior && prior.qsetHash === qset.qsetHash\n ? prior\n : { version: qset.version, qsetHash: qset.qsetHash, protocol: 'in-session' };\n\n if (options.cold) {state.cold = run;}\n else if (options.faf) {state.faf = run;}\n else {\n console.error('Error: specify the run mode — --cold (no context) or --faf (after reading project.faf).');\n process.exit(2);\n }\n saveState(dir, state, priorBytes);\n\n if (options.json) {\n const receipt = buildReceipt(state, project);\n console.log(JSON.stringify({ ...state, receipt: receipt.hash, perQuestion: graded.perQuestion }, null, 2));\n return;\n }\n\n // NEVER a lone low score: pair when both runs exist, alarm framing when cold-only.\n if (state.cold && state.faf) {printPair(state, project);}\n\n // --submit: post the full-pair receipt to the public bench ledger (fire-and-forget).\n if (options.submit && state.cold && state.faf) {\n const c = state.cold;\n const f = state.faf;\n const r = buildReceipt(state, project);\n void submitReceipt(\n {\n date: new Date().toISOString().slice(0, 10),\n model: f.model ?? c.model ?? options.model ?? 'unreported',\n repo: project,\n qset: state.qsetHash,\n cold: `${c.score}/${c.total}`,\n faf: `${f.score}/${f.total}`,\n sha256: r.hash.slice(0, 16),\n },\n options.endpoint ?? DEFAULT_BENCH_ENDPOINT\n );\n }\n else if (state.cold) {printColdAlarm(state, project);}\n else {\n // faf-run-only: fine to show alone (it's the with-context number).\n console.log(`\\n${bold(`faf bench — ${project}`)} ${fafCyan('with .faf')}: ${bold(`${run.score}/${run.total}`)} ${dim(`tokens ${tok(run.tokens)}`)}`);\n console.log(dim('Run the cold phase too for the full pair: faf bench (protocol).'));\n }\n return;\n }\n\n // ── faf bench (no action): the agent-native protocol ────────────────\n console.log(`\\n${bold('faf bench — agent-native protocol')} ${dim(`qset ${qset.qsetHash} · ${qset.questions.length} questions`)}\\n`);\n console.log(`${bold('COLD phase')} ${dim('(fresh AI session, repo access)')}`);\n console.log(` 1. Instruct: \"Answer these questions from the repository.`);\n console.log(` Do NOT read project.faf, CLAUDE.md, AGENTS.md, or any *.faf file.\"`);\n console.log(` 2. ${fafCyan('faf bench questions')} — hand them over; answers terse, saved as cold.json`);\n console.log(` 3. ${fafCyan('faf bench grade cold.json --cold --tokens <used> --model <name>')}\\n`);\n console.log(`${bold('FAF phase')} ${dim('(same questions, context first)')}`);\n console.log(` 4. Instruct: \"Read project.faf, then answer the same questions.\" → faf.json`);\n console.log(` 5. ${fafCyan('faf bench grade faf.json --faf --tokens <used> --model <name>')}\\n`);\n console.log(dim('Grading is mechanical against your own project.faf — the .faf IS the answer key.'));\n console.log(dim(`Receipts carry protocol: in-session (honor-system cold). qset ${qset.qsetHash}.`));\n}\n",
|
|
102
|
-
"/**\n * Turbo-Cat™ (= Format-finder) — fills .faf slots from file-format evidence\n * across ~200 formats (the KNOWLEDGE_BASE). Restores the multi-ecosystem\n * manifest interrogation the v6.0 rewrite narrowed to README+Cargo+package.json.\n *\n * v6-native sync port (the v5 engine was async; sync integrates cleanly with\n * `auto`). Two-layer: (1A) config files in the project directory itself,\n * (1B) source extensions below it; priority-wins slot recommendations.\n *\n * Boundary: detection never looks above the project directory. A parent's\n * tsconfig.json, Cargo.toml or vercel.json is another project's evidence —\n * a monorepo package, a subfolder or a new folder under ~ must not inherit it.\n *\n * Used as the LOWEST-precedence filler in `auto`: v6's specific detection wins;\n * Turbo-Cat fills only the slots still empty (esp. non-npm stacks).\n */\n\nimport { readdirSync, readFileSync, statSync, type Dirent } from 'fs';\nimport { join, extname, resolve } from 'path';\nimport { KNOWLEDGE_BASE } from './turbo-cat-knowledge.js';\nimport { detectDartProject } from './dart.js';\nimport { detectGoProject } from './go.js';\nimport { detectCsharpProject } from './csharp.js';\nimport { detectJvmProject } from './jvm.js';\nimport { detectRubyProject } from './ruby.js';\nimport { detectSwiftProject } from './swift.js';\n\nconst IGNORE = new Set([\n 'node_modules', '.git', 'dist', 'build', 'venv', '.venv', '__pycache__',\n 'target', 'coverage', '.next', '.svelte-kit', 'vendor',\n]);\nconst SCAN_EXTS = new Set([\n '.py', '.ts', '.tsx', '.js', '.jsx', '.svelte', '.vue',\n '.rb', '.go', '.rs', '.php', '.java', '.kt', '.swift',\n]);\n\n/** ContextSlots (camelCase + snake_case) → v6 .faf slot path. */\nconst SLOT_MAP: Record<string, [section: string, field: string]> = {\n mainLanguage: ['project', 'main_language'], main_language: ['project', 'main_language'],\n framework: ['stack', 'frontend'],\n cssFramework: ['stack', 'css_framework'], css: ['stack', 'css_framework'],\n uiLibrary: ['stack', 'ui_library'], ui_library: ['stack', 'ui_library'],\n stateManagement: ['stack', 'state_management'], state: ['stack', 'state_management'],\n backend: ['stack', 'backend'],\n apiType: ['stack', 'api_type'], api: ['stack', 'api_type'],\n runtime: ['stack', 'runtime'],\n database: ['stack', 'database'], db: ['stack', 'database'],\n connection: ['stack', 'connection'],\n hosting: ['stack', 'hosting'],\n buildTool: ['stack', 'build'], build_tool: ['stack', 'build'], build: ['stack', 'build'],\n packageManager: ['stack', 'package_manager'], pkg_manager: ['stack', 'package_manager'],\n cicd: ['stack', 'cicd'],\n};\n\n/** A format actually discovered on disk (config-file layer; real files only). */\nexport interface DiscoveredFormat {\n fileName: string;\n /** Derived from the entry's primary slot family (deterministic — real\n * knowledge surfaced, not invented): package-manager, language, framework,\n * backend, database, ci-cd, hosting, build, … */\n category: string;\n priority: number;\n}\n\nexport interface TurboCatResult {\n slotFills: Record<string, string>; // ContextSlots key → value (priority-wins)\n frameworks: string[];\n confirmedCount: number;\n /** Option B (compose spec 2026-06-12): the per-format breakdown consumers\n * display — surfaced so MCPs can DELETE their local format maps entirely. */\n discoveredFormats: DiscoveredFormat[];\n /** Deterministic lowercase signature, e.g. \"typescript-react\" ('unknown-stack' when bare). */\n stackSignature: string;\n}\n\ninterface FoundFormat {\n slots: Record<string, string>;\n priority: number;\n frameworks: string[];\n fileName?: string; // set for the config-file layer (real files on disk)\n}\n\n/** slot-family → display category (first match wins; deterministic). */\nconst CATEGORY_BY_SLOT: Array<[slot: string, category: string]> = [\n ['packageManager', 'package-manager'],\n ['pkg_manager', 'package-manager'],\n ['mainLanguage', 'language'],\n ['main_language', 'language'],\n ['framework', 'framework'],\n ['backend', 'backend'],\n ['database', 'database'],\n ['db', 'database'],\n ['cicd', 'ci-cd'],\n ['hosting', 'hosting'],\n ['buildTool', 'build'],\n ['build_tool', 'build'],\n ['build', 'build'],\n ['runtime', 'runtime'],\n ['cssFramework', 'css'],\n ['css', 'css'],\n ['uiLibrary', 'ui-library'],\n ['stateManagement', 'state-management'],\n ['apiType', 'api'],\n ['api', 'api'],\n];\n\nfunction categoryFor(slots: Record<string, string>, frameworks: string[]): string {\n for (const [slot, category] of CATEGORY_BY_SLOT) {\n if (slot in slots) {return category;}\n }\n return frameworks.length > 0 ? 'framework' : 'config';\n}\n\n/**\n * `manifest.json` is one of the most overloaded filenames in software —\n * Chrome/browser extension, mcpb/MCP manifest, PWA manifest, or plain config.\n * Asserting a Chrome stack from the FILENAME is a guess, and sourced-only\n * forbids guessing (every FAF MCP ships an mcpb manifest.json and was\n * mis-detected as a JS Chrome Extension — the 2026-06-12 blocker).\n *\n * Disambiguate by CONTENT, or assert nothing:\n * chrome — manifest_version is a NUMBER (2/3) AND a chrome field present\n * → the KB's chrome entry applies (as before)\n * mcpb — manifest_version is a STRING (\"0.x\") or MCP fields present\n * → assert NOTHING (real evidence — .ts/tsconfig/deps — wins)\n * pwa — start_url/display/icons → assert nothing\n * unknown/unreadable → assert NOTHING. An honest empty beats a guessed stack.\n */\nfunction classifyManifestJson(filePath: string): 'chrome' | 'other' {\n try {\n const m = JSON.parse(readFileSync(filePath, 'utf-8')) as Record<string, unknown>;\n const chromeField = ['background', 'content_scripts', 'action', 'browser_action', 'permissions']\n .some((k) => k in m);\n if (typeof m.manifest_version === 'number' && chromeField) {return 'chrome';}\n return 'other'; // mcpb (string manifest_version / server / tools / display_name), PWA, or plain config\n } catch {\n return 'other'; // unreadable → assert nothing\n }\n}\n\n/** A directory entry that is a regular file (a link counts when it leads to one).\n * A folder named `go.mod` or `package.json` is not evidence of anything. */\nfunction isFileEntry(dir: string, e: Dirent): boolean {\n if (e.isFile()) {return true;}\n if (!e.isSymbolicLink()) {return false;}\n try {\n return statSync(join(dir, e.name)).isFile();\n } catch {\n return false; // dangling link\n }\n}\n\n/** A directory entry that is a folder (a link counts when it leads to one). */\nfunction isDirEntry(dir: string, e: Dirent): boolean {\n if (e.isDirectory()) {return true;}\n if (!e.isSymbolicLink()) {return false;}\n try {\n return statSync(join(dir, e.name)).isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Layer 1A — config files in the project directory only. Never a parent:\n * the walk up to 10 ancestors (stopping only at the project's own .git) wrote\n * another tree's stack into project.faf. */\nfunction scanConfigFiles(projectDir: string): FoundFormat[] {\n const found: FoundFormat[] = [];\n const cur = resolve(projectDir);\n /** One JVM classification per directory (pom + gradle + settings would triple-fire). */\n const jvmDirsDone = new Set<string>();\n let entries: Dirent[];\n try {\n entries = readdirSync(cur, { withFileTypes: true });\n } catch {\n return found;\n }\n for (const e of entries) {\n const f = e.name;\n // Content-aware: *.xcodeproj is a folder (checked below); every other\n // format is a file, so anything else by that name is not evidence.\n if (f.endsWith('.xcodeproj') ? !isDirEntry(cur, e) : !isFileEntry(cur, e)) {continue;}\n // Content-aware: any *.csproj (names vary — not in KNOWLEDGE_BASE by basename).\n // .csproj alone ≠ type: Sdk + packages via detectCsharpProject.\n if (f.toLowerCase().endsWith('.csproj')) {\n const cp = detectCsharpProject(cur);\n if (cp) {\n const slots: Record<string, string> = {\n mainLanguage: 'C#',\n packageManager: 'NuGet',\n buildTool: 'dotnet',\n };\n if (cp.appType === 'backend' && cp.framework) {\n slots.backend = cp.framework;\n } else if (cp.appType === 'cli' && cp.framework) {\n slots.framework = cp.framework;\n } else if (cp.appType === 'mcp') {\n slots.apiType = 'MCP';\n } else if (cp.appType === 'mobile' && cp.framework) {\n slots.framework = cp.framework;\n }\n if (cp.targetFramework) {\n slots.runtime = cp.targetFramework;\n }\n const frameworks = cp.framework ? [cp.framework, 'C#', '.NET'] : ['C#', '.NET'];\n found.push({ slots, priority: 36, frameworks, fileName: f });\n }\n continue;\n }\n\n // Content-aware: *.xcodeproj (directory) — light productType via detectSwiftProject.\n // Prefer Package.swift when both exist (handled below); xcodeproj covers app-only trees.\n if (f.endsWith('.xcodeproj')) {\n const sp = detectSwiftProject(cur);\n if (sp) {\n const slots: Record<string, string> = {\n mainLanguage: 'Swift',\n packageManager: sp.packageManager === 'spm' ? 'spm' : 'Xcode',\n buildTool: sp.packageManager.includes('spm') ? 'swift build' : 'xcodebuild',\n };\n if (sp.appType === 'backend' && sp.framework) {\n slots.backend = sp.framework;\n } else if (sp.appType === 'cli' && sp.framework) {\n slots.framework = sp.framework;\n } else if (sp.appType === 'mcp') {\n slots.apiType = 'MCP';\n } else if (sp.appType === 'app' && sp.framework) {\n slots.framework = sp.framework;\n }\n const frameworks = sp.framework ? [sp.framework, 'Swift'] : ['Swift'];\n found.push({ slots, priority: 36, frameworks, fileName: f });\n }\n continue;\n }\n\n const k = KNOWLEDGE_BASE[f];\n if (!k) {continue;}\n // Sourced-only gate: manifest.json only asserts the chrome stack when\n // its CONTENT proves a chrome extension; mcpb/PWA/unknown assert nothing.\n if (f === 'manifest.json' && classifyManifestJson(join(cur, f)) !== 'chrome') {continue;}\n // Content-aware: pubspec.yaml backs Flutter apps, Dart CLIs/packages,\n // servers, and MCP servers — branch by deps instead of asserting Flutter\n // for everything (the filename-only flattening this engine used to do).\n if (f === 'pubspec.yaml') {\n const dp = detectDartProject(cur);\n if (dp) {\n const slots: Record<string, string> = { mainLanguage: 'Dart', packageManager: 'pub' };\n if (dp.isFlutter) {\n slots.framework = 'Flutter';\n if (dp.stateManagement) {slots.stateManagement = dp.stateManagement;}\n } else if (dp.appType === 'backend' && dp.framework) {\n slots.backend = dp.framework;\n } else if (dp.appType === 'mcp') {\n slots.apiType = 'MCP';\n }\n found.push({ slots, priority: k.priority, frameworks: dp.isFlutter ? ['Flutter', 'Dart'] : ['Dart'], fileName: f });\n continue;\n }\n }\n // Content-aware: go.mod backs libraries, backends, CLIs, MCP — not one bucket.\n if (f === 'go.mod') {\n const gp = detectGoProject(cur);\n if (gp) {\n const slots: Record<string, string> = {\n mainLanguage: 'Go',\n packageManager: 'go modules',\n buildTool: 'go build',\n };\n if (gp.appType === 'backend' && gp.framework) {\n slots.backend = gp.framework;\n } else if (gp.appType === 'cli' && gp.framework) {\n slots.framework = gp.framework;\n } else if (gp.appType === 'mcp') {\n slots.apiType = 'MCP';\n }\n const frameworks = gp.framework ? [gp.framework, 'Go'] : ['Go'];\n found.push({ slots, priority: k.priority, frameworks, fileName: f });\n continue;\n }\n }\n // Content-aware: Gemfile alone ≠ Rails (Ruby Edition).\n if (f === 'Gemfile' || f === 'Gemfile.lock' || f === 'gems.rb') {\n const rp = detectRubyProject(cur);\n if (rp) {\n const slots: Record<string, string> = {\n mainLanguage: 'Ruby',\n packageManager: rp.packageManager,\n };\n if (rp.appType === 'backend' && rp.framework) {\n slots.backend = rp.framework;\n } else if (rp.appType === 'cli' && rp.framework) {\n slots.framework = rp.framework;\n } else if (rp.appType === 'mcp') {\n slots.apiType = 'MCP';\n }\n const frameworks = rp.framework ? [rp.framework, 'Ruby'] : ['Ruby'];\n found.push({\n slots,\n priority: k.priority ?? 35,\n frameworks,\n fileName: f,\n });\n continue;\n }\n }\n // Content-aware: Package.swift alone ≠ app (Swift Edition).\n if (f === 'Package.swift') {\n const sp = detectSwiftProject(cur);\n if (sp) {\n const slots: Record<string, string> = {\n mainLanguage: 'Swift',\n packageManager: sp.packageManager === 'xcode' ? 'Xcode' : 'spm',\n buildTool: 'swift build',\n };\n if (sp.appType === 'backend' && sp.framework) {\n slots.backend = sp.framework;\n } else if (sp.appType === 'cli' && sp.framework) {\n slots.framework = sp.framework;\n } else if (sp.appType === 'mcp') {\n slots.apiType = 'MCP';\n } else if (sp.appType === 'app' && sp.framework) {\n slots.framework = sp.framework;\n }\n const frameworks = sp.framework ? [sp.framework, 'Swift'] : ['Swift'];\n found.push({\n slots,\n priority: k.priority ?? 36,\n frameworks,\n fileName: f,\n });\n continue;\n }\n }\n // Content-aware: pom / gradle alone ≠ type (JVM Edition). One brand JVM;\n // Android/KMP are facets. Version catalogs + multi-module via detectJvmProject.\n if (\n f === 'pom.xml' ||\n f === 'build.gradle' ||\n f === 'build.gradle.kts' ||\n f === 'settings.gradle' ||\n f === 'settings.gradle.kts'\n ) {\n if (jvmDirsDone.has(cur)) {continue;}\n jvmDirsDone.add(cur);\n const jv = detectJvmProject(cur);\n if (jv) {\n const slots: Record<string, string> = {\n mainLanguage: jv.mainLanguage === 'Java/Kotlin' ? 'Kotlin' : jv.mainLanguage,\n packageManager: jv.buildTool === 'maven' ? 'maven' : 'gradle',\n buildTool: jv.buildTool,\n };\n if (jv.appType === 'backend' && jv.framework) {\n slots.backend = jv.framework;\n } else if (jv.appType === 'cli' && jv.framework) {\n slots.framework = jv.framework;\n } else if (jv.appType === 'mcp') {\n slots.apiType = 'MCP';\n } else if (jv.appType === 'mobile') {\n slots.framework = jv.framework || 'Android';\n }\n if (jv.facets.includes('multiplatform')) {\n slots.framework = jv.framework || 'Kotlin Multiplatform';\n }\n const frameworks = jv.framework\n ? [jv.framework, 'JVM', jv.mainLanguage === 'Kotlin' ? 'Kotlin' : 'Java']\n : ['JVM', jv.mainLanguage === 'Kotlin' ? 'Kotlin' : 'Java'];\n found.push({\n slots,\n priority: k.priority ?? 35,\n frameworks,\n fileName: f,\n });\n continue;\n }\n }\n found.push({ slots: (k.slots as Record<string, string>) || {}, priority: k.priority, frameworks: k.frameworks, fileName: f });\n }\n return found;\n}\n\n/** Layer 1B — source extensions present. Extensions assert LANGUAGE only: a .py\n * reliably means Python, but a stray .tsx must not assert \"React\" (frameworks\n * come from config files, Layer 1A). */\nfunction scanExtensions(projectDir: string): FoundFormat[] {\n const found: FoundFormat[] = [];\n for (const ext of collectExtensions(projectDir, 2, { count: 0 })) {\n const k = KNOWLEDGE_BASE[`*${ext}`];\n const lang = (k?.slots as Record<string, string> | undefined)?.mainLanguage;\n if (lang) {found.push({ slots: { mainLanguage: lang }, priority: k.priority, frameworks: k.frameworks });}\n }\n return found;\n}\n\n/** Scan formats → priority-wins slot recommendations. */\nexport function turboCatScan(projectDir: string): TurboCatResult {\n const found = [...scanConfigFiles(projectDir), ...scanExtensions(projectDir)];\n\n // Analyze — highest priority wins each slot (deterministic, order-independent).\n // Skip ambiguous multi-option hints (e.g. \"npm/yarn/pnpm\") — only confident\n // single values fill; v6's specific detection handles the rest.\n const slotFills: Record<string, string> = {};\n const slotPrio: Record<string, number> = {};\n const fw = new Set<string>();\n for (const item of found) {\n item.frameworks.forEach((f) => fw.add(f));\n for (const [slot, val] of Object.entries(item.slots)) {\n if (val && !val.includes('/') && (!(slot in slotFills) || item.priority > slotPrio[slot])) {\n slotFills[slot] = val;\n slotPrio[slot] = item.priority;\n }\n }\n }\n // Per-format breakdown — real files only, deduped, deterministic order\n // (priority desc, then name) regardless of filesystem enumeration order.\n const seen = new Map<string, DiscoveredFormat>();\n for (const item of found) {\n if (!item.fileName) {continue;}\n if (!seen.has(item.fileName)) {\n seen.set(item.fileName, {\n fileName: item.fileName,\n category: categoryFor(item.slots, item.frameworks),\n priority: item.priority,\n });\n }\n }\n const discoveredFormats = [...seen.values()].sort(\n (a, b) => b.priority - a.priority || a.fileName.localeCompare(b.fileName),\n );\n\n // Deterministic stack signature: language + framework, lowercased, dash-joined.\n const sigParts: string[] = [];\n if (slotFills.mainLanguage) {sigParts.push(slotFills.mainLanguage.toLowerCase());}\n if (slotFills.framework) {sigParts.push(slotFills.framework.toLowerCase());}\n const stackSignature = sigParts.length > 0 ? sigParts.join('-') : 'unknown-stack';\n\n return { slotFills, frameworks: [...fw], confirmedCount: found.length, discoveredFormats, stackSignature };\n}\n\n/** Turbo-Cat slot fills shaped as a v6 .faf partial ({ project, stack }) for fillEmpties. */\nexport function turboCatSlots(projectDir: string): { project?: Record<string, string>; stack?: Record<string, string> } {\n const { slotFills } = turboCatScan(projectDir);\n const out: { project?: Record<string, string>; stack?: Record<string, string> } = {};\n for (const [key, value] of Object.entries(slotFills)) {\n const target = SLOT_MAP[key];\n if (!target || !value) {continue;}\n const [section, field] = target;\n if (section === 'project') {(out.project ??= {})[field] = value;}\n else {(out.stack ??= {})[field] = value;}\n }\n return out;\n}\n\nfunction collectExtensions(dir: string, depth: number, budget: { count: number }): Set<string> {\n const exts = new Set<string>();\n if (depth < 0 || budget.count > 400) {return exts;}\n let entries: import('fs').Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return exts;\n }\n for (const e of entries) {\n if (budget.count++ > 400) {break;}\n if (!e.isDirectory()) {\n const ext = extname(e.name);\n if (SCAN_EXTS.has(ext)) {exts.add(ext);}\n continue;\n }\n if (IGNORE.has(e.name) || e.name.startsWith('.')) {continue;}\n for (const x of collectExtensions(join(dir, e.name), depth - 1, budget)) {exts.add(x);}\n }\n return exts;\n}\n",
|
|
102
|
+
"/**\n * Turbo-Cat™ (= Format-finder) — fills .faf slots from file-format evidence\n * across ~200 formats (the KNOWLEDGE_BASE). Restores the multi-ecosystem\n * manifest interrogation the v6.0 rewrite narrowed to README+Cargo+package.json.\n *\n * v6-native sync port (the v5 engine was async; sync integrates cleanly with\n * `auto`). Two-layer: (1A) config files in the project directory itself,\n * (1B) source extensions below it; priority-wins slot recommendations.\n *\n * Boundary: detection never looks above the project directory. A parent's\n * tsconfig.json, Cargo.toml or vercel.json is another project's evidence —\n * a monorepo package, a subfolder or a new folder under ~ must not inherit it.\n *\n * Used as the LOWEST-precedence filler in `auto`: v6's specific detection wins;\n * Turbo-Cat fills only the slots still empty (esp. non-npm stacks).\n */\n\nimport type { Dirent } from 'fs';\nimport { join, extname, resolve } from 'path';\nimport { readRepoDir, readRepoFile, statRepoFile, withRepoRoot } from '../core/safe-write.js';\nimport { KNOWLEDGE_BASE } from './turbo-cat-knowledge.js';\nimport { detectDartProject } from './dart.js';\nimport { detectGoProject } from './go.js';\nimport { detectCsharpProject } from './csharp.js';\nimport { detectJvmProject } from './jvm.js';\nimport { detectRubyProject } from './ruby.js';\nimport { detectSwiftProject } from './swift.js';\n\nconst IGNORE = new Set([\n 'node_modules', '.git', 'dist', 'build', 'venv', '.venv', '__pycache__',\n 'target', 'coverage', '.next', '.svelte-kit', 'vendor',\n]);\nconst SCAN_EXTS = new Set([\n '.py', '.ts', '.tsx', '.js', '.jsx', '.svelte', '.vue',\n '.rb', '.go', '.rs', '.php', '.java', '.kt', '.swift',\n]);\n\n/** ContextSlots (camelCase + snake_case) → v6 .faf slot path. */\nconst SLOT_MAP: Record<string, [section: string, field: string]> = {\n mainLanguage: ['project', 'main_language'], main_language: ['project', 'main_language'],\n framework: ['stack', 'frontend'],\n cssFramework: ['stack', 'css_framework'], css: ['stack', 'css_framework'],\n uiLibrary: ['stack', 'ui_library'], ui_library: ['stack', 'ui_library'],\n stateManagement: ['stack', 'state_management'], state: ['stack', 'state_management'],\n backend: ['stack', 'backend'],\n apiType: ['stack', 'api_type'], api: ['stack', 'api_type'],\n runtime: ['stack', 'runtime'],\n database: ['stack', 'database'], db: ['stack', 'database'],\n connection: ['stack', 'connection'],\n hosting: ['stack', 'hosting'],\n buildTool: ['stack', 'build'], build_tool: ['stack', 'build'], build: ['stack', 'build'],\n packageManager: ['stack', 'package_manager'], pkg_manager: ['stack', 'package_manager'],\n cicd: ['stack', 'cicd'],\n};\n\n/** A format actually discovered on disk (config-file layer; real files only). */\nexport interface DiscoveredFormat {\n fileName: string;\n /** Derived from the entry's primary slot family (deterministic — real\n * knowledge surfaced, not invented): package-manager, language, framework,\n * backend, database, ci-cd, hosting, build, … */\n category: string;\n priority: number;\n}\n\nexport interface TurboCatResult {\n slotFills: Record<string, string>; // ContextSlots key → value (priority-wins)\n frameworks: string[];\n confirmedCount: number;\n /** Option B (compose spec 2026-06-12): the per-format breakdown consumers\n * display — surfaced so MCPs can DELETE their local format maps entirely. */\n discoveredFormats: DiscoveredFormat[];\n /** Deterministic lowercase signature, e.g. \"typescript-react\" ('unknown-stack' when bare). */\n stackSignature: string;\n}\n\ninterface FoundFormat {\n slots: Record<string, string>;\n priority: number;\n frameworks: string[];\n fileName?: string; // set for the config-file layer (real files on disk)\n}\n\n/** slot-family → display category (first match wins; deterministic). */\nconst CATEGORY_BY_SLOT: Array<[slot: string, category: string]> = [\n ['packageManager', 'package-manager'],\n ['pkg_manager', 'package-manager'],\n ['mainLanguage', 'language'],\n ['main_language', 'language'],\n ['framework', 'framework'],\n ['backend', 'backend'],\n ['database', 'database'],\n ['db', 'database'],\n ['cicd', 'ci-cd'],\n ['hosting', 'hosting'],\n ['buildTool', 'build'],\n ['build_tool', 'build'],\n ['build', 'build'],\n ['runtime', 'runtime'],\n ['cssFramework', 'css'],\n ['css', 'css'],\n ['uiLibrary', 'ui-library'],\n ['stateManagement', 'state-management'],\n ['apiType', 'api'],\n ['api', 'api'],\n];\n\nfunction categoryFor(slots: Record<string, string>, frameworks: string[]): string {\n for (const [slot, category] of CATEGORY_BY_SLOT) {\n if (slot in slots) {return category;}\n }\n return frameworks.length > 0 ? 'framework' : 'config';\n}\n\n/**\n * `manifest.json` is one of the most overloaded filenames in software —\n * Chrome/browser extension, mcpb/MCP manifest, PWA manifest, or plain config.\n * Asserting a Chrome stack from the FILENAME is a guess, and sourced-only\n * forbids guessing (every FAF MCP ships an mcpb manifest.json and was\n * mis-detected as a JS Chrome Extension — the 2026-06-12 blocker).\n *\n * Disambiguate by CONTENT, or assert nothing:\n * chrome — manifest_version is a NUMBER (2/3) AND a chrome field present\n * → the KB's chrome entry applies (as before)\n * mcpb — manifest_version is a STRING (\"0.x\") or MCP fields present\n * → assert NOTHING (real evidence — .ts/tsconfig/deps — wins)\n * pwa — start_url/display/icons → assert nothing\n * unknown/unreadable → assert NOTHING. An honest empty beats a guessed stack.\n */\nfunction classifyManifestJson(dir: string, name: string): 'chrome' | 'other' {\n try {\n const m = JSON.parse(readRepoFile(dir, name) ?? '') as Record<string, unknown>;\n const chromeField = ['background', 'content_scripts', 'action', 'browser_action', 'permissions']\n .some((k) => k in m);\n if (typeof m.manifest_version === 'number' && chromeField) {return 'chrome';}\n return 'other'; // mcpb (string manifest_version / server / tools / display_name), PWA, or plain config\n } catch {\n return 'other'; // unreadable → assert nothing\n }\n}\n\n/** A directory entry that is a regular file (a link counts when it leads to one\n * inside the project; a dangling link, or one out of it, does not).\n * A folder named `go.mod` or `package.json` is not evidence of anything. */\nfunction isFileEntry(dir: string, e: Dirent): boolean {\n if (e.isFile()) {return true;}\n if (!e.isSymbolicLink()) {return false;}\n return statRepoFile(dir, e.name)?.isFile() === true;\n}\n\n/** A directory entry that is a folder (a link counts when it leads to one inside the project). */\nfunction isDirEntry(dir: string, e: Dirent): boolean {\n if (e.isDirectory()) {return true;}\n if (!e.isSymbolicLink()) {return false;}\n return statRepoFile(dir, e.name)?.isDirectory() === true;\n}\n\n/** Layer 1A — config files in the project directory only. Never a parent:\n * the walk up to 10 ancestors (stopping only at the project's own .git) wrote\n * another tree's stack into project.faf. */\nfunction scanConfigFiles(projectDir: string): FoundFormat[] {\n const found: FoundFormat[] = [];\n const cur = resolve(projectDir);\n /** One JVM classification per directory (pom + gradle + settings would triple-fire). */\n const jvmDirsDone = new Set<string>();\n const entries = readRepoDir(cur);\n if (!entries) {return found;}\n for (const e of entries) {\n const f = e.name;\n // Content-aware: *.xcodeproj is a folder (checked below); every other\n // format is a file, so anything else by that name is not evidence.\n if (f.endsWith('.xcodeproj') ? !isDirEntry(cur, e) : !isFileEntry(cur, e)) {continue;}\n // Content-aware: any *.csproj (names vary — not in KNOWLEDGE_BASE by basename).\n // .csproj alone ≠ type: Sdk + packages via detectCsharpProject.\n if (f.toLowerCase().endsWith('.csproj')) {\n const cp = detectCsharpProject(cur);\n if (cp) {\n const slots: Record<string, string> = {\n mainLanguage: 'C#',\n packageManager: 'NuGet',\n buildTool: 'dotnet',\n };\n if (cp.appType === 'backend' && cp.framework) {\n slots.backend = cp.framework;\n } else if (cp.appType === 'cli' && cp.framework) {\n slots.framework = cp.framework;\n } else if (cp.appType === 'mcp') {\n slots.apiType = 'MCP';\n } else if (cp.appType === 'mobile' && cp.framework) {\n slots.framework = cp.framework;\n }\n if (cp.targetFramework) {\n slots.runtime = cp.targetFramework;\n }\n const frameworks = cp.framework ? [cp.framework, 'C#', '.NET'] : ['C#', '.NET'];\n found.push({ slots, priority: 36, frameworks, fileName: f });\n }\n continue;\n }\n\n // Content-aware: *.xcodeproj (directory) — light productType via detectSwiftProject.\n // Prefer Package.swift when both exist (handled below); xcodeproj covers app-only trees.\n if (f.endsWith('.xcodeproj')) {\n const sp = detectSwiftProject(cur);\n if (sp) {\n const slots: Record<string, string> = {\n mainLanguage: 'Swift',\n packageManager: sp.packageManager === 'spm' ? 'spm' : 'Xcode',\n buildTool: sp.packageManager.includes('spm') ? 'swift build' : 'xcodebuild',\n };\n if (sp.appType === 'backend' && sp.framework) {\n slots.backend = sp.framework;\n } else if (sp.appType === 'cli' && sp.framework) {\n slots.framework = sp.framework;\n } else if (sp.appType === 'mcp') {\n slots.apiType = 'MCP';\n } else if (sp.appType === 'app' && sp.framework) {\n slots.framework = sp.framework;\n }\n const frameworks = sp.framework ? [sp.framework, 'Swift'] : ['Swift'];\n found.push({ slots, priority: 36, frameworks, fileName: f });\n }\n continue;\n }\n\n const k = KNOWLEDGE_BASE[f];\n if (!k) {continue;}\n // Sourced-only gate: manifest.json only asserts the chrome stack when\n // its CONTENT proves a chrome extension; mcpb/PWA/unknown assert nothing.\n if (f === 'manifest.json' && classifyManifestJson(cur, f) !== 'chrome') {continue;}\n // Content-aware: pubspec.yaml backs Flutter apps, Dart CLIs/packages,\n // servers, and MCP servers — branch by deps instead of asserting Flutter\n // for everything (the filename-only flattening this engine used to do).\n if (f === 'pubspec.yaml') {\n const dp = detectDartProject(cur);\n if (dp) {\n const slots: Record<string, string> = { mainLanguage: 'Dart', packageManager: 'pub' };\n if (dp.isFlutter) {\n slots.framework = 'Flutter';\n if (dp.stateManagement) {slots.stateManagement = dp.stateManagement;}\n } else if (dp.appType === 'backend' && dp.framework) {\n slots.backend = dp.framework;\n } else if (dp.appType === 'mcp') {\n slots.apiType = 'MCP';\n }\n found.push({ slots, priority: k.priority, frameworks: dp.isFlutter ? ['Flutter', 'Dart'] : ['Dart'], fileName: f });\n continue;\n }\n }\n // Content-aware: go.mod backs libraries, backends, CLIs, MCP — not one bucket.\n if (f === 'go.mod') {\n const gp = detectGoProject(cur);\n if (gp) {\n const slots: Record<string, string> = {\n mainLanguage: 'Go',\n packageManager: 'go modules',\n buildTool: 'go build',\n };\n if (gp.appType === 'backend' && gp.framework) {\n slots.backend = gp.framework;\n } else if (gp.appType === 'cli' && gp.framework) {\n slots.framework = gp.framework;\n } else if (gp.appType === 'mcp') {\n slots.apiType = 'MCP';\n }\n const frameworks = gp.framework ? [gp.framework, 'Go'] : ['Go'];\n found.push({ slots, priority: k.priority, frameworks, fileName: f });\n continue;\n }\n }\n // Content-aware: Gemfile alone ≠ Rails (Ruby Edition).\n if (f === 'Gemfile' || f === 'Gemfile.lock' || f === 'gems.rb') {\n const rp = detectRubyProject(cur);\n if (rp) {\n const slots: Record<string, string> = {\n mainLanguage: 'Ruby',\n packageManager: rp.packageManager,\n };\n if (rp.appType === 'backend' && rp.framework) {\n slots.backend = rp.framework;\n } else if (rp.appType === 'cli' && rp.framework) {\n slots.framework = rp.framework;\n } else if (rp.appType === 'mcp') {\n slots.apiType = 'MCP';\n }\n const frameworks = rp.framework ? [rp.framework, 'Ruby'] : ['Ruby'];\n found.push({\n slots,\n priority: k.priority ?? 35,\n frameworks,\n fileName: f,\n });\n continue;\n }\n }\n // Content-aware: Package.swift alone ≠ app (Swift Edition).\n if (f === 'Package.swift') {\n const sp = detectSwiftProject(cur);\n if (sp) {\n const slots: Record<string, string> = {\n mainLanguage: 'Swift',\n packageManager: sp.packageManager === 'xcode' ? 'Xcode' : 'spm',\n buildTool: 'swift build',\n };\n if (sp.appType === 'backend' && sp.framework) {\n slots.backend = sp.framework;\n } else if (sp.appType === 'cli' && sp.framework) {\n slots.framework = sp.framework;\n } else if (sp.appType === 'mcp') {\n slots.apiType = 'MCP';\n } else if (sp.appType === 'app' && sp.framework) {\n slots.framework = sp.framework;\n }\n const frameworks = sp.framework ? [sp.framework, 'Swift'] : ['Swift'];\n found.push({\n slots,\n priority: k.priority ?? 36,\n frameworks,\n fileName: f,\n });\n continue;\n }\n }\n // Content-aware: pom / gradle alone ≠ type (JVM Edition). One brand JVM;\n // Android/KMP are facets. Version catalogs + multi-module via detectJvmProject.\n if (\n f === 'pom.xml' ||\n f === 'build.gradle' ||\n f === 'build.gradle.kts' ||\n f === 'settings.gradle' ||\n f === 'settings.gradle.kts'\n ) {\n if (jvmDirsDone.has(cur)) {continue;}\n jvmDirsDone.add(cur);\n const jv = detectJvmProject(cur);\n if (jv) {\n const slots: Record<string, string> = {\n mainLanguage: jv.mainLanguage === 'Java/Kotlin' ? 'Kotlin' : jv.mainLanguage,\n packageManager: jv.buildTool === 'maven' ? 'maven' : 'gradle',\n buildTool: jv.buildTool,\n };\n if (jv.appType === 'backend' && jv.framework) {\n slots.backend = jv.framework;\n } else if (jv.appType === 'cli' && jv.framework) {\n slots.framework = jv.framework;\n } else if (jv.appType === 'mcp') {\n slots.apiType = 'MCP';\n } else if (jv.appType === 'mobile') {\n slots.framework = jv.framework || 'Android';\n }\n if (jv.facets.includes('multiplatform')) {\n slots.framework = jv.framework || 'Kotlin Multiplatform';\n }\n const frameworks = jv.framework\n ? [jv.framework, 'JVM', jv.mainLanguage === 'Kotlin' ? 'Kotlin' : 'Java']\n : ['JVM', jv.mainLanguage === 'Kotlin' ? 'Kotlin' : 'Java'];\n found.push({\n slots,\n priority: k.priority ?? 35,\n frameworks,\n fileName: f,\n });\n continue;\n }\n }\n found.push({ slots: (k.slots as Record<string, string>) || {}, priority: k.priority, frameworks: k.frameworks, fileName: f });\n }\n return found;\n}\n\n/** Layer 1B — source extensions present. Extensions assert LANGUAGE only: a .py\n * reliably means Python, but a stray .tsx must not assert \"React\" (frameworks\n * come from config files, Layer 1A). */\nfunction scanExtensions(projectDir: string): FoundFormat[] {\n const found: FoundFormat[] = [];\n for (const ext of withRepoRoot(projectDir, () => collectExtensions(projectDir, 2, { count: 0 }))) {\n const k = KNOWLEDGE_BASE[`*${ext}`];\n const lang = (k?.slots as Record<string, string> | undefined)?.mainLanguage;\n if (lang) {found.push({ slots: { mainLanguage: lang }, priority: k.priority, frameworks: k.frameworks });}\n }\n return found;\n}\n\n/** Scan formats → priority-wins slot recommendations. */\nexport function turboCatScan(projectDir: string): TurboCatResult {\n const found = [...scanConfigFiles(projectDir), ...scanExtensions(projectDir)];\n\n // Analyze — highest priority wins each slot (deterministic, order-independent).\n // Skip ambiguous multi-option hints (e.g. \"npm/yarn/pnpm\") — only confident\n // single values fill; v6's specific detection handles the rest.\n const slotFills: Record<string, string> = {};\n const slotPrio: Record<string, number> = {};\n const fw = new Set<string>();\n for (const item of found) {\n item.frameworks.forEach((f) => fw.add(f));\n for (const [slot, val] of Object.entries(item.slots)) {\n if (val && !val.includes('/') && (!(slot in slotFills) || item.priority > slotPrio[slot])) {\n slotFills[slot] = val;\n slotPrio[slot] = item.priority;\n }\n }\n }\n // Per-format breakdown — real files only, deduped, deterministic order\n // (priority desc, then name) regardless of filesystem enumeration order.\n const seen = new Map<string, DiscoveredFormat>();\n for (const item of found) {\n if (!item.fileName) {continue;}\n if (!seen.has(item.fileName)) {\n seen.set(item.fileName, {\n fileName: item.fileName,\n category: categoryFor(item.slots, item.frameworks),\n priority: item.priority,\n });\n }\n }\n const discoveredFormats = [...seen.values()].sort(\n (a, b) => b.priority - a.priority || a.fileName.localeCompare(b.fileName),\n );\n\n // Deterministic stack signature: language + framework, lowercased, dash-joined.\n const sigParts: string[] = [];\n if (slotFills.mainLanguage) {sigParts.push(slotFills.mainLanguage.toLowerCase());}\n if (slotFills.framework) {sigParts.push(slotFills.framework.toLowerCase());}\n const stackSignature = sigParts.length > 0 ? sigParts.join('-') : 'unknown-stack';\n\n return { slotFills, frameworks: [...fw], confirmedCount: found.length, discoveredFormats, stackSignature };\n}\n\n/** Turbo-Cat slot fills shaped as a v6 .faf partial ({ project, stack }) for fillEmpties. */\nexport function turboCatSlots(projectDir: string): { project?: Record<string, string>; stack?: Record<string, string> } {\n const { slotFills } = turboCatScan(projectDir);\n const out: { project?: Record<string, string>; stack?: Record<string, string> } = {};\n for (const [key, value] of Object.entries(slotFills)) {\n const target = SLOT_MAP[key];\n if (!target || !value) {continue;}\n const [section, field] = target;\n if (section === 'project') {(out.project ??= {})[field] = value;}\n else {(out.stack ??= {})[field] = value;}\n }\n return out;\n}\n\nfunction collectExtensions(dir: string, depth: number, budget: { count: number }): Set<string> {\n const exts = new Set<string>();\n if (depth < 0 || budget.count > 400) {return exts;}\n const entries = readRepoDir(dir);\n if (!entries) {return exts;}\n for (const e of entries) {\n if (budget.count++ > 400) {break;}\n if (!e.isDirectory()) {\n const ext = extname(e.name);\n if (SCAN_EXTS.has(ext)) {exts.add(ext);}\n continue;\n }\n if (IGNORE.has(e.name) || e.name.startsWith('.')) {continue;}\n for (const x of collectExtensions(join(dir, e.name), depth - 1, budget)) {exts.add(x);}\n }\n return exts;\n}\n",
|
|
103
103
|
"/**\n * 🔺 TURBO-CAT™ FORMAT PYRAMID v3.1.1\n *\n * ROW 20 IN PROGRESS - 199 FORMATS CATALOGUED!\n *\n * Like precious metals in a catalytic converter - each format triggers\n * a specific intelligence reaction. We CAN catalyze ANY format, but only\n * the WORTHY earn a pyramid stone!\n *\n * Pyramid Evolution:\n * ├── Row 17: Sum(1..17) + 1 = 154 (THE SACRED - ACHIEVED 2024)\n * ├── Row 18: Sum(1..18) + 1 = 172 (BEYOND SACRED - ACHIEVED)\n * ├── Row 19: Sum(1..19) + 1 = 190 (ACHIEVED 2025-12-17)\n * └── Row 20: Sum(1..20) + 1 = 211 (IN PROGRESS - 9/21 added)\n *\n * Row 20 Tier 1 Added (2025-12-17):\n * - build.zig.zon (Zig packages)\n * - gleam.toml (Gleam - 2nd most admired 2025)\n * - bunfig.toml (Bun config)\n * - mise.toml / .mise.toml (mise version manager)\n * - manifest.toml (Flox/Nix environments)\n * - justfile (Just command runner - 10k+ stars)\n * - .pre-commit-config.yaml (Git hooks framework)\n * - CLAUDE.md (Claude Code AI context)\n *\n * THE DOCTRINE: To add a new format, PROVE it's better than existing ones!\n *\n * 😽 We are the FORMAT FREAKS - Quality over Quantity!\n * 🏆 199 formats - CHAMPIONSHIP GRADE FORMAT DETECTION\n */\n\n/**\n * A slot value here must name what the file itself proves, in a slot that\n * value fills: `vercel.json` → hosting Vercel; `Dockerfile` → no hosting (it\n * shows a container build, not where the app runs); `jest.config.js` →\n * nothing for CI/CD (Jest is a test runner, not a pipeline). No generic words ('Cloud',\n * 'Containerized', 'API Server'), no language in a framework or backend slot,\n * and no `runtime: Node.js` from a framework config alone — package.json is\n * that fact, and detectRuntime reads it. `faf auto` writes these values into\n * project.faf, so a value that is not a fact about the repo is a guess.\n */\nexport interface FormatKnowledge {\n frameworks: string[]; // Possible frameworks this format indicates\n slots: Partial<ContextSlots>; // Direct Context-On-Demand slot mappings\n priority: number; // Intelligence score (0-35 points)\n intelligence: 'ultra-high' | 'high' | 'medium' | 'low';\n confirmWith?: string[]; // Additional files to check for confirmation\n}\n\nexport interface ContextSlots {\n // Technical slots (1-15) - camelCase versions\n framework: string;\n mainLanguage: string;\n buildTool: string;\n packageManager: string;\n hosting: string;\n backend: string;\n apiType: string;\n cicd: string;\n database: string;\n cssFramework: string;\n uiLibrary: string;\n stateManagement: string;\n server: string;\n connection: string;\n runtime: string;\n // Display slots (for stack display compatibility)\n build: string;\n\n // snake_case versions (for YAML compatibility)\n main_language: string;\n build_tool: string;\n pkg_manager: string;\n api: string;\n css: string;\n ui_library: string;\n state: string;\n db: string;\n\n // Human context slots (16-21)\n targetUser: string;\n coreProblem: string;\n missionPurpose: string;\n deploymentMarket: string;\n timeline: string;\n approach: string;\n}\n\n/**\n * THE KNOWLEDGE BASE\n * \n * Add any file format here and map it to:\n * 1. Frameworks it indicates\n * 2. Context slots it can fill\n * 3. Priority/intelligence score\n * \n * The fab-formats engine will automatically use this knowledge!\n */\nexport const KNOWLEDGE_BASE: Record<string, FormatKnowledge> = {\n // ============================================\n // ULTRA-HIGH VALUE (35 points) - Package Managers\n // ============================================\n \n 'package.json': {\n frameworks: ['Node.js', 'JavaScript', 'TypeScript'],\n slots: {\n packageManager: 'npm/yarn/pnpm',\n mainLanguage: 'JavaScript/TypeScript'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n\n 'README.md': {\n frameworks: [], // Can be any framework\n // No slot values: a README's who/what/why is read from its TEXT by the\n // Relentless extractor. Constant guesses here ('developers', …) were\n // asserted for every repo with a README — sourced-only forbids that.\n slots: {},\n priority: 25, // HIGH: Human context goldmine\n intelligence: 'high'\n },\n\n 'requirements.txt': {\n frameworks: ['Python'],\n slots: { \n packageManager: 'pip',\n mainLanguage: 'Python'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n \n 'Pipfile': {\n frameworks: ['Python'],\n slots: { \n packageManager: 'pipenv',\n mainLanguage: 'Python'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n \n 'pyproject.toml': {\n frameworks: ['Python'],\n slots: {\n mainLanguage: 'Python',\n runtime: 'Python'\n },\n priority: 36,\n intelligence: 'ultra-high'\n },\n \n // Content-aware via detectRubyProject in turbo-cat.ts — Gemfile alone ≠ Rails.\n 'Gemfile': {\n frameworks: ['Ruby'],\n slots: {\n packageManager: 'bundler',\n mainLanguage: 'Ruby'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n 'Gemfile.lock': {\n frameworks: ['Ruby'],\n slots: {\n packageManager: 'bundler',\n mainLanguage: 'Ruby'\n },\n priority: 34,\n intelligence: 'high'\n },\n \n 'composer.json': {\n frameworks: ['PHP', 'Laravel', 'Symfony'],\n slots: { \n packageManager: 'composer',\n mainLanguage: 'PHP'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n \n 'Cargo.toml': {\n frameworks: ['Rust'],\n slots: {\n packageManager: 'cargo',\n mainLanguage: 'Rust',\n buildTool: 'cargo'\n },\n priority: 36,\n intelligence: 'ultra-high'\n },\n\n 'go.mod': {\n // Filename-only FALLBACK: assert Go + modules, NOT \"backend\" —\n // a go.mod backs libraries, Gin/Echo servers, Cobra CLIs, and MCP servers.\n // turbo-cat.ts reads CONTENT (detectGoProject) and fills framework/backend.\n frameworks: ['Go'],\n slots: {\n packageManager: 'go modules',\n mainLanguage: 'Go',\n buildTool: 'go build'\n },\n priority: 36,\n intelligence: 'ultra-high'\n },\n\n 'Package.swift': {\n // Filename-only FALLBACK: assert Swift + SPM, NOT app/iOS/Vapor —\n // Package.swift alone ≠ app (library · executable · plugin · server · MCP).\n // turbo-cat.ts reads CONTENT (detectSwiftProject) and fills appType signals.\n frameworks: ['Swift'],\n slots: {\n packageManager: 'spm',\n mainLanguage: 'Swift',\n buildTool: 'swift build'\n },\n priority: 36,\n intelligence: 'ultra-high'\n },\n\n // Note: real projects use Named.csproj — turbo-cat.ts handles any *.csproj\n // via content-aware detectCsharpProject. This key is documentation-only\n // fallback if a literal file named \"*.csproj\" ever appears (it won't).\n '*.csproj': {\n frameworks: ['C#', '.NET'],\n slots: {\n packageManager: 'NuGet',\n mainLanguage: 'C#',\n buildTool: 'dotnet'\n },\n priority: 36,\n intelligence: 'ultra-high'\n },\n \n 'pubspec.yaml': {\n // Filename-only FALLBACK: assert Dart + pub, NOT Flutter — a pubspec backs\n // Flutter apps, pure-Dart CLIs/packages/servers, and MCP servers alike.\n // turbo-cat.ts reads the CONTENT (detectDartProject) and adds the framework\n // (Flutter / Dart Frog / …) when the deps actually prove it.\n frameworks: ['Dart'],\n slots: {\n packageManager: 'pub',\n mainLanguage: 'Dart'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n \n 'pom.xml': {\n // Filename-only FALLBACK: assert Java + Maven, NOT Spring —\n // a pom backs libraries, Boot apps, aggregators/BOMs, MCP servers.\n // turbo-cat.ts reads CONTENT (detectJvmProject) for appType/framework.\n frameworks: ['Java'],\n slots: {\n packageManager: 'maven',\n mainLanguage: 'Java',\n buildTool: 'maven'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n\n 'build.gradle': {\n // Filename-only FALLBACK: assert JVM + Gradle, NOT Spring/Android.\n // Content-aware detectJvmProject fills Spring / Android / KMP / MCP.\n frameworks: ['Java', 'Gradle'],\n slots: {\n packageManager: 'gradle',\n mainLanguage: 'Java',\n buildTool: 'gradle'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n\n 'settings.gradle': {\n frameworks: ['Java', 'Gradle'],\n slots: {\n packageManager: 'gradle',\n mainLanguage: 'Java',\n buildTool: 'gradle'\n },\n priority: 34,\n intelligence: 'high'\n },\n\n 'settings.gradle.kts': {\n frameworks: ['Kotlin', 'Gradle'],\n slots: {\n packageManager: 'gradle',\n mainLanguage: 'Kotlin',\n buildTool: 'gradle'\n },\n priority: 34,\n intelligence: 'high'\n },\n\n // ============================================\n // HIGH VALUE (30 points) - JavaScript Frameworks\n // ============================================\n \n 'next.config.js': {\n frameworks: ['Next.js'],\n slots: { \n framework: 'Next.js',\n buildTool: 'Next.js',\n mainLanguage: 'JavaScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'next.config.mjs': {\n frameworks: ['Next.js'],\n slots: { \n framework: 'Next.js',\n buildTool: 'Next.js',\n mainLanguage: 'JavaScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'next.config.ts': {\n frameworks: ['Next.js 13+'],\n slots: { \n framework: 'Next.js 13+',\n buildTool: 'Next.js',\n mainLanguage: 'TypeScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'nuxt.config.js': {\n frameworks: ['Nuxt 2'],\n slots: { \n framework: 'Nuxt 2',\n buildTool: 'Nuxt',\n mainLanguage: 'JavaScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'nuxt.config.ts': {\n frameworks: ['Nuxt 3'],\n slots: { \n framework: 'Nuxt 3',\n buildTool: 'Nuxt',\n mainLanguage: 'TypeScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'svelte.config.js': {\n frameworks: ['SvelteKit'],\n slots: { \n framework: 'SvelteKit',\n buildTool: 'Vite',\n mainLanguage: 'JavaScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'angular.json': {\n frameworks: ['Angular'],\n slots: {\n framework: 'Angular',\n buildTool: 'Angular CLI',\n mainLanguage: 'TypeScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // ============================================\n // CHROME EXTENSION SUPPORT\n // ============================================\n\n 'manifest.json': {\n frameworks: ['Chrome Extension', 'Browser Extension'],\n slots: {\n framework: 'Chrome Extension',\n runtime: 'Chrome/Browser',\n mainLanguage: 'JavaScript',\n hosting: 'Chrome Web Store',\n apiType: 'Chrome APIs'\n },\n priority: 35,\n intelligence: 'ultra-high',\n confirmWith: ['popup.html', 'background.js', 'content.js']\n },\n \n 'vue.config.js': {\n frameworks: ['Vue'],\n slots: { \n framework: 'Vue',\n buildTool: 'Vue CLI',\n mainLanguage: 'JavaScript'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'remix.config.js': {\n frameworks: ['Remix'],\n slots: { \n framework: 'Remix',\n mainLanguage: 'JavaScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'gatsby-config.js': {\n frameworks: ['Gatsby'],\n slots: { \n framework: 'Gatsby',\n buildTool: 'Gatsby',\n mainLanguage: 'JavaScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'gatsby-config.ts': {\n frameworks: ['Gatsby'],\n slots: { \n framework: 'Gatsby',\n buildTool: 'Gatsby',\n mainLanguage: 'TypeScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'astro.config.mjs': {\n frameworks: ['Astro'],\n slots: { \n framework: 'Astro',\n buildTool: 'Vite',\n mainLanguage: 'JavaScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'redwood.toml': {\n frameworks: ['RedwoodJS'],\n slots: { \n framework: 'RedwoodJS',\n buildTool: 'Webpack',\n mainLanguage: 'JavaScript/TypeScript',\n server: 'Node.js',\n database: 'Prisma'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'blitz.config.ts': {\n frameworks: ['Blitz.js'],\n slots: { \n framework: 'Blitz.js',\n buildTool: 'Next.js',\n mainLanguage: 'TypeScript',\n server: 'Node.js',\n database: 'Prisma'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'qwik.config.ts': {\n frameworks: ['Qwik'],\n slots: { \n framework: 'Qwik',\n buildTool: 'Vite',\n mainLanguage: 'TypeScript',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // ============================================\n // HIGH VALUE (30 points) - Backend Frameworks\n // ============================================\n \n 'manage.py': {\n frameworks: ['Django'],\n slots: { \n framework: 'Django',\n backend: 'Django',\n mainLanguage: 'Python',\n server: 'Django',\n apiType: 'Django Views'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'artisan': {\n frameworks: ['Laravel'],\n slots: { \n framework: 'Laravel',\n backend: 'Laravel',\n mainLanguage: 'PHP',\n server: 'PHP',\n apiType: 'Laravel Routes'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'mix.exs': {\n frameworks: ['Phoenix', 'Elixir'],\n slots: { \n framework: 'Phoenix',\n backend: 'Phoenix',\n mainLanguage: 'Elixir',\n server: 'BEAM'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'nest-cli.json': {\n frameworks: ['NestJS'],\n slots: { \n framework: 'NestJS',\n backend: 'NestJS',\n mainLanguage: 'TypeScript',\n server: 'Node.js',\n apiType: 'REST API'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'strapi.config.js': {\n frameworks: ['Strapi'],\n slots: { \n backend: 'Strapi',\n apiType: 'REST API',\n server: 'Node.js'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // ============================================\n // HIGH VALUE (30 points) - Infrastructure\n // ============================================\n \n // A Dockerfile shows a container build, not where the app runs: no hosting.\n 'Dockerfile': {\n frameworks: ['Docker'],\n slots: {},\n priority: 30,\n intelligence: 'high'\n },\n \n 'docker-compose.yml': {\n frameworks: ['Docker Compose'],\n slots: { \n hosting: 'Docker'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'docker-compose.yaml': {\n frameworks: ['Docker Compose'],\n slots: { \n hosting: 'Docker'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'kubernetes.yml': {\n frameworks: ['Kubernetes'],\n slots: { \n hosting: 'Kubernetes'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'k8s.yaml': {\n frameworks: ['Kubernetes'],\n slots: { \n hosting: 'Kubernetes'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // ============================================\n // HIGH VALUE (30 points) - Deployment\n // ============================================\n \n 'vercel.json': {\n frameworks: ['Vercel'],\n slots: { \n hosting: 'Vercel',\n cicd: 'Vercel'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'netlify.toml': {\n frameworks: ['Netlify'],\n slots: { \n hosting: 'Netlify',\n cicd: 'Netlify'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'render.yaml': {\n frameworks: ['Render'],\n slots: { \n hosting: 'Render',\n cicd: 'Render'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'fly.toml': {\n frameworks: ['Fly.io'],\n slots: { \n hosting: 'Fly.io',\n cicd: 'Fly.io'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'railway.json': {\n frameworks: ['Railway'],\n slots: { \n hosting: 'Railway',\n cicd: 'Railway'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'railway.toml': {\n frameworks: ['Railway'],\n slots: { \n hosting: 'Railway',\n cicd: 'Railway'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'app.yaml': {\n frameworks: ['Google App Engine'],\n slots: { \n hosting: 'Google Cloud',\n cicd: 'Google Cloud'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'Procfile': {\n frameworks: ['Heroku'],\n slots: { \n hosting: 'Heroku',\n cicd: 'Heroku'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // ============================================\n // MEDIUM VALUE (25 points) - Build Tools\n // ============================================\n \n 'vite.config.js': {\n frameworks: ['Vite'],\n slots: { \n buildTool: 'Vite'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'vite.config.ts': {\n frameworks: ['Vite'],\n slots: { \n buildTool: 'Vite',\n mainLanguage: 'TypeScript'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'webpack.config.js': {\n frameworks: ['Webpack'],\n slots: { \n buildTool: 'Webpack'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'rollup.config.js': {\n frameworks: ['Rollup'],\n slots: { \n buildTool: 'Rollup'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'esbuild.config.js': {\n frameworks: ['esbuild'],\n slots: { \n buildTool: 'esbuild'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'parcel.config.js': {\n frameworks: ['Parcel'],\n slots: { \n buildTool: 'Parcel'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'snowpack.config.js': {\n frameworks: ['Snowpack'],\n slots: { \n buildTool: 'Snowpack'\n },\n priority: 25,\n intelligence: 'medium'\n },\n\n // ============================================\n // MEDIUM VALUE (25 points) - Language Config\n // ============================================\n \n 'tsconfig.json': {\n frameworks: ['TypeScript'],\n slots: { \n mainLanguage: 'TypeScript'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'jsconfig.json': {\n frameworks: ['JavaScript'],\n slots: { \n mainLanguage: 'JavaScript'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'babel.config.js': {\n frameworks: ['Babel'],\n slots: { \n buildTool: 'Babel'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n '.babelrc': {\n frameworks: ['Babel'],\n slots: { \n buildTool: 'Babel'\n },\n priority: 20,\n intelligence: 'medium'\n },\n\n // ============================================\n // MEDIUM VALUE (25 points) - Testing\n // ============================================\n \n 'jest.config.js': {\n frameworks: ['Jest'],\n slots: { \n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'jest.config.ts': {\n frameworks: ['Jest'],\n slots: { \n mainLanguage: 'TypeScript'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'vitest.config.ts': {\n frameworks: ['Vitest'],\n slots: { \n mainLanguage: 'TypeScript'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'cypress.config.js': {\n frameworks: ['Cypress'],\n slots: { \n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'playwright.config.ts': {\n frameworks: ['Playwright'],\n slots: { \n mainLanguage: 'TypeScript'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'karma.conf.js': {\n frameworks: ['Karma'],\n slots: { \n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'mocha.opts': {\n frameworks: ['Mocha'],\n slots: { \n },\n priority: 20,\n intelligence: 'medium'\n },\n \n '.rspec': {\n frameworks: ['RSpec'],\n slots: { \n mainLanguage: 'Ruby'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'pytest.ini': {\n frameworks: ['Pytest'],\n slots: { \n mainLanguage: 'Python'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'phpunit.xml': {\n frameworks: ['PHPUnit'],\n slots: { \n mainLanguage: 'PHP'\n },\n priority: 25,\n intelligence: 'medium'\n },\n\n // ============================================\n // MEDIUM VALUE (25 points) - Database/ORM\n // ============================================\n \n 'schema.prisma': {\n frameworks: ['Prisma'],\n slots: { \n database: 'Prisma ORM',\n connection: 'Prisma'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'drizzle.config.ts': {\n frameworks: ['Drizzle'],\n slots: { \n database: 'Drizzle ORM',\n connection: 'Drizzle',\n mainLanguage: 'TypeScript'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'ormconfig.js': {\n frameworks: ['TypeORM'],\n slots: { \n database: 'TypeORM',\n connection: 'TypeORM'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'knexfile.js': {\n frameworks: ['Knex.js'],\n slots: { \n database: 'Knex.js',\n connection: 'Knex.js'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'sequelize.config.js': {\n frameworks: ['Sequelize'],\n slots: { \n database: 'Sequelize',\n connection: 'Sequelize'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'alembic.ini': {\n frameworks: ['Alembic'],\n slots: { \n database: 'Alembic',\n mainLanguage: 'Python'\n },\n priority: 25,\n intelligence: 'medium'\n },\n\n // ============================================\n // MEDIUM VALUE (25 points) - CI/CD\n // ============================================\n \n '.github/workflows': {\n frameworks: ['GitHub Actions'],\n slots: { \n cicd: 'GitHub Actions'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n '.gitlab-ci.yml': {\n frameworks: ['GitLab CI'],\n slots: { \n cicd: 'GitLab CI'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'Jenkinsfile': {\n frameworks: ['Jenkins'],\n slots: { \n cicd: 'Jenkins'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n '.circleci/config.yml': {\n frameworks: ['CircleCI'],\n slots: { \n cicd: 'CircleCI'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n '.travis.yml': {\n frameworks: ['Travis CI'],\n slots: { \n cicd: 'Travis CI'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'azure-pipelines.yml': {\n frameworks: ['Azure DevOps'],\n slots: { \n cicd: 'Azure DevOps'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'bitbucket-pipelines.yml': {\n frameworks: ['Bitbucket Pipelines'],\n slots: { \n cicd: 'Bitbucket Pipelines'\n },\n priority: 25,\n intelligence: 'medium'\n },\n\n // ============================================\n // MEDIUM VALUE (20 points) - CSS/UI\n // ============================================\n \n 'tailwind.config.js': {\n frameworks: ['Tailwind CSS'],\n slots: { \n cssFramework: 'Tailwind CSS'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'tailwind.config.ts': {\n frameworks: ['Tailwind CSS'],\n slots: { \n cssFramework: 'Tailwind CSS',\n mainLanguage: 'TypeScript'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'postcss.config.js': {\n frameworks: ['PostCSS'],\n slots: { \n cssFramework: 'PostCSS'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'uno.config.ts': {\n frameworks: ['UnoCSS'],\n slots: { \n cssFramework: 'UnoCSS',\n mainLanguage: 'TypeScript'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'styled-components.config.js': {\n frameworks: ['styled-components'],\n slots: { \n cssFramework: 'styled-components',\n uiLibrary: 'styled-components'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'emotion.config.js': {\n frameworks: ['Emotion'],\n slots: { \n cssFramework: 'Emotion',\n uiLibrary: 'Emotion'\n },\n priority: 20,\n intelligence: 'medium'\n },\n\n // ============================================\n // MEDIUM VALUE (25 points) - Mobile\n // ============================================\n \n 'metro.config.js': {\n frameworks: ['React Native'],\n slots: { \n framework: 'React Native',\n mainLanguage: 'JavaScript'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'expo.config.js': {\n frameworks: ['Expo'],\n slots: { \n framework: 'React Native',\n buildTool: 'Expo'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'app.json': {\n frameworks: ['React Native', 'Expo'],\n slots: { \n framework: 'React Native'\n },\n priority: 20,\n intelligence: 'medium',\n confirmWith: ['expo']\n },\n \n 'capacitor.config.ts': {\n frameworks: ['Capacitor'],\n slots: { \n framework: 'Capacitor',\n mainLanguage: 'TypeScript'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'ionic.config.json': {\n frameworks: ['Ionic'],\n slots: { \n framework: 'Ionic',\n uiLibrary: 'Ionic'\n },\n priority: 25,\n intelligence: 'medium'\n },\n\n // ============================================\n // MEDIUM VALUE (25 points) - Monorepo\n // ============================================\n \n 'nx.json': {\n frameworks: ['Nx'],\n slots: { \n buildTool: 'Nx'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'turbo.json': {\n frameworks: ['Turborepo'],\n slots: { \n buildTool: 'Turborepo'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'lerna.json': {\n frameworks: ['Lerna'],\n slots: { \n buildTool: 'Lerna'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'rush.json': {\n frameworks: ['Rush'],\n slots: { \n buildTool: 'Rush'\n },\n priority: 25,\n intelligence: 'medium'\n },\n \n 'pnpm-workspace.yaml': {\n frameworks: ['pnpm workspaces'],\n slots: { \n packageManager: 'pnpm',\n buildTool: 'pnpm workspaces'\n },\n priority: 25,\n intelligence: 'medium'\n },\n\n // ============================================\n // LOW VALUE (15 points) - File Extensions\n // These are pattern-based and less definitive\n // ============================================\n \n '*.svelte': {\n frameworks: ['Svelte', 'SvelteKit'],\n slots: { \n framework: 'Svelte'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.vue': {\n frameworks: ['Vue'],\n slots: { \n framework: 'Vue'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.jsx': {\n frameworks: ['React'],\n slots: { \n framework: 'React',\n mainLanguage: 'JavaScript'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.ts': {\n frameworks: ['TypeScript'],\n slots: {\n mainLanguage: 'TypeScript'\n },\n priority: 15,\n intelligence: 'low'\n },\n\n '*.tsx': {\n frameworks: ['React', 'TypeScript'],\n slots: {\n framework: 'React',\n mainLanguage: 'TypeScript'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.py': {\n frameworks: ['Python'],\n slots: { \n mainLanguage: 'Python'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.rb': {\n frameworks: ['Ruby'],\n slots: { \n mainLanguage: 'Ruby'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.php': {\n frameworks: ['PHP'],\n slots: { \n mainLanguage: 'PHP'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.java': {\n frameworks: ['Java'],\n slots: { \n mainLanguage: 'Java'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.kt': {\n frameworks: ['Kotlin'],\n slots: { \n mainLanguage: 'Kotlin'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.swift': {\n frameworks: ['Swift'],\n slots: { \n mainLanguage: 'Swift'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.go': {\n frameworks: ['Go'],\n slots: { \n mainLanguage: 'Go'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.rs': {\n frameworks: ['Rust'],\n slots: { \n mainLanguage: 'Rust'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.dart': {\n frameworks: ['Flutter', 'Dart'],\n slots: { \n mainLanguage: 'Dart'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.ex': {\n frameworks: ['Elixir'],\n slots: { \n mainLanguage: 'Elixir'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.exs': {\n frameworks: ['Elixir'],\n slots: { \n mainLanguage: 'Elixir'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.scala': {\n frameworks: ['Scala'],\n slots: { \n mainLanguage: 'Scala'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.clj': {\n frameworks: ['Clojure'],\n slots: { \n mainLanguage: 'Clojure'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.lua': {\n frameworks: ['Lua'],\n slots: { \n mainLanguage: 'Lua'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.r': {\n frameworks: ['R'],\n slots: { \n mainLanguage: 'R'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.R': {\n frameworks: ['R'],\n slots: { \n mainLanguage: 'R'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.jl': {\n frameworks: ['Julia'],\n slots: { \n mainLanguage: 'Julia'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.nim': {\n frameworks: ['Nim'],\n slots: { \n mainLanguage: 'Nim'\n },\n priority: 15,\n intelligence: 'low'\n },\n \n '*.zig': {\n frameworks: ['Zig'],\n slots: {\n mainLanguage: 'Zig'\n },\n priority: 15,\n intelligence: 'low'\n },\n\n 'build.zig': {\n frameworks: ['Zig'],\n slots: {\n // camelCase slots (standard TURBO-CAT)\n packageManager: 'Zig Package Manager',\n mainLanguage: 'Zig',\n buildTool: 'zig build',\n // snake_case slots (template compatibility)\n build: 'zig build'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n\n // ============================================\n // SPECIAL VALUE (20 points) - API/Schema\n // ============================================\n \n 'openapi.json': {\n frameworks: ['OpenAPI'],\n slots: { \n apiType: 'REST API'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'openapi.yaml': {\n frameworks: ['OpenAPI'],\n slots: { \n apiType: 'REST API'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'swagger.json': {\n frameworks: ['Swagger'],\n slots: { \n apiType: 'REST API'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'graphql.schema': {\n frameworks: ['GraphQL'],\n slots: { \n apiType: 'GraphQL'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n 'schema.graphql': {\n frameworks: ['GraphQL'],\n slots: { \n apiType: 'GraphQL'\n },\n priority: 30,\n intelligence: 'high'\n },\n \n '.graphqlconfig': {\n frameworks: ['GraphQL'],\n slots: { \n apiType: 'GraphQL'\n },\n priority: 25,\n intelligence: 'medium'\n },\n\n // ============================================\n // SPECIAL VALUE (20 points) - State Management\n // ============================================\n \n 'redux.config.js': {\n frameworks: ['Redux'],\n slots: { \n stateManagement: 'Redux'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'mobx.config.js': {\n frameworks: ['MobX'],\n slots: { \n stateManagement: 'MobX'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'vuex.config.js': {\n frameworks: ['Vuex'],\n slots: { \n stateManagement: 'Vuex',\n framework: 'Vue'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'pinia.config.js': {\n frameworks: ['Pinia'],\n slots: { \n stateManagement: 'Pinia',\n framework: 'Vue'\n },\n priority: 20,\n intelligence: 'medium'\n },\n \n 'zustand.config.js': {\n frameworks: ['Zustand'],\n slots: { \n stateManagement: 'Zustand'\n },\n priority: 20,\n intelligence: 'medium'\n },\n\n // ============================================\n // SPECIAL VALUE (15 points) - Linting/Formatting\n // ============================================\n \n '.eslintrc.js': {\n frameworks: ['ESLint'],\n slots: {},\n priority: 15,\n intelligence: 'low'\n },\n \n '.eslintrc.json': {\n frameworks: ['ESLint'],\n slots: {},\n priority: 15,\n intelligence: 'low'\n },\n \n '.prettierrc': {\n frameworks: ['Prettier'],\n slots: {},\n priority: 15,\n intelligence: 'low'\n },\n \n '.prettierrc.json': {\n frameworks: ['Prettier'],\n slots: {},\n priority: 15,\n intelligence: 'low'\n },\n \n 'biome.json': {\n frameworks: ['Biome'],\n slots: {},\n priority: 15,\n intelligence: 'low'\n },\n \n '.editorconfig': {\n frameworks: ['EditorConfig'],\n slots: {},\n priority: 10,\n intelligence: 'low'\n },\n\n // ============================================\n // HIGH VALUE (30 points) - Serverless\n // ============================================\n\n 'serverless.yml': {\n frameworks: ['Serverless Framework'],\n slots: {\n hosting: 'AWS Lambda/Azure/GCP',\n backend: 'Serverless',\n apiType: 'API Gateway'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'serverless.yaml': {\n frameworks: ['Serverless Framework'],\n slots: {\n hosting: 'AWS Lambda/Azure/GCP',\n backend: 'Serverless',\n apiType: 'API Gateway'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'sam.yaml': {\n frameworks: ['AWS SAM'],\n slots: {\n hosting: 'AWS Lambda',\n backend: 'AWS SAM',\n cicd: 'AWS SAM CLI'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'template.yaml': {\n frameworks: ['AWS SAM', 'CloudFormation'],\n slots: {\n hosting: 'AWS',\n backend: 'AWS SAM/CloudFormation',\n cicd: 'AWS'\n },\n priority: 25,\n intelligence: 'medium',\n confirmWith: ['samconfig.toml']\n },\n\n 'amplify.yml': {\n frameworks: ['AWS Amplify'],\n slots: {\n hosting: 'AWS Amplify',\n backend: 'AWS Amplify',\n cicd: 'AWS Amplify'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // ============================================\n // HIGH VALUE (30 points) - Mobile Native\n // ============================================\n\n 'Podfile': {\n // Softened 2026-08-03 (Swift Edition honesty): CocoaPods is multi-platform\n // (iOS / macOS / tvOS / watchOS) — not iOS-only. Do not stamp appType here.\n frameworks: ['CocoaPods', 'Swift'],\n slots: {\n packageManager: 'CocoaPods',\n mainLanguage: 'Swift/Objective-C'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'build.gradle.kts': {\n // Filename-only FALLBACK: Kotlin DSL ≠ Android. Content-aware detectJvmProject.\n frameworks: ['Kotlin', 'Gradle'],\n slots: {\n packageManager: 'gradle',\n mainLanguage: 'Kotlin',\n buildTool: 'gradle'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n\n // ============================================\n // HIGH VALUE (30 points) - AI/ML\n // ============================================\n\n '*.ipynb': {\n frameworks: ['Jupyter', 'Python'],\n slots: {\n mainLanguage: 'Python',\n framework: 'Jupyter Notebook'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'MLproject': {\n frameworks: ['MLflow'],\n slots: {\n mainLanguage: 'Python',\n backend: 'MLflow'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'dvc.yaml': {\n frameworks: ['DVC', 'Data Version Control'],\n slots: {\n mainLanguage: 'Python',\n cicd: 'DVC Pipelines'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'dvc.lock': {\n frameworks: ['DVC'],\n slots: {\n },\n priority: 20,\n intelligence: 'medium'\n },\n\n // ============================================\n // ROW 18 - BEYOND THE SACRED 154 (Target: 172)\n // ============================================\n\n // Edge Computing\n 'wrangler.toml': {\n frameworks: ['Cloudflare Workers', 'Cloudflare'],\n slots: {\n hosting: 'Cloudflare Workers',\n backend: 'Cloudflare Workers',\n runtime: 'V8 Isolates'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // Modern Runtimes\n 'deno.json': {\n frameworks: ['Deno'],\n slots: {\n runtime: 'Deno',\n mainLanguage: 'TypeScript',\n packageManager: 'Deno'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'bun.lockb': {\n frameworks: ['Bun'],\n slots: {\n runtime: 'Bun',\n packageManager: 'Bun',\n mainLanguage: 'TypeScript/JavaScript'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // CI/CD Ecosystem\n 'codecov.yml': {\n frameworks: ['Codecov'],\n slots: {\n },\n priority: 25,\n intelligence: 'high'\n },\n\n 'dependabot.yml': {\n frameworks: ['Dependabot', 'GitHub'],\n slots: {\n },\n priority: 25,\n intelligence: 'high'\n },\n\n 'renovate.json': {\n frameworks: ['Renovate'],\n slots: {\n },\n priority: 25,\n intelligence: 'high'\n },\n\n // Universal Build Tools\n 'Makefile': {\n frameworks: ['Make', 'GNU Make'],\n slots: {\n buildTool: 'Make'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'CMakeLists.txt': {\n frameworks: ['CMake', 'C', 'C++'],\n slots: {\n buildTool: 'CMake',\n mainLanguage: 'C/C++'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'meson.build': {\n frameworks: ['Meson', 'C', 'C++'],\n slots: {\n buildTool: 'Meson',\n mainLanguage: 'C/C++'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // ============================================\n // C/C++ LANGUAGE FAMILY - SYSTEMS PROGRAMMING\n // ============================================\n\n '*.c': {\n frameworks: ['C'],\n slots: {\n mainLanguage: 'C'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n '*.cpp': {\n frameworks: ['C++'],\n slots: {\n mainLanguage: 'C++'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n '*.cc': {\n frameworks: ['C++'],\n slots: {\n mainLanguage: 'C++'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n '*.cxx': {\n frameworks: ['C++'],\n slots: {\n mainLanguage: 'C++'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n '*.h': {\n frameworks: ['C', 'C++'],\n slots: {\n mainLanguage: 'C/C++'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n '*.hpp': {\n frameworks: ['C++'],\n slots: {\n mainLanguage: 'C++'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n '*.hxx': {\n frameworks: ['C++'],\n slots: {\n mainLanguage: 'C++'\n },\n priority: 20,\n intelligence: 'medium'\n },\n\n // ============================================\n // ENVIRONMENT FILES - CONFIGURATION\n // ============================================\n\n '.env': {\n frameworks: [],\n slots: {},\n priority: 20,\n intelligence: 'medium'\n },\n\n '.env.example': {\n frameworks: [],\n slots: {},\n priority: 25,\n intelligence: 'high'\n },\n\n '.env.local': {\n frameworks: [],\n slots: {},\n priority: 20,\n intelligence: 'medium'\n },\n\n '.env.development': {\n frameworks: [],\n slots: {},\n priority: 20,\n intelligence: 'medium'\n },\n\n '.env.production': {\n frameworks: [],\n slots: {},\n priority: 20,\n intelligence: 'medium'\n },\n\n // ============================================\n // DEVOPS YAML - KUBERNETES & IaC\n // ============================================\n\n 'skaffold.yaml': {\n frameworks: ['Skaffold', 'Kubernetes'],\n slots: {\n hosting: 'Kubernetes',\n cicd: 'Skaffold'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'Chart.yaml': {\n frameworks: ['Helm', 'Kubernetes'],\n slots: {\n hosting: 'Kubernetes'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'values.yaml': {\n frameworks: ['Helm', 'Kubernetes'],\n slots: {\n hosting: 'Kubernetes'\n },\n priority: 25,\n intelligence: 'high',\n confirmWith: ['Chart.yaml']\n },\n\n 'pulumi.yaml': {\n frameworks: ['Pulumi'],\n slots: {\n cicd: 'Pulumi'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'Pulumi.yaml': {\n frameworks: ['Pulumi'],\n slots: {\n cicd: 'Pulumi'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'terragrunt.hcl': {\n frameworks: ['Terragrunt', 'Terraform'],\n slots: {\n cicd: 'Terragrunt'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'ansible.yml': {\n frameworks: ['Ansible'],\n slots: {\n cicd: 'Ansible'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n 'playbook.yml': {\n frameworks: ['Ansible'],\n slots: {\n cicd: 'Ansible'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n // ============================================\n // ROW 19 - LANGUAGES & VERSION MANAGERS\n // ============================================\n\n '*.cs': {\n frameworks: ['C#', '.NET', 'Unity'],\n slots: {\n mainLanguage: 'C#'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n '*.m': {\n frameworks: ['Objective-C', 'iOS'],\n slots: {\n mainLanguage: 'Objective-C'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n '.nvmrc': {\n frameworks: ['Node.js', 'nvm'],\n slots: {\n runtime: 'Node.js'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n '.tool-versions': {\n frameworks: ['asdf'],\n slots: {},\n priority: 25,\n intelligence: 'high'\n },\n\n '.ruby-version': {\n frameworks: ['Ruby', 'rbenv'],\n slots: {\n mainLanguage: 'Ruby',\n runtime: 'Ruby'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n '.python-version': {\n frameworks: ['Python', 'pyenv'],\n slots: {\n mainLanguage: 'Python',\n runtime: 'Python'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n '.dockerignore': {\n frameworks: ['Docker'],\n slots: {},\n priority: 20,\n intelligence: 'medium'\n },\n\n '.gitattributes': {\n frameworks: ['Git'],\n slots: {},\n priority: 15,\n intelligence: 'low'\n },\n\n '.npmrc': {\n frameworks: ['npm', 'Node.js'],\n slots: {\n packageManager: 'npm'\n },\n priority: 20,\n intelligence: 'medium'\n },\n\n 'sonar-project.properties': {\n frameworks: ['SonarQube', 'SonarCloud'],\n slots: {\n },\n priority: 25,\n intelligence: 'high'\n },\n\n // ROW 19 COMPLETION - FUNCTIONAL LANGUAGES\n\n '*.fs': {\n frameworks: ['F#', '.NET'],\n slots: {\n mainLanguage: 'F#'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n '*.mm': {\n frameworks: ['Objective-C++', 'iOS', 'macOS'],\n slots: {\n mainLanguage: 'Objective-C++'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n // ============================================\n // ROW 20 - TIER 1 EMERGING TECH (2025)\n // Target: 211 formats (Sum(1..20) + 1)\n // ============================================\n\n // Zig - The Next Systems Language\n 'build.zig.zon': {\n frameworks: ['Zig'],\n slots: {\n mainLanguage: 'Zig',\n packageManager: 'Zig Package Manager',\n buildTool: 'zig build'\n },\n priority: 35,\n intelligence: 'ultra-high'\n },\n\n // Gleam - 2nd Most Admired Language 2025 (Stack Overflow)\n 'gleam.toml': {\n frameworks: ['Gleam', 'BEAM', 'Erlang'],\n slots: {\n mainLanguage: 'Gleam',\n runtime: 'BEAM',\n packageManager: 'Gleam'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // Bun - Ultra-fast JS Runtime Config\n 'bunfig.toml': {\n frameworks: ['Bun'],\n slots: {\n runtime: 'Bun',\n packageManager: 'Bun',\n buildTool: 'Bun'\n },\n priority: 30,\n intelligence: 'high'\n },\n\n // mise - Modern Version Manager (replaced asdf/rtx)\n 'mise.toml': {\n frameworks: ['mise'],\n slots: {},\n priority: 25,\n intelligence: 'high'\n },\n\n '.mise.toml': {\n frameworks: ['mise'],\n slots: {},\n priority: 25,\n intelligence: 'high'\n },\n\n // Flox - Nix-based Development Environments\n 'manifest.toml': {\n frameworks: ['Flox', 'Nix'],\n slots: {},\n priority: 25,\n intelligence: 'high',\n confirmWith: ['.flox']\n },\n\n // Just - Command Runner (10k+ GitHub stars, Rust ecosystem)\n 'justfile': {\n frameworks: ['Just'],\n slots: {\n buildTool: 'Just'\n },\n priority: 25,\n intelligence: 'high'\n },\n\n // Pre-commit - Git Hooks Framework (industry standard)\n '.pre-commit-config.yaml': {\n frameworks: ['pre-commit'],\n slots: {\n },\n priority: 25,\n intelligence: 'high'\n },\n\n // Claude Code - AI Context (Anthropic Claude Code projects)\n 'CLAUDE.md': {\n frameworks: ['Claude Code'],\n slots: {},\n priority: 30, // High priority - AI context is valuable\n intelligence: 'high',\n confirmWith: ['.claude']\n }\n};\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\n/**\n * Get knowledge for a specific format\n */\nexport function getFormatKnowledge(format: string): FormatKnowledge | undefined {\n return KNOWLEDGE_BASE[format];\n}\n\n/**\n * Get all format keys\n */\nexport function getAllFormats(): string[] {\n return Object.keys(KNOWLEDGE_BASE);\n}\n\n/**\n * Get high-value formats (priority >= 30)\n */\nexport function getHighValueFormats(): string[] {\n return Object.entries(KNOWLEDGE_BASE)\n .filter(([, knowledge]) => knowledge.priority >= 30)\n .map(([format]) => format);\n}\n\n/**\n * Get formats by intelligence level\n */\nexport function getFormatsByIntelligence(level: FormatKnowledge['intelligence']): string[] {\n return Object.entries(KNOWLEDGE_BASE)\n .filter(([, knowledge]) => knowledge.intelligence === level)\n .map(([format]) => format);\n}\n\n/**\n * Get formats that can fill a specific slot\n */\nexport function getFormatsForSlot(slotName: keyof ContextSlots): string[] {\n return Object.entries(KNOWLEDGE_BASE)\n .filter(([, knowledge]) => slotName in knowledge.slots)\n .map(([format]) => format);\n}\n\n/**\n * Calculate total possible intelligence score\n */\nexport function getMaxIntelligenceScore(): number {\n return Object.values(KNOWLEDGE_BASE)\n .reduce((sum, knowledge) => sum + knowledge.priority, 0);\n}",
|
|
104
|
-
"import {
|
|
105
|
-
"import {
|
|
106
|
-
"import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport spec from './csharp-detection.json';\n\n/**\n * C# /.NET detection — CONTENT-AWARE .csproj classification.\n *\n * A .csproj alone does NOT mean Web API / ASP.NET. Microsoft encodes kind in\n * Project Sdk, then OutputType / Use* props / PackageReference / FrameworkReference.\n * Kill line: .csproj alone ≠ type.\n *\n * Same composition pattern as go.ts / dart.ts: knowledge in csharp-detection.json,\n * logic here. Turbo-Cat + scanner both call detectCsharpProject so they agree.\n */\n\n/** FAF project types we emit (aligned with Go + mobile for MAUI). */\nexport type CsharpAppType = 'mcp' | 'backend' | 'cli' | 'library' | 'mobile';\n\nexport interface CsharpProject {\n appType: CsharpAppType;\n /** Assembly / project name from filename, or ''. */\n projectName: string;\n /** TargetFramework(s) raw string if present. */\n targetFramework: string;\n /** Sdk attribute (e.g. Microsoft.NET.Sdk.Web). */\n sdk: string;\n /** Primary framework label (ASP.NET Core / Worker / Cobra-equivalent / …). */\n framework: string;\n /** Human-readable rationale for the .faf `# found:` comment (Glass Hood). */\n found: string;\n}\n\nconst MCP_PACKAGES = (spec.mcpPackages as string[]).map(p => p.toLowerCase());\nconst CLI_PACKAGES = (spec.cliPackages as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst TEST_PACKAGES = (spec.testPackages as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst GRPC_SERVER = (spec.grpcServerPackages as string[]).map(p => p.toLowerCase());\nconst SPECIALIZED = spec.specializedSdks as Array<[string, string, string]>;\nconst BASE_SDK = (spec.baseSdk as string).toLowerCase();\n\nexport interface ParsedCsproj {\n sdk: string;\n outputType: string;\n targetFramework: string;\n isTestProject: boolean;\n useMaui: boolean;\n useWpf: boolean;\n useWindowsForms: boolean;\n packages: Set<string>;\n frameworkRefs: Set<string>;\n}\n\n/** Parse the load-bearing fields of an SDK-style .csproj (regex — adequate for detection). */\nexport function parseCsproj(content: string): ParsedCsproj {\n // Sdk=\"Name\" or Sdk=\"Name/1.2.3\"\n const sdkAttr = content.match(/<Project\\b[^>]*\\bSdk\\s*=\\s*\"([^\"/]+)(?:\\/[^\"]*)?\"/i);\n // Additive <Sdk Name=\"...\" />\n const sdkElem = content.match(/<Sdk\\b[^>]*\\bName\\s*=\\s*\"([^\"]+)\"/i);\n const sdk = (sdkAttr?.[1] || sdkElem?.[1] || '').trim();\n\n const outputType = (content.match(/<OutputType>\\s*([^<]+?)\\s*<\\/OutputType>/i)?.[1] || '').trim();\n const tfSingle = content.match(/<TargetFramework>\\s*([^<]+?)\\s*<\\/TargetFramework>/i)?.[1];\n const tfMulti = content.match(/<TargetFrameworks>\\s*([^<]+?)\\s*<\\/TargetFrameworks>/i)?.[1];\n const targetFramework = (tfMulti || tfSingle || '').trim();\n\n const isTestProject = /<IsTestProject>\\s*true\\s*<\\/IsTestProject>/i.test(content);\n const useMaui = /<UseMaui>\\s*true\\s*<\\/UseMaui>/i.test(content);\n const useWpf = /<UseWPF>\\s*true\\s*<\\/UseWPF>/i.test(content);\n const useWindowsForms = /<UseWindowsForms>\\s*true\\s*<\\/UseWindowsForms>/i.test(content);\n\n const packages = new Set<string>();\n for (const m of content.matchAll(/<PackageReference\\b[^>]*\\bInclude\\s*=\\s*\"([^\"]+)\"/gi)) {\n packages.add(m[1].toLowerCase());\n }\n // Versionless CPM still uses Include=\n for (const m of content.matchAll(/<PackageReference\\s+Include\\s*=\\s*\"([^\"]+)\"/gi)) {\n packages.add(m[1].toLowerCase());\n }\n\n const frameworkRefs = new Set<string>();\n for (const m of content.matchAll(/<FrameworkReference\\b[^>]*\\bInclude\\s*=\\s*\"([^\"]+)\"/gi)) {\n frameworkRefs.add(m[1].toLowerCase());\n }\n\n return {\n sdk,\n outputType,\n targetFramework,\n isTestProject,\n useMaui,\n useWpf,\n useWindowsForms,\n packages,\n frameworkRefs,\n };\n}\n\nfunction hasPackage(pkgs: Set<string>, id: string): boolean {\n const n = id.toLowerCase();\n if (pkgs.has(n)) {return true;}\n // Subpath-ish: ModelContextProtocol.AspNetCore when looking for ModelContextProtocol\n for (const p of pkgs) {\n if (p === n || p.startsWith(`${n}.`)) {return true;}\n }\n return false;\n}\n\nfunction findPackageLabel(pkgs: Set<string>, entries: Array<[string, string]>): [string, string] | undefined {\n let best: [string, string] | undefined;\n for (const [id, label] of entries) {\n if (!hasPackage(pkgs, id)) {continue;}\n if (!best || id.length > best[0].length) {best = [id, label];}\n }\n return best;\n}\n\nfunction findMcpPackage(pkgs: Set<string>): string | undefined {\n let best: string | undefined;\n for (const id of MCP_PACKAGES) {\n if (!hasPackage(pkgs, id)) {continue;}\n if (!best || id.length > best.length) {best = id;}\n }\n // Also: any package starting with modelcontextprotocol\n for (const p of pkgs) {\n if (p === 'modelcontextprotocol' || p.startsWith('modelcontextprotocol.')) {\n if (!best || p.length > best.length) {best = p;}\n }\n }\n return best;\n}\n\nfunction matchSpecializedSdk(sdk: string): [string, string, string] | undefined {\n const s = sdk.toLowerCase();\n if (!s) {return undefined;}\n // Longest specialized match (Web before bare if ever needed)\n let best: [string, string, string] | undefined;\n for (const row of SPECIALIZED) {\n const name = row[0].toLowerCase();\n if (s === name || s.startsWith(`${name}/`)) {\n if (!best || name.length > best[0].length) {best = row;}\n }\n }\n return best;\n}\n\nfunction isExe(outputType: string): boolean {\n const o = outputType.toLowerCase();\n return o === 'exe' || o === 'winexe';\n}\n\n/** Priority rank for multi-csproj roots — lower wins. */\nfunction rank(appType: CsharpAppType, framework: string): number {\n if (appType === 'mcp') {return 0;}\n if (appType === 'mobile') {return 1;}\n if (appType === 'backend') {return 2;}\n if (appType === 'cli') {return 3;}\n if (framework && framework !== '') {return 4;} // test-labelled library etc.\n return 5;\n}\n\n/** Classify a single parsed csproj. */\nexport function classifyCsproj(\n parsed: ParsedCsproj,\n projectFileName: string,\n): Omit<CsharpProject, 'projectName'> & { projectName: string } {\n const name = projectFileName.replace(/\\.csproj$/i, '');\n const { sdk, packages, frameworkRefs, outputType } = parsed;\n\n let appType: CsharpAppType;\n let framework = '';\n let found: string;\n\n const mcpPkg = findMcpPackage(packages);\n const specialized = matchSpecializedSdk(sdk);\n const testPkg = findPackageLabel(packages, TEST_PACKAGES);\n const cliPkg = findPackageLabel(packages, CLI_PACKAGES);\n const hasGrpcServer = GRPC_SERVER.some(g => hasPackage(packages, g));\n const hasAspNetRef = frameworkRefs.has('microsoft.aspnetcore.app');\n\n // Priority: MCP → test → maui/desktop → specialized Sdk → AspNet FrameworkRef host → CLI → console Exe → library\n // .csproj alone (base Sdk, no signals) is never web/backend.\n if (mcpPkg) {\n appType = 'mcp';\n framework = 'MCP';\n found = `${projectFileName} + ${mcpPkg} (C# MCP server)`;\n } else if (parsed.isTestProject || specialized?.[1] === 'test' || testPkg) {\n appType = 'library';\n framework = testPkg?.[1] || (specialized?.[1] === 'test' ? specialized[2] : 'Test');\n found = `${projectFileName} + test (${framework})`;\n } else if (parsed.useMaui) {\n appType = 'mobile';\n framework = 'MAUI';\n found = `${projectFileName} + UseMaui (MAUI)`;\n } else if (parsed.useWpf || parsed.useWindowsForms) {\n appType = 'backend'; // desktop host — nearest durable type for agents\n framework = parsed.useWpf && parsed.useWindowsForms\n ? 'WPF+WinForms'\n : parsed.useWpf\n ? 'WPF'\n : 'Windows Forms';\n found = `${projectFileName} + ${framework}`;\n } else if (specialized?.[1] === 'web') {\n appType = 'backend';\n framework = hasGrpcServer ? 'gRPC' : specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]}${hasGrpcServer ? ' + Grpc.AspNetCore' : ''} (ASP.NET Core)`;\n } else if (specialized?.[1] === 'worker') {\n appType = 'backend';\n framework = specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]} (Worker)`;\n } else if (specialized?.[1] === 'blazor-wasm') {\n appType = 'backend';\n framework = specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]} (Blazor WASM)`;\n } else if (specialized?.[1] === 'aspire') {\n appType = 'backend';\n framework = specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]} (Aspire)`;\n } else if (specialized?.[1] === 'razor-lib') {\n appType = 'library';\n framework = specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]} (Razor class library)`;\n } else if (hasAspNetRef && isExe(outputType)) {\n // Non-Web Sdk host that still pulls ASP.NET shared framework\n appType = 'backend';\n framework = 'ASP.NET Core';\n found = `${projectFileName} + FrameworkReference Microsoft.AspNetCore.App (host)`;\n } else if (hasAspNetRef && !isExe(outputType)) {\n appType = 'library';\n framework = 'ASP.NET Core';\n found = `${projectFileName} + FrameworkReference Microsoft.AspNetCore.App (web library)`;\n } else if (cliPkg && (isExe(outputType) || !outputType)) {\n // CLI packages often on Exe; if OutputType omitted but CLI pkg present, still CLI\n appType = 'cli';\n framework = cliPkg[1];\n found = `${projectFileName} + ${cliPkg[0]} (C# CLI)`;\n } else if (isExe(outputType)) {\n appType = 'cli';\n found = `${projectFileName} + OutputType=Exe (C# console)`;\n } else {\n appType = 'library';\n const sdkNote = sdk ? ` Sdk=${sdk}` : '';\n found = `${projectFileName}${sdkNote} (C# class library)`.replace(' Sdk=Microsoft.NET.Sdk', '');\n if (!sdk || sdk.toLowerCase() === BASE_SDK || sdk.toLowerCase().startsWith(`${BASE_SDK}/`)) {\n found = `${projectFileName} (C# class library)`;\n }\n }\n\n return {\n appType,\n projectName: name,\n targetFramework: parsed.targetFramework,\n sdk: sdk || 'Microsoft.NET.Sdk',\n framework,\n found,\n };\n}\n\n/** List root-level .csproj filenames in a directory. */\nexport function listRootCsprojs(dir: string): string[] {\n if (!existsSync(dir)) {return [];}\n try {\n return readdirSync(dir).filter(f => f.toLowerCase().endsWith('.csproj')).sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Classify a C# project directory from root-level .csproj file(s).\n * Multiple projects: pick highest-priority classification (MCP > mobile > backend > cli > library).\n * Returns null if no .csproj at this directory level.\n */\nexport function detectCsharpProject(dir: string): CsharpProject | null {\n const files = listRootCsprojs(dir);\n if (files.length === 0) {return null;}\n\n let best: CsharpProject | null = null;\n let bestRank = 999;\n\n for (const file of files) {\n const path = join(dir, file);\n let content: string;\n try {\n content = readFileSync(path, 'utf-8');\n } catch {\n continue;\n }\n const parsed = parseCsproj(content);\n const classified = classifyCsproj(parsed, file);\n const r = rank(classified.appType, classified.framework);\n if (!best || r < bestRank) {\n best = classified;\n bestRank = r;\n }\n }\n\n return best;\n}\n",
|
|
107
|
-
"import { existsSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join } from 'path';\nimport spec from './jvm-detection.json';\n\n/**\n * JVM (Java / Kotlin) detection — CONTENT-AWARE pom / gradle classification.\n *\n * Kill line: pom / gradle alone ≠ type.\n * One brand: JVM. Android + KMP are facets, not a second \"Kotlin Edition\".\n *\n * Signal graph: settings → modules → plugins/parents/packaging →\n * version catalogs (libs.versions.toml) → deps/starters.\n *\n * Same composition as go.ts / csharp.ts: knowledge in jvm-detection.json.\n */\n\nexport type JvmAppType = 'mcp' | 'backend' | 'cli' | 'library' | 'mobile';\n\nexport interface JvmProject {\n appType: JvmAppType;\n /** Primary framework label (Spring Boot / Quarkus / …) or ''. */\n framework: string;\n buildTool: 'maven' | 'gradle';\n /** Best-effort language signal for slots. */\n mainLanguage: 'Java' | 'Kotlin' | 'Java/Kotlin';\n /** Facets: android · multiplatform (not product brands). */\n facets: string[];\n /** Glass Hood rationale for .faf `# found:`. */\n found: string;\n}\n\ninterface Catalog {\n plugins: Map<string, string>; // alias → plugin id\n libraries: Map<string, string>; // alias → group:artifact\n}\n\ninterface ModuleSignals {\n path: string;\n plugins: Set<string>;\n artifacts: Set<string>; // group:artifact lowercase\n packaging: string;\n parents: Set<string>; // group:artifact\n hasMainClass: boolean;\n hasApplicationPlugin: boolean;\n sourceHints: Set<string>; // androidMain, commonMain, jvmMain, …\n kotlinSources: boolean;\n javaSources: boolean;\n buildTool: 'maven' | 'gradle';\n}\n\nconst MCP_ARTIFACTS = (spec.mcpArtifacts as string[]).map(a => a.toLowerCase());\nconst WEB_PLUGINS = (spec.webPlugins as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst WEB_PARENTS = (spec.webParents as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst WEB_ARTIFACTS = (spec.webArtifacts as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst ANDROID_PLUGINS = (spec.androidPlugins as string[]).map(p => p.toLowerCase());\nconst KMP_PLUGINS = (spec.kmpPlugins as string[]).map(p => p.toLowerCase());\nconst JVM_KOTLIN_PLUGINS = (spec.jvmKotlinPlugins as string[]).map(p => p.toLowerCase());\nconst CLI_PLUGINS = (spec.cliPlugins as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst CLI_ARTIFACTS = (spec.cliArtifacts as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst LIBRARY_PLUGINS = (spec.libraryPlugins as string[]).map(p => p.toLowerCase());\n\nconst JVM_ROOT_MARKERS = [\n 'pom.xml',\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n];\n\n/** True if directory looks like a JVM project root (or multi-module root). */\nexport function isJvmRoot(dir: string): boolean {\n return JVM_ROOT_MARKERS.some(f => existsSync(join(dir, f)));\n}\n\nfunction readText(path: string): string | null {\n try {\n return readFileSync(path, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/** Minimal TOML-ish parse for gradle/libs.versions.toml plugins + libraries. */\nexport function parseVersionCatalog(content: string): Catalog {\n const plugins = new Map<string, string>();\n const libraries = new Map<string, string>();\n let section = '';\n\n for (const raw of content.split('\\n')) {\n const line = raw.replace(/#.*$/, '').trim();\n if (!line) {continue;}\n const sec = line.match(/^\\[([^\\]]+)\\]$/);\n if (sec) {\n section = sec[1].trim().toLowerCase();\n continue;\n }\n\n // alias = { id = \"org.springframework.boot\", ... }\n const objId = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*\\{[^}]*\\bid\\s*=\\s*\"([^\"]+)\"/);\n if (objId && (section === 'plugins' || section.endsWith('.plugins'))) {\n plugins.set(objId[1].replace(/-/g, '.').toLowerCase(), objId[2].toLowerCase());\n plugins.set(objId[1].toLowerCase(), objId[2].toLowerCase());\n continue;\n }\n // alias = { module = \"g:a\", ... } or group + name\n const objMod = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*\\{[^}]*\\bmodule\\s*=\\s*\"([^\"]+)\"/);\n if (objMod && (section === 'libraries' || section.endsWith('.libraries'))) {\n const key = objMod[1].toLowerCase();\n libraries.set(key, objMod[2].toLowerCase());\n libraries.set(key.replace(/-/g, '.'), objMod[2].toLowerCase());\n continue;\n }\n const objGroup = line.match(\n /^([A-Za-z0-9_.-]+)\\s*=\\s*\\{[^}]*\\bgroup\\s*=\\s*\"([^\"]+)\"[^}]*\\bname\\s*=\\s*\"([^\"]+)\"/,\n );\n if (objGroup && (section === 'libraries' || section.endsWith('.libraries'))) {\n const ga = `${objGroup[2]}:${objGroup[3]}`.toLowerCase();\n const key = objGroup[1].toLowerCase();\n libraries.set(key, ga);\n libraries.set(key.replace(/-/g, '.'), ga);\n continue;\n }\n // alias = \"g:a:v\" or \"plugin.id:version\"\n const plain = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*\"([^\"]+)\"/);\n if (plain) {\n const key = plain[1].toLowerCase();\n const val = plain[2];\n if (section === 'plugins' || section.endsWith('.plugins')) {\n const id = val.split(':')[0].toLowerCase();\n plugins.set(key, id);\n plugins.set(key.replace(/-/g, '.'), id);\n } else if (section === 'libraries' || section.endsWith('.libraries')) {\n const parts = val.split(':');\n if (parts.length >= 2) {\n const ga = `${parts[0]}:${parts[1]}`.toLowerCase();\n libraries.set(key, ga);\n libraries.set(key.replace(/-/g, '.'), ga);\n }\n }\n }\n }\n return { plugins, libraries };\n}\n\nfunction loadCatalog(root: string): Catalog {\n const path = join(root, 'gradle', 'libs.versions.toml');\n if (!existsSync(path)) {return { plugins: new Map(), libraries: new Map() };}\n const body = readText(path);\n if (!body) {return { plugins: new Map(), libraries: new Map() };}\n return parseVersionCatalog(body);\n}\n\n/** Parse settings.gradle(.kts) include lines → relative module paths. */\nexport function parseSettingsIncludes(content: string): string[] {\n const mods: string[] = [];\n // include(\"app\", \"lib\") or include 'app', 'lib' or include(\":app\")\n for (const m of content.matchAll(/include\\s*\\(\\s*([^)]+)\\)/g)) {\n for (const part of m[1].split(',')) {\n const name = part.replace(/['\":\\s]/g, '').replace(/^:/, '');\n if (name) {mods.push(name.replace(/:/g, '/'));}\n }\n }\n for (const m of content.matchAll(/include\\s+((?:['\"][^'\"]+['\"]\\s*,?\\s*)+)/g)) {\n for (const part of m[1].split(',')) {\n const name = part.replace(/['\":\\s]/g, '').replace(/^:/, '');\n if (name) {mods.push(name.replace(/:/g, '/'));}\n }\n }\n // project(\":app\").projectDir = file(\"applications/app\")\n for (const m of content.matchAll(\n /project\\s*\\(\\s*[\"']:([^\"']+)[\"']\\s*\\)\\s*\\.projectDir\\s*=\\s*file\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g,\n )) {\n mods.push(m[2].replace(/^\\.\\//, ''));\n }\n return [...new Set(mods)];\n}\n\nfunction extractGradlePlugins(content: string, catalog: Catalog): Set<string> {\n const plugins = new Set<string>();\n // id(\"org.springframework.boot\") version \"…\"\n for (const m of content.matchAll(/\\bid\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g)) {\n plugins.add(m[1].toLowerCase());\n }\n // id 'org.springframework.boot'\n for (const m of content.matchAll(/\\bid\\s+['\"]([^'\"]+)['\"]/g)) {\n plugins.add(m[1].toLowerCase());\n }\n // plugins { application · java · `java-library` } bare / backtick ids\n for (const block of content.matchAll(/plugins\\s*\\{([\\s\\S]*?)\\}/g)) {\n for (const raw of block[1].split(/[\\n;]/)) {\n const line = raw.replace(/\\/\\/.*$/, '').trim();\n if (!line || line.startsWith('id') || line.startsWith('kotlin') || line.startsWith('alias')) {\n continue;\n }\n const bare = line.match(/^`([a-zA-Z0-9.-]+)`$/) || line.match(/^([a-zA-Z][a-zA-Z0-9.-]*)$/);\n if (bare) {plugins.add(bare[1].toLowerCase());}\n }\n }\n // kotlin(\"jvm\") / kotlin(\"multiplatform\")\n for (const m of content.matchAll(/\\bkotlin\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g)) {\n const k = m[1].toLowerCase();\n if (k === 'jvm') {plugins.add('org.jetbrains.kotlin.jvm');}\n else if (k === 'multiplatform') {plugins.add('org.jetbrains.kotlin.multiplatform');}\n else if (k === 'android') {plugins.add('org.jetbrains.kotlin.android');}\n else {plugins.add(`org.jetbrains.kotlin.${k}`);}\n }\n // alias(libs.plugins.spring.boot) or libs.plugins.spring.boot\n for (const m of content.matchAll(/libs\\.plugins\\.([A-Za-z0-9_.]+)/g)) {\n const alias = m[1].toLowerCase();\n const resolved =\n catalog.plugins.get(alias) ||\n catalog.plugins.get(alias.replace(/\\./g, '-')) ||\n catalog.plugins.get(alias.replace(/-/g, '.'));\n if (resolved) {plugins.add(resolved);}\n else {\n // Heuristic: spring.boot → often org.springframework.boot\n if (alias.includes('spring') && alias.includes('boot')) {\n plugins.add('org.springframework.boot');\n }\n }\n }\n // apply plugin: 'java'\n for (const m of content.matchAll(/apply\\s+plugin\\s*:\\s*['\"]([^'\"]+)['\"]/g)) {\n plugins.add(m[1].toLowerCase());\n }\n return plugins;\n}\n\nfunction extractGradleArtifacts(content: string, catalog: Catalog): Set<string> {\n const arts = new Set<string>();\n // \"g:a:v\" or 'g:a:v'\n for (const m of content.matchAll(/[\"']([A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)(?::[^\"']+)?[\"']/g)) {\n arts.add(m[1].toLowerCase());\n }\n // libs.spring.boot.starter.web → alias spring-boot-starter-web / spring.boot.starter.web\n for (const m of content.matchAll(/libs\\.([A-Za-z0-9_.]+)/g)) {\n const alias = m[1].toLowerCase();\n if (alias.startsWith('plugins.')) {continue;}\n const keys = [\n alias,\n alias.replace(/\\./g, '-'),\n alias.replace(/-/g, '.'),\n ];\n for (const k of keys) {\n const ga = catalog.libraries.get(k);\n if (ga) {\n arts.add(ga.includes(':') ? ga.split(':').slice(0, 2).join(':') : ga);\n break;\n }\n }\n }\n return arts;\n}\n\nfunction extractMavenSignals(content: string): {\n packaging: string;\n parents: Set<string>;\n artifacts: Set<string>;\n modules: string[];\n} {\n const packaging =\n (content.match(/<packaging>\\s*([^<]+?)\\s*<\\/packaging>/i)?.[1] || 'jar').trim().toLowerCase();\n const parents = new Set<string>();\n const parentBlock = content.match(/<parent>([\\s\\S]*?)<\\/parent>/i);\n if (parentBlock) {\n const g = parentBlock[1].match(/<groupId>\\s*([^<]+?)\\s*<\\/groupId>/i)?.[1]?.trim();\n const a = parentBlock[1].match(/<artifactId>\\s*([^<]+?)\\s*<\\/artifactId>/i)?.[1]?.trim();\n if (g && a) {parents.add(`${g}:${a}`.toLowerCase());}\n }\n const artifacts = new Set<string>();\n for (const m of content.matchAll(/<dependency>([\\s\\S]*?)<\\/dependency>/gi)) {\n const g = m[1].match(/<groupId>\\s*([^<]+?)\\s*<\\/groupId>/i)?.[1]?.trim();\n const a = m[1].match(/<artifactId>\\s*([^<]+?)\\s*<\\/artifactId>/i)?.[1]?.trim();\n if (g && a) {artifacts.add(`${g}:${a}`.toLowerCase());}\n }\n const modules: string[] = [];\n for (const m of content.matchAll(/<module>\\s*([^<]+?)\\s*<\\/module>/gi)) {\n modules.push(m[1].trim());\n }\n return { packaging, parents, artifacts, modules };\n}\n\nfunction hasPlugin(plugins: Set<string>, id: string): boolean {\n const n = id.toLowerCase();\n if (plugins.has(n)) {return true;}\n for (const p of plugins) {\n if (p === n || p.endsWith(`.${n}`) || p === n.replace(/^org\\.gradle\\./, '')) {return true;}\n }\n return false;\n}\n\nfunction findLabeled(\n set: Set<string>,\n entries: Array<[string, string]>,\n mode: 'plugin' | 'artifact' | 'parent',\n): [string, string] | undefined {\n let best: [string, string] | undefined;\n for (const [id, label] of entries) {\n let hit = false;\n if (mode === 'plugin') {hit = hasPlugin(set, id);}\n else {\n hit = set.has(id) || [...set].some(a => a === id || a.startsWith(`${id}:`) || a.startsWith(`${id}.`));\n // artifact prefix match group:artifact\n if (!hit && mode === 'artifact') {\n hit = [...set].some(a => a === id || a.startsWith(`${id}`));\n }\n }\n if (!hit) {continue;}\n if (!best || id.length > best[0].length) {best = [id, label];}\n }\n return best;\n}\n\nfunction hasMcp(artifacts: Set<string>): string | undefined {\n let best: string | undefined;\n for (const id of MCP_ARTIFACTS) {\n for (const a of artifacts) {\n if (a === id || a.startsWith(`${id}:`) || a.startsWith(id.replace(/:mcp$/, ':'))) {\n if (!best || id.length > best.length) {best = id;}\n }\n // any io.modelcontextprotocol\n if (a.startsWith('io.modelcontextprotocol') || a.includes('spring-ai-starter-mcp') || a.includes('spring-ai-mcp')) {\n if (!best || a.length > best.length) {best = a;}\n }\n }\n }\n return best;\n}\n\nfunction probeSources(dir: string): { kotlin: boolean; java: boolean; hints: Set<string> } {\n const hints = new Set<string>();\n let kotlin = false;\n let java = false;\n const roots = [\n join(dir, 'src'),\n join(dir, 'src', 'main'),\n ];\n const walk = (p: string, depth: number): void => {\n if (depth > 4 || !existsSync(p)) {return;}\n let entries: string[];\n try {\n entries = readdirSync(p);\n } catch {\n return;\n }\n for (const name of entries) {\n if (name === 'androidMain' || name === 'commonMain' || name === 'jvmMain' || name === 'iosMain') {\n hints.add(name);\n }\n const full = join(p, name);\n try {\n const st = statSync(full);\n if (st.isDirectory()) {walk(full, depth + 1);}\n else if (name.endsWith('.kt') || name.endsWith('.kts')) {kotlin = true;}\n else if (name.endsWith('.java')) {java = true;}\n } catch { /* skip */ }\n }\n };\n for (const r of roots) {walk(r, 0);}\n // also check kotlin dsl only at module root as language signal is weak — skip\n return { kotlin, java, hints };\n}\n\nfunction classifyModule(sig: ModuleSignals): Omit<JvmProject, 'buildTool' | 'mainLanguage'> & {\n buildTool: 'maven' | 'gradle';\n mainLanguage: 'Java' | 'Kotlin' | 'Java/Kotlin';\n} {\n const facets: string[] = [];\n const plugins = sig.plugins;\n const arts = sig.artifacts;\n\n const isKmp = KMP_PLUGINS.some(p => hasPlugin(plugins, p)) || sig.sourceHints.has('commonMain');\n const isAndroidApp = hasPlugin(plugins, 'com.android.application');\n const isAndroidLib =\n hasPlugin(plugins, 'com.android.library') ||\n hasPlugin(plugins, 'com.android.kotlin.multiplatform.library');\n if (isAndroidApp || isAndroidLib) {facets.push('android');}\n if (isKmp) {facets.push('multiplatform');}\n\n const mcp = hasMcp(arts);\n const webPlug = findLabeled(plugins, WEB_PLUGINS, 'plugin');\n const webParent = findLabeled(sig.parents, WEB_PARENTS, 'parent');\n const webArt = findLabeled(arts, WEB_ARTIFACTS, 'artifact');\n const cliPlug = findLabeled(plugins, CLI_PLUGINS, 'plugin');\n const cliArt = findLabeled(arts, CLI_ARTIFACTS, 'artifact');\n const isLibPlugin = LIBRARY_PLUGINS.some(p => hasPlugin(plugins, p));\n const isAggregator = sig.packaging === 'pom';\n\n let appType: JvmAppType;\n let framework = '';\n let found: string;\n\n // Priority: KMP facet noted always; Android app → mobile; MCP → mcp; web → backend; CLI → cli; else library\n if (isAndroidApp) {\n appType = 'mobile';\n framework = isKmp ? 'Android+KMP' : 'Android';\n found = `${sig.path || 'root'} + com.android.application (${framework})`;\n } else if (mcp) {\n appType = 'mcp';\n framework = 'MCP';\n facets.push('mcp');\n found = `${sig.path || 'root'} + ${mcp} (JVM MCP server)`;\n } else if (webPlug || webParent || webArt) {\n appType = 'backend';\n framework = webPlug?.[1] || webParent?.[1] || webArt?.[1] || 'JVM';\n const via = webPlug?.[0] || webParent?.[0] || webArt?.[0] || 'web';\n found = `${sig.path || 'root'} + ${via} (JVM backend)`;\n } else if (isKmp && !isAndroidLib) {\n // Shared KMP without android application — library with multiplatform facet\n appType = 'library';\n framework = 'Kotlin Multiplatform';\n found = `${sig.path || 'root'} + kotlin multiplatform (KMP library)`;\n } else if (isAndroidLib) {\n appType = 'library';\n framework = isKmp ? 'Android+KMP' : 'Android';\n found = `${sig.path || 'root'} + android library (${framework})`;\n } else if (cliArt || (sig.hasApplicationPlugin && (sig.hasMainClass || cliPlug)) || (cliPlug && sig.hasMainClass)) {\n appType = 'cli';\n framework = cliArt?.[1] || 'application';\n found = cliArt\n ? `${sig.path || 'root'} + ${cliArt[0]} (JVM CLI)`\n : `${sig.path || 'root'} + application plugin (JVM CLI)`;\n } else if (sig.hasApplicationPlugin && !isLibPlugin) {\n appType = 'cli';\n framework = 'application';\n found = `${sig.path || 'root'} + application plugin (JVM CLI)`;\n } else if (isAggregator) {\n appType = 'library';\n found = `${sig.path || 'root'} + packaging=pom (Maven aggregator/BOM)`;\n } else {\n appType = 'library';\n const lang = sig.kotlinSources && !sig.javaSources ? 'Kotlin' : 'JVM';\n found = `${sig.path || 'root'} (${lang} library)`;\n if (isLibPlugin) {found = `${sig.path || 'root'} + java-library (JVM library)`;}\n }\n\n let mainLanguage: 'Java' | 'Kotlin' | 'Java/Kotlin' = 'Java';\n if (sig.kotlinSources && sig.javaSources) {mainLanguage = 'Java/Kotlin';}\n else if (sig.kotlinSources || JVM_KOTLIN_PLUGINS.some(p => hasPlugin(plugins, p)) || isKmp) {\n mainLanguage = 'Kotlin';\n }\n\n // Dedupe facets\n const uniqFacets = [...new Set(facets)];\n\n return {\n appType,\n framework,\n facets: uniqFacets,\n found,\n buildTool: sig.buildTool,\n mainLanguage,\n };\n}\n\nfunction rank(appType: JvmAppType, facets: string[]): number {\n if (appType === 'mcp') {return 0;}\n if (appType === 'mobile') {return 1;}\n if (facets.includes('multiplatform') && appType === 'backend') {return 2;}\n if (appType === 'backend') {return 3;}\n if (appType === 'cli') {return 4;}\n if (facets.includes('multiplatform')) {return 5;}\n if (facets.includes('android')) {return 6;}\n return 7;\n}\n\nfunction collectGradleModule(root: string, rel: string, catalog: Catalog): ModuleSignals | null {\n const dir = rel ? join(root, rel) : root;\n const kts = join(dir, 'build.gradle.kts');\n const groovy = join(dir, 'build.gradle');\n const path = existsSync(kts) ? kts : existsSync(groovy) ? groovy : null;\n if (!path) {return null;}\n const content = readText(path);\n if (!content) {return null;}\n const plugins = extractGradlePlugins(content, catalog);\n const artifacts = extractGradleArtifacts(content, catalog);\n const sources = probeSources(dir);\n const hasMainClass =\n /mainClass\\s*[.=]/.test(content) ||\n /mainClassName\\s*=/.test(content) ||\n /Main-Class/.test(content);\n const hasApplicationPlugin =\n hasPlugin(plugins, 'application') ||\n hasPlugin(plugins, 'org.gradle.application');\n\n return {\n path: rel || 'build.gradle',\n plugins,\n artifacts,\n packaging: 'jar',\n parents: new Set(),\n hasMainClass,\n hasApplicationPlugin,\n sourceHints: sources.hints,\n kotlinSources: sources.kotlin || path.endsWith('.kts'),\n javaSources: sources.java,\n buildTool: 'gradle',\n };\n}\n\nfunction collectMavenModule(root: string, rel: string): ModuleSignals | null {\n const dir = rel ? join(root, rel) : root;\n const pomPath = join(dir, 'pom.xml');\n if (!existsSync(pomPath)) {return null;}\n const content = readText(pomPath);\n if (!content) {return null;}\n const { packaging, parents, artifacts } = extractMavenSignals(content);\n const sources = probeSources(dir);\n return {\n path: rel ? `${rel}/pom.xml` : 'pom.xml',\n plugins: new Set(),\n artifacts,\n packaging,\n parents,\n hasMainClass: /<mainClass>/.test(content),\n hasApplicationPlugin: false,\n sourceHints: sources.hints,\n kotlinSources: sources.kotlin,\n javaSources: sources.java,\n buildTool: 'maven',\n };\n}\n\n/**\n * Classify a JVM project directory (Maven and/or Gradle, multi-module aware).\n * Returns null if no JVM markers at this directory.\n */\nexport function detectJvmProject(dir: string): JvmProject | null {\n if (!isJvmRoot(dir)) {return null;}\n\n const catalog = loadCatalog(dir);\n const modules: ModuleSignals[] = [];\n\n // Gradle settings → includes\n let settingsBody: string | null = null;\n for (const s of ['settings.gradle.kts', 'settings.gradle']) {\n const p = join(dir, s);\n if (existsSync(p)) {\n settingsBody = readText(p);\n break;\n }\n }\n const includes = settingsBody ? parseSettingsIncludes(settingsBody) : [];\n\n // Root gradle module\n const rootGradle = collectGradleModule(dir, '', catalog);\n if (rootGradle) {modules.push(rootGradle);}\n\n for (const inc of includes) {\n const m = collectGradleModule(dir, inc, catalog);\n if (m) {modules.push(m);}\n }\n\n // Maven root + modules\n const rootPom = collectMavenModule(dir, '');\n if (rootPom) {\n modules.push(rootPom);\n const pomContent = readText(join(dir, 'pom.xml'));\n if (pomContent) {\n const { modules: mavMods } = extractMavenSignals(pomContent);\n for (const mm of mavMods) {\n const m = collectMavenModule(dir, mm);\n if (m) {modules.push(m);}\n }\n }\n }\n\n // Settings-only / empty root: still JVM if settings exist\n if (modules.length === 0 && settingsBody) {\n return {\n appType: 'library',\n framework: '',\n buildTool: 'gradle',\n mainLanguage: 'Java/Kotlin',\n facets: [],\n found: 'settings.gradle (Gradle multi-project root)',\n };\n }\n\n if (modules.length === 0) {return null;}\n\n let best: JvmProject | null = null;\n let bestRank = 999;\n for (const mod of modules) {\n const c = classifyModule(mod);\n const r = rank(c.appType, c.facets);\n if (!best || r < bestRank) {\n best = {\n appType: c.appType,\n framework: c.framework,\n buildTool: c.buildTool,\n mainLanguage: c.mainLanguage,\n facets: c.facets,\n found: c.found,\n };\n bestRank = r;\n }\n }\n\n // Multi-module: if root is aggregator library but a child is better, we already picked child.\n // Enrich found with multi-module note when includes > 0 and best is not root-only\n if (best && includes.length > 0 && !best.found.includes('multi-project')) {\n // leave found as module-specific signal — Glass Hood prefers the decisive signal\n }\n\n return best;\n}\n",
|
|
108
|
-
"import {
|
|
109
|
-
"import { existsSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join } from 'path';\nimport spec from './swift-detection.json';\n\n/**\n * Swift detection — CONTENT-AWARE Package.swift / Xcode classification.\n *\n * Kill line: Package.swift alone ≠ app.\n * SPM backs libraries, executables (CLI), server apps (Vapor / Hummingbird),\n * MCP servers (official swift-sdk product MCP), and Xcode client apps.\n * Static token scan only — never execute Package.swift / swift build.\n *\n * Same composition as go.ts / ruby.ts: knowledge in swift-detection.json.\n */\n\nexport type SwiftAppType = 'mcp' | 'backend' | 'cli' | 'app' | 'library';\n\nexport interface SwiftProject {\n appType: SwiftAppType;\n /** Primary framework label (Vapor / Hummingbird / MCP / ArgumentParser / …) or ''. */\n framework: string;\n /** spm when Package.swift; xcode when only xcodeproj; both when combined. */\n packageManager: 'spm' | 'xcode' | 'spm+xcode';\n /** Glass Hood rationale for .faf `# found:`. */\n found: string;\n}\n\nconst MCP_URLS = (spec.mcpPackageUrls as string[]).map(u => u.toLowerCase());\nconst MCP_PRODUCTS = (spec.mcpProducts as string[]).map(p => p.toLowerCase());\nconst SERVER_URLS = (spec.serverPackageUrls as Array<[string, string]>).map(\n ([u, label]) => [u.toLowerCase(), label] as [string, string],\n);\nconst SERVER_PRODUCTS = (spec.serverProducts as Array<[string, string]>).map(\n ([p, label]) => [p.toLowerCase(), label] as [string, string],\n);\nconst CLI_URLS = (spec.cliPackageUrls as Array<[string, string]>).map(\n ([u, label]) => [u.toLowerCase(), label] as [string, string],\n);\nconst CLI_PRODUCTS = (spec.cliProducts as Array<[string, string]>).map(\n ([p, label]) => [p.toLowerCase(), label] as [string, string],\n);\nconst APP_PRODUCT_TYPES = spec.appProductTypes as string[];\nconst CLI_PRODUCT_TYPES = spec.cliProductTypes as string[];\nconst VAPOR_LAYOUT = spec.vaporLayoutFiles as string[];\n\nexport interface PackageSwiftSignals {\n packageUrls: string[];\n productNames: string[]; // .product(name: \"X\")\n hasLibraryProduct: boolean;\n hasExecutableProduct: boolean;\n hasPluginProduct: boolean;\n hasExecutableTarget: boolean;\n hasLibraryTarget: boolean;\n}\n\n/** True if directory looks like a Swift project root. */\nexport function isSwiftRoot(dir: string): boolean {\n return existsSync(join(dir, 'Package.swift')) || listXcodeprojs(dir).length > 0;\n}\n\n/** Root-level *.xcodeproj directory names. */\nexport function listXcodeprojs(dir: string): string[] {\n try {\n return readdirSync(dir).filter(f => {\n if (!f.endsWith('.xcodeproj')) {return false;}\n try {\n return statSync(join(dir, f)).isDirectory();\n } catch {\n return false;\n }\n });\n } catch {\n return [];\n }\n}\n\nfunction readText(path: string): string | null {\n try {\n return readFileSync(path, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Static scan of Package.swift — does NOT compile or evaluate Swift.\n * Strips line and block comments best-effort before token extraction.\n */\nexport function parsePackageSwift(content: string): PackageSwiftSignals {\n const stripped = stripSwiftComments(content);\n const lower = stripped.toLowerCase();\n\n const packageUrls: string[] = [];\n // .package(url: \"…\") or .package(url: \"…\", from: …)\n const urlRe = /\\.package\\s*\\(\\s*url\\s*:\\s*\"([^\"]+)\"/gi;\n let m: RegExpExecArray | null;\n while ((m = urlRe.exec(stripped)) !== null) {\n packageUrls.push(m[1]);\n }\n // Alternate: .package(url: \"…\") with single quotes (rare)\n const urlRe2 = /\\.package\\s*\\(\\s*url\\s*:\\s*'([^']+)'/gi;\n while ((m = urlRe2.exec(stripped)) !== null) {\n packageUrls.push(m[1]);\n }\n\n const productNames: string[] = [];\n // .product(name: \"Vapor\", package: \"vapor\")\n const prodRe = /\\.product\\s*\\(\\s*name\\s*:\\s*\"([^\"]+)\"/gi;\n while ((m = prodRe.exec(stripped)) !== null) {\n productNames.push(m[1]);\n }\n const prodRe2 = /\\.product\\s*\\(\\s*name\\s*:\\s*'([^']+)'/gi;\n while ((m = prodRe2.exec(stripped)) !== null) {\n productNames.push(m[1]);\n }\n\n // Product kinds in products: [ … ]\n // .library(name: …) .executable(name: …) .plugin(\n const hasLibraryProduct = /\\.library\\s*\\(/.test(lower);\n const hasExecutableProduct = /\\.executable\\s*\\(/.test(lower);\n // Avoid matching .plugin( on targets if we can — products use Product.plugin / .plugin(\n // Both product and target use .plugin( — still a useful signal when no library/exe.\n const hasPluginProduct = /\\.plugin\\s*\\(/.test(lower) && !hasLibraryProduct && !hasExecutableProduct\n ? true\n : /\\bproducts\\s*:\\s*\\[[\\s\\S]*?\\.plugin\\s*\\(/.test(lower);\n\n const hasExecutableTarget = /\\.executabletarget\\s*\\(/.test(lower);\n // Plain .target( — executableTarget/testTarget use different selectors\n const hasLibraryTarget = /\\.target\\s*\\(/.test(lower) && !hasExecutableTarget\n ? true\n : (lower.match(/\\.target\\s*\\(/g) || []).length >\n (lower.match(/\\.executabletarget\\s*\\(/g) || []).length +\n (lower.match(/\\.testtarget\\s*\\(/g) || []).length;\n return {\n packageUrls,\n productNames,\n hasLibraryProduct,\n hasExecutableProduct,\n hasPluginProduct: !!hasPluginProduct,\n hasExecutableTarget,\n hasLibraryTarget,\n };\n}\n\n/** Best-effort strip of line (//) and block comments for static scan. */\nexport function stripSwiftComments(src: string): string {\n let out = '';\n let i = 0;\n while (i < src.length) {\n // string literal — preserve contents so URLs inside stay intact\n if (src[i] === '\"' || src[i] === \"'\") {\n const q = src[i];\n out += q;\n i++;\n while (i < src.length) {\n if (src[i] === '\\\\' && i + 1 < src.length) {\n out += src[i] + src[i + 1];\n i += 2;\n continue;\n }\n out += src[i];\n if (src[i] === q) {\n i++;\n break;\n }\n i++;\n }\n continue;\n }\n if (src[i] === '/' && src[i + 1] === '/') {\n i += 2;\n while (i < src.length && src[i] !== '\\n') {i++;}\n continue;\n }\n if (src[i] === '/' && src[i + 1] === '*') {\n i += 2;\n while (i < src.length && !(src[i] === '*' && src[i + 1] === '/')) {i++;}\n i += 2;\n continue;\n }\n out += src[i];\n i++;\n }\n return out;\n}\n\nfunction urlHits(urls: string[], needles: string[]): string | undefined {\n const lowerUrls = urls.map(u => u.toLowerCase());\n let best: string | undefined;\n for (const n of needles) {\n for (const u of lowerUrls) {\n if (u.includes(n) && (!best || n.length > best.length)) {best = n;}\n }\n }\n return best;\n}\n\nfunction urlHitsLabeled(\n urls: string[],\n entries: Array<[string, string]>,\n): [string, string] | undefined {\n const lowerUrls = urls.map(u => u.toLowerCase());\n let best: [string, string] | undefined;\n for (const [needle, label] of entries) {\n for (const u of lowerUrls) {\n if (u.includes(needle) && (!best || needle.length > best[0].length)) {\n best = [needle, label];\n }\n }\n }\n return best;\n}\n\nfunction productHitsLabeled(\n products: string[],\n entries: Array<[string, string]>,\n): [string, string] | undefined {\n const lower = products.map(p => p.toLowerCase());\n let best: [string, string] | undefined;\n for (const [name, label] of entries) {\n if (lower.includes(name) && (!best || name.length > best[0].length)) {\n best = [name, label];\n }\n }\n return best;\n}\n\nfunction mcpProductHit(products: string[]): boolean {\n const lower = products.map(p => p.toLowerCase());\n return MCP_PRODUCTS.some(p => lower.includes(p));\n}\n\n/**\n * Light pbxproj grep — no AST. Reads project.pbxproj under each .xcodeproj.\n */\nexport function scanXcodeProductTypes(dir: string): {\n hasApplication: boolean;\n hasTool: boolean;\n hit?: string;\n} {\n let hasApplication = false;\n let hasTool = false;\n let hit: string | undefined;\n for (const xp of listXcodeprojs(dir)) {\n const pbx = join(dir, xp, 'project.pbxproj');\n const body = readText(pbx);\n if (!body) {continue;}\n for (const t of APP_PRODUCT_TYPES) {\n if (body.includes(t)) {\n hasApplication = true;\n hit = t;\n }\n }\n for (const t of CLI_PRODUCT_TYPES) {\n if (body.includes(t)) {\n hasTool = true;\n if (!hit) {hit = t;}\n }\n }\n }\n return { hasApplication, hasTool, hit };\n}\n\nfunction vaporLayoutHit(dir: string): string | undefined {\n for (const rel of VAPOR_LAYOUT) {\n if (existsSync(join(dir, rel))) {return rel;}\n }\n return undefined;\n}\n\n/**\n * Classify a Swift project from Package.swift (+ light Xcode).\n * Returns null if not a Swift root.\n */\nexport function detectSwiftProject(dir: string): SwiftProject | null {\n if (!isSwiftRoot(dir)) {return null;}\n\n const pkgPath = join(dir, 'Package.swift');\n const hasPkg = existsSync(pkgPath);\n const xcodeprojs = listXcodeprojs(dir);\n const hasXcode = xcodeprojs.length > 0;\n\n let signals: PackageSwiftSignals | null = null;\n if (hasPkg) {\n const body = readText(pkgPath);\n if (body) {signals = parsePackageSwift(body);}\n }\n\n const xcode = hasXcode ? scanXcodeProductTypes(dir) : { hasApplication: false, hasTool: false };\n const layout = vaporLayoutHit(dir);\n\n const urls = signals?.packageUrls ?? [];\n const products = signals?.productNames ?? [];\n\n const mcpUrl = urlHits(urls, MCP_URLS);\n const mcpProd = mcpProductHit(products);\n const serverUrl = urlHitsLabeled(urls, SERVER_URLS);\n const serverProd = productHitsLabeled(products, SERVER_PRODUCTS);\n const cliUrl = urlHitsLabeled(urls, CLI_URLS);\n const cliProd = productHitsLabeled(products, CLI_PRODUCTS);\n\n const isMcp = !!(mcpUrl || mcpProd);\n const isServer = !!(serverUrl || serverProd || layout);\n const isExecutable =\n !!(signals?.hasExecutableProduct || signals?.hasExecutableTarget);\n const isCliStack = !!(cliUrl || cliProd);\n const isApp = xcode.hasApplication;\n\n const packageManager: SwiftProject['packageManager'] =\n hasPkg && hasXcode ? 'spm+xcode' : hasPkg ? 'spm' : 'xcode';\n\n let appType: SwiftAppType;\n let framework = '';\n let found: string;\n\n // Priority: mcp > backend > app > cli > library\n if (isMcp) {\n appType = 'mcp';\n framework = 'MCP';\n if (mcpProd) {\n found = 'Package.swift + product MCP (Swift MCP)';\n } else {\n found = `Package.swift + ${mcpUrl} (Swift MCP)`;\n }\n } else if (isServer) {\n appType = 'backend';\n framework = serverProd?.[1] || serverUrl?.[1] || (layout ? 'Vapor' : '');\n if (serverProd) {\n found = `Package.swift + product ${serverProd[1]} (Swift backend)`;\n } else if (serverUrl) {\n found = `Package.swift + ${serverUrl[1]} (Swift backend)`;\n } else {\n found = `${layout} (Swift backend layout)`;\n }\n } else if (isApp) {\n appType = 'app';\n framework = '';\n found = `${xcodeprojs[0]} + ${xcode.hit || 'application'} (Swift app)`;\n } else if (isCliStack || (isExecutable && !isServer && !isMcp)) {\n appType = 'cli';\n framework = cliProd?.[1] || cliUrl?.[1] || '';\n if (cliProd) {\n found = `Package.swift + product ${cliProd[1]} (Swift CLI)`;\n } else if (cliUrl) {\n found = `Package.swift + ${cliUrl[1]} (Swift CLI)`;\n } else if (signals?.hasExecutableProduct) {\n found = 'Package.swift + .executable product (Swift CLI)';\n } else {\n found = 'Package.swift + .executableTarget (Swift CLI)';\n }\n } else if (xcode.hasTool && !hasPkg) {\n appType = 'cli';\n found = `${xcodeprojs[0]} + tool productType (Swift CLI)`;\n } else if (hasPkg) {\n appType = 'library';\n if (signals?.hasLibraryProduct) {\n found = 'Package.swift + .library product (Swift library)';\n } else {\n found = 'Package.swift (Swift library)';\n }\n } else {\n // xcodeproj without application/tool productType — weak library/app unknown\n appType = 'library';\n found = `${xcodeprojs[0] || 'xcodeproj'} (Swift — no classifying productType)`;\n }\n\n return { appType, framework, packageManager, found };\n}\n",
|
|
110
|
-
"/**\n * Relentless — the 6-W human-context extractor. \"Never gives up on finding\n * context\" (the v5 RelentlessContextExtractor), rewritten v6-native + sync and\n * realigned to FAF's no-guess doctrine: it reads EVERY source (manifest +\n * README, tiered) but FILLS ONLY from sourced evidence. The v5 INFERRED tiers\n * (guess from project name / tech stack) are deliberately dropped —\n * sourced-or-empty; `faf go` is where the human confirms.\n *\n * Pairs with Turbo-Cat: Turbo-Cat fills STACK slots from file formats;\n * Relentless fills the 6 HUMAN-CONTEXT slots (who/what/why/where/when/how) by\n * reading. WHO is the target AUDIENCE (not the package author — a v5 conflation\n * this rewrite corrects).\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\ninterface PkgJson {\n description?: string;\n repository?: string | { url?: string };\n homepage?: string;\n scripts?: Record<string, string>;\n keywords?: string[];\n}\n\nexport interface SeededContext {\n who?: string;\n what?: string;\n why?: string;\n where?: string;\n when?: string;\n how?: string;\n}\n\n/**\n * A sourced 6-W value WITH its provenance — where it came from and how much to\n * trust it. The honesty gate: a fill the human can audit before confirming.\n * - `source`: the artifact + locus it was relocated from, e.g.\n * 'package.json:description' or 'README:## Why'. If we can't name a source,\n * we don't emit a value — sourced-or-empty, never invented.\n * - `confidence`: 0..1 by source quality (structured field > named section >\n * heuristic match). A signal for the seeded/confirm UI, not a score.\n */\nexport interface SourcedValue {\n value: string;\n source: string;\n confidence: number;\n}\n\nexport interface SeededContextDetailed {\n who?: SourcedValue;\n what?: SourcedValue;\n why?: SourcedValue;\n where?: SourcedValue;\n when?: SourcedValue;\n how?: SourcedValue;\n}\n\nconst sv = (value: string, source: string, confidence: number): SourcedValue => ({ value, source, confidence });\n\n/**\n * The 6-W extractor WITH provenance — each slot carries {value, source,\n * confidence}. This is the auditable form: the seeded/confirm UI can show the\n * human WHERE a value was relocated from before they accept it.\n */\n/** `toolingRoot`: the repo root's package.json is a tooling shell (polyglot repo\n * — real code is in sibling dirs), so its description/repo/scripts describe the\n * tooling, not the product. Skip package.json-sourced context; README only. */\nexport interface RelentlessOpts { toolingRoot?: boolean }\n\nexport function relentlessContextDetailed(dir: string, opts: RelentlessOpts = {}): SeededContextDetailed {\n const pkg = opts.toolingRoot ? null : readPkg(dir);\n const readme = cleanReadme(dir);\n const out: SeededContextDetailed = {};\n const set = (k: keyof SeededContextDetailed, v: SourcedValue | null): void => {\n if (v) {out[k] = v;}\n };\n\n set('what', extractWhat(pkg, readme));\n set('who', extractWho(readme));\n set('why', extractWhy(readme));\n set('where', extractWhere(pkg, readme));\n set('when', extractWhen(readme));\n set('how', extractHow(pkg, readme));\n\n return out;\n}\n\n/**\n * The bare 6-W extractor — values only, backward-compatible. A pure projection\n * of `relentlessContextDetailed` (single internal source; identical output to\n * the pre-provenance version). Existing consumers (claude-faf-mcp's faf_auto)\n * keep working unchanged; opt into provenance via the Detailed form.\n */\nexport function relentlessContext(dir: string, opts: RelentlessOpts = {}): SeededContext {\n const detailed = relentlessContextDetailed(dir, opts);\n const seed: SeededContext = {};\n (Object.keys(detailed) as (keyof SeededContextDetailed)[]).forEach((k) => {\n const sourced = detailed[k];\n if (sourced) {seed[k] = sourced.value;}\n });\n return seed;\n}\n\nfunction readPkg(dir: string): PkgJson | null {\n const p = join(dir, 'package.json');\n if (!existsSync(p)) {return null;}\n try {\n return JSON.parse(readFileSync(p, 'utf-8')) as PkgJson;\n } catch {\n return null;\n }\n}\n\n/** README with HTML tags + badge lines stripped (so we don't seed shields.io noise). */\nfunction cleanReadme(dir: string): string {\n const p = join(dir, 'README.md');\n if (!existsSync(p)) {return '';}\n let txt: string;\n try {\n txt = readFileSync(p, 'utf-8');\n } catch {\n return '';\n }\n return txt\n .replace(/<!--[\\s\\S]*?-->/g, '') // HTML comment blocks (asset notes, TODOs — not prose)\n .split('\\n')\n .filter((l) => !/^\\s*\\[!\\[/.test(l) && !/^\\s*!\\[/.test(l)) // badge lines\n .join('\\n')\n .replace(/<[^>]+>/g, '') // HTML tags\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, '') // inline images/badges\n .trim();\n}\n\nfunction clean(text: string): string {\n return text.replace(/\\s+/g, ' ').replace(/[#*`>]/g, '').trim().slice(0, 280);\n}\n\n/** Share of a string's characters that sit inside markdown/inline links. */\nfunction linkDensity(s: string): number {\n if (!s) {return 0;}\n const linked = (s.match(/\\[[^\\]]*\\]\\([^)]*\\)/g) ?? []).join('').length;\n return linked / s.length;\n}\n\n/** First `## Section` body matching any of the pipe-listed names (min 20 chars).\n * Returns the cleaned body AND the matched heading (for provenance labels).\n * Rejects link-list bodies (nav / roadmap-link rows are not prose). */\nfunction section(readme: string, names: string): { body: string; heading: string } | null {\n const re = new RegExp(`##?\\\\s+(${names})\\\\s*\\\\n+([\\\\s\\\\S]+?)(?:\\\\n\\\\n|\\\\n##?|$)`, 'i');\n const m = readme.match(re);\n if (!m || !m[2] || m[2].trim().length <= 20 || linkDensity(m[2]) > 0.4) {return null;}\n return { body: clean(m[2]), heading: m[1].trim() };\n}\n\n/**\n * True when a README intro paragraph is a callout / nav row / pre-release\n * banner rather than a description. These sit above the real first prose on\n * many repos (future-agi opens with a `> ⚠️ Nightly release…` blockquote) and\n * must not seed `human_context.what`.\n */\nfunction isNonProseIntro(p: string): boolean {\n const t = p.trim();\n // Blockquote callout — GitHub admonitions (> [!NOTE] / > [!WARNING]) included\n if (/^>/.test(t)) {return true;}\n // Pre-release / status banner phrasing\n if (/\\b(nightly (release|build)|pre-?release|work[-\\s]in[-\\s]progress|rough edges|early (access|testing|preview)|use at your own risk|not (yet )?production[-\\s]?ready|expect (rough|breaking)|experimental release)\\b/i.test(t)) {return true;}\n // Nav / link row: 3+ short fragments split on · or |\n const frags = t.split(/[·|]/).map((s) => s.trim()).filter(Boolean);\n if (frags.length >= 3 && frags.every((f) => f.length <= 24)) {return true;}\n return false;\n}\n\n/** First capturing-group match across patterns whose capture meets minLen. */\nfunction firstMatch(text: string, patterns: RegExp[], minLen = 30): string | null {\n for (const re of patterns) {\n const m = text.match(re);\n if (m && m[1] && m[1].trim().length >= minLen) {return clean(m[1]);}\n }\n return null;\n}\n\nfunction extractWhat(pkg: PkgJson | null, readme: string): SourcedValue | null {\n if (pkg?.description && pkg.description.length > 20) {return sv(clean(pkg.description), 'package.json:description', 0.95);}\n const sec = section(readme, 'Purpose|What|About|Overview|Description');\n if (sec) {return sv(sec.body, `README:## ${sec.heading}`, 0.8);}\n const firstReal = readme\n .split(/\\n\\s*\\n/)\n .map((p) => p.replace(/\\s+/g, ' ').trim())\n .find((p) => p.length > 30 && !p.startsWith('#') && !isNonProseIntro(p));\n if (firstReal) {return sv(clean(firstReal), 'README:first-paragraph', 0.5);}\n const fm = firstMatch(readme, [\n /(?:core|main|primary)\\s+(?:problem|challenge)(?:\\s+is)?\\s*:?\\s*([^.\\n]{30,})/i,\n /solves?\\s+(?:the\\s+)?(?:problem\\s+of\\s+)?([^.\\n]{30,})/i,\n ]);\n return fm ? sv(fm, 'README:problem-heuristic', 0.6) : null;\n}\n\nfunction extractWho(readme: string): SourcedValue | null {\n const sec = section(readme, 'Audience|Who|Who is this for|Who it.s for');\n if (sec) {return sv(sec.body, `README:## ${sec.heading}`, 0.8);}\n const fm = firstMatch(\n readme,\n [\n // optional qualifier before the role word, so \"for backend teams\" /\n // \"for indie developers\" match — not just a bare role. Dogfood-caught.\n /\\b(?:designed|built|made)\\s+for\\s+((?:[a-z][a-z-]*\\s+)?(?:developers?|teams?|engineers?|builders?|founders?)[^.\\n]{0,80})/i,\n /\\bfor\\s+((?:[a-z][a-z-]*\\s+)?(?:developers?|teams?|engineers?|builders?|founders?)[^.\\n]{0,80})/i,\n ],\n 8,\n );\n return fm ? sv(fm, 'README:audience-heuristic', 0.6) : null;\n}\n\nfunction extractWhy(readme: string): SourcedValue | null {\n const sec = section(readme, 'Why|Mission|Motivation|Rationale|Vision');\n if (sec) {return sv(sec.body, `README:## ${sec.heading}`, 0.8);}\n // DECLARATIVE only — \"our mission is X\", \"the goal is X\", \"Mission: X\". The\n // bare noun is NOT enough: \"(name + goal + the six Ws)\" must not match (it did,\n // and grabbed the rest of the line — a real bug the provenance dogfood caught).\n const fm = firstMatch(readme, [\n /(?:our\\s+|the\\s+)?(?:mission|purpose|goal)\\s+is\\s+([^.\\n]{30,})/i,\n /\\b(?:mission|purpose|goal)\\s*:\\s*([^.\\n]{30,})/i,\n /(?:built|created|designed)\\s+(?:because|to)\\s+([^.\\n]{30,})/i,\n ]);\n return fm ? sv(fm, 'README:mission-heuristic', 0.6) : null;\n}\n\nfunction extractWhere(pkg: PkgJson | null, readme: string): SourcedValue | null {\n const repo = typeof pkg?.repository === 'string' ? pkg.repository : pkg?.repository?.url;\n if (repo) {return sv(clean(repo.replace(/^git\\+/, '').replace(/\\.git$/, '')), 'package.json:repository', 0.95);}\n if (pkg?.homepage) {return sv(clean(pkg.homepage), 'package.json:homepage', 0.9);}\n const fm = firstMatch(\n readme,\n // {3,80} + minLen 3 so short platform names (\"npm\", \"AWS\") match —\n // \"Published on npm.\" used to slip past the 4-char floor. Dogfood-caught.\n [/\\b(?:deployed|hosted|available|published)\\s+(?:on|at|via)\\s+([^.\\n]{3,80})/i],\n 3,\n );\n return fm ? sv(fm, 'README:deploy-heuristic', 0.6) : null;\n}\n\nfunction extractWhen(readme: string): SourcedValue | null {\n const sec = section(readme, 'Timeline|Status|Release|Roadmap');\n if (sec) {return sv(sec.body, `README:## ${sec.heading}`, 0.8);}\n const fm = firstMatch(\n readme,\n [\n /\\b(production\\s+since\\s+[^.\\n]{4,60})/i,\n /\\b((?:in\\s+)?(?:production|beta|alpha|development)\\s+since\\s+[^.\\n]{4,60})/i,\n /\\bsince\\s+((?:[A-Z][a-z]+\\s+)?\\d{4}[^.\\n]{0,40})/,\n ],\n 4,\n );\n return fm ? sv(fm, 'README:since-heuristic', 0.6) : null;\n}\n\nfunction extractHow(pkg: PkgJson | null, readme: string): SourcedValue | null {\n const scripts = pkg?.scripts ? Object.keys(pkg.scripts) : [];\n const run = ['start', 'dev', 'build'].filter((s) => scripts.includes(s));\n if (run.length) {return sv(clean(run.map((s) => `npm run ${s}`).join(', ')), 'package.json:scripts', 0.9);}\n const usage = section(readme, 'Usage|Getting Started|Install|Installation|Quick Start');\n if (usage) {return sv(usage.body, `README:## ${usage.heading}`, 0.8);}\n const arch = section(readme, 'Architecture|Approach|How it works|Methodology|How');\n return arch ? sv(arch.body, `README:## ${arch.heading}`, 0.7) : null;\n}\n",
|
|
104
|
+
"import { join } from 'path';\nimport { readRepoDir, readRepoFile, repoExists } from '../core/safe-write.js';\nimport spec from './dart-detection.json';\n\n/**\n * Dart/Flutter detection — CONTENT-AWARE pubspec classification.\n *\n * A pubspec.yaml alone does NOT mean Flutter. The same manifest backs Flutter\n * apps, pure-Dart CLIs, packages, servers (Dart Frog / Shelf / Serverpod), and\n * MCP servers (dart_mcp / mcp_server). We read the dependencies and branch —\n * collapsing everything to \"Flutter\" is the bug this module fixes.\n *\n * Single source of truth for Dart: imported by both the v6 scanner (app-type +\n * language) and Turbo-Cat (stack fills), so the two engines agree by construction.\n */\n\nexport type DartAppType = 'mobile' | 'mcp' | 'backend' | 'cli' | 'library';\n\nexport interface DartProject {\n /** faf app_type — Flutter→mobile, Dart MCP→mcp, Dart server→backend, CLI→cli, else library. */\n appType: DartAppType;\n isFlutter: boolean;\n /** Primary framework for the stack (Flutter / Dart Frog / Serverpod / Shelf / …) or ''. */\n framework: string;\n /** Flutter state management (Riverpod / Bloc / Provider / GetX / MobX / Signals) or ''. */\n stateManagement: string;\n /** Routing (go_router / auto_route) or ''. */\n routing: string;\n /** Test framework (flutter_test / test) or ''. */\n testing: string;\n /** Human-readable rationale for the .faf `# found:` comment (Glass Hood). */\n found: string;\n}\n\n// Detection KNOWLEDGE is sourced from dart-detection.json — the single,\n// language-neutral spec faf-cli imports and faf-python-sdk vendors (A+B hybrid).\n// Bolster Dart/Flutter by editing that JSON; every engine inherits it.\nconst FLUTTER_DEPS = spec.flutterDeps as string[];\nconst MCP_DEPS = spec.mcpDeps as string[];\nconst SERVER_FRAMEWORKS = spec.serverFrameworks as Array<[string, string]>;\nconst STATE_MGMT = spec.stateManagement as Array<[string, string]>;\nconst ROUTING = spec.routing as Array<[string, string]>;\n\n/** Collect dependency names from a pubspec's dependencies / dev_dependencies sections. */\nfunction pubspecDeps(content: string): Set<string> {\n const deps = new Set<string>();\n let inDeps = false;\n for (const line of content.split('\\n')) {\n if (/^(dependencies|dev_dependencies|dependency_overrides):\\s*$/.test(line)) {\n inDeps = true;\n continue;\n }\n // A new top-level key (no leading whitespace) ends the dependency section.\n if (/^\\S/.test(line)) {inDeps = false;}\n if (inDeps) {\n const m = line.match(/^\\s{2}([a-zA-Z0-9_]+):/);\n if (m) {deps.add(m[1].toLowerCase());}\n }\n }\n return deps;\n}\n\n/** Classify a Dart/Flutter project from its pubspec.yaml. Returns null if not Dart. */\nexport function detectDartProject(dir: string): DartProject | null {\n const content = readRepoFile(dir, 'pubspec.yaml');\n if (content === null) {return null;}\n\n const deps = pubspecDeps(content);\n const has = (d: string) => deps.has(d.toLowerCase());\n\n // Flutter: the `flutter` SDK dep, a top-level `flutter:` section, or `sdk: flutter`.\n const isFlutter = FLUTTER_DEPS.some(has) || /^flutter:\\s*$/m.test(content) || /\\bsdk:\\s*flutter\\b/.test(content);\n\n const mcpDep = MCP_DEPS.find(has);\n const server = SERVER_FRAMEWORKS.find(([d]) => has(d));\n const stateEntry = STATE_MGMT.find(([d]) => has(d));\n const stateManagement = stateEntry ? stateEntry[1] : '';\n const routeEntry = ROUTING.find(([d]) => has(d));\n const routing = routeEntry ? routeEntry[1] : '';\n const testing = has('flutter_test') ? 'flutter_test' : has('test') ? 'test' : '';\n\n // CLI: a top-level `executables:` section, or bin/*.dart entry points.\n const hasExecutables = /^executables:\\s*$/m.test(content);\n const hasBinDart = (readRepoDir(dir, 'bin') ?? []).some(e => e.name.endsWith('.dart'));\n const isCli = hasExecutables || hasBinDart;\n\n let appType: DartAppType;\n let framework = '';\n let found: string;\n\n if (isFlutter) {\n framework = 'Flutter';\n // App vs package: an app has lib/main.dart (the entry) or `publish_to: none`;\n // a reusable Flutter package has neither — it's publishable, lib/ exports only.\n const isApp = repoExists(dir, join('lib', 'main.dart')) || /^publish_to:\\s*['\"]?none\\b/m.test(content);\n if (isApp) {\n appType = 'mobile';\n found = 'pubspec.yaml (Flutter app)';\n } else {\n appType = 'library';\n found = 'pubspec.yaml (Flutter package)';\n }\n } else if (mcpDep) {\n appType = 'mcp';\n found = `pubspec.yaml + ${mcpDep} (Dart MCP server)`;\n } else if (server) {\n appType = 'backend';\n framework = server[1];\n found = `pubspec.yaml + ${server[0]} (Dart backend)`;\n } else if (isCli) {\n appType = 'cli';\n found = hasExecutables ? 'pubspec.yaml executables: (Dart CLI)' : 'pubspec.yaml + bin/*.dart (Dart CLI)';\n } else {\n appType = 'library';\n found = 'pubspec.yaml (Dart package)';\n }\n\n return { appType, isFlutter, framework, stateManagement, routing, testing, found };\n}\n",
|
|
105
|
+
"import { join } from 'path';\nimport { readRepoDir, readRepoFile, statRepoFile } from '../core/safe-write.js';\nimport spec from './go-detection.json';\n\n/**\n * Go detection — CONTENT-AWARE go.mod classification.\n *\n * A go.mod alone does NOT mean \"backend\" or \"CLI\". The same module file backs\n * libraries, HTTP servers (Gin / Echo / Fiber / Chi), CLIs (Cobra), and MCP\n * servers (mcp-go). We read require paths and light layout signals, then branch.\n *\n * Same composition pattern as dart.ts: knowledge in go-detection.json, logic here.\n * Turbo-Cat + scanner both call detectGoProject so they agree by construction.\n */\n\nexport type GoAppType = 'mcp' | 'backend' | 'cli' | 'library';\n\nexport interface GoProject {\n /** faf app_type — MCP→mcp, server→backend, CLI→cli, else library. */\n appType: GoAppType;\n /** Module path from `module` line, or ''. */\n modulePath: string;\n /** Primary framework (Gin / Cobra / …) or ''. */\n framework: string;\n /** Human-readable rationale for the .faf `# found:` comment (Glass Hood). */\n found: string;\n}\n\nconst MCP_MODULES = spec.mcpModules as string[];\nconst SERVER_FRAMEWORKS = spec.serverFrameworks as Array<[string, string]>;\nconst CLI_FRAMEWORKS = spec.cliFrameworks as Array<[string, string]>;\n\n/** Collect require module paths from go.mod (require X and require ( … ) blocks). */\nexport function goModRequires(content: string): Set<string> {\n const reqs = new Set<string>();\n let inBlock = false;\n for (const raw of content.split('\\n')) {\n const line = raw.replace(/\\/\\/.*$/, '').trim();\n if (!line) {continue;}\n if (/^require\\s*\\(\\s*$/.test(line)) {\n inBlock = true;\n continue;\n }\n if (inBlock) {\n if (line === ')') {\n inBlock = false;\n continue;\n }\n const m = line.match(/^(\\S+)/);\n if (m) {reqs.add(m[1].toLowerCase());}\n continue;\n }\n // Single-line: require github.com/foo/bar v1.2.3\n const single = line.match(/^require\\s+(\\S+)/);\n if (single && single[1] !== '(') {reqs.add(single[1].toLowerCase());}\n }\n return reqs;\n}\n\n/** True if any require equals or is a subpath of the module path. */\nfunction hasModule(reqs: Set<string>, mod: string): boolean {\n const m = mod.toLowerCase();\n for (const r of reqs) {\n if (r === m || r.startsWith(`${m}/`)) {return true;}\n }\n return false;\n}\n\n/**\n * Longest knowledge-path match wins (echo/v4 over echo), so found strings cite\n * the most specific module entry and versioned paths don't collapse to the base.\n */\nfunction findLongest(\n reqs: Set<string>,\n entries: Array<[string, string]>,\n): [string, string] | undefined {\n let best: [string, string] | undefined;\n for (const e of entries) {\n if (!hasModule(reqs, e[0])) {continue;}\n if (!best || e[0].length > best[0].length) {best = e;}\n }\n return best;\n}\n\nfunction findLongestPath(reqs: Set<string>, paths: string[]): string | undefined {\n let best: string | undefined;\n for (const p of paths) {\n if (!hasModule(reqs, p)) {continue;}\n if (!best || p.length > best.length) {best = p;}\n }\n return best;\n}\n\nfunction extractModulePath(content: string): string {\n const m = content.match(/^module\\s+(\\S+)/m);\n return m ? m[1] : '';\n}\n\n/** Layout signal: cmd/ with Go files → common CLI / multi-main layout. */\nfunction hasCmdDir(dir: string): boolean {\n for (const { name } of readRepoDir(dir, 'cmd') ?? []) {\n const p = join('cmd', name);\n const st = statRepoFile(dir, p);\n if (st?.isDirectory()) {\n if ((readRepoDir(dir, p) ?? []).some(e => e.name.endsWith('.go'))) {return true;}\n } else if (st && name.endsWith('.go')) {\n return true;\n }\n }\n return false;\n}\n\n/** Root main.go that declares package main. */\nfunction hasRootMainPackage(dir: string): boolean {\n const body = readRepoFile(dir, 'main.go');\n return body !== null && /^package\\s+main\\b/m.test(body);\n}\n\n/** Classify a Go project from go.mod (+ light layout). Returns null if not Go. */\nexport function detectGoProject(dir: string): GoProject | null {\n const content = readRepoFile(dir, 'go.mod');\n if (content === null) {return null;}\n\n const modulePath = extractModulePath(content);\n const reqs = goModRequires(content);\n\n const mcpMod = findLongestPath(reqs, MCP_MODULES);\n const server = findLongest(reqs, SERVER_FRAMEWORKS);\n const cliFw = findLongest(reqs, CLI_FRAMEWORKS);\n const cmdLayout = hasCmdDir(dir);\n const rootMain = hasRootMainPackage(dir);\n\n let appType: GoAppType;\n let framework = '';\n let found: string;\n\n // Priority: MCP → server → CLI (deps or layout) → library.\n // go.mod alone is never \"backend\" — pure library modules stay library.\n if (mcpMod) {\n appType = 'mcp';\n found = `go.mod + ${mcpMod} (Go MCP server)`;\n } else if (server) {\n appType = 'backend';\n framework = server[1];\n found = `go.mod + ${server[0]} (Go backend)`;\n } else if (cliFw) {\n appType = 'cli';\n framework = cliFw[1];\n found = `go.mod + ${cliFw[0]} (Go CLI)`;\n } else if (cmdLayout) {\n appType = 'cli';\n found = 'go.mod + cmd/ (Go CLI layout)';\n } else if (rootMain && !server) {\n // package main at root without a known server framework → treat as CLI/tool.\n // (Servers almost always pull gin/echo/fiber; bare main is often a tool.)\n appType = 'cli';\n found = 'go.mod + main.go package main (Go CLI)';\n } else {\n appType = 'library';\n found = 'go.mod (Go module)';\n }\n\n return { appType, modulePath, framework, found };\n}\n",
|
|
106
|
+
"import { readRepoDir, readRepoFile } from '../core/safe-write.js';\nimport spec from './csharp-detection.json';\n\n/**\n * C# /.NET detection — CONTENT-AWARE .csproj classification.\n *\n * A .csproj alone does NOT mean Web API / ASP.NET. Microsoft encodes kind in\n * Project Sdk, then OutputType / Use* props / PackageReference / FrameworkReference.\n * Kill line: .csproj alone ≠ type.\n *\n * Same composition pattern as go.ts / dart.ts: knowledge in csharp-detection.json,\n * logic here. Turbo-Cat + scanner both call detectCsharpProject so they agree.\n */\n\n/** FAF project types we emit (aligned with Go + mobile for MAUI). */\nexport type CsharpAppType = 'mcp' | 'backend' | 'cli' | 'library' | 'mobile';\n\nexport interface CsharpProject {\n appType: CsharpAppType;\n /** Assembly / project name from filename, or ''. */\n projectName: string;\n /** TargetFramework(s) raw string if present. */\n targetFramework: string;\n /** Sdk attribute (e.g. Microsoft.NET.Sdk.Web). */\n sdk: string;\n /** Primary framework label (ASP.NET Core / Worker / Cobra-equivalent / …). */\n framework: string;\n /** Human-readable rationale for the .faf `# found:` comment (Glass Hood). */\n found: string;\n}\n\nconst MCP_PACKAGES = (spec.mcpPackages as string[]).map(p => p.toLowerCase());\nconst CLI_PACKAGES = (spec.cliPackages as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst TEST_PACKAGES = (spec.testPackages as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst GRPC_SERVER = (spec.grpcServerPackages as string[]).map(p => p.toLowerCase());\nconst SPECIALIZED = spec.specializedSdks as Array<[string, string, string]>;\nconst BASE_SDK = (spec.baseSdk as string).toLowerCase();\n\nexport interface ParsedCsproj {\n sdk: string;\n outputType: string;\n targetFramework: string;\n isTestProject: boolean;\n useMaui: boolean;\n useWpf: boolean;\n useWindowsForms: boolean;\n packages: Set<string>;\n frameworkRefs: Set<string>;\n}\n\n/** Parse the load-bearing fields of an SDK-style .csproj (regex — adequate for detection). */\nexport function parseCsproj(content: string): ParsedCsproj {\n // Sdk=\"Name\" or Sdk=\"Name/1.2.3\"\n const sdkAttr = content.match(/<Project\\b[^>]*\\bSdk\\s*=\\s*\"([^\"/]+)(?:\\/[^\"]*)?\"/i);\n // Additive <Sdk Name=\"...\" />\n const sdkElem = content.match(/<Sdk\\b[^>]*\\bName\\s*=\\s*\"([^\"]+)\"/i);\n const sdk = (sdkAttr?.[1] || sdkElem?.[1] || '').trim();\n\n const outputType = (content.match(/<OutputType>\\s*([^<]+?)\\s*<\\/OutputType>/i)?.[1] || '').trim();\n const tfSingle = content.match(/<TargetFramework>\\s*([^<]+?)\\s*<\\/TargetFramework>/i)?.[1];\n const tfMulti = content.match(/<TargetFrameworks>\\s*([^<]+?)\\s*<\\/TargetFrameworks>/i)?.[1];\n const targetFramework = (tfMulti || tfSingle || '').trim();\n\n const isTestProject = /<IsTestProject>\\s*true\\s*<\\/IsTestProject>/i.test(content);\n const useMaui = /<UseMaui>\\s*true\\s*<\\/UseMaui>/i.test(content);\n const useWpf = /<UseWPF>\\s*true\\s*<\\/UseWPF>/i.test(content);\n const useWindowsForms = /<UseWindowsForms>\\s*true\\s*<\\/UseWindowsForms>/i.test(content);\n\n const packages = new Set<string>();\n for (const m of content.matchAll(/<PackageReference\\b[^>]*\\bInclude\\s*=\\s*\"([^\"]+)\"/gi)) {\n packages.add(m[1].toLowerCase());\n }\n // Versionless CPM still uses Include=\n for (const m of content.matchAll(/<PackageReference\\s+Include\\s*=\\s*\"([^\"]+)\"/gi)) {\n packages.add(m[1].toLowerCase());\n }\n\n const frameworkRefs = new Set<string>();\n for (const m of content.matchAll(/<FrameworkReference\\b[^>]*\\bInclude\\s*=\\s*\"([^\"]+)\"/gi)) {\n frameworkRefs.add(m[1].toLowerCase());\n }\n\n return {\n sdk,\n outputType,\n targetFramework,\n isTestProject,\n useMaui,\n useWpf,\n useWindowsForms,\n packages,\n frameworkRefs,\n };\n}\n\nfunction hasPackage(pkgs: Set<string>, id: string): boolean {\n const n = id.toLowerCase();\n if (pkgs.has(n)) {return true;}\n // Subpath-ish: ModelContextProtocol.AspNetCore when looking for ModelContextProtocol\n for (const p of pkgs) {\n if (p === n || p.startsWith(`${n}.`)) {return true;}\n }\n return false;\n}\n\nfunction findPackageLabel(pkgs: Set<string>, entries: Array<[string, string]>): [string, string] | undefined {\n let best: [string, string] | undefined;\n for (const [id, label] of entries) {\n if (!hasPackage(pkgs, id)) {continue;}\n if (!best || id.length > best[0].length) {best = [id, label];}\n }\n return best;\n}\n\nfunction findMcpPackage(pkgs: Set<string>): string | undefined {\n let best: string | undefined;\n for (const id of MCP_PACKAGES) {\n if (!hasPackage(pkgs, id)) {continue;}\n if (!best || id.length > best.length) {best = id;}\n }\n // Also: any package starting with modelcontextprotocol\n for (const p of pkgs) {\n if (p === 'modelcontextprotocol' || p.startsWith('modelcontextprotocol.')) {\n if (!best || p.length > best.length) {best = p;}\n }\n }\n return best;\n}\n\nfunction matchSpecializedSdk(sdk: string): [string, string, string] | undefined {\n const s = sdk.toLowerCase();\n if (!s) {return undefined;}\n // Longest specialized match (Web before bare if ever needed)\n let best: [string, string, string] | undefined;\n for (const row of SPECIALIZED) {\n const name = row[0].toLowerCase();\n if (s === name || s.startsWith(`${name}/`)) {\n if (!best || name.length > best[0].length) {best = row;}\n }\n }\n return best;\n}\n\nfunction isExe(outputType: string): boolean {\n const o = outputType.toLowerCase();\n return o === 'exe' || o === 'winexe';\n}\n\n/** Priority rank for multi-csproj roots — lower wins. */\nfunction rank(appType: CsharpAppType, framework: string): number {\n if (appType === 'mcp') {return 0;}\n if (appType === 'mobile') {return 1;}\n if (appType === 'backend') {return 2;}\n if (appType === 'cli') {return 3;}\n if (framework && framework !== '') {return 4;} // test-labelled library etc.\n return 5;\n}\n\n/** Classify a single parsed csproj. */\nexport function classifyCsproj(\n parsed: ParsedCsproj,\n projectFileName: string,\n): Omit<CsharpProject, 'projectName'> & { projectName: string } {\n const name = projectFileName.replace(/\\.csproj$/i, '');\n const { sdk, packages, frameworkRefs, outputType } = parsed;\n\n let appType: CsharpAppType;\n let framework = '';\n let found: string;\n\n const mcpPkg = findMcpPackage(packages);\n const specialized = matchSpecializedSdk(sdk);\n const testPkg = findPackageLabel(packages, TEST_PACKAGES);\n const cliPkg = findPackageLabel(packages, CLI_PACKAGES);\n const hasGrpcServer = GRPC_SERVER.some(g => hasPackage(packages, g));\n const hasAspNetRef = frameworkRefs.has('microsoft.aspnetcore.app');\n\n // Priority: MCP → test → maui/desktop → specialized Sdk → AspNet FrameworkRef host → CLI → console Exe → library\n // .csproj alone (base Sdk, no signals) is never web/backend.\n if (mcpPkg) {\n appType = 'mcp';\n framework = 'MCP';\n found = `${projectFileName} + ${mcpPkg} (C# MCP server)`;\n } else if (parsed.isTestProject || specialized?.[1] === 'test' || testPkg) {\n appType = 'library';\n framework = testPkg?.[1] || (specialized?.[1] === 'test' ? specialized[2] : 'Test');\n found = `${projectFileName} + test (${framework})`;\n } else if (parsed.useMaui) {\n appType = 'mobile';\n framework = 'MAUI';\n found = `${projectFileName} + UseMaui (MAUI)`;\n } else if (parsed.useWpf || parsed.useWindowsForms) {\n appType = 'backend'; // desktop host — nearest durable type for agents\n framework = parsed.useWpf && parsed.useWindowsForms\n ? 'WPF+WinForms'\n : parsed.useWpf\n ? 'WPF'\n : 'Windows Forms';\n found = `${projectFileName} + ${framework}`;\n } else if (specialized?.[1] === 'web') {\n appType = 'backend';\n framework = hasGrpcServer ? 'gRPC' : specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]}${hasGrpcServer ? ' + Grpc.AspNetCore' : ''} (ASP.NET Core)`;\n } else if (specialized?.[1] === 'worker') {\n appType = 'backend';\n framework = specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]} (Worker)`;\n } else if (specialized?.[1] === 'blazor-wasm') {\n appType = 'backend';\n framework = specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]} (Blazor WASM)`;\n } else if (specialized?.[1] === 'aspire') {\n appType = 'backend';\n framework = specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]} (Aspire)`;\n } else if (specialized?.[1] === 'razor-lib') {\n appType = 'library';\n framework = specialized[2];\n found = `${projectFileName} + Sdk=${specialized[0]} (Razor class library)`;\n } else if (hasAspNetRef && isExe(outputType)) {\n // Non-Web Sdk host that still pulls ASP.NET shared framework\n appType = 'backend';\n framework = 'ASP.NET Core';\n found = `${projectFileName} + FrameworkReference Microsoft.AspNetCore.App (host)`;\n } else if (hasAspNetRef && !isExe(outputType)) {\n appType = 'library';\n framework = 'ASP.NET Core';\n found = `${projectFileName} + FrameworkReference Microsoft.AspNetCore.App (web library)`;\n } else if (cliPkg && (isExe(outputType) || !outputType)) {\n // CLI packages often on Exe; if OutputType omitted but CLI pkg present, still CLI\n appType = 'cli';\n framework = cliPkg[1];\n found = `${projectFileName} + ${cliPkg[0]} (C# CLI)`;\n } else if (isExe(outputType)) {\n appType = 'cli';\n found = `${projectFileName} + OutputType=Exe (C# console)`;\n } else {\n appType = 'library';\n const sdkNote = sdk ? ` Sdk=${sdk}` : '';\n found = `${projectFileName}${sdkNote} (C# class library)`.replace(' Sdk=Microsoft.NET.Sdk', '');\n if (!sdk || sdk.toLowerCase() === BASE_SDK || sdk.toLowerCase().startsWith(`${BASE_SDK}/`)) {\n found = `${projectFileName} (C# class library)`;\n }\n }\n\n return {\n appType,\n projectName: name,\n targetFramework: parsed.targetFramework,\n sdk: sdk || 'Microsoft.NET.Sdk',\n framework,\n found,\n };\n}\n\n/** List root-level .csproj filenames in a directory. */\nexport function listRootCsprojs(dir: string): string[] {\n return (readRepoDir(dir) ?? []).map(e => e.name).filter(f => f.toLowerCase().endsWith('.csproj')).sort();\n}\n\n/**\n * Classify a C# project directory from root-level .csproj file(s).\n * Multiple projects: pick highest-priority classification (MCP > mobile > backend > cli > library).\n * Returns null if no .csproj at this directory level.\n */\nexport function detectCsharpProject(dir: string): CsharpProject | null {\n const files = listRootCsprojs(dir);\n if (files.length === 0) {return null;}\n\n let best: CsharpProject | null = null;\n let bestRank = 999;\n\n for (const file of files) {\n const content = readRepoFile(dir, file);\n if (content === null) {continue;}\n const parsed = parseCsproj(content);\n const classified = classifyCsproj(parsed, file);\n const r = rank(classified.appType, classified.framework);\n if (!best || r < bestRank) {\n best = classified;\n bestRank = r;\n }\n }\n\n return best;\n}\n",
|
|
107
|
+
"import { join } from 'path';\nimport { readRepoDir, readRepoFile, repoExists, statRepoFile } from '../core/safe-write.js';\nimport spec from './jvm-detection.json';\n\n/**\n * JVM (Java / Kotlin) detection — CONTENT-AWARE pom / gradle classification.\n *\n * Kill line: pom / gradle alone ≠ type.\n * One brand: JVM. Android + KMP are facets, not a second \"Kotlin Edition\".\n *\n * Signal graph: settings → modules → plugins/parents/packaging →\n * version catalogs (libs.versions.toml) → deps/starters.\n *\n * Same composition as go.ts / csharp.ts: knowledge in jvm-detection.json.\n */\n\nexport type JvmAppType = 'mcp' | 'backend' | 'cli' | 'library' | 'mobile';\n\nexport interface JvmProject {\n appType: JvmAppType;\n /** Primary framework label (Spring Boot / Quarkus / …) or ''. */\n framework: string;\n buildTool: 'maven' | 'gradle';\n /** Best-effort language signal for slots. */\n mainLanguage: 'Java' | 'Kotlin' | 'Java/Kotlin';\n /** Facets: android · multiplatform (not product brands). */\n facets: string[];\n /** Glass Hood rationale for .faf `# found:`. */\n found: string;\n}\n\ninterface Catalog {\n plugins: Map<string, string>; // alias → plugin id\n libraries: Map<string, string>; // alias → group:artifact\n}\n\ninterface ModuleSignals {\n path: string;\n plugins: Set<string>;\n artifacts: Set<string>; // group:artifact lowercase\n packaging: string;\n parents: Set<string>; // group:artifact\n hasMainClass: boolean;\n hasApplicationPlugin: boolean;\n sourceHints: Set<string>; // androidMain, commonMain, jvmMain, …\n kotlinSources: boolean;\n javaSources: boolean;\n buildTool: 'maven' | 'gradle';\n}\n\nconst MCP_ARTIFACTS = (spec.mcpArtifacts as string[]).map(a => a.toLowerCase());\nconst WEB_PLUGINS = (spec.webPlugins as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst WEB_PARENTS = (spec.webParents as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst WEB_ARTIFACTS = (spec.webArtifacts as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst ANDROID_PLUGINS = (spec.androidPlugins as string[]).map(p => p.toLowerCase());\nconst KMP_PLUGINS = (spec.kmpPlugins as string[]).map(p => p.toLowerCase());\nconst JVM_KOTLIN_PLUGINS = (spec.jvmKotlinPlugins as string[]).map(p => p.toLowerCase());\nconst CLI_PLUGINS = (spec.cliPlugins as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst CLI_ARTIFACTS = (spec.cliArtifacts as Array<[string, string]>).map(\n ([id, label]) => [id.toLowerCase(), label] as [string, string],\n);\nconst LIBRARY_PLUGINS = (spec.libraryPlugins as string[]).map(p => p.toLowerCase());\n\nconst JVM_ROOT_MARKERS = [\n 'pom.xml',\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n];\n\n/** True if directory looks like a JVM project root (or multi-module root). */\nexport function isJvmRoot(dir: string): boolean {\n return JVM_ROOT_MARKERS.some(f => repoExists(dir, f));\n}\n\n/** Minimal TOML-ish parse for gradle/libs.versions.toml plugins + libraries. */\nexport function parseVersionCatalog(content: string): Catalog {\n const plugins = new Map<string, string>();\n const libraries = new Map<string, string>();\n let section = '';\n\n for (const raw of content.split('\\n')) {\n const line = raw.replace(/#.*$/, '').trim();\n if (!line) {continue;}\n const sec = line.match(/^\\[([^\\]]+)\\]$/);\n if (sec) {\n section = sec[1].trim().toLowerCase();\n continue;\n }\n\n // alias = { id = \"org.springframework.boot\", ... }\n const objId = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*\\{[^}]*\\bid\\s*=\\s*\"([^\"]+)\"/);\n if (objId && (section === 'plugins' || section.endsWith('.plugins'))) {\n plugins.set(objId[1].replace(/-/g, '.').toLowerCase(), objId[2].toLowerCase());\n plugins.set(objId[1].toLowerCase(), objId[2].toLowerCase());\n continue;\n }\n // alias = { module = \"g:a\", ... } or group + name\n const objMod = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*\\{[^}]*\\bmodule\\s*=\\s*\"([^\"]+)\"/);\n if (objMod && (section === 'libraries' || section.endsWith('.libraries'))) {\n const key = objMod[1].toLowerCase();\n libraries.set(key, objMod[2].toLowerCase());\n libraries.set(key.replace(/-/g, '.'), objMod[2].toLowerCase());\n continue;\n }\n const objGroup = line.match(\n /^([A-Za-z0-9_.-]+)\\s*=\\s*\\{[^}]*\\bgroup\\s*=\\s*\"([^\"]+)\"[^}]*\\bname\\s*=\\s*\"([^\"]+)\"/,\n );\n if (objGroup && (section === 'libraries' || section.endsWith('.libraries'))) {\n const ga = `${objGroup[2]}:${objGroup[3]}`.toLowerCase();\n const key = objGroup[1].toLowerCase();\n libraries.set(key, ga);\n libraries.set(key.replace(/-/g, '.'), ga);\n continue;\n }\n // alias = \"g:a:v\" or \"plugin.id:version\"\n const plain = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*\"([^\"]+)\"/);\n if (plain) {\n const key = plain[1].toLowerCase();\n const val = plain[2];\n if (section === 'plugins' || section.endsWith('.plugins')) {\n const id = val.split(':')[0].toLowerCase();\n plugins.set(key, id);\n plugins.set(key.replace(/-/g, '.'), id);\n } else if (section === 'libraries' || section.endsWith('.libraries')) {\n const parts = val.split(':');\n if (parts.length >= 2) {\n const ga = `${parts[0]}:${parts[1]}`.toLowerCase();\n libraries.set(key, ga);\n libraries.set(key.replace(/-/g, '.'), ga);\n }\n }\n }\n }\n return { plugins, libraries };\n}\n\nfunction loadCatalog(root: string): Catalog {\n const body = readRepoFile(root, join('gradle', 'libs.versions.toml'));\n if (!body) {return { plugins: new Map(), libraries: new Map() };}\n return parseVersionCatalog(body);\n}\n\n/** Parse settings.gradle(.kts) include lines → relative module paths. */\nexport function parseSettingsIncludes(content: string): string[] {\n const mods: string[] = [];\n // include(\"app\", \"lib\") or include 'app', 'lib' or include(\":app\")\n for (const m of content.matchAll(/include\\s*\\(\\s*([^)]+)\\)/g)) {\n for (const part of m[1].split(',')) {\n const name = part.replace(/['\":\\s]/g, '').replace(/^:/, '');\n if (name) {mods.push(name.replace(/:/g, '/'));}\n }\n }\n for (const m of content.matchAll(/include\\s+((?:['\"][^'\"]+['\"]\\s*,?\\s*)+)/g)) {\n for (const part of m[1].split(',')) {\n const name = part.replace(/['\":\\s]/g, '').replace(/^:/, '');\n if (name) {mods.push(name.replace(/:/g, '/'));}\n }\n }\n // project(\":app\").projectDir = file(\"applications/app\")\n for (const m of content.matchAll(\n /project\\s*\\(\\s*[\"']:([^\"']+)[\"']\\s*\\)\\s*\\.projectDir\\s*=\\s*file\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g,\n )) {\n mods.push(m[2].replace(/^\\.\\//, ''));\n }\n return [...new Set(mods)];\n}\n\nfunction extractGradlePlugins(content: string, catalog: Catalog): Set<string> {\n const plugins = new Set<string>();\n // id(\"org.springframework.boot\") version \"…\"\n for (const m of content.matchAll(/\\bid\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g)) {\n plugins.add(m[1].toLowerCase());\n }\n // id 'org.springframework.boot'\n for (const m of content.matchAll(/\\bid\\s+['\"]([^'\"]+)['\"]/g)) {\n plugins.add(m[1].toLowerCase());\n }\n // plugins { application · java · `java-library` } bare / backtick ids\n for (const block of content.matchAll(/plugins\\s*\\{([\\s\\S]*?)\\}/g)) {\n for (const raw of block[1].split(/[\\n;]/)) {\n const line = raw.replace(/\\/\\/.*$/, '').trim();\n if (!line || line.startsWith('id') || line.startsWith('kotlin') || line.startsWith('alias')) {\n continue;\n }\n const bare = line.match(/^`([a-zA-Z0-9.-]+)`$/) || line.match(/^([a-zA-Z][a-zA-Z0-9.-]*)$/);\n if (bare) {plugins.add(bare[1].toLowerCase());}\n }\n }\n // kotlin(\"jvm\") / kotlin(\"multiplatform\")\n for (const m of content.matchAll(/\\bkotlin\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g)) {\n const k = m[1].toLowerCase();\n if (k === 'jvm') {plugins.add('org.jetbrains.kotlin.jvm');}\n else if (k === 'multiplatform') {plugins.add('org.jetbrains.kotlin.multiplatform');}\n else if (k === 'android') {plugins.add('org.jetbrains.kotlin.android');}\n else {plugins.add(`org.jetbrains.kotlin.${k}`);}\n }\n // alias(libs.plugins.spring.boot) or libs.plugins.spring.boot\n for (const m of content.matchAll(/libs\\.plugins\\.([A-Za-z0-9_.]+)/g)) {\n const alias = m[1].toLowerCase();\n const resolved =\n catalog.plugins.get(alias) ||\n catalog.plugins.get(alias.replace(/\\./g, '-')) ||\n catalog.plugins.get(alias.replace(/-/g, '.'));\n if (resolved) {plugins.add(resolved);}\n else {\n // Heuristic: spring.boot → often org.springframework.boot\n if (alias.includes('spring') && alias.includes('boot')) {\n plugins.add('org.springframework.boot');\n }\n }\n }\n // apply plugin: 'java'\n for (const m of content.matchAll(/apply\\s+plugin\\s*:\\s*['\"]([^'\"]+)['\"]/g)) {\n plugins.add(m[1].toLowerCase());\n }\n return plugins;\n}\n\nfunction extractGradleArtifacts(content: string, catalog: Catalog): Set<string> {\n const arts = new Set<string>();\n // \"g:a:v\" or 'g:a:v'\n for (const m of content.matchAll(/[\"']([A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)(?::[^\"']+)?[\"']/g)) {\n arts.add(m[1].toLowerCase());\n }\n // libs.spring.boot.starter.web → alias spring-boot-starter-web / spring.boot.starter.web\n for (const m of content.matchAll(/libs\\.([A-Za-z0-9_.]+)/g)) {\n const alias = m[1].toLowerCase();\n if (alias.startsWith('plugins.')) {continue;}\n const keys = [\n alias,\n alias.replace(/\\./g, '-'),\n alias.replace(/-/g, '.'),\n ];\n for (const k of keys) {\n const ga = catalog.libraries.get(k);\n if (ga) {\n arts.add(ga.includes(':') ? ga.split(':').slice(0, 2).join(':') : ga);\n break;\n }\n }\n }\n return arts;\n}\n\nfunction extractMavenSignals(content: string): {\n packaging: string;\n parents: Set<string>;\n artifacts: Set<string>;\n modules: string[];\n} {\n const packaging =\n (content.match(/<packaging>\\s*([^<]+?)\\s*<\\/packaging>/i)?.[1] || 'jar').trim().toLowerCase();\n const parents = new Set<string>();\n const parentBlock = content.match(/<parent>([\\s\\S]*?)<\\/parent>/i);\n if (parentBlock) {\n const g = parentBlock[1].match(/<groupId>\\s*([^<]+?)\\s*<\\/groupId>/i)?.[1]?.trim();\n const a = parentBlock[1].match(/<artifactId>\\s*([^<]+?)\\s*<\\/artifactId>/i)?.[1]?.trim();\n if (g && a) {parents.add(`${g}:${a}`.toLowerCase());}\n }\n const artifacts = new Set<string>();\n for (const m of content.matchAll(/<dependency>([\\s\\S]*?)<\\/dependency>/gi)) {\n const g = m[1].match(/<groupId>\\s*([^<]+?)\\s*<\\/groupId>/i)?.[1]?.trim();\n const a = m[1].match(/<artifactId>\\s*([^<]+?)\\s*<\\/artifactId>/i)?.[1]?.trim();\n if (g && a) {artifacts.add(`${g}:${a}`.toLowerCase());}\n }\n const modules: string[] = [];\n for (const m of content.matchAll(/<module>\\s*([^<]+?)\\s*<\\/module>/gi)) {\n modules.push(m[1].trim());\n }\n return { packaging, parents, artifacts, modules };\n}\n\nfunction hasPlugin(plugins: Set<string>, id: string): boolean {\n const n = id.toLowerCase();\n if (plugins.has(n)) {return true;}\n for (const p of plugins) {\n if (p === n || p.endsWith(`.${n}`) || p === n.replace(/^org\\.gradle\\./, '')) {return true;}\n }\n return false;\n}\n\nfunction findLabeled(\n set: Set<string>,\n entries: Array<[string, string]>,\n mode: 'plugin' | 'artifact' | 'parent',\n): [string, string] | undefined {\n let best: [string, string] | undefined;\n for (const [id, label] of entries) {\n let hit = false;\n if (mode === 'plugin') {hit = hasPlugin(set, id);}\n else {\n hit = set.has(id) || [...set].some(a => a === id || a.startsWith(`${id}:`) || a.startsWith(`${id}.`));\n // artifact prefix match group:artifact\n if (!hit && mode === 'artifact') {\n hit = [...set].some(a => a === id || a.startsWith(`${id}`));\n }\n }\n if (!hit) {continue;}\n if (!best || id.length > best[0].length) {best = [id, label];}\n }\n return best;\n}\n\nfunction hasMcp(artifacts: Set<string>): string | undefined {\n let best: string | undefined;\n for (const id of MCP_ARTIFACTS) {\n for (const a of artifacts) {\n if (a === id || a.startsWith(`${id}:`) || a.startsWith(id.replace(/:mcp$/, ':'))) {\n if (!best || id.length > best.length) {best = id;}\n }\n // any io.modelcontextprotocol\n if (a.startsWith('io.modelcontextprotocol') || a.includes('spring-ai-starter-mcp') || a.includes('spring-ai-mcp')) {\n if (!best || a.length > best.length) {best = a;}\n }\n }\n }\n return best;\n}\n\n/** Source hints under the module folder `rel` of the project folder `root`. */\nfunction probeSources(root: string, rel: string): { kotlin: boolean; java: boolean; hints: Set<string> } {\n const hints = new Set<string>();\n let kotlin = false;\n let java = false;\n const roots = [\n join(rel, 'src'),\n join(rel, 'src', 'main'),\n ];\n const walk = (p: string, depth: number): void => {\n if (depth > 4) {return;}\n const entries = readRepoDir(root, p);\n if (!entries) {return;}\n for (const { name } of entries) {\n if (name === 'androidMain' || name === 'commonMain' || name === 'jvmMain' || name === 'iosMain') {\n hints.add(name);\n }\n const full = join(p, name);\n const st = statRepoFile(root, full);\n if (!st) {continue;}\n if (st.isDirectory()) {walk(full, depth + 1);}\n else if (name.endsWith('.kt') || name.endsWith('.kts')) {kotlin = true;}\n else if (name.endsWith('.java')) {java = true;}\n }\n };\n for (const r of roots) {walk(r, 0);}\n // also check kotlin dsl only at module root as language signal is weak — skip\n return { kotlin, java, hints };\n}\n\nfunction classifyModule(sig: ModuleSignals): Omit<JvmProject, 'buildTool' | 'mainLanguage'> & {\n buildTool: 'maven' | 'gradle';\n mainLanguage: 'Java' | 'Kotlin' | 'Java/Kotlin';\n} {\n const facets: string[] = [];\n const plugins = sig.plugins;\n const arts = sig.artifacts;\n\n const isKmp = KMP_PLUGINS.some(p => hasPlugin(plugins, p)) || sig.sourceHints.has('commonMain');\n const isAndroidApp = hasPlugin(plugins, 'com.android.application');\n const isAndroidLib =\n hasPlugin(plugins, 'com.android.library') ||\n hasPlugin(plugins, 'com.android.kotlin.multiplatform.library');\n if (isAndroidApp || isAndroidLib) {facets.push('android');}\n if (isKmp) {facets.push('multiplatform');}\n\n const mcp = hasMcp(arts);\n const webPlug = findLabeled(plugins, WEB_PLUGINS, 'plugin');\n const webParent = findLabeled(sig.parents, WEB_PARENTS, 'parent');\n const webArt = findLabeled(arts, WEB_ARTIFACTS, 'artifact');\n const cliPlug = findLabeled(plugins, CLI_PLUGINS, 'plugin');\n const cliArt = findLabeled(arts, CLI_ARTIFACTS, 'artifact');\n const isLibPlugin = LIBRARY_PLUGINS.some(p => hasPlugin(plugins, p));\n const isAggregator = sig.packaging === 'pom';\n\n let appType: JvmAppType;\n let framework = '';\n let found: string;\n\n // Priority: KMP facet noted always; Android app → mobile; MCP → mcp; web → backend; CLI → cli; else library\n if (isAndroidApp) {\n appType = 'mobile';\n framework = isKmp ? 'Android+KMP' : 'Android';\n found = `${sig.path || 'root'} + com.android.application (${framework})`;\n } else if (mcp) {\n appType = 'mcp';\n framework = 'MCP';\n facets.push('mcp');\n found = `${sig.path || 'root'} + ${mcp} (JVM MCP server)`;\n } else if (webPlug || webParent || webArt) {\n appType = 'backend';\n framework = webPlug?.[1] || webParent?.[1] || webArt?.[1] || 'JVM';\n const via = webPlug?.[0] || webParent?.[0] || webArt?.[0] || 'web';\n found = `${sig.path || 'root'} + ${via} (JVM backend)`;\n } else if (isKmp && !isAndroidLib) {\n // Shared KMP without android application — library with multiplatform facet\n appType = 'library';\n framework = 'Kotlin Multiplatform';\n found = `${sig.path || 'root'} + kotlin multiplatform (KMP library)`;\n } else if (isAndroidLib) {\n appType = 'library';\n framework = isKmp ? 'Android+KMP' : 'Android';\n found = `${sig.path || 'root'} + android library (${framework})`;\n } else if (cliArt || (sig.hasApplicationPlugin && (sig.hasMainClass || cliPlug)) || (cliPlug && sig.hasMainClass)) {\n appType = 'cli';\n framework = cliArt?.[1] || 'application';\n found = cliArt\n ? `${sig.path || 'root'} + ${cliArt[0]} (JVM CLI)`\n : `${sig.path || 'root'} + application plugin (JVM CLI)`;\n } else if (sig.hasApplicationPlugin && !isLibPlugin) {\n appType = 'cli';\n framework = 'application';\n found = `${sig.path || 'root'} + application plugin (JVM CLI)`;\n } else if (isAggregator) {\n appType = 'library';\n found = `${sig.path || 'root'} + packaging=pom (Maven aggregator/BOM)`;\n } else {\n appType = 'library';\n const lang = sig.kotlinSources && !sig.javaSources ? 'Kotlin' : 'JVM';\n found = `${sig.path || 'root'} (${lang} library)`;\n if (isLibPlugin) {found = `${sig.path || 'root'} + java-library (JVM library)`;}\n }\n\n let mainLanguage: 'Java' | 'Kotlin' | 'Java/Kotlin' = 'Java';\n if (sig.kotlinSources && sig.javaSources) {mainLanguage = 'Java/Kotlin';}\n else if (sig.kotlinSources || JVM_KOTLIN_PLUGINS.some(p => hasPlugin(plugins, p)) || isKmp) {\n mainLanguage = 'Kotlin';\n }\n\n // Dedupe facets\n const uniqFacets = [...new Set(facets)];\n\n return {\n appType,\n framework,\n facets: uniqFacets,\n found,\n buildTool: sig.buildTool,\n mainLanguage,\n };\n}\n\nfunction rank(appType: JvmAppType, facets: string[]): number {\n if (appType === 'mcp') {return 0;}\n if (appType === 'mobile') {return 1;}\n if (facets.includes('multiplatform') && appType === 'backend') {return 2;}\n if (appType === 'backend') {return 3;}\n if (appType === 'cli') {return 4;}\n if (facets.includes('multiplatform')) {return 5;}\n if (facets.includes('android')) {return 6;}\n return 7;\n}\n\nfunction collectGradleModule(root: string, rel: string, catalog: Catalog): ModuleSignals | null {\n const kts = join(rel, 'build.gradle.kts');\n const groovy = join(rel, 'build.gradle');\n const path = repoExists(root, kts) ? kts : repoExists(root, groovy) ? groovy : null;\n if (!path) {return null;}\n const content = readRepoFile(root, path);\n if (!content) {return null;}\n const plugins = extractGradlePlugins(content, catalog);\n const artifacts = extractGradleArtifacts(content, catalog);\n const sources = probeSources(root, rel);\n const hasMainClass =\n /mainClass\\s*[.=]/.test(content) ||\n /mainClassName\\s*=/.test(content) ||\n /Main-Class/.test(content);\n const hasApplicationPlugin =\n hasPlugin(plugins, 'application') ||\n hasPlugin(plugins, 'org.gradle.application');\n\n return {\n path: rel || 'build.gradle',\n plugins,\n artifacts,\n packaging: 'jar',\n parents: new Set(),\n hasMainClass,\n hasApplicationPlugin,\n sourceHints: sources.hints,\n kotlinSources: sources.kotlin || path.endsWith('.kts'),\n javaSources: sources.java,\n buildTool: 'gradle',\n };\n}\n\nfunction collectMavenModule(root: string, rel: string): ModuleSignals | null {\n const content = readRepoFile(root, join(rel, 'pom.xml'));\n if (!content) {return null;}\n const { packaging, parents, artifacts } = extractMavenSignals(content);\n const sources = probeSources(root, rel);\n return {\n path: rel ? `${rel}/pom.xml` : 'pom.xml',\n plugins: new Set(),\n artifacts,\n packaging,\n parents,\n hasMainClass: /<mainClass>/.test(content),\n hasApplicationPlugin: false,\n sourceHints: sources.hints,\n kotlinSources: sources.kotlin,\n javaSources: sources.java,\n buildTool: 'maven',\n };\n}\n\n/**\n * Classify a JVM project directory (Maven and/or Gradle, multi-module aware).\n * Returns null if no JVM markers at this directory.\n */\nexport function detectJvmProject(dir: string): JvmProject | null {\n if (!isJvmRoot(dir)) {return null;}\n\n const catalog = loadCatalog(dir);\n const modules: ModuleSignals[] = [];\n\n // Gradle settings → includes\n let settingsBody: string | null = null;\n for (const s of ['settings.gradle.kts', 'settings.gradle']) {\n if (repoExists(dir, s)) {\n settingsBody = readRepoFile(dir, s);\n break;\n }\n }\n const includes = settingsBody ? parseSettingsIncludes(settingsBody) : [];\n\n // Root gradle module\n const rootGradle = collectGradleModule(dir, '', catalog);\n if (rootGradle) {modules.push(rootGradle);}\n\n for (const inc of includes) {\n const m = collectGradleModule(dir, inc, catalog);\n if (m) {modules.push(m);}\n }\n\n // Maven root + modules\n const rootPom = collectMavenModule(dir, '');\n if (rootPom) {\n modules.push(rootPom);\n const pomContent = readRepoFile(dir, 'pom.xml');\n if (pomContent) {\n const { modules: mavMods } = extractMavenSignals(pomContent);\n for (const mm of mavMods) {\n const m = collectMavenModule(dir, mm);\n if (m) {modules.push(m);}\n }\n }\n }\n\n // Settings-only / empty root: still JVM if settings exist\n if (modules.length === 0 && settingsBody) {\n return {\n appType: 'library',\n framework: '',\n buildTool: 'gradle',\n mainLanguage: 'Java/Kotlin',\n facets: [],\n found: 'settings.gradle (Gradle multi-project root)',\n };\n }\n\n if (modules.length === 0) {return null;}\n\n let best: JvmProject | null = null;\n let bestRank = 999;\n for (const mod of modules) {\n const c = classifyModule(mod);\n const r = rank(c.appType, c.facets);\n if (!best || r < bestRank) {\n best = {\n appType: c.appType,\n framework: c.framework,\n buildTool: c.buildTool,\n mainLanguage: c.mainLanguage,\n facets: c.facets,\n found: c.found,\n };\n bestRank = r;\n }\n }\n\n // Multi-module: if root is aggregator library but a child is better, we already picked child.\n // Enrich found with multi-module note when includes > 0 and best is not root-only\n if (best && includes.length > 0 && !best.found.includes('multi-project')) {\n // leave found as module-specific signal — Glass Hood prefers the decisive signal\n }\n\n return best;\n}\n",
|
|
108
|
+
"import { join } from 'path';\nimport { readRepoDir, readRepoFile, repoExists, statRepoFile } from '../core/safe-write.js';\nimport spec from './ruby-detection.json';\n\n/**\n * Ruby detection — CONTENT-AWARE Gemfile / gemspec classification.\n *\n * Kill line: Gemfile alone ≠ Rails.\n * Bundler backs libraries, Rails apps, Sinatra/Roda/Grape/Hanami, CLIs, and MCP\n * servers. We read gem names (+ light layout), then branch.\n *\n * Same composition as go.ts / jvm.ts: knowledge in ruby-detection.json.\n */\n\nexport type RubyAppType = 'mcp' | 'backend' | 'cli' | 'library';\n\nexport interface RubyProject {\n appType: RubyAppType;\n /** Primary framework label (Rails / Sinatra / …) or ''. */\n framework: string;\n /** package manager signal */\n packageManager: 'bundler' | 'rubygems';\n /** Glass Hood rationale for .faf `# found:`. */\n found: string;\n}\n\nconst MCP_GEMS = (spec.mcpGems as string[]).map(g => g.toLowerCase());\nconst WEB_GEMS = (spec.webGems as Array<[string, string]>).map(\n ([g, label]) => [g.toLowerCase(), label] as [string, string],\n);\nconst CLI_GEMS = (spec.cliGems as Array<[string, string]>).map(\n ([g, label]) => [g.toLowerCase(), label] as [string, string],\n);\nconst RAILS_LAYOUT = spec.railsLayoutFiles as string[];\n\n/** True if directory looks like a Ruby project root. */\nexport function isRubyRoot(dir: string): boolean {\n return (\n repoExists(dir, 'Gemfile') ||\n repoExists(dir, 'gems.rb') ||\n hasGemspec(dir)\n );\n}\n\nfunction hasGemspec(dir: string): boolean {\n return (readRepoDir(dir) ?? []).some(e => e.name.endsWith('.gemspec'));\n}\n\n/**\n * Extract gem names from a Gemfile / gems.rb (static — does NOT execute Ruby).\n * Handles: gem 'x', gem \"x\", gem :x (rare), gem \"x\", \"1.0\"\n */\nexport function parseGemfileGems(content: string): Set<string> {\n const gems = new Set<string>();\n for (const raw of content.split('\\n')) {\n // Strip comments\n const line = raw.replace(/#.*$/, '').trim();\n if (!line) {continue;}\n // gem 'name' or gem \"name\" optionally followed by comma/version\n const m = line.match(/^\\s*gem\\s+['\"]([^'\"]+)['\"]/i)\n || line.match(/^\\s*gem\\s+:([A-Za-z0-9_.-]+)/i);\n if (m) {gems.add(m[1].toLowerCase());}\n }\n return gems;\n}\n\n/**\n * Extract gem names from Gemfile.lock SPECS sections (static).\n * Lines like \" rails (7.1.0)\" under GEM specs.\n */\nexport function parseGemfileLockGems(content: string): Set<string> {\n const gems = new Set<string>();\n let inSpecs = false;\n for (const raw of content.split('\\n')) {\n const line = raw.replace(/\\r$/, '');\n if (/^\\s*specs:\\s*$/.test(line)) {\n inSpecs = true;\n continue;\n }\n // Leave specs on blank line at column 0 or new top-level section (no indent)\n if (inSpecs) {\n if (/^[A-Z]/.test(line) || line.startsWith('PLATFORMS') || line.startsWith('DEPENDENCIES')\n || line.startsWith('BUNDLED') || line.startsWith('RUBY VERSION') || line.startsWith('CHECKSUMS')) {\n inSpecs = false;\n continue;\n }\n // \" gemname (1.2.3)\" — 4 spaces typical\n const m = line.match(/^\\s{2,}([a-zA-Z0-9_.-]+)\\s*\\(/);\n if (m) {gems.add(m[1].toLowerCase());}\n }\n }\n return gems;\n}\n\n/** Gem names from *.gemspec dependency lines (static). */\nexport function parseGemspecGems(content: string): Set<string> {\n const gems = new Set<string>();\n for (const raw of content.split('\\n')) {\n const line = raw.replace(/#.*$/, '');\n // add_dependency \"x\" / add_runtime_dependency 'x' / add_development_dependency\n const m = line.match(/add_(?:runtime_|development_)?dependency\\s*\\(?\\s*['\"]([^'\"]+)['\"]/i);\n if (m) {gems.add(m[1].toLowerCase());}\n }\n return gems;\n}\n\nfunction collectGems(dir: string): { gems: Set<string>; sources: string[] } {\n const gems = new Set<string>();\n const sources: string[] = [];\n\n for (const name of ['Gemfile', 'gems.rb']) {\n const body = readRepoFile(dir, name);\n if (body) {\n for (const g of parseGemfileGems(body)) {gems.add(g);}\n sources.push(name);\n }\n }\n\n const lock = readRepoFile(dir, 'Gemfile.lock') || readRepoFile(dir, 'gems.locked');\n if (lock) {\n for (const g of parseGemfileLockGems(lock)) {gems.add(g);}\n sources.push('Gemfile.lock');\n }\n\n for (const { name: f } of readRepoDir(dir) ?? []) {\n if (!f.endsWith('.gemspec')) {continue;}\n const body = readRepoFile(dir, f);\n if (body) {\n for (const g of parseGemspecGems(body)) {gems.add(g);}\n sources.push(f);\n }\n }\n\n return { gems, sources };\n}\n\nfunction hasGem(gems: Set<string>, name: string): boolean {\n const n = name.toLowerCase();\n if (gems.has(n)) {return true;}\n // rails engines sometimes appear as path gems still named rails\n return false;\n}\n\nfunction findLabeled(\n gems: Set<string>,\n entries: Array<[string, string]>,\n): [string, string] | undefined {\n let best: [string, string] | undefined;\n for (const [id, label] of entries) {\n if (!hasGem(gems, id)) {continue;}\n // Prefer longer / more specific gem names\n if (!best || id.length > best[0].length) {best = [id, label];}\n }\n return best;\n}\n\nfunction findMcp(gems: Set<string>): string | undefined {\n let best: string | undefined;\n for (const id of MCP_GEMS) {\n if (hasGem(gems, id) && (!best || id.length > best.length)) {best = id;}\n }\n return best;\n}\n\nfunction railsLayoutHit(dir: string): string | undefined {\n for (const rel of RAILS_LAYOUT) {\n if (repoExists(dir, rel)) {return rel;}\n }\n return undefined;\n}\n\n/** True if gemspec or package marks executables / bin tools. */\nfunction hasCliShape(dir: string, gems: Set<string>): { hit: boolean; why: string } {\n const cli = findLabeled(gems, CLI_GEMS);\n if (cli) {return { hit: true, why: cli[0] };}\n\n for (const { name: f } of readRepoDir(dir) ?? []) {\n if (!f.endsWith('.gemspec')) {continue;}\n const body = readRepoFile(dir, f);\n if (body && /executables\\s*=/.test(body) && !/executables\\s*=\\s*\\[\\s*\\]/.test(body)) {\n return { hit: true, why: `${f} executables` };\n }\n }\n\n const binEntries = readRepoDir(dir, 'bin');\n if (binEntries) {\n const bins = binEntries.map(e => e.name).filter(b => {\n if (b === 'setup' || b === 'console' || b === 'rake') {return false;}\n return statRepoFile(dir, join('bin', b))?.isFile() === true;\n });\n // bin/rails alone is Rails, not CLI product\n const nonRails = bins.filter(b => b !== 'rails');\n if (nonRails.length > 0 && !hasGem(gems, 'rails') && !railsLayoutHit(dir)) {\n return { hit: true, why: `bin/${nonRails[0]}` };\n }\n }\n\n return { hit: false, why: '' };\n}\n\n/**\n * Classify a Ruby project from Gemfile / lock / gemspec (+ light layout).\n * Returns null if not a Ruby root.\n */\nexport function detectRubyProject(dir: string): RubyProject | null {\n if (!isRubyRoot(dir)) {return null;}\n\n const { gems, sources } = collectGems(dir);\n const srcLabel = sources[0] || 'Gemfile';\n const packageManager: 'bundler' | 'rubygems' =\n sources.some(s => s === 'Gemfile' || s === 'gems.rb' || s.includes('lock'))\n ? 'bundler'\n : 'rubygems';\n\n const mcp = findMcp(gems);\n const web = findLabeled(gems, WEB_GEMS);\n const railsLayout = railsLayoutHit(dir);\n const hasRailsGem = hasGem(gems, 'rails') || hasGem(gems, 'railties');\n const cliShape = hasCliShape(dir, gems);\n const hasConfigRu = repoExists(dir, 'config.ru');\n\n // Rails is NEVER inferred from Gemfile existence alone.\n // rails gem and/or classic layout required.\n const isRails = hasRailsGem || !!railsLayout;\n\n // Strong web gems (not bare rack without config.ru)\n const strongWeb =\n web &&\n web[1] !== 'Rails' &&\n !(web[0] === 'rack' && !hasConfigRu)\n ? web\n : undefined;\n\n let appType: RubyAppType;\n let framework = '';\n let found: string;\n\n // Priority: MCP → Rails → other web → CLI → library\n // Gemfile alone is never backend.\n if (mcp) {\n appType = 'mcp';\n framework = 'MCP';\n found = `${srcLabel} + gem ${mcp} (Ruby MCP)`;\n } else if (isRails) {\n appType = 'backend';\n framework = 'Rails';\n if (hasRailsGem && railsLayout) {\n found = `${srcLabel} + rails + ${railsLayout} (Rails)`;\n } else if (hasRailsGem) {\n found = `${srcLabel} + gem rails (Rails)`;\n } else {\n found = `${railsLayout} (Rails layout)`;\n }\n } else if (strongWeb) {\n appType = 'backend';\n framework = strongWeb[1];\n found = `${srcLabel} + gem ${strongWeb[0]} (Ruby backend)`;\n } else if (cliShape.hit) {\n appType = 'cli';\n framework = findLabeled(gems, CLI_GEMS)?.[1] || '';\n found = `${srcLabel} + ${cliShape.why} (Ruby CLI)`;\n } else {\n appType = 'library';\n found = `${srcLabel} (Ruby library)`;\n }\n\n return { appType, framework, packageManager, found };\n}\n",
|
|
109
|
+
"import { join } from 'path';\nimport { readRepoDir, readRepoFile, repoExists, statRepoFile } from '../core/safe-write.js';\nimport spec from './swift-detection.json';\n\n/**\n * Swift detection — CONTENT-AWARE Package.swift / Xcode classification.\n *\n * Kill line: Package.swift alone ≠ app.\n * SPM backs libraries, executables (CLI), server apps (Vapor / Hummingbird),\n * MCP servers (official swift-sdk product MCP), and Xcode client apps.\n * Static token scan only — never execute Package.swift / swift build.\n *\n * Same composition as go.ts / ruby.ts: knowledge in swift-detection.json.\n */\n\nexport type SwiftAppType = 'mcp' | 'backend' | 'cli' | 'app' | 'library';\n\nexport interface SwiftProject {\n appType: SwiftAppType;\n /** Primary framework label (Vapor / Hummingbird / MCP / ArgumentParser / …) or ''. */\n framework: string;\n /** spm when Package.swift; xcode when only xcodeproj; both when combined. */\n packageManager: 'spm' | 'xcode' | 'spm+xcode';\n /** Glass Hood rationale for .faf `# found:`. */\n found: string;\n}\n\nconst MCP_URLS = (spec.mcpPackageUrls as string[]).map(u => u.toLowerCase());\nconst MCP_PRODUCTS = (spec.mcpProducts as string[]).map(p => p.toLowerCase());\nconst SERVER_URLS = (spec.serverPackageUrls as Array<[string, string]>).map(\n ([u, label]) => [u.toLowerCase(), label] as [string, string],\n);\nconst SERVER_PRODUCTS = (spec.serverProducts as Array<[string, string]>).map(\n ([p, label]) => [p.toLowerCase(), label] as [string, string],\n);\nconst CLI_URLS = (spec.cliPackageUrls as Array<[string, string]>).map(\n ([u, label]) => [u.toLowerCase(), label] as [string, string],\n);\nconst CLI_PRODUCTS = (spec.cliProducts as Array<[string, string]>).map(\n ([p, label]) => [p.toLowerCase(), label] as [string, string],\n);\nconst APP_PRODUCT_TYPES = spec.appProductTypes as string[];\nconst CLI_PRODUCT_TYPES = spec.cliProductTypes as string[];\nconst VAPOR_LAYOUT = spec.vaporLayoutFiles as string[];\n\nexport interface PackageSwiftSignals {\n packageUrls: string[];\n productNames: string[]; // .product(name: \"X\")\n hasLibraryProduct: boolean;\n hasExecutableProduct: boolean;\n hasPluginProduct: boolean;\n hasExecutableTarget: boolean;\n hasLibraryTarget: boolean;\n}\n\n/** True if directory looks like a Swift project root. */\nexport function isSwiftRoot(dir: string): boolean {\n return repoExists(dir, 'Package.swift') || listXcodeprojs(dir).length > 0;\n}\n\n/** Root-level *.xcodeproj directory names. */\nexport function listXcodeprojs(dir: string): string[] {\n return (readRepoDir(dir) ?? [])\n .map(e => e.name)\n .filter(f => f.endsWith('.xcodeproj') && statRepoFile(dir, f)?.isDirectory() === true);\n}\n\n/**\n * Static scan of Package.swift — does NOT compile or evaluate Swift.\n * Strips line and block comments best-effort before token extraction.\n */\nexport function parsePackageSwift(content: string): PackageSwiftSignals {\n const stripped = stripSwiftComments(content);\n const lower = stripped.toLowerCase();\n\n const packageUrls: string[] = [];\n // .package(url: \"…\") or .package(url: \"…\", from: …)\n const urlRe = /\\.package\\s*\\(\\s*url\\s*:\\s*\"([^\"]+)\"/gi;\n let m: RegExpExecArray | null;\n while ((m = urlRe.exec(stripped)) !== null) {\n packageUrls.push(m[1]);\n }\n // Alternate: .package(url: \"…\") with single quotes (rare)\n const urlRe2 = /\\.package\\s*\\(\\s*url\\s*:\\s*'([^']+)'/gi;\n while ((m = urlRe2.exec(stripped)) !== null) {\n packageUrls.push(m[1]);\n }\n\n const productNames: string[] = [];\n // .product(name: \"Vapor\", package: \"vapor\")\n const prodRe = /\\.product\\s*\\(\\s*name\\s*:\\s*\"([^\"]+)\"/gi;\n while ((m = prodRe.exec(stripped)) !== null) {\n productNames.push(m[1]);\n }\n const prodRe2 = /\\.product\\s*\\(\\s*name\\s*:\\s*'([^']+)'/gi;\n while ((m = prodRe2.exec(stripped)) !== null) {\n productNames.push(m[1]);\n }\n\n // Product kinds in products: [ … ]\n // .library(name: …) .executable(name: …) .plugin(\n const hasLibraryProduct = /\\.library\\s*\\(/.test(lower);\n const hasExecutableProduct = /\\.executable\\s*\\(/.test(lower);\n // Avoid matching .plugin( on targets if we can — products use Product.plugin / .plugin(\n // Both product and target use .plugin( — still a useful signal when no library/exe.\n const hasPluginProduct = /\\.plugin\\s*\\(/.test(lower) && !hasLibraryProduct && !hasExecutableProduct\n ? true\n : /\\bproducts\\s*:\\s*\\[[\\s\\S]*?\\.plugin\\s*\\(/.test(lower);\n\n const hasExecutableTarget = /\\.executabletarget\\s*\\(/.test(lower);\n // Plain .target( — executableTarget/testTarget use different selectors\n const hasLibraryTarget = /\\.target\\s*\\(/.test(lower) && !hasExecutableTarget\n ? true\n : (lower.match(/\\.target\\s*\\(/g) || []).length >\n (lower.match(/\\.executabletarget\\s*\\(/g) || []).length +\n (lower.match(/\\.testtarget\\s*\\(/g) || []).length;\n return {\n packageUrls,\n productNames,\n hasLibraryProduct,\n hasExecutableProduct,\n hasPluginProduct: !!hasPluginProduct,\n hasExecutableTarget,\n hasLibraryTarget,\n };\n}\n\n/** Best-effort strip of line (//) and block comments for static scan. */\nexport function stripSwiftComments(src: string): string {\n let out = '';\n let i = 0;\n while (i < src.length) {\n // string literal — preserve contents so URLs inside stay intact\n if (src[i] === '\"' || src[i] === \"'\") {\n const q = src[i];\n out += q;\n i++;\n while (i < src.length) {\n if (src[i] === '\\\\' && i + 1 < src.length) {\n out += src[i] + src[i + 1];\n i += 2;\n continue;\n }\n out += src[i];\n if (src[i] === q) {\n i++;\n break;\n }\n i++;\n }\n continue;\n }\n if (src[i] === '/' && src[i + 1] === '/') {\n i += 2;\n while (i < src.length && src[i] !== '\\n') {i++;}\n continue;\n }\n if (src[i] === '/' && src[i + 1] === '*') {\n i += 2;\n while (i < src.length && !(src[i] === '*' && src[i + 1] === '/')) {i++;}\n i += 2;\n continue;\n }\n out += src[i];\n i++;\n }\n return out;\n}\n\nfunction urlHits(urls: string[], needles: string[]): string | undefined {\n const lowerUrls = urls.map(u => u.toLowerCase());\n let best: string | undefined;\n for (const n of needles) {\n for (const u of lowerUrls) {\n if (u.includes(n) && (!best || n.length > best.length)) {best = n;}\n }\n }\n return best;\n}\n\nfunction urlHitsLabeled(\n urls: string[],\n entries: Array<[string, string]>,\n): [string, string] | undefined {\n const lowerUrls = urls.map(u => u.toLowerCase());\n let best: [string, string] | undefined;\n for (const [needle, label] of entries) {\n for (const u of lowerUrls) {\n if (u.includes(needle) && (!best || needle.length > best[0].length)) {\n best = [needle, label];\n }\n }\n }\n return best;\n}\n\nfunction productHitsLabeled(\n products: string[],\n entries: Array<[string, string]>,\n): [string, string] | undefined {\n const lower = products.map(p => p.toLowerCase());\n let best: [string, string] | undefined;\n for (const [name, label] of entries) {\n if (lower.includes(name) && (!best || name.length > best[0].length)) {\n best = [name, label];\n }\n }\n return best;\n}\n\nfunction mcpProductHit(products: string[]): boolean {\n const lower = products.map(p => p.toLowerCase());\n return MCP_PRODUCTS.some(p => lower.includes(p));\n}\n\n/**\n * Light pbxproj grep — no AST. Reads project.pbxproj under each .xcodeproj.\n */\nexport function scanXcodeProductTypes(dir: string): {\n hasApplication: boolean;\n hasTool: boolean;\n hit?: string;\n} {\n let hasApplication = false;\n let hasTool = false;\n let hit: string | undefined;\n for (const xp of listXcodeprojs(dir)) {\n const body = readRepoFile(dir, join(xp, 'project.pbxproj'));\n if (!body) {continue;}\n for (const t of APP_PRODUCT_TYPES) {\n if (body.includes(t)) {\n hasApplication = true;\n hit = t;\n }\n }\n for (const t of CLI_PRODUCT_TYPES) {\n if (body.includes(t)) {\n hasTool = true;\n if (!hit) {hit = t;}\n }\n }\n }\n return { hasApplication, hasTool, hit };\n}\n\nfunction vaporLayoutHit(dir: string): string | undefined {\n for (const rel of VAPOR_LAYOUT) {\n if (repoExists(dir, rel)) {return rel;}\n }\n return undefined;\n}\n\n/**\n * Classify a Swift project from Package.swift (+ light Xcode).\n * Returns null if not a Swift root.\n */\nexport function detectSwiftProject(dir: string): SwiftProject | null {\n if (!isSwiftRoot(dir)) {return null;}\n\n const hasPkg = repoExists(dir, 'Package.swift');\n const xcodeprojs = listXcodeprojs(dir);\n const hasXcode = xcodeprojs.length > 0;\n\n let signals: PackageSwiftSignals | null = null;\n if (hasPkg) {\n const body = readRepoFile(dir, 'Package.swift');\n if (body) {signals = parsePackageSwift(body);}\n }\n\n const xcode = hasXcode ? scanXcodeProductTypes(dir) : { hasApplication: false, hasTool: false };\n const layout = vaporLayoutHit(dir);\n\n const urls = signals?.packageUrls ?? [];\n const products = signals?.productNames ?? [];\n\n const mcpUrl = urlHits(urls, MCP_URLS);\n const mcpProd = mcpProductHit(products);\n const serverUrl = urlHitsLabeled(urls, SERVER_URLS);\n const serverProd = productHitsLabeled(products, SERVER_PRODUCTS);\n const cliUrl = urlHitsLabeled(urls, CLI_URLS);\n const cliProd = productHitsLabeled(products, CLI_PRODUCTS);\n\n const isMcp = !!(mcpUrl || mcpProd);\n const isServer = !!(serverUrl || serverProd || layout);\n const isExecutable =\n !!(signals?.hasExecutableProduct || signals?.hasExecutableTarget);\n const isCliStack = !!(cliUrl || cliProd);\n const isApp = xcode.hasApplication;\n\n const packageManager: SwiftProject['packageManager'] =\n hasPkg && hasXcode ? 'spm+xcode' : hasPkg ? 'spm' : 'xcode';\n\n let appType: SwiftAppType;\n let framework = '';\n let found: string;\n\n // Priority: mcp > backend > app > cli > library\n if (isMcp) {\n appType = 'mcp';\n framework = 'MCP';\n if (mcpProd) {\n found = 'Package.swift + product MCP (Swift MCP)';\n } else {\n found = `Package.swift + ${mcpUrl} (Swift MCP)`;\n }\n } else if (isServer) {\n appType = 'backend';\n framework = serverProd?.[1] || serverUrl?.[1] || (layout ? 'Vapor' : '');\n if (serverProd) {\n found = `Package.swift + product ${serverProd[1]} (Swift backend)`;\n } else if (serverUrl) {\n found = `Package.swift + ${serverUrl[1]} (Swift backend)`;\n } else {\n found = `${layout} (Swift backend layout)`;\n }\n } else if (isApp) {\n appType = 'app';\n framework = '';\n found = `${xcodeprojs[0]} + ${xcode.hit || 'application'} (Swift app)`;\n } else if (isCliStack || (isExecutable && !isServer && !isMcp)) {\n appType = 'cli';\n framework = cliProd?.[1] || cliUrl?.[1] || '';\n if (cliProd) {\n found = `Package.swift + product ${cliProd[1]} (Swift CLI)`;\n } else if (cliUrl) {\n found = `Package.swift + ${cliUrl[1]} (Swift CLI)`;\n } else if (signals?.hasExecutableProduct) {\n found = 'Package.swift + .executable product (Swift CLI)';\n } else {\n found = 'Package.swift + .executableTarget (Swift CLI)';\n }\n } else if (xcode.hasTool && !hasPkg) {\n appType = 'cli';\n found = `${xcodeprojs[0]} + tool productType (Swift CLI)`;\n } else if (hasPkg) {\n appType = 'library';\n if (signals?.hasLibraryProduct) {\n found = 'Package.swift + .library product (Swift library)';\n } else {\n found = 'Package.swift (Swift library)';\n }\n } else {\n // xcodeproj without application/tool productType — weak library/app unknown\n appType = 'library';\n found = `${xcodeprojs[0] || 'xcodeproj'} (Swift — no classifying productType)`;\n }\n\n return { appType, framework, packageManager, found };\n}\n",
|
|
110
|
+
"/**\n * Relentless — the 6-W human-context extractor. \"Never gives up on finding\n * context\" (the v5 RelentlessContextExtractor), rewritten v6-native + sync and\n * realigned to FAF's no-guess doctrine: it reads EVERY source (manifest +\n * README, tiered) but FILLS ONLY from sourced evidence. The v5 INFERRED tiers\n * (guess from project name / tech stack) are deliberately dropped —\n * sourced-or-empty; `faf go` is where the human confirms.\n *\n * Pairs with Turbo-Cat: Turbo-Cat fills STACK slots from file formats;\n * Relentless fills the 6 HUMAN-CONTEXT slots (who/what/why/where/when/how) by\n * reading. WHO is the target AUDIENCE (not the package author — a v5 conflation\n * this rewrite corrects).\n */\n\nimport { readRepoFile } from '../core/safe-write.js';\n\ninterface PkgJson {\n description?: string;\n repository?: string | { url?: string };\n homepage?: string;\n scripts?: Record<string, string>;\n keywords?: string[];\n}\n\nexport interface SeededContext {\n who?: string;\n what?: string;\n why?: string;\n where?: string;\n when?: string;\n how?: string;\n}\n\n/**\n * A sourced 6-W value WITH its provenance — where it came from and how much to\n * trust it. The honesty gate: a fill the human can audit before confirming.\n * - `source`: the artifact + locus it was relocated from, e.g.\n * 'package.json:description' or 'README:## Why'. If we can't name a source,\n * we don't emit a value — sourced-or-empty, never invented.\n * - `confidence`: 0..1 by source quality (structured field > named section >\n * heuristic match). A signal for the seeded/confirm UI, not a score.\n */\nexport interface SourcedValue {\n value: string;\n source: string;\n confidence: number;\n}\n\nexport interface SeededContextDetailed {\n who?: SourcedValue;\n what?: SourcedValue;\n why?: SourcedValue;\n where?: SourcedValue;\n when?: SourcedValue;\n how?: SourcedValue;\n}\n\nconst sv = (value: string, source: string, confidence: number): SourcedValue => ({ value, source, confidence });\n\n/**\n * The 6-W extractor WITH provenance — each slot carries {value, source,\n * confidence}. This is the auditable form: the seeded/confirm UI can show the\n * human WHERE a value was relocated from before they accept it.\n */\n/** `toolingRoot`: the repo root's package.json is a tooling shell (polyglot repo\n * — real code is in sibling dirs), so its description/repo/scripts describe the\n * tooling, not the product. Skip package.json-sourced context; README only. */\nexport interface RelentlessOpts { toolingRoot?: boolean }\n\nexport function relentlessContextDetailed(dir: string, opts: RelentlessOpts = {}): SeededContextDetailed {\n const pkg = opts.toolingRoot ? null : readPkg(dir);\n const readme = cleanReadme(dir);\n const out: SeededContextDetailed = {};\n const set = (k: keyof SeededContextDetailed, v: SourcedValue | null): void => {\n if (v) {out[k] = v;}\n };\n\n set('what', extractWhat(pkg, readme));\n set('who', extractWho(readme));\n set('why', extractWhy(readme));\n set('where', extractWhere(pkg, readme));\n set('when', extractWhen(readme));\n set('how', extractHow(pkg, readme));\n\n return out;\n}\n\n/**\n * The bare 6-W extractor — values only, backward-compatible. A pure projection\n * of `relentlessContextDetailed` (single internal source; identical output to\n * the pre-provenance version). Existing consumers (claude-faf-mcp's faf_auto)\n * keep working unchanged; opt into provenance via the Detailed form.\n */\nexport function relentlessContext(dir: string, opts: RelentlessOpts = {}): SeededContext {\n const detailed = relentlessContextDetailed(dir, opts);\n const seed: SeededContext = {};\n (Object.keys(detailed) as (keyof SeededContextDetailed)[]).forEach((k) => {\n const sourced = detailed[k];\n if (sourced) {seed[k] = sourced.value;}\n });\n return seed;\n}\n\nfunction readPkg(dir: string): PkgJson | null {\n const text = readRepoFile(dir, 'package.json');\n if (text === null) {return null;}\n try {\n return JSON.parse(text) as PkgJson;\n } catch {\n return null;\n }\n}\n\n/** README with HTML tags + badge lines stripped (so we don't seed shields.io noise). */\nfunction cleanReadme(dir: string): string {\n const txt = readRepoFile(dir, 'README.md');\n if (txt === null) {return '';}\n return txt\n .replace(/<!--[\\s\\S]*?-->/g, '') // HTML comment blocks (asset notes, TODOs — not prose)\n .split('\\n')\n .filter((l) => !/^\\s*\\[!\\[/.test(l) && !/^\\s*!\\[/.test(l)) // badge lines\n .join('\\n')\n .replace(/<[^>]+>/g, '') // HTML tags\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, '') // inline images/badges\n .trim();\n}\n\nfunction clean(text: string): string {\n return text.replace(/\\s+/g, ' ').replace(/[#*`>]/g, '').trim().slice(0, 280);\n}\n\n/** Share of a string's characters that sit inside markdown/inline links. */\nfunction linkDensity(s: string): number {\n if (!s) {return 0;}\n const linked = (s.match(/\\[[^\\]]*\\]\\([^)]*\\)/g) ?? []).join('').length;\n return linked / s.length;\n}\n\n/** First `## Section` body matching any of the pipe-listed names (min 20 chars).\n * Returns the cleaned body AND the matched heading (for provenance labels).\n * Rejects link-list bodies (nav / roadmap-link rows are not prose). */\nfunction section(readme: string, names: string): { body: string; heading: string } | null {\n const re = new RegExp(`##?\\\\s+(${names})\\\\s*\\\\n+([\\\\s\\\\S]+?)(?:\\\\n\\\\n|\\\\n##?|$)`, 'i');\n const m = readme.match(re);\n if (!m || !m[2] || m[2].trim().length <= 20 || linkDensity(m[2]) > 0.4) {return null;}\n return { body: clean(m[2]), heading: m[1].trim() };\n}\n\n/**\n * True when a README intro paragraph is a callout / nav row / pre-release\n * banner rather than a description. These sit above the real first prose on\n * many repos (future-agi opens with a `> ⚠️ Nightly release…` blockquote) and\n * must not seed `human_context.what`.\n */\nfunction isNonProseIntro(p: string): boolean {\n const t = p.trim();\n // Blockquote callout — GitHub admonitions (> [!NOTE] / > [!WARNING]) included\n if (/^>/.test(t)) {return true;}\n // Pre-release / status banner phrasing\n if (/\\b(nightly (release|build)|pre-?release|work[-\\s]in[-\\s]progress|rough edges|early (access|testing|preview)|use at your own risk|not (yet )?production[-\\s]?ready|expect (rough|breaking)|experimental release)\\b/i.test(t)) {return true;}\n // Nav / link row: 3+ short fragments split on · or |\n const frags = t.split(/[·|]/).map((s) => s.trim()).filter(Boolean);\n if (frags.length >= 3 && frags.every((f) => f.length <= 24)) {return true;}\n return false;\n}\n\n/** First capturing-group match across patterns whose capture meets minLen. */\nfunction firstMatch(text: string, patterns: RegExp[], minLen = 30): string | null {\n for (const re of patterns) {\n const m = text.match(re);\n if (m && m[1] && m[1].trim().length >= minLen) {return clean(m[1]);}\n }\n return null;\n}\n\nfunction extractWhat(pkg: PkgJson | null, readme: string): SourcedValue | null {\n if (pkg?.description && pkg.description.length > 20) {return sv(clean(pkg.description), 'package.json:description', 0.95);}\n const sec = section(readme, 'Purpose|What|About|Overview|Description');\n if (sec) {return sv(sec.body, `README:## ${sec.heading}`, 0.8);}\n const firstReal = readme\n .split(/\\n\\s*\\n/)\n .map((p) => p.replace(/\\s+/g, ' ').trim())\n .find((p) => p.length > 30 && !p.startsWith('#') && !isNonProseIntro(p));\n if (firstReal) {return sv(clean(firstReal), 'README:first-paragraph', 0.5);}\n const fm = firstMatch(readme, [\n /(?:core|main|primary)\\s+(?:problem|challenge)(?:\\s+is)?\\s*:?\\s*([^.\\n]{30,})/i,\n /solves?\\s+(?:the\\s+)?(?:problem\\s+of\\s+)?([^.\\n]{30,})/i,\n ]);\n return fm ? sv(fm, 'README:problem-heuristic', 0.6) : null;\n}\n\nfunction extractWho(readme: string): SourcedValue | null {\n const sec = section(readme, 'Audience|Who|Who is this for|Who it.s for');\n if (sec) {return sv(sec.body, `README:## ${sec.heading}`, 0.8);}\n const fm = firstMatch(\n readme,\n [\n // optional qualifier before the role word, so \"for backend teams\" /\n // \"for indie developers\" match — not just a bare role. Dogfood-caught.\n /\\b(?:designed|built|made)\\s+for\\s+((?:[a-z][a-z-]*\\s+)?(?:developers?|teams?|engineers?|builders?|founders?)[^.\\n]{0,80})/i,\n /\\bfor\\s+((?:[a-z][a-z-]*\\s+)?(?:developers?|teams?|engineers?|builders?|founders?)[^.\\n]{0,80})/i,\n ],\n 8,\n );\n return fm ? sv(fm, 'README:audience-heuristic', 0.6) : null;\n}\n\nfunction extractWhy(readme: string): SourcedValue | null {\n const sec = section(readme, 'Why|Mission|Motivation|Rationale|Vision');\n if (sec) {return sv(sec.body, `README:## ${sec.heading}`, 0.8);}\n // DECLARATIVE only — \"our mission is X\", \"the goal is X\", \"Mission: X\". The\n // bare noun is NOT enough: \"(name + goal + the six Ws)\" must not match (it did,\n // and grabbed the rest of the line — a real bug the provenance dogfood caught).\n const fm = firstMatch(readme, [\n /(?:our\\s+|the\\s+)?(?:mission|purpose|goal)\\s+is\\s+([^.\\n]{30,})/i,\n /\\b(?:mission|purpose|goal)\\s*:\\s*([^.\\n]{30,})/i,\n /(?:built|created|designed)\\s+(?:because|to)\\s+([^.\\n]{30,})/i,\n ]);\n return fm ? sv(fm, 'README:mission-heuristic', 0.6) : null;\n}\n\nfunction extractWhere(pkg: PkgJson | null, readme: string): SourcedValue | null {\n const repo = typeof pkg?.repository === 'string' ? pkg.repository : pkg?.repository?.url;\n if (repo) {return sv(clean(repo.replace(/^git\\+/, '').replace(/\\.git$/, '')), 'package.json:repository', 0.95);}\n if (pkg?.homepage) {return sv(clean(pkg.homepage), 'package.json:homepage', 0.9);}\n const fm = firstMatch(\n readme,\n // {3,80} + minLen 3 so short platform names (\"npm\", \"AWS\") match —\n // \"Published on npm.\" used to slip past the 4-char floor. Dogfood-caught.\n [/\\b(?:deployed|hosted|available|published)\\s+(?:on|at|via)\\s+([^.\\n]{3,80})/i],\n 3,\n );\n return fm ? sv(fm, 'README:deploy-heuristic', 0.6) : null;\n}\n\nfunction extractWhen(readme: string): SourcedValue | null {\n const sec = section(readme, 'Timeline|Status|Release|Roadmap');\n if (sec) {return sv(sec.body, `README:## ${sec.heading}`, 0.8);}\n const fm = firstMatch(\n readme,\n [\n /\\b(production\\s+since\\s+[^.\\n]{4,60})/i,\n /\\b((?:in\\s+)?(?:production|beta|alpha|development)\\s+since\\s+[^.\\n]{4,60})/i,\n /\\bsince\\s+((?:[A-Z][a-z]+\\s+)?\\d{4}[^.\\n]{0,40})/,\n ],\n 4,\n );\n return fm ? sv(fm, 'README:since-heuristic', 0.6) : null;\n}\n\nfunction extractHow(pkg: PkgJson | null, readme: string): SourcedValue | null {\n const scripts = pkg?.scripts ? Object.keys(pkg.scripts) : [];\n const run = ['start', 'dev', 'build'].filter((s) => scripts.includes(s));\n if (run.length) {return sv(clean(run.map((s) => `npm run ${s}`).join(', ')), 'package.json:scripts', 0.9);}\n const usage = section(readme, 'Usage|Getting Started|Install|Installation|Quick Start');\n if (usage) {return sv(usage.body, `README:## ${usage.heading}`, 0.8);}\n const arch = section(readme, 'Architecture|Approach|How it works|Methodology|How');\n return arch ? sv(arch.body, `README:## ${arch.heading}`, 0.7) : null;\n}\n",
|
|
111
111
|
"/**\n * The `.faf` format series a freshly written file is stamped with — the single\n * source of truth for `faf_version`.\n *\n * Everything that authors a new `.faf` (detect, recover, conductor) and the\n * `migrate` target reads it from here, so the version can never drift file-to-\n * file again. (That drift is exactly what left those paths stranded on the old\n * `2.5.0` while the ecosystem moved to the `3.0` series.)\n */\nexport const FAF_VERSION = '3.0';\n",
|
|
112
|
-
"import { existsSync, readFileSync, readdirSync, type Dirent } from 'fs';\nimport { join } from 'path';\nimport type { DetectedFramework, Signal } from '../core/types.js';\nimport { NO_CLASSIFYING_SIGNALS } from '../core/slots.js';\nimport { FRAMEWORKS } from './frameworks.js';\nimport { detectDartProject } from './dart.js';\nimport { detectGoProject } from './go.js';\nimport { detectCsharpProject, listRootCsprojs } from './csharp.js';\nimport { detectJvmProject, isJvmRoot } from './jvm.js';\nimport { detectRubyProject } from './ruby.js';\nimport { detectSwiftProject } from './swift.js';\n\ninterface PackageJson {\n name?: string;\n version?: string;\n description?: string;\n keywords?: string[];\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n type?: string;\n main?: string;\n types?: string;\n exports?: unknown;\n bin?: string | Record<string, string>;\n private?: boolean;\n workspaces?: string[] | { packages?: string[] };\n files?: string[];\n}\n\n/** Read [package].name field from Cargo.toml — naive but adequate. */\nfunction readCargoName(dir: string): string | null {\n const path = join(dir, 'Cargo.toml');\n if (!existsSync(path)) {return null;}\n try {\n const content = readFileSync(path, 'utf-8');\n const m = content.match(/^\\s*\\[package\\][\\s\\S]*?^\\s*name\\s*=\\s*\"([^\"]+)\"/m);\n return m ? m[1] : null;\n } catch {\n return null;\n }\n}\n\n/** True if Cargo.toml declares one or more `[[bin]]` sections — Rust cli marker. */\nfunction hasCargoBin(dir: string): boolean {\n const path = join(dir, 'Cargo.toml');\n if (!existsSync(path)) {return false;}\n try {\n const content = readFileSync(path, 'utf-8');\n return /^\\s*\\[\\[bin\\]\\]/m.test(content);\n } catch {\n return false;\n }\n}\n\n/** Detect SDK signals — keyword-based per the SDK-priority doctrine.\n * Returns the matched evidence string, or null if no SDK signal. */\nfunction detectSdkSignal(dir: string, pkg: PackageJson | null): string | null {\n // pkg.keywords contains 'sdk'\n if (pkg?.keywords?.some(k => /^sdk(?:\\s|-|$)|-sdk$/i.test(k))) {\n return 'package.json keywords contains \"sdk\"';\n }\n // pkg.name contains 'sdk' or '-sdk' suffix\n if (pkg?.name && /(?:^|[-_/])sdk(?:[-_/]|$)/i.test(pkg.name)) {\n return `package.json name \"${pkg.name}\" → sdk`;\n }\n // Cargo.toml [package].name contains 'sdk'\n const cargoName = readCargoName(dir);\n if (cargoName && /(?:^|[-_])sdk(?:[-_]|$)/i.test(cargoName)) {\n return `Cargo.toml name \"${cargoName}\" → sdk`;\n }\n return null;\n}\n\n/** Browser / Chrome extension signal — a manifest.json that declares\n * `manifest_version` (the defining MV2/MV3 trait, absent from PWA web-app\n * manifests). Checked at the repo root and common source/build locations,\n * since extensions often keep the manifest under public/ or src/. */\nfunction detectExtensionSignal(dir: string): string | null {\n const candidates = [\n 'manifest.json',\n 'public/manifest.json',\n 'src/manifest.json',\n 'app/manifest.json',\n 'extension/manifest.json',\n 'dist/manifest.json',\n ];\n for (const rel of candidates) {\n const path = join(dir, rel);\n if (!existsSync(path)) {continue;}\n try {\n const parsed = JSON.parse(readFileSync(path, 'utf-8')) as { manifest_version?: unknown };\n if (typeof parsed.manifest_version === 'number') {\n return `${rel} manifest_version ${parsed.manifest_version} (browser extension)`;\n }\n } catch { /* not valid JSON / unreadable — keep scanning */ }\n }\n return null;\n}\n\n/** Python data-science dependency detection (pyproject.toml + requirements.txt). */\nfunction detectDataScienceSignal(dir: string): string | null {\n const dsPatterns = /(numpy|pandas|jupyter|scikit-learn|sklearn|pytorch|tensorflow|matplotlib|scipy)/i;\n const pyproject = join(dir, 'pyproject.toml');\n if (existsSync(pyproject)) {\n try {\n const content = readFileSync(pyproject, 'utf-8');\n const match = content.match(dsPatterns);\n if (match) {return `pyproject.toml depends on ${match[1]}`;}\n } catch { /* fall through */ }\n }\n const reqs = join(dir, 'requirements.txt');\n if (existsSync(reqs)) {\n try {\n const content = readFileSync(reqs, 'utf-8');\n const match = content.match(dsPatterns);\n if (match) {return `requirements.txt contains ${match[1]}`;}\n } catch { /* fall through */ }\n }\n return null;\n}\n\n/** Mobile platform signal — JS mobile (React Native / Expo / Capacitor / Ionic)\n * + native ios/android dirs. Flutter/Dart is handled by detectDartProject. */\nfunction detectMobileSignal(dir: string, pkg: PackageJson | null): string | null {\n const mobileDeps = ['react-native', 'expo', '@capacitor/core', '@ionic/core'];\n if (pkg) {\n for (const dep of mobileDeps) {\n if (pkg.dependencies?.[dep] || pkg.devDependencies?.[dep]) {\n return `${dep} dependency`;\n }\n }\n }\n if (existsSync(join(dir, 'ios')) && existsSync(join(dir, 'android'))) {\n return 'ios/ + android/ dirs';\n }\n return null;\n}\n\n/** WASM target detection (Cargo cdylib + wasm32 OR build.zig wasm OR pkg WASM build scripts). */\nfunction detectWasmSignal(dir: string, pkg: PackageJson | null): string | null {\n const cargoPath = join(dir, 'Cargo.toml');\n if (existsSync(cargoPath)) {\n try {\n const content = readFileSync(cargoPath, 'utf-8');\n // crate-type = [\"cdylib\"] is the canonical wasm-output marker\n if (/crate-type\\s*=\\s*\\[[^\\]]*\"cdylib\"/.test(content)) {\n return 'Cargo.toml crate-type = [\"cdylib\"]';\n }\n // wasm-bindgen / wasm-pack as deps\n if (/wasm-bindgen|wasm-pack/i.test(content)) {\n return 'Cargo.toml wasm-bindgen/wasm-pack';\n }\n } catch { /* fall through */ }\n }\n // Zig WASM target — build.zig with .wasm or wasm in script\n const buildZig = join(dir, 'build.zig');\n if (existsSync(buildZig)) {\n try {\n const content = readFileSync(buildZig, 'utf-8');\n if (/\\.wasm\\b|wasm32|setOutputFormat\\(\\.wasm/i.test(content)) {\n return 'build.zig wasm target';\n }\n } catch { /* fall through */ }\n }\n // pkg keywords contains 'wasm' AND no app frameworks\n if (pkg?.keywords?.some(k => /^wasm(?:-|$)|webassembly/i.test(k))) {\n return 'package.json keywords contains \"wasm\"';\n }\n return null;\n}\n\n/** Bare HTML / vanilla site detection. */\nfunction detectHtmlSignal(dir: string, pkg: PackageJson | null): string | null {\n // Must have index.html at root\n if (!existsSync(join(dir, 'index.html'))) {return null;}\n // Must NOT have any frontend deps (those would classify as frontend/website/etc)\n if (pkg?.dependencies || pkg?.devDependencies) {\n const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const frontendDeps = ['react', 'vue', 'svelte', '@sveltejs/kit', 'next', 'nuxt', 'astro', 'gatsby', 'solid-js', 'qwik'];\n if (frontendDeps.some(d => allDeps[d])) {return null;}\n }\n return 'index.html (vanilla, no frontend framework)';\n}\n\n/** Documentation / spec-only repo signal. */\nfunction detectDocumentationSignal(dir: string, pkg: PackageJson | null): string | null {\n // Strong signal: name or keywords contains 'specification'\n if (pkg?.name && /specification|^@.*\\/spec/i.test(pkg.name)) {\n return `package name \"${pkg.name}\" → documentation`;\n }\n if (pkg?.keywords?.some(k => /^(specification|format-spec|standard)$/i.test(k))) {\n return 'package keywords contains \"specification\"';\n }\n // A publishable CLI/bin package is never \"docs-only\" — even if `files` is\n // npm-publish-narrow (e.g. [\"dist\", \"README.md\"]). Bare `dist`/`src`/`bin`\n // without a trailing slash is still source, not documentation.\n // (agents-md-facts false positive: bin present + files:[\"dist\",\"README.md\",\"LICENSE\"]\n // classified as documentation before the cli check could run.)\n if (pkg?.bin) {\n return null;\n }\n // pkg.files contains only md / examples / assets (no dist/, no src/)\n if (pkg?.files && pkg.files.length > 0) {\n // Match \"dist\", \"dist/\", \"src/cli.ts\", \"*.js\", etc. — bare publish dirs count as source\n const sourcePatterns =\n /^(dist|src|lib|build|bin)(\\/|$)|\\/(dist|src|lib|build|bin)(\\/|$)|(\\.|\\/)(js|ts|tsx|jsx|mjs|cjs|py|rs|go)$/;\n const hasSource = pkg.files.some(f => sourcePatterns.test(f));\n const hasDocs = pkg.files.some(f => /\\.(md|MD)$|examples?\\//.test(f) || f === 'README.md' || f === 'docs' || f === 'docs/');\n if (!hasSource && hasDocs) {\n return 'package.json files = docs/examples only (no source)';\n }\n }\n return null;\n}\n\n/** Marketing / website signal — Astro/Gatsby static OR pkg keywords. */\nfunction detectWebsiteSignal(dir: string, pkg: PackageJson | null, frameworks: DetectedFramework[]): string | null {\n // Astro/Gatsby are typically used for content/marketing sites\n const astroOrGatsby = frameworks.find(f => f.slug === 'astro' || f.slug === 'gatsby');\n if (astroOrGatsby) {return `${astroOrGatsby.name} (static-site framework)`;}\n // pkg.keywords explicitly marketing\n if (pkg?.keywords?.some(k => /^(website|marketing|landing|brochure|portfolio)$/i.test(k))) {\n return 'package keywords contains \"website\"/\"marketing\"/\"landing\"';\n }\n return null;\n}\n\n/** SAAS shape — auth + payments + database + dashboard. */\nfunction detectSaasSignal(dir: string, pkg: PackageJson | null): string | null {\n if (!pkg) {return null;}\n const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const authDeps = ['@clerk/nextjs', '@clerk/clerk-react', 'next-auth', '@auth/core', 'auth0', '@auth0/nextjs-auth0'];\n const paymentDeps = ['stripe', '@stripe/stripe-js', 'lemonsqueezy'];\n const hasAuth = authDeps.some(d => allDeps[d]);\n const hasPayment = paymentDeps.some(d => allDeps[d]);\n if (hasAuth && hasPayment) {\n return 'auth + payment dependencies';\n }\n return null;\n}\n\n/** MCPaaS (post-MCP platform) shape — multiple MCP signals + hosting + DB. */\nfunction detectMcpaasSignal(dir: string, pkg: PackageJson | null, frameworks: DetectedFramework[]): string | null {\n // pkg.keywords contains 'mcpaas' is the strongest signal\n if (pkg?.keywords?.some(k => /mcpaas/i.test(k))) {\n return 'package keywords contains \"mcpaas\"';\n }\n // pkg.name contains 'mcpaas'\n if (pkg?.name && /mcpaas/i.test(pkg.name)) {\n return `package name \"${pkg.name}\" → mcpaas`;\n }\n // Multi-signal: MCP framework + database + hosting (a platform, not a single server)\n const hasMcp = frameworks.some(f => f.slug === 'mcp');\n const hasDb = frameworks.some(f => f.category === 'database');\n if (hasMcp && hasDb && pkg?.dependencies && Object.keys(pkg.dependencies).length > 10) {\n return 'MCP + database + complex deps (platform shape)';\n }\n return null;\n}\n\n/** Monorepo-root — private workspace with multiple packages, no single dominant FW. */\nfunction detectMonorepoRootSignal(dir: string, pkg: PackageJson | null): string | null {\n if (!pkg?.private) {return null;}\n const hasWorkspaces = !!pkg.workspaces || existsSync(join(dir, 'pnpm-workspace.yaml'));\n if (!hasWorkspaces) {return null;}\n return 'private workspace + multi-package';\n}\n\n/** Top-level dirs that never hold an app component. */\nconst SUBDIR_IGNORE = new Set([\n 'node_modules', 'dist', 'build', 'out', 'vendor', 'target', 'coverage',\n 'docs', 'doc', 'e2e', 'tests', 'test', '__tests__', 'scripts', 'deploy',\n 'bin', 'public', 'examples', 'example', 'fixtures', 'assets', 'static',\n 'migrations', 'config', 'contracts', 'proto', 'protos',\n]);\n\nconst BACKEND_LANG_RE = /^(Python|Go|Rust|Ruby|Java|Kotlin)$/;\n\n/** One app component discovered directly under the repo root. */\nexport interface SubdirStack {\n /** basename */\n name: string;\n /** detectLanguage() of the subdir */\n language: string;\n /** highest-confidence real-stack framework in the subdir (never Docker/CI/etc.) */\n topFramework: string | null;\n frontend: boolean;\n backend: boolean;\n /** a real-stack framework (not infra) was detected — ranks it as the \"primary\" */\n hasFramework: boolean;\n /** a \"this dir IS the app\" marker (manage.py / config.ru / bin/rails) */\n appRoot: boolean;\n}\n\n/** Framework categories that describe the app's own stack (not infra/tooling). */\nconst STACK_FW_CATEGORIES = new Set(['frontend', 'backend', 'database', 'css', 'ui', 'state']);\n\n/** A directory carries a real language manifest (not just tooling/config). */\nfunction hasLanguageManifest(d: string): boolean {\n if (\n existsSync(join(d, 'pyproject.toml')) || existsSync(join(d, 'manage.py')) ||\n existsSync(join(d, 'setup.py')) || fileExists(d, 'requirements*.txt')\n ) {return true;}\n if (existsSync(join(d, 'go.mod'))) {return true;}\n if (existsSync(join(d, 'Cargo.toml'))) {return true;}\n if (existsSync(join(d, 'Gemfile'))) {return true;}\n if (existsSync(join(d, 'pom.xml')) || fileExists(d, 'build.gradle*')) {return true;}\n if (listRootCsprojs(d).length > 0) {return true;}\n const pkg = readPackageJson(d);\n if (pkg && Object.keys(pkg.dependencies ?? {}).length > 0) {return true;}\n return false;\n}\n\n/** Shallow (depth-1) scan for per-subdirectory app stacks. Feeds the polyglot\n * classifier + `main_language` aggregation. A dir counts only when it carries a\n * real language manifest. This is NOT monorepo tooling — it only exists to stop\n * a repo whose real stack lives in subdirs from falling to the `library` lie. */\nexport function detectSubdirStacks(dir: string): SubdirStack[] {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n const out: SubdirStack[] = [];\n for (const e of entries) {\n if (!e.isDirectory() || e.name.startsWith('.') || SUBDIR_IGNORE.has(e.name)) {continue;}\n const sub = join(dir, e.name);\n if (!hasLanguageManifest(sub)) {continue;}\n const language = detectLanguage(sub);\n if (!language) {continue;}\n const fws = detectFrameworks(sub).filter(f => STACK_FW_CATEGORIES.has(f.category));\n const fe = fws.find(f => f.category === 'frontend');\n const be = fws.find(f => f.category === 'backend');\n const top = fe ?? be ?? fws[0] ?? null;\n out.push({\n name: e.name,\n language,\n topFramework: top?.name ?? null,\n frontend: !!fe,\n backend: !!be || BACKEND_LANG_RE.test(language),\n hasFramework: !!top,\n appRoot:\n existsSync(join(sub, 'manage.py')) ||\n existsSync(join(sub, 'config.ru')) ||\n existsSync(join(sub, 'bin/rails')) ||\n existsSync(join(sub, 'artisan')),\n });\n }\n return out;\n}\n\n/** Polyglot signal — ≥2 sibling app dirs, ≥2 distinct languages, a frontend AND\n * a backend among them. Returns the `# found:` evidence string, or null. */\nexport function detectPolyglotSignal(dir: string, pkg: PackageJson | null): string | null {\n if (pkg?.workspaces || existsSync(join(dir, 'pnpm-workspace.yaml'))) {return null;}\n const subs = detectSubdirStacks(dir);\n const langs = new Set(subs.map(s => s.language));\n if (subs.length < 2 || langs.size < 2) {return null;}\n if (!subs.some(s => s.frontend) || !subs.some(s => s.backend)) {return null;}\n return `polyglot: ${subs.map(s => `${s.name}/ (${s.language})`).join(', ')}`;\n}\n\n/** Aggregate the polyglot `main_language` string — primary first (a framework-\n * bearing backend dir wins), deduped by language, roles annotated.\n * e.g. \"Python (Django · backend); JavaScript (React · frontend); Go (service)\" */\nexport function detectPolyglotLanguage(dir: string): string | null {\n const subs = detectSubdirStacks(dir);\n if (subs.length < 2) {return null;}\n const score = (s: SubdirStack): number =>\n (s.appRoot ? 2 : 0) +\n (BACKEND_LANG_RE.test(s.language) ? 2 : 0) +\n (s.hasFramework ? 1 : 0) +\n (s.frontend ? 0.5 : 0);\n const ranked = [...subs].sort((a, b) => score(b) - score(a));\n const seen = new Set<string>();\n const parts: string[] = [];\n for (const s of ranked) {\n if (seen.has(s.language)) {continue;}\n seen.add(s.language);\n const role = s.frontend ? 'frontend' : s.backend ? 'backend' : 'service';\n parts.push(s.topFramework ? `${s.language} (${s.topFramework} · ${role})` : `${s.language} (${role})`);\n }\n return parts.join('; ');\n}\n\n/** Read and parse package.json from a directory */\nexport function readPackageJson(dir: string): PackageJson | null {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {return null;}\n try {\n return JSON.parse(readFileSync(pkgPath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/** Scan a directory for files matching patterns */\nfunction fileExists(dir: string, pattern: string): boolean {\n // Handle simple file checks\n if (!pattern.includes('*')) {\n return existsSync(join(dir, pattern));\n }\n\n // Handle glob patterns like \"next.config.*\" or \".github/workflows/*.yml\"\n const parts = pattern.split('/');\n if (parts.length === 1) {\n // Simple wildcard: \"next.config.*\"\n const prefix = pattern.split('*')[0];\n try {\n return readdirSync(dir).some(f => f.startsWith(prefix));\n } catch {\n return false;\n }\n }\n\n // Multi-level: \".github/workflows/*.yml\"\n const subdir = join(dir, ...parts.slice(0, -1));\n const filePattern = parts[parts.length - 1];\n const prefix = filePattern.split('*')[0];\n const suffix = filePattern.split('*')[1] || '';\n try {\n return readdirSync(subdir).some(f => f.startsWith(prefix) && f.endsWith(suffix));\n } catch {\n return false;\n }\n}\n\n/** Match a single signal against project data */\nfunction matchSignal(signal: Signal, pkg: PackageJson | null, dir: string): boolean {\n switch (signal.type) {\n case 'dependency':\n return !!(pkg?.dependencies?.[signal.key!]);\n case 'devDependency':\n return !!(pkg?.devDependencies?.[signal.key!]);\n case 'file':\n return fileExists(dir, signal.pattern!);\n case 'content': {\n // File must exist AND contain key (case-insensitive). Used so pom/gradle\n // alone never claim Spring Boot — JVM Edition kill line for tech_stack.\n if (!signal.pattern || !signal.key) {return false;}\n if (!fileExists(dir, signal.pattern)) {return false;}\n try {\n // Resolve first match for globs like next.config.* via existing helper path\n const path = join(dir, signal.pattern);\n if (!existsSync(path)) {\n // pattern may be a simple relative path that fileExists handled via glob\n return false;\n }\n const body = readFileSync(path, 'utf-8').toLowerCase();\n return body.includes(signal.key.toLowerCase());\n } catch {\n return false;\n }\n }\n default:\n return false;\n }\n}\n\n/** Detect frameworks in a directory */\nexport function detectFrameworks(dir: string): DetectedFramework[] {\n const pkg = readPackageJson(dir);\n\n return FRAMEWORKS\n .map(fw => {\n const matched = fw.signals.filter(s => matchSignal(s, pkg, dir));\n const confidence = matched.length / fw.signals.length;\n return { name: fw.name, slug: fw.slug, category: fw.category, confidence };\n })\n .filter(fw => fw.confidence > 0)\n .sort((a, b) => b.confidence - a.confidence);\n}\n\n/** Detect the primary language of a project from its manifests — `''` when\n * there is no evidence. */\nexport function detectLanguage(dir: string): string {\n const pkg = readPackageJson(dir);\n\n // Check for TypeScript\n if (pkg?.devDependencies?.typescript || pkg?.dependencies?.typescript) {return 'TypeScript';}\n if (existsSync(join(dir, 'tsconfig.json'))) {return 'TypeScript';}\n\n // Check for common language indicators\n if (existsSync(join(dir, 'Cargo.toml'))) {return 'Rust';}\n if (existsSync(join(dir, 'go.mod'))) {return 'Go';}\n if (listRootCsprojs(dir).length > 0) {return 'C#';}\n if (existsSync(join(dir, 'pyproject.toml')) || existsSync(join(dir, 'setup.py'))) {return 'Python';}\n if (existsSync(join(dir, 'Gemfile'))) {return 'Ruby';}\n if (isJvmRoot(dir)) {\n const jvm = detectJvmProject(dir);\n if (jvm) {return jvm.mainLanguage === 'Java/Kotlin' ? 'Kotlin' : jvm.mainLanguage;}\n return 'Java';\n }\n if (existsSync(join(dir, 'Package.swift'))) {return 'Swift';}\n if (existsSync(join(dir, 'build.zig'))) {return 'Zig';}\n if (existsSync(join(dir, 'pubspec.yaml'))) {return 'Dart';}\n\n // A package.json with none of the manifests above: JavaScript\n if (pkg) {return 'JavaScript';}\n\n // No evidence: nothing (never a placeholder word for project.faf)\n return '';\n}\n\n/** Project-type detection result + rationale (the #found list).\n * Each `found` entry is a human-readable signal that contributed to the\n * classification — emitted as a YAML comment by `writeFaf` for transparency\n * (\"Glass Hood\" doctrine: the user sees WHY the cli classified as it did). */\nexport interface ProjectTypeDetection {\n type: string;\n /** Signals that matched, in order observed. */\n found: string[];\n}\n\n/** Detect the project type with rationale. The `found` list captures every\n * positive signal that contributed to the classification — used downstream\n * by `writeFaf` to render `# found: <list>` next to `type:` in the .faf.\n *\n * Priority order per v6.6.md doctrine (most-specific first). About is a\n * repo role (`about.represents`), not an app_type — never matches here.\n * Rule: SDK keyword takes priority (sdk wins over library/cli/wasm). */\nexport function detectProjectTypeWithRationale(dir: string): ProjectTypeDetection {\n const pkg = readPackageJson(dir);\n const frameworks = detectFrameworks(dir);\n const found: string[] = [];\n\n // ─── 1. documentation — spec-only / docs-only repos ─────────────────────\n const docSignal = detectDocumentationSignal(dir, pkg);\n if (docSignal) {\n found.push(docSignal);\n return { type: 'documentation', found };\n }\n\n // ─── 2. sdk — SDK keyword/structure WINS over mcpaas/saas/wasm/cli/library ─\n // wolfejam doctrine: if a repo signals SDK (name contains \"-sdk\", keywords\n // contains \"sdk\"), it's an SDK regardless of what platform/wasm/cli signals\n // would also fire. Confirmed for mcpaas-sdk (SDK FOR the platform, not the\n // platform itself).\n const sdkSignal = detectSdkSignal(dir, pkg);\n if (sdkSignal) {\n found.push(sdkSignal);\n return { type: 'sdk', found };\n }\n\n // ─── 3. extension — browser/chrome extension (manifest_version) ─────────\n // manifest_version is the unambiguous MV2/MV3 trait — must beat the framework\n // heuristics below (a framework-built extension would otherwise classify as\n // svelte/frontend/fullstack — confirmed on Stack⚡️Grabber).\n const extensionSignal = detectExtensionSignal(dir);\n if (extensionSignal) {\n found.push(extensionSignal);\n return { type: 'extension', found };\n }\n\n // ─── 4. mcpaas — post-MCP platforms (multiple MCP signals + auth + DB) ──\n const mcpaasSignal = detectMcpaasSignal(dir, pkg, frameworks);\n if (mcpaasSignal) {\n found.push(mcpaasSignal);\n return { type: 'mcpaas', found };\n }\n\n // ─── 5. saas — subscription products (auth + payment) ───────────────────\n const saasSignal = detectSaasSignal(dir, pkg);\n if (saasSignal) {\n found.push(saasSignal);\n return { type: 'saas', found };\n }\n\n // ─── 6. wasm — WASM target in build config ──────────────────────────────\n const wasmSignal = detectWasmSignal(dir, pkg);\n if (wasmSignal) {\n found.push(wasmSignal);\n return { type: 'wasm', found };\n }\n\n // ─── 7. dart/flutter — content-aware pubspec classification. The same\n // manifest backs Flutter apps, Dart CLIs, packages, servers, and MCP\n // servers — branch by deps (Flutter→mobile, Dart MCP→mcp, Dart\n // server→backend, CLI→cli, package→library). Unambiguous Dart. ──────\n const dart = detectDartProject(dir);\n if (dart) {\n found.push(dart.found);\n return { type: dart.appType, found };\n }\n\n // ─── 7a. go — content-aware go.mod classification (same composition as Dart).\n // go.mod alone ≠ backend: MCP · Gin/Echo/… · Cobra/cmd · library. ───\n const go = detectGoProject(dir);\n if (go) {\n found.push(go.found);\n return { type: go.appType, found };\n }\n\n // ─── 7a2. csharp — content-aware .csproj classification.\n // .csproj alone ≠ type: Sdk first · MCP · web/worker · CLI · library. ─\n const csharp = detectCsharpProject(dir);\n if (csharp) {\n found.push(csharp.found);\n return { type: csharp.appType, found };\n }\n\n // ─── 7a3. jvm — content-aware pom/gradle classification.\n // pom/gradle alone ≠ type: plugins · parents · catalogs · MCP · Android/KMP. ─\n const jvm = detectJvmProject(dir);\n if (jvm) {\n found.push(jvm.found);\n return { type: jvm.appType, found };\n }\n\n // ─── 7a4. ruby — content-aware Gemfile classification.\n // Gemfile alone ≠ Rails: gem names · layout · MCP · CLI · library. ─\n const ruby = detectRubyProject(dir);\n if (ruby) {\n found.push(ruby.found);\n return { type: ruby.appType, found };\n }\n\n // ─── 7a5. swift — content-aware Package.swift / Xcode classification.\n // Package.swift alone ≠ app: products · deps · MCP · Vapor · CLI · library. ─\n const swift = detectSwiftProject(dir);\n if (swift) {\n found.push(swift.found);\n return { type: swift.appType, found };\n }\n\n // ─── 7b. mobile — JS mobile platform deps / native dirs ─────────────────\n const mobileSignal = detectMobileSignal(dir, pkg);\n if (mobileSignal) {\n found.push(mobileSignal);\n return { type: 'mobile', found };\n }\n\n // ─── 8. mcp — single MCP server ─────────────────────────────────────────\n const hasMcp = frameworks.some(f => f.slug === 'mcp');\n if (hasMcp) {\n found.push('MCP SDK signal');\n return { type: 'mcp', found };\n }\n\n // ─── 9. cli — Node bin / Cargo [[bin]] / Zig main.zig ───────────────────\n if (pkg?.bin) {\n found.push('package.json bin');\n return { type: 'cli', found };\n }\n if (hasCargoBin(dir)) {\n found.push('Cargo.toml [[bin]]');\n return { type: 'cli', found };\n }\n\n // Zig project-type detection — build.zig + entry-file convention.\n // src/main.zig → cli (executable); src/root.zig → library.\n // main.zig wins when both exist (typical: cli with internal lib exports).\n if (existsSync(join(dir, 'build.zig'))) {\n found.push('build.zig');\n if (existsSync(join(dir, 'src/main.zig'))) {\n found.push('src/main.zig');\n return { type: 'cli', found };\n }\n if (existsSync(join(dir, 'src/root.zig'))) {\n found.push('src/root.zig');\n return { type: 'library', found };\n }\n }\n\n // ─── 10. framework — private workspace + Svelte ──────────────────────────\n const hasSvelte = frameworks.some(f => f.slug === 'svelte' || f.slug === 'sveltekit');\n const isPrivateWorkspace = pkg?.private === true && (\n existsSync(join(dir, 'pnpm-workspace.yaml')) ||\n pkg?.workspaces !== undefined\n );\n if (isPrivateWorkspace && hasSvelte) {\n found.push('private workspace', 'Svelte');\n return { type: 'framework', found };\n }\n\n // ─── 11. svelte — Svelte/SvelteKit app (fullstack by nature) ────────────\n if (hasSvelte) {\n found.push('Svelte/SvelteKit');\n return { type: 'svelte', found };\n }\n\n // ─── 12. enterprise — private workspace + multi-FW (more specific than monorepo-root) ──\n // Must be checked BEFORE monorepo-root (which is private workspace fallback).\n const hasFrontendFw = frameworks.some(f => f.category === 'frontend');\n const hasBackendFw = frameworks.some(f => f.category === 'backend');\n if (\n pkg?.private &&\n (pkg.workspaces || existsSync(join(dir, 'pnpm-workspace.yaml'))) &&\n hasFrontendFw && hasBackendFw\n ) {\n found.push('private workspace + frontend + backend frameworks');\n return { type: 'enterprise', found };\n }\n\n // ─── 13. monorepo-root — private workspace, multi-package, no specific FW story ──\n const monoSignal = detectMonorepoRootSignal(dir, pkg);\n if (monoSignal) {\n found.push(monoSignal);\n return { type: 'monorepo-root', found };\n }\n\n // ─── 14. website — marketing-shape (Astro/Gatsby OR keywords) ───────────\n const websiteSignal = detectWebsiteSignal(dir, pkg, frameworks);\n if (websiteSignal) {\n found.push(websiteSignal);\n return { type: 'website', found };\n }\n\n // ─── 15. fullstack — Next/Nuxt OR (frontend + backend) ──────────────────\n const hasNextOrNuxt = frameworks.some(f => f.slug === 'nextjs' || f.slug === 'nuxt');\n if (hasNextOrNuxt) {\n found.push(frameworks.find(f => f.slug === 'nextjs') ? 'Next.js' : 'Nuxt');\n return { type: 'fullstack', found };\n }\n\n const hasFrontend = frameworks.some(f => f.category === 'frontend');\n const hasBackend = frameworks.some(f => f.category === 'backend');\n if (hasFrontend && hasBackend) {\n found.push('frontend framework', 'backend framework');\n return { type: 'fullstack', found };\n }\n\n // ─── 16. frontend — frontend framework only ─────────────────────────────\n if (hasFrontend) {\n found.push('frontend framework');\n return { type: 'frontend', found };\n }\n\n // ─── 17. backend — backend framework only ───────────────────────────────\n if (hasBackend) {\n found.push('backend framework');\n return { type: 'backend', found };\n }\n\n // ─── 18. data-science — Python DS deps (numpy/pandas/jupyter/sklearn) ───\n const dsSignal = detectDataScienceSignal(dir);\n if (dsSignal) {\n found.push(dsSignal);\n return { type: 'data-science', found };\n }\n\n // ─── 19. html — bare index.html, no framework ──────────────────────────\n const htmlSignal = detectHtmlSignal(dir, pkg);\n if (htmlSignal) {\n found.push(htmlSignal);\n return { type: 'html', found };\n }\n\n // ─── 19b. polyglot — real stack lives in sibling app dirs (FE + BE, ≥2\n // languages). NOT a monorepo tool (that's xai-faf-rust) — this only\n // rescues the repo from the `library` fallback lie below. Uses the\n // existing `fullstack` type (21 slots); no new app_type. ──────────\n const polyglotSignal = detectPolyglotSignal(dir, pkg);\n if (polyglotSignal) {\n found.push(polyglotSignal);\n return { type: 'fullstack', found };\n }\n\n // ─── 20. library — fallback (has main/exports but no bin) ──────────────\n if (pkg?.main && !pkg?.bin) {\n found.push('package.json main (no bin)');\n return { type: 'library', found };\n }\n\n // Default — bare repo with no classifying signals. The type is a\n // classification, not a slot: the file says it is the fallback (`# found:`),\n // and faf auto never writes slotignored over typed words on it.\n found.push(NO_CLASSIFYING_SIGNALS);\n return { type: 'library', found };\n}\n\n/** Detect the project type for slot mapping. Backward-compatible wrapper —\n * returns just the type string. New code should prefer\n * `detectProjectTypeWithRationale` to access the `#found` rationale. */\nexport function detectProjectType(dir: string): string {\n return detectProjectTypeWithRationale(dir).type;\n}\n\n/** Detect the runtime from a runtime file or manifest — `''` when there is\n * no evidence. */\nexport function detectRuntime(dir: string): string {\n if (existsSync(join(dir, 'bunfig.toml'))) {return 'Bun';}\n if (existsSync(join(dir, 'deno.json')) || existsSync(join(dir, 'deno.jsonc'))) {return 'Deno';}\n if (readPackageJson(dir)) {return 'Node.js';}\n if (existsSync(join(dir, 'Cargo.toml'))) {return 'Rust';}\n if (existsSync(join(dir, 'go.mod'))) {return 'Go';}\n if (listRootCsprojs(dir).length > 0) {return '.NET';}\n if (existsSync(join(dir, 'pubspec.yaml'))) {return 'Dart';}\n return '';\n}\n\n/** The JS package managers package.json's `packageManager` field names. */\nconst JS_PACKAGE_MANAGERS = new Set(['npm', 'pnpm', 'yarn', 'bun']);\n\n/** The package manager package.json's `packageManager` field declares\n * (`\"pnpm@9.1.0\"`, corepack's format) — `''` when it names none. */\nfunction declaredPackageManager(dir: string): string {\n const declared = (readPackageJson(dir) as { packageManager?: unknown } | null)?.packageManager;\n if (typeof declared !== 'string') {return '';}\n const name = /^([a-z]+)@/i.exec(declared.trim())?.[1]?.toLowerCase() ?? '';\n return JS_PACKAGE_MANAGERS.has(name) ? name : '';\n}\n\n/** The package manager a non-JS manifest implies, or `''`. */\nfunction manifestPackageManager(dir: string): string {\n if (existsSync(join(dir, 'pubspec.yaml'))) {return 'pub';}\n if (existsSync(join(dir, 'go.mod'))) {return 'go modules';}\n if (listRootCsprojs(dir).length > 0) {return 'NuGet';}\n if (existsSync(join(dir, 'pom.xml'))) {return 'maven';}\n const gradle = ['build.gradle', 'build.gradle.kts', 'settings.gradle', 'settings.gradle.kts'];\n return gradle.some(f => existsSync(join(dir, f))) ? 'gradle' : '';\n}\n\n/** The JS package manager a committed lockfile names, or `''`. */\nconst LOCKFILES: ReadonlyArray<[file: string, manager: string]> = [\n ['bun.lockb', 'bun'], ['bun.lock', 'bun'], ['pnpm-lock.yaml', 'pnpm'], ['yarn.lock', 'yarn'], ['package-lock.json', 'npm'],\n];\n\n/** Detect the package manager from repo facts — a manifest that implies one,\n * package.json's `packageManager` field, then a lockfile. `''` when there is\n * no evidence: a package.json alone does not say which manager installs it. */\nexport function detectPackageManager(dir: string): string {\n return manifestPackageManager(dir) || declaredPackageManager(dir) || (LOCKFILES.find(([f]) => existsSync(join(dir, f)))?.[1] ?? '');\n}\n\n/** Detect CI/CD */\nexport function detectCicd(dir: string): string | null {\n if (existsSync(join(dir, '.github/workflows'))) {return 'GitHub Actions';}\n if (existsSync(join(dir, '.gitlab-ci.yml'))) {return 'GitLab CI';}\n if (existsSync(join(dir, '.circleci'))) {return 'CircleCI';}\n if (existsSync(join(dir, 'Jenkinsfile'))) {return 'Jenkins';}\n return null;\n}\n\n/** Detect hosting platform — from a platform's own config file. A bare\n * Dockerfile is not one: it shows a container build, not where the app runs. */\nexport function detectHosting(dir: string): string | null {\n if (existsSync(join(dir, 'vercel.json'))) {return 'Vercel';}\n if (existsSync(join(dir, 'netlify.toml'))) {return 'Netlify';}\n if (existsSync(join(dir, 'wrangler.toml'))) {return 'Cloudflare';}\n if (existsSync(join(dir, 'fly.toml'))) {return 'Fly.io';}\n if (existsSync(join(dir, 'render.yaml'))) {return 'Render';}\n return null;\n}\n\n/** Detect SvelteKit adapter from svelte.config.js */\nexport function detectSvelteAdapter(dir: string): string | null {\n const configPath = join(dir, 'svelte.config.js');\n if (!existsSync(configPath)) {return null;}\n try {\n const content = readFileSync(configPath, 'utf-8');\n // Match adapter imports: import adapter from '@sveltejs/adapter-vercel'\n // Or: import { adapter } from '@sveltejs/adapter-node'\n // Or: const adapter = require('@sveltejs/adapter-static')\n const adapterMatch = content.match(/@sveltejs\\/adapter-(\\w+)/);\n if (adapterMatch) {\n const adapter = adapterMatch[1];\n switch (adapter) {\n case 'vercel': return 'Vercel';\n case 'node': return 'Node';\n case 'static': return 'Static';\n case 'cloudflare': return 'Cloudflare';\n case 'netlify': return 'Netlify';\n case 'auto': return 'Auto';\n default: return adapter;\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/** Detect build tool */\nexport function detectBuildTool(dir: string): string | null {\n const pkg = readPackageJson(dir);\n if (pkg?.devDependencies?.vite || pkg?.dependencies?.vite) {return 'Vite';}\n if (pkg?.devDependencies?.webpack || pkg?.dependencies?.webpack) {return 'webpack';}\n if (pkg?.devDependencies?.esbuild || pkg?.dependencies?.esbuild) {return 'esbuild';}\n if (existsSync(join(dir, 'tsconfig.json')) && pkg?.devDependencies?.typescript) {return 'TypeScript (tsc)';}\n return null;\n}\n\n/* ─── FAFB section helpers (top-level YAML keys read by compile_fafb) ───────\n *\n * These detect content for the FAFB binary's TECH_STACK, KEY_FILES, and\n * COMMANDS sections. ARCHITECTURE and CONTEXT are deliberately left empty\n * for user fill (architecture overlaps with human_context.how; context is\n * deliberately free-form additional signal beyond the 6Ws).\n */\n\n/** Detect a list of important file paths for the KEY_FILES FAFB section.\n * Returns up to ~10 entries, ordered by canonical importance. */\nexport function detectKeyFiles(dir: string): string[] {\n const candidates = [\n // Manifests\n 'package.json', 'Cargo.toml', 'pyproject.toml', 'go.mod',\n 'build.zig', 'build.zig.zon',\n // Entry points (TS/JS)\n 'src/index.ts', 'src/index.js', 'src/main.ts', 'src/cli.ts',\n // Entry points (Rust)\n 'src/main.rs', 'src/lib.rs',\n // Entry points (Zig)\n 'src/main.zig', 'src/root.zig',\n // Entry points (Python)\n 'src/__init__.py', 'main.py', '__main__.py',\n // Entry points (Go)\n 'main.go', 'cmd/main.go',\n // Specs / docs\n 'README.md', 'SPECIFICATION.md', 'BINARY-FORMAT.md',\n // Config\n 'tsconfig.json', 'wrangler.toml', 'vercel.json',\n ];\n return candidates.filter(f => existsSync(join(dir, f)));\n}\n\n/** Detect build/test/lint commands for the COMMANDS FAFB section.\n * Returns a Record<string, string> mapping command name → shell command. */\nexport function detectCommands(dir: string, pkg: PackageJson | null): Record<string, string> {\n const commands: Record<string, string> = {};\n\n // From package.json scripts (most reliable)\n if (pkg?.scripts) {\n for (const key of ['build', 'test', 'lint', 'dev', 'start']) {\n if (pkg.scripts[key]) {\n // Determine the runner — prefer bun if available, else npm\n const runner = existsSync(join(dir, 'bun.lock')) || existsSync(join(dir, 'bun.lockb'))\n ? 'bun run'\n : 'npm run';\n commands[key] = `${runner} ${key}`;\n }\n }\n }\n\n // Rust: cargo builds and tests every Cargo package. Clippy only when the\n // repo configures it — a Cargo.toml alone does not say the project lints with it.\n if (existsSync(join(dir, 'Cargo.toml'))) {\n if (!commands.build) {commands.build = 'cargo build --release';}\n if (!commands.test) {commands.test = 'cargo test';}\n if (!commands.lint && configuresClippy(dir)) {commands.lint = 'cargo clippy';}\n }\n\n // Zig: build.zig is `zig build`'s own script; `zig build test` only when\n // it defines a test step.\n if (existsSync(join(dir, 'build.zig'))) {\n if (!commands.build) {commands.build = 'zig build';}\n if (!commands.test && /\\.step\\(\\s*\"test\"/.test(readText(dir, 'build.zig'))) {commands.test = 'zig build test';}\n }\n\n // Go: the go tool builds and tests every module.\n if (existsSync(join(dir, 'go.mod'))) {\n if (!commands.build) {commands.build = 'go build ./...';}\n if (!commands.test) {commands.test = 'go test ./...';}\n }\n\n // Python: pytest only when the repo says pytest — a pyproject.toml alone\n // does not (unittest, nox and tox are as common).\n if (!commands.test && usesPytest(dir)) {commands.test = 'pytest';}\n\n return commands;\n}\n\n/** A file's text, or `''` when it cannot be read. */\nfunction readText(dir: string, name: string): string {\n try {\n return readFileSync(join(dir, name), 'utf-8');\n } catch {\n return '';\n }\n}\n\n/** The repo configures Clippy: a clippy.toml, or a `[lints.clippy]` table in Cargo.toml. */\nfunction configuresClippy(dir: string): boolean {\n if (existsSync(join(dir, 'clippy.toml')) || existsSync(join(dir, '.clippy.toml'))) {return true;}\n return /^\\s*\\[(workspace\\.)?lints\\.clippy\\]/m.test(readText(dir, 'Cargo.toml'));\n}\n\n/** The repo says pytest: pytest.ini or conftest.py, or pytest named in\n * pyproject.toml, setup.cfg or tox.ini (its config table or a dependency). */\nfunction usesPytest(dir: string): boolean {\n if (existsSync(join(dir, 'pytest.ini')) || existsSync(join(dir, 'conftest.py'))) {return true;}\n return ['pyproject.toml', 'setup.cfg', 'tox.ini'].some(f => /\\bpytest\\b/.test(readText(dir, f)));\n}\n\n/** Detect a tech-stack list for the TECH_STACK FAFB section.\n * Combines language + frameworks + runtime into a flat list of strings\n * (matching the canonical xai-faf-rust project.faf shape). */\nexport function detectTechStack(\n dir: string,\n pkg: PackageJson | null,\n frameworks: DetectedFramework[],\n language: string,\n): string[] {\n const stack: string[] = [];\n\n // Language goes first\n if (language && language !== 'Unknown') {stack.push(language);}\n\n // Notable frameworks (frontend / backend / database / build)\n const notableCategories = new Set(['frontend', 'backend', 'database', 'build', 'css', 'state', 'monorepo']);\n for (const fw of frameworks) {\n if (notableCategories.has(fw.category)) {\n stack.push(fw.name);\n }\n }\n\n // Runtime if non-trivial (Node.js by default for JS — only call out Bun/Deno/etc.)\n if (existsSync(join(dir, 'bunfig.toml'))) {stack.push('Bun');}\n else if (existsSync(join(dir, 'deno.json')) || existsSync(join(dir, 'deno.jsonc'))) {stack.push('Deno');}\n\n // Top deps from package.json/Cargo.toml — only if stack is still sparse\n if (stack.length < 3 && pkg?.dependencies) {\n const topDeps = Object.keys(pkg.dependencies).slice(0, 5);\n for (const dep of topDeps) {\n if (!stack.some(s => s.toLowerCase().includes(dep.toLowerCase()))) {\n stack.push(dep);\n }\n }\n }\n\n return stack;\n}\n",
|
|
112
|
+
"import { join } from 'path';\nimport { readRepoDir, readRepoFile, repoExists, withRepoRoot } from '../core/safe-write.js';\nimport type { DetectedFramework, Signal } from '../core/types.js';\nimport { NO_CLASSIFYING_SIGNALS } from '../core/slots.js';\nimport { FRAMEWORKS } from './frameworks.js';\nimport { detectDartProject } from './dart.js';\nimport { detectGoProject } from './go.js';\nimport { detectCsharpProject, listRootCsprojs } from './csharp.js';\nimport { detectJvmProject, isJvmRoot } from './jvm.js';\nimport { detectRubyProject } from './ruby.js';\nimport { detectSwiftProject } from './swift.js';\n\ninterface PackageJson {\n name?: string;\n version?: string;\n description?: string;\n keywords?: string[];\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n type?: string;\n main?: string;\n types?: string;\n exports?: unknown;\n bin?: string | Record<string, string>;\n private?: boolean;\n workspaces?: string[] | { packages?: string[] };\n files?: string[];\n}\n\n/** Read [package].name field from Cargo.toml — naive but adequate. */\nfunction readCargoName(dir: string): string | null {\n const content = readRepoFile(dir, 'Cargo.toml');\n if (content === null) {return null;}\n const m = content.match(/^\\s*\\[package\\][\\s\\S]*?^\\s*name\\s*=\\s*\"([^\"]+)\"/m);\n return m ? m[1] : null;\n}\n\n/** True if Cargo.toml declares one or more `[[bin]]` sections — Rust cli marker. */\nfunction hasCargoBin(dir: string): boolean {\n const content = readRepoFile(dir, 'Cargo.toml');\n return content !== null && /^\\s*\\[\\[bin\\]\\]/m.test(content);\n}\n\n/** Detect SDK signals — keyword-based per the SDK-priority doctrine.\n * Returns the matched evidence string, or null if no SDK signal. */\nfunction detectSdkSignal(dir: string, pkg: PackageJson | null): string | null {\n // pkg.keywords contains 'sdk'\n if (pkg?.keywords?.some(k => /^sdk(?:\\s|-|$)|-sdk$/i.test(k))) {\n return 'package.json keywords contains \"sdk\"';\n }\n // pkg.name contains 'sdk' or '-sdk' suffix\n if (pkg?.name && /(?:^|[-_/])sdk(?:[-_/]|$)/i.test(pkg.name)) {\n return `package.json name \"${pkg.name}\" → sdk`;\n }\n // Cargo.toml [package].name contains 'sdk'\n const cargoName = readCargoName(dir);\n if (cargoName && /(?:^|[-_])sdk(?:[-_]|$)/i.test(cargoName)) {\n return `Cargo.toml name \"${cargoName}\" → sdk`;\n }\n return null;\n}\n\n/** Browser / Chrome extension signal — a manifest.json that declares\n * `manifest_version` (the defining MV2/MV3 trait, absent from PWA web-app\n * manifests). Checked at the repo root and common source/build locations,\n * since extensions often keep the manifest under public/ or src/. */\nfunction detectExtensionSignal(dir: string): string | null {\n const candidates = [\n 'manifest.json',\n 'public/manifest.json',\n 'src/manifest.json',\n 'app/manifest.json',\n 'extension/manifest.json',\n 'dist/manifest.json',\n ];\n for (const rel of candidates) {\n const text = readRepoFile(dir, rel);\n if (text === null) {continue;}\n try {\n const parsed = JSON.parse(text) as { manifest_version?: unknown };\n if (typeof parsed.manifest_version === 'number') {\n return `${rel} manifest_version ${parsed.manifest_version} (browser extension)`;\n }\n } catch { /* not valid JSON / unreadable — keep scanning */ }\n }\n return null;\n}\n\n/** Python data-science dependency detection (pyproject.toml + requirements.txt). */\nfunction detectDataScienceSignal(dir: string): string | null {\n const dsPatterns = /(numpy|pandas|jupyter|scikit-learn|sklearn|pytorch|tensorflow|matplotlib|scipy)/i;\n const pyproject = readRepoFile(dir, 'pyproject.toml');\n if (pyproject !== null) {\n const match = pyproject.match(dsPatterns);\n if (match) {return `pyproject.toml depends on ${match[1]}`;}\n }\n const reqs = readRepoFile(dir, 'requirements.txt');\n if (reqs !== null) {\n const match = reqs.match(dsPatterns);\n if (match) {return `requirements.txt contains ${match[1]}`;}\n }\n return null;\n}\n\n/** Mobile platform signal — JS mobile (React Native / Expo / Capacitor / Ionic)\n * + native ios/android dirs. Flutter/Dart is handled by detectDartProject. */\nfunction detectMobileSignal(dir: string, pkg: PackageJson | null): string | null {\n const mobileDeps = ['react-native', 'expo', '@capacitor/core', '@ionic/core'];\n if (pkg) {\n for (const dep of mobileDeps) {\n if (pkg.dependencies?.[dep] || pkg.devDependencies?.[dep]) {\n return `${dep} dependency`;\n }\n }\n }\n if (repoExists(dir, 'ios') && repoExists(dir, 'android')) {\n return 'ios/ + android/ dirs';\n }\n return null;\n}\n\n/** WASM target detection (Cargo cdylib + wasm32 OR build.zig wasm OR pkg WASM build scripts). */\nfunction detectWasmSignal(dir: string, pkg: PackageJson | null): string | null {\n const cargo = readRepoFile(dir, 'Cargo.toml');\n if (cargo !== null) {\n // crate-type = [\"cdylib\"] is the canonical wasm-output marker\n if (/crate-type\\s*=\\s*\\[[^\\]]*\"cdylib\"/.test(cargo)) {\n return 'Cargo.toml crate-type = [\"cdylib\"]';\n }\n // wasm-bindgen / wasm-pack as deps\n if (/wasm-bindgen|wasm-pack/i.test(cargo)) {\n return 'Cargo.toml wasm-bindgen/wasm-pack';\n }\n }\n // Zig WASM target — build.zig with .wasm or wasm in script\n const buildZig = readRepoFile(dir, 'build.zig');\n if (buildZig !== null && /\\.wasm\\b|wasm32|setOutputFormat\\(\\.wasm/i.test(buildZig)) {\n return 'build.zig wasm target';\n }\n // pkg keywords contains 'wasm' AND no app frameworks\n if (pkg?.keywords?.some(k => /^wasm(?:-|$)|webassembly/i.test(k))) {\n return 'package.json keywords contains \"wasm\"';\n }\n return null;\n}\n\n/** Bare HTML / vanilla site detection. */\nfunction detectHtmlSignal(dir: string, pkg: PackageJson | null): string | null {\n // Must have index.html at root\n if (!repoExists(dir, 'index.html')) {return null;}\n // Must NOT have any frontend deps (those would classify as frontend/website/etc)\n if (pkg?.dependencies || pkg?.devDependencies) {\n const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const frontendDeps = ['react', 'vue', 'svelte', '@sveltejs/kit', 'next', 'nuxt', 'astro', 'gatsby', 'solid-js', 'qwik'];\n if (frontendDeps.some(d => allDeps[d])) {return null;}\n }\n return 'index.html (vanilla, no frontend framework)';\n}\n\n/** Documentation / spec-only repo signal. */\nfunction detectDocumentationSignal(dir: string, pkg: PackageJson | null): string | null {\n // Strong signal: name or keywords contains 'specification'\n if (pkg?.name && /specification|^@.*\\/spec/i.test(pkg.name)) {\n return `package name \"${pkg.name}\" → documentation`;\n }\n if (pkg?.keywords?.some(k => /^(specification|format-spec|standard)$/i.test(k))) {\n return 'package keywords contains \"specification\"';\n }\n // A publishable CLI/bin package is never \"docs-only\" — even if `files` is\n // npm-publish-narrow (e.g. [\"dist\", \"README.md\"]). Bare `dist`/`src`/`bin`\n // without a trailing slash is still source, not documentation.\n // (agents-md-facts false positive: bin present + files:[\"dist\",\"README.md\",\"LICENSE\"]\n // classified as documentation before the cli check could run.)\n if (pkg?.bin) {\n return null;\n }\n // pkg.files contains only md / examples / assets (no dist/, no src/)\n if (pkg?.files && pkg.files.length > 0) {\n // Match \"dist\", \"dist/\", \"src/cli.ts\", \"*.js\", etc. — bare publish dirs count as source\n const sourcePatterns =\n /^(dist|src|lib|build|bin)(\\/|$)|\\/(dist|src|lib|build|bin)(\\/|$)|(\\.|\\/)(js|ts|tsx|jsx|mjs|cjs|py|rs|go)$/;\n const hasSource = pkg.files.some(f => sourcePatterns.test(f));\n const hasDocs = pkg.files.some(f => /\\.(md|MD)$|examples?\\//.test(f) || f === 'README.md' || f === 'docs' || f === 'docs/');\n if (!hasSource && hasDocs) {\n return 'package.json files = docs/examples only (no source)';\n }\n }\n return null;\n}\n\n/** Marketing / website signal — Astro/Gatsby static OR pkg keywords. */\nfunction detectWebsiteSignal(dir: string, pkg: PackageJson | null, frameworks: DetectedFramework[]): string | null {\n // Astro/Gatsby are typically used for content/marketing sites\n const astroOrGatsby = frameworks.find(f => f.slug === 'astro' || f.slug === 'gatsby');\n if (astroOrGatsby) {return `${astroOrGatsby.name} (static-site framework)`;}\n // pkg.keywords explicitly marketing\n if (pkg?.keywords?.some(k => /^(website|marketing|landing|brochure|portfolio)$/i.test(k))) {\n return 'package keywords contains \"website\"/\"marketing\"/\"landing\"';\n }\n return null;\n}\n\n/** SAAS shape — auth + payments + database + dashboard. */\nfunction detectSaasSignal(dir: string, pkg: PackageJson | null): string | null {\n if (!pkg) {return null;}\n const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const authDeps = ['@clerk/nextjs', '@clerk/clerk-react', 'next-auth', '@auth/core', 'auth0', '@auth0/nextjs-auth0'];\n const paymentDeps = ['stripe', '@stripe/stripe-js', 'lemonsqueezy'];\n const hasAuth = authDeps.some(d => allDeps[d]);\n const hasPayment = paymentDeps.some(d => allDeps[d]);\n if (hasAuth && hasPayment) {\n return 'auth + payment dependencies';\n }\n return null;\n}\n\n/** MCPaaS (post-MCP platform) shape — multiple MCP signals + hosting + DB. */\nfunction detectMcpaasSignal(dir: string, pkg: PackageJson | null, frameworks: DetectedFramework[]): string | null {\n // pkg.keywords contains 'mcpaas' is the strongest signal\n if (pkg?.keywords?.some(k => /mcpaas/i.test(k))) {\n return 'package keywords contains \"mcpaas\"';\n }\n // pkg.name contains 'mcpaas'\n if (pkg?.name && /mcpaas/i.test(pkg.name)) {\n return `package name \"${pkg.name}\" → mcpaas`;\n }\n // Multi-signal: MCP framework + database + hosting (a platform, not a single server)\n const hasMcp = frameworks.some(f => f.slug === 'mcp');\n const hasDb = frameworks.some(f => f.category === 'database');\n if (hasMcp && hasDb && pkg?.dependencies && Object.keys(pkg.dependencies).length > 10) {\n return 'MCP + database + complex deps (platform shape)';\n }\n return null;\n}\n\n/** Monorepo-root — private workspace with multiple packages, no single dominant FW. */\nfunction detectMonorepoRootSignal(dir: string, pkg: PackageJson | null): string | null {\n if (!pkg?.private) {return null;}\n const hasWorkspaces = !!pkg.workspaces || repoExists(dir, 'pnpm-workspace.yaml');\n if (!hasWorkspaces) {return null;}\n return 'private workspace + multi-package';\n}\n\n/** Top-level dirs that never hold an app component. */\nconst SUBDIR_IGNORE = new Set([\n 'node_modules', 'dist', 'build', 'out', 'vendor', 'target', 'coverage',\n 'docs', 'doc', 'e2e', 'tests', 'test', '__tests__', 'scripts', 'deploy',\n 'bin', 'public', 'examples', 'example', 'fixtures', 'assets', 'static',\n 'migrations', 'config', 'contracts', 'proto', 'protos',\n]);\n\nconst BACKEND_LANG_RE = /^(Python|Go|Rust|Ruby|Java|Kotlin)$/;\n\n/** One app component discovered directly under the repo root. */\nexport interface SubdirStack {\n /** basename */\n name: string;\n /** detectLanguage() of the subdir */\n language: string;\n /** highest-confidence real-stack framework in the subdir (never Docker/CI/etc.) */\n topFramework: string | null;\n frontend: boolean;\n backend: boolean;\n /** a real-stack framework (not infra) was detected — ranks it as the \"primary\" */\n hasFramework: boolean;\n /** a \"this dir IS the app\" marker (manage.py / config.ru / bin/rails) */\n appRoot: boolean;\n}\n\n/** Framework categories that describe the app's own stack (not infra/tooling). */\nconst STACK_FW_CATEGORIES = new Set(['frontend', 'backend', 'database', 'css', 'ui', 'state']);\n\n/** A directory carries a real language manifest (not just tooling/config). */\nfunction hasLanguageManifest(d: string): boolean {\n if (\n repoExists(d, 'pyproject.toml') || repoExists(d, 'manage.py') ||\n repoExists(d, 'setup.py') || fileExists(d, 'requirements*.txt')\n ) {return true;}\n if (repoExists(d, 'go.mod')) {return true;}\n if (repoExists(d, 'Cargo.toml')) {return true;}\n if (repoExists(d, 'Gemfile')) {return true;}\n if (repoExists(d, 'pom.xml') || fileExists(d, 'build.gradle*')) {return true;}\n if (listRootCsprojs(d).length > 0) {return true;}\n const pkg = readPackageJson(d);\n if (pkg && Object.keys(pkg.dependencies ?? {}).length > 0) {return true;}\n return false;\n}\n\n/** Shallow (depth-1) scan for per-subdirectory app stacks. Feeds the polyglot\n * classifier + `main_language` aggregation. A dir counts only when it carries a\n * real language manifest. This is NOT monorepo tooling — it only exists to stop\n * a repo whose real stack lives in subdirs from falling to the `library` lie. */\nexport function detectSubdirStacks(dir: string): SubdirStack[] {\n // The project folder bounds every read below it: a subfolder's manifest may\n // link anywhere inside the project, never out of it.\n return withRepoRoot(dir, () => subdirStacks(dir));\n}\n\nfunction subdirStacks(dir: string): SubdirStack[] {\n const entries = readRepoDir(dir) ?? [];\n const out: SubdirStack[] = [];\n for (const e of entries) {\n if (!e.isDirectory() || e.name.startsWith('.') || SUBDIR_IGNORE.has(e.name)) {continue;}\n const sub = join(dir, e.name);\n if (!hasLanguageManifest(sub)) {continue;}\n const language = detectLanguage(sub);\n if (!language) {continue;}\n const fws = detectFrameworks(sub).filter(f => STACK_FW_CATEGORIES.has(f.category));\n const fe = fws.find(f => f.category === 'frontend');\n const be = fws.find(f => f.category === 'backend');\n const top = fe ?? be ?? fws[0] ?? null;\n out.push({\n name: e.name,\n language,\n topFramework: top?.name ?? null,\n frontend: !!fe,\n backend: !!be || BACKEND_LANG_RE.test(language),\n hasFramework: !!top,\n appRoot:\n repoExists(sub, 'manage.py') ||\n repoExists(sub, 'config.ru') ||\n repoExists(sub, 'bin/rails') ||\n repoExists(sub, 'artisan'),\n });\n }\n return out;\n}\n\n/** Polyglot signal — ≥2 sibling app dirs, ≥2 distinct languages, a frontend AND\n * a backend among them. Returns the `# found:` evidence string, or null. */\nexport function detectPolyglotSignal(dir: string, pkg: PackageJson | null): string | null {\n if (pkg?.workspaces || repoExists(dir, 'pnpm-workspace.yaml')) {return null;}\n const subs = detectSubdirStacks(dir);\n const langs = new Set(subs.map(s => s.language));\n if (subs.length < 2 || langs.size < 2) {return null;}\n if (!subs.some(s => s.frontend) || !subs.some(s => s.backend)) {return null;}\n return `polyglot: ${subs.map(s => `${s.name}/ (${s.language})`).join(', ')}`;\n}\n\n/** Aggregate the polyglot `main_language` string — primary first (a framework-\n * bearing backend dir wins), deduped by language, roles annotated.\n * e.g. \"Python (Django · backend); JavaScript (React · frontend); Go (service)\" */\nexport function detectPolyglotLanguage(dir: string): string | null {\n const subs = detectSubdirStacks(dir);\n if (subs.length < 2) {return null;}\n const score = (s: SubdirStack): number =>\n (s.appRoot ? 2 : 0) +\n (BACKEND_LANG_RE.test(s.language) ? 2 : 0) +\n (s.hasFramework ? 1 : 0) +\n (s.frontend ? 0.5 : 0);\n const ranked = [...subs].sort((a, b) => score(b) - score(a));\n const seen = new Set<string>();\n const parts: string[] = [];\n for (const s of ranked) {\n if (seen.has(s.language)) {continue;}\n seen.add(s.language);\n const role = s.frontend ? 'frontend' : s.backend ? 'backend' : 'service';\n parts.push(s.topFramework ? `${s.language} (${s.topFramework} · ${role})` : `${s.language} (${role})`);\n }\n return parts.join('; ');\n}\n\n/** Read and parse package.json from a directory */\nexport function readPackageJson(dir: string): PackageJson | null {\n const text = readRepoFile(dir, 'package.json');\n if (text === null) {return null;}\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\n/** Scan a directory for files matching patterns */\nfunction fileExists(dir: string, pattern: string): boolean {\n // Handle simple file checks\n if (!pattern.includes('*')) {\n return repoExists(dir, pattern);\n }\n\n // Handle glob patterns like \"next.config.*\" or \".github/workflows/*.yml\"\n const parts = pattern.split('/');\n if (parts.length === 1) {\n // Simple wildcard: \"next.config.*\"\n const prefix = pattern.split('*')[0];\n return (readRepoDir(dir) ?? []).some(e => e.name.startsWith(prefix));\n }\n\n // Multi-level: \".github/workflows/*.yml\"\n const subdir = join(...parts.slice(0, -1));\n const filePattern = parts[parts.length - 1];\n const prefix = filePattern.split('*')[0];\n const suffix = filePattern.split('*')[1] || '';\n return (readRepoDir(dir, subdir) ?? []).some(e => e.name.startsWith(prefix) && e.name.endsWith(suffix));\n}\n\n/** Match a single signal against project data */\nfunction matchSignal(signal: Signal, pkg: PackageJson | null, dir: string): boolean {\n switch (signal.type) {\n case 'dependency':\n return !!(pkg?.dependencies?.[signal.key!]);\n case 'devDependency':\n return !!(pkg?.devDependencies?.[signal.key!]);\n case 'file':\n return fileExists(dir, signal.pattern!);\n case 'content': {\n // File must exist AND contain key (case-insensitive). Used so pom/gradle\n // alone never claim Spring Boot — JVM Edition kill line for tech_stack.\n if (!signal.pattern || !signal.key) {return false;}\n if (!fileExists(dir, signal.pattern)) {return false;}\n // A glob pattern names no one file: there is nothing to read, so no match.\n const body = readRepoFile(dir, signal.pattern);\n return body !== null && body.toLowerCase().includes(signal.key.toLowerCase());\n }\n default:\n return false;\n }\n}\n\n/** Detect frameworks in a directory */\nexport function detectFrameworks(dir: string): DetectedFramework[] {\n const pkg = readPackageJson(dir);\n\n return FRAMEWORKS\n .map(fw => {\n const matched = fw.signals.filter(s => matchSignal(s, pkg, dir));\n const confidence = matched.length / fw.signals.length;\n return { name: fw.name, slug: fw.slug, category: fw.category, confidence };\n })\n .filter(fw => fw.confidence > 0)\n .sort((a, b) => b.confidence - a.confidence);\n}\n\n/** Detect the primary language of a project from its manifests — `''` when\n * there is no evidence. */\nexport function detectLanguage(dir: string): string {\n const pkg = readPackageJson(dir);\n\n // Check for TypeScript\n if (pkg?.devDependencies?.typescript || pkg?.dependencies?.typescript) {return 'TypeScript';}\n if (repoExists(dir, 'tsconfig.json')) {return 'TypeScript';}\n\n // Check for common language indicators\n if (repoExists(dir, 'Cargo.toml')) {return 'Rust';}\n if (repoExists(dir, 'go.mod')) {return 'Go';}\n if (listRootCsprojs(dir).length > 0) {return 'C#';}\n if (repoExists(dir, 'pyproject.toml') || repoExists(dir, 'setup.py')) {return 'Python';}\n if (repoExists(dir, 'Gemfile')) {return 'Ruby';}\n if (isJvmRoot(dir)) {\n const jvm = detectJvmProject(dir);\n if (jvm) {return jvm.mainLanguage === 'Java/Kotlin' ? 'Kotlin' : jvm.mainLanguage;}\n return 'Java';\n }\n if (repoExists(dir, 'Package.swift')) {return 'Swift';}\n if (repoExists(dir, 'build.zig')) {return 'Zig';}\n if (repoExists(dir, 'pubspec.yaml')) {return 'Dart';}\n\n // A package.json with none of the manifests above: JavaScript\n if (pkg) {return 'JavaScript';}\n\n // No evidence: nothing (never a placeholder word for project.faf)\n return '';\n}\n\n/** Project-type detection result + rationale (the #found list).\n * Each `found` entry is a human-readable signal that contributed to the\n * classification — emitted as a YAML comment by `writeFaf` for transparency\n * (\"Glass Hood\" doctrine: the user sees WHY the cli classified as it did). */\nexport interface ProjectTypeDetection {\n type: string;\n /** Signals that matched, in order observed. */\n found: string[];\n}\n\n/** Detect the project type with rationale. The `found` list captures every\n * positive signal that contributed to the classification — used downstream\n * by `writeFaf` to render `# found: <list>` next to `type:` in the .faf.\n *\n * Priority order per v6.6.md doctrine (most-specific first). About is a\n * repo role (`about.represents`), not an app_type — never matches here.\n * Rule: SDK keyword takes priority (sdk wins over library/cli/wasm). */\nexport function detectProjectTypeWithRationale(dir: string): ProjectTypeDetection {\n const pkg = readPackageJson(dir);\n const frameworks = detectFrameworks(dir);\n const found: string[] = [];\n\n // ─── 1. documentation — spec-only / docs-only repos ─────────────────────\n const docSignal = detectDocumentationSignal(dir, pkg);\n if (docSignal) {\n found.push(docSignal);\n return { type: 'documentation', found };\n }\n\n // ─── 2. sdk — SDK keyword/structure WINS over mcpaas/saas/wasm/cli/library ─\n // wolfejam doctrine: if a repo signals SDK (name contains \"-sdk\", keywords\n // contains \"sdk\"), it's an SDK regardless of what platform/wasm/cli signals\n // would also fire. Confirmed for mcpaas-sdk (SDK FOR the platform, not the\n // platform itself).\n const sdkSignal = detectSdkSignal(dir, pkg);\n if (sdkSignal) {\n found.push(sdkSignal);\n return { type: 'sdk', found };\n }\n\n // ─── 3. extension — browser/chrome extension (manifest_version) ─────────\n // manifest_version is the unambiguous MV2/MV3 trait — must beat the framework\n // heuristics below (a framework-built extension would otherwise classify as\n // svelte/frontend/fullstack — confirmed on Stack⚡️Grabber).\n const extensionSignal = detectExtensionSignal(dir);\n if (extensionSignal) {\n found.push(extensionSignal);\n return { type: 'extension', found };\n }\n\n // ─── 4. mcpaas — post-MCP platforms (multiple MCP signals + auth + DB) ──\n const mcpaasSignal = detectMcpaasSignal(dir, pkg, frameworks);\n if (mcpaasSignal) {\n found.push(mcpaasSignal);\n return { type: 'mcpaas', found };\n }\n\n // ─── 5. saas — subscription products (auth + payment) ───────────────────\n const saasSignal = detectSaasSignal(dir, pkg);\n if (saasSignal) {\n found.push(saasSignal);\n return { type: 'saas', found };\n }\n\n // ─── 6. wasm — WASM target in build config ──────────────────────────────\n const wasmSignal = detectWasmSignal(dir, pkg);\n if (wasmSignal) {\n found.push(wasmSignal);\n return { type: 'wasm', found };\n }\n\n // ─── 7. dart/flutter — content-aware pubspec classification. The same\n // manifest backs Flutter apps, Dart CLIs, packages, servers, and MCP\n // servers — branch by deps (Flutter→mobile, Dart MCP→mcp, Dart\n // server→backend, CLI→cli, package→library). Unambiguous Dart. ──────\n const dart = detectDartProject(dir);\n if (dart) {\n found.push(dart.found);\n return { type: dart.appType, found };\n }\n\n // ─── 7a. go — content-aware go.mod classification (same composition as Dart).\n // go.mod alone ≠ backend: MCP · Gin/Echo/… · Cobra/cmd · library. ───\n const go = detectGoProject(dir);\n if (go) {\n found.push(go.found);\n return { type: go.appType, found };\n }\n\n // ─── 7a2. csharp — content-aware .csproj classification.\n // .csproj alone ≠ type: Sdk first · MCP · web/worker · CLI · library. ─\n const csharp = detectCsharpProject(dir);\n if (csharp) {\n found.push(csharp.found);\n return { type: csharp.appType, found };\n }\n\n // ─── 7a3. jvm — content-aware pom/gradle classification.\n // pom/gradle alone ≠ type: plugins · parents · catalogs · MCP · Android/KMP. ─\n const jvm = detectJvmProject(dir);\n if (jvm) {\n found.push(jvm.found);\n return { type: jvm.appType, found };\n }\n\n // ─── 7a4. ruby — content-aware Gemfile classification.\n // Gemfile alone ≠ Rails: gem names · layout · MCP · CLI · library. ─\n const ruby = detectRubyProject(dir);\n if (ruby) {\n found.push(ruby.found);\n return { type: ruby.appType, found };\n }\n\n // ─── 7a5. swift — content-aware Package.swift / Xcode classification.\n // Package.swift alone ≠ app: products · deps · MCP · Vapor · CLI · library. ─\n const swift = detectSwiftProject(dir);\n if (swift) {\n found.push(swift.found);\n return { type: swift.appType, found };\n }\n\n // ─── 7b. mobile — JS mobile platform deps / native dirs ─────────────────\n const mobileSignal = detectMobileSignal(dir, pkg);\n if (mobileSignal) {\n found.push(mobileSignal);\n return { type: 'mobile', found };\n }\n\n // ─── 8. mcp — single MCP server ─────────────────────────────────────────\n const hasMcp = frameworks.some(f => f.slug === 'mcp');\n if (hasMcp) {\n found.push('MCP SDK signal');\n return { type: 'mcp', found };\n }\n\n // ─── 9. cli — Node bin / Cargo [[bin]] / Zig main.zig ───────────────────\n if (pkg?.bin) {\n found.push('package.json bin');\n return { type: 'cli', found };\n }\n if (hasCargoBin(dir)) {\n found.push('Cargo.toml [[bin]]');\n return { type: 'cli', found };\n }\n\n // Zig project-type detection — build.zig + entry-file convention.\n // src/main.zig → cli (executable); src/root.zig → library.\n // main.zig wins when both exist (typical: cli with internal lib exports).\n if (repoExists(dir, 'build.zig')) {\n found.push('build.zig');\n if (repoExists(dir, 'src/main.zig')) {\n found.push('src/main.zig');\n return { type: 'cli', found };\n }\n if (repoExists(dir, 'src/root.zig')) {\n found.push('src/root.zig');\n return { type: 'library', found };\n }\n }\n\n // ─── 10. framework — private workspace + Svelte ──────────────────────────\n const hasSvelte = frameworks.some(f => f.slug === 'svelte' || f.slug === 'sveltekit');\n const isPrivateWorkspace = pkg?.private === true && (\n repoExists(dir, 'pnpm-workspace.yaml') ||\n pkg?.workspaces !== undefined\n );\n if (isPrivateWorkspace && hasSvelte) {\n found.push('private workspace', 'Svelte');\n return { type: 'framework', found };\n }\n\n // ─── 11. svelte — Svelte/SvelteKit app (fullstack by nature) ────────────\n if (hasSvelte) {\n found.push('Svelte/SvelteKit');\n return { type: 'svelte', found };\n }\n\n // ─── 12. enterprise — private workspace + multi-FW (more specific than monorepo-root) ──\n // Must be checked BEFORE monorepo-root (which is private workspace fallback).\n const hasFrontendFw = frameworks.some(f => f.category === 'frontend');\n const hasBackendFw = frameworks.some(f => f.category === 'backend');\n if (\n pkg?.private &&\n (pkg.workspaces || repoExists(dir, 'pnpm-workspace.yaml')) &&\n hasFrontendFw && hasBackendFw\n ) {\n found.push('private workspace + frontend + backend frameworks');\n return { type: 'enterprise', found };\n }\n\n // ─── 13. monorepo-root — private workspace, multi-package, no specific FW story ──\n const monoSignal = detectMonorepoRootSignal(dir, pkg);\n if (monoSignal) {\n found.push(monoSignal);\n return { type: 'monorepo-root', found };\n }\n\n // ─── 14. website — marketing-shape (Astro/Gatsby OR keywords) ───────────\n const websiteSignal = detectWebsiteSignal(dir, pkg, frameworks);\n if (websiteSignal) {\n found.push(websiteSignal);\n return { type: 'website', found };\n }\n\n // ─── 15. fullstack — Next/Nuxt OR (frontend + backend) ──────────────────\n const hasNextOrNuxt = frameworks.some(f => f.slug === 'nextjs' || f.slug === 'nuxt');\n if (hasNextOrNuxt) {\n found.push(frameworks.find(f => f.slug === 'nextjs') ? 'Next.js' : 'Nuxt');\n return { type: 'fullstack', found };\n }\n\n const hasFrontend = frameworks.some(f => f.category === 'frontend');\n const hasBackend = frameworks.some(f => f.category === 'backend');\n if (hasFrontend && hasBackend) {\n found.push('frontend framework', 'backend framework');\n return { type: 'fullstack', found };\n }\n\n // ─── 16. frontend — frontend framework only ─────────────────────────────\n if (hasFrontend) {\n found.push('frontend framework');\n return { type: 'frontend', found };\n }\n\n // ─── 17. backend — backend framework only ───────────────────────────────\n if (hasBackend) {\n found.push('backend framework');\n return { type: 'backend', found };\n }\n\n // ─── 18. data-science — Python DS deps (numpy/pandas/jupyter/sklearn) ───\n const dsSignal = detectDataScienceSignal(dir);\n if (dsSignal) {\n found.push(dsSignal);\n return { type: 'data-science', found };\n }\n\n // ─── 19. html — bare index.html, no framework ──────────────────────────\n const htmlSignal = detectHtmlSignal(dir, pkg);\n if (htmlSignal) {\n found.push(htmlSignal);\n return { type: 'html', found };\n }\n\n // ─── 19b. polyglot — real stack lives in sibling app dirs (FE + BE, ≥2\n // languages). NOT a monorepo tool (that's xai-faf-rust) — this only\n // rescues the repo from the `library` fallback lie below. Uses the\n // existing `fullstack` type (21 slots); no new app_type. ──────────\n const polyglotSignal = detectPolyglotSignal(dir, pkg);\n if (polyglotSignal) {\n found.push(polyglotSignal);\n return { type: 'fullstack', found };\n }\n\n // ─── 20. library — fallback (has main/exports but no bin) ──────────────\n if (pkg?.main && !pkg?.bin) {\n found.push('package.json main (no bin)');\n return { type: 'library', found };\n }\n\n // Default — bare repo with no classifying signals. The type is a\n // classification, not a slot: the file says it is the fallback (`# found:`),\n // and faf auto never writes slotignored over typed words on it.\n found.push(NO_CLASSIFYING_SIGNALS);\n return { type: 'library', found };\n}\n\n/** Detect the project type for slot mapping. Backward-compatible wrapper —\n * returns just the type string. New code should prefer\n * `detectProjectTypeWithRationale` to access the `#found` rationale. */\nexport function detectProjectType(dir: string): string {\n return detectProjectTypeWithRationale(dir).type;\n}\n\n/** Detect the runtime from a runtime file or manifest — `''` when there is\n * no evidence. */\nexport function detectRuntime(dir: string): string {\n if (repoExists(dir, 'bunfig.toml')) {return 'Bun';}\n if (repoExists(dir, 'deno.json') || repoExists(dir, 'deno.jsonc')) {return 'Deno';}\n if (readPackageJson(dir)) {return 'Node.js';}\n if (repoExists(dir, 'Cargo.toml')) {return 'Rust';}\n if (repoExists(dir, 'go.mod')) {return 'Go';}\n if (listRootCsprojs(dir).length > 0) {return '.NET';}\n if (repoExists(dir, 'pubspec.yaml')) {return 'Dart';}\n return '';\n}\n\n/** The JS package managers package.json's `packageManager` field names. */\nconst JS_PACKAGE_MANAGERS = new Set(['npm', 'pnpm', 'yarn', 'bun']);\n\n/** The package manager package.json's `packageManager` field declares\n * (`\"pnpm@9.1.0\"`, corepack's format) — `''` when it names none. */\nfunction declaredPackageManager(dir: string): string {\n const declared = (readPackageJson(dir) as { packageManager?: unknown } | null)?.packageManager;\n if (typeof declared !== 'string') {return '';}\n const name = /^([a-z]+)@/i.exec(declared.trim())?.[1]?.toLowerCase() ?? '';\n return JS_PACKAGE_MANAGERS.has(name) ? name : '';\n}\n\n/** The package manager a non-JS manifest implies, or `''`. */\nfunction manifestPackageManager(dir: string): string {\n if (repoExists(dir, 'pubspec.yaml')) {return 'pub';}\n if (repoExists(dir, 'go.mod')) {return 'go modules';}\n if (listRootCsprojs(dir).length > 0) {return 'NuGet';}\n if (repoExists(dir, 'pom.xml')) {return 'maven';}\n const gradle = ['build.gradle', 'build.gradle.kts', 'settings.gradle', 'settings.gradle.kts'];\n return gradle.some(f => repoExists(dir, f)) ? 'gradle' : '';\n}\n\n/** The JS package manager a committed lockfile names, or `''`. */\nconst LOCKFILES: ReadonlyArray<[file: string, manager: string]> = [\n ['bun.lockb', 'bun'], ['bun.lock', 'bun'], ['pnpm-lock.yaml', 'pnpm'], ['yarn.lock', 'yarn'], ['package-lock.json', 'npm'],\n];\n\n/** Detect the package manager from repo facts — a manifest that implies one,\n * package.json's `packageManager` field, then a lockfile. `''` when there is\n * no evidence: a package.json alone does not say which manager installs it. */\nexport function detectPackageManager(dir: string): string {\n return manifestPackageManager(dir) || declaredPackageManager(dir) || (LOCKFILES.find(([f]) => repoExists(dir, f))?.[1] ?? '');\n}\n\n/** Detect CI/CD */\nexport function detectCicd(dir: string): string | null {\n if (repoExists(dir, '.github/workflows')) {return 'GitHub Actions';}\n if (repoExists(dir, '.gitlab-ci.yml')) {return 'GitLab CI';}\n if (repoExists(dir, '.circleci')) {return 'CircleCI';}\n if (repoExists(dir, 'Jenkinsfile')) {return 'Jenkins';}\n return null;\n}\n\n/** Detect hosting platform — from a platform's own config file. A bare\n * Dockerfile is not one: it shows a container build, not where the app runs. */\nexport function detectHosting(dir: string): string | null {\n if (repoExists(dir, 'vercel.json')) {return 'Vercel';}\n if (repoExists(dir, 'netlify.toml')) {return 'Netlify';}\n if (repoExists(dir, 'wrangler.toml')) {return 'Cloudflare';}\n if (repoExists(dir, 'fly.toml')) {return 'Fly.io';}\n if (repoExists(dir, 'render.yaml')) {return 'Render';}\n return null;\n}\n\n/** Detect SvelteKit adapter from svelte.config.js */\nexport function detectSvelteAdapter(dir: string): string | null {\n const content = readRepoFile(dir, 'svelte.config.js');\n if (content === null) {return null;}\n // Match adapter imports: import adapter from '@sveltejs/adapter-vercel'\n // Or: import { adapter } from '@sveltejs/adapter-node'\n // Or: const adapter = require('@sveltejs/adapter-static')\n const adapterMatch = content.match(/@sveltejs\\/adapter-(\\w+)/);\n if (adapterMatch) {\n const adapter = adapterMatch[1];\n switch (adapter) {\n case 'vercel': return 'Vercel';\n case 'node': return 'Node';\n case 'static': return 'Static';\n case 'cloudflare': return 'Cloudflare';\n case 'netlify': return 'Netlify';\n case 'auto': return 'Auto';\n default: return adapter;\n }\n }\n return null;\n}\n\n/** Detect build tool */\nexport function detectBuildTool(dir: string): string | null {\n const pkg = readPackageJson(dir);\n if (pkg?.devDependencies?.vite || pkg?.dependencies?.vite) {return 'Vite';}\n if (pkg?.devDependencies?.webpack || pkg?.dependencies?.webpack) {return 'webpack';}\n if (pkg?.devDependencies?.esbuild || pkg?.dependencies?.esbuild) {return 'esbuild';}\n if (repoExists(dir, 'tsconfig.json') && pkg?.devDependencies?.typescript) {return 'TypeScript (tsc)';}\n return null;\n}\n\n/* ─── FAFB section helpers (top-level YAML keys read by compile_fafb) ───────\n *\n * These detect content for the FAFB binary's TECH_STACK, KEY_FILES, and\n * COMMANDS sections. ARCHITECTURE and CONTEXT are deliberately left empty\n * for user fill (architecture overlaps with human_context.how; context is\n * deliberately free-form additional signal beyond the 6Ws).\n */\n\n/** Detect a list of important file paths for the KEY_FILES FAFB section.\n * Returns up to ~10 entries, ordered by canonical importance. */\nexport function detectKeyFiles(dir: string): string[] {\n const candidates = [\n // Manifests\n 'package.json', 'Cargo.toml', 'pyproject.toml', 'go.mod',\n 'build.zig', 'build.zig.zon',\n // Entry points (TS/JS)\n 'src/index.ts', 'src/index.js', 'src/main.ts', 'src/cli.ts',\n // Entry points (Rust)\n 'src/main.rs', 'src/lib.rs',\n // Entry points (Zig)\n 'src/main.zig', 'src/root.zig',\n // Entry points (Python)\n 'src/__init__.py', 'main.py', '__main__.py',\n // Entry points (Go)\n 'main.go', 'cmd/main.go',\n // Specs / docs\n 'README.md', 'SPECIFICATION.md', 'BINARY-FORMAT.md',\n // Config\n 'tsconfig.json', 'wrangler.toml', 'vercel.json',\n ];\n return candidates.filter(f => repoExists(dir, f));\n}\n\n/** Detect build/test/lint commands for the COMMANDS FAFB section.\n * Returns a Record<string, string> mapping command name → shell command. */\nexport function detectCommands(dir: string, pkg: PackageJson | null): Record<string, string> {\n const commands: Record<string, string> = {};\n\n // From package.json scripts (most reliable)\n if (pkg?.scripts) {\n for (const key of ['build', 'test', 'lint', 'dev', 'start']) {\n if (pkg.scripts[key]) {\n // Determine the runner — prefer bun if available, else npm\n const runner = repoExists(dir, 'bun.lock') || repoExists(dir, 'bun.lockb')\n ? 'bun run'\n : 'npm run';\n commands[key] = `${runner} ${key}`;\n }\n }\n }\n\n // Rust: cargo builds and tests every Cargo package. Clippy only when the\n // repo configures it — a Cargo.toml alone does not say the project lints with it.\n if (repoExists(dir, 'Cargo.toml')) {\n if (!commands.build) {commands.build = 'cargo build --release';}\n if (!commands.test) {commands.test = 'cargo test';}\n if (!commands.lint && configuresClippy(dir)) {commands.lint = 'cargo clippy';}\n }\n\n // Zig: build.zig is `zig build`'s own script; `zig build test` only when\n // it defines a test step.\n if (repoExists(dir, 'build.zig')) {\n if (!commands.build) {commands.build = 'zig build';}\n if (!commands.test && /\\.step\\(\\s*\"test\"/.test(readText(dir, 'build.zig'))) {commands.test = 'zig build test';}\n }\n\n // Go: the go tool builds and tests every module.\n if (repoExists(dir, 'go.mod')) {\n if (!commands.build) {commands.build = 'go build ./...';}\n if (!commands.test) {commands.test = 'go test ./...';}\n }\n\n // Python: pytest only when the repo says pytest — a pyproject.toml alone\n // does not (unittest, nox and tox are as common).\n if (!commands.test && usesPytest(dir)) {commands.test = 'pytest';}\n\n return commands;\n}\n\n/** A file's text, or `''` when it cannot be read. */\nfunction readText(dir: string, name: string): string {\n return readRepoFile(dir, name) ?? '';\n}\n\n/** The repo configures Clippy: a clippy.toml, or a `[lints.clippy]` table in Cargo.toml. */\nfunction configuresClippy(dir: string): boolean {\n if (repoExists(dir, 'clippy.toml') || repoExists(dir, '.clippy.toml')) {return true;}\n return /^\\s*\\[(workspace\\.)?lints\\.clippy\\]/m.test(readText(dir, 'Cargo.toml'));\n}\n\n/** The repo says pytest: pytest.ini or conftest.py, or pytest named in\n * pyproject.toml, setup.cfg or tox.ini (its config table or a dependency). */\nfunction usesPytest(dir: string): boolean {\n if (repoExists(dir, 'pytest.ini') || repoExists(dir, 'conftest.py')) {return true;}\n return ['pyproject.toml', 'setup.cfg', 'tox.ini'].some(f => /\\bpytest\\b/.test(readText(dir, f)));\n}\n\n/** Detect a tech-stack list for the TECH_STACK FAFB section.\n * Combines language + frameworks + runtime into a flat list of strings\n * (matching the canonical xai-faf-rust project.faf shape). */\nexport function detectTechStack(\n dir: string,\n pkg: PackageJson | null,\n frameworks: DetectedFramework[],\n language: string,\n): string[] {\n const stack: string[] = [];\n\n // Language goes first\n if (language && language !== 'Unknown') {stack.push(language);}\n\n // Notable frameworks (frontend / backend / database / build)\n const notableCategories = new Set(['frontend', 'backend', 'database', 'build', 'css', 'state', 'monorepo']);\n for (const fw of frameworks) {\n if (notableCategories.has(fw.category)) {\n stack.push(fw.name);\n }\n }\n\n // Runtime if non-trivial (Node.js by default for JS — only call out Bun/Deno/etc.)\n if (repoExists(dir, 'bunfig.toml')) {stack.push('Bun');}\n else if (repoExists(dir, 'deno.json') || repoExists(dir, 'deno.jsonc')) {stack.push('Deno');}\n\n // Top deps from package.json/Cargo.toml — only if stack is still sparse\n if (stack.length < 3 && pkg?.dependencies) {\n const topDeps = Object.keys(pkg.dependencies).slice(0, 5);\n for (const dep of topDeps) {\n if (!stack.some(s => s.toLowerCase().includes(dep.toLowerCase()))) {\n stack.push(dep);\n }\n }\n }\n\n return stack;\n}\n",
|
|
113
113
|
"import type { FrameworkSignature } from '../core/types.js';\n\n/** Data-driven framework signatures — one scanner evaluates all */\nexport const FRAMEWORKS: FrameworkSignature[] = [\n // Frontend Frameworks\n { name: 'Next.js', slug: 'nextjs', category: 'frontend', signals: [\n { type: 'dependency', key: 'next' },\n { type: 'file', pattern: 'next.config.*' },\n ]},\n { name: 'React', slug: 'react', category: 'frontend', signals: [\n { type: 'dependency', key: 'react' },\n ]},\n { name: 'SvelteKit', slug: 'sveltekit', category: 'frontend', signals: [\n { type: 'dependency', key: '@sveltejs/kit' },\n { type: 'file', pattern: 'svelte.config.*' },\n ]},\n { name: 'Svelte', slug: 'svelte', category: 'frontend', signals: [\n { type: 'dependency', key: 'svelte' },\n { type: 'devDependency', key: 'svelte' },\n ]},\n { name: 'Vue.js', slug: 'vue', category: 'frontend', signals: [\n { type: 'dependency', key: 'vue' },\n ]},\n { name: 'Nuxt', slug: 'nuxt', category: 'frontend', signals: [\n { type: 'dependency', key: 'nuxt' },\n { type: 'file', pattern: 'nuxt.config.*' },\n ]},\n { name: 'Angular', slug: 'angular', category: 'frontend', signals: [\n { type: 'dependency', key: '@angular/core' },\n { type: 'file', pattern: 'angular.json' },\n ]},\n { name: 'Astro', slug: 'astro', category: 'frontend', signals: [\n { type: 'dependency', key: 'astro' },\n { type: 'file', pattern: 'astro.config.*' },\n ]},\n { name: 'Solid', slug: 'solid', category: 'frontend', signals: [\n { type: 'dependency', key: 'solid-js' },\n ]},\n { name: 'Remix', slug: 'remix', category: 'frontend', signals: [\n { type: 'dependency', key: '@remix-run/react' },\n ]},\n { name: 'Gatsby', slug: 'gatsby', category: 'frontend', signals: [\n { type: 'dependency', key: 'gatsby' },\n { type: 'file', pattern: 'gatsby-config.*' },\n ]},\n { name: 'Qwik', slug: 'qwik', category: 'frontend', signals: [\n { type: 'dependency', key: '@builder.io/qwik' },\n ]},\n\n // SvelteKit Adapters (hosting signal)\n { name: 'Vercel (SvelteKit)', slug: 'adapter-vercel', category: 'hosting', signals: [\n { type: 'dependency', key: '@sveltejs/adapter-vercel' },\n { type: 'devDependency', key: '@sveltejs/adapter-vercel' },\n ]},\n { name: 'Node (SvelteKit)', slug: 'adapter-node', category: 'hosting', signals: [\n { type: 'dependency', key: '@sveltejs/adapter-node' },\n { type: 'devDependency', key: '@sveltejs/adapter-node' },\n ]},\n { name: 'Static (SvelteKit)', slug: 'adapter-static', category: 'hosting', signals: [\n { type: 'dependency', key: '@sveltejs/adapter-static' },\n { type: 'devDependency', key: '@sveltejs/adapter-static' },\n ]},\n { name: 'Cloudflare (SvelteKit)', slug: 'adapter-cloudflare', category: 'hosting', signals: [\n { type: 'dependency', key: '@sveltejs/adapter-cloudflare' },\n { type: 'devDependency', key: '@sveltejs/adapter-cloudflare' },\n ]},\n { name: 'Netlify (SvelteKit)', slug: 'adapter-netlify', category: 'hosting', signals: [\n { type: 'dependency', key: '@sveltejs/adapter-netlify' },\n { type: 'devDependency', key: '@sveltejs/adapter-netlify' },\n ]},\n\n // CSS Frameworks\n { name: 'Tailwind CSS', slug: 'tailwind', category: 'css', signals: [\n { type: 'dependency', key: 'tailwindcss' },\n { type: 'devDependency', key: 'tailwindcss' },\n { type: 'file', pattern: 'tailwind.config.*' },\n ]},\n { name: 'Bootstrap', slug: 'bootstrap', category: 'css', signals: [\n { type: 'dependency', key: 'bootstrap' },\n ]},\n { name: 'Styled Components', slug: 'styled-components', category: 'css', signals: [\n { type: 'dependency', key: 'styled-components' },\n ]},\n\n // UI Libraries\n { name: 'shadcn/ui', slug: 'shadcn', category: 'ui', signals: [\n { type: 'file', pattern: 'components.json' },\n { type: 'dependency', key: '@radix-ui/react-dialog' },\n ]},\n { name: 'Material UI', slug: 'mui', category: 'ui', signals: [\n { type: 'dependency', key: '@mui/material' },\n ]},\n { name: 'Chakra UI', slug: 'chakra', category: 'ui', signals: [\n { type: 'dependency', key: '@chakra-ui/react' },\n ]},\n { name: 'Ant Design', slug: 'antd', category: 'ui', signals: [\n { type: 'dependency', key: 'antd' },\n ]},\n\n // State Management\n { name: 'Redux', slug: 'redux', category: 'state', signals: [\n { type: 'dependency', key: '@reduxjs/toolkit' },\n ]},\n { name: 'Zustand', slug: 'zustand', category: 'state', signals: [\n { type: 'dependency', key: 'zustand' },\n ]},\n { name: 'Jotai', slug: 'jotai', category: 'state', signals: [\n { type: 'dependency', key: 'jotai' },\n ]},\n { name: 'Pinia', slug: 'pinia', category: 'state', signals: [\n { type: 'dependency', key: 'pinia' },\n ]},\n\n // Backend Frameworks\n { name: 'Express', slug: 'express', category: 'backend', signals: [\n { type: 'dependency', key: 'express' },\n ]},\n { name: 'Fastify', slug: 'fastify', category: 'backend', signals: [\n { type: 'dependency', key: 'fastify' },\n ]},\n { name: 'Hono', slug: 'hono', category: 'backend', signals: [\n { type: 'dependency', key: 'hono' },\n ]},\n { name: 'Elysia', slug: 'elysia', category: 'backend', signals: [\n { type: 'dependency', key: 'elysia' },\n ]},\n { name: 'NestJS', slug: 'nestjs', category: 'backend', signals: [\n { type: 'dependency', key: '@nestjs/core' },\n ]},\n { name: 'Koa', slug: 'koa', category: 'backend', signals: [\n { type: 'dependency', key: 'koa' },\n ]},\n { name: 'Django', slug: 'django', category: 'backend', signals: [\n { type: 'file', pattern: 'manage.py' },\n { type: 'file', pattern: 'settings.py' },\n ]},\n // Content-aware — app.py/main.py alone ≠ Flask/FastAPI (generic entry-point\n // filenames; same false-positive shape as the Rails/Spring/Vapor kill lines\n // below). Verified live: gemini-faf-mcp's main.py is a Cloud Functions\n // entry point (functions-framework), not FastAPI — bare-file detection\n // misclassified it before this fix.\n { name: 'Flask', slug: 'flask', category: 'backend', signals: [\n { type: 'content', pattern: 'app.py', key: 'flask' },\n ]},\n { name: 'FastAPI', slug: 'fastapi', category: 'backend', signals: [\n { type: 'content', pattern: 'main.py', key: 'fastapi' },\n ]},\n // Content-aware — Gemfile alone ≠ Rails (Ruby Edition kill line).\n { name: 'Rails', slug: 'rails', category: 'backend', signals: [\n { type: 'content', pattern: 'Gemfile', key: 'rails' },\n { type: 'content', pattern: 'Gemfile.lock', key: 'rails (' },\n { type: 'file', pattern: 'config/application.rb' },\n { type: 'file', pattern: 'config/routes.rb' },\n ]},\n // Content-aware — pom.xml / build.gradle alone ≠ Spring Boot (JVM Edition kill line).\n // `content` signals require the needle in the file body (see matchSignal).\n { name: 'Spring Boot', slug: 'spring', category: 'backend', signals: [\n { type: 'content', pattern: 'pom.xml', key: 'spring-boot' },\n { type: 'content', pattern: 'build.gradle', key: 'springframework.boot' },\n { type: 'content', pattern: 'build.gradle.kts', key: 'springframework.boot' },\n { type: 'content', pattern: 'gradle/libs.versions.toml', key: 'springframework.boot' },\n ]},\n // Content-aware — Package.swift alone ≠ app / Vapor (Swift Edition kill line).\n { name: 'Vapor', slug: 'vapor', category: 'backend', signals: [\n { type: 'content', pattern: 'Package.swift', key: 'vapor/vapor' },\n { type: 'content', pattern: 'Package.swift', key: 'product(name: \"Vapor\"' },\n { type: 'content', pattern: 'Package.swift', key: \"product(name: 'Vapor'\" },\n { type: 'file', pattern: 'Sources/App/configure.swift' },\n ]},\n { name: 'Hummingbird', slug: 'hummingbird', category: 'backend', signals: [\n { type: 'content', pattern: 'Package.swift', key: 'hummingbird-project/hummingbird' },\n { type: 'content', pattern: 'Package.swift', key: 'product(name: \"Hummingbird\"' },\n { type: 'content', pattern: 'Package.swift', key: \"product(name: 'Hummingbird'\" },\n ]},\n\n // Databases\n { name: 'Prisma', slug: 'prisma', category: 'database', signals: [\n { type: 'dependency', key: 'prisma' },\n { type: 'devDependency', key: 'prisma' },\n { type: 'file', pattern: 'prisma/schema.prisma' },\n ]},\n { name: 'Drizzle', slug: 'drizzle', category: 'database', signals: [\n { type: 'dependency', key: 'drizzle-orm' },\n { type: 'file', pattern: 'drizzle.config.*' },\n ]},\n { name: 'TypeORM', slug: 'typeorm', category: 'database', signals: [\n { type: 'dependency', key: 'typeorm' },\n ]},\n { name: 'Mongoose', slug: 'mongoose', category: 'database', signals: [\n { type: 'dependency', key: 'mongoose' },\n ]},\n\n // Build Tools\n { name: 'Vite', slug: 'vite', category: 'build', signals: [\n { type: 'dependency', key: 'vite' },\n { type: 'devDependency', key: 'vite' },\n { type: 'file', pattern: 'vite.config.*' },\n ]},\n { name: 'webpack', slug: 'webpack', category: 'build', signals: [\n { type: 'dependency', key: 'webpack' },\n { type: 'devDependency', key: 'webpack' },\n { type: 'file', pattern: 'webpack.config.*' },\n ]},\n { name: 'esbuild', slug: 'esbuild', category: 'build', signals: [\n { type: 'dependency', key: 'esbuild' },\n { type: 'devDependency', key: 'esbuild' },\n ]},\n { name: 'Turbopack', slug: 'turbopack', category: 'build', signals: [\n { type: 'file', pattern: 'turbo.json' },\n ]},\n\n // Testing\n { name: 'Jest', slug: 'jest', category: 'testing', signals: [\n { type: 'devDependency', key: 'jest' },\n { type: 'file', pattern: 'jest.config.*' },\n ]},\n { name: 'Vitest', slug: 'vitest', category: 'testing', signals: [\n { type: 'devDependency', key: 'vitest' },\n ]},\n { name: 'Playwright', slug: 'playwright', category: 'testing', signals: [\n { type: 'devDependency', key: '@playwright/test' },\n { type: 'file', pattern: 'playwright.config.*' },\n ]},\n { name: 'Cypress', slug: 'cypress', category: 'testing', signals: [\n { type: 'devDependency', key: 'cypress' },\n { type: 'file', pattern: 'cypress.config.*' },\n ]},\n\n // Monorepo Tools\n { name: 'Turborepo', slug: 'turborepo', category: 'monorepo', signals: [\n { type: 'devDependency', key: 'turbo' },\n { type: 'file', pattern: 'turbo.json' },\n ]},\n { name: 'Nx', slug: 'nx', category: 'monorepo', signals: [\n { type: 'devDependency', key: 'nx' },\n { type: 'file', pattern: 'nx.json' },\n ]},\n { name: 'Lerna', slug: 'lerna', category: 'monorepo', signals: [\n { type: 'devDependency', key: 'lerna' },\n { type: 'file', pattern: 'lerna.json' },\n ]},\n\n // MCP / AI\n { name: 'MCP SDK', slug: 'mcp', category: 'ai', signals: [\n { type: 'dependency', key: '@modelcontextprotocol/sdk' },\n ]},\n { name: 'Anthropic SDK', slug: 'anthropic', category: 'ai', signals: [\n { type: 'dependency', key: '@anthropic-ai/sdk' },\n ]},\n { name: 'OpenAI SDK', slug: 'openai', category: 'ai', signals: [\n { type: 'dependency', key: 'openai' },\n ]},\n { name: 'LangChain', slug: 'langchain', category: 'ai', signals: [\n { type: 'dependency', key: 'langchain' },\n ]},\n\n // Hosting / Deploy\n { name: 'Vercel', slug: 'vercel', category: 'hosting', signals: [\n { type: 'file', pattern: 'vercel.json' },\n ]},\n { name: 'Netlify', slug: 'netlify', category: 'hosting', signals: [\n { type: 'file', pattern: 'netlify.toml' },\n ]},\n { name: 'Docker', slug: 'docker', category: 'hosting', signals: [\n { type: 'file', pattern: 'Dockerfile' },\n { type: 'file', pattern: 'docker-compose.yml' },\n ]},\n { name: 'Cloudflare Workers', slug: 'cloudflare', category: 'hosting', signals: [\n { type: 'file', pattern: 'wrangler.toml' },\n { type: 'dependency', key: 'wrangler' },\n ]},\n\n // CI/CD\n { name: 'GitHub Actions', slug: 'github-actions', category: 'cicd', signals: [\n { type: 'file', pattern: '.github/workflows/*.yml' },\n ]},\n\n // Commander (CLI indicator)\n { name: 'Commander.js', slug: 'commander', category: 'cli', signals: [\n { type: 'dependency', key: 'commander' },\n ]},\n];\n",
|
|
114
114
|
"import type { FafData, SlotDef } from '../core/types.js';\nimport { SLOTS, appTypeUsesSlot } from '../core/slots.js';\nimport { FAF_VERSION } from '../core/version.js';\nimport {\n detectFrameworks,\n detectLanguage,\n detectPolyglotLanguage,\n detectSubdirStacks,\n detectProjectTypeWithRationale,\n detectRuntime,\n detectPackageManager,\n detectCicd,\n detectHosting,\n detectBuildTool,\n detectSvelteAdapter,\n readPackageJson,\n detectKeyFiles,\n detectCommands,\n detectTechStack,\n} from './scanner.js';\n\n/** The major version of the `svelte` dependency package.json names\n * (`^5.0.0` → 5), or NaN when it names none or no number. */\nfunction svelteMajor(pkg: ReturnType<typeof readPackageJson>): number {\n const range = pkg?.dependencies?.svelte ?? pkg?.devDependencies?.svelte;\n const major = typeof range === 'string' ? /\\d+/.exec(range)?.[0] : undefined;\n return major === undefined ? NaN : Number(major);\n}\n\n/** Detect the project stack from repo facts and build .faf data. A slot with\n * no evidence is left empty (`''`) — never a default. */\nexport function detectStack(dir: string): FafData {\n return detectStackWithFacts(dir).data;\n}\n\n/**\n * {@link detectStack}'s data, and `facts`: the repo's fact for every stack\n * slot (by field — `runtime`, `database`), whatever the app-type — `''` when\n * the repo shows none. detectStack marks a slot its detected type leaves out\n * `slotignored`; `faf auto` fills such a slot from `facts` when the file's own\n * type uses it (a `backend` project whose repo reads as a CLI still gets\n * `runtime: Go` from go.mod).\n */\nexport function detectStackWithFacts(dir: string): { data: FafData; facts: Record<string, string> } {\n const pkg = readPackageJson(dir);\n const frameworks = detectFrameworks(dir);\n const detection = detectProjectTypeWithRationale(dir);\n const projectType = detection.type;\n // Polyglot repos (real stack in sibling dirs) get an aggregated language\n // string instead of the misleading root-only detectLanguage() fallback.\n const isPolyglot = detection.found.some(f => f.startsWith('polyglot:'));\n const language = (isPolyglot && detectPolyglotLanguage(dir)) || detectLanguage(dir);\n const runtime = detectRuntime(dir);\n const pkgManager = detectPackageManager(dir);\n const cicd = detectCicd(dir);\n const hosting = detectHosting(dir);\n const buildTool = detectBuildTool(dir);\n\n // Find specific frameworks by category\n const frontendFw = frameworks.find(f => f.category === 'frontend');\n const cssFw = frameworks.find(f => f.category === 'css');\n const uiFw = frameworks.find(f => f.category === 'ui');\n const stateFw = frameworks.find(f => f.category === 'state');\n const backendFw = frameworks.find(f => f.category === 'backend');\n const dbFw = frameworks.find(f => f.category === 'database');\n\n // Which slots the app-type uses (an unknown type reads as library)\n const uses = (slot: SlotDef): boolean => appTypeUsesSlot(projectType, slot) ?? appTypeUsesSlot('library', slot) === true;\n\n // Framework sub-type detection (framework → svelte, framework → nextjs, etc.)\n const isFramework = projectType === 'framework';\n const hasSvelteSignal = frameworks.some(f => f.slug === 'svelte' || f.slug === 'sveltekit');\n const frameworkSubType = isFramework && hasSvelteSignal ? 'svelte' : (isFramework ? null : null);\n\n // Svelte-aware: fires for svelte apps AND framework→svelte repos\n const isSvelte = projectType === 'svelte' || frameworkSubType === 'svelte';\n const svelteAdapter = isSvelte ? detectSvelteAdapter(dir) : null;\n const hasSvelteKit = isSvelte && frameworks.some(f => f.slug === 'sveltekit');\n\n // The repo's fact for each stack slot, whatever the app-type ('' when none).\n const facts: Record<string, string> = {};\n const stackSlots = SLOTS.filter(s => s.path.startsWith('stack.'));\n\n for (const slot of stackSlots) {\n const field = slot.path.replace('stack.', '');\n // Detected values (Svelte-aware overrides applied inline)\n switch (field) {\n case 'frontend': facts[field] = frontendFw?.name ?? ''; break;\n case 'css_framework': facts[field] = cssFw?.name ?? ''; break;\n case 'ui_library': facts[field] = uiFw?.name ?? ''; break;\n case 'state_management':\n // Svelte 5 uses Runes — no external state library needed. Only when\n // package.json says Svelte 5 or later: Svelte 4 has no Runes.\n facts[field] = stateFw?.name ?? (isSvelte && svelteMajor(pkg) >= 5 ? 'Runes' : '');\n break;\n case 'backend':\n // SvelteKit IS the backend (server routes, form actions, hooks)\n facts[field] = isSvelte ? (hasSvelteKit ? 'SvelteKit' : (backendFw?.name ?? '')) : (backendFw?.name ?? '');\n break;\n case 'api_type':\n // SvelteKit uses form actions + server routes\n facts[field] = hasSvelteKit ? 'Server Routes' : '';\n break;\n case 'runtime': facts[field] = runtime; break;\n case 'database':\n // Only populate if ORM actually detected\n facts[field] = dbFw?.name ?? '';\n break;\n case 'connection':\n facts[field] = dbFw?.name ?? '';\n break;\n case 'hosting':\n // Svelte adapter → hosting platform (adapter-vercel = Vercel, etc.)\n if (isSvelte && svelteAdapter) {\n facts[field] = svelteAdapter;\n } else {\n facts[field] = hosting ?? '';\n }\n break;\n case 'build':\n // SvelteKit always builds with Vite; plain Svelte only when the repo says so\n facts[field] = hasSvelteKit ? 'Vite' : (buildTool ?? '');\n break;\n case 'cicd': facts[field] = cicd ?? ''; break;\n case 'package_manager': facts[field] = pkgManager; break;\n default: facts[field] = ''; break;\n }\n }\n\n // Build stack with slotignored for the slots the app-type leaves out\n // (a framework repo also leaves out the slots framework source code never\n // has — see appTypeUsesSlot)\n const stack: Record<string, string> = {};\n for (const slot of stackSlots) {\n const field = slot.path.replace('stack.', '');\n stack[field] = uses(slot) ? facts[field] : 'slotignored';\n }\n\n // Build monorepo section\n const monorepo: Record<string, string> = {};\n const monorepoSlots = SLOTS.filter(s => s.path.startsWith('monorepo.'));\n for (const slot of monorepoSlots) {\n const field = slot.path.replace('monorepo.', '');\n if (!uses(slot)) {\n monorepo[field] = 'slotignored';\n } else {\n monorepo[field] = '';\n }\n }\n\n // Build project section\n const project: Record<string, string> = {\n name: pkg?.name ?? dir.split('/').pop() ?? 'project',\n // A polyglot repo's root package.json describes the tooling shell, not the\n // product — leave goal for the README interrogator / the human to fill.\n goal: isPolyglot ? '' : (pkg?.description ?? ''),\n main_language: language,\n type: projectType,\n };\n if (isFramework && frameworkSubType) {\n project.framework = frameworkSubType;\n }\n\n // FAFB top-level sections (read by faf-rust-sdk's compile_fafb).\n // Without these, every cli-generated .fafb is META-only.\n // Per v6.6.md + faf-auto-no-guess-no-slop:\n // tech_stack/key_files/commands auto-populate from observable signals;\n // architecture/context stay empty (user fill — architecture overlaps with\n // human_context.how, context is free-form additional signal).\n // Feed detectTechStack the ROOT language (a single token), never the polyglot\n // summary string — that belongs only in project.main_language.\n const techStack = detectTechStack(dir, pkg, frameworks, isPolyglot ? detectLanguage(dir) : language);\n if (isPolyglot) {\n // Add each sibling component's language + top framework (deduped, order-stable).\n for (const s of detectSubdirStacks(dir)) {\n for (const t of [s.language, s.topFramework]) {\n if (t && !techStack.includes(t)) {techStack.push(t);}\n }\n }\n }\n const keyFiles = detectKeyFiles(dir);\n const commands = detectCommands(dir, pkg);\n\n const result: FafData = {\n faf_version: FAF_VERSION,\n project,\n stack,\n human_context: {\n who: '',\n // A polyglot root's package.json describes the tooling shell, not the\n // product — leave `what` for the README interrogator / the human.\n what: isPolyglot ? '' : (pkg?.description ?? ''),\n why: '',\n where: '',\n when: '',\n how: '',\n },\n monorepo,\n // Runtime-only meta. Stripped before YAML serialization by writeFaf,\n // which uses _meta.found to inject `# found: <list>` next to `type:`.\n // Glass Hood doctrine — the user sees WHY the cli classified as it did.\n _meta: { found: detection.found },\n };\n\n // Only emit FAFB top-level keys if non-empty (no slop / empty-list pollution)\n if (techStack.length > 0) {result.tech_stack = techStack;}\n if (keyFiles.length > 0) {result.key_files = keyFiles;}\n if (Object.keys(commands).length > 0) {result.commands = commands;}\n\n return { data: result, facts };\n}\n",
|
|
115
|
-
"/**\n * README.md interrogation — extract slot content from semantic markdown anchors.\n *\n * Per faf-auto-no-guess-no-slop:\n * Each extractor looks for a specific anchor (heading, structural pattern).\n * If the anchor is missing or the content fails validation → return undefined.\n * No slot is synthesized from another slot's content.\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { type ExtractedContext, isValidExtraction } from './types.js';\n\n/** Strip badge / image lines + blank lines from the top of a README */\nfunction stripPreamble(content: string): string {\n const lines = content.split('\\n');\n let i = 0;\n // Skip the title line (first H1) and any blank/badge lines after it\n while (i < lines.length && /^(#\\s|$)/.test(lines[i].trim())) {i++;}\n while (i < lines.length) {\n const line = lines[i].trim();\n // Badge lines: [](url) — image links inside markdown links\n if (/^\\[!\\[/.test(line)) { i++; continue; }\n // Standalone images: \n if (/^!\\[/.test(line)) { i++; continue; }\n // HTML img tags\n if (/^<img\\s/i.test(line)) { i++; continue; }\n // Blank lines\n if (line === '') { i++; continue; }\n break;\n }\n return lines.slice(i).join('\\n');\n}\n\n/** Get the first prose paragraph (single block, no headings/lists/code) */\nfunction firstProseParagraph(content: string): string | null {\n const stripped = stripPreamble(content);\n const lines = stripped.split('\\n');\n const buf: string[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n if (line === '') {\n if (buf.length > 0) {break;}\n continue;\n }\n // Stop at next heading / list / code / quote / table\n if (/^(#|>|```|---|\\||\\s*[-*+]\\s|\\d+\\.\\s)/.test(line)) {break;}\n // Skip pure-bold-tagline lines like \"**For Grok. For the rockets.**\"\n // (these are punchy spirit lines, not informative goal content)\n if (/^\\*\\*[^*]+\\*\\*\\s*$/.test(line) && buf.length === 0) {continue;}\n buf.push(line);\n }\n if (buf.length === 0) {return null;}\n return buf.join(' ').trim();\n}\n\n/** Extract content following a heading whose text matches `pattern` */\nfunction sectionContent(content: string, pattern: RegExp): string | null {\n const lines = content.split('\\n');\n let i = 0;\n while (i < lines.length) {\n const line = lines[i].trim();\n const m = line.match(/^(#{1,6})\\s+(.+)$/);\n if (m && pattern.test(m[2])) {\n const headingLevel = m[1].length;\n // Read prose lines until next heading of same-or-higher level\n const buf: string[] = [];\n i++;\n while (i < lines.length) {\n const next = lines[i].trim();\n const nextHeading = next.match(/^(#{1,6})\\s+/);\n if (nextHeading && nextHeading[1].length <= headingLevel) {break;}\n if (next === '') { if (buf.length > 0) {break;} i++; continue; }\n // Stop at structural elements (code blocks, lists, tables)\n if (/^(>|```|---|\\||\\s*[-*+]\\s|\\d+\\.\\s)/.test(next)) {break;}\n buf.push(next);\n i++;\n }\n if (buf.length === 0) {return null;}\n return buf.join(' ').trim();\n }\n i++;\n }\n return null;\n}\n\n/** Extract `project.goal` — first prose paragraph or ## Use Case / ## Goal */\nexport function extractGoal(content: string): string | undefined {\n // Anchor 1: explicit \"## Use Case\" / \"## Use Cases\" / \"## Goal\" section\n const explicit = sectionContent(content, /^(use\\s+cases?|goal)\\b/i);\n if (explicit && isValidExtraction(explicit)) {return explicit;}\n\n // Anchor 2: first prose paragraph after title/badges\n const tagline = firstProseParagraph(content);\n if (tagline && isValidExtraction(tagline)) {return tagline;}\n\n return undefined;\n}\n\n/** Extract `human_context.what` — ## About / ## Description / ## Overview */\nexport function extractWhat(content: string): string | undefined {\n const text = sectionContent(content, /^(about|description|overview|what(\\s+is\\s+this)?)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Extract `human_context.who` — ## Audience / ## For Whom / ## Users */\nexport function extractWho(content: string): string | undefined {\n const text = sectionContent(content, /^(audience|users?|for\\s+whom|who(\\s+is\\s+this\\s+for)?)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Extract `human_context.why` — ## Why / ## Motivation / ## Problem */\nexport function extractWhy(content: string): string | undefined {\n const text = sectionContent(content, /^(why|motivation|problem|rationale)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Extract `human_context.where` — ## Deployment / ## Where it runs / ## Install */\nexport function extractWhere(content: string): string | undefined {\n // Prefer specific \"where it runs\" / \"deployment\" over generic \"install\"\n const specific = sectionContent(content, /^(deployment|where(\\s+it\\s+runs)?|hosting)\\b/i);\n if (specific && isValidExtraction(specific)) {return specific;}\n return undefined;\n}\n\n/** Extract `human_context.when` — ## Status / ## History / \"Production since\" */\nexport function extractWhen(content: string): string | undefined {\n const text = sectionContent(content, /^(status|history|timeline|since|launched)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Extract `human_context.how` — ## Architecture / ## How it works / ## Approach */\nexport function extractHow(content: string): string | undefined {\n const text = sectionContent(content, /^(architecture|how(\\s+it\\s+works)?|approach|design)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Read README.md and extract per-slot content. Returns {} if no README. */\nexport function interrogateReadme(dir: string): ExtractedContext {\n const candidates = ['README.md', 'README.MD', 'Readme.md', 'readme.md'];\n let path: string | null = null;\n for (const name of candidates) {\n const full = join(dir, name);\n if (existsSync(full)) { path = full; break; }\n }\n if (!path) {return {};}\n\n let content: string;\n try {\n content = readFileSync(path, 'utf-8');\n } catch {\n return {};\n }\n // HTML comment blocks (asset notes, TODO markers, marketing briefs) are not\n // prose — strip before any extraction so their text can't seed a slot.\n content = content.replace(/<!--[\\s\\S]*?-->/g, '');\n\n const result: ExtractedContext = {};\n\n const goal = extractGoal(content);\n if (goal) {result.project = { goal };}\n\n const human: NonNullable<ExtractedContext['human_context']> = {};\n const what = extractWhat(content); if (what) {human.what = what;}\n const who = extractWho(content); if (who) {human.who = who;}\n const why = extractWhy(content); if (why) {human.why = why;}\n const where = extractWhere(content); if (where) {human.where = where;}\n const when = extractWhen(content); if (when) {human.when = when;}\n const how = extractHow(content); if (how) {human.how = how;}\n\n if (Object.keys(human).length > 0) {result.human_context = human;}\n\n return result;\n}\n",
|
|
116
115
|
"/**\n * Repo interrogation — extract slot content from README, Cargo.toml,\n * package.json, etc., without guessing or substituting generic slop.\n *\n * Contract (per faf-auto-no-guess-no-slop doctrine):\n * - Each slot has a per-slot evidence anchor\n * - If the anchor is missing → leave empty (do NOT synthesize from other slots)\n * - If the anchor is present but content is generic / too long / structural →\n * leave empty (do NOT settle for slop)\n * - Empty is honest; wrong is a lie\n *\n * Per goal-is-not-a-6w doctrine:\n * - `project.goal` is the elevator pitch / use case — its own anchor\n * - Each `human_context.*` 6W has its own anchor\n * - No slot inherits from / is split-extracted from another\n */\n\n/** Content extracted from a single source file (README, Cargo.toml, etc.) */\nexport interface ExtractedContext {\n project?: {\n /** One-line elevator pitch / use case. README first prose paragraph,\n * ## Use Case section, or Cargo.toml description. */\n goal?: string;\n };\n human_context?: {\n /** Audience — \"## Audience\" / \"for {audience}\" patterns */\n who?: string;\n /** What's being built — \"## About\" / \"## Description\" / \"X is...\" */\n what?: string;\n /** Motivation — \"## Why\" / \"## Motivation\" / \"Problem:\" */\n why?: string;\n /** Where it runs — \"## Deployment\" / \"## Where\" / install-target */\n where?: string;\n /** Status / timeline — \"## Status\" / \"Production since\" / version line */\n when?: string;\n /** Approach — \"## Architecture\" / \"## How it works\" */\n how?: string;\n };\n /** Stack facts pulled from real config files (docker-compose services, …).\n * Higher-precedence than README prose or presence-only guesses for these. */\n stack?: {\n database?: string;\n cache?: string;\n search?: string;\n storage?: string;\n hosting?: string;\n runtime?: string;\n };\n /** Real project commands from Makefile / justfile / Taskfile targets. */\n commands?: Record<string, string>;\n /** Secrets handling — from .env.example / .env.sample presence. */\n security?: {\n secrets?: string;\n example?: string;\n };\n}\n\n/** Confidence threshold rules for extracted text — empty if violated */\nexport const EXTRACTION_LIMITS = {\n /** Minimum length for a slot to be considered worth filling (in chars) */\n MIN_LENGTH: 8,\n /** Maximum length — anything longer is documentation, not a slot fill */\n MAX_LENGTH: 280,\n} as const;\n\n/** Generic slop patterns — extracted text matching these is rejected */\nexport const SLOP_PATTERNS: readonly RegExp[] = [\n /^(see|see\\s+the?)\\s+readme/i,\n /^(tbd|todo|fixme|coming\\s+soon)\\b/i,\n /^(software|application|app|project|tool|library|framework)\\.?$/i,\n /^(for\\s+users|for\\s+developers)\\.?$/i,\n /^(description|goal|name|title)\\.?$/i,\n /^lorem\\s+ipsum/i,\n /^example(\\s+\\w+)?\\.?$/i,\n];\n\n/** Validate extracted text against the no-guess/no-slop doctrine */\nexport function isValidExtraction(text: string): boolean {\n const trimmed = text.trim();\n if (trimmed.length < EXTRACTION_LIMITS.MIN_LENGTH) {return false;}\n if (trimmed.length > EXTRACTION_LIMITS.MAX_LENGTH) {return false;}\n if (SLOP_PATTERNS.some((re) => re.test(trimmed))) {return false;}\n // Reject if text is mostly markdown structure (links, lists, tables)\n if (/^[\\s|\\-*+]/.test(trimmed)) {return false;}\n if (trimmed.split('\\n').length > 4) {return false;} // multi-paragraph blob\n return true;\n}\n",
|
|
117
|
-
"/**\n *
|
|
118
|
-
"/**\n *
|
|
119
|
-
"/**\n *
|
|
120
|
-
"/**\n *
|
|
116
|
+
"/**\n * README.md interrogation — extract slot content from semantic markdown anchors.\n *\n * Per faf-auto-no-guess-no-slop:\n * Each extractor looks for a specific anchor (heading, structural pattern).\n * If the anchor is missing or the content fails validation → return undefined.\n * No slot is synthesized from another slot's content.\n */\n\nimport { readRepoFile, repoExists } from '../core/safe-write.js';\nimport { type ExtractedContext, isValidExtraction } from './types.js';\n\n/** Strip badge / image lines + blank lines from the top of a README */\nfunction stripPreamble(content: string): string {\n const lines = content.split('\\n');\n let i = 0;\n // Skip the title line (first H1) and any blank/badge lines after it\n while (i < lines.length && /^(#\\s|$)/.test(lines[i].trim())) {i++;}\n while (i < lines.length) {\n const line = lines[i].trim();\n // Badge lines: [](url) — image links inside markdown links\n if (/^\\[!\\[/.test(line)) { i++; continue; }\n // Standalone images: \n if (/^!\\[/.test(line)) { i++; continue; }\n // HTML img tags\n if (/^<img\\s/i.test(line)) { i++; continue; }\n // Blank lines\n if (line === '') { i++; continue; }\n break;\n }\n return lines.slice(i).join('\\n');\n}\n\n/** Get the first prose paragraph (single block, no headings/lists/code) */\nfunction firstProseParagraph(content: string): string | null {\n const stripped = stripPreamble(content);\n const lines = stripped.split('\\n');\n const buf: string[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n if (line === '') {\n if (buf.length > 0) {break;}\n continue;\n }\n // Stop at next heading / list / code / quote / table\n if (/^(#|>|```|---|\\||\\s*[-*+]\\s|\\d+\\.\\s)/.test(line)) {break;}\n // Skip pure-bold-tagline lines like \"**For Grok. For the rockets.**\"\n // (these are punchy spirit lines, not informative goal content)\n if (/^\\*\\*[^*]+\\*\\*\\s*$/.test(line) && buf.length === 0) {continue;}\n buf.push(line);\n }\n if (buf.length === 0) {return null;}\n return buf.join(' ').trim();\n}\n\n/** Extract content following a heading whose text matches `pattern` */\nfunction sectionContent(content: string, pattern: RegExp): string | null {\n const lines = content.split('\\n');\n let i = 0;\n while (i < lines.length) {\n const line = lines[i].trim();\n const m = line.match(/^(#{1,6})\\s+(.+)$/);\n if (m && pattern.test(m[2])) {\n const headingLevel = m[1].length;\n // Read prose lines until next heading of same-or-higher level\n const buf: string[] = [];\n i++;\n while (i < lines.length) {\n const next = lines[i].trim();\n const nextHeading = next.match(/^(#{1,6})\\s+/);\n if (nextHeading && nextHeading[1].length <= headingLevel) {break;}\n if (next === '') { if (buf.length > 0) {break;} i++; continue; }\n // Stop at structural elements (code blocks, lists, tables)\n if (/^(>|```|---|\\||\\s*[-*+]\\s|\\d+\\.\\s)/.test(next)) {break;}\n buf.push(next);\n i++;\n }\n if (buf.length === 0) {return null;}\n return buf.join(' ').trim();\n }\n i++;\n }\n return null;\n}\n\n/** Extract `project.goal` — first prose paragraph or ## Use Case / ## Goal */\nexport function extractGoal(content: string): string | undefined {\n // Anchor 1: explicit \"## Use Case\" / \"## Use Cases\" / \"## Goal\" section\n const explicit = sectionContent(content, /^(use\\s+cases?|goal)\\b/i);\n if (explicit && isValidExtraction(explicit)) {return explicit;}\n\n // Anchor 2: first prose paragraph after title/badges\n const tagline = firstProseParagraph(content);\n if (tagline && isValidExtraction(tagline)) {return tagline;}\n\n return undefined;\n}\n\n/** Extract `human_context.what` — ## About / ## Description / ## Overview */\nexport function extractWhat(content: string): string | undefined {\n const text = sectionContent(content, /^(about|description|overview|what(\\s+is\\s+this)?)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Extract `human_context.who` — ## Audience / ## For Whom / ## Users */\nexport function extractWho(content: string): string | undefined {\n const text = sectionContent(content, /^(audience|users?|for\\s+whom|who(\\s+is\\s+this\\s+for)?)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Extract `human_context.why` — ## Why / ## Motivation / ## Problem */\nexport function extractWhy(content: string): string | undefined {\n const text = sectionContent(content, /^(why|motivation|problem|rationale)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Extract `human_context.where` — ## Deployment / ## Where it runs / ## Install */\nexport function extractWhere(content: string): string | undefined {\n // Prefer specific \"where it runs\" / \"deployment\" over generic \"install\"\n const specific = sectionContent(content, /^(deployment|where(\\s+it\\s+runs)?|hosting)\\b/i);\n if (specific && isValidExtraction(specific)) {return specific;}\n return undefined;\n}\n\n/** Extract `human_context.when` — ## Status / ## History / \"Production since\" */\nexport function extractWhen(content: string): string | undefined {\n const text = sectionContent(content, /^(status|history|timeline|since|launched)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Extract `human_context.how` — ## Architecture / ## How it works / ## Approach */\nexport function extractHow(content: string): string | undefined {\n const text = sectionContent(content, /^(architecture|how(\\s+it\\s+works)?|approach|design)\\b/i);\n if (text && isValidExtraction(text)) {return text;}\n return undefined;\n}\n\n/** Read README.md and extract per-slot content. Returns {} if no README. */\nexport function interrogateReadme(dir: string): ExtractedContext {\n const candidates = ['README.md', 'README.MD', 'Readme.md', 'readme.md'];\n let path: string | null = null;\n for (const name of candidates) {\n if (repoExists(dir, name)) { path = name; break; }\n }\n if (!path) {return {};}\n\n let content = readRepoFile(dir, path);\n if (content === null) {return {};}\n // HTML comment blocks (asset notes, TODO markers, marketing briefs) are not\n // prose — strip before any extraction so their text can't seed a slot.\n content = content.replace(/<!--[\\s\\S]*?-->/g, '');\n\n const result: ExtractedContext = {};\n\n const goal = extractGoal(content);\n if (goal) {result.project = { goal };}\n\n const human: NonNullable<ExtractedContext['human_context']> = {};\n const what = extractWhat(content); if (what) {human.what = what;}\n const who = extractWho(content); if (who) {human.who = who;}\n const why = extractWhy(content); if (why) {human.why = why;}\n const where = extractWhere(content); if (where) {human.where = where;}\n const when = extractWhen(content); if (when) {human.when = when;}\n const how = extractHow(content); if (how) {human.how = how;}\n\n if (Object.keys(human).length > 0) {result.human_context = human;}\n\n return result;\n}\n",
|
|
117
|
+
"/**\n * Cargo.toml interrogation — extract Rust project metadata.\n *\n * The [package].description field is the Rust ecosystem's equivalent of\n * package.json's `description` — a one-line elevator pitch. It maps to\n * `project.goal` (overarching/use-case framing).\n */\n\nimport { readRepoFile } from '../core/safe-write.js';\nimport { type ExtractedContext, isValidExtraction } from './types.js';\n\n/** Parse a single TOML field from `[package]` table. Naive but adequate for\n * description / authors / repository / license — fields that don't span\n * multiple lines or use complex nested structures. */\nfunction readPackageField(content: string, field: string): string | null {\n const lines = content.split('\\n');\n let inPackageSection = false;\n for (const line of lines) {\n const trimmed = line.trim();\n // Section header\n if (/^\\[/.test(trimmed)) {\n inPackageSection = trimmed === '[package]';\n continue;\n }\n if (!inPackageSection) {continue;}\n // Match `field = \"value\"` or `field=\"value\"`\n const m = trimmed.match(new RegExp(`^${field}\\\\s*=\\\\s*(.+)$`));\n if (m) {\n let value = m[1].trim();\n // Strip trailing comment\n value = value.replace(/\\s*#.*$/, '').trim();\n // Strip surrounding quotes (double or single)\n const quoted = value.match(/^\"((?:[^\"\\\\]|\\\\.)*)\"$/) || value.match(/^'((?:[^'\\\\]|\\\\.)*)'$/);\n if (quoted) {return quoted[1];}\n return value;\n }\n }\n return null;\n}\n\n/** Read Cargo.toml and extract per-slot content. Returns {} if no Cargo.toml. */\nexport function interrogateCargo(dir: string): ExtractedContext {\n const content = readRepoFile(dir, 'Cargo.toml');\n if (content === null) {return {};}\n\n const description = readPackageField(content, 'description');\n if (description && isValidExtraction(description)) {\n return { project: { goal: description } };\n }\n\n return {};\n}\n",
|
|
118
|
+
"/**\n * docker-compose interrogation — the services a repo runs ARE its stack.\n *\n * A polyglot / platform repo declares Postgres, Redis, ClickHouse, MinIO, Kafka…\n * in compose and nowhere the root-only detectors look. We read the `image:` lines\n * (naive regex — same style as cargo.ts's TOML reader) and map well-known infra\n * images onto stack slots. Facts, not prose — so these win over README guesses.\n */\n\nimport { join } from 'path';\nimport { readRepoDir, readRepoFile } from '../core/safe-write.js';\nimport type { ExtractedContext } from './types.js';\n\n/** image name (before ':' tag, after last '/') → { slot, label }. */\nconst IMAGE_MAP: Array<{ re: RegExp; slot: 'database' | 'cache' | 'search' | 'storage' | 'runtime'; label: string }> = [\n { re: /^postgres|postgis|pgvector/, slot: 'database', label: 'PostgreSQL' },\n { re: /^mysql/, slot: 'database', label: 'MySQL' },\n { re: /^mariadb/, slot: 'database', label: 'MariaDB' },\n { re: /^mongo/, slot: 'database', label: 'MongoDB' },\n { re: /clickhouse/, slot: 'database', label: 'ClickHouse' },\n { re: /^cockroach/, slot: 'database', label: 'CockroachDB' },\n { re: /^redis|^valkey/, slot: 'cache', label: 'Redis' },\n { re: /^memcached/, slot: 'cache', label: 'Memcached' },\n { re: /elasticsearch/, slot: 'search', label: 'Elasticsearch' },\n { re: /opensearch/, slot: 'search', label: 'OpenSearch' },\n { re: /meilisearch/, slot: 'search', label: 'Meilisearch' },\n { re: /typesense/, slot: 'search', label: 'Typesense' },\n { re: /qdrant/, slot: 'search', label: 'Qdrant (vector)' },\n { re: /weaviate/, slot: 'search', label: 'Weaviate (vector)' },\n { re: /^minio/, slot: 'storage', label: 'MinIO (S3-compatible)' },\n { re: /localstack/, slot: 'storage', label: 'LocalStack (AWS)' },\n { re: /rabbitmq/, slot: 'runtime', label: 'RabbitMQ' },\n { re: /kafka/, slot: 'runtime', label: 'Kafka' },\n { re: /nats/, slot: 'runtime', label: 'NATS' },\n { re: /temporalio\\/|temporal-server|temporal:/, slot: 'runtime', label: 'Temporal' },\n];\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'vendor', 'target', 'e2e', 'tests', 'test',\n]);\n\n/** Every compose file at root + one directory deep (paths relative to `dir`). */\nfunction findComposeFiles(dir: string): string[] {\n const out: string[] = [];\n const scan = (d: string, depth: number): void => {\n for (const e of readRepoDir(dir, d) ?? []) {\n if (e.isFile() && /^(docker-)?compose.*\\.ya?ml$/i.test(e.name)) {out.push(join(d, e.name));}\n else if (e.isDirectory() && depth > 0 && !e.name.startsWith('.') && !IGNORE_DIRS.has(e.name)) {\n scan(join(d, e.name), depth - 1);\n }\n }\n };\n scan('.', 1);\n return out;\n}\n\n/** Join distinct labels for a slot: \"PostgreSQL · ClickHouse\". */\nfunction joinSlot(labels: Set<string>): string {\n return [...labels].join(' · ');\n}\n\n/** Read every compose file and map service images onto stack slots. */\nexport function interrogateCompose(dir: string): ExtractedContext {\n const files = findComposeFiles(dir);\n if (files.length === 0) {return {};}\n\n const found: Record<string, Set<string>> = {\n database: new Set(), cache: new Set(), search: new Set(), storage: new Set(), runtime: new Set(),\n };\n\n for (const file of files) {\n const body = readRepoFile(dir, file);\n if (body === null) {continue;}\n for (const m of body.matchAll(/^\\s*image:\\s*[\"']?([^\\s\"'#]+)/gm)) {\n const ref = m[1].toLowerCase();\n // strip registry host + tag: ghcr.io/foo/redis:7-alpine → redis\n const name = ref.replace(/:[^/]*$/, '').split('/').pop() ?? ref;\n const hostAndName = ref.replace(/:[^/]*$/, ''); // keep owner for temporalio/ etc.\n for (const { re, slot, label } of IMAGE_MAP) {\n if (re.test(name) || re.test(hostAndName)) {found[slot].add(label);}\n }\n }\n }\n\n const stack: NonNullable<ExtractedContext['stack']> = {};\n if (found.database.size) {stack.database = joinSlot(found.database);}\n if (found.cache.size) {stack.cache = joinSlot(found.cache);}\n if (found.search.size) {stack.search = joinSlot(found.search);}\n if (found.storage.size) {stack.storage = joinSlot(found.storage);}\n if (found.runtime.size) {stack.runtime = `Docker Compose (${joinSlot(found.runtime)})`;}\n if (Object.keys(stack).length === 0 && !found.runtime.size) {\n // compose present but no recognised infra — still a real hosting fact\n return { stack: { hosting: 'Docker Compose' } };\n }\n stack.hosting = 'Docker Compose';\n return { stack };\n}\n",
|
|
119
|
+
"/**\n * Makefile / justfile / Taskfile interrogation — the real project commands.\n *\n * `detectCommands` in scanner.ts only reads root package.json scripts + language\n * defaults. Many repos (esp. polyglot ones) drive test/build/lint through a\n * Makefile — `make test`, `make check-all`. Read the target names and map the\n * obvious ones. Facts from files, not README prose.\n */\n\nimport { join } from 'path';\nimport { readRepoDir, readRepoFile, repoExists, withRepoRoot } from '../core/safe-write.js';\nimport type { ExtractedContext } from './types.js';\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'vendor', 'target', 'e2e', 'docs', 'scripts',\n]);\n\ninterface BuildFile {\n file: string;\n runner: string;\n /** extract target names from the file body */\n targets: (body: string) => string[];\n}\n\nconst BUILD_FILES: BuildFile[] = [\n {\n file: 'Makefile',\n runner: 'make',\n // `target:` at column 0, not `.PHONY` / pattern rules / variables\n targets: (b) => [...b.matchAll(/^([a-zA-Z][\\w-]*)\\s*:(?!=)/gm)].map(m => m[1]),\n },\n {\n file: 'justfile',\n runner: 'just',\n targets: (b) => [...b.matchAll(/^([a-zA-Z][\\w-]*)\\s*(?:\\([^)]*\\))?\\s*:/gm)].map(m => m[1]),\n },\n {\n file: 'Taskfile.yml',\n runner: 'task',\n targets: (b) => {\n const i = b.indexOf('tasks:');\n if (i === -1) {return [];}\n return [...b.slice(i).matchAll(/^\\s{2}([a-zA-Z][\\w-]*):/gm)].map(m => m[1]);\n },\n },\n];\n\n/** Pick the best target for a command slot, preferring the more complete one. */\nfunction pick(targets: string[], patterns: RegExp[]): string | null {\n for (const p of patterns) {\n const hit = targets.find(t => p.test(t));\n if (hit) {return hit;}\n }\n return null;\n}\n\n/** Root, then each depth-1 subdir (so a nested `backend/Makefile` is found). */\nfunction buildFileDirs(dir: string): string[] {\n const dirs = [dir];\n for (const e of readRepoDir(dir) ?? []) { // unreadable: root only\n if (e.isDirectory() && !e.name.startsWith('.') && !IGNORE_DIRS.has(e.name)) {\n dirs.push(join(dir, e.name));\n }\n }\n return dirs;\n}\n\n/** Does `d` look like the primary backend/app dir? (raises its command priority) */\nfunction looksPrimary(d: string): number {\n let s = 0;\n if (repoExists(d, 'manage.py') || repoExists(d, 'pyproject.toml') || repoExists(d, 'Gemfile')) {s += 3;}\n if (/(?:^|\\/)(backend|api|server|core|app)$/.test(d)) {s += 2;}\n return s;\n}\n\nexport function interrogateBuildFiles(dir: string): ExtractedContext {\n // The project folder bounds the subfolder reads: a nested Makefile may link\n // anywhere inside the project, never out of it.\n return withRepoRoot(dir, () => buildFileContext(dir));\n}\n\nfunction buildFileContext(dir: string): ExtractedContext {\n const candidates: Array<{ score: number; commands: Record<string, string> }> = [];\n\n for (const scanDir of buildFileDirs(dir)) {\n const isRoot = scanDir === dir;\n const prefix = isRoot ? '' : `cd ${scanDir.slice(dir.length + 1)} && `;\n for (const bf of BUILD_FILES) {\n const body = readRepoFile(scanDir, bf.file);\n if (body === null) {continue;}\n const targets = bf.targets(body);\n if (targets.length === 0) {continue;}\n\n const commands: Record<string, string> = {};\n const test = pick(targets, [/^test$/i, /^tests$/i, /test-all/i, /^test-unit/i, /^test/i]);\n const build = pick(targets, [/^build$/i, /^compile$/i, /^build/i]);\n const lint = pick(targets, [/^check-all$/i, /^check$/i, /^lint$/i, /^lint/i, /^fmt$/i, /^format$/i]);\n if (test) {commands.test = `${prefix}${bf.runner} ${test}`;}\n if (build) {commands.build = `${prefix}${bf.runner} ${build}`;}\n if (lint) {commands.lint = `${prefix}${bf.runner} ${lint}`;}\n if (Object.keys(commands).length === 0) {continue;}\n\n candidates.push({\n score: Object.keys(commands).length + (isRoot ? 10 : looksPrimary(scanDir)),\n commands,\n });\n }\n }\n\n const best = candidates.sort((a, b) => b.score - a.score)[0];\n return best ? { commands: best.commands } : {};\n}\n",
|
|
120
|
+
"/**\n * .env.example interrogation — where secrets live.\n *\n * A repo that ships `.env.example` (or `.env.sample`) is telling you: secrets go\n * in `.env`, this file is the template. Fills `security.secrets` + `.example`.\n */\n\nimport { repoExists } from '../core/safe-write.js';\nimport type { ExtractedContext } from './types.js';\n\nconst CANDIDATES = [\n '.env.example', '.env.sample', '.env.template', '.env.dist',\n 'env.example', '.env.local.example',\n];\n\nexport function interrogateEnv(dir: string): ExtractedContext {\n for (const rel of CANDIDATES) {\n if (repoExists(dir, rel)) {\n return { security: { secrets: '.env', example: rel } };\n }\n }\n return {};\n}\n",
|
|
121
121
|
"/**\n * Repo interrogation orchestrator — runs all extractors and merges results.\n *\n * Two classes of extractor:\n * - PROSE (README, Cargo.toml description) → `project.goal` + `human_context`.\n * README wins on overlap because its prose is most likely hand-curated.\n * - FILE-FACTS (docker-compose services, Makefile targets, .env.example) →\n * `stack.*` + `commands.*` + `security.*`. These are ground truth pulled\n * straight from config — they win over README guesses and over the\n * presence-only detectors in scanner.ts (wired in assemble.ts).\n *\n * The orchestrator never overwrites with a non-empty value — earlier extractors\n * win; later ones fill empties only.\n */\n\nimport type { ExtractedContext } from './types.js';\nimport { interrogateReadme } from './readme.js';\nimport { interrogateCargo } from './cargo.js';\nimport { interrogateCompose } from './compose.js';\nimport { interrogateBuildFiles } from './build-files.js';\nimport { interrogateEnv } from './env.js';\n\nexport type { ExtractedContext } from './types.js';\nexport { interrogateReadme } from './readme.js';\nexport { interrogateCargo } from './cargo.js';\nexport { interrogateCompose } from './compose.js';\nexport { interrogateBuildFiles } from './build-files.js';\nexport { interrogateEnv } from './env.js';\n\n/** Merge `b` into `a` — only fill empties in `a`, never overwrite. */\nfunction mergeFillEmpty(a: ExtractedContext, b: ExtractedContext): ExtractedContext {\n const out: ExtractedContext = {\n project: { ...(b.project ?? {}), ...(a.project ?? {}) },\n human_context: { ...(b.human_context ?? {}), ...(a.human_context ?? {}) },\n stack: { ...(b.stack ?? {}), ...(a.stack ?? {}) },\n commands: { ...(b.commands ?? {}), ...(a.commands ?? {}) },\n security: { ...(b.security ?? {}), ...(a.security ?? {}) },\n };\n // Strip empty sub-objects for clean equality semantics.\n for (const k of ['project', 'human_context', 'stack', 'commands', 'security'] as const) {\n if (out[k] && Object.keys(out[k] as object).length === 0) {delete out[k];}\n }\n return out;\n}\n\n/** Run all repo interrogators and return merged context. */\nexport function interrogateRepo(dir: string): ExtractedContext {\n return [\n interrogateReadme(dir), // prose — highest precedence for goal + 6Ws\n interrogateCargo(dir),\n interrogateCompose(dir), // file-facts — stack.*\n interrogateBuildFiles(dir), // file-facts — commands.*\n interrogateEnv(dir), // file-facts — security.*\n ].reduce(mergeFillEmpty, {} as ExtractedContext);\n}\n",
|
|
122
|
-
"/**\n * Words typed into a slot — a typed None / N/A / not applicable, or any other\n * placeholder word (`unknown`, `\"null\"`) — are an empty slot: they score 0\n * until filled. The app-type alone decides which slots count, and\n * `slotignored` comes only from the app-type — typed words never take a slot\n * out. So `faf score` and `faf auto` say, one line per slot, where typed\n * words still sit, and never show a slot the app-type needs as
|
|
123
|
-
"/**\n * Shared .faf assembly pipeline. The full slot-filling flow used to build a\n * FRESH .faf for a directory:\n * detect → interrogate → slotignore inactive categories → Turbo-Cat → Relentless\n *\n * Used by BOTH `faf auto` (new-file path) and `faf git` (cloned repo) so they\n * can't drift — `faf git` previously ran detectStack alone (~33% vs ~75%).\n */\n\nimport { detectStack, detectStackWithFacts } from './stack.js';\nimport { interrogateRepo } from '../interrogate/index.js';\nimport { turboCatSlots } from './turbo-cat.js';\nimport { relentlessContext } from './relentless.js';\nimport {\n APP_TYPE_CATEGORIES,\n NO_CLASSIFYING_SIGNALS,\n SLOTS,\n SLOT_BY_PATH,\n SLOTIGNORED,\n appTypeUsesSlot,\n isPlaceholder,\n isTypedWords,\n} from '../core/slots.js';\nimport type { SlotDef } from '../core/types.js';\nimport { asFafMapping, isMapping } from '../core/shape.js';\nimport { carryFafSource, fafSourceOf, markAsFill } from '../core/faf-source.js';\nimport { typeIsFallback } from '../core/typed-none.js';\n\n/** Build a fresh .faf for `dir` using the full slot-filling pipeline. */\nexport function assembleFreshFaf(dir: string): Record<string, unknown> {\n const detected = detectStack(dir) as Record<string, unknown>;\n const facts = interrogateRepo(dir);\n\n // File-facts (stack / commands / security — docker-compose, Makefile, .env)\n // are ground truth: they WIN over detectStack's root-only presence guesses.\n const factLayer: Record<string, unknown> = {};\n if (facts.stack) {factLayer.stack = facts.stack;}\n if (facts.commands) {factLayer.commands = facts.commands;}\n if (facts.security) {factLayer.security = facts.security;}\n // Prose (goal / 6Ws — README, Cargo.toml) fills empties only.\n const proseLayer: Record<string, unknown> = {};\n if (facts.project) {proseLayer.project = facts.project;}\n if (facts.human_context) {proseLayer.human_context = facts.human_context;}\n\n const seeded = fillEmpties(fillEmpties(factLayer, detected), proseLayer);\n applySlotIgnore(seeded);\n // Polyglot repos: the root package.json is a tooling shell — don't let its\n // description/scripts seed the product's 6Ws.\n const found = (detected._meta as { found?: string[] } | undefined)?.found ?? [];\n const toolingRoot = found.some(f => f.startsWith('polyglot:'));\n const withFormats = fillEmpties(seeded, turboCatSlots(dir) as Record<string, unknown>);\n return fillEmpties(withFormats, { human_context: relentlessContext(dir, { toolingRoot }) } as Record<string, unknown>);\n}\n\n/**\n * Update an EXISTING .faf for `dir`. Existing values win; interrogated → detected\n * → Turbo-Cat (formats) → Relentless (6 W's) fill only the remaining empties.\n * This is exactly the chain `faf auto` runs on an existing file — exported so\n * consumers (faf-mcp's faf_auto) compose it instead of re-deriving it and\n * drifting (they used to merge assembleFreshFaf's slotignore'd output over the\n * existing file, losing interrogated facts such as a docker-compose Redis).\n *\n * Shape: `existing` must be a mapping (an empty document, null, reads as `{}`);\n * a scalar or a list throws rather than being spread into character keys. A\n * non-null scalar `project:` (older writers stored `project: <name>`) is lifted\n * to `{ name: String(value) }`, so the name is kept and the rest can be filled.\n *\n * Words typed into a slot — a typed none (`None` / `N/A` / `not applicable`)\n * or any other placeholder word (`unknown`, `\"null\"`), any case — are an\n * empty slot: they score 0 until filled.\n * - In a tech slot (every slot but the 6Ws) a repo fact fills it: \"if it's\n * a fact, fill the slot\". With no fact the words stay exactly as the file\n * has them, comment included; faf never writes `''` over them.\n * - In a tech slot the file's app-type (`project.type`) leaves out, the\n * app-type's decision is the fact: with no repo fact, the slot becomes\n * `slotignored` (shown as N/A) in place of the words, an empty value or a\n * placeholder. A real value there is kept. `slotignored` comes only from\n * the app-type — in a slot the app-type uses, it is never written, even\n * when detection reads the repo as another type; such a slot gets the\n * repo's fact for it instead (`runtime: Go` from go.mod), or keeps what\n * it had. A `project.type` faf does not know decides nothing, and neither\n * does the `library` detection falls back to when the repo has no\n * classifying signal.\n * - In a 6W (`human_context.*`) the words are the person's: auto never\n * replaces them (`faf go` asks).\n * A slot that says `slotignored` under either of its names (`stack.db` for\n * `stack.database`) gets no detected value under either. A slot the file\n * names only by its Mk4 name (`stack.db`) keeps that name: faf adds no\n * on-wire twin (`stack.database`), and a repo fact fills the name the file\n * uses.\n *\n * The result is marked as a fill: writeFaf leaves a node with an anchor that\n * an alias reads as written (`frontend: &x None` with `ui_library: *x`) —\n * filling it would change every alias — and reports it like a kept alias.\n */\nexport function updateExistingFaf(dir: string, existing: Record<string, unknown>): Record<string, unknown> {\n const base = liftScalarProject(asFafMapping(existing, 'updateExistingFaf: the existing .faf'));\n const { data, facts } = detectStackWithFacts(dir);\n const detected = data as Record<string, unknown>;\n const withInterrogated = fillEmpties(base, interrogateRepo(dir) as Record<string, unknown>);\n const merged = fillEmpties(withInterrogated, detected);\n const withFormats = fillEmpties(merged, turboCatSlots(dir) as Record<string, unknown>);\n const filled = useFileSlotNames(fillEmpties(withFormats, { human_context: relentlessContext(dir) } as Record<string, unknown>), base);\n const decided = scoredNamesInStep(appTypeIsFact(existing, base, detected)\n ? applyAppType(keepNotApplicable(filled, base), base, facts)\n : keepNotApplicable(filled, base), base);\n // The result is the read `existing` came from, filled: writeFaf checks it\n // against that read, so an edit made while detection ran is never written over.\n return markAsFill(carryFafSource(existing, decided));\n}\n\n/** True when the app-type the filled file will declare is a fact: a type the\n * file names (unless its line carries faf's `# found: no classifying signals\n * — fallback` note, as the `library` faf fell back to does), or one detection\n * fills in from a classifying signal. faf's fallback decides no slot, on\n * this run or a later one. */\nfunction appTypeIsFact(existing: Record<string, unknown>, base: Record<string, unknown>, detected: Record<string, unknown>): boolean {\n if (!isPlaceholder(fieldAt(base, 'project.type'))) {\n const text = fafSourceOf(existing)?.text;\n return text === undefined || !typeIsFallback(text);\n }\n const found = (detected._meta as { found?: string[] } | undefined)?.found ?? [];\n return !found.includes(NO_CLASSIFYING_SIGNALS);\n}\n\n/** The places a slot can live: its on-wire path and its Mk4 canonical name. */\nfunction slotLocations(slot: SlotDef): string[] {\n return slot.canonical ? [slot.path, slot.canonical] : [slot.path];\n}\n\n/** `section.field` of a .faf data object (every slot path has two parts). */\nfunction fieldAt(data: Record<string, unknown>, path: string): unknown {\n const [section, field] = path.split('.');\n const s = data[section];\n return isMapping(s) ? s[field] : undefined;\n}\n\n/** Set (or, with `undefined`, remove) `section.field`, copying the section so\n * the caller's objects are never changed. Setting the value the field\n * already holds leaves the section as it is (no copy, no change for the\n * merge to see). */\nfunction putField(data: Record<string, unknown>, path: string, value: unknown): void {\n const [section, field] = path.split('.');\n const s = data[section];\n if (!isMapping(s)) {return;}\n if (value === undefined ? !(field in s) : s[field] === value) {return;}\n const copy = { ...s };\n if (value === undefined) {\n delete copy[field];\n } else {\n copy[field] = value;\n }\n data[section] = copy;\n}\n\n/** `slotignored`: the app-type leaves the slot out. Typed words are not this. */\nconst isSlotIgnored = (v: unknown): boolean => typeof v === 'string' && v.trim() === SLOTIGNORED;\n\n/** True when `base` says `slotignored` under one of the slot's names and\n * holds no real value under any of them. */\nfunction decidedNotApplicable(base: Record<string, unknown>, locs: string[]): boolean {\n const values = locs.map(loc => fieldAt(base, loc));\n return values.some(isSlotIgnored) && values.every(v => isPlaceholder(v) || isSlotIgnored(v));\n}\n\n/** After filling: a slot `base` marks `slotignored` gets no detected value\n * under any of its names — each keeps exactly what `base` had there. Only\n * `slotignored` is kept this way; typed words are an empty slot, and a fact\n * fills it (see fillEmpties). */\nfunction keepNotApplicable(filled: Record<string, unknown>, base: Record<string, unknown>): Record<string, unknown> {\n const out = { ...filled };\n for (const slot of SLOTS) {\n const locs = slotLocations(slot);\n if (!decidedNotApplicable(base, locs)) {continue;}\n for (const loc of locs) {\n const before = fieldAt(base, loc);\n if (fieldAt(out, loc) !== before) {putField(out, loc, before);}\n }\n }\n return out;\n}\n\n/** True when `data` has a key at `section.field` (whatever its value). */\nfunction hasField(data: Record<string, unknown>, path: string): boolean {\n const [section, field] = path.split('.');\n const s = data[section];\n return isMapping(s) && Object.prototype.hasOwnProperty.call(s, field);\n}\n\n/** A slot the file names only by its Mk4 name (`stack.db`, not\n * `stack.database`) keeps that one name: the on-wire twin the fill added is\n * taken out again, and a repo fact it carried fills the Mk4 name when that\n * holds no real value (empty, or typed words) — \"if it's a fact, fill the\n * slot\", under the name the file uses. */\nfunction useFileSlotNames(filled: Record<string, unknown>, base: Record<string, unknown>): Record<string, unknown> {\n const out = { ...filled };\n for (const slot of SLOTS) {\n if (!slot.canonical || !hasField(base, slot.canonical) || hasField(base, slot.path)) {continue;}\n const twin = fieldAt(out, slot.path);\n putField(out, slot.path, undefined);\n const own = fieldAt(out, slot.canonical);\n if (isFact(twin) && isPlaceholder(own)) {putField(out, slot.canonical, twin);}\n }\n return out;\n}\n\n/** The scoring kernel reads a slot under its on-wire name (`stack.database`),\n * never its Mk4 name (`stack.db`). When the file names a slot only by its\n * Mk4 name, faf keeps the on-wire name in step with it — a repo fact or\n * `slotignored` — so the score counts what the file says. faf adds that\n * key; the file's own line is left as the steps above decided. A Mk4 name\n * that still holds no real value (empty, or typed words) adds nothing: the\n * slot is empty under either name. */\nfunction scoredNamesInStep(decided: Record<string, unknown>, base: Record<string, unknown>): Record<string, unknown> {\n const out = { ...decided };\n for (const slot of SLOTS) {\n if (!slot.canonical || !hasField(base, slot.canonical) || hasField(base, slot.path)) {continue;}\n const own = fieldAt(out, slot.canonical);\n if (isFact(own) || isSlotIgnored(own)) {putField(out, slot.path, own);}\n }\n return out;\n}\n\n/** The file's app-type decides which tech slots count (after filling, so a\n * type detection filled in counts too; a type faf does not know decides\n * nothing):\n * - a slot it leaves out that holds no real value under either of its\n * names — only empty values, placeholders or typed words — becomes\n * `slotignored`, under each of the slot's names the file has (or its\n * on-wire name when it has neither);\n * - a slot it uses never takes `slotignored` from detection (which may have\n * read the repo as another type): it gets the repo's fact for it from\n * `facts` (detection's fact for every stack slot, whatever the type), or\n * keeps what `base` had there (`''` when `base` had nothing). A\n * `slotignored` of the file's own stays. */\nfunction applyAppType(filled: Record<string, unknown>, base: Record<string, unknown>, facts: Record<string, string> = {}): Record<string, unknown> {\n const project = filled.project;\n const type = isMapping(project) ? project.type : undefined;\n const out = { ...filled };\n for (const slot of SLOTS) {\n if (slot.category === 'human' || slot.category === 'project') {continue;}\n const uses = appTypeUsesSlot(type, slot);\n if (uses === null) {return filled;}\n if (uses) {\n keepUsedSlot(out, base, slot, slot.path.startsWith('stack.') ? facts[slot.path.slice('stack.'.length)] : undefined);\n } else {\n markLeftOutSlot(out, slot);\n }\n }\n return out;\n}\n\n/** A slot the app-type uses takes no `slotignored` from detection: each name\n * of it gets back what `base` had there (`''` when it had nothing). Then,\n * when the repo has a fact for the slot (`fact`, detection's value whatever\n * the type) and the slot holds no real value under any of its names, each\n * name the file has that holds none — empty, or typed words, never the\n * file's own `slotignored` — gets the fact (the on-wire name when it has\n * neither): \"if it's a fact, fill the slot\". */\nfunction keepUsedSlot(out: Record<string, unknown>, base: Record<string, unknown>, slot: SlotDef, fact: string | undefined): void {\n const locs = slotLocations(slot);\n for (const loc of locs) {\n if (isSlotIgnored(fieldAt(out, loc)) && !isSlotIgnored(fieldAt(base, loc))) {\n putField(out, loc, hasField(base, loc) ? fieldAt(base, loc) : '');\n }\n }\n if (!isFact(fact)) {return;}\n const present = locs.filter(loc => hasField(out, loc));\n if (present.some(loc => !isPlaceholder(fieldAt(out, loc)))) {return;} // a real value (or the file's slotignored) stays\n for (const loc of present.length > 0 ? present : [slot.path]) {putField(out, loc, fact);}\n}\n\n/** A slot the app-type leaves out, with no real value under either of its\n * names, becomes `slotignored` under each name the file has (or its on-wire\n * name when it has neither). A real value there is kept. */\nfunction markLeftOutSlot(out: Record<string, unknown>, slot: SlotDef): void {\n const present = slotLocations(slot).filter(loc => hasField(out, loc));\n const real = (loc: string): boolean => !isPlaceholder(fieldAt(out, loc)) && !isSlotIgnored(fieldAt(out, loc));\n if (present.some(real)) {return;}\n for (const loc of present.length > 0 ? present : [slot.path]) {\n if (isPlaceholder(fieldAt(out, loc))) {putField(out, loc, SLOTIGNORED);}\n }\n}\n\n/** `project: <scalar>` → `project: { name: String(value) }`. A list is left as it is\n * (fillEmpties never descends into or spreads a list). Returns a new object. */\nfunction liftScalarProject(data: Record<string, unknown>): Record<string, unknown> {\n const project = data.project;\n if (project === null || project === undefined || isMapping(project) || Array.isArray(project)) {return data;}\n return { ...data, project: { name: String(project) } };\n}\n\n/** Mark slots outside the app-type's active categories as `slotignored`. */\nfunction applySlotIgnore(seeded: Record<string, unknown>): void {\n const projectType = (seeded.project as { type?: string } | undefined)?.type ?? 'library';\n const activeCategories = APP_TYPE_CATEGORIES[projectType] || APP_TYPE_CATEGORIES.library;\n for (const slot of SLOTS) {\n if (activeCategories.includes(slot.category)) {continue;}\n const [section, field] = slot.path.split('.');\n if (section === 'stack' && seeded.stack) {\n (seeded.stack as Record<string, string>)[field] = 'slotignored';\n }\n if (section === 'monorepo' && seeded.monorepo) {\n (seeded.monorepo as Record<string, string>)[field] = 'slotignored';\n }\n }\n}\n\n/** Fill empty slots in `target` with values from `source`. `target` wins\n * when its slot is non-empty. Empty here is '', null, undefined, an empty\n * list or mapping — this is what lets interrogated/detected values overwrite\n * the empty-string defaults that detectStack writes to human_context.\n *\n * Typed words — a typed none (`None`, `N/A`, `not applicable`) or any other\n * placeholder word (`unknown`, `\"null\"`), any case — are an empty slot, but\n * only a fact replaces them: in a tech slot (every slot but the 6Ws, under\n * either of its names) a source value that is real content — not empty, not\n * a placeholder, not `slotignored` — fills it. Anything else leaves the\n * words exactly as they are: no fact, a 6W (`human_context.*`, the\n * person's), or a place that is not a slot.\n *\n * A `_meta` the target already carries (the user's own) is never filled\n * over: faf's runtime `_meta` from `source` is merged only into a target\n * without one. */\nexport function fillEmpties(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n return fillAt(target, source, '');\n}\n\n/** A tech slot: any slot but the 6Ws, under its path or its canonical name. */\nfunction isTechSlot(path: string): boolean {\n const slot = SLOT_BY_PATH.get(path);\n return slot !== undefined && slot.category !== 'human';\n}\n\n/** A value the repo gave for a slot: real content. Not empty, not a\n * placeholder or typed words, and not `slotignored` (the app-type's word,\n * never a fact about the repo). */\nfunction isFact(value: unknown): boolean {\n if (typeof value === 'number' || typeof value === 'boolean') {return true;}\n return typeof value === 'string' && value.trim() !== '' && !isPlaceholder(value) && !isSlotIgnored(value);\n}\n\n/** True when `value` may replace typed words at `path`: a fact, in a tech slot. */\nfunction factFillsTypedNone(path: string, value: unknown): boolean {\n return isTechSlot(path) && isFact(value);\n}\n\nfunction fillAt(target: Record<string, unknown>, source: Record<string, unknown>, prefix: string): Record<string, unknown> {\n const result = { ...target };\n for (const [key, value] of Object.entries(source)) {\n const existing = result[key];\n const path = prefix ? `${prefix}.${key}` : key;\n if (path === '_meta' && existing !== undefined) {continue;}\n if (isTypedWords(existing)) {\n // Typed words are an empty slot: a fact fills a tech slot; otherwise the words stay.\n if (factFillsTypedNone(path, value)) {result[key] = value;}\n continue;\n }\n if (isPlaceholder(existing)) {\n result[key] = value;\n } else if (isMapping(value) && isMapping(existing)) {\n result[key] = fillAt(existing, value, path);\n }\n }\n return result;\n}\n",
|
|
122
|
+
"/**\n * Words typed into a slot — a typed None / N/A / not applicable, or any other\n * placeholder word (`unknown`, `\"null\"`) — are an empty slot: they score 0\n * until filled. The app-type alone decides which slots count, and\n * `slotignored` comes only from the app-type — typed words never take a slot\n * out. So `faf score` and `faf auto` say, one line per slot, where typed\n * words still sit, and never show a slot the app-type needs as slotignored.\n */\nimport { isScalar, parseDocument } from 'yaml';\nimport { APP_TYPE_CATEGORIES, NO_CLASSIFYING_SIGNALS, SLOTS, appTypeUsesSlot, isTypedWords } from './slots.js';\nimport { isMapping } from './shape.js';\nimport type { ScoreResult } from './types.js';\n\n/** `section.field` of a parsed .faf (every slot path has two parts). */\nfunction valueAt(data: Record<string, unknown>, path: string): unknown {\n const [section, field] = path.split('.');\n const s = data[section];\n return isMapping(s) ? s[field] : undefined;\n}\n\n/** True when the .faf text's `project.type` line carries faf's\n * `# found: no classifying signals — fallback` note: the type is the\n * `library` detection fell back to, not a fact, and decides no slot. */\nexport function typeIsFallback(text: string): boolean {\n try {\n const node = parseDocument(text, { logLevel: 'error' }).getIn(['project', 'type'], true);\n return isScalar(node) && typeof node.comment === 'string' && node.comment.includes(NO_CLASSIFYING_SIGNALS);\n } catch {\n return false;\n }\n}\n\n/** The line for one slot that holds typed words, by whether the app-type\n * uses it (null: the type decides nothing — read as a library, the second\n * kind of line never given), or null for no line. */\nfunction hintFor(path: string, words: string, uses: boolean | null, inLibrary: boolean, outOfType: boolean): string | null {\n if (uses === true || (uses === null && inLibrary)) {\n return `${path} says '${words}' — this app-type needs it, so it counts as empty until filled.`;\n }\n if (uses === false && outOfType) {\n return `${path} says '${words}' — this app-type doesn't use it; faf auto marks it slotignored.`;\n }\n return null;\n}\n\n/** The .faf text as a mapping, or null when it does not parse to one (no\n * warnings printed). */\nfunction mappingOf(yaml: string): Record<string, unknown> | null {\n try {\n const doc = parseDocument(yaml, { logLevel: 'error' });\n if (doc.errors.length > 0) {return null;}\n const data: unknown = doc.toJS();\n return isMapping(data) ? data : null;\n } catch {\n return null;\n }\n}\n\n/** Which hint lines {@link typedNoneHints} gives. */\nexport interface TypedNoneHintOptions {\n /** Also give the line for a slot the app-type leaves out (default true).\n * `faf auto` passes false: by then it has marked those slots. */\n outOfType?: boolean;\n}\n\n/**\n * One line for each slot that `result` scores as empty and that holds typed\n * words, by the file's app-type (`project.type`):\n * - a slot the app-type needs:\n * `<slot> says '<words>' — this app-type needs it, so it counts as empty until filled.`\n * - a slot the app-type leaves out (before `faf auto` has run):\n * `<slot> says '<words>' — this app-type doesn't use it; faf auto marks it slotignored.`\n * A file whose type faf does not know, or whose type is the `library`\n * detection fell back to (see {@link typeIsFallback}), gives the first line\n * for the slots a library needs (as faf's detection reads such a file) and no\n * second line. Reads `yaml` only; nothing is written. YAML that does not parse\n * to a mapping gives no lines.\n */\nexport function typedNoneHints(yaml: string, result: Pick<ScoreResult, 'slots'>, opts: TypedNoneHintOptions = {}): string[] {\n const data = mappingOf(yaml);\n if (data === null) {return [];}\n const type = isMapping(data.project) && !typeIsFallback(yaml) ? data.project.type : undefined;\n const lines: string[] = [];\n for (const slot of SLOTS) {\n const value = valueAt(data, slot.path);\n if (result.slots[slot.path] !== 'empty' || !isTypedWords(value)) {continue;}\n const inLibrary = APP_TYPE_CATEGORIES.library.includes(slot.category);\n const line = hintFor(slot.path, String(value).trim(), appTypeUsesSlot(type, slot), inLibrary, opts.outOfType !== false);\n if (line !== null) {lines.push(line);}\n }\n return lines;\n}\n",
|
|
123
|
+
"/**\n * Shared .faf assembly pipeline. The full slot-filling flow used to build a\n * FRESH .faf for a directory:\n * detect → interrogate → slotignore inactive categories → Turbo-Cat → Relentless\n *\n * Used by BOTH `faf auto` (new-file path) and `faf git` (cloned repo) so they\n * can't drift — `faf git` previously ran detectStack alone (~33% vs ~75%).\n */\n\nimport { detectStack, detectStackWithFacts } from './stack.js';\nimport { interrogateRepo } from '../interrogate/index.js';\nimport { turboCatSlots } from './turbo-cat.js';\nimport { relentlessContext } from './relentless.js';\nimport {\n APP_TYPE_CATEGORIES,\n NO_CLASSIFYING_SIGNALS,\n SLOTS,\n SLOT_BY_PATH,\n SLOTIGNORED,\n appTypeUsesSlot,\n isPlaceholder,\n isTypedWords,\n} from '../core/slots.js';\nimport type { SlotDef } from '../core/types.js';\nimport { asFafMapping, isMapping } from '../core/shape.js';\nimport { carryFafSource, fafSourceOf, markAsFill } from '../core/faf-source.js';\nimport { typeIsFallback } from '../core/typed-none.js';\n\n/** Build a fresh .faf for `dir` using the full slot-filling pipeline. */\nexport function assembleFreshFaf(dir: string): Record<string, unknown> {\n const detected = detectStack(dir) as Record<string, unknown>;\n const facts = interrogateRepo(dir);\n\n // File-facts (stack / commands / security — docker-compose, Makefile, .env)\n // are ground truth: they WIN over detectStack's root-only presence guesses.\n const factLayer: Record<string, unknown> = {};\n if (facts.stack) {factLayer.stack = facts.stack;}\n if (facts.commands) {factLayer.commands = facts.commands;}\n if (facts.security) {factLayer.security = facts.security;}\n // Prose (goal / 6Ws — README, Cargo.toml) fills empties only.\n const proseLayer: Record<string, unknown> = {};\n if (facts.project) {proseLayer.project = facts.project;}\n if (facts.human_context) {proseLayer.human_context = facts.human_context;}\n\n const seeded = fillEmpties(fillEmpties(factLayer, detected), proseLayer);\n applySlotIgnore(seeded);\n // Polyglot repos: the root package.json is a tooling shell — don't let its\n // description/scripts seed the product's 6Ws.\n const found = (detected._meta as { found?: string[] } | undefined)?.found ?? [];\n const toolingRoot = found.some(f => f.startsWith('polyglot:'));\n const withFormats = fillEmpties(seeded, turboCatSlots(dir) as Record<string, unknown>);\n return fillEmpties(withFormats, { human_context: relentlessContext(dir, { toolingRoot }) } as Record<string, unknown>);\n}\n\n/**\n * Update an EXISTING .faf for `dir`. Existing values win; interrogated → detected\n * → Turbo-Cat (formats) → Relentless (6 W's) fill only the remaining empties.\n * This is exactly the chain `faf auto` runs on an existing file — exported so\n * consumers (faf-mcp's faf_auto) compose it instead of re-deriving it and\n * drifting (they used to merge assembleFreshFaf's slotignore'd output over the\n * existing file, losing interrogated facts such as a docker-compose Redis).\n *\n * Shape: `existing` must be a mapping (an empty document, null, reads as `{}`);\n * a scalar or a list throws rather than being spread into character keys. A\n * non-null scalar `project:` (older writers stored `project: <name>`) is lifted\n * to `{ name: String(value) }`, so the name is kept and the rest can be filled.\n *\n * Words typed into a slot — a typed none (`None` / `N/A` / `not applicable`)\n * or any other placeholder word (`unknown`, `\"null\"`), any case — are an\n * empty slot: they score 0 until filled.\n * - In a tech slot (every slot but the 6Ws) a repo fact fills it: \"if it's\n * a fact, fill the slot\". With no fact the words stay exactly as the file\n * has them, comment included; faf never writes `''` over them.\n * - In a tech slot the file's app-type (`project.type`) leaves out, the\n * app-type's decision is the fact: with no repo fact, the slot becomes\n * `slotignored` in place of the words, an empty value or a\n * placeholder. A real value there is kept. `slotignored` comes only from\n * the app-type — in a slot the app-type uses, it is never written, even\n * when detection reads the repo as another type; such a slot gets the\n * repo's fact for it instead (`runtime: Go` from go.mod), or keeps what\n * it had. A `project.type` faf does not know decides nothing, and neither\n * does the `library` detection falls back to when the repo has no\n * classifying signal.\n * - In a 6W (`human_context.*`) the words are the person's: auto never\n * replaces them (`faf go` asks).\n * A slot that says `slotignored` under either of its names (`stack.db` for\n * `stack.database`) gets no detected value under either. A slot the file\n * names only by its Mk4 name (`stack.db`) keeps that name: faf adds no\n * on-wire twin (`stack.database`), and a repo fact fills the name the file\n * uses.\n *\n * The result is marked as a fill: writeFaf leaves a node with an anchor that\n * an alias reads as written (`frontend: &x None` with `ui_library: *x`) —\n * filling it would change every alias — and reports it like a kept alias.\n */\nexport function updateExistingFaf(dir: string, existing: Record<string, unknown>): Record<string, unknown> {\n const base = liftScalarProject(asFafMapping(existing, 'updateExistingFaf: the existing .faf'));\n const { data, facts } = detectStackWithFacts(dir);\n const detected = data as Record<string, unknown>;\n const withInterrogated = fillEmpties(base, interrogateRepo(dir) as Record<string, unknown>);\n const merged = fillEmpties(withInterrogated, detected);\n const withFormats = fillEmpties(merged, turboCatSlots(dir) as Record<string, unknown>);\n const filled = useFileSlotNames(fillEmpties(withFormats, { human_context: relentlessContext(dir) } as Record<string, unknown>), base);\n const decided = scoredNamesInStep(appTypeIsFact(existing, base, detected)\n ? applyAppType(keepNotApplicable(filled, base), base, facts)\n : keepNotApplicable(filled, base), base);\n // The result is the read `existing` came from, filled: writeFaf checks it\n // against that read, so an edit made while detection ran is never written over.\n return markAsFill(carryFafSource(existing, decided));\n}\n\n/** True when the app-type the filled file will declare is a fact: a type the\n * file names (unless its line carries faf's `# found: no classifying signals\n * — fallback` note, as the `library` faf fell back to does), or one detection\n * fills in from a classifying signal. faf's fallback decides no slot, on\n * this run or a later one. */\nfunction appTypeIsFact(existing: Record<string, unknown>, base: Record<string, unknown>, detected: Record<string, unknown>): boolean {\n if (!isPlaceholder(fieldAt(base, 'project.type'))) {\n const text = fafSourceOf(existing)?.text;\n return text === undefined || !typeIsFallback(text);\n }\n const found = (detected._meta as { found?: string[] } | undefined)?.found ?? [];\n return !found.includes(NO_CLASSIFYING_SIGNALS);\n}\n\n/** The places a slot can live: its on-wire path and its Mk4 canonical name. */\nfunction slotLocations(slot: SlotDef): string[] {\n return slot.canonical ? [slot.path, slot.canonical] : [slot.path];\n}\n\n/** `section.field` of a .faf data object (every slot path has two parts). */\nfunction fieldAt(data: Record<string, unknown>, path: string): unknown {\n const [section, field] = path.split('.');\n const s = data[section];\n return isMapping(s) ? s[field] : undefined;\n}\n\n/** Set (or, with `undefined`, remove) `section.field`, copying the section so\n * the caller's objects are never changed. Setting the value the field\n * already holds leaves the section as it is (no copy, no change for the\n * merge to see). */\nfunction putField(data: Record<string, unknown>, path: string, value: unknown): void {\n const [section, field] = path.split('.');\n const s = data[section];\n if (!isMapping(s)) {return;}\n if (value === undefined ? !(field in s) : s[field] === value) {return;}\n const copy = { ...s };\n if (value === undefined) {\n delete copy[field];\n } else {\n copy[field] = value;\n }\n data[section] = copy;\n}\n\n/** `slotignored`: the app-type leaves the slot out. Typed words are not this. */\nconst isSlotIgnored = (v: unknown): boolean => typeof v === 'string' && v.trim() === SLOTIGNORED;\n\n/** True when `base` says `slotignored` under one of the slot's names and\n * holds no real value under any of them. */\nfunction decidedNotApplicable(base: Record<string, unknown>, locs: string[]): boolean {\n const values = locs.map(loc => fieldAt(base, loc));\n return values.some(isSlotIgnored) && values.every(v => isPlaceholder(v) || isSlotIgnored(v));\n}\n\n/** After filling: a slot `base` marks `slotignored` gets no detected value\n * under any of its names — each keeps exactly what `base` had there. Only\n * `slotignored` is kept this way; typed words are an empty slot, and a fact\n * fills it (see fillEmpties). */\nfunction keepNotApplicable(filled: Record<string, unknown>, base: Record<string, unknown>): Record<string, unknown> {\n const out = { ...filled };\n for (const slot of SLOTS) {\n const locs = slotLocations(slot);\n if (!decidedNotApplicable(base, locs)) {continue;}\n for (const loc of locs) {\n const before = fieldAt(base, loc);\n if (fieldAt(out, loc) !== before) {putField(out, loc, before);}\n }\n }\n return out;\n}\n\n/** True when `data` has a key at `section.field` (whatever its value). */\nfunction hasField(data: Record<string, unknown>, path: string): boolean {\n const [section, field] = path.split('.');\n const s = data[section];\n return isMapping(s) && Object.prototype.hasOwnProperty.call(s, field);\n}\n\n/** A slot the file names only by its Mk4 name (`stack.db`, not\n * `stack.database`) keeps that one name: the on-wire twin the fill added is\n * taken out again, and a repo fact it carried fills the Mk4 name when that\n * holds no real value (empty, or typed words) — \"if it's a fact, fill the\n * slot\", under the name the file uses. */\nfunction useFileSlotNames(filled: Record<string, unknown>, base: Record<string, unknown>): Record<string, unknown> {\n const out = { ...filled };\n for (const slot of SLOTS) {\n if (!slot.canonical || !hasField(base, slot.canonical) || hasField(base, slot.path)) {continue;}\n const twin = fieldAt(out, slot.path);\n putField(out, slot.path, undefined);\n const own = fieldAt(out, slot.canonical);\n if (isFact(twin) && isPlaceholder(own)) {putField(out, slot.canonical, twin);}\n }\n return out;\n}\n\n/** The scoring kernel reads a slot under its on-wire name (`stack.database`),\n * never its Mk4 name (`stack.db`). When the file names a slot only by its\n * Mk4 name, faf keeps the on-wire name in step with it — a repo fact or\n * `slotignored` — so the score counts what the file says. faf adds that\n * key; the file's own line is left as the steps above decided. A Mk4 name\n * that still holds no real value (empty, or typed words) adds nothing: the\n * slot is empty under either name. */\nfunction scoredNamesInStep(decided: Record<string, unknown>, base: Record<string, unknown>): Record<string, unknown> {\n const out = { ...decided };\n for (const slot of SLOTS) {\n if (!slot.canonical || !hasField(base, slot.canonical) || hasField(base, slot.path)) {continue;}\n const own = fieldAt(out, slot.canonical);\n if (isFact(own) || isSlotIgnored(own)) {putField(out, slot.path, own);}\n }\n return out;\n}\n\n/** The file's app-type decides which tech slots count (after filling, so a\n * type detection filled in counts too; a type faf does not know decides\n * nothing):\n * - a slot it leaves out that holds no real value under either of its\n * names — only empty values, placeholders or typed words — becomes\n * `slotignored`, under each of the slot's names the file has (or its\n * on-wire name when it has neither);\n * - a slot it uses never takes `slotignored` from detection (which may have\n * read the repo as another type): it gets the repo's fact for it from\n * `facts` (detection's fact for every stack slot, whatever the type), or\n * keeps what `base` had there (`''` when `base` had nothing). A\n * `slotignored` of the file's own stays. */\nfunction applyAppType(filled: Record<string, unknown>, base: Record<string, unknown>, facts: Record<string, string> = {}): Record<string, unknown> {\n const project = filled.project;\n const type = isMapping(project) ? project.type : undefined;\n const out = { ...filled };\n for (const slot of SLOTS) {\n if (slot.category === 'human' || slot.category === 'project') {continue;}\n const uses = appTypeUsesSlot(type, slot);\n if (uses === null) {return filled;}\n if (uses) {\n keepUsedSlot(out, base, slot, slot.path.startsWith('stack.') ? facts[slot.path.slice('stack.'.length)] : undefined);\n } else {\n markLeftOutSlot(out, slot);\n }\n }\n return out;\n}\n\n/** A slot the app-type uses takes no `slotignored` from detection: each name\n * of it gets back what `base` had there (`''` when it had nothing). Then,\n * when the repo has a fact for the slot (`fact`, detection's value whatever\n * the type) and the slot holds no real value under any of its names, each\n * name the file has that holds none — empty, or typed words, never the\n * file's own `slotignored` — gets the fact (the on-wire name when it has\n * neither): \"if it's a fact, fill the slot\". */\nfunction keepUsedSlot(out: Record<string, unknown>, base: Record<string, unknown>, slot: SlotDef, fact: string | undefined): void {\n const locs = slotLocations(slot);\n for (const loc of locs) {\n if (isSlotIgnored(fieldAt(out, loc)) && !isSlotIgnored(fieldAt(base, loc))) {\n putField(out, loc, hasField(base, loc) ? fieldAt(base, loc) : '');\n }\n }\n if (!isFact(fact)) {return;}\n const present = locs.filter(loc => hasField(out, loc));\n if (present.some(loc => !isPlaceholder(fieldAt(out, loc)))) {return;} // a real value (or the file's slotignored) stays\n for (const loc of present.length > 0 ? present : [slot.path]) {putField(out, loc, fact);}\n}\n\n/** A slot the app-type leaves out, with no real value under either of its\n * names, becomes `slotignored` under each name the file has (or its on-wire\n * name when it has neither). A real value there is kept. */\nfunction markLeftOutSlot(out: Record<string, unknown>, slot: SlotDef): void {\n const present = slotLocations(slot).filter(loc => hasField(out, loc));\n const real = (loc: string): boolean => !isPlaceholder(fieldAt(out, loc)) && !isSlotIgnored(fieldAt(out, loc));\n if (present.some(real)) {return;}\n for (const loc of present.length > 0 ? present : [slot.path]) {\n if (isPlaceholder(fieldAt(out, loc))) {putField(out, loc, SLOTIGNORED);}\n }\n}\n\n/** `project: <scalar>` → `project: { name: String(value) }`. A list is left as it is\n * (fillEmpties never descends into or spreads a list). Returns a new object. */\nfunction liftScalarProject(data: Record<string, unknown>): Record<string, unknown> {\n const project = data.project;\n if (project === null || project === undefined || isMapping(project) || Array.isArray(project)) {return data;}\n return { ...data, project: { name: String(project) } };\n}\n\n/** Mark slots outside the app-type's active categories as `slotignored`. */\nfunction applySlotIgnore(seeded: Record<string, unknown>): void {\n const projectType = (seeded.project as { type?: string } | undefined)?.type ?? 'library';\n const activeCategories = APP_TYPE_CATEGORIES[projectType] || APP_TYPE_CATEGORIES.library;\n for (const slot of SLOTS) {\n if (activeCategories.includes(slot.category)) {continue;}\n const [section, field] = slot.path.split('.');\n if (section === 'stack' && seeded.stack) {\n (seeded.stack as Record<string, string>)[field] = 'slotignored';\n }\n if (section === 'monorepo' && seeded.monorepo) {\n (seeded.monorepo as Record<string, string>)[field] = 'slotignored';\n }\n }\n}\n\n/** Fill empty slots in `target` with values from `source`. `target` wins\n * when its slot is non-empty. Empty here is '', null, undefined, an empty\n * list or mapping — this is what lets interrogated/detected values overwrite\n * the empty-string defaults that detectStack writes to human_context.\n *\n * Typed words — a typed none (`None`, `N/A`, `not applicable`) or any other\n * placeholder word (`unknown`, `\"null\"`), any case — are an empty slot, but\n * only a fact replaces them: in a tech slot (every slot but the 6Ws, under\n * either of its names) a source value that is real content — not empty, not\n * a placeholder, not `slotignored` — fills it. Anything else leaves the\n * words exactly as they are: no fact, a 6W (`human_context.*`, the\n * person's), or a place that is not a slot.\n *\n * A `_meta` the target already carries (the user's own) is never filled\n * over: faf's runtime `_meta` from `source` is merged only into a target\n * without one. */\nexport function fillEmpties(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n return fillAt(target, source, '');\n}\n\n/** A tech slot: any slot but the 6Ws, under its path or its canonical name. */\nfunction isTechSlot(path: string): boolean {\n const slot = SLOT_BY_PATH.get(path);\n return slot !== undefined && slot.category !== 'human';\n}\n\n/** A value the repo gave for a slot: real content. Not empty, not a\n * placeholder or typed words, and not `slotignored` (the app-type's word,\n * never a fact about the repo). */\nfunction isFact(value: unknown): boolean {\n if (typeof value === 'number' || typeof value === 'boolean') {return true;}\n return typeof value === 'string' && value.trim() !== '' && !isPlaceholder(value) && !isSlotIgnored(value);\n}\n\n/** True when `value` may replace typed words at `path`: a fact, in a tech slot. */\nfunction factFillsTypedNone(path: string, value: unknown): boolean {\n return isTechSlot(path) && isFact(value);\n}\n\nfunction fillAt(target: Record<string, unknown>, source: Record<string, unknown>, prefix: string): Record<string, unknown> {\n const result = { ...target };\n for (const [key, value] of Object.entries(source)) {\n const existing = result[key];\n const path = prefix ? `${prefix}.${key}` : key;\n if (path === '_meta' && existing !== undefined) {continue;}\n if (isTypedWords(existing)) {\n // Typed words are an empty slot: a fact fills a tech slot; otherwise the words stay.\n if (factFillsTypedNone(path, value)) {result[key] = value;}\n continue;\n }\n if (isPlaceholder(existing)) {\n result[key] = value;\n } else if (isMapping(value) && isMapping(existing)) {\n result[key] = fillAt(existing, value, path);\n }\n }\n return result;\n}\n",
|
|
124
124
|
"/**\n * The pure parts of `faf git` — no git, no network, no child process.\n *\n * `faf git <url>` validates the URL, clones the repo into a temp folder, and\n * authors a fresh .faf from it with the same pipeline `faf auto` runs. The\n * clone is the only step that runs git, and it stays in the CLI command. The\n * rest lives here so consumers (claude-faf-mcp's faf_git, faf-mcp) compose it:\n * they fetch the repo their own way, then call `authorFafFromRepo(dir)` and get\n * the same .faf `faf git` would write — canonical keys, scored by faf's own\n * scorer — instead of a hand-rolled extractor with its own schema.\n */\n\nimport type { FafData } from '../core/types.js';\nimport { assembleFreshFaf } from './assemble.js';\nimport { readPackageJson } from './scanner.js';\n\n/**\n * Validate + normalize a GitHub repo reference into a safe clone URL.\n *\n * A `faf git` URL is an untrusted CLI/MCP argument. This gate rejects any\n * shell metacharacter or whitespace, and only ever returns a URL built from a\n * strict allowlist pattern — defense in depth alongside the no-shell\n * `execFileSync` clone (which already makes argument injection structurally\n * impossible). Nothing carrying a metacharacter or control char ever reaches\n * `git`: metachars are caught here; anything else fails the allowlist below.\n *\n * Accepts:\n * owner/repo · github.com/owner/repo · https://github.com/owner/repo\n * (optional `.git` suffix, optional trailing slash; full http(s) URLs to\n * any host pass through with a single `.git` suffix)\n *\n * Throws on empty / malformed / unsafe input.\n */\nexport function normalizeGitUrl(input: string): string {\n const url = (input ?? '').trim();\n if (!url) {\n throw new Error('Please provide a GitHub URL.');\n }\n // Reject shell metacharacters and whitespace up front for a clear error.\n if (/[\\s;&|`$(){}<>\\\\^'\"!*?[\\]]/.test(url)) {\n throw new Error(`Refusing unsafe URL: ${JSON.stringify(input)}`);\n }\n\n const bare = url.replace(/\\/+$/, '').replace(/\\.git$/i, '');\n\n // owner/repo shorthand (optionally github.com-prefixed, no scheme) → canonical https\n const short = bare.match(\n /^(?:github\\.com\\/)?([A-Za-z0-9][A-Za-z0-9._-]*)\\/([A-Za-z0-9][A-Za-z0-9._-]*)$/,\n );\n if (short) {\n return `https://github.com/${short[1]}/${short[2]}.git`;\n }\n\n // full http(s) URL → ensure exactly one `.git` suffix (strict allowlist chars)\n if (/^https?:\\/\\/[A-Za-z0-9._\\-/:@~%]+$/.test(bare)) {\n return `${bare}.git`;\n }\n\n throw new Error(`Not a recognized GitHub repo URL: ${JSON.stringify(input)}`);\n}\n\n/** The repo name from a normalized clone URL: .../owner/repo.git → repo. */\nexport function repoNameFromUrl(repoUrl: string): string {\n return repoUrl.replace(/\\.git$/i, '').replace(/\\/+$/, '').split('/').pop() || 'project';\n}\n\nexport interface AuthorFafFromRepoOptions {\n /** The repo's URL (a clone URL, or any form `normalizeGitUrl` accepts).\n * When the fetched folder gives the project no name of its own (no\n * package.json name), the project is named after the repo instead of the\n * folder it was fetched into. */\n repoUrl?: string;\n}\n\n/**\n * Author a fresh .faf, as data, from a repo that is already on disk — the\n * function form of `faf git`. Pass the folder you cloned or unpacked the repo\n * into. Runs the full `faf auto` pipeline (detect → interrogate → slotignore →\n * Turbo-Cat → Relentless) on that folder only, and returns the FafData —\n * nothing is written, nothing is fetched, no git is run.\n *\n * Write it with `writeFaf` and score the written text with `scoreFafYaml`, so\n * the score you report is the one faf reports.\n */\nexport function authorFafFromRepo(dir: string, opts: AuthorFafFromRepoOptions = {}): FafData {\n const data = assembleFreshFaf(dir) as FafData;\n // Name the project after the REPO, not the folder it was fetched into — but\n // only when the name IS that folder fallback (detectStack's\n // `pkg.name ?? dir.split('/').pop()`); a real package.json name is kept.\n if (opts.repoUrl && data.project && !readPackageJson(dir)?.name && data.project.name === dir.split('/').pop()) {\n data.project.name = repoNameFromUrl(opts.repoUrl);\n }\n return data;\n}\n",
|
|
125
125
|
"/**\n * FAF DNA — the lifecycle of AI context. The \"first heartbeat\".\n *\n * Every project.faf gets a `.faf-dna` lineage record (separate file, NOT\n * embedded in the .faf — so it's compatible with the clean dialect):\n * - Birth Certificate: the honest first score (even 0%) — the \"before\" picture\n * - Growth Record: version history as the score improves\n * - Journey: the one-line story, e.g. \"22% → 85% → 99% ← 92%\"\n *\n * Birth DNA = the raw slot-based score at init. The growth from Birth DNA to\n * the current score is the demonstrated value of FAF.\n *\n * Restored 2026-05-21 — silently dropped in the v6.0 clean-architecture rewrite\n * (it was never knowingly removed). Ported from v5 (sync, v6-native, load-compatible).\n *\n * Other shapes. `.faf-dna` is committed lineage, and other tools have written\n * it in their own shape (claude-faf-mcp's faf_dna wrote `milestones` at the top\n * level and no `versions` or `growth`). Reading never throws on such a file: it\n * reads what it can, and missing parts are derived from what is there. Writing\n * is different: recordGrowth rewrites the file only when faf can prove it wrote\n * every byte — the file is in faf's shape AND its text is exactly faf's own\n * serialisation of what it holds (`JSON.stringify(data, null, 2)` and a final\n * newline), and nothing faf would replace carries a note of the user's. Hand\n * formatting, CRLF, reordered keys, a repeated key or a number JSON cannot hold\n * exactly (a 20-digit id) would all be lost in a rewrite, so such a file — like\n * one in another shape — is read and left exactly as it is, and\n * `readOnlyReason()` says why in one line. `faf init --force` starts a fresh\n * lineage when you ask it to.\n */\n\nimport { existsSync, lstatSync } from 'fs';\nimport { join, basename } from 'path';\nimport { createHash } from 'crypto';\nimport { readBytesIfPresent, readUtf8, resolveInside, safeWriteFile } from './safe-write.js';\n\nexport interface BirthCertificate {\n born: string; // ISO timestamp\n birthDNA: number; // honest first score (raw slot-based, even 0)\n birthDNASource: 'init' | 'legacy';\n projectDNA: string; // 16-char hash of initial state\n certificate: string; // FAF-YYYY-PROJECT-XXXX\n}\n\nexport interface VersionEntry {\n version: string; // v1.0.0, v1.0.1, …\n timestamp: string; // ISO\n score: number;\n changes: string[];\n growth: number; // points above Birth DNA\n}\n\n/** Journey markers only — not score tiers.\n * Tiers live solely in tiers.ts (Trophy 100 · Gold 99 · Silver 95 · Bronze 85 · …).\n * There is no championship / elite / perfect milestone. */\nexport interface Milestone {\n type: 'birth' | 'doubled' | 'peak' | 'current';\n score: number;\n date: string; // ISO\n version: string;\n label: string;\n emoji: string;\n}\n\nexport interface FafDNA {\n birthCertificate: BirthCertificate;\n versions: VersionEntry[];\n current: { version: string; score: number; lastSync: string };\n growth: { totalGrowth: number; daysActive: number; milestones: Milestone[] };\n lastModified: string;\n format: 'faf-dna-v1';\n}\n\ntype Json = Record<string, unknown>;\n\nconst isObject = (v: unknown): v is Json => typeof v === 'object' && v !== null && !Array.isArray(v);\nconst isNum = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nconst isStr = (v: unknown): v is string => typeof v === 'string';\nconst VERSION_RE = /^v?\\d+\\.\\d+\\.\\d+$/;\nconst MILESTONE_TYPES = new Set(['birth', 'doubled', 'peak', 'current']);\n\n/** A version entry faf wrote: a semver-ish version and a numeric score. */\nfunction isVersionEntry(v: unknown): v is VersionEntry {\n return isObject(v) && isStr(v.version) && VERSION_RE.test(v.version) && isNum(v.score);\n}\n\n/**\n * True when `raw` is a `.faf-dna` in the shape faf writes: a birth certificate\n * with a birth date and a numeric Birth DNA, a non-empty `versions` list whose\n * entries carry a version and a score, a `current` score and version, and a\n * `growth.milestones` list of entries. Only such a file is ever added to\n * (unknown extra keys in it are kept).\n */\nconst birthOk = (bc: unknown): boolean => isObject(bc) && isNum(bc.birthDNA) && isStr(bc.born);\nconst versionsOk = (v: unknown): boolean => Array.isArray(v) && v.length > 0 && v.every(isVersionEntry);\nconst currentOk = (c: unknown): boolean => isObject(c) && isNum(c.score) && isStr(c.version);\nconst growthOk = (g: unknown): boolean => isObject(g) && Array.isArray(g.milestones) && g.milestones.every(isObject);\n\nfunction hasFafShape(raw: unknown): raw is FafDNA {\n return isObject(raw) && birthOk(raw.birthCertificate) && versionsOk(raw.versions) && currentOk(raw.current) && growthOk(raw.growth);\n}\n\n/** True when something is at `path` — a file, or a link (even a dangling one). */\nfunction present(path: string): boolean {\n try {\n lstatSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/** faf's own serialisation of a `.faf-dna` — the exact text save() writes. */\nconst serialise = (dna: unknown): string => `${JSON.stringify(dna, null, 2)}\\n`;\n\n/** What faf writes in `current` and in a milestone. recordGrowth replaces\n * `current` and the peak / current milestones whole, so a key of the user's\n * in one of them would be lost. */\nconst CURRENT_KEYS = new Set(['version', 'score', 'lastSync']);\nconst MILESTONE_KEYS = new Set(['type', 'score', 'date', 'version', 'label', 'emoji']);\nconst onlyKeys = (o: object, keys: Set<string>): boolean => Object.keys(o).every((k) => keys.has(k));\n\n/** The label and emoji faf gives each milestone it writes. */\nconst MILESTONE_TEXT: Record<Milestone['type'], { label: string; emoji: string }> = {\n birth: { label: 'Birth', emoji: '🐣' },\n doubled: { label: 'Doubled', emoji: '2️⃣' },\n peak: { label: 'Peak', emoji: '🏔️' },\n current: { label: 'Current', emoji: '📍' },\n};\n\n/** The milestones recordGrowth replaces: the peak and the current one. */\nconst replaced = (dna: FafDNA): Milestone[] => dna.growth.milestones.filter((m) => m.type === 'peak' || m.type === 'current');\n\n/** True when every object recordGrowth replaces holds only keys faf writes there. */\nconst onlyFafKeys = (dna: FafDNA): boolean =>\n onlyKeys(dna.current, CURRENT_KEYS) && replaced(dna).every((m) => onlyKeys(m, MILESTONE_KEYS));\n\n/** True when the peak and current milestones carry faf's own label and emoji\n * for their type — a relabelled one is the user's text. */\nconst fafLabels = (dna: FafDNA): boolean =>\n replaced(dna).every((m) => m.label === MILESTONE_TEXT[m.type].label && m.emoji === MILESTONE_TEXT[m.type].emoji);\n\n/** True when every object recordGrowth replaces is exactly what faf writes there. */\nfunction growthLosesNothing(dna: FafDNA): boolean {\n return onlyFafKeys(dna) && fafLabels(dna);\n}\n\n/** Why faf leaves a `.faf-dna` as it is, in one line. */\nconst NOT_FAF_SHAPE = \".faf-dna is not in faf's shape: faf reads it and leaves it as it is.\";\nconst NOT_FAF_TEXT =\n '.faf-dna is not exactly as faf wrote it (hand formatting, key order, a repeated key or a number JSON cannot hold exactly): faf reads it and leaves it as it is.';\nconst USER_NOTE =\n '.faf-dna has a key of yours in an entry faf would replace (current, or the peak or current milestone): faf reads it and leaves it as it is.';\nconst USER_LABEL =\n '.faf-dna has a label or emoji of yours on a milestone faf would replace (the peak or current one): faf reads it and leaves it as it is.';\nconst NO_BIRTH = '.faf-dna has no birth certificate faf can read: faf leaves it as it is.';\n\n/** Milestones as the journey reads them: well-formed entries only. */\nfunction readMilestones(v: unknown): Milestone[] {\n if (!Array.isArray(v)) {return [];}\n return v.filter((m): m is Milestone => isObject(m) && isStr(m.type) && MILESTONE_TYPES.has(m.type) && isNum(m.score));\n}\n\n/**\n * A readable view of a `.faf-dna` in any shape, or null when there is no usable\n * birth certificate (no numeric Birth DNA). Missing parts are derived from what\n * is there — `growth.milestones` falls back to a top-level `milestones`, the\n * current score to the last version or the Birth DNA — so the journey reads\n * without throwing. The view is for reading; it is never written back.\n */\nconst str = (v: unknown, fallback = ''): string => (isStr(v) ? v : fallback);\n\n/** Well-formed version entries, each with every field the log reads. */\nfunction readVersions(v: unknown, birthDNA: number): VersionEntry[] {\n if (!Array.isArray(v)) {return [];}\n return v.filter(isVersionEntry).map((e) => ({\n version: e.version,\n timestamp: str(e.timestamp),\n score: e.score,\n changes: Array.isArray(e.changes) ? e.changes.filter(isStr) : [],\n growth: isNum(e.growth) ? e.growth : e.score - birthDNA,\n }));\n}\n\n/** The current score and version: as written, else the last version, else birth. */\nfunction readCurrent(cur: Json, last: VersionEntry | undefined, birthDNA: number, born: string): FafDNA['current'] {\n return {\n version: str(cur.version, last?.version ?? 'v1.0.0'),\n score: isNum(cur.score) ? cur.score : (last?.score ?? birthDNA),\n lastSync: str(cur.lastSync, born),\n };\n}\n\nfunction readableView(raw: unknown): FafDNA | null {\n if (!isObject(raw) || !isObject(raw.birthCertificate) || !isNum(raw.birthCertificate.birthDNA)) {return null;}\n const bc = raw.birthCertificate;\n const birthDNA = bc.birthDNA as number;\n const born = str(bc.born);\n const versions = readVersions(raw.versions, birthDNA);\n const current = readCurrent(isObject(raw.current) ? raw.current : {}, versions[versions.length - 1], birthDNA, born);\n const growth = isObject(raw.growth) ? raw.growth : {};\n return {\n birthCertificate: {\n born,\n birthDNA,\n birthDNASource: bc.birthDNASource === 'legacy' ? 'legacy' : 'init',\n projectDNA: str(bc.projectDNA),\n certificate: str(bc.certificate),\n },\n versions,\n current,\n growth: {\n totalGrowth: current.score - birthDNA,\n daysActive: isNum(growth.daysActive) ? growth.daysActive : 0,\n milestones: readMilestones(Array.isArray(growth.milestones) ? growth.milestones : raw.milestones),\n },\n lastModified: str(raw.lastModified, born),\n format: 'faf-dna-v1',\n };\n}\n\n/**\n * The `.faf-dna` lineage of one project: birth, growth and the journey line.\n * This is the API `faf init` (birth), `faf auto` / `faf refresh` (recordGrowth)\n * and `faf dna` (getJourney, getBirthDNADisplay, getLog) use.\n *\n * - `birth(score)` starts a new lineage and writes it, replacing any\n * `.faf-dna` there (check `exists()` first unless a fresh start is meant —\n * `faf init` births only when there is none, or with `--force`).\n * - `recordGrowth(score, changes)` adds a version when the score changed.\n * It adds only to a file faf can prove it wrote (see the file header);\n * for any other file it writes nothing and returns null, and\n * `readOnlyReason()` says why.\n * - Reads never throw: a missing, unreadable, non-UTF-8 or non-JSON file,\n * or one with no usable birth certificate, reads as null / '' / [].\n *\n * Every write is atomic and stays inside the project: a `.faf-dna` link that\n * leads out of the project, dangles or leads to a file with another name is\n * refused (and reads as absent). A write is refused, too, when the file\n * changed on disk after this manager read it (another `faf` process recorded\n * growth meanwhile, say): SafePathError `changed`, nothing written.\n */\nexport class FafDNAManager {\n private readonly projectPath: string;\n private readonly dnaPath: string;\n private dna: FafDNA | null = null;\n /** True when the loaded file is one faf wrote (so it may be added to). */\n private own = false;\n /** The text read from `.faf-dna` (or last written), for the write's check. */\n private text: string | undefined;\n /** Why the file is read only, when it is; null when faf may add to it. */\n private reason: string | null = null;\n /** True once this manager found no `.faf-dna` (exists / load / birth) and\n * has not written one since: a birth then refuses a file that appeared\n * meanwhile instead of writing over it. */\n private sawNoFile = false;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.dnaPath = join(projectPath, '.faf-dna');\n }\n\n exists(): boolean {\n const there = existsSync(this.dnaPath);\n if (!there && !present(this.dnaPath)) {this.sawNoFile = true;}\n return there;\n }\n\n /** Birth — the first heartbeat. Writes the birth certificate with the honest first score.\n * When this manager found no `.faf-dna` (now, or at an earlier exists() /\n * load()), a file that appeared since is refused (SafePathError `changed`)\n * rather than written over; over a `.faf-dna` that is there, birth starts a\n * fresh lineage (`faf init --force`). */\n birth(birthDNA: number): FafDNA {\n if (!present(this.dnaPath)) {this.sawNoFile = true;}\n const now = new Date().toISOString();\n this.own = true;\n this.dna = {\n birthCertificate: {\n born: now,\n birthDNA,\n birthDNASource: 'init',\n projectDNA: this.generateProjectDNA(),\n certificate: this.generateCertificate(),\n },\n versions: [{ version: 'v1.0.0', timestamp: now, score: birthDNA, changes: ['Birth — initial context'], growth: 0 }],\n current: { version: 'v1.0.0', score: birthDNA, lastSync: now },\n growth: {\n totalGrowth: 0,\n daysActive: 0,\n milestones: [{ type: 'birth', score: birthDNA, date: now, version: 'v1.0.0', label: 'Birth', emoji: '🐣' }],\n },\n lastModified: now,\n format: 'faf-dna-v1',\n };\n this.save();\n return this.dna;\n }\n\n /** True when `.faf-dna` exists and is one faf wrote — in faf's shape, and\n * exactly faf's own text — so recordGrowth may add to it. Any other file is\n * read, not written. */\n isFafShape(): boolean {\n return this.load() !== null && this.own;\n }\n\n /** Why faf leaves this `.faf-dna` as it is, in one plain line — or null when\n * there is none, or recordGrowth may add to it. */\n readOnlyReason(): string | null {\n this.load();\n return this.own ? null : this.reason;\n }\n\n /** Record growth — a new score on the journey. Returns null when there is no\n * DNA yet, or when the file is in another tool's shape (nothing is written). */\n recordGrowth(newScore: number, changes: string[]): FafDNA | null {\n if (!this.dna && !this.load()) {return null;}\n if (!this.own) {return null;}\n const dna = this.dna!;\n if (newScore === dna.current.score) {return dna;} // no change, no new version\n\n const now = new Date().toISOString();\n const birthDNA = dna.birthCertificate.birthDNA;\n const growth = newScore - birthDNA;\n const newVersion = this.incrementVersion(dna.versions[dna.versions.length - 1].version);\n\n dna.versions.push({ version: newVersion, timestamp: now, score: newScore, changes, growth });\n dna.current = { version: newVersion, score: newScore, lastSync: now };\n dna.growth.totalGrowth = growth;\n dna.growth.daysActive = this.daysSince(dna.birthCertificate.born);\n this.updateMilestones(newScore, newVersion, now);\n this.save();\n return dna;\n }\n\n /** The one-line journey: e.g. \"22% → 85% → 99% ← 92%\". */\n getJourney(): string {\n if (!this.dna && !this.load()) {return '';}\n const dna = this.dna!;\n const birth = dna.birthCertificate.birthDNA;\n const peak = dna.growth.milestones.find((m) => m.type === 'peak');\n const current = dna.current.score;\n\n let journey = `${birth}%`;\n if (peak && peak.score !== birth) {\n journey += ` → ${peak.score}%`;\n if (current < peak.score) {journey += ` ← ${current}%`;}\n } else if (current !== birth) {\n journey += ` → ${current}%`;\n }\n return journey;\n }\n\n getBirthDNADisplay(): { current: number; birthDNA: number; growth: number; born: string } | null {\n if (!this.dna && !this.load()) {return null;}\n const dna = this.dna!;\n return {\n current: dna.current.score,\n birthDNA: dna.birthCertificate.birthDNA,\n growth: dna.current.score - dna.birthCertificate.birthDNA,\n born: isStr(dna.birthCertificate.born) ? dna.birthCertificate.born : '',\n };\n }\n\n /** Complete version history, newest last. */\n getLog(): string[] {\n if (!this.dna && !this.load()) {return [];}\n return this.dna!.versions.map((v) => {\n const emoji = v.growth > 50 ? '🚀' : v.growth > 20 ? '📈' : '📊';\n const day = isStr(v.timestamp) ? v.timestamp.split('T')[0] : '';\n const changes = Array.isArray(v.changes) ? v.changes.filter(isStr).join(', ') : '';\n return `${v.version} — ${v.score}% ${emoji} (${day}) ${changes}`;\n });\n }\n\n /** Load `.faf-dna`. Never throws: missing, unreadable, not UTF-8, not JSON, a\n * refused link, or no usable birth certificate → null. A file faf did not\n * write (another shape, or not exactly faf's text) loads as a readable view\n * (see the file header). */\n load(): FafDNA | null {\n if (this.dna) {return this.dna;}\n if (!existsSync(this.dnaPath)) {\n if (!present(this.dnaPath)) {this.sawNoFile = true;}\n return null;\n }\n const read = this.read();\n if (read === null) {return null;}\n const { text, raw } = read;\n if (hasFafShape(raw) && serialise(raw) === text && growthLosesNothing(raw)) {\n this.own = true;\n this.reason = null;\n this.dna = raw;\n } else {\n this.own = false;\n this.dna = readableView(raw);\n this.reason = !this.dna ? NO_BIRTH : !hasFafShape(raw) ? NOT_FAF_SHAPE : serialise(raw) !== text ? NOT_FAF_TEXT\n : onlyFafKeys(raw) ? USER_LABEL : USER_NOTE;\n }\n this.text = text;\n return this.dna;\n }\n\n /** The file's text (strict UTF-8) and its JSON, or null with the reason noted. */\n private read(): { text: string; raw: unknown } | null {\n let text: string;\n try {\n text = readUtf8(resolveInside(this.projectPath, '.faf-dna'));\n } catch (e) {\n this.reason = e instanceof Error ? e.message : String(e);\n return null;\n }\n try {\n return { text, raw: JSON.parse(text) as unknown };\n } catch {\n this.reason = '.faf-dna is not JSON: faf leaves it as it is.';\n return null;\n }\n }\n\n private save(): void {\n if (!this.dna) {return;}\n this.dna.lastModified = new Date().toISOString();\n const text = serialise(this.dna);\n // The file must still be what this manager read (or, when it found none,\n // still be absent; before any read, what is there now): another process's\n // growth — or a .faf-dna that appeared meanwhile — is never written over.\n const expect = this.text ?? (this.sawNoFile ? null : readBytesIfPresent(resolveInside(this.projectPath, '.faf-dna')));\n // Atomic, and never through a link that leaves the project or dangles.\n safeWriteFile(this.dnaPath, text, { root: this.projectPath, expect });\n this.text = text;\n this.sawNoFile = false;\n }\n\n private generateProjectDNA(): string {\n return createHash('sha256')\n .update([this.projectPath, Date.now().toString(), Math.random().toString(36)].join(':'))\n .digest('hex')\n .substring(0, 16);\n }\n\n private generateCertificate(): string {\n const year = new Date().getFullYear();\n const rand = Math.random().toString(36).substring(2, 6).toUpperCase();\n const proj = basename(this.projectPath).replace(/[^A-Z0-9]/gi, '').toUpperCase().substring(0, 8).padEnd(4, 'X');\n return `FAF-${year}-${proj}-${rand}`;\n }\n\n private incrementVersion(version: string): string {\n const [maj, min, patch] = version.replace('v', '').split('.').map(Number);\n return `v${maj}.${min}.${patch + 1}`;\n }\n\n private daysSince(iso: string): number {\n return Math.floor((Date.now() - new Date(iso).getTime()) / 86_400_000);\n }\n\n private updateMilestones(score: number, version: string, now: string): void {\n if (!this.dna) {return;}\n const ms = this.dna.growth.milestones;\n const has = (t: Milestone['type']) => ms.some((m) => m.type === t);\n const add = (type: Milestone['type']) =>\n ms.push({ type, score, date: now, version, ...MILESTONE_TEXT[type] });\n\n if (score >= this.dna.birthCertificate.birthDNA * 2 && score > 0 && !has('doubled')) {add('doubled');}\n\n const peak = ms.find((m) => m.type === 'peak');\n if (!peak || score > peak.score) {\n if (peak) {ms.splice(ms.indexOf(peak), 1);}\n add('peak');\n }\n const cur = ms.findIndex((m) => m.type === 'current');\n if (cur >= 0) {ms.splice(cur, 1);}\n add('current');\n }\n}\n",
|
|
126
126
|
"import { join } from 'path';\nimport type { FafData } from '../core/types.js';\nimport { FAF_CONTEXT_FILES } from '../core/safe-write.js';\nimport { fafMetaTag } from './claude.js';\nimport { injectFafBlock } from './inject.js';\nimport { filled, slotLabel, titleLabel } from './labels.js';\n\n/** A value carrying real content — non-empty, not slotignored, non-empty array. */\nconst present = (v: unknown): boolean =>\n v !== null && v !== undefined && v !== '' && v !== 'slotignored' && !(Array.isArray(v) && v.length === 0);\n\n/** Render a slot value for inline display (arrays → comma list). */\nconst fmtVal = (v: unknown): string => (Array.isArray(v) ? v.join(', ') : String(v));\n\n/** Preference keys that describe human↔assistant interaction, NOT repo conventions. Excluded from AGENTS.md. */\nconst HUMAN_PREF = new Set([\n 'commit_style', 'communication', 'response_style', 'explanation_level', 'explanations', 'documentation', 'code_first',\n]);\n\n/** Stack keys that are context/marketing, not actual stack. Kept out of the Stack section. */\nconst NON_STACK = new Set(['target_user', 'core_problem', 'mission_purpose']);\n\n/**\n * Author a BETTER-shaped AGENTS.md from .faf data (+ repo enrichment at export).\n *\n * Deterministic projection from curated TRUTH — facts, not hallucinated prose\n * (Gloaguen: LLM freewrite hurts). Sections: orientation · setup · verify ·\n * map · conventions · three-tier guardrails · DoD · when stuck · security ·\n * commit. Human Context (who/why marketing) is intentionally omitted — that\n * belongs in README / project.faf, not agent ops.\n *\n * Design: BETTER guide + hand exemplar (faf-cli AGENTS.md) + agents-md-facts.\n */\nexport function renderAgentsMd(data: FafData): string {\n const lines: string[] = [];\n const push = (s = '') => lines.push(s);\n\n const ai = data.ai_instructions as\n | { warnings?: string[]; working_style?: Record<string, unknown> }\n | undefined;\n const prefs = data.preferences as Record<string, unknown> | undefined;\n const instant = data.instant_context as { key_files?: string[] } | undefined;\n const security = data.security as\n | { secrets?: string; example?: string; never?: string[] }\n | undefined;\n const commands = data.commands;\n const keyFiles = data.key_files ?? instant?.key_files;\n // Integration branch — git-flow repos PR into `dev`/`develop`, not `main`.\n // Read from project.default_branch; default `main`.\n const branch = present(data.project?.default_branch) ? String(data.project?.default_branch) : 'main';\n\n const entries = commands ? Object.entries(commands).filter(([, v]) => present(v)) : [];\n // Mutually exclusive so a key like `test:check` classifies ONCE (as a test).\n const testCmds = entries.filter(([k]) => /test/i.test(k));\n const lintCmds = entries.filter(([k]) => /lint|check/i.test(k) && !/test/i.test(k));\n const setupRaw = entries.filter(([k]) => !/test|lint|check/i.test(k));\n // Stable setup order: install → build → dev → start → other (enrich merge order is nondeterministic)\n const setupRank = (k: string): number => {\n const n = k.toLowerCase();\n if (/install|deps/.test(n)) {return 0;}\n if (/^build$|build/.test(n) && !/rebuild/.test(n)) {return 1;}\n if (/^dev$|develop/.test(n)) {return 2;}\n if (/^start$|run/.test(n)) {return 3;}\n return 4;\n };\n const setupCmds = [...setupRaw].sort((a, b) => setupRank(a[0]) - setupRank(b[0]) || a[0].localeCompare(b[0]));\n // Verify bar: tests first, then lint/typecheck (matches BETTER / agents-md-facts)\n const verifyCmds = [...testCmds, ...lintCmds];\n const testCmd = testCmds[0]?.[1];\n const buildCmd = setupCmds.find(([k]) => /build/i.test(k))?.[1];\n\n push(fafMetaTag(data));\n push();\n push(`# AGENTS.md — ${data.project?.name ?? 'Project'}`);\n push();\n\n // §1 Orientation — one line: what it is · language · type · version\n const bits: string[] = [];\n if (data.project?.main_language) {bits.push(String(data.project.main_language));}\n if (present(data.project?.type)) {bits.push(`type: ${String(data.project?.type)}`);}\n if (present(data.project?.version)) {bits.push(`v${String(data.project?.version)}`);}\n let orientation = data.project?.goal ? String(data.project.goal).trim() : '';\n if (bits.length) {orientation += (orientation ? ' — ' : '') + bits.join(' · ');}\n if (orientation) {\n push(orientation);\n push();\n }\n // Never spell the marker tokens out in prose: any injector that searches for\n // them (ours until 7.12.0, and other tools') would take the quote for the block.\n push('> Authored by faf — do not edit the managed block; refresh with `faf export --agents`. Hand-written content outside the managed block is preserved.');\n push();\n\n // §2 Setup & build\n if (setupCmds.length) {\n push('## Setup & build');\n push();\n push('```bash');\n for (const [k, v] of setupCmds) {push(`${v} # ${k}`);}\n push('```');\n push();\n }\n\n // §3 Run the tests — verify bar (tests + lint/typecheck)\n if (verifyCmds.length) {\n push('## Run the tests');\n push();\n push('```bash');\n for (const [, v] of verifyCmds) {push(v);}\n push('```');\n push();\n }\n\n // §4 Where things live — a `Path | Role` table when any entry carries a\n // \" — role\" annotation; a plain list when they're all bare paths.\n if (keyFiles && keyFiles.length) {\n push('## Where things live');\n push();\n const rows = keyFiles.map((f) => {\n const s = String(f);\n const at = s.indexOf(' — ');\n return at > 0 ? { path: s.slice(0, at), role: s.slice(at + 3) } : { path: s, role: '' };\n });\n if (rows.some((r) => r.role)) {\n push('| Path | Role |');\n push('|------|------|');\n for (const r of rows) {push(`| \\`${r.path}\\` | ${r.role} |`);}\n } else {\n for (const r of rows) {push(`- \\`${r.path}\\``);}\n }\n push();\n }\n\n // §5 Conventions — real repo constraints only (human↔assistant prefs excluded)\n const conventions = new Map<string, string>();\n const collect = (obj: Record<string, unknown> | undefined) => {\n if (!obj) {return;}\n for (const [k, v] of Object.entries(obj)) {\n if (HUMAN_PREF.has(k) || !present(v)) {continue;}\n const label = titleLabel(k);\n if (!conventions.has(label)) {conventions.set(label, fmtVal(v));}\n }\n };\n collect(ai?.working_style);\n collect(prefs);\n const detectedConv = (data.conventions as string[] | undefined) ?? [];\n if (conventions.size || detectedConv.length) {\n push('## Conventions');\n push();\n for (const [label, val] of conventions) {push(`- **${label}:** ${val}`);}\n for (const c of detectedConv) {if (present(c)) {push(`- ${c}`);}}\n push();\n }\n\n // §6 Guardrails — Always / Ask first / Never (three-tier BETTER)\n const warnings = (ai?.warnings ?? []).filter((w) => present(w));\n const always: string[] = ['read the tree'];\n if (testCmd) {always.push(`run the tests (\\`${testCmd}\\`)`);}\n if (buildCmd) {always.push('build the project');}\n for (const [, v] of lintCmds.slice(0, 1)) {always.push(`\\`${v}\\``);}\n\n push('## Guardrails');\n push();\n for (const w of warnings) {push(`- ${w}`);}\n push(`- **Always OK:** ${[...new Set(always)].join(' · ')}.`);\n push('- **Ask first:** dependency installs, deletions, migrations, schema changes, publish/release.');\n // Enable-then-restrict: safe path first, then the landmine\n push(`- **Never:** force-push · push straight to \\`${branch}\\` (branch and open a PR) · commit secrets.`);\n push();\n\n // §7 Definition of Done\n const dod: string[] = [];\n for (const [, v] of lintCmds) {dod.push(`\\`${v}\\` exits 0`);}\n for (const [, v] of testCmds) {dod.push(`\\`${v}\\` passes`);}\n dod.push('changes committed with a conventional message');\n push('## Definition of Done');\n push();\n push(`Done when: ${[...new Set(dod)].join(' · ')}.`);\n push();\n\n // §8 When stuck — static BETTER default (cheap, high value)\n push('## When stuck');\n push();\n push(\n `Ask a clarifying question, propose a short plan, or open a draft PR with notes — do not push large speculative changes to \\`${branch}\\`.`,\n );\n push();\n\n // §9 Security & secrets — when detected (never the values)\n if (security && (present(security.secrets) || (security.never ?? []).length)) {\n push('## Security & secrets');\n push();\n if (present(security.secrets)) {\n const ex = present(security.example) ? ` (see \\`${security.example}\\`)` : '';\n push(`- Secrets live in \\`${security.secrets}\\`${ex}. Never read or commit them.`);\n }\n for (const n of security.never ?? []) {if (present(n)) {push(`- Never read or commit \\`${n}\\`.`);}}\n push();\n }\n\n // §10 Commit & PR — always (defaults + optional commit_style)\n push('## Commit & PR');\n push();\n if (prefs && present(prefs.commit_style)) {\n push(`- Commit style: ${fmtVal(prefs.commit_style)}`);\n } else {\n push('- Conventional Commits preferred (`feat:`, `fix:`, `chore:`, …).');\n }\n push(`- Branch off \\`${branch}\\` and open a PR — never commit to \\`${branch}\\` directly.`);\n push('- If build/test scripts or layout change, refresh this file in the **same PR** (`faf export --agents`).');\n push();\n\n // Stack (reference) — actual stack only; omit empty / all-slotignored noise\n if (data.stack) {\n const stack: string[] = [];\n for (const [key, value] of Object.entries(data.stack)) {\n if (NON_STACK.has(key)) {continue;}\n if (filled(value)) {stack.push(`- **${slotLabel(`stack.${key}`)}:** ${value.trim()}`);}\n }\n if (stack.length) {\n push('## Stack');\n push();\n for (const s of stack) {push(s);}\n push();\n }\n }\n\n // No Human Context section — who/why marketing is README / .faf DNA, not agent ops (BETTER).\n\n const gen = data.generated;\n if (present(gen)) {push(`*Context authored: ${String(gen)}*`);}\n\n return lines.join('\\n');\n}\n\n/** Write AGENTS.md — non-destructive: injects/updates the faf block, preserves the rest. */\nexport function writeAgentsMd(dir: string, data: FafData): void {\n injectFafBlock(join(dir, FAF_CONTEXT_FILES.agents), renderAgentsMd(data));\n}\n",
|
|
@@ -132,9 +132,9 @@
|
|
|
132
132
|
"import { join } from 'path';\nimport type { FafData } from '../core/types.js';\nimport { FAF_CONTEXT_FILES } from '../core/safe-write.js';\nimport { fafMetaTag } from './claude.js';\nimport { injectFafBlock } from './inject.js';\nimport { filled, slotLabel } from './labels.js';\n\n/** Render .cursorrules content from .faf data */\nexport function renderCursorrules(data: FafData): string {\n const lines: string[] = [];\n\n lines.push(fafMetaTag(data));\n lines.push('');\n lines.push('# .cursorrules');\n lines.push(`# Authored from project.faf — ${data.project?.name ?? 'Project'}`);\n lines.push('');\n\n if (data.project?.main_language) {\n lines.push(`language: ${data.project.main_language}`);\n }\n\n if (data.stack) {\n lines.push('');\n lines.push('# Stack');\n for (const [key, value] of Object.entries(data.stack)) {\n if (filled(value)) {\n lines.push(`# ${slotLabel(`stack.${key}`)}: ${value.trim()}`);\n }\n }\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\n/** Write .cursorrules — non-destructive: injects/updates the faf block (hash-comment markers), preserves the rest. */\nexport function writeCursorrules(dir: string, data: FafData): void {\n injectFafBlock(join(dir, FAF_CONTEXT_FILES.cursorrules), renderCursorrules(data), '# faf:start', '# faf:end');\n}\n",
|
|
133
133
|
"import { join } from 'path';\nimport type { FafData } from '../core/types.js';\nimport { FAF_CONTEXT_FILES, makeDirInside } from '../core/safe-write.js';\nimport { fafMetaTag } from './claude.js';\nimport { FAF_END, FAF_START, injectFafBlock } from './inject.js';\nimport { filled, slotLabel } from './labels.js';\n\n/**\n * Command slots → the imperative verb that introduces them in \"## Build & run\".\n * Today the .faf carries `build` (+ `cicd`, handled separately). The rest land\n * with Option B (schema enrichment); the emitter already consumes them, so B is\n * pure data — no emitter rework. Order = the order a contributor runs them.\n */\nconst COMMAND_VERBS: ReadonlyArray<readonly [string, string]> = [\n ['install', 'Install with'],\n ['build', 'Build with'],\n ['test', 'Test with'],\n ['lint', 'Lint with'],\n ['run', 'Run with'],\n ['start', 'Start with'],\n ['dev', 'Run the dev server with'],\n];\nconst COMMAND_SLOTS = new Set<string>([...COMMAND_VERBS.map(([k]) => k), 'cicd']);\n\n/**\n * Render `.github/copilot-instructions.md` content from .faf data.\n *\n * GitHub Copilot's repository-wide custom-instructions file — the WIDEST-supported\n * instruction surface (web chat, code review, VS Code, JetBrains, Visual Studio,\n * Eclipse, Xcode, Copilot CLI, coding agent), injected into EVERY request.\n *\n * Built to GitHub's published custom-instructions guidance:\n * short, self-contained, imperative INSTRUCTIONS — not a metadata dump. So we lead\n * with the goal as a prose overview, Title-Case labels (acronym-aware), surface the\n * build/run steps as copy-pasteable commands, keep it compact, and avoid every named\n * anti-pattern (no tone/length rules, no external references). Deliberately NOT a\n * clone of AGENTS.md (which it outranks in-repo) — they are complementary.\n *\n * Strictly faithful to the .faf — nothing invented (GitHub bans speculative,\n * task-specific instructions). Future-proof: the command section + Title-Caser\n * already consume the richer slots Option B will add (test/lint/run, …), so this\n * emitter is built once and grows with the data.\n */\nexport function renderCopilotInstructions(data: FafData): string {\n const lines: string[] = [];\n const name = data.project?.name ?? 'Project';\n\n lines.push(fafMetaTag(data));\n lines.push('');\n lines.push(`# GitHub Copilot Instructions — ${name}`);\n lines.push('');\n lines.push(\n '> Authored from project.faf by FAF. Copilot reads these instructions on every request in this repository — keep them short and broadly applicable.',\n );\n lines.push('');\n\n // Project Overview — the goal as prose (not a `- **Goal:**` bullet).\n if (filled(data.project?.goal)) {\n lines.push(data.project!.goal!.trim());\n lines.push('');\n }\n\n // Tech stack — Title-Cased (acronym-aware) labels, Language first; command slots below.\n const stack = data.stack ?? {};\n const stackEntries: string[] = [];\n if (filled(data.project?.main_language)) {\n stackEntries.push(`- **Language:** ${data.project!.main_language!.trim()}`);\n }\n for (const [key, val] of Object.entries(stack)) {\n if (COMMAND_SLOTS.has(key)) {continue;}\n if (filled(val)) {stackEntries.push(`- **${slotLabel(`stack.${key}`)}:** ${val.trim()}`);}\n }\n if (stackEntries.length > 0) {\n lines.push('## Tech stack', '', ...stackEntries, '');\n }\n\n // Build & run — surface real commands imperatively (GitHub's highest-value section).\n const cmds: string[] = [];\n for (const [slot, verb] of COMMAND_VERBS) {\n const val = (stack as Record<string, unknown>)[slot];\n if (filled(val)) {cmds.push(`- ${verb} \\`${val.trim()}\\`.`);}\n }\n if (filled(stack.cicd)) {cmds.push(`- CI runs on ${stack.cicd.trim()}.`);}\n if (cmds.length > 0) {\n lines.push('## Build & run', '', ...cmds, '');\n }\n\n // Project context — the 6Ws, Title-Cased (mirrors CLAUDE.md), as orientation.\n const hc = data.human_context ?? {};\n const sixW: [string, unknown][] = [\n ['who', hc.who], ['what', hc.what], ['why', hc.why],\n ['where', hc.where], ['when', hc.when], ['how', hc.how],\n ];\n const ctx = sixW.filter(([, v]) => filled(v)).map(([k, v]) => `- **${slotLabel(`human_context.${k}`)}:** ${(v as string).trim()}`);\n if (ctx.length > 0) {\n lines.push('## Project context', '', ...ctx, '');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Write `.github/copilot-instructions.md` — non-destructive (injects/updates the\n * faf block, preserves the rest). Creates the `.github/` directory if absent.\n * The project folder is the boundary: a `.github` linked outside it is refused.\n */\nexport function writeCopilotInstructions(dir: string, data: FafData): void {\n makeDirInside(dir, '.github');\n injectFafBlock(join(dir, '.github', FAF_CONTEXT_FILES.copilot), renderCopilotInstructions(data), FAF_START, FAF_END, {\n root: dir,\n });\n}\n",
|
|
134
134
|
"/**\n * Claude Code auto-memory — the MEMORY.md Claude Code loads at the start of a\n * session: `<config>/projects/<project-id>/memory/MEMORY.md`.\n *\n * Moved here from claude-faf-mcp (its tri-sync writer and path resolver) so\n * every FAF tool shares one copy, with what the audit found fixed.\n *\n * WHERE the file is — Claude Code's own rule (mirrored from Claude Code 2.1.x):\n * - Project root: the canonical git root of the folder — the first folder at\n * or above it that has a `.git` (a folder or a file). A linked worktree\n * resolves to its main checkout, so every worktree shares one memory. A\n * folder that is not in git is its own root.\n * - Project id: that path with every character outside [a-zA-Z0-9] replaced\n * by `-` (so `/home/me/my_app` → `-home-me-my-app`). An id longer than\n * 200 characters is cut to 200 and gets `-` plus a base-36 hash of the\n * full path.\n * - Base: CLAUDE_CODE_REMOTE_MEMORY_DIR when set, else Claude's config\n * folder: CLAUDE_CONFIG_DIR, else ~/.claude.\n * Not read: Claude Code's `autoMemoryDirectory` setting (or any other\n * override of the whole memory folder). When one is set, pass `memoryDir`.\n *\n * WHAT faf writes — one managed block (the same markers and injector as\n * CLAUDE.md). Everything else in the file is Claude's and is kept byte for\n * byte, CRLF line ends and a BOM included:\n * - no MEMORY.md → the file is created with the block\n * - faf's block is there → only the text between its marker lines changes\n * - claude-faf-mcp's earlier section (its `# Project Context (from\n * project.faf)` line through its `*This section is managed by tri-sync.`\n * line, both whole lines) → replaced in place by the block, once\n * - anything else → the block goes on top; nothing is removed\n * Markers match whole lines only (faf's own exactly), never substrings, and\n * only outside fenced code, raw HTML blocks and multi-line HTML comments, as\n * both CommonMark and a plain column-0 reading see them (a note that quotes\n * the block or the old section is an example, not a marker; see inject.ts).\n * When the block goes on top of a file whose older faf block sits in such a\n * region, the result's warnings say so in one line. Only a missing file reads\n * as \"no file\": any other read error is thrown and nothing is written, and a\n * file that is not UTF-8 is refused. The write is atomic, is refused if the\n * file changed on disk after faf read it, and a run that changes nothing\n * writes nothing.\n */\n\nimport { existsSync, lstatSync, readFileSync, realpathSync, statSync } from 'fs';\nimport { homedir } from 'os';\nimport { basename, dirname, join, resolve } from 'path';\nimport type { FafData } from '../core/types.js';\nimport { FAF_CONTEXT_FILES, makeDirInside, resolveInside, safeWriteFile } from '../core/safe-write.js';\nimport {\n findFafBlock,\n findMarkedRange,\n legacyStampNote,\n placeFafBlock,\n readIfPresent,\n withFafBlock,\n wrapFafBlock,\n} from './inject.js';\nimport { filled, slotLabel } from './labels.js';\n\n/** Claude Code cuts a project id at this length and adds a hash. */\nconst MAX_ID = 200;\n/** Claude Code loads this many lines of MEMORY.md into a session. */\nconst LOADED_LINES = 200;\n/** Longest list faf puts in the block (commands, key files), so the block\n * stays short and leaves Claude's own notes inside the loaded lines. */\nconst LIST_CAP = 12;\n\n/** claude-faf-mcp's earlier section: its heading line and its closing line. */\nconst LEGACY_START = '# Project Context (from project.faf)';\nconst LEGACY_END_PREFIX = '*This section is managed by tri-sync.';\n\nexport interface ClaudeMemoryOptions {\n /** Claude Code's config folder. Default: CLAUDE_CODE_REMOTE_MEMORY_DIR,\n * else CLAUDE_CONFIG_DIR, else ~/.claude. */\n configDir?: string;\n /** The memory folder itself, when you know better than the rule (Claude\n * Code's `autoMemoryDirectory` setting, say). Skips the resolver. */\n memoryDir?: string;\n}\n\n/** What `writeClaudeMemory` did. */\nexport type ClaudeMemoryAction = 'created' | 'updated' | 'migrated' | 'added' | 'unchanged';\n\nexport interface ClaudeMemoryResult {\n /** The MEMORY.md (its real path). */\n path: string;\n /**\n * - `created` there was no MEMORY.md; it now holds the block\n * - `updated` faf's block was replaced in place\n * - `migrated` claude-faf-mcp's earlier section was replaced by the block\n * - `added` the file had neither; the block went on top\n * - `unchanged` the block was already exactly this; nothing was written\n */\n action: ClaudeMemoryAction;\n /** False when nothing was written (`unchanged`). */\n written: boolean;\n /** Every byte outside faf's block is still in the file, in place — checked\n * by reading the file back after the write. */\n preserved: boolean;\n /** Lines in the file now. */\n lines: number;\n /** Plain-words notes (e.g. lines past the 200 Claude Code loads). */\n warnings: string[];\n}\n\n/** What is in the MEMORY.md Claude Code loads for a project (read only). */\nexport interface ClaudeMemoryStatus {\n /** The MEMORY.md path (whether or not it exists). */\n path: string;\n exists: boolean;\n /** Lines in the file. */\n lines: number;\n /** faf's block is in the file. */\n hasBlock: boolean;\n /** Lines in faf's block, its marker lines included (0 when there is none). */\n blockLines: number;\n /** claude-faf-mcp's earlier tri-sync section is in the file (the next write replaces it). */\n hasLegacySection: boolean;\n /** Non-blank lines outside faf's block: Claude's own notes. */\n otherLines: number;\n /** Plain-words notes (e.g. lines past the 200 Claude Code loads). */\n warnings: string[];\n}\n\n/** Claude Code's 32-bit string hash (over UTF-16 code units). */\nfunction claudeHash(s: string): number {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) - h + s.charCodeAt(i)) | 0;\n }\n return h;\n}\n\n/**\n * Claude Code's folder name for a project path: every character outside\n * [a-zA-Z0-9] becomes `-`; past 200 characters the id is cut to 200 and gets\n * `-` plus a base-36 hash of the full path. `/home/me/my_app` → `-home-me-my-app`.\n * Pass the project root (see {@link claudeProjectRoot}), not any folder.\n */\nexport function claudeProjectId(projectRoot: string): string {\n const id = projectRoot.replace(/[^a-zA-Z0-9]/g, '-');\n if (id.length <= MAX_ID) {return id;}\n return `${id.slice(0, MAX_ID)}-${Math.abs(claudeHash(projectRoot)).toString(36)}`;\n}\n\n/** A `.git` Claude Code counts: a folder or a file (a link that leads to one). */\nfunction isGitEntry(p: string): boolean {\n try {\n const st = lstatSync(p);\n if (st.isSymbolicLink()) {\n const target = statSync(p);\n return target.isDirectory() || target.isFile();\n }\n return st.isDirectory() || st.isFile();\n } catch {\n return false;\n }\n}\n\n/** A plain file (not a link) — the only kind of worktree pointer file followed. */\nfunction isPlainFile(p: string): boolean {\n try {\n return lstatSync(p).isFile();\n } catch {\n return false;\n }\n}\n\n/** The first folder at or above `start` with a `.git`, or null. */\nfunction findGitRoot(start: string): string | null {\n let cur = start;\n for (;;) {\n if (isGitEntry(join(cur, '.git'))) {return cur;}\n const parent = dirname(cur);\n if (parent === cur) {return null;}\n cur = parent;\n }\n}\n\n/**\n * The main checkout of a linked worktree, or `root` itself. Follows git's own\n * pointers and trusts them only when they agree: `.git` is a file saying\n * `gitdir: <dir>`, `<dir>/commondir` names the shared git folder, `<dir>` sits\n * in that folder's `worktrees/`, and `<dir>/gitdir` points back at this\n * `.git`. Anything else (a plain `.git` folder, a submodule, a mismatch) → `root`.\n */\nfunction canonicalGitRoot(root: string): string {\n let pointer: string;\n try {\n pointer = readFileSync(join(root, '.git'), 'utf-8').trim();\n } catch {\n return root; // a .git folder: already the main checkout\n }\n try {\n if (!pointer.startsWith('gitdir:')) {return root;}\n const gitDir = resolve(root, pointer.slice('gitdir:'.length).trim());\n const commondirFile = join(gitDir, 'commondir');\n if (!isPlainFile(commondirFile)) {return root;}\n const common = resolve(gitDir, readFileSync(commondirFile, 'utf-8').trim());\n if (resolve(dirname(gitDir)) !== join(common, 'worktrees')) {return root;}\n const backFile = join(gitDir, 'gitdir');\n if (!isPlainFile(backFile)) {return root;}\n const back = readFileSync(backFile, 'utf-8').trim();\n if (realpathSync(resolve(gitDir, back)) !== join(realpathSync(root), '.git')) {return root;}\n if (basename(common) !== '.git') {\n // A bare repo with worktrees: its folder is the root, unless it is itself inside a checkout.\n return isGitEntry(join(common, '.git')) ? root : common;\n }\n return dirname(common);\n } catch {\n return root;\n }\n}\n\n/**\n * The project root Claude Code keys a folder's memory by: the canonical git\n * root (a linked worktree → its main checkout), or the folder itself when it\n * is not in git. The folder is resolved on disk first (links followed), as\n * Claude Code sees its working folder; the result is NFC-normalized.\n */\nexport function claudeProjectRoot(dir: string): string {\n let start = resolve(dir);\n try {\n start = realpathSync.native(start);\n } catch {\n /* not on disk: keep the resolved path */\n }\n const gitRoot = findGitRoot(start);\n return (gitRoot ? canonicalGitRoot(gitRoot) : start).normalize('NFC');\n}\n\n/** `<config>/projects/<project-id>/memory` for the project `dir` is in. */\nexport function resolveClaudeMemoryDir(dir: string, opts: ClaudeMemoryOptions = {}): string {\n if (opts.memoryDir) {return resolve(opts.memoryDir);}\n const base =\n opts.configDir ||\n process.env.CLAUDE_CODE_REMOTE_MEMORY_DIR ||\n process.env.CLAUDE_CONFIG_DIR ||\n join(homedir(), '.claude');\n return join(resolve(base), 'projects', claudeProjectId(claudeProjectRoot(dir)), 'memory').normalize('NFC');\n}\n\n/** The MEMORY.md Claude Code loads for the project `dir` is in. */\nexport function resolveClaudeMemoryPath(dir: string, opts: ClaudeMemoryOptions = {}): string {\n return join(resolveClaudeMemoryDir(dir, opts), FAF_CONTEXT_FILES.memory);\n}\n\n/** Stack keys that are context, not stack (kept out of the Stack list). */\nconst NON_STACK = new Set(['target_user', 'core_problem', 'mission_purpose']);\nconst SIX_WS = ['who', 'what', 'why', 'where', 'when', 'how'] as const;\n\n/**\n * The block body faf keeps in MEMORY.md, from .faf data: a short project\n * summary (name, goal, language, type), the filled stack slots, the 6 Ws,\n * and up to 12 commands and key files. Kept short on purpose — Claude Code\n * loads only the first 200 lines, and the rest of the file is Claude's.\n */\nexport function renderClaudeMemory(data: FafData): string {\n const project = data.project ?? {};\n const summary: [string, unknown][] = [['Goal', project.goal], ['Language', project.main_language], ['Type', project.type]];\n const hc = data.human_context ?? {};\n const keyFiles = Array.isArray(data.key_files) ? data.key_files : [];\n\n const lines = [\n '## Project context — from project.faf',\n '',\n `- **Name:** ${filled(project.name) ? project.name : 'Project'}`,\n ...summary.filter(([, v]) => filled(v)).map(([label, v]) => `- **${label}:** ${v as string}`),\n ...section('Stack', Object.entries(data.stack ?? {})\n .filter(([k, v]) => !NON_STACK.has(k) && filled(v))\n .map(([k, v]) => `- **${slotLabel(`stack.${k}`)}:** ${v as string}`)),\n ...section('Context', SIX_WS.filter(w => filled(hc[w])).map(w => `- **${slotLabel(`human_context.${w}`)}:** ${hc[w] as string}`)),\n ...section('Commands', Object.entries(data.commands ?? {})\n .filter(([, v]) => filled(v))\n .slice(0, LIST_CAP)\n .map(([k, v]) => `- ${k}: \\`${v}\\``)),\n ...section('Key files', keyFiles.filter(filled).slice(0, LIST_CAP).map(f => `- ${f}`)),\n '',\n \"*faf keeps this block in step with project.faf. Everything outside it is Claude's own and is kept as written.*\",\n ];\n return lines.join('\\n');\n}\n\n/** A `### title` section after a blank line, or nothing when it has no items. */\nfunction section(title: string, items: string[]): string[] {\n return items.length > 0 ? ['', `### ${title}`, ...items] : [];\n}\n\n/** claude-faf-mcp's earlier section: its heading as a whole line at column 0,\n * through the first later line that starts with its closing text — both\n * outside fenced code, raw HTML blocks and multi-line HTML comments (the\n * injector's own CommonMark scanner). The range covers both lines (the\n * closing line's terminator excluded), or null. A heading whose closing\n * line appears only inside a fence (a note quoting the old section) is not\n * a section: the file is Claude's, and the block goes on top. */\nfunction findLegacySection(text: string): { start: number; end: number } | null {\n return findMarkedRange(\n text,\n line => line.trimEnd() === LEGACY_START,\n line => line.startsWith(LEGACY_END_PREFIX),\n );\n}\n\n/** Lines in a text (a final line break does not start another line). */\nfunction countLines(text: string): number {\n if (text === '') {return 0;}\n const breaks = text.match(/\\r\\n|\\r|\\n/g)?.length ?? 0;\n return /(\\r\\n|\\r|\\n)$/.test(text) ? breaks : breaks + 1;\n}\n\ninterface Plan {\n text: string;\n action: Exclude<ClaudeMemoryAction, 'unchanged'>;\n /** Text before and after faf's block that must come back unchanged. */\n head: string;\n tail: string;\n}\n\n/** The new file text, and what of the old text must survive around the\n * block. `path` names the file when faf cannot place its block there (a\n * SafePathError `unplaceable`; nothing is written). */\nfunction plan(existing: string | null, wrapped: string, path: string): Plan {\n if (existing === null) {\n return { text: withFafBlock(null, wrapped, undefined, undefined, path), action: 'created', head: '', tail: '' };\n }\n const block = findFafBlock(existing);\n const range = block ?? findLegacySection(existing);\n if (range) {\n const head = existing.slice(0, range.start);\n const tail = existing.slice(range.end);\n return { text: placeFafBlock(head, wrapped, tail, undefined, undefined, path), action: block ? 'updated' : 'migrated', head, tail };\n }\n const bom = existing.startsWith('\\uFEFF') ? '\\uFEFF' : '';\n return { text: withFafBlock(existing, wrapped, undefined, undefined, path), action: 'added', head: bom, tail: existing.slice(bom.length) };\n}\n\n/** The 200-line note, when the text is past what Claude Code loads. */\nfunction lineWarnings(lines: number): string[] {\n return lines > LOADED_LINES\n ? [`MEMORY.md is ${lines} lines. Claude Code loads the first ${LOADED_LINES}; lines after that are kept in the file but not loaded.`]\n : [];\n}\n\n/**\n * Read what is in the MEMORY.md Claude Code loads for the project `dir` is in:\n * whether faf's block (or claude-faf-mcp's earlier section) is there, and how\n * many lines are Claude's own. Reads only; never creates or writes anything.\n * A file that exists but cannot be read throws.\n */\nexport function claudeMemoryStatus(dir: string, opts: ClaudeMemoryOptions = {}): ClaudeMemoryStatus {\n const memoryDir = resolveClaudeMemoryDir(dir, opts);\n const path = join(memoryDir, FAF_CONTEXT_FILES.memory);\n const empty = { path, exists: false, lines: 0, hasBlock: false, blockLines: 0, hasLegacySection: false, otherLines: 0, warnings: [] };\n if (!existsSync(memoryDir)) {return empty;}\n const text = readIfPresent(resolveInside(memoryDir, FAF_CONTEXT_FILES.memory));\n if (text === null) {return empty;}\n const block = findFafBlock(text);\n const outside = block ? `${text.slice(0, block.start)}${text.slice(block.end)}` : text;\n const lines = countLines(text);\n return {\n path,\n exists: true,\n lines,\n hasBlock: block !== null,\n blockLines: block ? countLines(text.slice(block.start, block.end)) : 0,\n hasLegacySection: !block && findLegacySection(text) !== null,\n otherLines: outside.split(/\\r\\n|\\r|\\n/).filter(l => l.replace(/^\\uFEFF/, '').trim() !== '').length,\n warnings: lineWarnings(lines),\n };\n}\n\n/**\n * Write faf's block into the MEMORY.md Claude Code loads for the project `dir`\n * is in (see the file header for the path rule and what is kept). Creates the\n * memory folder when it is not there yet. Throws — having written nothing —\n * when the file cannot be read (other than not existing), is not UTF-8, is a\n * link that leaves the memory folder, changed on disk while faf was writing,\n * cannot be written (the original is kept), or is one where faf cannot place\n * its block where its next run finds it again (SafePathError `unplaceable`,\n * the same one-line refusal as injectFafBlock).\n */\nexport function writeClaudeMemory(dir: string, data: FafData, opts: ClaudeMemoryOptions = {}): ClaudeMemoryResult {\n const memoryDir = resolveClaudeMemoryDir(dir, opts);\n makeDirInside(memoryDir);\n const path = resolveInside(memoryDir, FAF_CONTEXT_FILES.memory);\n const existing = readIfPresent(path);\n const next = plan(existing, wrapFafBlock(renderClaudeMemory(data)), path);\n\n if (next.text === existing) {\n const lines = countLines(existing);\n return { path, action: 'unchanged', written: false, preserved: true, lines, warnings: lineWarnings(lines) };\n }\n\n const written = safeWriteFile(path, next.text, { root: memoryDir, expect: existing });\n const after = readFileSync(written, 'utf-8');\n const preserved = after === next.text && after.startsWith(next.head) && after.endsWith(next.tail);\n const lines = countLines(after);\n // The block went on top of a file whose older faf block sits in a code\n // fence or comment: say so, as `faf sync` does for CLAUDE.md.\n const older = next.action === 'added' ? legacyStampNote(FAF_CONTEXT_FILES.memory, existing) : null;\n return { path: written, action: next.action, written: true, preserved, lines, warnings: [...(older ? [older] : []), ...lineWarnings(lines)] };\n}\n",
|
|
135
|
-
"import {
|
|
135
|
+
"import type { FafData } from '../core/types.js';\nimport { readRepoFile, repoExists } from '../core/safe-write.js';\nimport { detectCommands, detectKeyFiles } from './scanner.js';\n\ntype Pkg = {\n type?: string;\n scripts?: Record<string, string>;\n devDependencies?: Record<string, string>;\n} | null;\n\n/**\n * Detect the toolchain that governs code conventions. Emits POINTERS (\"obey the\n * configs\"), never restated lint rules — restating toolchain-enforced rules is a\n * known AGENTS.md anti-pattern (ASDLC \"toolchain-first\").\n */\nfunction detectConventions(dir: string, pkg: Pkg): string[] {\n const conv: string[] = [];\n const has = (f: string): boolean => repoExists(dir, f);\n const read = (f: string): string => readRepoFile(dir, f) ?? '';\n\n if (has('tsconfig.json') && /\"strict\"\\s*:\\s*true/.test(read('tsconfig.json'))) {\n conv.push('TypeScript strict mode (tsconfig.json)');\n }\n if (pkg?.type === 'module') {conv.push('ESM modules (`type: module`)');}\n\n const tools: string[] = [];\n const dev = pkg?.devDependencies ?? {};\n if (\n has('.eslintrc') || has('.eslintrc.json') || has('.eslintrc.cjs') ||\n has('eslint.config.js') || has('eslint.config.mjs') || 'eslint' in dev\n ) {\n tools.push('ESLint');\n }\n if (has('.prettierrc') || has('.prettierrc.json') || has('prettier.config.js') || 'prettier' in dev) {\n tools.push('Prettier');\n }\n const py = has('pyproject.toml') ? read('pyproject.toml') : '';\n if (/\\[tool\\.black\\]/.test(py)) {tools.push('black');}\n if (/\\[tool\\.ruff\\]/.test(py)) {tools.push('ruff');}\n if (/\\[tool\\.mypy\\]/.test(py)) {tools.push('mypy');}\n if (has('rustfmt.toml') || has('.rustfmt.toml')) {tools.push('rustfmt');}\n if (tools.length) {conv.push(`Style enforced by ${tools.join(' · ')} — obey the configs`);}\n\n return conv;\n}\n\n/**\n * Enrich .faf data with facts DETECTED from the repo at export time, so a lean\n * or stale .faf still yields a complete AGENTS.md — the \"frictionless, any repo\"\n * goal. Fill-if-absent: hand-authored .faf values always WIN; detection only\n * fills the gaps. Pure (returns a shallow copy; never mutates the input).\n *\n * Detects: build/test/lint commands, key files/entry points, and secrets\n * (.env presence — location only, never the values).\n */\nexport function enrichFromRepo(dir: string, data: FafData): FafData {\n const out: FafData = { ...data };\n\n let pkg: unknown = null;\n const pj = readRepoFile(dir, 'package.json');\n if (pj !== null) {\n try {\n pkg = JSON.parse(pj);\n } catch {\n pkg = null;\n }\n }\n\n // Commands: detected fills gaps; any hand-authored command key wins.\n const detected = detectCommands(dir, pkg as never);\n if (Object.keys(detected).length) {\n out.commands = { ...detected, ...(data.commands ?? {}) };\n }\n\n // Key files: keep the hand-authored list if present, else use detected.\n const existing =\n data.key_files ?? (data.instant_context as { key_files?: string[] } | undefined)?.key_files;\n if (!existing || existing.length === 0) {\n const files = detectKeyFiles(dir);\n if (files.length) {out.key_files = files;}\n }\n\n // Security: detect a secrets file (.env), keep hand-authored if present.\n if (!data.security) {\n const envFiles = ['.env', '.env.local', '.env.development'];\n const secrets = envFiles.find((f) => repoExists(dir, f));\n if (secrets) {\n const example = ['.env.example', '.env.sample', '.env.template'].find((f) =>\n repoExists(dir, f),\n );\n out.security = { secrets, ...(example ? { example } : {}) };\n }\n }\n\n // Conventions: detect the governing toolchain (fill-if-absent).\n if (!data.conventions) {\n const conv = detectConventions(dir, pkg as Pkg);\n if (conv.length) {out.conventions = conv;}\n }\n\n return out;\n}\n"
|
|
136
136
|
],
|
|
137
|
-
"mappings": "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",
|
|
138
|
-
"debugId": "
|
|
137
|
+
"mappings": "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",
|
|
138
|
+
"debugId": "EAF10E0ADC4E055F64756E2164756E21",
|
|
139
139
|
"names": []
|
|
140
140
|
}
|