bmad-module-skill-forge 3.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.md +3 -3
  3. package/docs/_data/pinned.yaml +19 -13
  4. package/docs/architecture.md +2 -2
  5. package/docs/concepts.md +4 -4
  6. package/docs/examples.md +33 -26
  7. package/docs/getting-started.md +3 -3
  8. package/docs/how-it-works.md +2 -2
  9. package/docs/index.md +1 -1
  10. package/docs/skill-model.md +41 -39
  11. package/docs/troubleshooting.md +8 -0
  12. package/docs/verifying-a-skill.md +46 -21
  13. package/docs/why-skf.md +1 -1
  14. package/docs/workflows.md +5 -5
  15. package/package.json +1 -1
  16. package/src/knowledge/qmd-registry.md +1 -1
  17. package/src/knowledge/version-paths.md +1 -1
  18. package/src/shared/health-check.md +2 -50
  19. package/src/shared/scripts/schemas/skf-audit-result-envelope.v1.json +2 -2
  20. package/src/shared/scripts/schemas/skf-update-result-envelope.v1.json +12 -4
  21. package/src/shared/scripts/schemas/skill-brief.v1.json +1 -1
  22. package/src/shared/scripts/skf-atomic-write.py +212 -59
  23. package/src/shared/scripts/skf-build-change-manifest.py +1437 -178
  24. package/src/shared/scripts/skf-classify-changed-files.py +78 -0
  25. package/src/shared/scripts/skf-compare-file-hashes.py +266 -104
  26. package/src/shared/scripts/skf-count-tokens.py +54 -10
  27. package/src/shared/scripts/skf-derive-assembly-shape.py +18 -1
  28. package/src/shared/scripts/skf-detect-scripts-assets.py +196 -54
  29. package/src/shared/scripts/skf-detect-workspaces.py +67 -0
  30. package/src/shared/scripts/skf-emit-result-envelope.py +6 -5
  31. package/src/shared/scripts/skf-extract-public-api.py +1673 -189
  32. package/src/shared/scripts/skf-extraction-inventory.py +584 -46
  33. package/src/shared/scripts/skf-extraction-snapshot.py +158 -33
  34. package/src/shared/scripts/skf-forge-tier-rw.py +26 -3
  35. package/src/shared/scripts/skf-github-probe.py +47 -8
  36. package/src/shared/scripts/skf-hash-content.py +14 -8
  37. package/src/shared/scripts/skf-load-provenance.py +3 -1
  38. package/src/shared/scripts/skf-merge-doc-urls.py +142 -19
  39. package/src/shared/scripts/skf-parse-gaps.py +135 -26
  40. package/src/shared/scripts/skf-preflight.py +15 -1
  41. package/src/shared/scripts/skf-provenance-gap-dispatch.py +25 -1
  42. package/src/shared/scripts/skf-render-metadata-stats.py +1 -1
  43. package/src/shared/scripts/skf-resolve-authoritative-files.py +29 -3
  44. package/src/shared/scripts/skf-resolve-customization.py +197 -0
  45. package/src/shared/scripts/skf-shard-body.py +239 -41
  46. package/src/shared/scripts/skf-structural-diff.py +133 -18
  47. package/src/shared/scripts/skf-update-active-symlink.py +115 -62
  48. package/src/shared/scripts/skf-validate-brief-schema.py +19 -1
  49. package/src/shared/scripts/skf-validate-output.py +12 -3
  50. package/src/shared/scripts/skf-verify-provenance-completeness.py +1439 -79
  51. package/src/shared/scripts/skf-write-skill-brief.py +41 -8
  52. package/src/shared/tool-requirements.yaml +8 -2
  53. package/src/skf-analyze-source/SKILL.md +2 -2
  54. package/src/skf-analyze-source/assets/skill-brief-schema.md +1 -1
  55. package/src/skf-analyze-source/references/map-unit-exports.md +1 -1
  56. package/src/skf-audit-skill/SKILL.md +2 -2
  57. package/src/skf-audit-skill/assets/drift-report-template.md +1 -0
  58. package/src/skf-audit-skill/references/headless-contract.md +1 -1
  59. package/src/skf-audit-skill/references/health-check.md +2 -0
  60. package/src/skf-audit-skill/references/init.md +2 -1
  61. package/src/skf-audit-skill/references/re-index.md +14 -9
  62. package/src/skf-audit-skill/references/report.md +2 -2
  63. package/src/skf-audit-skill/references/semantic-diff.md +15 -15
  64. package/src/skf-audit-skill/references/structural-diff.md +10 -5
  65. package/src/skf-audit-skill/scripts/render-drift-tables.py +29 -2
  66. package/src/skf-brief-skill/SKILL.md +3 -3
  67. package/src/skf-brief-skill/assets/scope-templates.md +1 -1
  68. package/src/skf-brief-skill/assets/skill-brief-schema.md +4 -11
  69. package/src/skf-brief-skill/references/analyze-target.md +6 -6
  70. package/src/skf-brief-skill/references/confirm-brief.md +1 -1
  71. package/src/skf-brief-skill/references/scope-definition.md +4 -4
  72. package/src/skf-brief-skill/references/step-auto-brief.md +11 -29
  73. package/src/skf-brief-skill/references/version-resolution.md +5 -9
  74. package/src/skf-campaign/SKILL.md +2 -2
  75. package/src/skf-campaign/references/step-05-skill-loop.md +6 -1
  76. package/src/skf-create-skill/SKILL.md +2 -2
  77. package/src/skf-create-skill/assets/compile-assembly-rules.md +5 -3
  78. package/src/skf-create-skill/assets/skill-sections.md +7 -7
  79. package/src/skf-create-skill/references/authoritative-files-protocol.md +2 -23
  80. package/src/skf-create-skill/references/compile.md +31 -60
  81. package/src/skf-create-skill/references/component-extraction.md +3 -3
  82. package/src/skf-create-skill/references/enrich.md +2 -2
  83. package/src/skf-create-skill/references/entry-points-by-hand.md +24 -7
  84. package/src/skf-create-skill/references/extract.md +23 -19
  85. package/src/skf-create-skill/references/extraction-patterns-tracing.md +9 -9
  86. package/src/skf-create-skill/references/extraction-patterns.md +10 -11
  87. package/src/skf-create-skill/references/generate-artifacts.md +1 -1
  88. package/src/skf-create-skill/references/report.md +21 -5
  89. package/src/skf-create-skill/references/source-resolution-protocols.md +12 -17
  90. package/src/skf-create-skill/references/sub/fetch-docs.md +1 -1
  91. package/src/skf-create-stack-skill/SKILL.md +2 -2
  92. package/src/skf-create-stack-skill/references/validate.md +1 -1
  93. package/src/skf-drop-skill/SKILL.md +2 -2
  94. package/src/skf-drop-skill/references/execute.md +5 -1
  95. package/src/skf-drop-skill/references/health-check.md +2 -0
  96. package/src/skf-drop-skill/references/invocation-contract.md +1 -1
  97. package/src/skf-drop-skill/references/report.md +2 -2
  98. package/src/skf-drop-skill/references/select.md +7 -3
  99. package/src/skf-export-skill/SKILL.md +2 -2
  100. package/src/skf-export-skill/assets/snippet-format.md +5 -5
  101. package/src/skf-export-skill/references/generate-snippet.md +22 -15
  102. package/src/skf-export-skill/references/load-skill.md +1 -1
  103. package/src/skf-export-skill/references/token-report.md +29 -9
  104. package/src/skf-forger/SKILL.md +2 -2
  105. package/src/skf-quick-skill/SKILL.md +2 -2
  106. package/src/skf-refine-architecture/SKILL.md +6 -8
  107. package/src/skf-rename-skill/SKILL.md +2 -2
  108. package/src/skf-setup/SKILL.md +2 -2
  109. package/src/skf-test-skill/SKILL.md +2 -2
  110. package/src/skf-test-skill/assets/output-section-formats.md +6 -4
  111. package/src/skf-test-skill/references/coherence-check.md +5 -4
  112. package/src/skf-test-skill/references/coverage-check-branches.md +61 -0
  113. package/src/skf-test-skill/references/coverage-check-tiers.md +5 -5
  114. package/src/skf-test-skill/references/coverage-check.md +69 -111
  115. package/src/skf-test-skill/references/init.md +5 -6
  116. package/src/skf-test-skill/references/migration-section-rules.md +26 -14
  117. package/src/skf-test-skill/references/report.md +11 -9
  118. package/src/skf-test-skill/references/scoring-rules.md +8 -6
  119. package/src/skf-test-skill/references/source-access-protocol.md +15 -18
  120. package/src/skf-test-skill/scripts/build-result-context.py +114 -21
  121. package/src/skf-test-skill/scripts/gap-ledger.py +580 -80
  122. package/src/skf-test-skill/scripts/load-coverage-inputs.py +646 -107
  123. package/src/skf-test-skill/scripts/locate-export-segments.py +101 -20
  124. package/src/skf-test-skill/scripts/reconcile-coverage.py +450 -23
  125. package/src/skf-test-skill/scripts/score-signatures.py +356 -61
  126. package/src/skf-test-skill/scripts/stage-helper-payload.py +64 -13
  127. package/src/skf-test-skill/scripts/validate-inventory.py +108 -9
  128. package/src/skf-test-skill/scripts/verify-declared-numerator.py +7 -5
  129. package/src/skf-test-skill/templates/test-report-template.md +1 -0
  130. package/src/skf-update-skill/SKILL.md +2 -2
  131. package/src/skf-update-skill/references/detect-changes.md +32 -13
  132. package/src/skf-update-skill/references/gap-driven.md +37 -22
  133. package/src/skf-update-skill/references/init.md +6 -2
  134. package/src/skf-update-skill/references/invocation-contract.md +1 -1
  135. package/src/skf-update-skill/references/merge.md +17 -12
  136. package/src/skf-update-skill/references/re-extract.md +4 -2
  137. package/src/skf-update-skill/references/report.md +7 -4
  138. package/src/skf-update-skill/references/write.md +77 -36
  139. package/src/skf-update-skill/scripts/skf-new-file-diff.py +157 -42
  140. package/src/skf-verify-stack/SKILL.md +2 -2
  141. package/tools/cli/lib/tool-check.js +158 -2
