@hasna/skills 0.1.61 → 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 -207
- 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,359 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import { requireProfile } from '../lib/config';
|
|
3
|
-
import { getWorkflowsPath, getWorkflowStepsPath, getOwnersPath, getTeamsPath } 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 { Workflow, WorkflowStep, Owner, Team, WorkflowStatus, TriggerType } from '../types';
|
|
7
|
-
import { WORKFLOW_STATUSES, TRIGGER_TYPES } from '../types';
|
|
8
|
-
|
|
9
|
-
export function registerWorkflowCommands(program: Command): void {
|
|
10
|
-
const workflowCmd = program
|
|
11
|
-
.command('workflow')
|
|
12
|
-
.description('Manage workflows');
|
|
13
|
-
|
|
14
|
-
// workflow:create
|
|
15
|
-
workflowCmd
|
|
16
|
-
.command('create')
|
|
17
|
-
.description('Create a new workflow')
|
|
18
|
-
.requiredOption('-n, --name <name>', 'Workflow name')
|
|
19
|
-
.option('-d, --description <description>', 'Workflow description')
|
|
20
|
-
.option('-t, --trigger <type>', 'Trigger type (manual, scheduled, event, condition)', 'manual')
|
|
21
|
-
.option('-s, --status <status>', 'Initial status (draft, active, paused, archived)', 'draft')
|
|
22
|
-
.option('-m, --metadata <json>', 'Metadata as JSON')
|
|
23
|
-
.action(async (options) => {
|
|
24
|
-
try {
|
|
25
|
-
const { name: profileName } = await requireProfile();
|
|
26
|
-
const path = getWorkflowsPath(profileName);
|
|
27
|
-
|
|
28
|
-
if (!TRIGGER_TYPES.includes(options.trigger)) {
|
|
29
|
-
error(`Invalid trigger type. Must be one of: ${TRIGGER_TYPES.join(', ')}`);
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (!WORKFLOW_STATUSES.includes(options.status)) {
|
|
34
|
-
error(`Invalid status. Must be one of: ${WORKFLOW_STATUSES.join(', ')}`);
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const metadata = options.metadata ? JSON.parse(options.metadata) : undefined;
|
|
39
|
-
|
|
40
|
-
const workflow: Workflow = {
|
|
41
|
-
id: generateId('wf'),
|
|
42
|
-
name: options.name,
|
|
43
|
-
description: options.description,
|
|
44
|
-
triggerType: options.trigger as TriggerType,
|
|
45
|
-
status: options.status as WorkflowStatus,
|
|
46
|
-
metadata,
|
|
47
|
-
createdAt: timestamp(),
|
|
48
|
-
updatedAt: timestamp(),
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
await appendToArray(path, workflow);
|
|
52
|
-
success(`Workflow "${workflow.name}" created with ID: ${workflow.id}`);
|
|
53
|
-
} catch (err) {
|
|
54
|
-
error(err instanceof Error ? err.message : 'Failed to create workflow');
|
|
55
|
-
process.exit(1);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
// workflow:list
|
|
60
|
-
workflowCmd
|
|
61
|
-
.command('list')
|
|
62
|
-
.description('List all workflows')
|
|
63
|
-
.option('-s, --status <status>', 'Filter by status')
|
|
64
|
-
.action(async (options) => {
|
|
65
|
-
try {
|
|
66
|
-
const { name: profileName } = await requireProfile();
|
|
67
|
-
const path = getWorkflowsPath(profileName);
|
|
68
|
-
|
|
69
|
-
let workflows = await readArray<Workflow>(path);
|
|
70
|
-
|
|
71
|
-
if (options.status) {
|
|
72
|
-
workflows = workflows.filter(w => w.status === options.status);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (workflows.length === 0) {
|
|
76
|
-
info('No workflows found');
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const rows = workflows.map(w => [
|
|
81
|
-
w.id.slice(0, 12) + '...',
|
|
82
|
-
w.name,
|
|
83
|
-
w.triggerType,
|
|
84
|
-
w.status,
|
|
85
|
-
w.description || '-',
|
|
86
|
-
]);
|
|
87
|
-
|
|
88
|
-
printTable(['ID', 'Name', 'Trigger', 'Status', 'Description'], rows);
|
|
89
|
-
} catch (err) {
|
|
90
|
-
error(err instanceof Error ? err.message : 'Failed to list workflows');
|
|
91
|
-
process.exit(1);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
// workflow:show
|
|
96
|
-
workflowCmd
|
|
97
|
-
.command('show <id>')
|
|
98
|
-
.description('Show workflow details with all steps')
|
|
99
|
-
.action(async (id) => {
|
|
100
|
-
try {
|
|
101
|
-
const { name: profileName } = await requireProfile();
|
|
102
|
-
const workflowsPath = getWorkflowsPath(profileName);
|
|
103
|
-
const stepsPath = getWorkflowStepsPath(profileName);
|
|
104
|
-
const ownersPath = getOwnersPath(profileName);
|
|
105
|
-
const teamsPath = getTeamsPath(profileName);
|
|
106
|
-
|
|
107
|
-
const workflow = await findById<Workflow>(workflowsPath, id);
|
|
108
|
-
|
|
109
|
-
if (!workflow) {
|
|
110
|
-
error(`Workflow with ID "${id}" not found`);
|
|
111
|
-
process.exit(1);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Get steps ordered by sequence
|
|
115
|
-
const allSteps = await readArray<WorkflowStep>(stepsPath);
|
|
116
|
-
const steps = allSteps
|
|
117
|
-
.filter(s => s.workflowId === id)
|
|
118
|
-
.sort((a, b) => a.sequence - b.sequence);
|
|
119
|
-
|
|
120
|
-
// Get owner and team names
|
|
121
|
-
const owners = await readArray<Owner>(ownersPath);
|
|
122
|
-
const teams = await readArray<Team>(teamsPath);
|
|
123
|
-
const ownerMap = new Map(owners.map(o => [o.id, o.name]));
|
|
124
|
-
const teamMap = new Map(teams.map(t => [t.id, t.name]));
|
|
125
|
-
|
|
126
|
-
console.log(`\nWorkflow: ${workflow.name}`);
|
|
127
|
-
console.log(`ID: ${workflow.id}`);
|
|
128
|
-
console.log(`Description: ${workflow.description || '-'}`);
|
|
129
|
-
console.log(`Trigger: ${workflow.triggerType}`);
|
|
130
|
-
console.log(`Status: ${workflow.status}`);
|
|
131
|
-
if (workflow.metadata) {
|
|
132
|
-
console.log(`Metadata: ${JSON.stringify(workflow.metadata, null, 2)}`);
|
|
133
|
-
}
|
|
134
|
-
console.log(`Created: ${formatDate(workflow.createdAt)}`);
|
|
135
|
-
console.log(`Updated: ${formatDate(workflow.updatedAt)}`);
|
|
136
|
-
|
|
137
|
-
console.log(`\nSteps (${steps.length}):`);
|
|
138
|
-
if (steps.length === 0) {
|
|
139
|
-
console.log(' No steps defined');
|
|
140
|
-
} else {
|
|
141
|
-
steps.forEach(step => {
|
|
142
|
-
const assignee = step.ownerId
|
|
143
|
-
? ownerMap.get(step.ownerId) || 'Unknown Owner'
|
|
144
|
-
: step.teamId
|
|
145
|
-
? teamMap.get(step.teamId) || 'Unknown Team'
|
|
146
|
-
: 'Unassigned';
|
|
147
|
-
|
|
148
|
-
console.log(` ${step.sequence}. ${step.name}`);
|
|
149
|
-
console.log(` Action: ${step.action || '-'}`);
|
|
150
|
-
console.log(` Assigned to: ${assignee}`);
|
|
151
|
-
if (step.description) {
|
|
152
|
-
console.log(` Description: ${step.description}`);
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
} catch (err) {
|
|
157
|
-
error(err instanceof Error ? err.message : 'Failed to show workflow');
|
|
158
|
-
process.exit(1);
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
// workflow:add-step
|
|
163
|
-
workflowCmd
|
|
164
|
-
.command('add-step')
|
|
165
|
-
.description('Add a step to a workflow')
|
|
166
|
-
.requiredOption('-w, --workflow <workflowId>', 'Workflow ID')
|
|
167
|
-
.requiredOption('-n, --name <name>', 'Step name')
|
|
168
|
-
.option('-a, --action <action>', 'Action to perform')
|
|
169
|
-
.option('-d, --description <description>', 'Step description')
|
|
170
|
-
.option('-o, --owner <ownerId>', 'Assign to owner')
|
|
171
|
-
.option('-t, --team <teamId>', 'Assign to team')
|
|
172
|
-
.option('-s, --sequence <number>', 'Position in workflow (default: end)')
|
|
173
|
-
.option('-c, --conditions <json>', 'Conditions as JSON')
|
|
174
|
-
.option('-m, --metadata <json>', 'Metadata as JSON')
|
|
175
|
-
.action(async (options) => {
|
|
176
|
-
try {
|
|
177
|
-
const { name: profileName } = await requireProfile();
|
|
178
|
-
const workflowsPath = getWorkflowsPath(profileName);
|
|
179
|
-
const stepsPath = getWorkflowStepsPath(profileName);
|
|
180
|
-
|
|
181
|
-
// Verify workflow exists
|
|
182
|
-
const workflow = await findById<Workflow>(workflowsPath, options.workflow);
|
|
183
|
-
if (!workflow) {
|
|
184
|
-
error(`Workflow with ID "${options.workflow}" not found`);
|
|
185
|
-
process.exit(1);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Determine sequence
|
|
189
|
-
const allSteps = await readArray<WorkflowStep>(stepsPath);
|
|
190
|
-
const workflowSteps = allSteps.filter(s => s.workflowId === options.workflow);
|
|
191
|
-
const sequence = options.sequence ? parseInt(options.sequence) : workflowSteps.length + 1;
|
|
192
|
-
|
|
193
|
-
const conditions = options.conditions ? JSON.parse(options.conditions) : undefined;
|
|
194
|
-
const metadata = options.metadata ? JSON.parse(options.metadata) : undefined;
|
|
195
|
-
|
|
196
|
-
const step: WorkflowStep = {
|
|
197
|
-
id: generateId('step'),
|
|
198
|
-
workflowId: options.workflow,
|
|
199
|
-
sequence,
|
|
200
|
-
name: options.name,
|
|
201
|
-
description: options.description,
|
|
202
|
-
action: options.action,
|
|
203
|
-
ownerId: options.owner,
|
|
204
|
-
teamId: options.team,
|
|
205
|
-
conditions,
|
|
206
|
-
metadata,
|
|
207
|
-
createdAt: timestamp(),
|
|
208
|
-
updatedAt: timestamp(),
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
await appendToArray(stepsPath, step);
|
|
212
|
-
success(`Step "${step.name}" added to workflow at position ${sequence}`);
|
|
213
|
-
} catch (err) {
|
|
214
|
-
error(err instanceof Error ? err.message : 'Failed to add step');
|
|
215
|
-
process.exit(1);
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
// workflow:reorder
|
|
220
|
-
workflowCmd
|
|
221
|
-
.command('reorder')
|
|
222
|
-
.description('Reorder workflow steps')
|
|
223
|
-
.requiredOption('-w, --workflow <workflowId>', 'Workflow ID')
|
|
224
|
-
.requiredOption('-s, --step <stepId>', 'Step ID to move')
|
|
225
|
-
.requiredOption('-p, --position <number>', 'New position')
|
|
226
|
-
.action(async (options) => {
|
|
227
|
-
try {
|
|
228
|
-
const { name: profileName } = await requireProfile();
|
|
229
|
-
const stepsPath = getWorkflowStepsPath(profileName);
|
|
230
|
-
|
|
231
|
-
// Get all steps for this workflow
|
|
232
|
-
const allSteps = await readArray<WorkflowStep>(stepsPath);
|
|
233
|
-
const otherSteps = allSteps.filter(s => s.workflowId !== options.workflow);
|
|
234
|
-
const workflowSteps = allSteps
|
|
235
|
-
.filter(s => s.workflowId === options.workflow)
|
|
236
|
-
.sort((a, b) => a.sequence - b.sequence);
|
|
237
|
-
|
|
238
|
-
const stepIndex = workflowSteps.findIndex(s => s.id === options.step);
|
|
239
|
-
if (stepIndex === -1) {
|
|
240
|
-
error(`Step with ID "${options.step}" not found`);
|
|
241
|
-
process.exit(1);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
const newPosition = parseInt(options.position);
|
|
245
|
-
if (newPosition < 1 || newPosition > workflowSteps.length) {
|
|
246
|
-
error(`Position must be between 1 and ${workflowSteps.length}`);
|
|
247
|
-
process.exit(1);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Remove step from current position and insert at new position
|
|
251
|
-
const [movedStep] = workflowSteps.splice(stepIndex, 1);
|
|
252
|
-
workflowSteps.splice(newPosition - 1, 0, movedStep);
|
|
253
|
-
|
|
254
|
-
// Update all sequences
|
|
255
|
-
workflowSteps.forEach((step, i) => {
|
|
256
|
-
step.sequence = i + 1;
|
|
257
|
-
step.updatedAt = timestamp();
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
// Save all steps
|
|
261
|
-
await writeJson(stepsPath, [...otherSteps, ...workflowSteps]);
|
|
262
|
-
|
|
263
|
-
success(`Step moved to position ${newPosition}`);
|
|
264
|
-
} catch (err) {
|
|
265
|
-
error(err instanceof Error ? err.message : 'Failed to reorder steps');
|
|
266
|
-
process.exit(1);
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
// workflow:update
|
|
271
|
-
workflowCmd
|
|
272
|
-
.command('update <id>')
|
|
273
|
-
.description('Update a workflow')
|
|
274
|
-
.option('-n, --name <name>', 'New name')
|
|
275
|
-
.option('-d, --description <description>', 'New description')
|
|
276
|
-
.option('-t, --trigger <type>', 'New trigger type')
|
|
277
|
-
.option('-s, --status <status>', 'New status')
|
|
278
|
-
.option('-m, --metadata <json>', 'New metadata as JSON')
|
|
279
|
-
.action(async (id, options) => {
|
|
280
|
-
try {
|
|
281
|
-
const { name: profileName } = await requireProfile();
|
|
282
|
-
const path = getWorkflowsPath(profileName);
|
|
283
|
-
|
|
284
|
-
const updates: Partial<Workflow> = {};
|
|
285
|
-
if (options.name) updates.name = options.name;
|
|
286
|
-
if (options.description) updates.description = options.description;
|
|
287
|
-
if (options.trigger) {
|
|
288
|
-
if (!TRIGGER_TYPES.includes(options.trigger)) {
|
|
289
|
-
error(`Invalid trigger type. Must be one of: ${TRIGGER_TYPES.join(', ')}`);
|
|
290
|
-
process.exit(1);
|
|
291
|
-
}
|
|
292
|
-
updates.triggerType = options.trigger;
|
|
293
|
-
}
|
|
294
|
-
if (options.status) {
|
|
295
|
-
if (!WORKFLOW_STATUSES.includes(options.status)) {
|
|
296
|
-
error(`Invalid status. Must be one of: ${WORKFLOW_STATUSES.join(', ')}`);
|
|
297
|
-
process.exit(1);
|
|
298
|
-
}
|
|
299
|
-
updates.status = options.status;
|
|
300
|
-
}
|
|
301
|
-
if (options.metadata) {
|
|
302
|
-
updates.metadata = JSON.parse(options.metadata);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const workflow = await updateInArray<Workflow>(path, id, updates);
|
|
306
|
-
|
|
307
|
-
if (!workflow) {
|
|
308
|
-
error(`Workflow with ID "${id}" not found`);
|
|
309
|
-
process.exit(1);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
success(`Workflow "${workflow.name}" updated`);
|
|
313
|
-
} catch (err) {
|
|
314
|
-
error(err instanceof Error ? err.message : 'Failed to update workflow');
|
|
315
|
-
process.exit(1);
|
|
316
|
-
}
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
// workflow:delete
|
|
320
|
-
workflowCmd
|
|
321
|
-
.command('delete <id>')
|
|
322
|
-
.description('Delete a workflow')
|
|
323
|
-
.option('-f, --force', 'Skip confirmation')
|
|
324
|
-
.action(async (id, options) => {
|
|
325
|
-
try {
|
|
326
|
-
const { name: profileName } = await requireProfile();
|
|
327
|
-
const workflowsPath = getWorkflowsPath(profileName);
|
|
328
|
-
const stepsPath = getWorkflowStepsPath(profileName);
|
|
329
|
-
|
|
330
|
-
const workflow = await findById<Workflow>(workflowsPath, id);
|
|
331
|
-
|
|
332
|
-
if (!workflow) {
|
|
333
|
-
error(`Workflow with ID "${id}" not found`);
|
|
334
|
-
process.exit(1);
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
const allSteps = await readArray<WorkflowStep>(stepsPath);
|
|
338
|
-
const workflowSteps = allSteps.filter(s => s.workflowId === id);
|
|
339
|
-
|
|
340
|
-
if (!options.force) {
|
|
341
|
-
info(`This will delete workflow "${workflow.name}" and its ${workflowSteps.length} step(s).`);
|
|
342
|
-
info('Use --force to confirm deletion.');
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// Remove workflow steps
|
|
347
|
-
const remainingSteps = allSteps.filter(s => s.workflowId !== id);
|
|
348
|
-
await writeJson(stepsPath, remainingSteps);
|
|
349
|
-
|
|
350
|
-
// Remove workflow
|
|
351
|
-
await removeFromArray<Workflow>(workflowsPath, id);
|
|
352
|
-
|
|
353
|
-
success(`Workflow "${workflow.name}" deleted`);
|
|
354
|
-
} catch (err) {
|
|
355
|
-
error(err instanceof Error ? err.message : 'Failed to delete workflow');
|
|
356
|
-
process.exit(1);
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
}
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'fs';
|
|
2
|
-
import { mkdir } from 'fs/promises';
|
|
3
|
-
import { readJson, writeJson, generateId } from './storage';
|
|
4
|
-
import { getConfigPath, getProfileDir, getProfileConfigPath, getServiceDir } from './paths';
|
|
5
|
-
|
|
6
|
-
export interface ProfileConfig {
|
|
7
|
-
id: string;
|
|
8
|
-
name: string;
|
|
9
|
-
description?: string;
|
|
10
|
-
createdAt: string;
|
|
11
|
-
updatedAt: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface GlobalConfig {
|
|
15
|
-
currentProfile?: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Ensure service directory exists
|
|
19
|
-
export async function ensureServiceDir(): Promise<void> {
|
|
20
|
-
const dir = getServiceDir();
|
|
21
|
-
if (!existsSync(dir)) {
|
|
22
|
-
await mkdir(dir, { recursive: true });
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Load global config
|
|
27
|
-
export async function loadConfig(): Promise<GlobalConfig> {
|
|
28
|
-
return readJson<GlobalConfig>(getConfigPath(), {});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Save global config
|
|
32
|
-
export async function saveConfig(config: GlobalConfig): Promise<void> {
|
|
33
|
-
await ensureServiceDir();
|
|
34
|
-
await writeJson(getConfigPath(), config);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Get current profile name
|
|
38
|
-
export async function getCurrentProfileName(): Promise<string | null> {
|
|
39
|
-
const config = await loadConfig();
|
|
40
|
-
return config.currentProfile || null;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Get current profile config
|
|
44
|
-
export async function getCurrentProfile(): Promise<ProfileConfig | null> {
|
|
45
|
-
const profileName = await getCurrentProfileName();
|
|
46
|
-
if (!profileName) return null;
|
|
47
|
-
return getProfile(profileName);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Get profile by name
|
|
51
|
-
export async function getProfile(name: string): Promise<ProfileConfig | null> {
|
|
52
|
-
const path = getProfileConfigPath(name);
|
|
53
|
-
try {
|
|
54
|
-
return await readJson<ProfileConfig | null>(path, null);
|
|
55
|
-
} catch {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Set current profile
|
|
61
|
-
export async function setCurrentProfile(name: string): Promise<void> {
|
|
62
|
-
const profile = await getProfile(name);
|
|
63
|
-
if (!profile) {
|
|
64
|
-
throw new Error(`Profile "${name}" does not exist`);
|
|
65
|
-
}
|
|
66
|
-
const config = await loadConfig();
|
|
67
|
-
config.currentProfile = name;
|
|
68
|
-
await saveConfig(config);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Create a new profile
|
|
72
|
-
export async function createProfile(name: string, description?: string): Promise<ProfileConfig> {
|
|
73
|
-
const existing = await getProfile(name);
|
|
74
|
-
if (existing) {
|
|
75
|
-
throw new Error(`Profile "${name}" already exists`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const profile: ProfileConfig = {
|
|
79
|
-
id: generateId('prof'),
|
|
80
|
-
name,
|
|
81
|
-
description,
|
|
82
|
-
createdAt: new Date().toISOString(),
|
|
83
|
-
updatedAt: new Date().toISOString(),
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// Create profile directory and config
|
|
87
|
-
const profileDir = getProfileDir(name);
|
|
88
|
-
if (!existsSync(profileDir)) {
|
|
89
|
-
await mkdir(profileDir, { recursive: true });
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
await writeJson(getProfileConfigPath(name), profile);
|
|
93
|
-
|
|
94
|
-
// Set as current if no current profile
|
|
95
|
-
const config = await loadConfig();
|
|
96
|
-
if (!config.currentProfile) {
|
|
97
|
-
config.currentProfile = name;
|
|
98
|
-
await saveConfig(config);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return profile;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Delete a profile
|
|
105
|
-
export async function deleteProfile(name: string): Promise<void> {
|
|
106
|
-
const profile = await getProfile(name);
|
|
107
|
-
if (!profile) {
|
|
108
|
-
throw new Error(`Profile "${name}" does not exist`);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Remove profile directory
|
|
112
|
-
const profileDir = getProfileDir(name);
|
|
113
|
-
const { rm } = await import('fs/promises');
|
|
114
|
-
await rm(profileDir, { recursive: true, force: true });
|
|
115
|
-
|
|
116
|
-
// Update current profile if needed
|
|
117
|
-
const config = await loadConfig();
|
|
118
|
-
if (config.currentProfile === name) {
|
|
119
|
-
const profiles = await listProfiles();
|
|
120
|
-
config.currentProfile = profiles.length > 0 ? profiles[0].name : undefined;
|
|
121
|
-
await saveConfig(config);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// List all profiles
|
|
126
|
-
export async function listProfiles(): Promise<ProfileConfig[]> {
|
|
127
|
-
const { readdir } = await import('fs/promises');
|
|
128
|
-
const { getProfilesDir } = await import('./paths');
|
|
129
|
-
|
|
130
|
-
const profilesDir = getProfilesDir();
|
|
131
|
-
if (!existsSync(profilesDir)) {
|
|
132
|
-
return [];
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
try {
|
|
136
|
-
const entries = await readdir(profilesDir, { withFileTypes: true });
|
|
137
|
-
const profiles: ProfileConfig[] = [];
|
|
138
|
-
|
|
139
|
-
for (const entry of entries) {
|
|
140
|
-
if (entry.isDirectory()) {
|
|
141
|
-
const profile = await getProfile(entry.name);
|
|
142
|
-
if (profile) {
|
|
143
|
-
profiles.push(profile);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return profiles;
|
|
149
|
-
} catch {
|
|
150
|
-
return [];
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Require a profile to be selected
|
|
155
|
-
export async function requireProfile(): Promise<{ name: string; config: ProfileConfig }> {
|
|
156
|
-
const profileName = await getCurrentProfileName();
|
|
157
|
-
if (!profileName) {
|
|
158
|
-
throw new Error('No profile selected. Run: businessactivity profile create --name <name>');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const config = await getProfile(profileName);
|
|
162
|
-
if (!config) {
|
|
163
|
-
throw new Error(`Profile "${profileName}" not found. Run: businessactivity profile create --name <name>`);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return { name: profileName, config };
|
|
167
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
export function printTable(headers: string[], rows: string[][]): void {
|
|
2
|
-
const widths = headers.map((h, i) => {
|
|
3
|
-
const maxRowWidth = rows.reduce((max, row) => Math.max(max, (row[i] || '').length), 0);
|
|
4
|
-
return Math.max(h.length, maxRowWidth);
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
const separator = widths.map(w => '-'.repeat(w + 2)).join('+');
|
|
8
|
-
const formatRow = (row: string[]) =>
|
|
9
|
-
row.map((cell, i) => ` ${(cell || '').padEnd(widths[i])} `).join('|');
|
|
10
|
-
|
|
11
|
-
console.log(separator);
|
|
12
|
-
console.log(formatRow(headers));
|
|
13
|
-
console.log(separator);
|
|
14
|
-
rows.forEach(row => console.log(formatRow(row)));
|
|
15
|
-
console.log(separator);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function printTree(
|
|
19
|
-
items: { id: string; name: string; parentId?: string | null; children?: any[] }[],
|
|
20
|
-
indent = 0
|
|
21
|
-
): void {
|
|
22
|
-
const prefix = indent === 0 ? '' : ' '.repeat(indent - 1) + (indent > 0 ? '├─ ' : '');
|
|
23
|
-
|
|
24
|
-
for (const item of items) {
|
|
25
|
-
console.log(`${prefix}${item.name} (${item.id.slice(0, 8)}...)`);
|
|
26
|
-
if (item.children && item.children.length > 0) {
|
|
27
|
-
printTree(item.children, indent + 1);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function buildTree<T extends { id: string; parentId?: string | null }>(
|
|
33
|
-
items: T[]
|
|
34
|
-
): (T & { children: T[] })[] {
|
|
35
|
-
const map = new Map<string, T & { children: T[] }>();
|
|
36
|
-
const roots: (T & { children: T[] })[] = [];
|
|
37
|
-
|
|
38
|
-
// First pass: create all nodes with empty children arrays
|
|
39
|
-
for (const item of items) {
|
|
40
|
-
map.set(item.id, { ...item, children: [] });
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Second pass: build the tree structure
|
|
44
|
-
for (const item of items) {
|
|
45
|
-
const node = map.get(item.id)!;
|
|
46
|
-
if (item.parentId && map.has(item.parentId)) {
|
|
47
|
-
map.get(item.parentId)!.children.push(node);
|
|
48
|
-
} else {
|
|
49
|
-
roots.push(node);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return roots;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function success(message: string): void {
|
|
57
|
-
console.log(`✓ ${message}`);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function error(message: string): void {
|
|
61
|
-
console.error(`✗ ${message}`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export function info(message: string): void {
|
|
65
|
-
console.log(`ℹ ${message}`);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function formatDate(date: Date | string): string {
|
|
69
|
-
const d = typeof date === 'string' ? new Date(date) : date;
|
|
70
|
-
return d.toISOString().replace('T', ' ').slice(0, 19);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function truncate(str: string, length: number): string {
|
|
74
|
-
if (str.length <= length) return str;
|
|
75
|
-
return str.slice(0, length - 3) + '...';
|
|
76
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { join } from 'path';
|
|
2
|
-
import { homedir } from 'os';
|
|
3
|
-
|
|
4
|
-
const SERVICE_NAME = 'service-businessactivity';
|
|
5
|
-
|
|
6
|
-
// Base service directory: ~/.service/service-businessactivity/
|
|
7
|
-
export function getServiceDir(): string {
|
|
8
|
-
return join(homedir(), '.service', SERVICE_NAME);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// Global config: ~/.service/service-businessactivity/config.json
|
|
12
|
-
export function getConfigPath(): string {
|
|
13
|
-
return join(getServiceDir(), 'config.json');
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Profiles directory: ~/.service/service-businessactivity/profiles/
|
|
17
|
-
export function getProfilesDir(): string {
|
|
18
|
-
return join(getServiceDir(), 'profiles');
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Single profile directory: ~/.service/service-businessactivity/profiles/{name}/
|
|
22
|
-
export function getProfileDir(profileName: string): string {
|
|
23
|
-
return join(getProfilesDir(), profileName);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Profile config: ~/.service/service-businessactivity/profiles/{name}/profile.json
|
|
27
|
-
export function getProfileConfigPath(profileName: string): string {
|
|
28
|
-
return join(getProfileDir(profileName), 'profile.json');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Owners file: ~/.service/service-businessactivity/profiles/{name}/owners.json
|
|
32
|
-
export function getOwnersPath(profileName: string): string {
|
|
33
|
-
return join(getProfileDir(profileName), 'owners.json');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Teams file: ~/.service/service-businessactivity/profiles/{name}/teams.json
|
|
37
|
-
export function getTeamsPath(profileName: string): string {
|
|
38
|
-
return join(getProfileDir(profileName), 'teams.json');
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Team members file: ~/.service/service-businessactivity/profiles/{name}/team-members.json
|
|
42
|
-
export function getTeamMembersPath(profileName: string): string {
|
|
43
|
-
return join(getProfileDir(profileName), 'team-members.json');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Functions file: ~/.service/service-businessactivity/profiles/{name}/functions.json
|
|
47
|
-
export function getFunctionsPath(profileName: string): string {
|
|
48
|
-
return join(getProfileDir(profileName), 'functions.json');
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Activities file: ~/.service/service-businessactivity/profiles/{name}/activities.json
|
|
52
|
-
export function getActivitiesPath(profileName: string): string {
|
|
53
|
-
return join(getProfileDir(profileName), 'activities.json');
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Workflows file: ~/.service/service-businessactivity/profiles/{name}/workflows.json
|
|
57
|
-
export function getWorkflowsPath(profileName: string): string {
|
|
58
|
-
return join(getProfileDir(profileName), 'workflows.json');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Workflow steps file: ~/.service/service-businessactivity/profiles/{name}/workflow-steps.json
|
|
62
|
-
export function getWorkflowStepsPath(profileName: string): string {
|
|
63
|
-
return join(getProfileDir(profileName), 'workflow-steps.json');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Responsibilities file: ~/.service/service-businessactivity/profiles/{name}/responsibilities.json
|
|
67
|
-
export function getResponsibilitiesPath(profileName: string): string {
|
|
68
|
-
return join(getProfileDir(profileName), 'responsibilities.json');
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Logs directory: ~/.service/service-businessactivity/logs/
|
|
72
|
-
export function getLogsDir(): string {
|
|
73
|
-
return join(getServiceDir(), 'logs');
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Log file: ~/.service/service-businessactivity/logs/businessactivity.log
|
|
77
|
-
export function getLogFilePath(): string {
|
|
78
|
-
return join(getLogsDir(), 'businessactivity.log');
|
|
79
|
-
}
|