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/README.md +2 -0
- package/dist/cli.js +286 -223
- package/dist/index.js +2 -2
- package/package.json +18 -14
- package/skills/faf/faf-champion/SKILL.md +78 -0
- package/skills/faf/faf-quickstart/SKILL.md +70 -0
- package/skills/faf/faf-sync-master/SKILL.md +85 -0
- package/skills/faf/skills.json +46 -0
- package/skills/faf-expert/SKILL.md +384 -0
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createRequire as
|
|
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
|
|
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.
|
|
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.
|
|
65
|
+
"commander": "^14.0.3",
|
|
63
66
|
"faf-scoring-kernel": "^2.0.3",
|
|
64
67
|
"open": "8.4.2",
|
|
65
|
-
"yaml": "^2.
|
|
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.
|
|
72
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
73
|
-
"@typescript-eslint/parser": "^8.
|
|
74
|
-
"eslint": "^9.39.
|
|
75
|
-
"prettier": "^3.
|
|
76
|
-
"typescript": "^5.
|
|
77
|
-
"typescript-eslint": "^8.
|
|
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
|
+
}
|