@@ -30,7 +30,7 @@
30
30
  "name": "skill-forge",
31
31
  "source": "./",
32
32
  "description": "Evidence-based agent skills compiler with progressive capability tiers (Quick/Forge/Forge+/Deep).",
33
- "version": "3.0.0",
33
+ "version": "5.0.0",
34
34
  "author": {
35
35
  "name": "Armel"
36
36
  },
package/README.md CHANGED
@@ -52,15 +52,15 @@ results = cognee.search("What does Cognee do?", mode="graph")
52
52
  import cognee
53
53
 
54
54
  # Agent follows the skill instruction:
55
- # `search(query_text: str, query_type: SearchType = GRAPH_COMPLETION) -> List[SearchResult]`
56
- # [AST:cognee/api/v1/search/search.py:L27]
55
+ # `search(query_text: str, query_type: SearchType = SearchType.HYBRID_COMPLETION, ...) -> list[SearchResult]`
56
+ # [AST:cognee/api/v1/search/search.py:L41]
57
57
  results = await cognee.search(
58
58
  query_text="What does Cognee do?",
59
59
  query_type=cognee.SearchType.GRAPH_COMPLETION
60
60
  )
61
61
  ```
62
62
 
63
- The skill told the agent the real function name, the real parameters, and that the call is async, all traced to the exact source line. This example is from the real [`oms-cognee`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/SKILL.md) skill in [**oh-my-skills**](https://github.com/armelhbobdad/oh-my-skills), SKF's reference output. That skill predates provenance labels that follow the tool: its provenance map records `search` as read by eye, which SKF 3.0.0 cites as `[SRC:...]`, keeping `[AST:...]` for a definition an ast-grep rule matched. The [**Verifying a Skill**](#verifying-a-skill) section below shows how to walk the citation chain yourself.
63
+ The skill told the agent the real function name, the real parameters, and that the call is async, all traced to the exact source line. This example is from the real [`oms-cognee`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.6.2/oms-cognee/SKILL.md) skill in [**oh-my-skills**](https://github.com/armelhbobdad/oh-my-skills), SKF's reference output. Its provenance map records `search` as an ast-grep match at that line, which is what `[AST:...]` means; an export SKF reads by eye instead is cited `[SRC:...]`. The [**Verifying a Skill**](#verifying-a-skill) section below shows how to walk the citation chain yourself.
64
64
 
65
65
  ## Install
66
66
 
@@ -32,7 +32,7 @@
32
32
  # Enforced two ways: (1) release.yaml bumps this line in the same commit
33
33
  # as package.json + marketplace.json on every release; (2) validate-docs-drift.js
34
34
  # cross-checks this value against package.json.version and fails on mismatch.
35
- skf_version: "3.0.0"
35
+ skf_version: "5.0.0"
36
36
 
37
37
  # Path to the oh-my-skills repo, resolved relative to this repo's root.
38
38
  # Override at runtime with the OMS environment variable if oh-my-skills
@@ -46,12 +46,13 @@ oh_my_skills_path: "../oh-my-skills"
46
46
  skills:
47
47
  oms-cognee:
48
48
  library: cognee
49
- version: "1.0.0"
49
+ version: "1.6.2"
50
50
  source_repo: "https://github.com/topoteretes/cognee"
51
- source_commit: "3c048aa4147776f14d4546704f986242554a9ef3"
52
- source_ref: "v1.0.0"
53
- upstream_commit_date: "2026-04-11"
54
- test_score: 99.00
51
+ source_commit: "ba3631f2ed363a6ea50d649c34c56885af6b36fe"
52
+ source_ref: "v1.6.2"
53
+ upstream_commit_date: "2026-09-29"
54
+ # strict SKF 4.0.0 re-test of the version that ships (20261103T134151Z-12e5ccdf)
55
+ test_score: 99.0
55
56
  test_mode: "naive"
56
57
  confidence_tier: "Deep"
57
58
  source_authority: "community"
@@ -59,12 +60,13 @@ skills:
59
60
 
60
61
  oms-cocoindex:
61
62
  library: cocoindex
62
- version: "0.3.37"
63
+ version: "1.0.0"
63
64
  source_repo: "https://github.com/cocoindex-io/cocoindex"
64
- source_commit: "87c5dbf087bfccca83791861db0d33519ef09677"
65
- source_ref: "v0.3.37"
66
- upstream_commit_date: "2026-03-31"
67
- test_score: 99.0
65
+ source_commit: "5fe4f37a526e51516655832ec9814e7ca24ade9a"
66
+ source_ref: "v1.0.0"
67
+ upstream_commit_date: "2026-04-22"
68
+ # strict SKF 4.0.0 re-test of the version that ships (20261103T131524Z-5907fba9)
69
+ test_score: 100.0
68
70
  test_mode: "naive"
69
71
  confidence_tier: "Deep"
70
72
  source_authority: "community"
@@ -77,7 +79,9 @@ skills:
77
79
  source_commit: "e486d3826bcd40c52db1c766966d1c8ec16df6cb"
78
80
  source_ref: "v10.3.5"
79
81
  upstream_commit_date: "2026-04-07"
80
- test_score: 99.49
82
+ # null: the strict SKF 4.0.0 re-test of the version that ships
83
+ # (20261103T131516Z-6e2b972a) is blocked by the hard gate, so it records no score.
84
+ test_score: null
81
85
  test_mode: "naive"
82
86
  confidence_tier: "Deep"
83
87
  source_authority: "community"
@@ -90,7 +94,9 @@ skills:
90
94
  source_commit: "a5ffb45be05335d2c547436664cfbfb8c22d04df"
91
95
  source_ref: "HEAD"
92
96
  upstream_commit_date: "2026-03-22"
93
- test_score: 99.45
97
+ # null: the strict SKF 4.0.0 report (20261103T100001Z-981f84e6) is
98
+ # blocked by the hard gate, so it records no score.
99
+ test_score: null
94
100
  test_mode: "naive"
95
101
  confidence_tier: "Deep"
96
102
  source_authority: "community"
@@ -22,7 +22,7 @@ A workflow directory holds some or all of these files, and each has a specific j
22
22
  | File | What it does | When it loads |
23
23
  |---------------------------|---------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|
24
24
  | `SKILL.md` | Human-readable entry point: goals, role definition, initialization sequence, invocation contract, and the route to the first step | Entry point per workflow |
25
- | `customize.toml` | Settings a team or a person can override without editing SKF, such as facts to keep in mind for the whole run or a command to run when the workflow ends. Overrides go in `_bmad/custom/<workflow>.toml` (shared) or `_bmad/custom/<workflow>.user.toml` (personal), for example `_bmad/custom/skf-create-skill.toml`. The workflow reads them by running BMAD Method's customization script, which the BMAD Method installer adds, through `uv`. When that script cannot run, as with SKF installed alone, the workflow prints one warning, adds `customization_resolver_unavailable` to the run's warnings (an interactive Export Skill run only prints it) and applies the bundled settings | Read once, when the workflow starts |
25
+ | `customize.toml` | Settings a team or a person can override without editing SKF, such as facts to keep in mind for the whole run or a command to run when the workflow ends. Overrides go in `_bmad/custom/<workflow>.toml` (shared) or `_bmad/custom/<workflow>.user.toml` (personal), for example `_bmad/custom/skf-create-skill.toml`. The workflow reads them by running SKF's customization helper through `uv`, which runs BMAD Method's customization script, added by the BMAD Method installer. When that script cannot run, as with SKF installed alone, the workflow prints one warning, adds `customization_resolver_unavailable` to the run's warnings (an interactive Export Skill run only prints it) and applies the bundled settings | Read once, when the workflow starts |
26
26
  | `references/*.md` (step files) | The workflow's stages, one file per step. Each names the next one in its `nextStepFile` front matter, and the last one hands off to the shared health check | One at a time (just-in-time) |
27
27
  | `references/*.md` (reference data) | Workflow-specific reference data: rules, patterns, protocols | Read by steps on demand |
28
28
  | `assets/*.md` | Workflow-specific output formats: schemas, templates, heuristics | Read by steps on demand |
@@ -55,7 +55,7 @@ flowchart LR
55
55
 
56
56
  1. **Trigger**: You type `@Ferris CS` (or a close match like `create-skill`). The menu in `skf-forger/SKILL.md` maps the code to the workflow's skill, here `skf-create-skill`.
57
57
  2. **Agent loads**: `skf-forger/SKILL.md` puts the persona (identity, principles, critical actions) into the context window. Ferris also loads its sidecar files (`forge-tier.yaml`, `preferences.yaml`), which keep your tier and preferences between sessions.
58
- 3. **Workflow loads**: The workflow's `SKILL.md` loads your SKF settings from `_bmad/skf/config.yaml` and checks whether the run is headless (runs without asking questions). It then runs BMAD Method's customization script through `uv` to apply any team or personal overrides to the workflow's `customize.toml`, as Ferris does for his own settings when he starts. When that script cannot run (with SKF installed alone it is missing), the workflow prints one warning, adds `customization_resolver_unavailable` to the run's warnings (an interactive Export Skill run only prints it) and keeps the bundled settings. Then it opens the first step file.
58
+ 3. **Workflow loads**: The workflow's `SKILL.md` loads your SKF settings from `_bmad/skf/config.yaml` and checks whether the run is headless (runs without asking questions). It then runs SKF's customization helper through `uv`, which runs BMAD Method's customization script to apply any team or personal overrides to the workflow's `customize.toml`, as Ferris does for his own settings when he starts. When that script cannot run (with SKF installed alone it is missing), the workflow prints one warning, adds `customization_resolver_unavailable` to the run's warnings (an interactive Export Skill run only prints it) and keeps the bundled settings. Then it opens the first step file.
59
59
  4. **Step-by-step execution**: Only the current step file is in context (just-in-time loading). Each step names the next one. The assistant reads the step, carries it out, saves its output, then loads the next step. Future steps are never loaded early.
60
60
  5. **Sub-agent delegation**: Some steps would otherwise read many large files, such as several `SKILL.md` documents or every file that imports a library. These steps hand the reading to sub-agents, which are helper AI sessions started with the Agent tool. Each sub-agent reads its share and returns a short JSON summary. The parent never loads the full text, so the next step starts with an uncluttered context window. AN (per-unit analysis), TS (coverage and coherence checks), VS (integration verification), RA (gap analysis) and SS (per-library extraction) work this way. VS and RA run at most 8 sub-agents at a time. SS runs 3 to 5 at a time in Claude Code.
61
61
  6. **Knowledge injection**: Steps consult `skf-knowledge-index.csv` and load only the fragments from `knowledge/` that match by tags and relevance. Cross-cutting principles (zero hallucination, confidence tiers, provenance) load only when a step asks for them, never in advance.
package/docs/concepts.md CHANGED
@@ -15,7 +15,7 @@ An agent skill is an instruction file that tells an AI agent how to use your cod
15
15
 
16
16
  Skills follow the [agentskills.io](https://agentskills.io) open standard, so they work across Claude, Cursor, Copilot, and other AI tools.
17
17
 
18
- **Example:** A skill for [cognee](https://github.com/topoteretes/cognee) tells your agent: "The function is `cognee.search()`, its first parameters are `query_text`, `query_type`, `user`, `datasets`, and `dataset_ids`, and it's defined at `cognee/api/v1/search/search.py:L27` (v1.0.0, commit `3c048aa4`)." With ast-grep installed, SKF reads such a signature from the structure of the actual source code (its abstract syntax tree, or AST) and labels it T1; a signature it reads by eye instead is labeled T1-low (see [Confidence Tiers](#confidence-tiers-t1t1-lowt2t3)).
18
+ **Example:** A skill for [cognee](https://github.com/topoteretes/cognee) tells your agent: "The function is `cognee.search()`, its first parameters are `query_text`, `query_type`, `user`, `datasets`, and `dataset_ids`, and it's defined at `cognee/api/v1/search/search.py:L41` (v1.6.2, commit `ba3631f2`)." With ast-grep installed, SKF reads such a signature from the structure of the actual source code (its abstract syntax tree, or AST) and labels it T1; a signature it reads by eye instead is labeled T1-low (see [Confidence Tiers](#confidence-tiers-t1t1-lowt2t3)).
19
19
 
20
20
  ---
21
21
 
@@ -24,8 +24,8 @@ Skills follow the [agentskills.io](https://agentskills.io) open standard, so the
24
24
  Provenance means every instruction in a skill traces back to where it came from. For code, that's a file and line number. For documentation, it's a URL. For developer discourse such as issues, pull requests, and changelogs, it's the indexed document the instruction came from. **If SKF can't point to a source, it doesn't include the instruction.**
25
25
 
26
26
  **Examples** (the citation forms, with paths from the oms-cognee skill in [oh-my-skills](https://github.com/armelhbobdad/oh-my-skills)):
27
- - `[AST:cognee/api/v1/search/search.py:L27]`: an ast-grep rule matched the definition in the source code (T1)
28
- - `[SRC:cognee/api/v1/add/add.py:L166]`: read from source code by eye, without an ast-grep match (T1-low)
27
+ - `[AST:cognee/api/v1/search/search.py:L41]`: an ast-grep rule matched the definition in the source code (T1)
28
+ - `[SRC:cognee/api/v1/__init__.py:L8]`: read from source code by eye, without an ast-grep match (T1-low)
29
29
  - `[QMD:oms-cognee-temporal:releases.md]`: found in indexed release notes and other developer discourse (T2)
30
30
  - `[EXT:https://docs.cognee.ai/getting-started/quickstart]`: taken from external documentation (T3)
31
31
 
@@ -79,7 +79,7 @@ Audit Skill also checks the documentation pages a skill tracked when it was buil
79
79
 
80
80
  Every skill records the exact version (or commit) of the source code it was built from. This means you always know which version of the library the instructions apply to.
81
81
 
82
- By default, the version is auto-detected from the source (package.json, pyproject.toml, etc.). You can also target a specific version, either by giving it during `@Ferris BS` (Brief Skill) or by adding `@version` to a Quick Skill command (`@Ferris QS cognee@1.0.0`). This is especially useful for docs-only skills, where there is no source code to detect a version from. When you target a version on a remote repository, SKF finds the matching git tag and clones from it. That way the extracted API signatures come from that version's code, not from whatever is on the default branch with a label added. If no tag matches, Quick Skill stops and lists the tags it found, while Create Skill warns you and falls back to the default branch.
82
+ By default, the version is auto-detected from the source (package.json, pyproject.toml, etc.). You can also target a specific version, either by giving it during `@Ferris BS` (Brief Skill) or by adding `@version` to a Quick Skill command (`@Ferris QS cognee@1.6.2`). This is especially useful for docs-only skills, where there is no source code to detect a version from. When you target a version on a remote repository, SKF finds the matching git tag and clones from it. That way the extracted API signatures come from that version's code, not from whatever is on the default branch with a label added. If no tag matches, Quick Skill stops and lists the tags it found, while Create Skill warns you and falls back to the default branch.
83
83
 
84
84
  When the source updates, re-run `@Ferris US` (Update Skill) to regenerate the skill. SKF writes the result as a new version and leaves the old one in place. Anything you wrote between `<!-- [MANUAL:name] -->` and `<!-- [/MANUAL:name] -->` markers is carried over; edits made anywhere else are not protected and can be overwritten. Update Skill follows the ref the skill was built from, so a skill built from a branch picks up that branch's new commits. To move a skill built from a release tag to a newer release, run `@Ferris US <name> --target-ref <tag>`.
85
85
 
package/docs/examples.md CHANGED
@@ -5,25 +5,26 @@ description: Real-world scenarios and operational tips for Skill Forge. For comm
5
5
 
6
6
  ## What the Output Looks Like
7
7
 
8
- When SKF generates a skill, you get a `SKILL.md` file with machine-readable frontmatter and provenance-backed instructions. Below is a trimmed example from the real [`oms-cognee` SKILL.md](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/SKILL.md) generated for [cognee](https://github.com/topoteretes/cognee) (full portfolio at [oh-my-skills](https://github.com/armelhbobdad/oh-my-skills)):
8
+ When SKF generates a skill, you get a `SKILL.md` file with machine-readable frontmatter and provenance-backed instructions. Below is a trimmed example from the real [`oms-cognee` SKILL.md](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.6.2/oms-cognee/SKILL.md) generated for [cognee](https://github.com/topoteretes/cognee) (full portfolio at [oh-my-skills](https://github.com/armelhbobdad/oh-my-skills)):
9
9
 
10
10
  **Frontmatter (tells AI agents when to load this skill):**
11
11
 
12
12
  ```yaml
13
13
  name: oms-cognee
14
14
  description: >
15
- Builds apps on top of cognee v1.0.0, the knowledge-graph memory engine for AI agents.
16
- Use when ingesting text/files/URLs into persistent memory, building knowledge graphs,
17
- searching graph-backed memory with multiple SearchType modes, enriching graphs with
18
- memify/improve, scoping memory with datasets and node_sets, configuring LLM/embedding/
19
- graph/vector backends, running custom task pipelines, tracing operations, decorating
20
- agent entrypoints with `agent_memory`, connecting to Cognee Cloud with `serve`, or
21
- visualizing the graph. Covers cognee/__init__.py exports: the V1 API (add, cognify,
22
- search, memify, datasets, prune, update, run_custom_pipeline, config, SearchType,
23
- visualize_graph, pipelines, Drop, run_startup_migrations, tracing) and the V2
24
- memory-oriented API (remember, RememberResult, recall, improve, forget, serve,
25
- disconnect, visualize, agent_memory). Do NOT use for: cognee internals, the HTTP
26
- REST API (use cognee-mcp or the FastAPI server), non-cognee memory/RAG libraries.
15
+ Builds apps on cognee v1.6.2, the knowledge-graph memory engine for AI agents.
16
+ Use when ingesting text/files/URLs into memory, building knowledge graphs, searching
17
+ memory with SearchType modes, enriching graphs with memify/improve, scoping memory
18
+ with datasets and node_sets, configuring LLM/embedding/graph/vector backends,
19
+ running custom pipelines, decorating agents with `agent_memory`, connecting
20
+ to Cognee Cloud with `serve`/`push`, exporting, validating or reporting on graphs,
21
+ or visualizing graphs and memory provenance. Covers cognee/__init__.py exports: the
22
+ V1 API (add, cognify, search, memify, datasets, agents, prune, update,
23
+ run_custom_pipeline, config, SearchType, report, validate, visualize_graph,
24
+ pipelines, Drop, run_migrations, tracing, tools) and the V2 memory API (remember,
25
+ recall, improve, forget, serve, disconnect, visualize, push, export, agent_memory,
26
+ MemoryEntry). Do NOT use for: cognee internals, the HTTP REST API (use
27
+ cognee-mcp or the FastAPI server), non-cognee memory/RAG libraries.
27
28
  ```
28
29
 
29
30
  **Body (what your AI agent reads):**
@@ -33,15 +34,15 @@ description: >
33
34
 
34
35
  | Function | Purpose | Key Params | Source |
35
36
  |----------|---------|------------|--------|
36
- | add() | Ingest text, files, binary data | data, dataset_name | [AST:cognee/api/v1/add/add.py:L22] |
37
- | cognify() | Build knowledge graph | datasets, graph_model | [AST:cognee/api/v1/cognify/cognify.py:L44] |
38
- | search() | Query knowledge graph | query_text, query_type | [AST:cognee/api/v1/search/search.py:L27] |
39
- | memify() | Enrich graph with custom tasks | extraction_tasks, data | [AST:cognee/modules/memify/memify.py:L25] |
40
- | remember() | V2 one-shot memory ingest | data, dataset_name | [AST:cognee/api/v1/remember/remember.py:L339] |
41
- | DataPoint | Base class for custom graph nodes | inherit and add fields | [EXT:docs.cognee.ai/guides/custom-data-models] |
37
+ | add() | Ingest text, files, binary data | data, dataset_name | [AST:cognee/api/v1/add/add.py:L39] |
38
+ | cognify() | Build knowledge graph | datasets, graph_model | [AST:cognee/api/v1/cognify/cognify.py:L110] |
39
+ | search() | Query knowledge graph | query_text, query_type | [AST:cognee/api/v1/search/search.py:L41] |
40
+ | memify() | Enrich graph with custom tasks | extraction_tasks, data | [AST:cognee/modules/memify/memify.py:L27] |
41
+ | remember() | V2 one-shot memory ingest | data, dataset_name | [AST:cognee/api/v1/remember/remember.py:L867] |
42
+ | DataPoint | Base class for custom graph nodes | inherit and add fields | [SRC:cognee/low_level.py:L2] |
42
43
  ```
43
44
 
44
- Every line number above is copied from the real SKILL.md and points at the line where that function is defined in the cognee source, so none of it is illustrative. SKF also ships its extraction record for this skill in oh-my-skills: [`forge-data/oms-cognee/1.0.0/provenance-map.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-cognee/1.0.0/provenance-map.json). The tags are copied as published too, and they predate labels that follow the tool: that record lists these functions as read by eye (`source-read`), so SKF 3.0.0 would tag them `[SRC:...]` (T1-low) and keep `[AST:...]` for a definition an ast-grep rule matched. [Verifying a Skill](/docs/verifying-a-skill.md#2-open-the-skills-provenance-mapjson) walks through the `search` entry.
45
+ Every line number above is copied from the real SKILL.md and points at the line where that function is defined in the cognee source, so none of it is illustrative. SKF also ships its extraction record for this skill in oh-my-skills: [`forge-data/oms-cognee/1.6.2/provenance-map.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-cognee/1.6.2/provenance-map.json). The tags follow the tool that read each definition: that record lists the five functions as ast-grep matches (`T1`), so the skill cites them `[AST:...]`, while `DataPoint` is an alias that `cognee/low_level.py` re-binds, read by eye and cited `[SRC:...]` (`T1-low`). [Verifying a Skill](/docs/verifying-a-skill.md#2-open-the-skills-provenance-mapjson) walks through the `search` entry.
45
46
 
46
47
  Provenance tags trace each instruction to its source:
47
48
  - `[AST:file:Lnn]` (T1): an ast-grep rule matched the definition in the code (highest confidence)
@@ -55,16 +56,22 @@ See [Skill Model → Output Architecture](/docs/skill-model.md#output-architectu
55
56
 
56
57
  ```
57
58
  skills/oms-cognee/
58
- ├── active -> 1.0.0
59
+ ├── active -> 1.6.2
59
60
  ├── 0.5.8/
60
61
  │ └── oms-cognee/
61
62
  │ ├── SKILL.md # Archived: v0.5.8, pinned to b51dcce1
62
63
  │ ├── context-snippet.md
63
64
  │ ├── metadata.json
64
65
  │ └── references/
65
- └── 1.0.0/
66
+ ├── 1.0.0/
67
+ │ └── oms-cognee/
68
+ │ ├── SKILL.md # Archived: v1.0.0, pinned to 3c048aa4
69
+ │ ├── context-snippet.md
70
+ │ ├── metadata.json
71
+ │ └── references/
72
+ └── 1.6.2/
66
73
  └── oms-cognee/
67
- ├── SKILL.md # Active: pinned to cognee v1.0.0 (3c048aa4)
74
+ ├── SKILL.md # Active: pinned to cognee v1.6.2 (ba3631f2)
68
75
  ├── context-snippet.md # Compressed index for platform context files
69
76
  ├── metadata.json # Machine-readable provenance
70
77
  └── references/ # Progressive disclosure detail
@@ -74,7 +81,7 @@ skills/oms-cognee/
74
81
  └── pipelines-and-datapoints.md
75
82
  ```
76
83
 
77
- This is the real directory listing from [`oh-my-skills/skills/oms-cognee/`](https://github.com/armelhbobdad/oh-my-skills/tree/main/skills/oms-cognee) after cognee shipped v1.0.0 upstream. SKF recompiled the skill from the v1.0.0 commit and wrote it next to the existing 0.5.8 tree. The older version stays pinned to its original commit (`b51dcce1`) and is still installable by any project that hasn't bumped its `CLAUDE.md` pin yet. The `active` symlink and the [`.export-manifest.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/.export-manifest.json) both point at the current version. Some skills also include `scripts/` and `assets/` directories when the source repository contains executable scripts or static assets. oms-cognee has neither; see [Skill Model → Per-Skill Output](/docs/skill-model.md#per-skill-output) for the full schema.
84
+ This is the real directory listing from [`oh-my-skills/skills/oms-cognee/`](https://github.com/armelhbobdad/oh-my-skills/tree/main/skills/oms-cognee) after cognee shipped v1.0.0 and then v1.6.2 upstream. Each time SKF recompiled the skill from the new commit and wrote it next to the existing trees. The older versions stay pinned to their original commits (`b51dcce1`, `3c048aa4`) and are still installable by any project that hasn't bumped its `CLAUDE.md` pin yet. The `active` symlink and the [`.export-manifest.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/.export-manifest.json) both point at the current version. Some skills also include `scripts/` and `assets/` directories when the source repository contains executable scripts or static assets. oms-cognee has neither; see [Skill Model → Per-Skill Output](/docs/skill-model.md#per-skill-output) for the full schema.
78
85
 
79
86
  ---
80
87
 
@@ -93,7 +100,7 @@ Ferris reads the repository, lists its public exports, and validates against the
93
100
  Need a specific version? Append `@version`:
94
101
 
95
102
  ```
96
- @Ferris QS cognee@1.0.0
103
+ @Ferris QS cognee@1.6.2
97
104
  ```
98
105
 
99
106
  ### Brownfield Platform: Pipeline or per-workflow
@@ -325,7 +332,7 @@ Generated skills automatically follow authoring best practices: third-person des
325
332
 
326
333
  ### Scripts & Assets
327
334
 
328
- If your source repo includes executable scripts (such as `scripts/`, `bin/` or `tools/`) or static assets (such as `assets/`, `templates/` or `schemas/`), SKF detects and packages them automatically with provenance tracking. Scripts and assets you add yourself under `scripts/[MANUAL]/` or `assets/[MANUAL]/` are preserved during updates, just like `<!-- [MANUAL] -->` markers in SKILL.md.
335
+ If your source repo includes executable scripts (such as `scripts/`, `bin/`, `tools/` or `cli/`; when one of these folders is a Python package, holding `__init__.py`, only its `__main__.py` and the modules with a shebang or an `if __name__ == "__main__":` block count as scripts) or static assets (such as `assets/`, `templates/` or `schemas/`), SKF detects and packages them automatically with provenance tracking. Only the files the brief's `scope.include` takes and its `scope.exclude` leaves are packaged, and Audit Skill reports a new one the same way. Scripts and assets you add yourself under `scripts/[MANUAL]/` or `assets/[MANUAL]/` are preserved during updates, just like `<!-- [MANUAL] -->` markers in SKILL.md.
329
336
 
330
337
  ### Let the Health Check Run
331
338
 
@@ -8,7 +8,7 @@ description: Install Skill Forge and generate your first verified skill in under
8
8
  One command. One verified skill. Here's what an instruction in a cognee skill looks like:
9
9
 
10
10
  ```python
11
- await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
11
+ await cognee.search( # [AST:cognee/api/v1/search/search.py:L41]
12
12
  query_text="What does Cognee do?"
13
13
  )
14
14
  ```
@@ -93,7 +93,7 @@ After a successful `install` or `update`, and in `status`, the installer checks
93
93
  ccc - optional, Forge+ tier https://github.com/cocoindex-io/cocoindex-code
94
94
  ```
95
95
 
96
- Each tool reads `ok`, `upgrade to >= <minimum>` with the command that upgrades it, `missing` or `optional` with where to get it, or `installed, version unknown` when SKF cannot read its version. The minimums are the ones in the [Prerequisites](#prerequisites-full-reference) table. The check waits at most about 3 seconds for the tools to answer and never changes the command's exit code. It runs no tool from your project folder and never runs `npx`, so `tessl` and `skill-check`, which SKF runs through `npx`, read as optional when they are not installed.
96
+ Each tool reads `ok`, `upgrade to >= <minimum>` with the command that upgrades it, `missing` or `optional` with where to get it, or `installed, version unknown` when SKF cannot read its version. The minimums are the ones in the [Prerequisites](#prerequisites-full-reference) table. The check waits at most about 3 seconds for the tools to answer and never changes the command's exit code. It runs no tool from your project folder and never runs `npx`, so `tessl` and `skill-check`, which SKF runs through `npx`, read as optional when they are not installed. It never runs `tessl` or `skill-check`: on a tessl that has never run, any tessl command accepts tessl's Terms. It reads tessl's version from the name of the binary tessl installs, the one tessl's npm and Homebrew packages also run, and the version of `skill-check`, which has no `--version` option, from its installed package. An `@tessl/cli` before 0.63.0 is tessl itself, so its package gives the version. tessl reads `installed, version unknown` when it was installed with winget, pnpm or Volta, when an npm or Homebrew tessl's binary is not installed at `~/.local/bin/tessl` (`%LOCALAPPDATA%\tessl\bin\tessl.exe` on Windows), or when two files in tessl's `versions` folder have the size of the Windows copy, `tessl\bin\tessl.exe`. So does a `skill-check` installed with pnpm or Volta, or with yarn or bun on Windows.
97
97
 
98
98
  A tier tool below its minimum does not count toward your tier. With an ast-grep older than 0.45.3, `@Ferris SF` leaves you at Quick, whatever else you have installed. Setup's FORGE STATUS report then shows an upgrade line for the tool, and a headless setup adds a `tool_below_minimum` warning to its `SKF_SETUP_RESULT_JSON` envelope. Upgrade the tool and run `@Ferris SF` again. A tool with no minimum, or one whose version SKF cannot read, never lowers your tier.
99
99
 
@@ -129,7 +129,7 @@ Ferris reads the repository, extracts the public API, and generates a skill in u
129
129
 
130
130
  **Targeting a specific version:** Append `@version` to pin the skill to a library version:
131
131
  ```
132
- @Ferris QS cognee@1.0.0
132
+ @Ferris QS cognee@1.6.2
133
133
  ```
134
134
 
135
135
  **Full quality path (pipeline mode):**
@@ -23,7 +23,7 @@ In under a minute, plus one preview for you to approve, you get a `SKILL.md` you
23
23
 
24
24
  ### 2. The workflow resolves your target
25
25
 
26
- Ferris turns your input into a GitHub repository. A GitHub URL is used as given. A package name is looked up on every registry of npm, PyPI and crates.io (a language hint asks only that language's registry), with a web search as the last resort. When more than one registry answers, an interactive run lists every candidate and asks which project you mean, and a headless run keeps the first registry's pick (npm, then PyPI, then crates.io) and records an `also_found_in` warning in its result envelope. He then detects the main language from the repository's files, starting with its manifest (`pyproject.toml`, `package.json`, etc.). By default Quick Skill reads the repository's default branch. To pin a release, add it to the command (`@Ferris QS cognee@1.0.0`): Ferris checks that the matching git tag exists, stops if it doesn't, and reads everything from that tag.
26
+ Ferris turns your input into a GitHub repository. A GitHub URL is used as given. A package name is looked up on every registry of npm, PyPI and crates.io (a language hint asks only that language's registry), with a web search as the last resort. When more than one registry answers, an interactive run lists every candidate and asks which project you mean, and a headless run keeps the first registry's pick (npm, then PyPI, then crates.io) and records an `also_found_in` warning in its result envelope. He then detects the main language from the repository's files, starting with its manifest (`pyproject.toml`, `package.json`, etc.). By default Quick Skill reads the repository's default branch. To pin a release, add it to the command (`@Ferris QS cognee@1.6.2`): Ferris checks that the matching git tag exists, stops if it doesn't, and reads everything from that tag.
27
27
 
28
28
  Quick Skill has a step that checks for an official skill before it reads any code, but it skips that check until agentskills.io offers a registry API to ask, so Ferris goes straight on to extraction.
29
29
 
@@ -50,7 +50,7 @@ That's the whole pipeline. One trigger in, one reviewed skill out, built from co
50
50
  Quick Skill is the fastest path, not the most thorough one. When you want every instruction tied to a file and a line, use the brief-driven [`create-skill`](/docs/workflows.md#create-skill-cs) path instead: describe the skill's scope with `@Ferris BS`, which writes a `skill-brief.yaml`, then compile it with `@Ferris CS`. That path records the exact commit it read, and with ast-grep installed each export an ast-grep rule matches carries a receipt like this one:
51
51
 
52
52
  ```python
53
- await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
53
+ await cognee.search( # [AST:cognee/api/v1/search/search.py:L41]
54
54
  query_text="What does Cognee do?"
55
55
  )
56
56
  ```
package/docs/index.md CHANGED
@@ -26,7 +26,7 @@ Skill Forge reads a library's source code and docs and writes a skill: an instru
26
26
 
27
27
  <div class="receipt-sample">
28
28
  <span class="receipt-sample__label">An ast-grep receipt looks like</span>
29
- <code class="receipt-sample__chip">[AST:cognee/api/v1/search/search.py:L27]</code>
29
+ <code class="receipt-sample__chip">[AST:cognee/api/v1/search/search.py:L41]</code>
30
30
  <span class="receipt-sample__check" aria-label="verified">✓</span>
31
31
  </div>
32
32
 
@@ -187,25 +187,26 @@ Skills follow the [agentskills.io specification](https://agentskills.io/specific
187
187
  ---
188
188
  name: oms-cognee
189
189
  description: >
190
- Builds apps on top of cognee v1.0.0, the knowledge-graph memory engine for AI agents.
191
- Use when ingesting text/files/URLs into persistent memory, building knowledge graphs,
192
- searching graph-backed memory with multiple SearchType modes, enriching graphs with
193
- memify/improve, scoping memory with datasets and node_sets, configuring LLM/embedding/
194
- graph/vector backends, running custom task pipelines, tracing operations, decorating
195
- agent entrypoints with `agent_memory`, connecting to Cognee Cloud with `serve`, or
196
- visualizing the graph. Covers cognee/__init__.py exports: the V1 API (add, cognify,
197
- search, memify, datasets, prune, update, run_custom_pipeline, config, SearchType,
198
- visualize_graph, pipelines, Drop, run_startup_migrations, tracing) and the V2
199
- memory-oriented API (remember, RememberResult, recall, improve, forget, serve,
200
- disconnect, visualize, agent_memory). Do NOT use for: cognee internals, the HTTP
201
- REST API (use cognee-mcp or the FastAPI server), non-cognee memory/RAG libraries.
190
+ Builds apps on cognee v1.6.2, the knowledge-graph memory engine for AI agents.
191
+ Use when ingesting text/files/URLs into memory, building knowledge graphs, searching
192
+ memory with SearchType modes, enriching graphs with memify/improve, scoping memory
193
+ with datasets and node_sets, configuring LLM/embedding/graph/vector backends,
194
+ running custom pipelines, decorating agents with `agent_memory`, connecting
195
+ to Cognee Cloud with `serve`/`push`, exporting, validating or reporting on graphs,
196
+ or visualizing graphs and memory provenance. Covers cognee/__init__.py exports: the
197
+ V1 API (add, cognify, search, memify, datasets, agents, prune, update,
198
+ run_custom_pipeline, config, SearchType, report, validate, visualize_graph,
199
+ pipelines, Drop, run_migrations, tracing, tools) and the V2 memory API (remember,
200
+ recall, improve, forget, serve, disconnect, visualize, push, export, agent_memory,
201
+ MemoryEntry). Do NOT use for: cognee internals, the HTTP REST API (use
202
+ cognee-mcp or the FastAPI server), non-cognee memory/RAG libraries.
202
203
  ---
203
204
  ```
204
205
 
205
206
  Every instruction in the body traces to source, with a citation that names the tool that read it (`[AST:]` for an ast-grep match, `[SRC:]` for a read by eye):
206
207
 
207
208
  ```python
208
- await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
209
+ await cognee.search( # [AST:cognee/api/v1/search/search.py:L41]
209
210
  query_text="What does Cognee do?"
210
211
  )
211
212
  ```
@@ -214,44 +215,46 @@ await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
214
215
 
215
216
  Machine-readable provenance for every skill:
216
217
 
217
- This is a trimmed excerpt from the real [`oms-cognee/1.0.0/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/metadata.json) shipped with the oh-my-skills canonical output. Every value below is copied from the file, not made up for illustration.
218
+ This is a trimmed excerpt from the real [`oms-cognee/1.6.2/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.6.2/oms-cognee/metadata.json) shipped with the oh-my-skills canonical output. Every value below is copied from the file, not made up for illustration.
218
219
 
219
220
  ```json
220
221
  {
221
222
  "name": "oms-cognee",
222
- "version": "1.0.0",
223
+ "version": "1.6.2",
223
224
  "skill_type": "single",
224
225
  "source_authority": "community",
225
226
  "source_repo": "https://github.com/topoteretes/cognee",
226
- "source_commit": "3c048aa4",
227
- "source_ref": "v1.0.0",
227
+ "source_commit": "ba3631f2ed363a6ea50d649c34c56885af6b36fe",
228
+ "source_ref": "v1.6.2",
228
229
  "confidence_tier": "Deep",
229
230
  "spec_version": "1.3",
230
- "generation_date": "2026-04-13T00:00:00Z",
231
+ "generation_date": "2026-11-02T19:41:43Z",
231
232
  "language": "python",
232
- "ast_node_count": 34,
233
+ "ast_node_count": 42,
233
234
  "confidence_distribution": {
234
- "t1": 34,
235
- "t1_low": 0,
236
- "t2": 11,
237
- "t3": 15
235
+ "t1": 37,
236
+ "t1_low": 49,
237
+ "t2": 0,
238
+ "t3": 0
238
239
  },
239
240
  "stats": {
240
- "exports_documented": 34,
241
- "exports_public_api": 34,
242
- "exports_internal": 0,
243
- "exports_total": 34,
244
- "public_api_coverage": 1.0,
245
- "total_coverage": 1.0
241
+ "exports_documented": 86,
242
+ "exports_public_api": 102,
243
+ "exports_internal": 355,
244
+ "exports_total": 457,
245
+ "public_api_coverage": 0.8431,
246
+ "total_coverage": 0.1882,
247
+ "scripts_count": 0,
248
+ "assets_count": 0
246
249
  }
247
250
  }
248
251
  ```
249
252
 
250
- Fields omitted from this excerpt for brevity: `source_root`, `description`, `exports[]`, `tool_versions`, `dependencies`, `compatibility`, `generated_by`, and a `last_update` that an earlier SKF version wrote. Update Skill now records `last_update` and `update_type` at the top level of `provenance-map.json` in `forge-data/{name}/{version}/`, and an update removes both from `metadata.json`, which marks an update only in `generation_date`. The full 93-line file lives at [`oh-my-skills/skills/oms-cognee/1.0.0/oms-cognee/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/metadata.json).
253
+ Fields omitted from this excerpt for brevity: `source_root`, `description`, `exports[]`, `tool_versions`, `dependencies`, `compatibility` and `generated_by`. Update Skill records `last_update` and `update_type` at the top level of `provenance-map.json` in `forge-data/{name}/{version}/`, and an update removes both from `metadata.json`, which marks an update only in `generation_date`. The full 146-line file lives at [`oh-my-skills/skills/oms-cognee/1.6.2/oms-cognee/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.6.2/oms-cognee/metadata.json).
251
254
 
252
- Two fields are easy to mix up. `confidence_tier` holds the forge tier a single skill like this one was compiled at (Quick, Forge, Forge+ or Deep). A stack skill records there the dominant confidence tier of its libraries (T1, T1-low, T2 or T3) and keeps its forge tier in `forge_tier`; Export Skill still accepts a forge tier from a stack made by an earlier SKF version, with a warning that running Stack Skill again records the dominant tier. `confidence_distribution` counts the claims at each confidence tier (T1, T1-low, T2, T3). In a stack it counts each library once, by the library's tier, so its bins sum to `library_count`.
255
+ Two fields are easy to mix up. `confidence_tier` holds the forge tier a single skill like this one was compiled at (Quick, Forge, Forge+ or Deep). A stack skill records there the dominant confidence tier of its libraries (T1, T1-low, T2 or T3) and keeps its forge tier in `forge_tier`; Export Skill still accepts a forge tier from a stack made by an earlier SKF version, with a warning that running Stack Skill again records the dominant tier. `confidence_distribution` counts each claim by the tier of its signature (`signature_source`: T1, T1-low, T2 or T3), which can be lower than the entry's `confidence` label. In a stack it counts each library once, by the library's tier, so its bins sum to `library_count`.
253
256
 
254
- The excerpt's `t1` count of 34 comes from an SKF version that labeled exports by the forge tier. This skill's provenance map records its exports as read by eye (`source-read`), which SKF 3.0.0 counts as `t1_low`: only an export an ast-grep rule matched counts as `t1` now, and `ast_node_count` counts only those exports.
257
+ Its counts follow the tool that read each export's signature: 37 exports whose signature an ast-grep rule matched count as `t1`, and 49 count as `t1_low`. Of those 49, 44 were read by eye (`source-read`), such as aliases, module namespaces and the names gap-driven repairs added. The other 5 were located by an ast-grep rule, but their signatures were read by eye, such as the methods of the `config` class. `ast_node_count` (42) counts every export an ast-grep rule matched. The skill's 1.0.0 metadata, written by an SKF version that labeled exports by the forge tier, counted all 34 of its exports as `t1`. `exports_documented` (86) is below `exports_public_api` (102): the brief leaves some top-level names out of scope, and the skill's test report lists them and logs the remaining difference as a Medium `metadata-drift` gap.
255
258
 
256
259
  `scripts` and `assets` arrays are optional: SKF leaves them out entirely, rather than writing empty arrays, when the source has no scripts or assets.
257
260
 
@@ -301,18 +304,17 @@ Export injects a managed section between markers:
301
304
  The block below is the real managed section currently in [`oh-my-skills/CLAUDE.md`](https://github.com/armelhbobdad/oh-my-skills/blob/main/CLAUDE.md), showing one of its four compiled skills. Every line is copied from the file except the last one before `<!-- SKF:END -->`, which stands in for the three skills left out:
302
305
 
303
306
  ```markdown
304
- <!-- SKF:BEGIN updated:2026-04-25 -->
307
+ <!-- SKF:BEGIN updated:2026-11-02 -->
305
308
  [SKF Skills]|4 skills|0 stack
306
309
  |IMPORTANT: Prefer documented APIs over training data.
307
310
  |When using a listed library, read its SKILL.md before writing code.
308
311
  |
309
- |[oms-cognee v1.0.0]|root: skills/oms-cognee/
310
- |IMPORTANT: oms-cognee v1.0.0 — read SKILL.md before writing cognee code. Do NOT rely on training data.
312
+ |[oms-cognee v1.6.2]|root: skills/oms-cognee/
313
+ |IMPORTANT: oms-cognee v1.6.2 — read SKILL.md before writing oms-cognee code. Do NOT rely on training data.
311
314
  |quick-start:SKILL.md#quick-start
312
- |api-v1: add(), cognify(), search(), memify(), update(), run_custom_pipeline(), visualize_graph(), datasets, prune, config, SearchType, pipelines, Drop, run_startup_migrations(), session, tracing
313
- |api-v2: remember()→RememberResult, recall(), improve(), forget(), serve()/disconnect(), visualize(), @agent_memory
314
- |key-types:SKILL.md#key-types — SearchType: GRAPH_COMPLETION (default), RAG_COMPLETION, CHUNKS, CHUNKS_LEXICAL, SUMMARIES, TEMPORAL, CODING_RULES, CYPHER, FEELING_LUCKY, GRAPH_COMPLETION_DECOMPOSITION (+5 more); Task, Drop, RememberResult, DataPoint, 5 Cognee* exceptions
315
- |gotchas: cognee.low_level REMOVED from public API in v1.0.0 (import from cognee.infrastructure.engine directly); cognee.run_migrations REPLACED by cognee.run_startup_migrations (relational + vector); cognee.delete is DEPRECATED since v0.3.9 (use cognee.datasets.delete_data or cognee.forget); cognee.pipelines restructured in v1.0.0 (package with Drop + lazy re-exports); cognee.agent_memory requires async function; cognee.serve() without url triggers Auth0 Device Code Flow; cognee.start_ui is sync and needs pid_callback arg; all add/cognify/search/memify/remember/recall/improve/forget/serve are async — always await.
315
+ |api: add(), cognify(), search(), memify(), remember(), recall(), improve(), forget(), serve(), run_migrations()
316
+ |key-types:SKILL.md#key-types — SearchType (20 modes, HYBRID_COMPLETION default), RememberResult, DataPoint, Drop
317
+ |gotchas: cognee.run_startup_migrations is GONE in v1.6.2 (AttributeError) — use cognee.run_migrations(); search() now defaults to HYBRID_COMPLETION (pin query_type when the result shape matters); low_level is not a top-level name but `from cognee.low_level import DataPoint, setup` still works; a bare cognee.serve() runs the Auth0 device flow only when a device client ID is configured, else raises CogneeConfigurationError; agent_memory's save_traces is now save_session_traces; cognee.delete is DEPRECATED since v0.3.9 (use cognee.forget or cognee.datasets.delete_data); cognee.start_ui is sync and needs pid_callback; add/cognify/search/memify/remember/recall/improve/forget/serve/push/export/report/validate are async — always await.
316
318
  |
317
319
  |(three more skills are left out here for brevity: oms-cocoindex, oms-storybook-react-vite and oms-uitripled; see the full file)
318
320
  <!-- SKF:END -->
@@ -49,6 +49,12 @@ Install [cocoindex-code](https://github.com/cocoindex-io/cocoindex-code) (the `c
49
49
 
50
50
  When ccc is available (Forge+, or Deep with ccc), create-skill indexes the skill's source with it. A local source folder inside your project or inside another git checkout (a subfolder such as `./packages/lib`, a linked worktree or a submodule) becomes a ccc project of its own, and ccc does not gitignore an index there. create-skill keeps it out of git by writing a `.gitignore` holding `*` inside that `.cocoindex_code/` folder, and says so in one line; it never edits your own `.gitignore`. For a folder an earlier SKF release left untracked, run create-skill for that source again, or create `<source>/.cocoindex_code/.gitignore` holding the single line `*`. If you already committed the index, `git rm -r --cached <source>/.cocoindex_code` stops tracking it.
51
51
 
52
+ ### Setup says the CCC index failed
53
+
54
+ Surfaced by `@Ferris SF` when ccc is available and `ccc index` exits with an error: the forge status shows `indexing failed, semantic discovery unavailable this session` with ccc's own message. Setup still finishes at your tier; only semantic discovery is off until the index builds. One cause is an index that an older ccc wrote and the installed ccc cannot read, with a message such as `Failed to deserialize pickle payload`.
55
+
56
+ **Fix:** from the project root, run `ccc reset`, then `ccc daemon restart`, then re-run `@Ferris SF`. `ccc reset` deletes only the index databases and keeps `.cocoindex_code/settings.yml` with SKF's exclusions. Restart the daemon before indexing again: it still holds the databases `ccc reset` deleted, so an index built right after the reset can fail with `environment already open in this program`.
57
+
52
58
  ### `@Ferris deepwiki` shows a deprecation notice
53
59
 
54
60
  The auto pipeline was briefly named `deepwiki`; it's now [`forge-auto`](/docs/forge-auto.md). It was renamed to avoid confusion with the DeepWiki MCP server, since the pipeline compiles a verified skill from source and does **not** call that server. `deepwiki` still works (it resolves to `forge-auto`) but prints a one-time notice. Switch your commands to `@Ferris forge-auto <repo-or-doc-url>`.
@@ -145,6 +151,8 @@ Surfaced by `@Ferris US` when another update of the same skill holds its run loc
145
151
 
146
152
  **`run-lock-lost`:** the same status with this reason means the update waited at a question past the stale time, so another update may have changed the skill (`error.phase` is `merge:run-lock` or `write:run-lock`). It stops before it writes `metadata.json`, and the halt undoes anything the update already wrote: it removes the new version folders, or, for a repair from a test report, restores the files it edited in place from the copy it took first, and the message says which. Re-run the update once no other update of that skill runs; if a version folder the message names is still on disk, delete it first.
147
153
 
154
+ **`busy`:** the same status with this reason means another run's flip of the skill's `active` link (Create Skill, Quick Skill or Drop Skill) held the link's lock for 5 seconds while the update was pointing the link at its version (`error.phase` is `write:active-symlink`). The update did not change the link, and the halt undid what the update wrote. Re-run the update once that run ends.
155
+
148
156
  ### A report says `Tessl Review: off`, `not run`, `no result` or `failed`
149
157
 
150
158
  Create Skill and Test Skill record one `Tessl Review:` line in the evidence report and the test report. Tessl Review is optional and never stops a run, so the line says why it produced no score: