@hasna/skills 0.0.2 → 0.0.3
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/bin/index.js +253 -715
- package/bin/mcp.js +221 -683
- package/package.json +1 -1
- package/src/cli/cli.test.ts +14 -14
- package/src/cli/index.tsx +1 -1
- package/src/lib/installer.test.ts +41 -41
- package/src/lib/registry.test.ts +10 -10
- package/src/lib/registry.ts +10 -472
- package/src/lib/skillinfo.test.ts +12 -12
- package/src/mcp/index.ts +1 -1
- package/skills/skill-architecture-docs/CLAUDE.md +0 -19
- package/skills/skill-architecture-docs/package.json +0 -32
- package/skills/skill-architecture-docs/src/index.ts +0 -543
- package/skills/skill-auto-format/CLAUDE.md +0 -19
- package/skills/skill-auto-format/package.json +0 -32
- package/skills/skill-auto-format/src/index.ts +0 -103
- package/skills/skill-auto-format/tsconfig.json +0 -14
- package/skills/skill-brainstorm/README.md +0 -17
- package/skills/skill-brainstorm/install.sh +0 -112
- package/skills/skill-brainstorm/src/auth.ts +0 -49
- package/skills/skill-brainstorm/src/installer.ts +0 -324
- package/skills/skill-brainstorm/src/skill-install.ts +0 -205
- package/skills/skill-browser-agent/CLAUDE.md +0 -19
- package/skills/skill-browser-agent/package.json +0 -32
- package/skills/skill-browser-agent/src/index.ts +0 -626
- package/skills/skill-browser-agent/tsconfig.json +0 -14
- package/skills/skill-browseruse/LICENSE +0 -21
- package/skills/skill-browseruse/README.md +0 -27
- package/skills/skill-browseruse/SKILL.md +0 -113
- package/skills/skill-browseruse/install.sh +0 -112
- package/skills/skill-browseruse/package.json +0 -31
- package/skills/skill-browseruse/src/auth.ts +0 -49
- package/skills/skill-browseruse/src/installer.ts +0 -324
- package/skills/skill-browseruse/src/skill-install.ts +0 -174
- package/skills/skill-calculate/LICENSE +0 -21
- package/skills/skill-calculate/README.md +0 -17
- package/skills/skill-calculate/install.sh +0 -112
- package/skills/skill-calculate/package.json +0 -31
- package/skills/skill-calculate/src/auth.ts +0 -49
- package/skills/skill-calculate/src/installer.ts +0 -324
- package/skills/skill-calculate/src/skill-install.ts +0 -205
- package/skills/skill-chromedevtools/LICENSE +0 -21
- package/skills/skill-chromedevtools/README.md +0 -27
- package/skills/skill-chromedevtools/SKILL.md +0 -110
- package/skills/skill-chromedevtools/install.sh +0 -112
- package/skills/skill-chromedevtools/package.json +0 -31
- package/skills/skill-chromedevtools/src/auth.ts +0 -49
- package/skills/skill-chromedevtools/src/installer.ts +0 -324
- package/skills/skill-chromedevtools/src/skill-install.ts +0 -174
- package/skills/skill-companyguide/LICENSE +0 -21
- package/skills/skill-companyguide/README.md +0 -17
- package/skills/skill-companyguide/install.sh +0 -112
- package/skills/skill-companyguide/package.json +0 -31
- package/skills/skill-companyguide/src/auth.ts +0 -49
- package/skills/skill-companyguide/src/installer.ts +0 -324
- package/skills/skill-companyguide/src/skill-install.ts +0 -205
- package/skills/skill-compose-gmail/tsconfig.json +0 -14
- package/skills/skill-context7/LICENSE +0 -21
- package/skills/skill-context7/README.md +0 -27
- package/skills/skill-context7/SKILL.md +0 -103
- package/skills/skill-context7/install.sh +0 -112
- package/skills/skill-context7/package.json +0 -31
- package/skills/skill-context7/src/auth.ts +0 -49
- package/skills/skill-context7/src/installer.ts +0 -324
- package/skills/skill-context7/src/skill-install.ts +0 -174
- package/skills/skill-crawl/LICENSE +0 -21
- package/skills/skill-crawl/README.md +0 -17
- package/skills/skill-crawl/install.sh +0 -112
- package/skills/skill-crawl/package.json +0 -31
- package/skills/skill-crawl/src/auth.ts +0 -49
- package/skills/skill-crawl/src/installer.ts +0 -324
- package/skills/skill-crawl/src/skill-install.ts +0 -205
- package/skills/skill-csv-transformer/CLAUDE.md +0 -19
- package/skills/skill-csv-transformer/package.json +0 -32
- package/skills/skill-csv-transformer/src/index.ts +0 -81
- package/skills/skill-csv-transformer/tsconfig.json +0 -14
- package/skills/skill-debug/LICENSE +0 -21
- package/skills/skill-debug/README.md +0 -17
- package/skills/skill-debug/install.sh +0 -112
- package/skills/skill-debug/package.json +0 -31
- package/skills/skill-debug/src/auth.ts +0 -49
- package/skills/skill-debug/src/installer.ts +0 -324
- package/skills/skill-debug/src/skill-install.ts +0 -205
- package/skills/skill-deep-research/CLAUDE.md +0 -19
- package/skills/skill-deep-research/package.json +0 -32
- package/skills/skill-deep-research/src/index.ts +0 -1149
- package/skills/skill-deep-research/tsconfig.json +0 -14
- package/skills/skill-dns-manager/CLAUDE.md +0 -19
- package/skills/skill-dns-manager/package.json +0 -32
- package/skills/skill-dns-manager/src/index.ts +0 -92
- package/skills/skill-dns-manager/tsconfig.json +0 -14
- package/skills/skill-download/LICENSE +0 -21
- package/skills/skill-download/README.md +0 -17
- package/skills/skill-download/install.sh +0 -112
- package/skills/skill-download/package.json +0 -31
- package/skills/skill-download/src/auth.ts +0 -49
- package/skills/skill-download/src/installer.ts +0 -324
- package/skills/skill-download/src/skill-install.ts +0 -205
- package/skills/skill-exa/LICENSE +0 -21
- package/skills/skill-exa/README.md +0 -26
- package/skills/skill-exa/SKILL.md +0 -92
- package/skills/skill-exa/install.sh +0 -112
- package/skills/skill-exa/package.json +0 -31
- package/skills/skill-exa/src/auth.ts +0 -49
- package/skills/skill-exa/src/installer.ts +0 -324
- package/skills/skill-exa/src/skill-install.ts +0 -174
- package/skills/skill-filesearch/LICENSE +0 -21
- package/skills/skill-filesearch/README.md +0 -17
- package/skills/skill-filesearch/install.sh +0 -112
- package/skills/skill-filesearch/package.json +0 -31
- package/skills/skill-filesearch/src/auth.ts +0 -49
- package/skills/skill-filesearch/src/installer.ts +0 -324
- package/skills/skill-filesearch/src/skill-install.ts +0 -205
- package/skills/skill-fill/LICENSE +0 -21
- package/skills/skill-fill/README.md +0 -17
- package/skills/skill-fill/install.sh +0 -112
- package/skills/skill-fill/package.json +0 -31
- package/skills/skill-fill/src/auth.ts +0 -49
- package/skills/skill-fill/src/installer.ts +0 -324
- package/skills/skill-fill/src/skill-install.ts +0 -205
- package/skills/skill-generate-audio/CLAUDE.md +0 -3
- package/skills/skill-generate-audio/SKILL.md +0 -53
- package/skills/skill-generate-audio/package.json +0 -30
- package/skills/skill-generate-audio/src/index.ts +0 -656
- package/skills/skill-generate-audio/tsconfig.json +0 -18
- package/skills/skill-generate-readme/CLAUDE.md +0 -19
- package/skills/skill-generate-readme/package.json +0 -32
- package/skills/skill-generate-readme/src/index.ts +0 -867
- package/skills/skill-generate-readme/tsconfig.json +0 -14
- package/skills/skill-generate-slides/CLAUDE.md +0 -19
- package/skills/skill-generate-slides/package.json +0 -32
- package/skills/skill-generate-slides/src/ai.ts +0 -140
- package/skills/skill-generate-slides/src/cli.ts +0 -161
- package/skills/skill-generate-slides/src/export.ts +0 -65
- package/skills/skill-generate-slides/src/index.ts +0 -1417
- package/skills/skill-generate-slides/src/layout.ts +0 -31
- package/skills/skill-generate-slides/src/parse.ts +0 -282
- package/skills/skill-generate-slides/src/render.ts +0 -711
- package/skills/skill-generate-slides/tsconfig.json +0 -14
- package/skills/skill-get-api-docs/CLAUDE.md +0 -19
- package/skills/skill-get-api-docs/package.json +0 -32
- package/skills/skill-get-api-docs/src/index.ts +0 -1176
- package/skills/skill-get-api-docs/tsconfig.json +0 -14
- package/skills/skill-googledrive/LICENSE +0 -21
- package/skills/skill-googledrive/README.md +0 -27
- package/skills/skill-googledrive/SKILL.md +0 -140
- package/skills/skill-googledrive/install.sh +0 -112
- package/skills/skill-googledrive/package.json +0 -31
- package/skills/skill-googledrive/src/auth.ts +0 -49
- package/skills/skill-googledrive/src/installer.ts +0 -324
- package/skills/skill-googledrive/src/skill-install.ts +0 -174
- package/skills/skill-grant-compliance-scanner/CLAUDE.md +0 -19
- package/skills/skill-grant-compliance-scanner/package.json +0 -32
- package/skills/skill-grant-compliance-scanner/src/index.ts +0 -94
- package/skills/skill-grant-compliance-scanner/tsconfig.json +0 -14
- package/skills/skill-hubsearch/LICENSE +0 -21
- package/skills/skill-hubsearch/README.md +0 -17
- package/skills/skill-hubsearch/install.sh +0 -112
- package/skills/skill-hubsearch/package.json +0 -31
- package/skills/skill-hubsearch/src/auth.ts +0 -49
- package/skills/skill-hubsearch/src/installer.ts +0 -324
- package/skills/skill-hubsearch/src/skill-install.ts +0 -205
- package/skills/skill-implementation-architecture/CLAUDE.md +0 -19
- package/skills/skill-implementation-architecture/package.json +0 -32
- package/skills/skill-implementation-architecture/src/index.ts +0 -460
- package/skills/skill-implementation-architecture/tsconfig.json +0 -14
- package/skills/skill-implementation-audit/CLAUDE.md +0 -19
- package/skills/skill-implementation-audit/package.json +0 -32
- package/skills/skill-implementation-audit/src/index.ts +0 -502
- package/skills/skill-implementation-audit/tsconfig.json +0 -14
- package/skills/skill-implementation-cost/CLAUDE.md +0 -19
- package/skills/skill-implementation-cost/package.json +0 -32
- package/skills/skill-implementation-cost/src/index.ts +0 -873
- package/skills/skill-implementation-cost/tsconfig.json +0 -14
- package/skills/skill-implementation-dispatch/CLAUDE.md +0 -19
- package/skills/skill-implementation-dispatch/package.json +0 -32
- package/skills/skill-implementation-dispatch/src/index.ts +0 -390
- package/skills/skill-implementation-dispatch/tsconfig.json +0 -14
- package/skills/skill-implementation-hook/CLAUDE.md +0 -19
- package/skills/skill-implementation-hook/package.json +0 -32
- package/skills/skill-implementation-hook/src/index.ts +0 -787
- package/skills/skill-implementation-hook/tsconfig.json +0 -14
- package/skills/skill-implementation-index/CLAUDE.md +0 -19
- package/skills/skill-implementation-index/package.json +0 -32
- package/skills/skill-implementation-index/src/index.ts +0 -767
- package/skills/skill-implementation-index/tsconfig.json +0 -14
- package/skills/skill-implementation-init/CLAUDE.md +0 -19
- package/skills/skill-implementation-init/package.json +0 -32
- package/skills/skill-implementation-init/src/index.ts +0 -378
- package/skills/skill-implementation-init/tsconfig.json +0 -14
- package/skills/skill-implementation-memento/CLAUDE.md +0 -19
- package/skills/skill-implementation-memento/package.json +0 -32
- package/skills/skill-implementation-memento/src/index.ts +0 -442
- package/skills/skill-implementation-memento/tsconfig.json +0 -14
- package/skills/skill-linear/LICENSE +0 -21
- package/skills/skill-linear/README.md +0 -28
- package/skills/skill-linear/SKILL.md +0 -94
- package/skills/skill-linear/install.sh +0 -112
- package/skills/skill-linear/package.json +0 -31
- package/skills/skill-linear/src/auth.ts +0 -49
- package/skills/skill-linear/src/installer.ts +0 -324
- package/skills/skill-linear/src/skill-install.ts +0 -174
- package/skills/skill-mail/LICENSE +0 -21
- package/skills/skill-mail/README.md +0 -17
- package/skills/skill-mail/install.sh +0 -112
- package/skills/skill-mail/package.json +0 -31
- package/skills/skill-mail/src/auth.ts +0 -49
- package/skills/skill-mail/src/installer.ts +0 -324
- package/skills/skill-mail/src/skill-install.ts +0 -205
- package/skills/skill-manage-gmail/CLAUDE.md +0 -19
- package/skills/skill-manage-gmail/package.json +0 -32
- package/skills/skill-manage-gmail/src/index.ts +0 -504
- package/skills/skill-manage-gmail/tsconfig.json +0 -14
- package/skills/skill-merch-mockup-factory/CLAUDE.md +0 -19
- package/skills/skill-merch-mockup-factory/package.json +0 -32
- package/skills/skill-merch-mockup-factory/src/index.ts +0 -296
- package/skills/skill-merch-mockup-factory/tsconfig.json +0 -14
- package/skills/skill-message/LICENSE +0 -21
- package/skills/skill-message/README.md +0 -17
- package/skills/skill-message/install.sh +0 -112
- package/skills/skill-message/package.json +0 -31
- package/skills/skill-message/src/auth.ts +0 -49
- package/skills/skill-message/src/installer.ts +0 -324
- package/skills/skill-message/src/skill-install.ts +0 -205
- package/skills/skill-newsletter-campaign-planner/CLAUDE.md +0 -19
- package/skills/skill-newsletter-campaign-planner/package.json +0 -32
- package/skills/skill-newsletter-campaign-planner/src/index.ts +0 -252
- package/skills/skill-newsletter-campaign-planner/tsconfig.json +0 -14
- package/skills/skill-notify/LICENSE +0 -21
- package/skills/skill-notify/README.md +0 -17
- package/skills/skill-notify/install.sh +0 -112
- package/skills/skill-notify/package.json +0 -31
- package/skills/skill-notify/src/auth.ts +0 -49
- package/skills/skill-notify/src/installer.ts +0 -324
- package/skills/skill-notify/src/skill-install.ts +0 -205
- package/skills/skill-notion/LICENSE +0 -21
- package/skills/skill-notion/README.md +0 -27
- package/skills/skill-notion/SKILL.md +0 -115
- package/skills/skill-notion/install.sh +0 -112
- package/skills/skill-notion/package.json +0 -31
- package/skills/skill-notion/src/auth.ts +0 -49
- package/skills/skill-notion/src/installer.ts +0 -324
- package/skills/skill-notion/src/skill-install.ts +0 -174
- package/skills/skill-parse-pdf/CLAUDE.md +0 -19
- package/skills/skill-parse-pdf/package.json +0 -32
- package/skills/skill-parse-pdf/src/index.ts +0 -581
- package/skills/skill-parse-pdf/tsconfig.json +0 -14
- package/skills/skill-playwright/LICENSE +0 -21
- package/skills/skill-playwright/README.md +0 -27
- package/skills/skill-playwright/SKILL.md +0 -116
- package/skills/skill-playwright/install.sh +0 -112
- package/skills/skill-playwright/package.json +0 -31
- package/skills/skill-playwright/src/auth.ts +0 -49
- package/skills/skill-playwright/src/installer.ts +0 -324
- package/skills/skill-playwright/src/skill-install.ts +0 -174
- package/skills/skill-projectbuild/LICENSE +0 -21
- package/skills/skill-projectbuild/README.md +0 -17
- package/skills/skill-projectbuild/install.sh +0 -112
- package/skills/skill-projectbuild/package.json +0 -31
- package/skills/skill-projectbuild/src/auth.ts +0 -49
- package/skills/skill-projectbuild/src/installer.ts +0 -324
- package/skills/skill-projectbuild/src/skill-install.ts +0 -205
- package/skills/skill-read-gmail/CLAUDE.md +0 -19
- package/skills/skill-read-gmail/package.json +0 -32
- package/skills/skill-read-gmail/src/index.ts +0 -343
- package/skills/skill-read-gmail/tsconfig.json +0 -14
- package/skills/skill-remember/LICENSE +0 -21
- package/skills/skill-remember/README.md +0 -17
- package/skills/skill-remember/install.sh +0 -112
- package/skills/skill-remember/package.json +0 -31
- package/skills/skill-remember/src/auth.ts +0 -49
- package/skills/skill-remember/src/installer.ts +0 -324
- package/skills/skill-remember/src/skill-install.ts +0 -205
- package/skills/skill-schedule/README.md +0 -17
- package/skills/skill-schedule/install.sh +0 -112
- package/skills/skill-schedule/src/auth.ts +0 -49
- package/skills/skill-schedule/src/installer.ts +0 -324
- package/skills/skill-schedule/src/skill-install.ts +0 -205
- package/skills/skill-search/LICENSE +0 -21
- package/skills/skill-search/README.md +0 -17
- package/skills/skill-search/install.sh +0 -112
- package/skills/skill-search/package.json +0 -31
- package/skills/skill-search/src/auth.ts +0 -49
- package/skills/skill-search/src/installer.ts +0 -324
- package/skills/skill-search/src/skill-install.ts +0 -205
- package/skills/skill-shadcn/LICENSE +0 -21
- package/skills/skill-shadcn/README.md +0 -27
- package/skills/skill-shadcn/SKILL.md +0 -113
- package/skills/skill-shadcn/install.sh +0 -112
- package/skills/skill-shadcn/package.json +0 -31
- package/skills/skill-shadcn/src/auth.ts +0 -49
- package/skills/skill-shadcn/src/installer.ts +0 -324
- package/skills/skill-shadcn/src/skill-install.ts +0 -174
- package/skills/skill-shadcn-theme/CLAUDE.md +0 -19
- package/skills/skill-shadcn-theme/package.json +0 -32
- package/skills/skill-shadcn-theme/src/index.ts +0 -16
- package/skills/skill-shadcn-theme/tsconfig.json +0 -14
- package/skills/skill-social-template-kit/CLAUDE.md +0 -19
- package/skills/skill-social-template-kit/package.json +0 -32
- package/skills/skill-social-template-kit/src/index.ts +0 -303
- package/skills/skill-social-template-kit/tsconfig.json +0 -14
- package/skills/skill-summarize/LICENSE +0 -21
- package/skills/skill-summarize/README.md +0 -17
- package/skills/skill-summarize/install.sh +0 -112
- package/skills/skill-summarize/package.json +0 -31
- package/skills/skill-summarize/src/auth.ts +0 -49
- package/skills/skill-summarize/src/installer.ts +0 -324
- package/skills/skill-summarize/src/skill-install.ts +0 -205
- package/skills/skill-sync/LICENSE +0 -21
- package/skills/skill-sync/README.md +0 -17
- package/skills/skill-sync/install.sh +0 -112
- package/skills/skill-sync/package.json +0 -31
- package/skills/skill-sync/src/auth.ts +0 -49
- package/skills/skill-sync/src/installer.ts +0 -324
- package/skills/skill-sync/src/skill-install.ts +0 -205
- package/skills/skill-time-blocking-orchestrator/CLAUDE.md +0 -19
- package/skills/skill-time-blocking-orchestrator/package.json +0 -32
- package/skills/skill-time-blocking-orchestrator/src/index.ts +0 -328
- package/skills/skill-time-blocking-orchestrator/tsconfig.json +0 -14
- package/skills/skill-transform/.env.example +0 -2
- package/skills/skill-transform/LICENSE +0 -21
- package/skills/skill-transform/README.md +0 -17
- package/skills/skill-transform/SKILL.md +0 -127
- package/skills/skill-transform/install.sh +0 -112
- package/skills/skill-transform/package.json +0 -37
- package/skills/skill-transform/src/auth.ts +0 -49
- package/skills/skill-transform/src/http-client.ts +0 -128
- package/skills/skill-transform/src/index-http.ts +0 -111
- package/skills/skill-transform/src/index-local.ts +0 -368
- package/skills/skill-transform/src/index.ts +0 -111
- package/skills/skill-transform/src/installer.ts +0 -324
- package/skills/skill-transform/src/skill-install.ts +0 -205
- package/skills/skill-transform/src/transformers/ai-transformer.ts +0 -202
- package/skills/skill-transform/src/transformers/format-detector.ts +0 -147
- package/skills/skill-transform/src/types.ts +0 -95
- package/skills/skill-transform/tsconfig.json +0 -18
- package/skills/skill-translate/LICENSE +0 -21
- package/skills/skill-translate/README.md +0 -17
- package/skills/skill-translate/install.sh +0 -112
- package/skills/skill-translate/package.json +0 -31
- package/skills/skill-translate/src/auth.ts +0 -49
- package/skills/skill-translate/src/installer.ts +0 -324
- package/skills/skill-translate/src/skill-install.ts +0 -205
- package/skills/skill-vendor-comparison-coach/CLAUDE.md +0 -19
- package/skills/skill-vendor-comparison-coach/package.json +0 -32
- package/skills/skill-vendor-comparison-coach/src/index.ts +0 -337
- package/skills/skill-vendor-comparison-coach/tsconfig.json +0 -14
- package/skills/skill-videodownload/.env.example +0 -5
- package/skills/skill-videodownload/CLAUDE.md +0 -64
- package/skills/skill-videodownload/LICENSE +0 -21
- package/skills/skill-videodownload/README.md +0 -166
- package/skills/skill-videodownload/package.json +0 -49
- package/skills/skill-videodownload/src/commands/config.ts +0 -89
- package/skills/skill-videodownload/src/commands/download.ts +0 -61
- package/skills/skill-videodownload/src/commands/info.ts +0 -83
- package/skills/skill-videodownload/src/commands/list.ts +0 -84
- package/skills/skill-videodownload/src/lib/downloader.ts +0 -270
- package/skills/skill-videodownload/src/lib/storage.ts +0 -167
- package/skills/skill-videodownload/src/types/index.ts +0 -64
- package/skills/skill-videodownload/src/utils/logger.ts +0 -49
- package/skills/skill-videodownload/src/utils/paths.ts +0 -94
- package/skills/skill-videodownload/tsconfig.json +0 -17
- package/skills/skill-voiceover/.env.example +0 -5
- package/skills/skill-voiceover/CLAUDE.md +0 -40
- package/skills/skill-voiceover/LICENSE +0 -21
- package/skills/skill-voiceover/README.md +0 -64
- package/skills/skill-voiceover/package.json +0 -43
- package/skills/skill-voiceover/src/commands/config.ts +0 -38
- package/skills/skill-voiceover/src/commands/generate.ts +0 -37
- package/skills/skill-voiceover/src/commands/voices.ts +0 -33
- package/skills/skill-voiceover/src/lib/generator.ts +0 -159
- package/skills/skill-voiceover/src/lib/storage.ts +0 -55
- package/skills/skill-voiceover/src/types/index.ts +0 -55
- package/skills/skill-voiceover/src/utils/logger.ts +0 -30
- package/skills/skill-voiceover/src/utils/paths.ts +0 -22
- package/skills/skill-voiceover/tsconfig.json +0 -17
- package/skills/skill-websearch/LICENSE +0 -21
- package/skills/skill-websearch/README.md +0 -17
- package/skills/skill-websearch/install.sh +0 -112
- package/skills/skill-websearch/package.json +0 -31
- package/skills/skill-websearch/src/auth.ts +0 -49
- package/skills/skill-websearch/src/installer.ts +0 -324
- package/skills/skill-websearch/src/skill-install.ts +0 -205
- /package/skills/{skill-compose-gmail → skill-gmail}/CLAUDE.md +0 -0
- /package/skills/{skill-compose-gmail → skill-gmail}/package.json +0 -0
- /package/skills/{skill-compose-gmail → skill-gmail}/src/index.ts +0 -0
- /package/skills/{skill-architecture-docs → skill-gmail}/tsconfig.json +0 -0
|
@@ -32,7 +32,7 @@ describe("skillinfo", () => {
|
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
test("returns docs for skill with CLAUDE.md only", () => {
|
|
35
|
-
const docs = getSkillDocs("
|
|
35
|
+
const docs = getSkillDocs("deepresearch");
|
|
36
36
|
expect(docs).not.toBeNull();
|
|
37
37
|
expect(docs!.claudeMd).toBeTruthy();
|
|
38
38
|
});
|
|
@@ -60,7 +60,7 @@ describe("skillinfo", () => {
|
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
test("falls back to CLAUDE.md", () => {
|
|
63
|
-
const doc = getSkillBestDoc("
|
|
63
|
+
const doc = getSkillBestDoc("deepresearch");
|
|
64
64
|
expect(doc).toBeTruthy();
|
|
65
65
|
});
|
|
66
66
|
|
|
@@ -85,9 +85,9 @@ describe("skillinfo", () => {
|
|
|
85
85
|
});
|
|
86
86
|
|
|
87
87
|
test("extracts CLI command for deep-research", () => {
|
|
88
|
-
const reqs = getSkillRequirements("
|
|
88
|
+
const reqs = getSkillRequirements("deepresearch");
|
|
89
89
|
expect(reqs).not.toBeNull();
|
|
90
|
-
expect(reqs!.cliCommand).toBe("skill-
|
|
90
|
+
expect(reqs!.cliCommand).toBe("skill-deepresearch");
|
|
91
91
|
});
|
|
92
92
|
|
|
93
93
|
test("returns null for nonexistent skill", () => {
|
|
@@ -104,7 +104,7 @@ describe("skillinfo", () => {
|
|
|
104
104
|
});
|
|
105
105
|
|
|
106
106
|
test("extracts dependencies from package.json", () => {
|
|
107
|
-
const reqs = getSkillRequirements("
|
|
107
|
+
const reqs = getSkillRequirements("deepresearch");
|
|
108
108
|
expect(reqs).not.toBeNull();
|
|
109
109
|
expect(reqs!.dependencies).toHaveProperty("commander");
|
|
110
110
|
});
|
|
@@ -146,12 +146,12 @@ describe("skillinfo", () => {
|
|
|
146
146
|
|
|
147
147
|
describe("generateSkillMd", () => {
|
|
148
148
|
test("generates SKILL.md for a skill without one", () => {
|
|
149
|
-
const md = generateSkillMd("
|
|
149
|
+
const md = generateSkillMd("deepresearch");
|
|
150
150
|
expect(md).not.toBeNull();
|
|
151
151
|
expect(md!).toContain("---");
|
|
152
|
-
expect(md!).toContain("name:
|
|
152
|
+
expect(md!).toContain("name: deepresearch");
|
|
153
153
|
expect(md!).toContain("description:");
|
|
154
|
-
expect(md!).toContain("Deep Research");
|
|
154
|
+
expect(md!).toContain("Deep Research (Agentic)");
|
|
155
155
|
});
|
|
156
156
|
|
|
157
157
|
test("generates SKILL.md for a skill with existing SKILL.md source", () => {
|
|
@@ -162,17 +162,17 @@ describe("skillinfo", () => {
|
|
|
162
162
|
});
|
|
163
163
|
|
|
164
164
|
test("includes category and tags", () => {
|
|
165
|
-
const md = generateSkillMd("
|
|
165
|
+
const md = generateSkillMd("deepresearch");
|
|
166
166
|
expect(md).not.toBeNull();
|
|
167
167
|
expect(md!).toContain("Category: Research & Writing");
|
|
168
168
|
expect(md!).toContain("Tags:");
|
|
169
169
|
});
|
|
170
170
|
|
|
171
171
|
test("includes CLI section for skills with bin entry", () => {
|
|
172
|
-
const md = generateSkillMd("
|
|
172
|
+
const md = generateSkillMd("deepresearch");
|
|
173
173
|
expect(md).not.toBeNull();
|
|
174
174
|
expect(md!).toContain("## CLI");
|
|
175
|
-
expect(md!).toContain("skills run
|
|
175
|
+
expect(md!).toContain("skills run deepresearch");
|
|
176
176
|
});
|
|
177
177
|
|
|
178
178
|
test("returns null for nonexistent skill", () => {
|
|
@@ -181,7 +181,7 @@ describe("skillinfo", () => {
|
|
|
181
181
|
});
|
|
182
182
|
|
|
183
183
|
test("has valid YAML frontmatter", () => {
|
|
184
|
-
const md = generateSkillMd("
|
|
184
|
+
const md = generateSkillMd("deepresearch");
|
|
185
185
|
expect(md).not.toBeNull();
|
|
186
186
|
// Check frontmatter structure
|
|
187
187
|
const parts = md!.split("---");
|
package/src/mcp/index.ts
CHANGED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# skill-architecture-docs
|
|
2
|
-
|
|
3
|
-
Architecture Docs skill.
|
|
4
|
-
|
|
5
|
-
## Tech Stack
|
|
6
|
-
|
|
7
|
-
- Runtime: Bun
|
|
8
|
-
- Language: TypeScript
|
|
9
|
-
- CLI: Commander.js
|
|
10
|
-
|
|
11
|
-
## CLI
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
skill-architecture-docs run
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Data Directory
|
|
18
|
-
|
|
19
|
-
~/.skill/skill-architecture-docs/
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@hasnaxyz/skill-architecture-docs",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"description": "Architecture Docs skill",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"skill-architecture-docs": "./bin/cli.ts"
|
|
8
|
-
},
|
|
9
|
-
"scripts": {
|
|
10
|
-
"dev": "bun run bin/cli.ts",
|
|
11
|
-
"build": "bun build bin/cli.ts --outdir dist --target node",
|
|
12
|
-
"typecheck": "tsc --noEmit"
|
|
13
|
-
},
|
|
14
|
-
"dependencies": {
|
|
15
|
-
"commander": "^13.0.0"
|
|
16
|
-
},
|
|
17
|
-
"devDependencies": {
|
|
18
|
-
"@types/bun": "latest",
|
|
19
|
-
"typescript": "^5.7.0"
|
|
20
|
-
},
|
|
21
|
-
"publishConfig": {
|
|
22
|
-
"access": "restricted",
|
|
23
|
-
"registry": "https://registry.npmjs.org/"
|
|
24
|
-
},
|
|
25
|
-
"files": ["bin", "src", "tsconfig.json"],
|
|
26
|
-
"repository": {
|
|
27
|
-
"type": "git",
|
|
28
|
-
"url": "https://github.com/hasnaxyz/skill-architecture-docs.git"
|
|
29
|
-
},
|
|
30
|
-
"author": "Hasna",
|
|
31
|
-
"license": "MIT"
|
|
32
|
-
}
|
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* Architecture Documentation Generator Skill
|
|
4
|
-
* Analyzes codebases and generates comprehensive architecture documentation
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { parseArgs } from "util";
|
|
8
|
-
import { mkdirSync, writeFileSync, appendFileSync, existsSync, readFileSync, readdirSync, statSync } from "fs";
|
|
9
|
-
import { join, dirname, extname, basename, relative } from "path";
|
|
10
|
-
import { randomUUID } from "crypto";
|
|
11
|
-
|
|
12
|
-
// Types
|
|
13
|
-
type OutputFormat = "markdown" | "json" | "html";
|
|
14
|
-
type AnalysisDepth = "basic" | "detailed" | "comprehensive";
|
|
15
|
-
type ApiProvider = "anthropic" | "openai";
|
|
16
|
-
|
|
17
|
-
interface ArchitectureOptions {
|
|
18
|
-
path: string;
|
|
19
|
-
format: OutputFormat;
|
|
20
|
-
output: string;
|
|
21
|
-
depth: AnalysisDepth;
|
|
22
|
-
includeDiagrams: boolean;
|
|
23
|
-
analyzeDependencies: boolean;
|
|
24
|
-
apiProvider: ApiProvider;
|
|
25
|
-
model?: string;
|
|
26
|
-
verbose: boolean;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface FileInfo {
|
|
30
|
-
path: string;
|
|
31
|
-
type: string;
|
|
32
|
-
lines: number;
|
|
33
|
-
language: string | null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
interface ComponentInfo {
|
|
37
|
-
name: string;
|
|
38
|
-
type: string;
|
|
39
|
-
path: string;
|
|
40
|
-
dependencies: string[];
|
|
41
|
-
exports: string[];
|
|
42
|
-
description?: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
interface ArchitectureAnalysis {
|
|
46
|
-
overview: string;
|
|
47
|
-
components: ComponentInfo[];
|
|
48
|
-
techStack: string[];
|
|
49
|
-
patterns: string[];
|
|
50
|
-
dataFlow: string;
|
|
51
|
-
dependencies: {
|
|
52
|
-
internal: string[];
|
|
53
|
-
external: string[];
|
|
54
|
-
};
|
|
55
|
-
diagram?: string;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// =============================================================================
|
|
59
|
-
// Security: HTML Escaping to prevent XSS
|
|
60
|
-
// =============================================================================
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Escape HTML special characters to prevent XSS attacks
|
|
64
|
-
*/
|
|
65
|
-
function escapeHtml(str: string | undefined | null): string {
|
|
66
|
-
if (str === undefined || str === null) return "";
|
|
67
|
-
return String(str)
|
|
68
|
-
.replace(/&/g, "&")
|
|
69
|
-
.replace(/</g, "<")
|
|
70
|
-
.replace(/>/g, ">")
|
|
71
|
-
.replace(/"/g, """)
|
|
72
|
-
.replace(/'/g, "'");
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Constants
|
|
76
|
-
const SKILL_NAME = "architecture-docs";
|
|
77
|
-
const SESSION_ID = randomUUID().slice(0, 8);
|
|
78
|
-
|
|
79
|
-
const SKILLS_OUTPUT_DIR = process.env.SKILLS_OUTPUT_DIR || join(process.cwd(), ".skills");
|
|
80
|
-
const EXPORTS_DIR = join(SKILLS_OUTPUT_DIR, "exports", SKILL_NAME);
|
|
81
|
-
const LOGS_DIR = join(SKILLS_OUTPUT_DIR, "logs", SKILL_NAME);
|
|
82
|
-
|
|
83
|
-
const SESSION_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, "_").replace(/-/g, "_").slice(0, 19).toLowerCase();
|
|
84
|
-
|
|
85
|
-
// Ensure directories exist
|
|
86
|
-
function ensureDir(dir: string) {
|
|
87
|
-
if (!existsSync(dir)) {
|
|
88
|
-
mkdirSync(dir, { recursive: true });
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Logger
|
|
93
|
-
function log(message: string, level: "info" | "error" | "success" | "warn" = "info") {
|
|
94
|
-
const timestamp = new Date().toISOString();
|
|
95
|
-
const logFile = join(LOGS_DIR, `log_${SESSION_TIMESTAMP}_${SESSION_ID}.log`);
|
|
96
|
-
|
|
97
|
-
ensureDir(LOGS_DIR);
|
|
98
|
-
|
|
99
|
-
const logEntry = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
|
|
100
|
-
appendFileSync(logFile, logEntry);
|
|
101
|
-
|
|
102
|
-
const prefix = level === "error" ? "Error" : level === "success" ? "Success" : level === "warn" ? "Warning" : "Info";
|
|
103
|
-
console.log(`[${prefix}] ${message}`);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Detect language from file extension
|
|
107
|
-
function detectLanguage(filePath: string): string | null {
|
|
108
|
-
const ext = extname(filePath).toLowerCase();
|
|
109
|
-
const languageMap: Record<string, string> = {
|
|
110
|
-
".ts": "typescript",
|
|
111
|
-
".tsx": "typescript",
|
|
112
|
-
".js": "javascript",
|
|
113
|
-
".jsx": "javascript",
|
|
114
|
-
".py": "python",
|
|
115
|
-
".go": "go",
|
|
116
|
-
".rs": "rust",
|
|
117
|
-
".java": "java",
|
|
118
|
-
".rb": "ruby",
|
|
119
|
-
".php": "php",
|
|
120
|
-
};
|
|
121
|
-
return languageMap[ext] || null;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Scan directory and collect file information
|
|
125
|
-
function scanDirectory(path: string): FileInfo[] {
|
|
126
|
-
const files: FileInfo[] = [];
|
|
127
|
-
|
|
128
|
-
if (!existsSync(path)) {
|
|
129
|
-
throw new Error(`Path not found: ${path}`);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const stat = statSync(path);
|
|
133
|
-
|
|
134
|
-
if (stat.isFile()) {
|
|
135
|
-
const language = detectLanguage(path);
|
|
136
|
-
if (language) {
|
|
137
|
-
const content = readFileSync(path, "utf-8");
|
|
138
|
-
files.push({
|
|
139
|
-
path,
|
|
140
|
-
type: "file",
|
|
141
|
-
lines: content.split("\n").length,
|
|
142
|
-
language,
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
} else if (stat.isDirectory()) {
|
|
146
|
-
const entries = readdirSync(path);
|
|
147
|
-
for (const entry of entries) {
|
|
148
|
-
// Skip common ignored directories
|
|
149
|
-
if (["node_modules", ".git", "dist", "build", ".next"].includes(entry)) {
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const fullPath = join(path, entry);
|
|
154
|
-
try {
|
|
155
|
-
const entryStat = statSync(fullPath);
|
|
156
|
-
|
|
157
|
-
if (entryStat.isDirectory()) {
|
|
158
|
-
files.push(...scanDirectory(fullPath));
|
|
159
|
-
} else if (entryStat.isFile()) {
|
|
160
|
-
const language = detectLanguage(fullPath);
|
|
161
|
-
if (language) {
|
|
162
|
-
const content = readFileSync(fullPath, "utf-8");
|
|
163
|
-
files.push({
|
|
164
|
-
path: fullPath,
|
|
165
|
-
type: "file",
|
|
166
|
-
lines: content.split("\n").length,
|
|
167
|
-
language,
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
} catch (error) {
|
|
172
|
-
// Skip files we can't read
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
return files;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Analyze codebase structure
|
|
182
|
-
function analyzeCodebase(files: FileInfo[], options: ArchitectureOptions): string {
|
|
183
|
-
const filesByLanguage = files.reduce((acc, file) => {
|
|
184
|
-
if (file.language) {
|
|
185
|
-
acc[file.language] = (acc[file.language] || 0) + 1;
|
|
186
|
-
}
|
|
187
|
-
return acc;
|
|
188
|
-
}, {} as Record<string, number>);
|
|
189
|
-
|
|
190
|
-
const totalLines = files.reduce((sum, file) => sum + file.lines, 0);
|
|
191
|
-
|
|
192
|
-
let analysis = `# Codebase Analysis\n\n`;
|
|
193
|
-
analysis += `- Total Files: ${files.length}\n`;
|
|
194
|
-
analysis += `- Total Lines: ${totalLines}\n`;
|
|
195
|
-
analysis += `- Languages:\n`;
|
|
196
|
-
|
|
197
|
-
for (const [lang, count] of Object.entries(filesByLanguage)) {
|
|
198
|
-
analysis += ` - ${lang}: ${count} files\n`;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
return analysis;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Extract dependencies from package.json
|
|
205
|
-
function extractDependencies(basePath: string): { internal: string[]; external: string[] } {
|
|
206
|
-
const internal: string[] = [];
|
|
207
|
-
const external: string[] = [];
|
|
208
|
-
|
|
209
|
-
const packageJsonPath = join(basePath, "package.json");
|
|
210
|
-
if (existsSync(packageJsonPath)) {
|
|
211
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
212
|
-
|
|
213
|
-
if (packageJson.dependencies) {
|
|
214
|
-
external.push(...Object.keys(packageJson.dependencies));
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
if (packageJson.devDependencies) {
|
|
218
|
-
external.push(...Object.keys(packageJson.devDependencies));
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
return { internal, external };
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Generate architecture analysis using AI
|
|
226
|
-
async function generateArchitectureAnalysis(
|
|
227
|
-
files: FileInfo[],
|
|
228
|
-
options: ArchitectureOptions,
|
|
229
|
-
codebaseAnalysis: string
|
|
230
|
-
): Promise<ArchitectureAnalysis> {
|
|
231
|
-
const apiKey = options.apiProvider === "anthropic"
|
|
232
|
-
? process.env.ANTHROPIC_API_KEY
|
|
233
|
-
: process.env.OPENAI_API_KEY;
|
|
234
|
-
|
|
235
|
-
if (!apiKey) {
|
|
236
|
-
throw new Error(`${options.apiProvider.toUpperCase()}_API_KEY environment variable is not set`);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
const prompt = buildAnalysisPrompt(files, options, codebaseAnalysis);
|
|
240
|
-
|
|
241
|
-
if (options.verbose) {
|
|
242
|
-
log("Analyzing architecture with AI...");
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
let analysisText: string;
|
|
246
|
-
if (options.apiProvider === "anthropic") {
|
|
247
|
-
analysisText = await callAnthropicAPI(prompt, apiKey, options.model || "claude-3-5-sonnet-20241022");
|
|
248
|
-
} else {
|
|
249
|
-
analysisText = await callOpenAIAPI(prompt, apiKey, options.model || "gpt-4-turbo");
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Parse the AI response into structured format
|
|
253
|
-
const dependencies = extractDependencies(options.path);
|
|
254
|
-
|
|
255
|
-
return {
|
|
256
|
-
overview: analysisText,
|
|
257
|
-
components: [],
|
|
258
|
-
techStack: [],
|
|
259
|
-
patterns: [],
|
|
260
|
-
dataFlow: "See overview for data flow analysis",
|
|
261
|
-
dependencies,
|
|
262
|
-
diagram: options.includeDiagrams ? generateMermaidDiagram(files) : undefined,
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// Build analysis prompt
|
|
267
|
-
function buildAnalysisPrompt(files: FileInfo[], options: ArchitectureOptions, codebaseAnalysis: string): string {
|
|
268
|
-
let prompt = `You are a software architecture expert. Analyze the following codebase and generate comprehensive architecture documentation.\n\n`;
|
|
269
|
-
|
|
270
|
-
prompt += `Codebase Statistics:\n${codebaseAnalysis}\n\n`;
|
|
271
|
-
|
|
272
|
-
prompt += `Analysis Depth: ${options.depth}\n\n`;
|
|
273
|
-
|
|
274
|
-
prompt += `Please provide:\n`;
|
|
275
|
-
prompt += `1. System Overview - High-level description of the architecture\n`;
|
|
276
|
-
prompt += `2. Key Components - Main components and their responsibilities\n`;
|
|
277
|
-
prompt += `3. Technology Stack - Technologies, frameworks, and libraries used\n`;
|
|
278
|
-
prompt += `4. Design Patterns - Architectural and design patterns identified\n`;
|
|
279
|
-
prompt += `5. Data Flow - How data flows through the system\n`;
|
|
280
|
-
|
|
281
|
-
if (options.depth === "comprehensive") {
|
|
282
|
-
prompt += `6. API Endpoints - If applicable\n`;
|
|
283
|
-
prompt += `7. Database Schema - If applicable\n`;
|
|
284
|
-
prompt += `8. Security Considerations - Security measures implemented\n`;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
prompt += `\nGenerate structured markdown documentation that is clear, comprehensive, and well-organized.`;
|
|
288
|
-
|
|
289
|
-
return prompt;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Generate Mermaid diagram
|
|
293
|
-
function generateMermaidDiagram(files: FileInfo[]): string {
|
|
294
|
-
const languages = [...new Set(files.map(f => f.language).filter(Boolean))];
|
|
295
|
-
|
|
296
|
-
let diagram = "```mermaid\ngraph TD\n";
|
|
297
|
-
diagram += " A[Application] --> B[Frontend]\n";
|
|
298
|
-
diagram += " A --> C[Backend]\n";
|
|
299
|
-
diagram += " C --> D[Database]\n";
|
|
300
|
-
|
|
301
|
-
if (languages.includes("typescript") || languages.includes("javascript")) {
|
|
302
|
-
diagram += " B --> E[Components]\n";
|
|
303
|
-
diagram += " B --> F[Services]\n";
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
diagram += "```\n";
|
|
307
|
-
|
|
308
|
-
return diagram;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// Call Anthropic API
|
|
312
|
-
async function callAnthropicAPI(prompt: string, apiKey: string, model: string): Promise<string> {
|
|
313
|
-
const response = await fetch("https://api.anthropic.com/v1/messages", {
|
|
314
|
-
method: "POST",
|
|
315
|
-
headers: {
|
|
316
|
-
"Content-Type": "application/json",
|
|
317
|
-
"x-api-key": apiKey,
|
|
318
|
-
"anthropic-version": "2023-06-01",
|
|
319
|
-
},
|
|
320
|
-
body: JSON.stringify({
|
|
321
|
-
model,
|
|
322
|
-
max_tokens: 4096,
|
|
323
|
-
messages: [{
|
|
324
|
-
role: "user",
|
|
325
|
-
content: prompt,
|
|
326
|
-
}],
|
|
327
|
-
}),
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
if (!response.ok) {
|
|
331
|
-
const error = await response.json();
|
|
332
|
-
throw new Error(`Anthropic API error: ${error.error?.message || response.statusText}`);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
const data = await response.json();
|
|
336
|
-
return data.content[0].text.trim();
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Call OpenAI API
|
|
340
|
-
async function callOpenAIAPI(prompt: string, apiKey: string, model: string): Promise<string> {
|
|
341
|
-
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
342
|
-
method: "POST",
|
|
343
|
-
headers: {
|
|
344
|
-
"Content-Type": "application/json",
|
|
345
|
-
"Authorization": `Bearer ${apiKey}`,
|
|
346
|
-
},
|
|
347
|
-
body: JSON.stringify({
|
|
348
|
-
model,
|
|
349
|
-
messages: [{
|
|
350
|
-
role: "user",
|
|
351
|
-
content: prompt,
|
|
352
|
-
}],
|
|
353
|
-
max_tokens: 4096,
|
|
354
|
-
temperature: 0.3,
|
|
355
|
-
}),
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
if (!response.ok) {
|
|
359
|
-
const error = await response.json();
|
|
360
|
-
throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
const data = await response.json();
|
|
364
|
-
return data.choices[0].message.content.trim();
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
// Generate markdown output
|
|
368
|
-
function generateMarkdownOutput(analysis: ArchitectureAnalysis, options: ArchitectureOptions): string {
|
|
369
|
-
let markdown = `# Architecture Documentation\n\n`;
|
|
370
|
-
markdown += `Generated on ${new Date().toLocaleString()}\n\n`;
|
|
371
|
-
|
|
372
|
-
markdown += `## Overview\n\n${analysis.overview}\n\n`;
|
|
373
|
-
|
|
374
|
-
if (analysis.diagram && options.includeDiagrams) {
|
|
375
|
-
markdown += `## System Diagram\n\n${analysis.diagram}\n\n`;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
if (options.analyzeDependencies) {
|
|
379
|
-
markdown += `## Dependencies\n\n`;
|
|
380
|
-
markdown += `### External Dependencies\n\n`;
|
|
381
|
-
if (analysis.dependencies.external.length > 0) {
|
|
382
|
-
analysis.dependencies.external.forEach(dep => {
|
|
383
|
-
markdown += `- ${dep}\n`;
|
|
384
|
-
});
|
|
385
|
-
} else {
|
|
386
|
-
markdown += `No external dependencies found.\n`;
|
|
387
|
-
}
|
|
388
|
-
markdown += `\n`;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
markdown += `## Data Flow\n\n${analysis.dataFlow}\n\n`;
|
|
392
|
-
|
|
393
|
-
return markdown;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Generate JSON output
|
|
397
|
-
function generateJSONOutput(analysis: ArchitectureAnalysis): string {
|
|
398
|
-
return JSON.stringify(analysis, null, 2);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Generate HTML output
|
|
402
|
-
function generateHTMLOutput(analysis: ArchitectureAnalysis): string {
|
|
403
|
-
const markdown = generateMarkdownOutput(analysis, {
|
|
404
|
-
format: "html",
|
|
405
|
-
includeDiagrams: true,
|
|
406
|
-
analyzeDependencies: true,
|
|
407
|
-
} as ArchitectureOptions);
|
|
408
|
-
|
|
409
|
-
return `
|
|
410
|
-
<!DOCTYPE html>
|
|
411
|
-
<html>
|
|
412
|
-
<head>
|
|
413
|
-
<title>Architecture Documentation</title>
|
|
414
|
-
<style>
|
|
415
|
-
body { font-family: Arial, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }
|
|
416
|
-
h1 { color: #333; }
|
|
417
|
-
h2 { color: #666; border-bottom: 2px solid #ddd; padding-bottom: 10px; }
|
|
418
|
-
pre { background: #f5f5f5; padding: 15px; border-radius: 5px; white-space: pre-wrap; word-wrap: break-word; }
|
|
419
|
-
</style>
|
|
420
|
-
</head>
|
|
421
|
-
<body>
|
|
422
|
-
<pre>${escapeHtml(markdown)}</pre>
|
|
423
|
-
</body>
|
|
424
|
-
</html>
|
|
425
|
-
`;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// Main function
|
|
429
|
-
async function main() {
|
|
430
|
-
const { values, positionals } = parseArgs({
|
|
431
|
-
args: Bun.argv.slice(2),
|
|
432
|
-
options: {
|
|
433
|
-
format: { type: "string", default: "markdown" },
|
|
434
|
-
output: { type: "string", default: "./ARCHITECTURE.md" },
|
|
435
|
-
depth: { type: "string", default: "detailed" },
|
|
436
|
-
"include-diagrams": { type: "boolean", default: true },
|
|
437
|
-
"analyze-dependencies": { type: "boolean", default: true },
|
|
438
|
-
"api-provider": { type: "string", default: "anthropic" },
|
|
439
|
-
model: { type: "string" },
|
|
440
|
-
verbose: { type: "boolean", default: false },
|
|
441
|
-
help: { type: "boolean", short: "h" },
|
|
442
|
-
},
|
|
443
|
-
allowPositionals: true,
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
if (values.help) {
|
|
447
|
-
console.log(`
|
|
448
|
-
Architecture Documentation Generator
|
|
449
|
-
|
|
450
|
-
Usage:
|
|
451
|
-
skills run architecture-docs -- <path> [options]
|
|
452
|
-
|
|
453
|
-
Options:
|
|
454
|
-
--format <format> Output format (markdown, json, html) [default: markdown]
|
|
455
|
-
--output <path> Output file path [default: ./ARCHITECTURE.md]
|
|
456
|
-
--depth <depth> Analysis depth (basic, detailed, comprehensive) [default: detailed]
|
|
457
|
-
--include-diagrams Generate mermaid diagrams [default: true]
|
|
458
|
-
--analyze-dependencies Include dependency analysis [default: true]
|
|
459
|
-
--api-provider <provider> AI provider (anthropic, openai) [default: anthropic]
|
|
460
|
-
--model <model> AI model to use [default: provider default]
|
|
461
|
-
--verbose Show detailed logging [default: false]
|
|
462
|
-
--help, -h Show this help
|
|
463
|
-
|
|
464
|
-
Examples:
|
|
465
|
-
skills run architecture-docs -- .
|
|
466
|
-
skills run architecture-docs -- ./src --format json --output ./docs/arch.json
|
|
467
|
-
skills run architecture-docs -- ./src --depth comprehensive
|
|
468
|
-
`);
|
|
469
|
-
process.exit(0);
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
const path = positionals[0] || ".";
|
|
473
|
-
|
|
474
|
-
try {
|
|
475
|
-
log(`Session ID: ${SESSION_ID}`);
|
|
476
|
-
|
|
477
|
-
const options: ArchitectureOptions = {
|
|
478
|
-
path,
|
|
479
|
-
format: values.format as OutputFormat,
|
|
480
|
-
output: values.output as string,
|
|
481
|
-
depth: values.depth as AnalysisDepth,
|
|
482
|
-
includeDiagrams: values["include-diagrams"] as boolean,
|
|
483
|
-
analyzeDependencies: values["analyze-dependencies"] as boolean,
|
|
484
|
-
apiProvider: values["api-provider"] as ApiProvider,
|
|
485
|
-
model: values.model as string | undefined,
|
|
486
|
-
verbose: values.verbose as boolean,
|
|
487
|
-
};
|
|
488
|
-
|
|
489
|
-
log(`Scanning directory: ${path}`);
|
|
490
|
-
const files = scanDirectory(path);
|
|
491
|
-
log(`Found ${files.length} files to analyze`);
|
|
492
|
-
|
|
493
|
-
if (files.length === 0) {
|
|
494
|
-
log("No supported files found", "warn");
|
|
495
|
-
process.exit(0);
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
const codebaseAnalysis = analyzeCodebase(files, options);
|
|
499
|
-
|
|
500
|
-
log("Generating architecture documentation...");
|
|
501
|
-
const analysis = await generateArchitectureAnalysis(files, options, codebaseAnalysis);
|
|
502
|
-
|
|
503
|
-
let output: string;
|
|
504
|
-
let extension: string;
|
|
505
|
-
|
|
506
|
-
switch (options.format) {
|
|
507
|
-
case "json":
|
|
508
|
-
output = generateJSONOutput(analysis);
|
|
509
|
-
extension = ".json";
|
|
510
|
-
break;
|
|
511
|
-
case "html":
|
|
512
|
-
output = generateHTMLOutput(analysis);
|
|
513
|
-
extension = ".html";
|
|
514
|
-
break;
|
|
515
|
-
default:
|
|
516
|
-
output = generateMarkdownOutput(analysis, options);
|
|
517
|
-
extension = ".md";
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
const outputPath = options.output.endsWith(extension)
|
|
521
|
-
? options.output
|
|
522
|
-
: options.output.replace(/\.[^/.]+$/, "") + extension;
|
|
523
|
-
|
|
524
|
-
ensureDir(dirname(outputPath));
|
|
525
|
-
writeFileSync(outputPath, output, "utf-8");
|
|
526
|
-
|
|
527
|
-
log(`Documentation generated: ${outputPath}`, "success");
|
|
528
|
-
|
|
529
|
-
console.log(`
|
|
530
|
-
Architecture documentation complete!
|
|
531
|
-
Files analyzed: ${files.length}
|
|
532
|
-
Output: ${outputPath}
|
|
533
|
-
Format: ${options.format}
|
|
534
|
-
Log: ${join(LOGS_DIR, `log_${SESSION_TIMESTAMP}_${SESSION_ID}.log`)}
|
|
535
|
-
`);
|
|
536
|
-
|
|
537
|
-
} catch (error) {
|
|
538
|
-
log(`Error: ${error instanceof Error ? error.message : "Unknown error"}`, "error");
|
|
539
|
-
process.exit(1);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
main();
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# skill-auto-format
|
|
2
|
-
|
|
3
|
-
Auto Format skill.
|
|
4
|
-
|
|
5
|
-
## Tech Stack
|
|
6
|
-
|
|
7
|
-
- Runtime: Bun
|
|
8
|
-
- Language: TypeScript
|
|
9
|
-
- CLI: Commander.js
|
|
10
|
-
|
|
11
|
-
## CLI
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
skill-auto-format run
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Data Directory
|
|
18
|
-
|
|
19
|
-
~/.skill/skill-auto-format/
|