@hasna/skills 0.1.62 → 0.1.63
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 +10 -6
- package/bin/index.js +14271 -21602
- package/bin/mcp.js +3527 -11449
- package/bin/migrate.js +53 -3
- package/bin/server.js +5140 -2675
- package/bin/worker.js +4542 -2129
- package/dist/cli/commands/publish.d.ts +2 -0
- package/dist/cli/components/App.d.ts +2 -1
- package/dist/cli/components/CategorySelect.d.ts +2 -1
- package/dist/cli/components/Header.d.ts +2 -1
- package/dist/cli/components/InstallProgress.d.ts +2 -1
- package/dist/cli/components/SearchView.d.ts +2 -1
- package/dist/cli/components/SkillSelect.d.ts +2 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +5094 -13755
- package/dist/lib/agent-sync.d.ts +38 -3
- package/dist/lib/home-adoption.d.ts +91 -0
- package/dist/lib/home-census.d.ts +22 -0
- package/dist/lib/home-migration.d.ts +61 -0
- package/dist/lib/portable-skills-files.d.ts +21 -1
- package/dist/lib/portable-skills-types.d.ts +46 -0
- package/dist/lib/pull.d.ts +66 -0
- package/dist/lib/remote-client.d.ts +6 -0
- package/dist/lib/run-state.d.ts +5 -0
- package/dist/lib/skill-bundles.d.ts +54 -0
- package/dist/lib/skill-contract.d.ts +35 -0
- package/dist/lib/skill-hash.d.ts +77 -0
- package/dist/sdk/cancel.d.ts +30 -0
- package/dist/sdk/dispatcher.d.ts +40 -0
- package/dist/sdk/event-sink.d.ts +2 -0
- package/dist/sdk/events.d.ts +79 -0
- package/dist/sdk/execution/admission.d.ts +44 -0
- package/dist/sdk/execution/dispatchers/e2b.d.ts +17 -0
- package/dist/sdk/execution/dispatchers/ecs.d.ts +151 -0
- package/dist/sdk/execution/image-profile.d.ts +73 -0
- package/dist/sdk/execution/index.d.ts +15 -0
- package/dist/sdk/execution/receipts.d.ts +44 -0
- package/dist/sdk/execution/state-machine.d.ts +38 -0
- package/dist/sdk/execution/storage.d.ts +158 -0
- package/dist/sdk/execution/types.d.ts +130 -0
- package/dist/sdk/executor.d.ts +17 -0
- package/dist/sdk/governance-store.d.ts +156 -0
- package/dist/sdk/governance.d.ts +92 -0
- package/dist/sdk/index.d.ts +26 -0
- package/dist/sdk/index.js +48730 -0
- package/dist/sdk/offline.d.ts +16 -0
- package/dist/sdk/outputs.d.ts +71 -0
- package/dist/sdk/registry.d.ts +28 -0
- package/dist/sdk/runs.d.ts +229 -0
- package/dist/sdk/server.d.ts +35 -0
- package/dist/sdk/spend.d.ts +36 -0
- package/dist/sdk/storage.d.ts +25 -0
- package/dist/server/app.d.ts +42 -0
- package/dist/server/artifact-storage.d.ts +102 -0
- package/dist/server/auth.d.ts +5 -0
- package/dist/server/config.d.ts +40 -0
- package/dist/server/database-url.d.ts +42 -0
- package/dist/server/handlers.d.ts +3 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/migrate.d.ts +13 -0
- package/dist/server/migrations-dir.d.ts +18 -0
- package/dist/server/redaction.d.ts +1 -0
- package/dist/server/registry.d.ts +5 -0
- package/dist/server/rows.d.ts +23 -0
- package/dist/server/skills-api.d.ts +68 -0
- package/dist/server/sqlite-store.d.ts +114 -0
- package/dist/server/store-fixtures.d.ts +25 -0
- package/dist/server/store.d.ts +144 -0
- package/dist/server/types.d.ts +242 -0
- package/dist/server/worker.d.ts +4 -0
- package/dist/storage.js +32 -0
- package/docs/skill-standard.md +211 -39
- package/migrations/postgres/0003_run_outputs_governance.sql +83 -0
- package/migrations/sqlite/0003_run_outputs_governance.sql +58 -0
- package/package.json +11 -8
- package/schemas/skill.schema.json +181 -0
- package/agent-skills/README.md +0 -41
- package/agent-skills/fleet-package-rollout/SKILL.md +0 -169
- package/agent-skills/inbox/SKILL.md +0 -25
- package/agent-skills/inbox/scripts/inbox +0 -109
- package/agent-skills/inbox/tests/test_registered_sender_id.sh +0 -92
- package/agent-skills/inbox-monitor/SKILL.md +0 -41
- package/agent-skills/inbox-monitor/scripts/inbox_monitor.sh +0 -91
- package/agent-skills/inbox-monitor/scripts/test_inbox_monitor.sh +0 -71
- package/agent-skills/merge-pr/SKILL.md +0 -85
- package/agent-skills/merge-pr/references/merge-safety.md +0 -82
- package/agent-skills/merge-pr/scripts/merge_pr_guard.py +0 -694
- package/agent-skills/merge-pr/scripts/test_merge_pr_guard.py +0 -647
- package/agent-skills/merge-pr/tests/fixtures/multi-commit-synthesized.json +0 -28
- package/agent-skills/merge-pr/tests/fixtures/trailer-free-provider.json +0 -28
- package/agent-skills/skill-goal-execute/SKILL.md +0 -115
- package/agent-skills/skill-login/SKILL.md +0 -109
- package/agent-skills/skill-project-create/SKILL.md +0 -91
- package/agent-skills/skill-publish/SKILL.md +0 -254
- package/agent-skills/skill-publish/scripts/capture_registry.js +0 -47
- package/agent-skills/skill-publish/scripts/publish_with_git_head.sh +0 -143
- package/agent-skills/skill-publish/scripts/test_publish_with_git_head.sh +0 -231
- package/skills/_common/auth.ts +0 -45
- package/skills/_common/http-client.ts +0 -143
- package/skills/_common/index.ts +0 -26
- package/skills/_common/install.sh +0 -7
- package/skills/_common/installer.ts +0 -72
- package/skills/_common/skill-install.ts +0 -37
- package/skills/_common/vision.ts +0 -374
- package/skills/ad-creative-pack/SKILL.md +0 -55
- package/skills/ad-creative-pack/package.json +0 -10
- package/skills/analyze-data/CLAUDE.md +0 -16
- package/skills/analyze-data/SKILL.md +0 -112
- package/skills/analyze-data/package.json +0 -23
- package/skills/analyze-data/src/analysis.ts +0 -401
- package/skills/analyze-data/src/cli.ts +0 -66
- package/skills/analyze-data/src/formatters.ts +0 -235
- package/skills/analyze-data/src/index.ts +0 -74
- package/skills/analyze-data/src/logger.ts +0 -36
- package/skills/analyze-data/src/parsers.ts +0 -57
- package/skills/analyze-data/src/stats.ts +0 -151
- package/skills/analyze-data/src/types.ts +0 -85
- package/skills/analyze-data/tsconfig.json +0 -19
- package/skills/api-docs-portal/SKILL.md +0 -84
- package/skills/api-docs-portal/package.json +0 -35
- package/skills/api-docs-portal/src/index.ts +0 -919
- package/skills/api-docs-portal/tsconfig.json +0 -17
- package/skills/api-test-suite/CLAUDE.md +0 -19
- package/skills/api-test-suite/package.json +0 -27
- package/skills/api-test-suite/src/index.ts +0 -381
- package/skills/api-test-suite/tsconfig.json +0 -10
- package/skills/audio-extract/CLAUDE.md +0 -9
- package/skills/audio-extract/SKILL.md +0 -73
- package/skills/audio-extract/package.json +0 -23
- package/skills/audio-extract/src/index.ts +0 -323
- package/skills/audio-extract/tsconfig.json +0 -11
- package/skills/bio-sequence-tool/CLAUDE.md +0 -19
- package/skills/bio-sequence-tool/package.json +0 -27
- package/skills/bio-sequence-tool/src/index.ts +0 -85
- package/skills/bio-sequence-tool/tsconfig.json +0 -10
- package/skills/blog-article/CLAUDE.md +0 -12
- package/skills/blog-article/SKILL.md +0 -55
- package/skills/blog-article/package.json +0 -10
- package/skills/blog-article/tsconfig.json +0 -10
- package/skills/brand-assets/SKILL.md +0 -118
- package/skills/brand-assets/package.json +0 -35
- package/skills/brand-assets/src/cli.ts +0 -155
- package/skills/brand-assets/src/constants.ts +0 -8
- package/skills/brand-assets/src/extract.ts +0 -236
- package/skills/brand-assets/src/index.ts +0 -668
- package/skills/brand-assets/src/types.ts +0 -59
- package/skills/brand-assets/tsconfig.json +0 -17
- package/skills/brand-kit/SKILL.md +0 -54
- package/skills/brand-kit/package.json +0 -10
- package/skills/businessactivity/CLAUDE.md +0 -176
- package/skills/businessactivity/LICENSE +0 -192
- package/skills/businessactivity/README.md +0 -287
- package/skills/businessactivity/package.json +0 -25
- package/skills/businessactivity/scripts/publish.ts +0 -210
- package/skills/businessactivity/src/commands/activity.ts +0 -211
- package/skills/businessactivity/src/commands/function.ts +0 -227
- package/skills/businessactivity/src/commands/owner.ts +0 -193
- package/skills/businessactivity/src/commands/profile.ts +0 -121
- package/skills/businessactivity/src/commands/responsibility.ts +0 -264
- package/skills/businessactivity/src/commands/team.ts +0 -244
- package/skills/businessactivity/src/commands/workflow.ts +0 -359
- package/skills/businessactivity/src/index.ts +0 -3
- package/skills/businessactivity/src/lib/config.ts +0 -167
- package/skills/businessactivity/src/lib/output.ts +0 -76
- package/skills/businessactivity/src/lib/paths.ts +0 -79
- package/skills/businessactivity/src/lib/storage.ts +0 -95
- package/skills/businessactivity/src/types/index.ts +0 -86
- package/skills/businessactivity/tsconfig.json +0 -29
- package/skills/codefix/LICENSE +0 -192
- package/skills/codefix/README.md +0 -232
- package/skills/codefix/SKILL.md +0 -94
- package/skills/codefix/package.json +0 -21
- package/skills/codefix/src/fixers/batch.ts +0 -213
- package/skills/codefix/src/fixers/detector.ts +0 -160
- package/skills/codefix/src/fixers/index.ts +0 -7
- package/skills/codefix/src/fixers/runner.ts +0 -522
- package/skills/codefix/src/index-local.ts +0 -431
- package/skills/codefix/src/index.ts +0 -4
- package/skills/codefix/src/types.ts +0 -211
- package/skills/codefix/tsconfig.json +0 -15
- package/skills/commitpush/SKILL.md +0 -57
- package/skills/commitpush/package.json +0 -33
- package/skills/commitpush/src/index.ts +0 -34
- package/skills/commitpush/tsconfig.json +0 -17
- package/skills/commitpushpr/SKILL.md +0 -55
- package/skills/commitpushpr/package.json +0 -33
- package/skills/commitpushpr/src/index.ts +0 -34
- package/skills/commitpushpr/tsconfig.json +0 -17
- package/skills/compress-video/CLAUDE.md +0 -9
- package/skills/compress-video/SKILL.md +0 -79
- package/skills/compress-video/package.json +0 -23
- package/skills/compress-video/src/index.ts +0 -473
- package/skills/compress-video/tsconfig.json +0 -11
- package/skills/contract-review-report/SKILL.md +0 -52
- package/skills/contract-review-report/package.json +0 -10
- package/skills/customer-feedback-report/SKILL.md +0 -52
- package/skills/customer-feedback-report/package.json +0 -10
- package/skills/dashboard-builder/CLAUDE.md +0 -19
- package/skills/dashboard-builder/package.json +0 -29
- package/skills/dashboard-builder/src/index.ts +0 -150
- package/skills/dashboard-builder/tsconfig.json +0 -10
- package/skills/data-anonymizer/CLAUDE.md +0 -19
- package/skills/data-anonymizer/package.json +0 -27
- package/skills/data-anonymizer/src/index.ts +0 -183
- package/skills/data-anonymizer/tsconfig.json +0 -10
- package/skills/database-explorer/CLAUDE.md +0 -19
- package/skills/database-explorer/package.json +0 -29
- package/skills/database-explorer/src/index.ts +0 -95
- package/skills/database-explorer/tsconfig.json +0 -10
- package/skills/diff-viewer/CLAUDE.md +0 -19
- package/skills/diff-viewer/package.json +0 -30
- package/skills/diff-viewer/src/index.ts +0 -164
- package/skills/diff-viewer/tsconfig.json +0 -10
- package/skills/doc-read/SKILL.md +0 -45
- package/skills/doc-read/package.json +0 -29
- package/skills/doc-read/src/index.ts +0 -324
- package/skills/doc-read/tsconfig.json +0 -8
- package/skills/domainpurchase/LICENSE +0 -192
- package/skills/domainpurchase/SKILL.md +0 -29
- package/skills/domainpurchase/package.json +0 -30
- package/skills/domainpurchase/src/index.ts +0 -3
- package/skills/domainpurchase/tsconfig.json +0 -21
- package/skills/email-sequence/SKILL.md +0 -53
- package/skills/email-sequence/package.json +0 -10
- package/skills/experiment-power-calculator/CLAUDE.md +0 -19
- package/skills/experiment-power-calculator/package.json +0 -29
- package/skills/experiment-power-calculator/src/index.ts +0 -86
- package/skills/experiment-power-calculator/tsconfig.json +0 -10
- package/skills/extract-frames/CLAUDE.md +0 -19
- package/skills/extract-frames/package.json +0 -27
- package/skills/extract-frames/src/index.ts +0 -616
- package/skills/extract-frames/tsconfig.json +0 -10
- package/skills/file-organizer/CLAUDE.md +0 -19
- package/skills/file-organizer/package.json +0 -27
- package/skills/file-organizer/src/index.ts +0 -91
- package/skills/file-organizer/tsconfig.json +0 -10
- package/skills/folder-tree/CLAUDE.md +0 -19
- package/skills/folder-tree/package.json +0 -29
- package/skills/folder-tree/src/index.ts +0 -568
- package/skills/folder-tree/tsconfig.json +0 -10
- package/skills/form-filler/CLAUDE.md +0 -19
- package/skills/form-filler/package.json +0 -29
- package/skills/form-filler/src/index.ts +0 -81
- package/skills/form-filler/tsconfig.json +0 -10
- package/skills/generate-api-client/CLAUDE.md +0 -19
- package/skills/generate-api-client/package.json +0 -29
- package/skills/generate-api-client/src/generator.ts +0 -47
- package/skills/generate-api-client/src/index.ts +0 -92
- package/skills/generate-api-client/src/logger.ts +0 -34
- package/skills/generate-api-client/src/python-generator.ts +0 -245
- package/skills/generate-api-client/src/spec-loader.ts +0 -48
- package/skills/generate-api-client/src/type-mappers.ts +0 -79
- package/skills/generate-api-client/src/types.ts +0 -76
- package/skills/generate-api-client/src/typescript-generator.ts +0 -247
- package/skills/generate-api-client/tsconfig.json +0 -10
- package/skills/generate-chart/CLAUDE.md +0 -19
- package/skills/generate-chart/package.json +0 -27
- package/skills/generate-chart/src/index.ts +0 -510
- package/skills/generate-chart/tsconfig.json +0 -10
- package/skills/generate-dockerfile/CLAUDE.md +0 -19
- package/skills/generate-dockerfile/package.json +0 -27
- package/skills/generate-dockerfile/src/cli.ts +0 -78
- package/skills/generate-dockerfile/src/dockerfile-templates.ts +0 -392
- package/skills/generate-dockerfile/src/index.ts +0 -81
- package/skills/generate-dockerfile/src/logger.ts +0 -30
- package/skills/generate-dockerfile/src/project-detection.ts +0 -68
- package/skills/generate-dockerfile/src/support-files.ts +0 -171
- package/skills/generate-dockerfile/src/types.ts +0 -29
- package/skills/generate-dockerfile/tsconfig.json +0 -10
- package/skills/generate-env/CLAUDE.md +0 -19
- package/skills/generate-env/package.json +0 -29
- package/skills/generate-env/src/cli.ts +0 -85
- package/skills/generate-env/src/detection.ts +0 -161
- package/skills/generate-env/src/env-data.ts +0 -66
- package/skills/generate-env/src/generators.ts +0 -240
- package/skills/generate-env/src/index.ts +0 -120
- package/skills/generate-env/src/runtime.ts +0 -30
- package/skills/generate-env/src/types.ts +0 -32
- package/skills/generate-env/tsconfig.json +0 -10
- package/skills/generate-favicon/CLAUDE.md +0 -19
- package/skills/generate-favicon/package.json +0 -29
- package/skills/generate-favicon/src/index.ts +0 -421
- package/skills/generate-favicon/tsconfig.json +0 -10
- package/skills/generate-qrcode/CLAUDE.md +0 -19
- package/skills/generate-qrcode/package.json +0 -30
- package/skills/generate-qrcode/src/index.ts +0 -584
- package/skills/generate-qrcode/tsconfig.json +0 -10
- package/skills/generate-resume/CLAUDE.md +0 -19
- package/skills/generate-resume/package.json +0 -27
- package/skills/generate-resume/src/cli.ts +0 -157
- package/skills/generate-resume/src/index.ts +0 -178
- package/skills/generate-resume/src/parsers.ts +0 -95
- package/skills/generate-resume/src/renderers.ts +0 -538
- package/skills/generate-resume/src/security.ts +0 -39
- package/skills/generate-resume/src/types.ts +0 -86
- package/skills/generate-resume/tsconfig.json +0 -10
- package/skills/generate-sitemap/CLAUDE.md +0 -19
- package/skills/generate-sitemap/package.json +0 -27
- package/skills/generate-sitemap/src/index.ts +0 -626
- package/skills/generate-sitemap/tsconfig.json +0 -10
- package/skills/gif-maker/CLAUDE.md +0 -19
- package/skills/gif-maker/package.json +0 -30
- package/skills/gif-maker/src/index.ts +0 -600
- package/skills/gif-maker/tsconfig.json +0 -10
- package/skills/hook/LICENSE +0 -192
- package/skills/hook/README.md +0 -74
- package/skills/hook/SKILL.md +0 -85
- package/skills/hook/bunfig.toml +0 -5
- package/skills/hook/package.json +0 -28
- package/skills/hook/src/commands/create.ts +0 -112
- package/skills/hook/src/commands/events.ts +0 -37
- package/skills/hook/src/commands/validate.ts +0 -117
- package/skills/hook/src/index.ts +0 -118
- package/skills/hook/src/templates/root.ts +0 -196
- package/skills/hook/src/templates/source.ts +0 -647
- package/skills/hook/tsconfig.json +0 -18
- package/skills/http-server/CLAUDE.md +0 -19
- package/skills/http-server/package.json +0 -29
- package/skills/http-server/src/index.ts +0 -51
- package/skills/http-server/tsconfig.json +0 -10
- package/skills/implementation/LICENSE +0 -192
- package/skills/implementation/README.md +0 -53
- package/skills/implementation/SKILL.md +0 -57
- package/skills/implementation/bunfig.toml +0 -5
- package/skills/implementation/package.json +0 -28
- package/skills/implementation/src/commands/create.ts +0 -187
- package/skills/implementation/src/index.ts +0 -62
- package/skills/implementation/tsconfig.json +0 -18
- package/skills/implementation-plan/CLAUDE.md +0 -19
- package/skills/implementation-plan/package.json +0 -29
- package/skills/implementation-plan/src/index.ts +0 -520
- package/skills/implementation-plan/tsconfig.json +0 -10
- package/skills/implementation-todo/CLAUDE.md +0 -19
- package/skills/implementation-todo/package.json +0 -29
- package/skills/implementation-todo/src/index.ts +0 -429
- package/skills/implementation-todo/tsconfig.json +0 -10
- package/skills/invoice/.env.example +0 -3
- package/skills/invoice/CLAUDE.md +0 -31
- package/skills/invoice/LICENSE +0 -192
- package/skills/invoice/README.md +0 -70
- package/skills/invoice/package.json +0 -26
- package/skills/invoice/src/commands/companies.ts +0 -202
- package/skills/invoice/src/commands/config.ts +0 -132
- package/skills/invoice/src/commands/generate.ts +0 -177
- package/skills/invoice/src/commands/invoices.ts +0 -218
- package/skills/invoice/src/index.ts +0 -3
- package/skills/invoice/src/lib/api.ts +0 -124
- package/skills/invoice/src/lib/storage.ts +0 -171
- package/skills/invoice/src/types/index.ts +0 -86
- package/skills/invoice/src/utils/logger.ts +0 -33
- package/skills/invoice/src/utils/paths.ts +0 -25
- package/skills/invoice/tsconfig.json +0 -23
- package/skills/invoice-reconciliation/SKILL.md +0 -98
- package/skills/invoice-reconciliation/package.json +0 -36
- package/skills/invoice-reconciliation/src/index.ts +0 -743
- package/skills/invoice-reconciliation/tsconfig.json +0 -17
- package/skills/landing-page-pack/SKILL.md +0 -55
- package/skills/landing-page-pack/package.json +0 -10
- package/skills/latex-table-generator/CLAUDE.md +0 -19
- package/skills/latex-table-generator/package.json +0 -29
- package/skills/latex-table-generator/src/index.ts +0 -113
- package/skills/latex-table-generator/tsconfig.json +0 -10
- package/skills/logo-design/SKILL.md +0 -94
- package/skills/logo-design/package.json +0 -35
- package/skills/logo-design/src/cli.ts +0 -132
- package/skills/logo-design/src/constants.ts +0 -5
- package/skills/logo-design/src/docs.ts +0 -102
- package/skills/logo-design/src/geometry.ts +0 -324
- package/skills/logo-design/src/index.ts +0 -212
- package/skills/logo-design/src/palette.ts +0 -258
- package/skills/logo-design/src/types.ts +0 -50
- package/skills/logo-design/tsconfig.json +0 -17
- package/skills/lorem-generator/CLAUDE.md +0 -19
- package/skills/lorem-generator/package.json +0 -29
- package/skills/lorem-generator/src/index.ts +0 -59
- package/skills/lorem-generator/tsconfig.json +0 -10
- package/skills/managemcp/CLAUDE.md +0 -14
- package/skills/managemcp/README.md +0 -24
- package/skills/managemcp/package.json +0 -16
- package/skills/managemcp/src/index.ts +0 -3
- package/skills/managemcp/tsconfig.json +0 -27
- package/skills/markdown-validator/CLAUDE.md +0 -19
- package/skills/markdown-validator/package.json +0 -29
- package/skills/markdown-validator/src/index.ts +0 -92
- package/skills/markdown-validator/tsconfig.json +0 -10
- package/skills/market-research-report/SKILL.md +0 -51
- package/skills/market-research-report/package.json +0 -10
- package/skills/meeting-pack/SKILL.md +0 -52
- package/skills/meeting-pack/package.json +0 -10
- package/skills/merge-pdfs/CLAUDE.md +0 -19
- package/skills/merge-pdfs/package.json +0 -31
- package/skills/merge-pdfs/src/index.ts +0 -427
- package/skills/merge-pdfs/tsconfig.json +0 -10
- package/skills/migration-plan-pack/SKILL.md +0 -56
- package/skills/migration-plan-pack/package.json +0 -10
- package/skills/monitor/SKILL.md +0 -69
- package/skills/monitor/package.json +0 -33
- package/skills/monitor/src/index.ts +0 -34
- package/skills/monitor/tsconfig.json +0 -17
- package/skills/one-page-website/SKILL.md +0 -128
- package/skills/one-page-website/package.json +0 -34
- package/skills/one-page-website/src/design.ts +0 -336
- package/skills/one-page-website/src/docs.ts +0 -159
- package/skills/one-page-website/src/index.ts +0 -357
- package/skills/one-page-website/src/page.ts +0 -340
- package/skills/one-page-website/src/styles.ts +0 -508
- package/skills/one-page-website/src/types.ts +0 -78
- package/skills/one-page-website/tsconfig.json +0 -17
- package/skills/pdf-generate/CLAUDE.md +0 -19
- package/skills/pdf-generate/SKILL.md +0 -86
- package/skills/pdf-generate/package.json +0 -21
- package/skills/pdf-generate/src/cli.ts +0 -162
- package/skills/pdf-generate/src/html.ts +0 -84
- package/skills/pdf-generate/src/index.ts +0 -62
- package/skills/pdf-generate/src/markdown.ts +0 -27
- package/skills/pdf-generate/src/pdf-writer.ts +0 -78
- package/skills/pdf-generate/src/runtime.ts +0 -34
- package/skills/pdf-generate/src/security.ts +0 -37
- package/skills/pdf-generate/src/templates.ts +0 -311
- package/skills/pdf-generate/src/types.ts +0 -28
- package/skills/pdf-generate/tsconfig.json +0 -16
- package/skills/pdf-to-dataset/SKILL.md +0 -88
- package/skills/pdf-to-dataset/package.json +0 -37
- package/skills/pdf-to-dataset/src/index.ts +0 -790
- package/skills/pdf-to-dataset/tsconfig.json +0 -17
- package/skills/pdf-to-markdown/SKILL.md +0 -81
- package/skills/pdf-to-markdown/package.json +0 -35
- package/skills/pdf-to-markdown/src/index.ts +0 -694
- package/skills/pdf-to-markdown/tsconfig.json +0 -17
- package/skills/performance-audit-report/SKILL.md +0 -49
- package/skills/performance-audit-report/package.json +0 -10
- package/skills/pitch-deck/SKILL.md +0 -51
- package/skills/pitch-deck/package.json +0 -10
- package/skills/product-mockup/SKILL.md +0 -107
- package/skills/product-mockup/package.json +0 -32
- package/skills/product-mockup/src/cli.ts +0 -150
- package/skills/product-mockup/src/design.ts +0 -151
- package/skills/product-mockup/src/docs.ts +0 -134
- package/skills/product-mockup/src/index.ts +0 -182
- package/skills/product-mockup/src/render.ts +0 -407
- package/skills/product-mockup/src/types.ts +0 -66
- package/skills/product-mockup/tsconfig.json +0 -17
- package/skills/proposal-pack/SKILL.md +0 -53
- package/skills/proposal-pack/package.json +0 -10
- package/skills/read-csv/SKILL.md +0 -62
- package/skills/read-csv/package.json +0 -37
- package/skills/read-csv/src/index.ts +0 -356
- package/skills/read-csv/tsconfig.json +0 -17
- package/skills/read-excel/SKILL.md +0 -64
- package/skills/read-excel/package.json +0 -36
- package/skills/read-excel/src/index.ts +0 -266
- package/skills/read-excel/tsconfig.json +0 -17
- package/skills/regex-tester/CLAUDE.md +0 -19
- package/skills/regex-tester/package.json +0 -27
- package/skills/regex-tester/src/index.ts +0 -183
- package/skills/regex-tester/tsconfig.json +0 -10
- package/skills/repo-onboarding-report/SKILL.md +0 -52
- package/skills/repo-onboarding-report/package.json +0 -10
- package/skills/scancommitpr/SKILL.md +0 -178
- package/skills/scancommitpr/package.json +0 -34
- package/skills/scancommitpr/src/index.ts +0 -44
- package/skills/scancommitpr/tsconfig.json +0 -13
- package/skills/scancommitpush/SKILL.md +0 -174
- package/skills/scancommitpush/package.json +0 -32
- package/skills/scancommitpush/src/index.ts +0 -44
- package/skills/scancommitpush/tsconfig.json +0 -13
- package/skills/scientific-figure-check/CLAUDE.md +0 -19
- package/skills/scientific-figure-check/package.json +0 -29
- package/skills/scientific-figure-check/src/index.ts +0 -83
- package/skills/scientific-figure-check/tsconfig.json +0 -10
- package/skills/security-audit/CLAUDE.md +0 -19
- package/skills/security-audit/package.json +0 -27
- package/skills/security-audit/src/index.ts +0 -145
- package/skills/security-audit/tsconfig.json +0 -10
- package/skills/security-audit-report/SKILL.md +0 -52
- package/skills/security-audit-report/package.json +0 -10
- package/skills/seo-content-pack/SKILL.md +0 -54
- package/skills/seo-content-pack/package.json +0 -10
- package/skills/siteanalyze/SKILL.md +0 -25
- package/skills/siteanalyze/package.json +0 -27
- package/skills/siteanalyze/src/index.ts +0 -592
- package/skills/slide-deck-generator/SKILL.md +0 -93
- package/skills/slide-deck-generator/package.json +0 -38
- package/skills/slide-deck-generator/src/cli.ts +0 -133
- package/skills/slide-deck-generator/src/index.ts +0 -148
- package/skills/slide-deck-generator/src/model.ts +0 -307
- package/skills/slide-deck-generator/src/pptx.ts +0 -143
- package/skills/slide-deck-generator/src/render.ts +0 -248
- package/skills/slide-deck-generator/src/types.ts +0 -114
- package/skills/slide-deck-generator/src/utils.ts +0 -53
- package/skills/slide-deck-generator/tsconfig.json +0 -17
- package/skills/social-content-calendar/SKILL.md +0 -54
- package/skills/social-content-calendar/package.json +0 -10
- package/skills/split-pdf/CLAUDE.md +0 -19
- package/skills/split-pdf/package.json +0 -30
- package/skills/split-pdf/src/index.ts +0 -301
- package/skills/split-pdf/tsconfig.json +0 -10
- package/skills/statistical-test-selector/CLAUDE.md +0 -19
- package/skills/statistical-test-selector/package.json +0 -27
- package/skills/statistical-test-selector/src/index.ts +0 -75
- package/skills/statistical-test-selector/tsconfig.json +0 -10
- package/skills/test-suite-generator/SKILL.md +0 -51
- package/skills/test-suite-generator/package.json +0 -10
- package/skills/tmux-session/SKILL.md +0 -109
- package/skills/tmux-session/package.json +0 -33
- package/skills/tmux-session/src/index.ts +0 -34
- package/skills/tmux-session/tsconfig.json +0 -17
- package/skills/todos-plan/SKILL.md +0 -363
- package/skills/todos-plan/agents/openai.yaml +0 -4
- package/skills/todos-plan/package.json +0 -9
- package/skills/todos-plan/src/index.ts +0 -68
- package/skills/tsconfig.base.json +0 -12
- package/skills/validate-config/CLAUDE.md +0 -19
- package/skills/validate-config/package.json +0 -29
- package/skills/validate-config/src/index.ts +0 -56
- package/skills/validate-config/tsconfig.json +0 -10
- package/skills/video-downloader/CLAUDE.md +0 -19
- package/skills/video-downloader/package.json +0 -29
- package/skills/video-downloader/src/index.ts +0 -561
- package/skills/video-downloader/tsconfig.json +0 -10
- package/skills/video-highlight-pack/SKILL.md +0 -54
- package/skills/video-highlight-pack/package.json +0 -10
- package/skills/watermark/CLAUDE.md +0 -19
- package/skills/watermark/package.json +0 -32
- package/skills/watermark/src/index.ts +0 -587
- package/skills/watermark/tsconfig.json +0 -10
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import {
|
|
3
|
-
createProfile,
|
|
4
|
-
deleteProfile,
|
|
5
|
-
setCurrentProfile,
|
|
6
|
-
listProfiles,
|
|
7
|
-
getCurrentProfile,
|
|
8
|
-
getCurrentProfileName,
|
|
9
|
-
} from '../lib/config';
|
|
10
|
-
import { printTable, success, error, info, formatDate } from '../lib/output';
|
|
11
|
-
import { getProfileDir } from '../lib/paths';
|
|
12
|
-
|
|
13
|
-
export function registerProfileCommands(program: Command): void {
|
|
14
|
-
const profileCmd = program
|
|
15
|
-
.command('profile')
|
|
16
|
-
.description('Manage profiles (companies)');
|
|
17
|
-
|
|
18
|
-
// profile:create
|
|
19
|
-
profileCmd
|
|
20
|
-
.command('create')
|
|
21
|
-
.description('Create a new profile')
|
|
22
|
-
.requiredOption('-n, --name <name>', 'Profile name')
|
|
23
|
-
.option('-d, --description <description>', 'Profile description')
|
|
24
|
-
.action(async (options) => {
|
|
25
|
-
try {
|
|
26
|
-
const profile = await createProfile(options.name, options.description);
|
|
27
|
-
success(`Profile "${profile.name}" created`);
|
|
28
|
-
info(`Data stored at: ${getProfileDir(options.name)}`);
|
|
29
|
-
} catch (err) {
|
|
30
|
-
error(err instanceof Error ? err.message : 'Failed to create profile');
|
|
31
|
-
process.exit(1);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
// profile:list
|
|
36
|
-
profileCmd
|
|
37
|
-
.command('list')
|
|
38
|
-
.description('List all profiles')
|
|
39
|
-
.action(async () => {
|
|
40
|
-
try {
|
|
41
|
-
const profiles = await listProfiles();
|
|
42
|
-
const currentName = await getCurrentProfileName();
|
|
43
|
-
|
|
44
|
-
if (profiles.length === 0) {
|
|
45
|
-
info('No profiles configured. Create one with: businessactivity profile create --name <name>');
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const rows = profiles.map(p => [
|
|
50
|
-
p.name === currentName ? '*' : '',
|
|
51
|
-
p.name,
|
|
52
|
-
p.id.slice(0, 12) + '...',
|
|
53
|
-
p.description || '-',
|
|
54
|
-
formatDate(p.createdAt),
|
|
55
|
-
]);
|
|
56
|
-
|
|
57
|
-
printTable(['', 'Name', 'ID', 'Description', 'Created'], rows);
|
|
58
|
-
} catch (err) {
|
|
59
|
-
error(err instanceof Error ? err.message : 'Failed to list profiles');
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// profile:use
|
|
65
|
-
profileCmd
|
|
66
|
-
.command('use <name>')
|
|
67
|
-
.description('Switch to a profile')
|
|
68
|
-
.action(async (name) => {
|
|
69
|
-
try {
|
|
70
|
-
await setCurrentProfile(name);
|
|
71
|
-
success(`Switched to profile "${name}"`);
|
|
72
|
-
} catch (err) {
|
|
73
|
-
error(err instanceof Error ? err.message : 'Failed to switch profile');
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
// profile:delete
|
|
79
|
-
profileCmd
|
|
80
|
-
.command('delete <name>')
|
|
81
|
-
.description('Delete a profile')
|
|
82
|
-
.option('-f, --force', 'Skip confirmation')
|
|
83
|
-
.action(async (name, options) => {
|
|
84
|
-
try {
|
|
85
|
-
if (!options.force) {
|
|
86
|
-
info(`This will delete profile "${name}" and ALL its data.`);
|
|
87
|
-
info('Use --force to confirm deletion.');
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
await deleteProfile(name);
|
|
92
|
-
success(`Profile "${name}" deleted`);
|
|
93
|
-
} catch (err) {
|
|
94
|
-
error(err instanceof Error ? err.message : 'Failed to delete profile');
|
|
95
|
-
process.exit(1);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// profile:current
|
|
100
|
-
profileCmd
|
|
101
|
-
.command('current')
|
|
102
|
-
.description('Show current profile')
|
|
103
|
-
.action(async () => {
|
|
104
|
-
try {
|
|
105
|
-
const profile = await getCurrentProfile();
|
|
106
|
-
if (!profile) {
|
|
107
|
-
info('No profile selected. Create one with: businessactivity profile create --name <name>');
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
console.log(`Current profile: ${profile.name}`);
|
|
112
|
-
console.log(`ID: ${profile.id}`);
|
|
113
|
-
console.log(`Description: ${profile.description || '-'}`);
|
|
114
|
-
console.log(`Data path: ${getProfileDir(profile.name)}`);
|
|
115
|
-
console.log(`Created: ${formatDate(profile.createdAt)}`);
|
|
116
|
-
} catch (err) {
|
|
117
|
-
error(err instanceof Error ? err.message : 'Failed to get current profile');
|
|
118
|
-
process.exit(1);
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
}
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import { requireProfile } from '../lib/config';
|
|
3
|
-
import { getResponsibilitiesPath, getOwnersPath, getFunctionsPath, getActivitiesPath } from '../lib/paths';
|
|
4
|
-
import { readArray, appendToArray, removeFromArray, findById, generateId, timestamp } from '../lib/storage';
|
|
5
|
-
import { printTable, success, error, info } from '../lib/output';
|
|
6
|
-
import type { Responsibility, Owner, Function, Activity, ResponsibilityType } from '../types';
|
|
7
|
-
import { RESPONSIBILITY_TYPES } from '../types';
|
|
8
|
-
|
|
9
|
-
export function registerResponsibilityCommands(program: Command): void {
|
|
10
|
-
const responsibilityCmd = program
|
|
11
|
-
.command('responsibility')
|
|
12
|
-
.description('Manage responsibilities (RACI assignments)');
|
|
13
|
-
|
|
14
|
-
// responsibility:assign
|
|
15
|
-
responsibilityCmd
|
|
16
|
-
.command('assign')
|
|
17
|
-
.description('Assign an owner to a function or activity')
|
|
18
|
-
.requiredOption('-o, --owner <ownerId>', 'Owner ID')
|
|
19
|
-
.requiredOption('-t, --type <type>', 'Responsibility type (owner, accountable, consulted, informed)')
|
|
20
|
-
.option('-f, --function <functionId>', 'Function ID')
|
|
21
|
-
.option('-a, --activity <activityId>', 'Activity ID')
|
|
22
|
-
.option('-m, --metadata <json>', 'Metadata as JSON')
|
|
23
|
-
.action(async (options) => {
|
|
24
|
-
try {
|
|
25
|
-
const { name: profileName } = await requireProfile();
|
|
26
|
-
const responsibilitiesPath = getResponsibilitiesPath(profileName);
|
|
27
|
-
const ownersPath = getOwnersPath(profileName);
|
|
28
|
-
const functionsPath = getFunctionsPath(profileName);
|
|
29
|
-
const activitiesPath = getActivitiesPath(profileName);
|
|
30
|
-
|
|
31
|
-
if (!options.function && !options.activity) {
|
|
32
|
-
error('Must specify either --function or --activity');
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (options.function && options.activity) {
|
|
37
|
-
error('Cannot specify both --function and --activity. Choose one.');
|
|
38
|
-
process.exit(1);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (!RESPONSIBILITY_TYPES.includes(options.type)) {
|
|
42
|
-
error(`Invalid responsibility type. Must be one of: ${RESPONSIBILITY_TYPES.join(', ')}`);
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Verify owner exists
|
|
47
|
-
const owner = await findById<Owner>(ownersPath, options.owner);
|
|
48
|
-
if (!owner) {
|
|
49
|
-
error(`Owner with ID "${options.owner}" not found`);
|
|
50
|
-
process.exit(1);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Verify function or activity exists
|
|
54
|
-
if (options.function) {
|
|
55
|
-
const func = await findById<Function>(functionsPath, options.function);
|
|
56
|
-
if (!func) {
|
|
57
|
-
error(`Function with ID "${options.function}" not found`);
|
|
58
|
-
process.exit(1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (options.activity) {
|
|
63
|
-
const activity = await findById<Activity>(activitiesPath, options.activity);
|
|
64
|
-
if (!activity) {
|
|
65
|
-
error(`Activity with ID "${options.activity}" not found`);
|
|
66
|
-
process.exit(1);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const metadata = options.metadata ? JSON.parse(options.metadata) : undefined;
|
|
71
|
-
|
|
72
|
-
const responsibility: Responsibility = {
|
|
73
|
-
id: generateId('resp'),
|
|
74
|
-
ownerId: options.owner,
|
|
75
|
-
functionId: options.function,
|
|
76
|
-
activityId: options.activity,
|
|
77
|
-
responsibilityType: options.type as ResponsibilityType,
|
|
78
|
-
metadata,
|
|
79
|
-
createdAt: timestamp(),
|
|
80
|
-
updatedAt: timestamp(),
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
await appendToArray(responsibilitiesPath, responsibility);
|
|
84
|
-
|
|
85
|
-
const target = options.function ? 'function' : 'activity';
|
|
86
|
-
success(`Assigned "${owner.name}" as ${options.type} for ${target}`);
|
|
87
|
-
} catch (err) {
|
|
88
|
-
error(err instanceof Error ? err.message : 'Failed to assign responsibility');
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// responsibility:list
|
|
94
|
-
responsibilityCmd
|
|
95
|
-
.command('list')
|
|
96
|
-
.description('List responsibilities')
|
|
97
|
-
.option('-o, --owner <ownerId>', 'Filter by owner ID')
|
|
98
|
-
.option('-f, --function <functionId>', 'Filter by function ID')
|
|
99
|
-
.option('-a, --activity <activityId>', 'Filter by activity ID')
|
|
100
|
-
.option('-t, --type <type>', 'Filter by responsibility type')
|
|
101
|
-
.action(async (options) => {
|
|
102
|
-
try {
|
|
103
|
-
const { name: profileName } = await requireProfile();
|
|
104
|
-
const responsibilitiesPath = getResponsibilitiesPath(profileName);
|
|
105
|
-
const ownersPath = getOwnersPath(profileName);
|
|
106
|
-
const functionsPath = getFunctionsPath(profileName);
|
|
107
|
-
const activitiesPath = getActivitiesPath(profileName);
|
|
108
|
-
|
|
109
|
-
let responsibilities = await readArray<Responsibility>(responsibilitiesPath);
|
|
110
|
-
const owners = await readArray<Owner>(ownersPath);
|
|
111
|
-
const functions = await readArray<Function>(functionsPath);
|
|
112
|
-
const activities = await readArray<Activity>(activitiesPath);
|
|
113
|
-
|
|
114
|
-
if (options.owner) {
|
|
115
|
-
responsibilities = responsibilities.filter(r => r.ownerId === options.owner);
|
|
116
|
-
}
|
|
117
|
-
if (options.function) {
|
|
118
|
-
responsibilities = responsibilities.filter(r => r.functionId === options.function);
|
|
119
|
-
}
|
|
120
|
-
if (options.activity) {
|
|
121
|
-
responsibilities = responsibilities.filter(r => r.activityId === options.activity);
|
|
122
|
-
}
|
|
123
|
-
if (options.type) {
|
|
124
|
-
responsibilities = responsibilities.filter(r => r.responsibilityType === options.type);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (responsibilities.length === 0) {
|
|
128
|
-
info('No responsibilities found');
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const ownerMap = new Map(owners.map(o => [o.id, o.name]));
|
|
133
|
-
const functionMap = new Map(functions.map(f => [f.id, f.name]));
|
|
134
|
-
const activityMap = new Map(activities.map(a => [a.id, a.name]));
|
|
135
|
-
|
|
136
|
-
const rows = responsibilities.map(r => [
|
|
137
|
-
r.id.slice(0, 12) + '...',
|
|
138
|
-
ownerMap.get(r.ownerId) || '-',
|
|
139
|
-
r.responsibilityType.toUpperCase()[0], // R, A, C, or I
|
|
140
|
-
r.functionId ? functionMap.get(r.functionId) || '-' : '-',
|
|
141
|
-
r.activityId ? activityMap.get(r.activityId) || '-' : '-',
|
|
142
|
-
]);
|
|
143
|
-
|
|
144
|
-
printTable(['ID', 'Owner', 'Type', 'Function', 'Activity'], rows);
|
|
145
|
-
|
|
146
|
-
console.log('\nType legend: R=Responsible (owner), A=Accountable, C=Consulted, I=Informed');
|
|
147
|
-
} catch (err) {
|
|
148
|
-
error(err instanceof Error ? err.message : 'Failed to list responsibilities');
|
|
149
|
-
process.exit(1);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// responsibility:revoke
|
|
154
|
-
responsibilityCmd
|
|
155
|
-
.command('revoke <id>')
|
|
156
|
-
.description('Remove a responsibility assignment')
|
|
157
|
-
.option('-f, --force', 'Skip confirmation')
|
|
158
|
-
.action(async (id, options) => {
|
|
159
|
-
try {
|
|
160
|
-
const { name: profileName } = await requireProfile();
|
|
161
|
-
const responsibilitiesPath = getResponsibilitiesPath(profileName);
|
|
162
|
-
const ownersPath = getOwnersPath(profileName);
|
|
163
|
-
|
|
164
|
-
const responsibility = await findById<Responsibility>(responsibilitiesPath, id);
|
|
165
|
-
|
|
166
|
-
if (!responsibility) {
|
|
167
|
-
error(`Responsibility with ID "${id}" not found`);
|
|
168
|
-
process.exit(1);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const owner = await findById<Owner>(ownersPath, responsibility.ownerId);
|
|
172
|
-
|
|
173
|
-
if (!options.force) {
|
|
174
|
-
info(`This will revoke ${responsibility.responsibilityType} responsibility from "${owner?.name || 'Unknown'}".`);
|
|
175
|
-
info('Use --force to confirm.');
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
await removeFromArray<Responsibility>(responsibilitiesPath, id);
|
|
180
|
-
success('Responsibility revoked');
|
|
181
|
-
} catch (err) {
|
|
182
|
-
error(err instanceof Error ? err.message : 'Failed to revoke responsibility');
|
|
183
|
-
process.exit(1);
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
// responsibility:matrix
|
|
188
|
-
responsibilityCmd
|
|
189
|
-
.command('matrix')
|
|
190
|
-
.description('Show RACI matrix for a function')
|
|
191
|
-
.requiredOption('-f, --function <functionId>', 'Function ID')
|
|
192
|
-
.action(async (options) => {
|
|
193
|
-
try {
|
|
194
|
-
const { name: profileName } = await requireProfile();
|
|
195
|
-
const responsibilitiesPath = getResponsibilitiesPath(profileName);
|
|
196
|
-
const ownersPath = getOwnersPath(profileName);
|
|
197
|
-
const functionsPath = getFunctionsPath(profileName);
|
|
198
|
-
const activitiesPath = getActivitiesPath(profileName);
|
|
199
|
-
|
|
200
|
-
// Get function
|
|
201
|
-
const func = await findById<Function>(functionsPath, options.function);
|
|
202
|
-
if (!func) {
|
|
203
|
-
error(`Function with ID "${options.function}" not found`);
|
|
204
|
-
process.exit(1);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Get activities for this function
|
|
208
|
-
const allActivities = await readArray<Activity>(activitiesPath);
|
|
209
|
-
const functionActivities = allActivities.filter(a => a.functionId === options.function);
|
|
210
|
-
|
|
211
|
-
// Get all owners
|
|
212
|
-
const owners = await readArray<Owner>(ownersPath);
|
|
213
|
-
|
|
214
|
-
// Get responsibilities for function and its activities
|
|
215
|
-
const allResponsibilities = await readArray<Responsibility>(responsibilitiesPath);
|
|
216
|
-
const relevantResponsibilities = allResponsibilities.filter(r =>
|
|
217
|
-
r.functionId === options.function ||
|
|
218
|
-
functionActivities.some(a => a.id === r.activityId)
|
|
219
|
-
);
|
|
220
|
-
|
|
221
|
-
console.log(`\nRACI Matrix for: ${func.name}`);
|
|
222
|
-
console.log('='.repeat(60));
|
|
223
|
-
|
|
224
|
-
if (owners.length === 0) {
|
|
225
|
-
info('No owners found. Create owners first.');
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Build matrix
|
|
230
|
-
const ownerHeaders = owners.map(o => o.name.slice(0, 10));
|
|
231
|
-
const headers = ['Activity/Function', ...ownerHeaders];
|
|
232
|
-
|
|
233
|
-
const rows: string[][] = [];
|
|
234
|
-
|
|
235
|
-
// Function row
|
|
236
|
-
const functionRow = [func.name];
|
|
237
|
-
for (const owner of owners) {
|
|
238
|
-
const resp = relevantResponsibilities.find(r =>
|
|
239
|
-
r.ownerId === owner.id && r.functionId === options.function
|
|
240
|
-
);
|
|
241
|
-
functionRow.push(resp ? resp.responsibilityType.toUpperCase()[0] : '-');
|
|
242
|
-
}
|
|
243
|
-
rows.push(functionRow);
|
|
244
|
-
|
|
245
|
-
// Activity rows
|
|
246
|
-
for (const activity of functionActivities) {
|
|
247
|
-
const activityRow = [` ${activity.name}`];
|
|
248
|
-
for (const owner of owners) {
|
|
249
|
-
const resp = relevantResponsibilities.find(r =>
|
|
250
|
-
r.ownerId === owner.id && r.activityId === activity.id
|
|
251
|
-
);
|
|
252
|
-
activityRow.push(resp ? resp.responsibilityType.toUpperCase()[0] : '-');
|
|
253
|
-
}
|
|
254
|
-
rows.push(activityRow);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
printTable(headers, rows);
|
|
258
|
-
console.log('\nLegend: R=Responsible (owner), A=Accountable, C=Consulted, I=Informed');
|
|
259
|
-
} catch (err) {
|
|
260
|
-
error(err instanceof Error ? err.message : 'Failed to generate matrix');
|
|
261
|
-
process.exit(1);
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
}
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import { requireProfile } from '../lib/config';
|
|
3
|
-
import { getTeamsPath, getTeamMembersPath, getOwnersPath } from '../lib/paths';
|
|
4
|
-
import { readArray, appendToArray, updateInArray, removeFromArray, findById, generateId, timestamp, writeJson } from '../lib/storage';
|
|
5
|
-
import { printTable, success, error, info, formatDate } from '../lib/output';
|
|
6
|
-
import type { Team, TeamMember, Owner } from '../types';
|
|
7
|
-
|
|
8
|
-
export function registerTeamCommands(program: Command): void {
|
|
9
|
-
const teamCmd = program
|
|
10
|
-
.command('team')
|
|
11
|
-
.description('Manage teams');
|
|
12
|
-
|
|
13
|
-
// team:create
|
|
14
|
-
teamCmd
|
|
15
|
-
.command('create')
|
|
16
|
-
.description('Create a new team')
|
|
17
|
-
.requiredOption('-n, --name <name>', 'Team name')
|
|
18
|
-
.option('-d, --description <description>', 'Team description')
|
|
19
|
-
.option('-m, --metadata <json>', 'Metadata as JSON')
|
|
20
|
-
.action(async (options) => {
|
|
21
|
-
try {
|
|
22
|
-
const { name: profileName } = await requireProfile();
|
|
23
|
-
const path = getTeamsPath(profileName);
|
|
24
|
-
|
|
25
|
-
const metadata = options.metadata ? JSON.parse(options.metadata) : undefined;
|
|
26
|
-
|
|
27
|
-
const team: Team = {
|
|
28
|
-
id: generateId('team'),
|
|
29
|
-
name: options.name,
|
|
30
|
-
description: options.description,
|
|
31
|
-
metadata,
|
|
32
|
-
createdAt: timestamp(),
|
|
33
|
-
updatedAt: timestamp(),
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
await appendToArray(path, team);
|
|
37
|
-
success(`Team "${team.name}" created with ID: ${team.id}`);
|
|
38
|
-
} catch (err) {
|
|
39
|
-
error(err instanceof Error ? err.message : 'Failed to create team');
|
|
40
|
-
process.exit(1);
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// team:list
|
|
45
|
-
teamCmd
|
|
46
|
-
.command('list')
|
|
47
|
-
.description('List all teams')
|
|
48
|
-
.action(async () => {
|
|
49
|
-
try {
|
|
50
|
-
const { name: profileName } = await requireProfile();
|
|
51
|
-
const path = getTeamsPath(profileName);
|
|
52
|
-
|
|
53
|
-
const teams = await readArray<Team>(path);
|
|
54
|
-
|
|
55
|
-
if (teams.length === 0) {
|
|
56
|
-
info('No teams found');
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const rows = teams.map(t => [
|
|
61
|
-
t.id.slice(0, 12) + '...',
|
|
62
|
-
t.name,
|
|
63
|
-
t.description || '-',
|
|
64
|
-
formatDate(t.createdAt),
|
|
65
|
-
]);
|
|
66
|
-
|
|
67
|
-
printTable(['ID', 'Name', 'Description', 'Created'], rows);
|
|
68
|
-
} catch (err) {
|
|
69
|
-
error(err instanceof Error ? err.message : 'Failed to list teams');
|
|
70
|
-
process.exit(1);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// team:get
|
|
75
|
-
teamCmd
|
|
76
|
-
.command('get <id>')
|
|
77
|
-
.description('Get team details with members')
|
|
78
|
-
.action(async (id) => {
|
|
79
|
-
try {
|
|
80
|
-
const { name: profileName } = await requireProfile();
|
|
81
|
-
const teamsPath = getTeamsPath(profileName);
|
|
82
|
-
const membersPath = getTeamMembersPath(profileName);
|
|
83
|
-
const ownersPath = getOwnersPath(profileName);
|
|
84
|
-
|
|
85
|
-
const team = await findById<Team>(teamsPath, id);
|
|
86
|
-
|
|
87
|
-
if (!team) {
|
|
88
|
-
error(`Team with ID "${id}" not found`);
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Get team members
|
|
93
|
-
const allMembers = await readArray<TeamMember>(membersPath);
|
|
94
|
-
const teamMembers = allMembers.filter(m => m.teamId === id);
|
|
95
|
-
|
|
96
|
-
// Get owner details
|
|
97
|
-
const owners = await readArray<Owner>(ownersPath);
|
|
98
|
-
const ownerMap = new Map(owners.map(o => [o.id, o]));
|
|
99
|
-
|
|
100
|
-
console.log(`\nTeam: ${team.name}`);
|
|
101
|
-
console.log(`ID: ${team.id}`);
|
|
102
|
-
console.log(`Description: ${team.description || '-'}`);
|
|
103
|
-
if (team.metadata) {
|
|
104
|
-
console.log(`Metadata: ${JSON.stringify(team.metadata, null, 2)}`);
|
|
105
|
-
}
|
|
106
|
-
console.log(`Created: ${formatDate(team.createdAt)}`);
|
|
107
|
-
console.log(`Updated: ${formatDate(team.updatedAt)}`);
|
|
108
|
-
|
|
109
|
-
console.log(`\nMembers (${teamMembers.length}):`);
|
|
110
|
-
if (teamMembers.length === 0) {
|
|
111
|
-
console.log(' No members');
|
|
112
|
-
} else {
|
|
113
|
-
teamMembers.forEach(m => {
|
|
114
|
-
const owner = ownerMap.get(m.ownerId);
|
|
115
|
-
console.log(` - ${owner?.name || 'Unknown'} (${owner?.ownerType || '?'})${m.role ? ` - ${m.role}` : ''}`);
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
} catch (err) {
|
|
119
|
-
error(err instanceof Error ? err.message : 'Failed to get team');
|
|
120
|
-
process.exit(1);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
// team:add-member
|
|
125
|
-
teamCmd
|
|
126
|
-
.command('add-member')
|
|
127
|
-
.description('Add an owner to a team')
|
|
128
|
-
.requiredOption('-t, --team <teamId>', 'Team ID')
|
|
129
|
-
.requiredOption('-o, --owner <ownerId>', 'Owner ID')
|
|
130
|
-
.option('-r, --role <role>', 'Role in the team')
|
|
131
|
-
.action(async (options) => {
|
|
132
|
-
try {
|
|
133
|
-
const { name: profileName } = await requireProfile();
|
|
134
|
-
const teamsPath = getTeamsPath(profileName);
|
|
135
|
-
const membersPath = getTeamMembersPath(profileName);
|
|
136
|
-
const ownersPath = getOwnersPath(profileName);
|
|
137
|
-
|
|
138
|
-
// Verify team exists
|
|
139
|
-
const team = await findById<Team>(teamsPath, options.team);
|
|
140
|
-
if (!team) {
|
|
141
|
-
error(`Team with ID "${options.team}" not found`);
|
|
142
|
-
process.exit(1);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Verify owner exists
|
|
146
|
-
const owner = await findById<Owner>(ownersPath, options.owner);
|
|
147
|
-
if (!owner) {
|
|
148
|
-
error(`Owner with ID "${options.owner}" not found`);
|
|
149
|
-
process.exit(1);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Check if already a member
|
|
153
|
-
const allMembers = await readArray<TeamMember>(membersPath);
|
|
154
|
-
const existing = allMembers.find(m => m.teamId === options.team && m.ownerId === options.owner);
|
|
155
|
-
if (existing) {
|
|
156
|
-
error('Owner is already a member of this team');
|
|
157
|
-
process.exit(1);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const member: TeamMember = {
|
|
161
|
-
teamId: options.team,
|
|
162
|
-
ownerId: options.owner,
|
|
163
|
-
role: options.role,
|
|
164
|
-
createdAt: timestamp(),
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
allMembers.push(member);
|
|
168
|
-
await writeJson(membersPath, allMembers);
|
|
169
|
-
|
|
170
|
-
success(`Added "${owner.name}" to team "${team.name}"`);
|
|
171
|
-
} catch (err) {
|
|
172
|
-
error(err instanceof Error ? err.message : 'Failed to add member');
|
|
173
|
-
process.exit(1);
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
// team:remove-member
|
|
178
|
-
teamCmd
|
|
179
|
-
.command('remove-member')
|
|
180
|
-
.description('Remove an owner from a team')
|
|
181
|
-
.requiredOption('-t, --team <teamId>', 'Team ID')
|
|
182
|
-
.requiredOption('-o, --owner <ownerId>', 'Owner ID')
|
|
183
|
-
.action(async (options) => {
|
|
184
|
-
try {
|
|
185
|
-
const { name: profileName } = await requireProfile();
|
|
186
|
-
const membersPath = getTeamMembersPath(profileName);
|
|
187
|
-
|
|
188
|
-
const allMembers = await readArray<TeamMember>(membersPath);
|
|
189
|
-
const index = allMembers.findIndex(m => m.teamId === options.team && m.ownerId === options.owner);
|
|
190
|
-
|
|
191
|
-
if (index === -1) {
|
|
192
|
-
error('Member not found in team');
|
|
193
|
-
process.exit(1);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
allMembers.splice(index, 1);
|
|
197
|
-
await writeJson(membersPath, allMembers);
|
|
198
|
-
|
|
199
|
-
success('Member removed from team');
|
|
200
|
-
} catch (err) {
|
|
201
|
-
error(err instanceof Error ? err.message : 'Failed to remove member');
|
|
202
|
-
process.exit(1);
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
// team:delete
|
|
207
|
-
teamCmd
|
|
208
|
-
.command('delete <id>')
|
|
209
|
-
.description('Delete a team')
|
|
210
|
-
.option('-f, --force', 'Skip confirmation')
|
|
211
|
-
.action(async (id, options) => {
|
|
212
|
-
try {
|
|
213
|
-
const { name: profileName } = await requireProfile();
|
|
214
|
-
const teamsPath = getTeamsPath(profileName);
|
|
215
|
-
const membersPath = getTeamMembersPath(profileName);
|
|
216
|
-
|
|
217
|
-
const team = await findById<Team>(teamsPath, id);
|
|
218
|
-
|
|
219
|
-
if (!team) {
|
|
220
|
-
error(`Team with ID "${id}" not found`);
|
|
221
|
-
process.exit(1);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if (!options.force) {
|
|
225
|
-
info(`This will delete team "${team.name}" and remove all member associations.`);
|
|
226
|
-
info('Use --force to confirm deletion.');
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Remove team members
|
|
231
|
-
const allMembers = await readArray<TeamMember>(membersPath);
|
|
232
|
-
const filtered = allMembers.filter(m => m.teamId !== id);
|
|
233
|
-
await writeJson(membersPath, filtered);
|
|
234
|
-
|
|
235
|
-
// Remove team
|
|
236
|
-
await removeFromArray<Team>(teamsPath, id);
|
|
237
|
-
|
|
238
|
-
success(`Team "${team.name}" deleted`);
|
|
239
|
-
} catch (err) {
|
|
240
|
-
error(err instanceof Error ? err.message : 'Failed to delete team');
|
|
241
|
-
process.exit(1);
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
}
|