@waoooo/claude-skills 1.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.
- package/README.md +48 -0
- package/package.json +28 -0
- package/registry.json +431 -0
- package/skills/acceptance-review/SKILL.md +537 -0
- package/skills/all-plan/SKILL.md +19 -0
- package/skills/all-plan/references/flow.md +750 -0
- package/skills/api-docs-generate/SKILL.md +204 -0
- package/skills/api-docs-generate/assets/templates/api.mdx +140 -0
- package/skills/api-docs-generate/scripts/generate-api-docs.ts +308 -0
- package/skills/ask/SKILL.md +42 -0
- package/skills/autonew/SKILL.md +34 -0
- package/skills/capability-analyze/SKILL.md +300 -0
- package/skills/capability-analyze/scripts/analyze-capabilities.ts +531 -0
- package/skills/capability-docs-generate/SKILL.md +155 -0
- package/skills/capability-docs-generate/assets/templates/capability.mdx +271 -0
- package/skills/capability-docs-generate/scripts/generate-capability-docs.ts +358 -0
- package/skills/capability-tree-query/SKILL.md +112 -0
- package/skills/capability-tree-query/scripts/build-capability-tree.ts +402 -0
- package/skills/changelog-generator/SKILL.md +104 -0
- package/skills/continue/SKILL.md +39 -0
- package/skills/continue/agents/openai.yaml +3 -0
- package/skills/creating-skills/SKILL.md +158 -0
- package/skills/creating-skills/references/official_best_practices.md +128 -0
- package/skills/creating-skills/references/skill_examples.md +199 -0
- package/skills/docx/LICENSE.txt +30 -0
- package/skills/docx/SKILL.md +197 -0
- package/skills/docx/docx-js.md +350 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/docx/ooxml/scripts/pack.py +159 -0
- package/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/skills/docx/ooxml/scripts/validate.py +69 -0
- package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/docx/ooxml.md +610 -0
- package/skills/docx/scripts/__init__.py +1 -0
- package/skills/docx/scripts/document.py +1276 -0
- package/skills/docx/scripts/templates/comments.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/docx/scripts/templates/people.xml +3 -0
- package/skills/docx/scripts/utilities.py +374 -0
- package/skills/git-branch-create/SKILL.md +170 -0
- package/skills/git-branch-merge/SKILL.md +176 -0
- package/skills/git-commit/SKILL.md +56 -0
- package/skills/git-commit/references/commit_examples.md +311 -0
- package/skills/github-actions-trigger/SKILL.md +367 -0
- package/skills/github-issue-create/SKILL.md +294 -0
- package/skills/github-pr-creation/SKILL.md +137 -0
- package/skills/github-pr-creation/references/pr_templates.md +187 -0
- package/skills/github-pr-merge/SKILL.md +112 -0
- package/skills/github-pr-review/SKILL.md +110 -0
- package/skills/github-pr-review/references/severity_guide.md +168 -0
- package/skills/job-create/SKILL.md +294 -0
- package/skills/job-create/scripts/create-job.ts +105 -0
- package/skills/job-workflow/SKILL.md +212 -0
- package/skills/keyword-extract/SKILL.md +229 -0
- package/skills/mcp-builder/LICENSE.txt +202 -0
- package/skills/mcp-builder/SKILL.md +236 -0
- package/skills/mcp-builder/reference/evaluation.md +602 -0
- package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/skills/mcp-builder/scripts/connections.py +151 -0
- package/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/mdx-to-openspec/SKILL.md +827 -0
- package/skills/mdx-to-openspec/scripts/mdx-to-openspec.ts +320 -0
- package/skills/mounted/SKILL.md +20 -0
- package/skills/multi-model-review/SKILL.md +459 -0
- package/skills/notion-automation/SKILL.md +215 -0
- package/skills/openspec-review/SKILL.md +513 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +294 -0
- package/skills/pdf/forms.md +205 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/skills/pdf/scripts/create_validation_image.py +41 -0
- package/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/skills/pend/SKILL.md +33 -0
- package/skills/ping/SKILL.md +39 -0
- package/skills/pptx/LICENSE.txt +30 -0
- package/skills/pptx/SKILL.md +484 -0
- package/skills/pptx/html2pptx.md +625 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/pptx/ooxml/scripts/pack.py +159 -0
- package/skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/skills/pptx/ooxml/scripts/validate.py +69 -0
- package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/pptx/ooxml.md +427 -0
- package/skills/pptx/scripts/html2pptx.js +979 -0
- package/skills/pptx/scripts/inventory.py +1020 -0
- package/skills/pptx/scripts/rearrange.py +231 -0
- package/skills/pptx/scripts/replace.py +385 -0
- package/skills/pptx/scripts/thumbnail.py +450 -0
- package/skills/progress-update/SKILL.md +394 -0
- package/skills/progress-update/scripts/update-progress.ts +221 -0
- package/skills/release-automation/SKILL.md +306 -0
- package/skills/requirement-parse/SKILL.md +212 -0
- package/skills/requirement-parse/scripts/infer-builder-config.ts +346 -0
- package/skills/requirement-parse/scripts/merge-requirements.ts +228 -0
- package/skills/requirement-parse/scripts/parse-docs.ts +206 -0
- package/skills/requirement-parse/scripts/parse-openspec.ts +168 -0
- package/skills/roadmap-docs-generate/SKILL.md +483 -0
- package/skills/roadmap-docs-generate/assets/templates/ROADMAP.mdx +75 -0
- package/skills/roadmap-docs-generate/assets/templates/ROADMAP.mdx.template +330 -0
- package/skills/roadmap-docs-generate/assets/templates/TODO.mdx +56 -0
- package/skills/roadmap-docs-generate/assets/templates/TODO.mdx.template +363 -0
- package/skills/roadmap-docs-generate/scripts/json-to-mdx.ts +445 -0
- package/skills/roadmap-docs-generate/scripts/json-to-mdx.ts.backup +411 -0
- package/skills/roadmap-generate/SKILL.md +396 -0
- package/skills/roadmap-generate/scripts/generate-roadmap.ts +496 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +356 -0
- package/skills/skill-creator/references/output-patterns.md +82 -0
- package/skills/skill-creator/references/workflows.md +28 -0
- package/skills/skill-creator/scripts/init_skill.py +303 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/spec-generate/SKILL.md +408 -0
- package/skills/spec-generate/scripts/generate-specs.ts +538 -0
- package/skills/spec-generate/scripts/generate-tasks.ts +174 -0
- package/skills/specs-review/SKILL.md +370 -0
- package/skills/task-execute/SKILL.md +399 -0
- package/skills/task-update-status/SKILL.md +349 -0
- package/skills/task-update-status/scripts/update-task-status.ts +192 -0
- package/skills/task-verify/SKILL.md +407 -0
- package/skills/ui-ux-pro-max/SKILL.md +386 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/vercel-automation/SKILL.md +226 -0
- package/skills/webapp-testing/LICENSE.txt +202 -0
- package/skills/webapp-testing/SKILL.md +96 -0
- package/skills/webapp-testing/examples/console_logging.py +35 -0
- package/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/webapp-testing/scripts/with_server.py +106 -0
- package/skills/worktree-manager/SKILL.md +725 -0
- package/skills/worktree-manager/config.json +15 -0
- package/skills/worktree-manager/scripts/allocate-ports.sh +100 -0
- package/skills/worktree-manager/scripts/cleanup.sh +185 -0
- package/skills/worktree-manager/scripts/launch-agent.sh +155 -0
- package/skills/worktree-manager/scripts/register.sh +125 -0
- package/skills/worktree-manager/scripts/release-ports.sh +48 -0
- package/skills/worktree-manager/scripts/status.sh +169 -0
- package/skills/worktree-manager/scripts/sync.sh +168 -0
- package/skills/worktree-manager/templates/worktree.json +23 -0
- package/skills/xlsx/LICENSE.txt +30 -0
- package/skills/xlsx/SKILL.md +289 -0
- package/skills/xlsx/recalc.py +178 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Skill: capability-tree-query
|
|
2
|
+
|
|
3
|
+
## 功能
|
|
4
|
+
|
|
5
|
+
查询和更新全局能力树(capability-tree.json)。
|
|
6
|
+
|
|
7
|
+
## 何时调用
|
|
8
|
+
|
|
9
|
+
- 开始任何 Job 之前
|
|
10
|
+
- 需要查询能力状态时
|
|
11
|
+
- 需要检查能力是否存在时
|
|
12
|
+
|
|
13
|
+
## 输入
|
|
14
|
+
|
|
15
|
+
无需输入参数
|
|
16
|
+
|
|
17
|
+
## 输出
|
|
18
|
+
|
|
19
|
+
- `exports/capability-tree/capability-tree.json` - 全局能力树
|
|
20
|
+
- `exports/capability-tree/capability-tree.yaml` - YAML 格式(可选)
|
|
21
|
+
|
|
22
|
+
## 执行步骤
|
|
23
|
+
|
|
24
|
+
1. 运行构建脚本
|
|
25
|
+
```bash
|
|
26
|
+
pnpm capability:build-tree
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
2. 验证输出
|
|
30
|
+
- 检查 `capability-tree.json` 是否生成
|
|
31
|
+
- 检查文件格式是否正确
|
|
32
|
+
|
|
33
|
+
3. 显示统计信息
|
|
34
|
+
- 总能力数量
|
|
35
|
+
- 各层级能力数量(L1, L2, L3, L5)
|
|
36
|
+
- 已实现 vs 未实现
|
|
37
|
+
|
|
38
|
+
## 使用示例
|
|
39
|
+
|
|
40
|
+
### 示例 1:更新能力树
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
用户: "更新能力树"
|
|
44
|
+
|
|
45
|
+
Agent 行动:
|
|
46
|
+
1. 调用 capability-tree-query
|
|
47
|
+
2. 运行 pnpm capability:build-tree
|
|
48
|
+
3. 显示结果:
|
|
49
|
+
✅ 能力树已更新
|
|
50
|
+
📊 统计:
|
|
51
|
+
- 总计: 83 个能力
|
|
52
|
+
- L1: 13 个
|
|
53
|
+
- L2: 51 个
|
|
54
|
+
- L3: 15 个
|
|
55
|
+
- L5: 4 个
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 示例 2:查询能力状态
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
用户: "auth 能力存在吗?"
|
|
62
|
+
|
|
63
|
+
Agent 行动:
|
|
64
|
+
1. 读取 capability-tree.json
|
|
65
|
+
2. 搜索 id = "auth"
|
|
66
|
+
3. 显示结果:
|
|
67
|
+
✅ 找到能力: auth
|
|
68
|
+
- 名称: 认证系统
|
|
69
|
+
- 层级: L1
|
|
70
|
+
- 状态: implemented
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 错误处理
|
|
74
|
+
|
|
75
|
+
### 错误 1:能力文档不存在
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
❌ 错误: 找不到能力文档
|
|
79
|
+
📁 路径: waoooo-docs/developer-docs/capabilities/
|
|
80
|
+
|
|
81
|
+
💡 建议:
|
|
82
|
+
1. 检查 waoooo-docs 仓库是否存在
|
|
83
|
+
2. 确认路径配置正确
|
|
84
|
+
3. 检查文档目录结构
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 错误 2:生成失败
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
❌ 错误: 能力树生成失败
|
|
91
|
+
🔍 原因: MDX 解析错误
|
|
92
|
+
|
|
93
|
+
💡 建议:
|
|
94
|
+
1. 检查 MDX 文档格式
|
|
95
|
+
2. 查看详细错误日志
|
|
96
|
+
3. 修复 MDX 后重试
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 相关脚本
|
|
100
|
+
|
|
101
|
+
- `src/scripts/build-capability-tree.ts` - 构建能力树的核心脚本
|
|
102
|
+
|
|
103
|
+
## 相关文件
|
|
104
|
+
|
|
105
|
+
- `exports/capability-tree/capability-tree.json` - 输出文件
|
|
106
|
+
- `waoooo-docs/developer-docs/capabilities/**/*.mdx` - 输入文件
|
|
107
|
+
|
|
108
|
+
## 注意事项
|
|
109
|
+
|
|
110
|
+
1. **只读操作** - 此 Skill 只生成能力树,不修改源文件
|
|
111
|
+
2. **幂等性** - 可以重复执行,结果一致
|
|
112
|
+
3. **依赖外部仓库** - 需要 waoooo-docs 仓库存在
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build Capability Tree from mint.json
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Generate a simple capability reference list for Product Builder
|
|
5
|
+
* Output: JSON with id, name, layer, status, description, children, docsLink
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import matter from 'gray-matter';
|
|
11
|
+
|
|
12
|
+
interface MintNavigation {
|
|
13
|
+
group: string;
|
|
14
|
+
pages: (string | MintNavigation)[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface MintJson {
|
|
18
|
+
navigation: MintNavigation[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface Capability {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
layer: 'L1' | 'L2' | 'L3' | 'L4' | 'L5';
|
|
25
|
+
status: 'implemented' | 'partial' | 'planned' | 'missing';
|
|
26
|
+
description: string;
|
|
27
|
+
tags: string[]; // 自动生成的标签
|
|
28
|
+
requires?: string[]; // 依赖的能力 ID
|
|
29
|
+
relatedTo?: string[]; // 相关的能力 ID
|
|
30
|
+
parentId?: string;
|
|
31
|
+
children?: Capability[];
|
|
32
|
+
docsLink: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface CapabilityTree {
|
|
36
|
+
version: string;
|
|
37
|
+
generatedAt: string;
|
|
38
|
+
sourceDir: string;
|
|
39
|
+
capabilities: Capability[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function loadMintJson(docsDir: string): MintJson {
|
|
43
|
+
const mintPath = path.join(docsDir, 'mint.json');
|
|
44
|
+
const content = fs.readFileSync(mintPath, 'utf-8');
|
|
45
|
+
return JSON.parse(content);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function extractLayer(groupName: string): Capability['layer'] | null {
|
|
49
|
+
// Skip non-capability groups
|
|
50
|
+
if (groupName.includes('开发指南') || groupName.includes('使用指南') || groupName.includes('指南')) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Skip L4 product capabilities and product documentation
|
|
55
|
+
if (groupName.includes('产品')) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (groupName.includes('L1') || groupName.includes('基础能力')) return 'L1';
|
|
60
|
+
if (groupName.includes('L2') || groupName.includes('连接能力')) return 'L2';
|
|
61
|
+
if (groupName.includes('L3') || groupName.includes('专业能力')) return 'L3';
|
|
62
|
+
if (groupName.includes('L5') || groupName.includes('开放能力')) return 'L5';
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function shouldSkipPage(pagePath: string): boolean {
|
|
67
|
+
const skipPages = [
|
|
68
|
+
'capabilities/l1-foundation',
|
|
69
|
+
'capabilities/l2-integration',
|
|
70
|
+
'capabilities/l3-professional',
|
|
71
|
+
'capabilities/l4-product',
|
|
72
|
+
'capabilities/l5-open',
|
|
73
|
+
];
|
|
74
|
+
return skipPages.includes(pagePath);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function extractId(pagePath: string): string {
|
|
78
|
+
const pathParts = pagePath.split('/');
|
|
79
|
+
if (pathParts[pathParts.length - 1] === 'overview') {
|
|
80
|
+
return pathParts[pathParts.length - 2];
|
|
81
|
+
}
|
|
82
|
+
return pathParts[pathParts.length - 1];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function extractStatus(content: string): Capability['status'] {
|
|
86
|
+
if (content.includes('✅ 已实现') || content.includes('已完成')) {
|
|
87
|
+
return 'implemented';
|
|
88
|
+
} else if (content.includes('⚠️') || content.includes('🚧') || content.includes('部分')) {
|
|
89
|
+
return 'partial';
|
|
90
|
+
} else if (content.includes('📅') || content.includes('计划')) {
|
|
91
|
+
return 'planned';
|
|
92
|
+
}
|
|
93
|
+
return 'missing';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Auto-generate tags from capability name and description
|
|
98
|
+
*/
|
|
99
|
+
function generateTags(name: string, description: string, id: string): string[] {
|
|
100
|
+
const tags = new Set<string>();
|
|
101
|
+
|
|
102
|
+
// Add ID
|
|
103
|
+
tags.add(id);
|
|
104
|
+
|
|
105
|
+
// Add name (split by space, dash, etc.)
|
|
106
|
+
const nameWords = name
|
|
107
|
+
.toLowerCase()
|
|
108
|
+
.split(/[\s\-_\/]+/)
|
|
109
|
+
.filter(w => w.length > 1);
|
|
110
|
+
nameWords.forEach(w => tags.add(w));
|
|
111
|
+
|
|
112
|
+
// Add description keywords (extract important words)
|
|
113
|
+
if (description) {
|
|
114
|
+
const descWords = description
|
|
115
|
+
.toLowerCase()
|
|
116
|
+
.replace(/[^\w\s\u4e00-\u9fa5]/g, ' ')
|
|
117
|
+
.split(/\s+/)
|
|
118
|
+
.filter(w => w.length > 1)
|
|
119
|
+
.slice(0, 10); // Top 10 words
|
|
120
|
+
descWords.forEach(w => tags.add(w));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Add English translation of common Chinese terms
|
|
124
|
+
const translations: Record<string, string[]> = {
|
|
125
|
+
'认证': ['auth', 'authentication'],
|
|
126
|
+
'授权': ['authorization', 'permission'],
|
|
127
|
+
'会员': ['membership', 'member'],
|
|
128
|
+
'定价': ['pricing', 'price'],
|
|
129
|
+
'支付': ['payment', 'pay'],
|
|
130
|
+
'路由': ['routing', 'route'],
|
|
131
|
+
'网关': ['gateway'],
|
|
132
|
+
'存储': ['storage', 'store'],
|
|
133
|
+
'监控': ['monitoring', 'monitor'],
|
|
134
|
+
'日志': ['logging', 'log'],
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
for (const [chinese, english] of Object.entries(translations)) {
|
|
138
|
+
if (name.includes(chinese) || description.includes(chinese)) {
|
|
139
|
+
english.forEach(e => tags.add(e));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return Array.from(tags);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function readMDXMetadata(docsDir: string, pagePath: string): {
|
|
147
|
+
description: string;
|
|
148
|
+
status: Capability['status'];
|
|
149
|
+
tags: string[];
|
|
150
|
+
keywords: string[];
|
|
151
|
+
requires?: string[];
|
|
152
|
+
relatedTo?: string[];
|
|
153
|
+
} {
|
|
154
|
+
const mdxPath = path.join(docsDir, `${pagePath}.mdx`);
|
|
155
|
+
|
|
156
|
+
if (!fs.existsSync(mdxPath)) {
|
|
157
|
+
return { description: '', status: 'missing', tags: [], keywords: [] };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
const content = fs.readFileSync(mdxPath, 'utf-8');
|
|
162
|
+
const { data } = matter(content);
|
|
163
|
+
const description = data.description || '';
|
|
164
|
+
const status = extractStatus(content);
|
|
165
|
+
|
|
166
|
+
// Read keywords from frontmatter (preferred)
|
|
167
|
+
const keywords = data.keywords || [];
|
|
168
|
+
|
|
169
|
+
// Read dependency information from frontmatter
|
|
170
|
+
const requires = data.requires || [];
|
|
171
|
+
const relatedTo = data.relatedTo || data.related || [];
|
|
172
|
+
|
|
173
|
+
// Fallback: generate tags from name and description
|
|
174
|
+
const capName = pagePath.split('/').pop() || '';
|
|
175
|
+
const tags = keywords.length > 0 ? keywords : generateTags(capName, description, capName);
|
|
176
|
+
|
|
177
|
+
return { description, status, tags, keywords, requires, relatedTo };
|
|
178
|
+
} catch (error) {
|
|
179
|
+
return { description: '', status: 'missing', tags: [], keywords: [] };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function parseCapabilityFromGroup(
|
|
184
|
+
docsDir: string,
|
|
185
|
+
group: MintNavigation,
|
|
186
|
+
layer: Capability['layer'],
|
|
187
|
+
parentId?: string
|
|
188
|
+
): Capability | null {
|
|
189
|
+
try {
|
|
190
|
+
const groupName = group.group;
|
|
191
|
+
|
|
192
|
+
const mainPage = group.pages.find(p => {
|
|
193
|
+
if (typeof p === 'string') {
|
|
194
|
+
return p.endsWith('/overview') || true;
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}) as string | undefined;
|
|
198
|
+
|
|
199
|
+
if (!mainPage) {
|
|
200
|
+
console.warn(` ⚠ No main page found for group: ${groupName}`);
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const id = extractId(mainPage);
|
|
205
|
+
const { description, status, tags, requires, relatedTo } = readMDXMetadata(docsDir, mainPage);
|
|
206
|
+
|
|
207
|
+
const children: Capability[] = [];
|
|
208
|
+
for (const page of group.pages) {
|
|
209
|
+
if (typeof page === 'string') {
|
|
210
|
+
const pageName = page.split('/').pop() || '';
|
|
211
|
+
// Skip documentation pages (not capabilities)
|
|
212
|
+
if (pageName === 'overview' || pageName === 'concepts' || pageName === 'usage') {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const childId = extractId(page);
|
|
217
|
+
const { description: childDescription, status: childStatus, requires: childRequires, relatedTo: childRelatedTo } = readMDXMetadata(docsDir, page);
|
|
218
|
+
|
|
219
|
+
const mdxPath = path.join(docsDir, `${page}.mdx`);
|
|
220
|
+
let childName = childId;
|
|
221
|
+
|
|
222
|
+
if (fs.existsSync(mdxPath)) {
|
|
223
|
+
const content = fs.readFileSync(mdxPath, 'utf-8');
|
|
224
|
+
const { data } = matter(content);
|
|
225
|
+
childName = data.title || childId;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
children.push({
|
|
229
|
+
id: childId,
|
|
230
|
+
name: childName,
|
|
231
|
+
layer,
|
|
232
|
+
status: childStatus,
|
|
233
|
+
description: childDescription,
|
|
234
|
+
requires: childRequires,
|
|
235
|
+
relatedTo: childRelatedTo,
|
|
236
|
+
parentId: id,
|
|
237
|
+
docsLink: `/${page}`,
|
|
238
|
+
});
|
|
239
|
+
} else if (page.group) {
|
|
240
|
+
const child = parseCapabilityFromGroup(docsDir, page, layer, id);
|
|
241
|
+
if (child) {
|
|
242
|
+
children.push(child);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return {
|
|
248
|
+
id,
|
|
249
|
+
name: groupName,
|
|
250
|
+
layer,
|
|
251
|
+
status,
|
|
252
|
+
description,
|
|
253
|
+
requires,
|
|
254
|
+
relatedTo,
|
|
255
|
+
parentId,
|
|
256
|
+
children: children.length > 0 ? children : undefined,
|
|
257
|
+
docsLink: `/${mainPage}`,
|
|
258
|
+
};
|
|
259
|
+
} catch (error) {
|
|
260
|
+
console.error(`Error parsing group ${group.group}:`, error);
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function parseCapabilityFromPage(
|
|
266
|
+
docsDir: string,
|
|
267
|
+
pagePath: string,
|
|
268
|
+
layer: Capability['layer']
|
|
269
|
+
): Capability | null {
|
|
270
|
+
try {
|
|
271
|
+
const id = extractId(pagePath);
|
|
272
|
+
const { description, status, requires, relatedTo } = readMDXMetadata(docsDir, pagePath);
|
|
273
|
+
|
|
274
|
+
const mdxPath = path.join(docsDir, `${pagePath}.mdx`);
|
|
275
|
+
let name = id;
|
|
276
|
+
|
|
277
|
+
if (fs.existsSync(mdxPath)) {
|
|
278
|
+
const content = fs.readFileSync(mdxPath, 'utf-8');
|
|
279
|
+
const { data } = matter(content);
|
|
280
|
+
name = data.title || id;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return {
|
|
284
|
+
id,
|
|
285
|
+
name,
|
|
286
|
+
layer,
|
|
287
|
+
status,
|
|
288
|
+
description,
|
|
289
|
+
requires,
|
|
290
|
+
relatedTo,
|
|
291
|
+
docsLink: `/${pagePath}`,
|
|
292
|
+
};
|
|
293
|
+
} catch (error) {
|
|
294
|
+
console.error(`Error parsing page ${pagePath}:`, error);
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function buildCapabilityTree(docsDir: string): CapabilityTree {
|
|
300
|
+
const mintJson = loadMintJson(docsDir);
|
|
301
|
+
const capabilities: Capability[] = [];
|
|
302
|
+
|
|
303
|
+
for (const navGroup of mintJson.navigation) {
|
|
304
|
+
const layer = extractLayer(navGroup.group);
|
|
305
|
+
|
|
306
|
+
if (!layer) {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
console.log(`\nProcessing ${navGroup.group} (${layer})...`);
|
|
311
|
+
|
|
312
|
+
for (const page of navGroup.pages) {
|
|
313
|
+
if (typeof page === 'string') {
|
|
314
|
+
if (shouldSkipPage(page)) {
|
|
315
|
+
console.log(` Skipping layer overview: ${page}`);
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const capability = parseCapabilityFromPage(docsDir, page, layer);
|
|
320
|
+
if (capability) {
|
|
321
|
+
console.log(` ✓ Added capability: ${capability.name} (${capability.id})`);
|
|
322
|
+
capabilities.push(capability);
|
|
323
|
+
}
|
|
324
|
+
} else if (page.group) {
|
|
325
|
+
const capability = parseCapabilityFromGroup(docsDir, page, layer);
|
|
326
|
+
if (capability) {
|
|
327
|
+
const childCount = capability.children ? capability.children.length : 0;
|
|
328
|
+
console.log(` ✓ Added capability: ${capability.name} (${capability.id})${childCount > 0 ? ` with ${childCount} children` : ''}`);
|
|
329
|
+
capabilities.push(capability);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
capabilities.sort((a, b) => {
|
|
336
|
+
if (a.layer !== b.layer) {
|
|
337
|
+
return a.layer.localeCompare(b.layer);
|
|
338
|
+
}
|
|
339
|
+
return a.name.localeCompare(b.name);
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
return {
|
|
343
|
+
version: '1.0.0',
|
|
344
|
+
generatedAt: new Date().toISOString(),
|
|
345
|
+
sourceDir: docsDir,
|
|
346
|
+
capabilities,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
351
|
+
const args = process.argv.slice(2);
|
|
352
|
+
const inputDir = args[0] || '../../../waoooo-docs/developer-docs';
|
|
353
|
+
const outputFile = args[1] || './exports/capability-tree/capability-tree.json';
|
|
354
|
+
|
|
355
|
+
console.log('Building capability tree from mint.json...');
|
|
356
|
+
console.log('Input:', inputDir);
|
|
357
|
+
|
|
358
|
+
const tree = buildCapabilityTree(inputDir);
|
|
359
|
+
|
|
360
|
+
function countCapabilities(caps: Capability[]): { total: number; byLayer: Record<string, number> } {
|
|
361
|
+
let total = 0;
|
|
362
|
+
const byLayer: Record<string, number> = { L1: 0, L2: 0, L3: 0, L4: 0, L5: 0 };
|
|
363
|
+
|
|
364
|
+
for (const cap of caps) {
|
|
365
|
+
total++;
|
|
366
|
+
byLayer[cap.layer]++;
|
|
367
|
+
|
|
368
|
+
if (cap.children) {
|
|
369
|
+
const childCounts = countCapabilities(cap.children);
|
|
370
|
+
total += childCounts.total;
|
|
371
|
+
Object.keys(childCounts.byLayer).forEach(layer => {
|
|
372
|
+
byLayer[layer] += childCounts.byLayer[layer];
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return { total, byLayer };
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const counts = countCapabilities(tree.capabilities);
|
|
381
|
+
|
|
382
|
+
console.log(`\n✓ Found ${counts.total} capabilities (${tree.capabilities.length} root):`);
|
|
383
|
+
console.log(` L1: ${counts.byLayer.L1}`);
|
|
384
|
+
console.log(` L2: ${counts.byLayer.L2}`);
|
|
385
|
+
console.log(` L3: ${counts.byLayer.L3}`);
|
|
386
|
+
console.log(` L4: ${counts.byLayer.L4}`);
|
|
387
|
+
console.log(` L5: ${counts.byLayer.L5}`);
|
|
388
|
+
|
|
389
|
+
const outputDir = path.dirname(outputFile);
|
|
390
|
+
if (!fs.existsSync(outputDir)) {
|
|
391
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
fs.writeFileSync(outputFile, JSON.stringify(tree, null, 2));
|
|
395
|
+
console.log(`\n✓ Output (JSON): ${outputFile}`);
|
|
396
|
+
|
|
397
|
+
const yaml = await import('js-yaml');
|
|
398
|
+
const yamlFile = outputFile.replace('.json', '.yaml');
|
|
399
|
+
const yamlContent = yaml.dump(tree, { indent: 2, lineWidth: 120 });
|
|
400
|
+
fs.writeFileSync(yamlFile, yamlContent);
|
|
401
|
+
console.log(`✓ Output (YAML): ${yamlFile}`);
|
|
402
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: changelog-generator
|
|
3
|
+
description: Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Changelog Generator
|
|
7
|
+
|
|
8
|
+
This skill transforms technical git commits into polished, user-friendly changelogs that your customers and users will actually understand and appreciate.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
- Preparing release notes for a new version
|
|
13
|
+
- Creating weekly or monthly product update summaries
|
|
14
|
+
- Documenting changes for customers
|
|
15
|
+
- Writing changelog entries for app store submissions
|
|
16
|
+
- Generating update notifications
|
|
17
|
+
- Creating internal release documentation
|
|
18
|
+
- Maintaining a public changelog/product updates page
|
|
19
|
+
|
|
20
|
+
## What This Skill Does
|
|
21
|
+
|
|
22
|
+
1. **Scans Git History**: Analyzes commits from a specific time period or between versions
|
|
23
|
+
2. **Categorizes Changes**: Groups commits into logical categories (features, improvements, bug fixes, breaking changes, security)
|
|
24
|
+
3. **Translates Technical → User-Friendly**: Converts developer commits into customer language
|
|
25
|
+
4. **Formats Professionally**: Creates clean, structured changelog entries
|
|
26
|
+
5. **Filters Noise**: Excludes internal commits (refactoring, tests, etc.)
|
|
27
|
+
6. **Follows Best Practices**: Applies changelog guidelines and your brand voice
|
|
28
|
+
|
|
29
|
+
## How to Use
|
|
30
|
+
|
|
31
|
+
### Basic Usage
|
|
32
|
+
|
|
33
|
+
From your project repository:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Create a changelog from commits since last release
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Generate changelog for all commits from the past week
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Create release notes for version 2.5.0
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### With Specific Date Range
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Create a changelog for all commits between March 1 and March 15
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### With Custom Guidelines
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Create a changelog for commits since v2.4.0, using my changelog
|
|
57
|
+
guidelines from CHANGELOG_STYLE.md
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Example
|
|
61
|
+
|
|
62
|
+
**User**: "Create a changelog for commits from the past 7 days"
|
|
63
|
+
|
|
64
|
+
**Output**:
|
|
65
|
+
```markdown
|
|
66
|
+
# Updates - Week of March 10, 2024
|
|
67
|
+
|
|
68
|
+
## ✨ New Features
|
|
69
|
+
|
|
70
|
+
- **Team Workspaces**: Create separate workspaces for different
|
|
71
|
+
projects. Invite team members and keep everything organized.
|
|
72
|
+
|
|
73
|
+
- **Keyboard Shortcuts**: Press ? to see all available shortcuts.
|
|
74
|
+
Navigate faster without touching your mouse.
|
|
75
|
+
|
|
76
|
+
## 🔧 Improvements
|
|
77
|
+
|
|
78
|
+
- **Faster Sync**: Files now sync 2x faster across devices
|
|
79
|
+
- **Better Search**: Search now includes file contents, not just titles
|
|
80
|
+
|
|
81
|
+
## 🐛 Fixes
|
|
82
|
+
|
|
83
|
+
- Fixed issue where large images wouldn't upload
|
|
84
|
+
- Resolved timezone confusion in scheduled posts
|
|
85
|
+
- Corrected notification badge count
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Inspired by:** Manik Aggarwal's use case from Lenny's Newsletter
|
|
89
|
+
|
|
90
|
+
## Tips
|
|
91
|
+
|
|
92
|
+
- Run from your git repository root
|
|
93
|
+
- Specify date ranges for focused changelogs
|
|
94
|
+
- Use your CHANGELOG_STYLE.md for consistent formatting
|
|
95
|
+
- Review and adjust the generated changelog before publishing
|
|
96
|
+
- Save output directly to CHANGELOG.md
|
|
97
|
+
|
|
98
|
+
## Related Use Cases
|
|
99
|
+
|
|
100
|
+
- Creating GitHub release notes
|
|
101
|
+
- Writing app store update descriptions
|
|
102
|
+
- Generating email updates for users
|
|
103
|
+
- Creating social media announcement posts
|
|
104
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: continue
|
|
3
|
+
description: Attach the newest context-transfer Markdown from the current project's ./.ccb/history/ into Claude using @file. Use when the user types /continue or asks to resume with the latest transfer file in this project.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Continue (Attach Latest History)
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Find the newest Markdown in `./.ccb/history/` (or legacy `./.ccb_config/history/`) and reply with an `@file` reference so Claude loads it.
|
|
11
|
+
|
|
12
|
+
## Workflow
|
|
13
|
+
|
|
14
|
+
1. Locate the newest `.md` under the current project's history folder.
|
|
15
|
+
2. If none exists, report that no history file was found.
|
|
16
|
+
3. Reply with a single line `@<path>` and nothing else.
|
|
17
|
+
|
|
18
|
+
## Execution (MANDATORY)
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
latest="$(ls -t "$PWD"/.ccb/history/*.md 2>/dev/null | head -n 1)"
|
|
22
|
+
if [[ -z "$latest" ]]; then
|
|
23
|
+
latest="$(ls -t "$PWD"/.ccb_config/history/*.md 2>/dev/null | head -n 1)"
|
|
24
|
+
fi
|
|
25
|
+
if [[ -z "$latest" ]]; then
|
|
26
|
+
echo "No history file found in ./.ccb/history."
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
printf '@%s\n' "$latest"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Output Rules
|
|
33
|
+
|
|
34
|
+
- When a history file exists: output only `@<path>` on a single line.
|
|
35
|
+
- When none exists: output the error message and stop.
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
- `/continue` -> `@/home/bfly/workspace/hippocampus/.ccb/history/claude-20260208-225221-9f236442.md`
|