faf-cli 6.0.13 → 6.0.15

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/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{createRequire as _}from"node:module";var E=Object.defineProperty;var b=(P,B)=>()=>(B||P((B={exports:{}}).exports,B),B.exports);var w=(P,B)=>{for(var H in B)E(P,H,{get:B[H],enumerable:!0,configurable:!0,set:(Y)=>B[H]=()=>Y})};var i=_(import.meta.url);var u=b((r,W)=>{var __dirname="/Users/wolfejam/FAF/cli/node_modules/faf-scoring-kernel",x={};x.__wbindgen_placeholder__=r;var R=null;function D(){if(R===null||R.byteLength===0)R=new Uint8Array(z.memory.buffer);return R}var v=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});v.decode();function n(P,B){return v.decode(D().subarray(P,P+B))}function $(P,B){return P=P>>>0,n(P,B)}r.sdk_version=function(){let P,B;try{let H=z.sdk_version();return P=H[0],B=H[1],$(H[0],H[1])}finally{z.__wbindgen_free(P,B,1)}};var X=0,F=new TextEncoder;if(!("encodeInto"in F))F.encodeInto=function(P,B){let H=F.encode(P);return B.set(H),{read:P.length,written:H.length}};function h(P,B,H){if(H===void 0){let q=F.encode(P),K=B(q.length,1)>>>0;return D().subarray(K,K+q.length).set(q),X=q.length,K}let Y=P.length,I=B(Y,1)>>>0,Q=D(),J=0;for(;J<Y;J++){let q=P.charCodeAt(J);if(q>127)break;Q[I+J]=q}if(J!==Y){if(J!==0)P=P.slice(J);I=H(I,Y,Y=J+P.length*3,1)>>>0;let q=D().subarray(I+J,I+Y),K=F.encodeInto(P,q);J+=K.written,I=H(I,Y,J,1)>>>0}return X=J,I}function G(P){let B=z.__wbindgen_externrefs.get(P);return z.__externref_table_dealloc(P),B}r.score_faf_enterprise=function(P){let B,H;try{let Q=h(P,z.__wbindgen_malloc,z.__wbindgen_realloc),J=X,q=z.score_faf_enterprise(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};r.score_faf=function(P){let B,H;try{let Q=h(P,z.__wbindgen_malloc,z.__wbindgen_realloc),J=X,q=z.score_faf(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};function M(P,B){let H=B(P.length*1,1)>>>0;return D().set(P,H/1),X=P.length,H}r.decompile_fafb=function(P){let B,H;try{let Q=M(P,z.__wbindgen_malloc),J=X,q=z.decompile_fafb(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};r.score_fafb=function(P){let B,H;try{let Q=M(P,z.__wbindgen_malloc),J=X,q=z.score_fafb(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};r.validate_faf=function(P){let B=h(P,z.__wbindgen_malloc,z.__wbindgen_realloc),H=X;return z.validate_faf(B,H)!==0};function s(P,B){return P=P>>>0,D().subarray(P/1,P/1+B)}r.compile_fafb=function(P){let B=h(P,z.__wbindgen_malloc,z.__wbindgen_realloc),H=X,Y=z.compile_fafb(B,H);if(Y[3])throw G(Y[2]);var I=s(Y[0],Y[1]).slice();return z.__wbindgen_free(Y[0],Y[1]*1,1),I};r.fafb_info=function(P){let B,H;try{let Q=M(P,z.__wbindgen_malloc),J=X,q=z.fafb_info(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};r.__wbindgen_cast_2241b6af4c4b2941=function(P,B){return $(P,B)};r.__wbindgen_init_externref_table=function(){let P=z.__wbindgen_externrefs,B=P.grow(4);P.set(0,void 0),P.set(B+0,void 0),P.set(B+1,null),P.set(B+2,!0),P.set(B+3,!1)};var l=`${__dirname}/faf_wasm_sdk_bg.wasm`,a=i("fs").readFileSync(l),t=new WebAssembly.Module(a),z=r.__wasm=new WebAssembly.Instance(t,x).exports;z.__wbindgen_start()});var N=[{index:1,path:"project.name",description:"Project name",category:"project"},{index:2,path:"project.goal",description:"What the project does",category:"project"},{index:3,path:"project.main_language",description:"Primary language",category:"project"},{index:4,path:"human_context.who",description:"Who is building this",category:"human"},{index:5,path:"human_context.what",description:"What are they building",category:"human"},{index:6,path:"human_context.why",description:"Why does it exist",category:"human"},{index:7,path:"human_context.where",description:"Where does it run",category:"human"},{index:8,path:"human_context.when",description:"When was it started / timeline",category:"human"},{index:9,path:"human_context.how",description:"How is it built",category:"human"},{index:10,path:"stack.frontend",description:"Framework (React, Svelte, etc.)",category:"frontend"},{index:11,path:"stack.css_framework",description:"CSS framework",category:"frontend"},{index:12,path:"stack.ui_library",description:"UI component library",category:"frontend"},{index:13,path:"stack.state_management",description:"State management",category:"frontend"},{index:14,path:"stack.backend",description:"Backend framework",category:"backend"},{index:15,path:"stack.api_type",description:"API style (REST, GraphQL, etc.)",category:"backend"},{index:16,path:"stack.runtime",description:"Runtime (Node, Bun, Python, etc.)",category:"backend"},{index:17,path:"stack.database",description:"Database",category:"backend"},{index:18,path:"stack.connection",description:"Connection method (Prisma, etc.)",category:"backend"},{index:19,path:"stack.hosting",description:"Hosting platform",category:"universal"},{index:20,path:"stack.build",description:"Build tool",category:"universal"},{index:21,path:"stack.cicd",description:"CI/CD",category:"universal"},{index:22,path:"stack.monorepo_tool",description:"Monorepo tool",category:"enterprise_infra"},{index:23,path:"stack.package_manager",description:"Package manager",category:"enterprise_infra"},{index:24,path:"stack.workspaces",description:"Workspace configuration",category:"enterprise_infra"},{index:25,path:"monorepo.packages_count",description:"Number of packages",category:"enterprise_infra"},{index:26,path:"monorepo.build_orchestrator",description:"Build orchestration tool",category:"enterprise_infra"},{index:27,path:"stack.admin",description:"Admin panel",category:"enterprise_app"},{index:28,path:"stack.cache",description:"Caching layer",category:"enterprise_app"},{index:29,path:"stack.search",description:"Search engine",category:"enterprise_app"},{index:30,path:"stack.storage",description:"Object storage",category:"enterprise_app"},{index:31,path:"monorepo.versioning_strategy",description:"Version strategy",category:"enterprise_ops"},{index:32,path:"monorepo.shared_configs",description:"Shared configs",category:"enterprise_ops"},{index:33,path:"monorepo.remote_cache",description:"Remote build cache",category:"enterprise_ops"}],c=new Map(N.map((P)=>[P.path,P]));function y(P){return N.filter((B)=>B.category===P)}var g=N.filter((P)=>P.index<=21),f=N,A=new Set(["describe your project goal","development teams","cloud platform","null","none","unknown","n/a","not applicable"]);function p(P){if(P===null||P===void 0||P==="")return!0;if(typeof P==="string")return A.has(P.toLowerCase().trim());if(Array.isArray(P)&&P.length===0)return!0;if(typeof P==="object"&&Object.keys(P).length===0)return!0;return!1}var C=(P)=>(B)=>`\x1B[${P}m${B}\x1B[0m`,S=C("1"),U=C("2"),UP=C("3"),L=(P)=>`\x1B[38;2;0;212;212m${P}\x1B[0m`,O=(P)=>`\x1B[38;5;208m${P}\x1B[0m`;var j=[{name:"TROPHY",indicator:`${O("\uD83C\uDFC6")} ${O("TROPHY")}`,threshold:100},{name:"GOLD",indicator:`${O(S("★"))} ${O("GOLD")}`,threshold:99},{name:"SILVER",indicator:`${L("◆")} ${L("SILVER")}`,threshold:95},{name:"BRONZE",indicator:`${L("◇")} ${L("BRONZE")}`,threshold:85},{name:"GREEN",indicator:`${S("●")} GREEN`,threshold:70},{name:"YELLOW",indicator:`${U("●")} YELLOW`,threshold:55},{name:"RED",indicator:`${U("○")} RED`,threshold:1},{name:"WHITE",indicator:`${U("♡")}`,threshold:0}];function V(P){for(let B of j)if(P>=B.threshold)return B;return j[j.length-1]}function d(P){let B=V(P),H=j.indexOf(B);return H>0?j[H-1]:null}function m(P){return{score:P.score,tier:V(P.score),populated:P.populated,empty:P.empty,ignored:P.ignored,active:P.active,total:P.total,slots:P.slots}}function o(P){let B=[];if(!P||typeof P!=="object")return B.push("File is not a valid YAML mapping"),{valid:!1,errors:B};let H=P;if(!H.faf_version)B.push("Missing required field: faf_version");if(!H.project?.name)B.push("Missing required field: project.name");return{valid:B.length===0,errors:B}}var T={};w(T,{validate:()=>$P,sdkVersion:()=>NP,scoreFafb:()=>KP,scoreEnterprise:()=>ZP,score:()=>XP,fafbInfo:()=>GP,decompile:()=>DP,compile:()=>jP});var k=null;function Z(){if(!k)try{k=u()}catch{throw Error(`faf-scoring-kernel not installed.
1
+ import{createRequire as c}from"node:module";var E=Object.defineProperty;var b=(P,B)=>()=>(B||P((B={exports:{}}).exports,B),B.exports);var w=(P)=>P;function _(P,B){this[P]=w.bind(null,B)}var i=(P,B)=>{for(var H in B)E(P,H,{get:B[H],enumerable:!0,configurable:!0,set:_.bind(B,H)})};var y=c(import.meta.url);var u=b((PP,W)=>{var __dirname="/Users/wolfejam/FAF/cli/node_modules/faf-scoring-kernel",x={};x.__wbindgen_placeholder__=PP;var R=null;function D(){if(R===null||R.byteLength===0)R=new Uint8Array(z.memory.buffer);return R}var v=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});v.decode();function l(P,B){return v.decode(D().subarray(P,P+B))}function $(P,B){return P=P>>>0,l(P,B)}PP.sdk_version=function(){let P,B;try{let H=z.sdk_version();return P=H[0],B=H[1],$(H[0],H[1])}finally{z.__wbindgen_free(P,B,1)}};var X=0,F=new TextEncoder;if(!("encodeInto"in F))F.encodeInto=function(P,B){let H=F.encode(P);return B.set(H),{read:P.length,written:H.length}};function h(P,B,H){if(H===void 0){let q=F.encode(P),K=B(q.length,1)>>>0;return D().subarray(K,K+q.length).set(q),X=q.length,K}let Y=P.length,I=B(Y,1)>>>0,Q=D(),J=0;for(;J<Y;J++){let q=P.charCodeAt(J);if(q>127)break;Q[I+J]=q}if(J!==Y){if(J!==0)P=P.slice(J);I=H(I,Y,Y=J+P.length*3,1)>>>0;let q=D().subarray(I+J,I+Y),K=F.encodeInto(P,q);J+=K.written,I=H(I,Y,J,1)>>>0}return X=J,I}function G(P){let B=z.__wbindgen_externrefs.get(P);return z.__externref_table_dealloc(P),B}PP.score_faf_enterprise=function(P){let B,H;try{let Q=h(P,z.__wbindgen_malloc,z.__wbindgen_realloc),J=X,q=z.score_faf_enterprise(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};PP.score_faf=function(P){let B,H;try{let Q=h(P,z.__wbindgen_malloc,z.__wbindgen_realloc),J=X,q=z.score_faf(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};function M(P,B){let H=B(P.length*1,1)>>>0;return D().set(P,H/1),X=P.length,H}PP.decompile_fafb=function(P){let B,H;try{let Q=M(P,z.__wbindgen_malloc),J=X,q=z.decompile_fafb(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};PP.score_fafb=function(P){let B,H;try{let Q=M(P,z.__wbindgen_malloc),J=X,q=z.score_fafb(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};PP.validate_faf=function(P){let B=h(P,z.__wbindgen_malloc,z.__wbindgen_realloc),H=X;return z.validate_faf(B,H)!==0};function a(P,B){return P=P>>>0,D().subarray(P/1,P/1+B)}PP.compile_fafb=function(P){let B=h(P,z.__wbindgen_malloc,z.__wbindgen_realloc),H=X,Y=z.compile_fafb(B,H);if(Y[3])throw G(Y[2]);var I=a(Y[0],Y[1]).slice();return z.__wbindgen_free(Y[0],Y[1]*1,1),I};PP.fafb_info=function(P){let B,H;try{let Q=M(P,z.__wbindgen_malloc),J=X,q=z.fafb_info(Q,J);var Y=q[0],I=q[1];if(q[3])throw Y=0,I=0,G(q[2]);return B=Y,H=I,$(Y,I)}finally{z.__wbindgen_free(B,H,1)}};PP.__wbindgen_cast_2241b6af4c4b2941=function(P,B){return $(P,B)};PP.__wbindgen_init_externref_table=function(){let P=z.__wbindgen_externrefs,B=P.grow(4);P.set(0,void 0),P.set(B+0,void 0),P.set(B+1,null),P.set(B+2,!0),P.set(B+3,!1)};var t=`${__dirname}/faf_wasm_sdk_bg.wasm`,r=y("fs").readFileSync(t),e=new WebAssembly.Module(r),z=PP.__wasm=new WebAssembly.Instance(e,x).exports;z.__wbindgen_start()});var N=[{index:1,path:"project.name",description:"Project name",category:"project"},{index:2,path:"project.goal",description:"What the project does",category:"project"},{index:3,path:"project.main_language",description:"Primary language",category:"project"},{index:4,path:"human_context.who",description:"Who is building this",category:"human"},{index:5,path:"human_context.what",description:"What are they building",category:"human"},{index:6,path:"human_context.why",description:"Why does it exist",category:"human"},{index:7,path:"human_context.where",description:"Where does it run",category:"human"},{index:8,path:"human_context.when",description:"When was it started / timeline",category:"human"},{index:9,path:"human_context.how",description:"How is it built",category:"human"},{index:10,path:"stack.frontend",description:"Framework (React, Svelte, etc.)",category:"frontend"},{index:11,path:"stack.css_framework",description:"CSS framework",category:"frontend"},{index:12,path:"stack.ui_library",description:"UI component library",category:"frontend"},{index:13,path:"stack.state_management",description:"State management",category:"frontend"},{index:14,path:"stack.backend",description:"Backend framework",category:"backend"},{index:15,path:"stack.api_type",description:"API style (REST, GraphQL, etc.)",category:"backend"},{index:16,path:"stack.runtime",description:"Runtime (Node, Bun, Python, etc.)",category:"backend"},{index:17,path:"stack.database",description:"Database",category:"backend"},{index:18,path:"stack.connection",description:"Connection method (Prisma, etc.)",category:"backend"},{index:19,path:"stack.hosting",description:"Hosting platform",category:"universal"},{index:20,path:"stack.build",description:"Build tool",category:"universal"},{index:21,path:"stack.cicd",description:"CI/CD",category:"universal"},{index:22,path:"stack.monorepo_tool",description:"Monorepo tool",category:"enterprise_infra"},{index:23,path:"stack.package_manager",description:"Package manager",category:"enterprise_infra"},{index:24,path:"stack.workspaces",description:"Workspace configuration",category:"enterprise_infra"},{index:25,path:"monorepo.packages_count",description:"Number of packages",category:"enterprise_infra"},{index:26,path:"monorepo.build_orchestrator",description:"Build orchestration tool",category:"enterprise_infra"},{index:27,path:"stack.admin",description:"Admin panel",category:"enterprise_app"},{index:28,path:"stack.cache",description:"Caching layer",category:"enterprise_app"},{index:29,path:"stack.search",description:"Search engine",category:"enterprise_app"},{index:30,path:"stack.storage",description:"Object storage",category:"enterprise_app"},{index:31,path:"monorepo.versioning_strategy",description:"Version strategy",category:"enterprise_ops"},{index:32,path:"monorepo.shared_configs",description:"Shared configs",category:"enterprise_ops"},{index:33,path:"monorepo.remote_cache",description:"Remote build cache",category:"enterprise_ops"}],g=new Map(N.map((P)=>[P.path,P]));function f(P){return N.filter((B)=>B.category===P)}var p=N.filter((P)=>P.index<=21),d=N,A=new Set(["describe your project goal","development teams","cloud platform","null","none","unknown","n/a","not applicable"]);function m(P){if(P===null||P===void 0||P==="")return!0;if(typeof P==="string")return A.has(P.toLowerCase().trim());if(Array.isArray(P)&&P.length===0)return!0;if(typeof P==="object"&&Object.keys(P).length===0)return!0;return!1}var C=(P)=>(B)=>`\x1B[${P}m${B}\x1B[0m`,S=C("1"),U=C("2"),RP=C("3"),L=(P)=>`\x1B[38;2;0;212;212m${P}\x1B[0m`,O=(P)=>`\x1B[38;5;208m${P}\x1B[0m`;var j=[{name:"TROPHY",indicator:`${O("\uD83C\uDFC6")} ${O("TROPHY")}`,threshold:100},{name:"GOLD",indicator:`${O(S("★"))} ${O("GOLD")}`,threshold:99},{name:"SILVER",indicator:`${L("◆")} ${L("SILVER")}`,threshold:95},{name:"BRONZE",indicator:`${L("◇")} ${L("BRONZE")}`,threshold:85},{name:"GREEN",indicator:`${S("●")} GREEN`,threshold:70},{name:"YELLOW",indicator:`${U("●")} YELLOW`,threshold:55},{name:"RED",indicator:`${U("○")} RED`,threshold:1},{name:"WHITE",indicator:`${U("♡")}`,threshold:0}];function V(P){for(let B of j)if(P>=B.threshold)return B;return j[j.length-1]}function o(P){let B=V(P),H=j.indexOf(B);return H>0?j[H-1]:null}function n(P){return{score:P.score,tier:V(P.score),populated:P.populated,empty:P.empty,ignored:P.ignored,active:P.active,total:P.total,slots:P.slots}}function s(P){let B=[];if(!P||typeof P!=="object")return B.push("File is not a valid YAML mapping"),{valid:!1,errors:B};let H=P;if(!H.faf_version)B.push("Missing required field: faf_version");if(!H.project?.name)B.push("Missing required field: project.name");return{valid:B.length===0,errors:B}}var T={};i(T,{validate:()=>DP,sdkVersion:()=>OP,scoreFafb:()=>LP,scoreEnterprise:()=>jP,score:()=>$P,fafbInfo:()=>NP,decompile:()=>KP,compile:()=>GP});var k=null;function Z(){if(!k)try{k=u()}catch{throw Error(`faf-scoring-kernel not installed.
2
2
 
3
3
  Run: npm install faf-scoring-kernel
4
- `)}return k}function XP(P){return JSON.parse(Z().score_faf(P))}function ZP(P){return JSON.parse(Z().score_faf_enterprise(P))}function $P(P){return Z().validate_faf(P)}function jP(P){return Z().compile_fafb(P)}function DP(P){return JSON.parse(Z().decompile_fafb(P))}function GP(P){return JSON.parse(Z().fafb_info(P))}function KP(P){return JSON.parse(Z().score_fafb(P))}function NP(){return Z().sdk_version()}export{o as validateFaf,y as slotsByCategory,T as kernel,p as isPlaceholder,V as getTier,d as getNextTier,m as enrichScore,j as TIERS,c as SLOT_BY_PATH,N as SLOTS,A as PLACEHOLDERS,f as ENTERPRISE_SLOTS,g as BASE_SLOTS};
4
+ `)}return k}function $P(P){return JSON.parse(Z().score_faf(P))}function jP(P){return JSON.parse(Z().score_faf_enterprise(P))}function DP(P){return Z().validate_faf(P)}function GP(P){return Z().compile_fafb(P)}function KP(P){return JSON.parse(Z().decompile_fafb(P))}function NP(P){return JSON.parse(Z().fafb_info(P))}function LP(P){return JSON.parse(Z().score_fafb(P))}function OP(){return Z().sdk_version()}export{s as validateFaf,f as slotsByCategory,T as kernel,m as isPlaceholder,V as getTier,o as getNextTier,n as enrichScore,j as TIERS,g as SLOT_BY_PATH,N as SLOTS,A as PLACEHOLDERS,d as ENTERPRISE_SLOTS,p as BASE_SLOTS};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "faf-cli",
3
- "version": "6.0.13",
4
- "description": "Persistent AI Context Standard — project DNA for AI. IANA-registered. Anthropic-approved.",
3
+ "version": "6.0.15",
4
+ "description": "51,582+ downloads | Claude Code Skills | Persistent AI Context Standard — project DNA for AI. IANA-registered. Anthropic-approved.",
5
5
  "type": "module",
6
6
  "icon": "https://faf.one/orange-smiley.svg",
7
7
  "logo": "https://faf.one/orange-smiley.svg",
@@ -18,12 +18,13 @@
18
18
  },
19
19
  "files": [
20
20
  "dist/**/*",
21
+ "skills/**/*",
21
22
  "README.md",
22
23
  "LICENSE",
23
24
  "project.faf"
24
25
  ],
25
26
  "scripts": {
26
- "dev": "bun src/cli.ts",
27
+ "dev": "bun run src/cli.ts",
27
28
  "build": "bun build src/cli.ts --outfile dist/cli.js --target=node --minify && bun build src/index.ts --outfile dist/index.js --target=node --minify",
28
29
  "compile": "bun build src/cli.ts --compile --bytecode --minify --outfile faf",
29
30
  "compile:all": "bun build src/cli.ts --compile --target=bun-darwin-arm64 --outfile faf-darwin-arm64 && bun build src/cli.ts --compile --target=bun-darwin-x64 --outfile faf-darwin-x64 && bun build src/cli.ts --compile --target=bun-linux-x64 --outfile faf-linux-x64 && bun build src/cli.ts --compile --target=bun-windows-x64 --outfile faf-windows-x64.exe",
@@ -31,7 +32,9 @@
31
32
  "test:watch": "bun test --watch",
32
33
  "lint": "eslint src/**/*.ts",
33
34
  "format": "prettier --write 'src/**/*.ts'",
34
- "prepublishOnly": "bun run build"
35
+ "prepublishOnly": "bun run build",
36
+ "test:coverage": "bun test --coverage",
37
+ "typecheck": "bun --bun tsc --noEmit"
35
38
  },
36
39
  "keywords": [
37
40
  "faf",
@@ -52,29 +55,30 @@
52
55
  "license": "MIT",
53
56
  "repository": {
54
57
  "type": "git",
55
- "url": "https://github.com/Wolfe-Jam/faf-cli.git"
58
+ "url": "git+https://github.com/Wolfe-Jam/faf-cli.git"
56
59
  },
57
60
  "homepage": "https://faf.one",
58
61
  "bugs": {
59
62
  "url": "https://github.com/Wolfe-Jam/faf-cli/issues"
60
63
  },
61
64
  "dependencies": {
62
- "commander": "^14.0.1",
65
+ "commander": "^14.0.3",
63
66
  "faf-scoring-kernel": "^2.0.3",
64
67
  "open": "8.4.2",
65
- "yaml": "^2.4.1"
68
+ "yaml": "^2.8.3",
69
+ "zod": "^3.25.76"
66
70
  },
67
71
  "optionalDependencies": {
68
72
  "@anthropic-ai/sdk": "^0.74.0"
69
73
  },
70
74
  "devDependencies": {
71
- "@types/node": "^22.15.0",
72
- "@typescript-eslint/eslint-plugin": "^8.41.0",
73
- "@typescript-eslint/parser": "^8.41.0",
74
- "eslint": "^9.39.2",
75
- "prettier": "^3.2.5",
76
- "typescript": "^5.3.3",
77
- "typescript-eslint": "^8.57.2"
75
+ "@types/node": "^22.19.17",
76
+ "@typescript-eslint/eslint-plugin": "^8.58.0",
77
+ "@typescript-eslint/parser": "^8.58.0",
78
+ "eslint": "^9.39.4",
79
+ "prettier": "^3.8.1",
80
+ "typescript": "^5.9.3",
81
+ "typescript-eslint": "^8.58.0"
78
82
  },
79
83
  "engines": {
80
84
  "node": ">=18.0.0"
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: faf-champion
3
+ description: Achieve 100% AI-readiness score for your project
4
+ disable-model-invocation: false
5
+ user-invocable: true
6
+ allowed-tools: Bash, Read, Write, Glob, Grep, Task, TodoWrite
7
+ ---
8
+
9
+ # FAF Champion - Achieve 100% AI-Readiness 🏆
10
+
11
+ This skill helps you achieve a perfect 100% AI-readiness score for your project using the FAF (Foundational AI-Context Format) system.
12
+
13
+ ## Usage
14
+
15
+ ```
16
+ /faf-champion
17
+ ```
18
+
19
+ ## What This Does
20
+
21
+ 1. **Analyzes your project** to understand its structure and stack
22
+ 2. **Creates or updates** your project.faf file with complete information
23
+ 3. **Guides you** through filling any missing context slots
24
+ 4. **Validates** the result to ensure 100% score
25
+ 5. **Awards** the championship trophy 🏆 when you reach perfection
26
+
27
+ ## Process
28
+
29
+ ### 1. Initial Assessment
30
+ First, I'll check if you have a project.faf file and score it:
31
+
32
+ ```bash
33
+ faf score --verbose
34
+ ```
35
+
36
+ ### 2. Auto-Generation
37
+ If no .faf exists or score is low, I'll run the auto-generator:
38
+
39
+ ```bash
40
+ faf auto
41
+ ```
42
+
43
+ ### 3. Guided Interview
44
+ For any remaining gaps, I'll use the guided interview:
45
+
46
+ ```bash
47
+ faf go
48
+ ```
49
+
50
+ ### 4. Validation
51
+ Finally, I'll validate your achievement:
52
+
53
+ ```bash
54
+ faf check --strict
55
+ ```
56
+
57
+ ## Tips for Success
58
+
59
+ - **Be specific** about your project's purpose and goals
60
+ - **Include examples** of key functionality
61
+ - **Document integrations** with other systems
62
+ - **List all frameworks** and dependencies
63
+ - **Describe your deployment** target
64
+
65
+ ## Championship Benefits
66
+
67
+ Achieving 100% AI-readiness means:
68
+ - Zero context drift in AI sessions
69
+ - Perfect project understanding
70
+ - Instant onboarding for any AI tool
71
+ - Complete documentation that versions with code
72
+ - Championship-grade engineering practices
73
+
74
+ ## FAF Philosophy
75
+
76
+ FAF is infrastructure, not just a format. It's the foundational layer that enables AI to understand your project completely, eliminating the "drift tax" of re-explaining context.
77
+
78
+ Ready to become a champion? Let's begin!
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: faf-quickstart
3
+ description: Initialize FAF context for your project in seconds
4
+ disable-model-invocation: false
5
+ user-invocable: true
6
+ argument-hint: "[--yolo]"
7
+ allowed-tools: Bash, Read, Write, Glob, Grep
8
+ ---
9
+
10
+ # FAF Quickstart - Zero to Context in Seconds
11
+
12
+ Get your project AI-ready with minimal setup using FAF's quickstart workflow.
13
+
14
+ ## Usage
15
+
16
+ ```
17
+ /faf-quickstart # Interactive setup
18
+ /faf-quickstart --yolo # Express setup with smart defaults
19
+ ```
20
+
21
+ ## What This Does
22
+
23
+ 1. **Detects** your project stack automatically
24
+ 2. **Creates** a project.faf file with sensible defaults
25
+ 3. **Syncs** with CLAUDE.md if it exists
26
+ 4. **Scores** your initial AI-readiness
27
+
28
+ ## Express Mode (--yolo)
29
+
30
+ With the `--yolo` flag, FAF makes intelligent decisions:
31
+ - Auto-detects framework and language
32
+ - Uses directory name as project name
33
+ - Infers purpose from package.json/Cargo.toml
34
+ - Sets sensible defaults for all optional fields
35
+
36
+ ## Interactive Mode
37
+
38
+ Without flags, you'll be asked key questions:
39
+ - Project name and purpose
40
+ - Main technologies used
41
+ - Architecture overview
42
+ - Key features
43
+
44
+ ## Example Workflow
45
+
46
+ ```bash
47
+ # Check current directory
48
+ pwd
49
+
50
+ # Quick init with defaults
51
+ faf init --yolo
52
+
53
+ # Check the score
54
+ faf score
55
+
56
+ # View the generated context
57
+ cat project.faf
58
+ ```
59
+
60
+ ## Next Steps
61
+
62
+ After quickstart:
63
+ 1. Run `/faf-champion` to achieve 100% score
64
+ 2. Use `faf sync` to keep CLAUDE.md in sync
65
+ 3. Run `faf go` for guided improvements
66
+ 4. Check `faf info --faq` for common questions
67
+
68
+ ## Pro Tip
69
+
70
+ The quickstart creates a solid foundation (usually 70-85% score). For championship-grade context (100%), use the full guided interview with `faf go`.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: faf-sync-master
3
+ description: Keep .faf and CLAUDE.md perfectly synchronized
4
+ disable-model-invocation: false
5
+ user-invocable: true
6
+ argument-hint: "[--watch]"
7
+ allowed-tools: Bash, Read, Write, Task
8
+ ---
9
+
10
+ # FAF Sync Master - Bi-directional Context Synchronization
11
+
12
+ Maintain perfect synchronization between your project.faf and CLAUDE.md files, ensuring AI context stays consistent across formats.
13
+
14
+ ## Usage
15
+
16
+ ```
17
+ /faf-sync-master # One-time sync
18
+ /faf-sync-master --watch # Continuous sync mode
19
+ ```
20
+
21
+ ## What This Does
22
+
23
+ 1. **Detects** which file is newer (mtime-based)
24
+ 2. **Syncs** content in the correct direction automatically
25
+ 3. **Preserves** format-specific features in each file
26
+ 4. **Validates** the sync succeeded
27
+
28
+ ## Sync Modes
29
+
30
+ ### Auto Mode (Default)
31
+ - Compares modification times
32
+ - Newer file wins
33
+ - Safe and predictable
34
+
35
+ ### Watch Mode
36
+ - Monitors both files for changes
37
+ - Syncs immediately on save
38
+ - Perfect for active development
39
+
40
+ ### Manual Direction
41
+ ```bash
42
+ faf sync --direction push # .faf → CLAUDE.md
43
+ faf sync --direction pull # CLAUDE.md → .faf
44
+ ```
45
+
46
+ ## How It Works
47
+
48
+ The sync engine:
49
+ 1. Reads both files
50
+ 2. Compares timestamps
51
+ 3. Transforms content between formats
52
+ 4. Preserves bidirectional markers
53
+ 5. Updates the target file
54
+
55
+ ## Sync Indicators
56
+
57
+ Look for these in your files:
58
+ - `**STATUS: BI-SYNC ACTIVE 🔗**` - Sync is working
59
+ - `*Last Sync: [timestamp]*` - When last synced
60
+ - `*Sync Engine: F1-Inspired*` - Using latest engine
61
+
62
+ ## Best Practices
63
+
64
+ 1. **Edit either file** - The sync handles both directions
65
+ 2. **Use watch mode** during active development
66
+ 3. **Check sync status** with `faf check --trust`
67
+ 4. **Let mtime decide** - Avoid forcing direction
68
+
69
+ ## Pro Features
70
+
71
+ With `FAF_PRO=1`:
72
+ - Tri-sync with MEMORY.md
73
+ - Advanced merge strategies
74
+ - Conflict resolution UI
75
+ - Team sync coordination
76
+
77
+ ## Troubleshooting
78
+
79
+ If sync seems stuck:
80
+ 1. Check both files exist
81
+ 2. Verify write permissions
82
+ 3. Look for sync markers
83
+ 4. Run `faf check --doctor`
84
+
85
+ The sync engine is battle-tested across thousands of projects. Trust the process!
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "FAF Skills Package",
3
+ "version": "1.0.0",
4
+ "description": "Foundational AI-Context Format skills for Claude Code",
5
+ "author": "FAF Team",
6
+ "skills": [
7
+ {
8
+ "name": "faf-champion",
9
+ "description": "Achieve 100% AI-readiness score for your project",
10
+ "category": "optimization",
11
+ "complexity": "intermediate"
12
+ },
13
+ {
14
+ "name": "faf-quickstart",
15
+ "description": "Initialize FAF context for your project in seconds",
16
+ "argument-hint": "[--yolo]",
17
+ "category": "setup",
18
+ "complexity": "beginner"
19
+ },
20
+ {
21
+ "name": "faf-sync-master",
22
+ "description": "Keep .faf and CLAUDE.md perfectly synchronized",
23
+ "argument-hint": "[--watch]",
24
+ "category": "maintenance",
25
+ "complexity": "beginner"
26
+ }
27
+ ],
28
+ "categories": {
29
+ "setup": {
30
+ "name": "Setup & Initialization",
31
+ "icon": "🚀"
32
+ },
33
+ "optimization": {
34
+ "name": "Optimization & Scoring",
35
+ "icon": "🏆"
36
+ },
37
+ "maintenance": {
38
+ "name": "Maintenance & Sync",
39
+ "icon": "🔄"
40
+ }
41
+ },
42
+ "requirements": {
43
+ "faf-cli": ">=6.0.0",
44
+ "claude-code": ">=2.0.0"
45
+ }
46
+ }