@tappify/cli 1.3.2 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -31
- package/dist/src/app.module.js +6 -2
- package/dist/src/app.module.js.map +1 -1
- package/dist/src/core/api/api.service.d.ts +28 -2
- package/dist/src/core/api/api.service.js +151 -27
- package/dist/src/core/api/api.service.js.map +1 -1
- package/dist/src/core/auth/auth.service.d.ts +2 -0
- package/dist/src/core/auth/auth.service.js +31 -3
- package/dist/src/core/auth/auth.service.js.map +1 -1
- package/dist/src/core/config/config.service.d.ts +11 -2
- package/dist/src/core/config/config.service.js +13 -3
- package/dist/src/core/config/config.service.js.map +1 -1
- package/dist/src/core/core.module.js +33 -2
- package/dist/src/core/core.module.js.map +1 -1
- package/dist/src/core/environment/environment.service.d.ts +24 -0
- package/dist/src/core/environment/environment.service.js +93 -0
- package/dist/src/core/environment/environment.service.js.map +1 -0
- package/dist/src/core/environment/index.d.ts +1 -0
- package/dist/src/core/environment/index.js +18 -0
- package/dist/src/core/environment/index.js.map +1 -0
- package/dist/src/core/image/image-size.d.ts +5 -0
- package/dist/src/core/image/image-size.js +37 -0
- package/dist/src/core/image/image-size.js.map +1 -0
- package/dist/src/core/image/index.d.ts +1 -0
- package/dist/src/{domains/init/runners → core/image}/index.js +1 -1
- package/dist/src/core/image/index.js.map +1 -0
- package/dist/src/core/index.d.ts +10 -0
- package/dist/src/core/index.js +10 -0
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/core/link/project-link.service.d.ts +13 -0
- package/dist/src/{domains/init/runners/init.runner.js → core/link/project-link.service.js} +54 -44
- package/dist/src/core/link/project-link.service.js.map +1 -0
- package/dist/src/core/manifest/index.d.ts +2 -0
- package/dist/src/core/manifest/index.js +19 -0
- package/dist/src/core/manifest/index.js.map +1 -0
- package/dist/src/core/manifest/manifest.service.d.ts +14 -0
- package/dist/src/core/manifest/manifest.service.js +141 -0
- package/dist/src/core/manifest/manifest.service.js.map +1 -0
- package/dist/src/core/manifest/scope-rules.d.ts +8 -0
- package/dist/src/core/manifest/scope-rules.js +95 -0
- package/dist/src/core/manifest/scope-rules.js.map +1 -0
- package/dist/src/core/output/colors.d.ts +6 -0
- package/dist/src/core/output/colors.js +27 -0
- package/dist/src/core/output/colors.js.map +1 -0
- package/dist/src/core/output/index.d.ts +2 -0
- package/dist/src/core/output/index.js +19 -0
- package/dist/src/core/output/index.js.map +1 -0
- package/dist/src/core/output/output.service.d.ts +37 -0
- package/dist/src/core/output/output.service.js +119 -0
- package/dist/src/core/output/output.service.js.map +1 -0
- package/dist/src/core/project/index.d.ts +1 -0
- package/dist/src/core/project/index.js +18 -0
- package/dist/src/core/project/index.js.map +1 -0
- package/dist/src/core/project/package-manager.d.ts +6 -0
- package/dist/src/core/project/package-manager.js +47 -0
- package/dist/src/core/project/package-manager.js.map +1 -0
- package/dist/src/core/prompt/prompt.service.d.ts +17 -0
- package/dist/src/core/prompt/prompt.service.js +299 -0
- package/dist/src/core/prompt/prompt.service.js.map +1 -0
- package/dist/src/core/registry/index.d.ts +1 -0
- package/dist/src/core/registry/index.js +18 -0
- package/dist/src/core/registry/index.js.map +1 -0
- package/dist/src/core/registry/registry.service.d.ts +55 -0
- package/dist/src/core/registry/registry.service.js +119 -0
- package/dist/src/core/registry/registry.service.js.map +1 -0
- package/dist/src/core/shell/shell.service.d.ts +10 -5
- package/dist/src/core/shell/shell.service.js +109 -15
- package/dist/src/core/shell/shell.service.js.map +1 -1
- package/dist/src/core/shutdown/teardown.d.ts +3 -0
- package/dist/src/core/shutdown/teardown.js +22 -0
- package/dist/src/core/shutdown/teardown.js.map +1 -0
- package/dist/src/core/templates/index.d.ts +1 -0
- package/dist/src/core/templates/index.js +18 -0
- package/dist/src/core/templates/index.js.map +1 -0
- package/dist/src/core/templates/template.service.d.ts +10 -0
- package/dist/src/core/templates/template.service.js +91 -0
- package/dist/src/core/templates/template.service.js.map +1 -0
- package/dist/src/core/update/update-notifier.d.ts +6 -0
- package/dist/src/core/update/update-notifier.js +90 -28
- package/dist/src/core/update/update-notifier.js.map +1 -1
- package/dist/src/core/version.d.ts +5 -0
- package/dist/src/core/version.js +21 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/domains/auth/runners/login.runner.js +5 -1
- package/dist/src/domains/auth/runners/login.runner.js.map +1 -1
- package/dist/src/domains/auth/runners/logout.runner.js +1 -1
- package/dist/src/domains/auth/runners/logout.runner.js.map +1 -1
- package/dist/src/domains/deployments/runners/configure.runner.d.ts +6 -1
- package/dist/src/domains/deployments/runners/configure.runner.js +231 -200
- package/dist/src/domains/deployments/runners/configure.runner.js.map +1 -1
- package/dist/src/domains/environment/environment.module.d.ts +2 -0
- package/dist/src/domains/environment/environment.module.js +25 -0
- package/dist/src/domains/environment/environment.module.js.map +1 -0
- package/dist/src/domains/environment/index.d.ts +2 -0
- package/dist/src/domains/{deploy → environment}/index.js +1 -1
- package/dist/src/domains/environment/index.js.map +1 -0
- package/dist/src/domains/environment/runners/environment-current.runner.d.ts +7 -0
- package/dist/src/domains/environment/runners/environment-current.runner.js +35 -0
- package/dist/src/domains/environment/runners/environment-current.runner.js.map +1 -0
- package/dist/src/domains/environment/runners/environment-switcher.service.d.ts +11 -0
- package/dist/src/domains/environment/runners/environment-switcher.service.js +74 -0
- package/dist/src/domains/environment/runners/environment-switcher.service.js.map +1 -0
- package/dist/src/domains/environment/runners/environment-use.runner.d.ts +11 -0
- package/dist/src/domains/environment/runners/environment-use.runner.js +46 -0
- package/dist/src/domains/environment/runners/environment-use.runner.js.map +1 -0
- package/dist/src/domains/environment/runners/environment.command.d.ts +12 -0
- package/dist/src/domains/environment/runners/environment.command.js +53 -0
- package/dist/src/domains/environment/runners/environment.command.js.map +1 -0
- package/dist/src/domains/environment/runners/index.d.ts +4 -0
- package/dist/src/domains/environment/runners/index.js +21 -0
- package/dist/src/domains/environment/runners/index.js.map +1 -0
- package/dist/src/domains/extension/containers.d.ts +13 -0
- package/dist/src/domains/extension/containers.js +239 -0
- package/dist/src/domains/extension/containers.js.map +1 -0
- package/dist/src/domains/extension/extension.module.d.ts +2 -0
- package/dist/src/domains/extension/extension.module.js +66 -0
- package/dist/src/domains/extension/extension.module.js.map +1 -0
- package/dist/src/domains/extension/index.d.ts +1 -0
- package/dist/src/domains/extension/index.js +18 -0
- package/dist/src/domains/extension/index.js.map +1 -0
- package/dist/src/domains/extension/kinds.assistant.d.ts +2 -0
- package/dist/src/domains/extension/kinds.assistant.js +296 -0
- package/dist/src/domains/extension/kinds.assistant.js.map +1 -0
- package/dist/src/domains/extension/kinds.d.ts +8 -0
- package/dist/src/domains/extension/kinds.js +42 -0
- package/dist/src/domains/extension/kinds.js.map +1 -0
- package/dist/src/domains/extension/kinds.server.d.ts +3 -0
- package/dist/src/domains/extension/kinds.server.js +221 -0
- package/dist/src/domains/extension/kinds.server.js.map +1 -0
- package/dist/src/domains/extension/kinds.types.d.ts +65 -0
- package/dist/src/domains/extension/kinds.types.js +98 -0
- package/dist/src/domains/extension/kinds.types.js.map +1 -0
- package/dist/src/domains/extension/kinds.ui.d.ts +4 -0
- package/dist/src/domains/extension/kinds.ui.js +309 -0
- package/dist/src/domains/extension/kinds.ui.js.map +1 -0
- package/dist/src/domains/extension/labels.d.ts +27 -0
- package/dist/src/domains/extension/labels.js +143 -0
- package/dist/src/domains/extension/labels.js.map +1 -0
- package/dist/src/domains/extension/runners/add.runner.d.ts +69 -0
- package/dist/src/domains/extension/runners/add.runner.js +453 -0
- package/dist/src/domains/extension/runners/add.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/dev.runner.d.ts +33 -0
- package/dist/src/domains/extension/runners/dev.runner.js +257 -0
- package/dist/src/domains/extension/runners/dev.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/doctor.runner.d.ts +18 -0
- package/dist/src/domains/extension/runners/doctor.runner.js +107 -0
- package/dist/src/domains/extension/runners/doctor.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/events-add.runner.d.ts +12 -0
- package/dist/src/domains/extension/runners/events-add.runner.js +97 -0
- package/dist/src/domains/extension/runners/events-add.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/events-remove.runner.d.ts +10 -0
- package/dist/src/domains/extension/runners/events-remove.runner.js +75 -0
- package/dist/src/domains/extension/runners/events-remove.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/events.runner.d.ts +6 -0
- package/dist/src/domains/extension/runners/events.runner.js +40 -0
- package/dist/src/domains/extension/runners/events.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/extension.command.d.ts +10 -0
- package/dist/src/domains/extension/runners/extension.command.js +71 -0
- package/dist/src/domains/extension/runners/extension.command.js.map +1 -0
- package/dist/src/domains/extension/runners/extension.runner.d.ts +17 -0
- package/dist/src/domains/extension/runners/extension.runner.js +53 -0
- package/dist/src/domains/extension/runners/extension.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/index.d.ts +20 -0
- package/dist/src/domains/extension/runners/index.js +37 -0
- package/dist/src/domains/extension/runners/index.js.map +1 -0
- package/dist/src/domains/extension/runners/init.runner.d.ts +31 -0
- package/dist/src/domains/extension/runners/init.runner.js +276 -0
- package/dist/src/domains/extension/runners/init.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/list.runner.d.ts +10 -0
- package/dist/src/domains/extension/runners/list.runner.js +79 -0
- package/dist/src/domains/extension/runners/list.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/publish.runner.d.ts +38 -0
- package/dist/src/domains/extension/runners/publish.runner.js +178 -0
- package/dist/src/domains/extension/runners/publish.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/remove.runner.d.ts +20 -0
- package/dist/src/domains/extension/runners/remove.runner.js +105 -0
- package/dist/src/domains/extension/runners/remove.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/retire.runner.d.ts +18 -0
- package/dist/src/domains/extension/runners/retire.runner.js +80 -0
- package/dist/src/domains/extension/runners/retire.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/scopes-add.runner.d.ts +16 -0
- package/dist/src/domains/extension/runners/scopes-add.runner.js +122 -0
- package/dist/src/domains/extension/runners/scopes-add.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/scopes-remove.runner.d.ts +12 -0
- package/dist/src/domains/extension/runners/scopes-remove.runner.js +73 -0
- package/dist/src/domains/extension/runners/scopes-remove.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/scopes.runner.d.ts +6 -0
- package/dist/src/domains/extension/runners/scopes.runner.js +40 -0
- package/dist/src/domains/extension/runners/scopes.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/set.runner.d.ts +17 -0
- package/dist/src/domains/extension/runners/set.runner.js +157 -0
- package/dist/src/domains/extension/runners/set.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/status.runner.d.ts +12 -0
- package/dist/src/domains/extension/runners/status.runner.js +88 -0
- package/dist/src/domains/extension/runners/status.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/types.runner.d.ts +10 -0
- package/dist/src/domains/extension/runners/types.runner.js +43 -0
- package/dist/src/domains/extension/runners/types.runner.js.map +1 -0
- package/dist/src/domains/extension/runners/whoami.runner.d.ts +10 -0
- package/dist/src/domains/extension/runners/whoami.runner.js +71 -0
- package/dist/src/domains/extension/runners/whoami.runner.js.map +1 -0
- package/dist/src/domains/extension/services/add.service.d.ts +26 -0
- package/dist/src/domains/extension/services/add.service.js +263 -0
- package/dist/src/domains/extension/services/add.service.js.map +1 -0
- package/dist/src/domains/extension/services/checks/a11y-check.d.ts +3 -0
- package/dist/src/domains/extension/services/checks/a11y-check.js +84 -0
- package/dist/src/domains/extension/services/checks/a11y-check.js.map +1 -0
- package/dist/src/domains/extension/services/checks/bundle-checks.d.ts +3 -0
- package/dist/src/domains/extension/services/checks/bundle-checks.js +234 -0
- package/dist/src/domains/extension/services/checks/bundle-checks.js.map +1 -0
- package/dist/src/domains/extension/services/checks/bundle-files.d.ts +14 -0
- package/dist/src/domains/extension/services/checks/bundle-files.js +139 -0
- package/dist/src/domains/extension/services/checks/bundle-files.js.map +1 -0
- package/dist/src/domains/extension/services/checks/file-checks.d.ts +6 -0
- package/dist/src/domains/extension/services/checks/file-checks.js +128 -0
- package/dist/src/domains/extension/services/checks/file-checks.js.map +1 -0
- package/dist/src/domains/extension/services/checks/index.d.ts +7 -0
- package/dist/src/domains/extension/services/checks/index.js +24 -0
- package/dist/src/domains/extension/services/checks/index.js.map +1 -0
- package/dist/src/domains/extension/services/checks/manifest-checks.d.ts +7 -0
- package/dist/src/domains/extension/services/checks/manifest-checks.js +95 -0
- package/dist/src/domains/extension/services/checks/manifest-checks.js.map +1 -0
- package/dist/src/domains/extension/services/checks/project-checks.d.ts +7 -0
- package/dist/src/domains/extension/services/checks/project-checks.js +86 -0
- package/dist/src/domains/extension/services/checks/project-checks.js.map +1 -0
- package/dist/src/domains/extension/services/checks/types.d.ts +23 -0
- package/dist/src/domains/extension/services/checks/types.js +50 -0
- package/dist/src/domains/extension/services/checks/types.js.map +1 -0
- package/dist/src/domains/extension/services/dev.service.d.ts +26 -0
- package/dist/src/domains/extension/services/dev.service.js +58 -0
- package/dist/src/domains/extension/services/dev.service.js.map +1 -0
- package/dist/src/domains/extension/services/doctor.service.d.ts +36 -0
- package/dist/src/domains/extension/services/doctor.service.js +213 -0
- package/dist/src/domains/extension/services/doctor.service.js.map +1 -0
- package/dist/src/domains/extension/services/failures.d.ts +8 -0
- package/dist/src/domains/extension/services/failures.js +112 -0
- package/dist/src/domains/extension/services/failures.js.map +1 -0
- package/dist/src/domains/extension/services/guided.service.d.ts +36 -0
- package/dist/src/domains/extension/services/guided.service.js +133 -0
- package/dist/src/domains/extension/services/guided.service.js.map +1 -0
- package/dist/src/domains/extension/services/publish.service.d.ts +14 -0
- package/dist/src/domains/extension/services/publish.service.js +93 -0
- package/dist/src/domains/extension/services/publish.service.js.map +1 -0
- package/dist/src/domains/extension/services/registration.service.d.ts +7 -0
- package/dist/src/domains/extension/services/registration.service.js +43 -0
- package/dist/src/domains/extension/services/registration.service.js.map +1 -0
- package/dist/src/domains/extension/services/remove.service.d.ts +22 -0
- package/dist/src/domains/extension/services/remove.service.js +137 -0
- package/dist/src/domains/extension/services/remove.service.js.map +1 -0
- package/dist/src/domains/extension/services/types.service.d.ts +21 -0
- package/dist/src/domains/extension/services/types.service.js +81 -0
- package/dist/src/domains/extension/services/types.service.js.map +1 -0
- package/dist/src/domains/index.d.ts +6 -2
- package/dist/src/domains/index.js +6 -2
- package/dist/src/domains/index.js.map +1 -1
- package/dist/src/domains/{init → link}/index.d.ts +1 -1
- package/dist/src/domains/{init → link}/index.js +1 -1
- package/dist/src/domains/link/index.js.map +1 -0
- package/dist/src/domains/link/link.module.d.ts +2 -0
- package/dist/src/domains/{init/init.module.js → link/link.module.js} +8 -8
- package/dist/src/domains/link/link.module.js.map +1 -0
- package/dist/src/domains/link/runners/index.d.ts +1 -0
- package/dist/src/domains/{deploy → link}/runners/index.js +1 -1
- package/dist/src/domains/link/runners/index.js.map +1 -0
- package/dist/src/domains/link/runners/link.runner.d.ts +20 -0
- package/dist/src/domains/link/runners/link.runner.js +129 -0
- package/dist/src/domains/link/runners/link.runner.js.map +1 -0
- package/dist/src/domains/mcp/index.d.ts +5 -0
- package/dist/src/domains/mcp/index.js +22 -0
- package/dist/src/domains/mcp/index.js.map +1 -0
- package/dist/src/domains/mcp/mcp.module.d.ts +2 -0
- package/dist/src/domains/mcp/mcp.module.js +25 -0
- package/dist/src/domains/mcp/mcp.module.js.map +1 -0
- package/dist/src/domains/mcp/runners/mcp.runner.d.ts +7 -0
- package/dist/src/domains/mcp/runners/mcp.runner.js +45 -0
- package/dist/src/domains/mcp/runners/mcp.runner.js.map +1 -0
- package/dist/src/domains/mcp/services/docs-search.service.d.ts +23 -0
- package/dist/src/domains/mcp/services/docs-search.service.js +164 -0
- package/dist/src/domains/mcp/services/docs-search.service.js.map +1 -0
- package/dist/src/domains/mcp/services/mcp-server.factory.d.ts +42 -0
- package/dist/src/domains/mcp/services/mcp-server.factory.js +438 -0
- package/dist/src/domains/mcp/services/mcp-server.factory.js.map +1 -0
- package/dist/src/domains/mcp/services/validate.service.d.ts +17 -0
- package/dist/src/domains/mcp/services/validate.service.js +57 -0
- package/dist/src/domains/mcp/services/validate.service.js.map +1 -0
- package/dist/src/domains/upgrade/index.d.ts +1 -0
- package/dist/src/domains/upgrade/index.js +18 -0
- package/dist/src/domains/upgrade/index.js.map +1 -0
- package/dist/src/domains/upgrade/runners/index.d.ts +1 -0
- package/dist/src/domains/upgrade/runners/index.js +18 -0
- package/dist/src/domains/upgrade/runners/index.js.map +1 -0
- package/dist/src/domains/upgrade/runners/upgrade.runner.d.ts +12 -0
- package/dist/src/domains/upgrade/runners/upgrade.runner.js +191 -0
- package/dist/src/domains/upgrade/runners/upgrade.runner.js.map +1 -0
- package/dist/src/domains/upgrade/upgrade.module.d.ts +2 -0
- package/dist/src/domains/{deploy/deploy.module.js → upgrade/upgrade.module.js} +8 -8
- package/dist/src/domains/upgrade/upgrade.module.js.map +1 -0
- package/dist/src/domains/vendor/index.d.ts +1 -0
- package/dist/src/domains/vendor/index.js +18 -0
- package/dist/src/domains/vendor/index.js.map +1 -0
- package/dist/src/domains/vendor/runners/index.d.ts +2 -0
- package/dist/src/domains/vendor/runners/index.js +19 -0
- package/dist/src/domains/vendor/runners/index.js.map +1 -0
- package/dist/src/domains/vendor/runners/vendor-create.runner.d.ts +20 -0
- package/dist/src/domains/vendor/runners/vendor-create.runner.js +121 -0
- package/dist/src/domains/vendor/runners/vendor-create.runner.js.map +1 -0
- package/dist/src/domains/vendor/runners/vendor.command.d.ts +10 -0
- package/dist/src/domains/vendor/runners/vendor.command.js +42 -0
- package/dist/src/domains/vendor/runners/vendor.command.js.map +1 -0
- package/dist/src/domains/vendor/vendor.module.d.ts +2 -0
- package/dist/src/domains/vendor/vendor.module.js +22 -0
- package/dist/src/domains/vendor/vendor.module.js.map +1 -0
- package/dist/src/main.js +16 -2
- package/dist/src/main.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +43 -7
- package/templates/contributions/action/schemas/__file__.input.json +14 -0
- package/templates/contributions/action/server/actions/__file__.ts +8 -0
- package/templates/contributions/connector/server/metrics.ts +19 -0
- package/templates/contributions/context/server/context/__file__.ts +10 -0
- package/templates/contributions/knowledge/knowledge/__file__.md +6 -0
- package/templates/contributions/mention/server/mentions/__file__.ts +10 -0
- package/templates/contributions/page/src/pages/__file__.tsx +21 -0
- package/templates/contributions/page/test/__file__.test.tsx +12 -0
- package/templates/contributions/procedure/schemas/__file__.input.json +13 -0
- package/templates/contributions/procedure/schemas/__file__.output.json +13 -0
- package/templates/contributions/procedure/server/procedures/__file__.ts +13 -0
- package/templates/contributions/prompt/schemas/__file__.input.json +14 -0
- package/templates/contributions/row-action/src/row-actions/__file__.tsx +20 -0
- package/templates/contributions/row-action/test/__file__.test.tsx +17 -0
- package/templates/contributions/settings/schemas/settings.json +14 -0
- package/templates/contributions/settings/src/settings.tsx +24 -0
- package/templates/contributions/settings/test/settings.test.tsx +12 -0
- package/templates/contributions/skill/skills/__file__.md +14 -0
- package/templates/contributions/storage/schemas/__file__.json +14 -0
- package/templates/contributions/tab/src/tabs/__file__.tsx +21 -0
- package/templates/contributions/tab/test/__file__.test.tsx +12 -0
- package/templates/contributions/tool/schemas/__file__.input.json +14 -0
- package/templates/contributions/tool/server/tools/__file__.ts +8 -0
- package/templates/contributions/webhook/schemas/__file__.payload.json +13 -0
- package/templates/contributions/widget/src/widgets/__file__.tsx +48 -0
- package/templates/contributions/widget/test/__file__.test.tsx +16 -0
- package/templates/contributions/work/server/work.ts +14 -0
- package/templates/starter/README.md +75 -0
- package/templates/starter/api/tappify/[...path].ts +6 -0
- package/templates/starter/gitignore +6 -0
- package/templates/starter/icon.svg +4 -0
- package/templates/starter/package.json +37 -0
- package/templates/starter/pnpm-workspace.yaml +3 -0
- package/templates/starter/schemas/get-summary.input.json +11 -0
- package/templates/starter/schemas/get-summary.output.json +12 -0
- package/templates/starter/schemas/preferences.json +18 -0
- package/templates/starter/schemas/settings.json +19 -0
- package/templates/starter/server/actions/index.ts +1 -0
- package/templates/starter/server/context/index.ts +1 -0
- package/templates/starter/server/handler.ts +25 -0
- package/templates/starter/server/mentions/index.ts +1 -0
- package/templates/starter/server/procedures/get-summary.ts +32 -0
- package/templates/starter/server/procedures/index.ts +5 -0
- package/templates/starter/server/tools/index.ts +1 -0
- package/templates/starter/server/worker.ts +5 -0
- package/templates/starter/src/settings.tsx +24 -0
- package/templates/starter/src/styles.css +16 -0
- package/templates/starter/src/tappify.d.ts +59 -0
- package/templates/starter/src/widgets/summary.tsx +122 -0
- package/templates/starter/tappify.extension.json +68 -0
- package/templates/starter/test/matchers.d.ts +2 -0
- package/templates/starter/test/server.test.ts +69 -0
- package/templates/starter/test/settings.test.tsx +46 -0
- package/templates/starter/test/summary.test.tsx +109 -0
- package/templates/starter/tsconfig.json +20 -0
- package/templates/starter/vite.config.ts +8 -0
- package/templates/starter/vitest.config.ts +29 -0
- package/templates/starter/wrangler.toml +7 -0
- package/dist/src/domains/deploy/deploy.module.d.ts +0 -2
- package/dist/src/domains/deploy/deploy.module.js.map +0 -1
- package/dist/src/domains/deploy/index.d.ts +0 -2
- package/dist/src/domains/deploy/index.js.map +0 -1
- package/dist/src/domains/deploy/runners/deploy.runner.d.ts +0 -10
- package/dist/src/domains/deploy/runners/deploy.runner.js +0 -132
- package/dist/src/domains/deploy/runners/deploy.runner.js.map +0 -1
- package/dist/src/domains/deploy/runners/index.d.ts +0 -1
- package/dist/src/domains/deploy/runners/index.js.map +0 -1
- package/dist/src/domains/init/index.js.map +0 -1
- package/dist/src/domains/init/init.module.d.ts +0 -2
- package/dist/src/domains/init/init.module.js.map +0 -1
- package/dist/src/domains/init/runners/index.d.ts +0 -1
- package/dist/src/domains/init/runners/index.js.map +0 -1
- package/dist/src/domains/init/runners/init.runner.d.ts +0 -4
- package/dist/src/domains/init/runners/init.runner.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tappify/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Tappify CLI - Command line interface for managing deployments and more",
|
|
5
5
|
"author": "Tappify Team",
|
|
6
6
|
"private": false,
|
|
7
7
|
"license": "MIT",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=20"
|
|
10
|
+
},
|
|
8
11
|
"bin": {
|
|
9
12
|
"tappify": "./bin/tappify"
|
|
10
13
|
},
|
|
11
14
|
"files": [
|
|
12
15
|
"dist",
|
|
13
|
-
"bin"
|
|
16
|
+
"bin",
|
|
17
|
+
"templates"
|
|
14
18
|
],
|
|
19
|
+
"pkg": {
|
|
20
|
+
"assets": [
|
|
21
|
+
"templates/**/*"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
15
24
|
"repository": {
|
|
16
25
|
"type": "git",
|
|
17
26
|
"url": "https://github.com/tappify-dev/cli.git"
|
|
@@ -30,8 +39,8 @@
|
|
|
30
39
|
"scripts": {
|
|
31
40
|
"build": "nest build && tsc-alias && npm run copy-bin",
|
|
32
41
|
"copy-bin": "mkdir -p bin && cp scripts/tappify bin/tappify && chmod +x bin/tappify",
|
|
33
|
-
"format": "prettier --write \"src/**/*.ts\" \"*.{json,md}\"",
|
|
34
|
-
"format:check": "prettier --check \"src/**/*.ts\" \"*.{json,md}\"",
|
|
42
|
+
"format": "prettier --write \"src/**/*.ts\" \"scripts/**/*.mjs\" \"*.{json,md}\"",
|
|
43
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"scripts/**/*.mjs\" \"*.{json,md}\"",
|
|
35
44
|
"start": "nest start",
|
|
36
45
|
"start:dev": "nest start --watch",
|
|
37
46
|
"start:debug": "nest start --debug --watch",
|
|
@@ -39,27 +48,39 @@
|
|
|
39
48
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
40
49
|
"test": "jest --passWithNoTests --coverage",
|
|
41
50
|
"test:watch": "jest --watch",
|
|
51
|
+
"test:codegen": "NODE_OPTIONS=--experimental-vm-modules jest probe.spec --testPathIgnorePatterns=/node_modules/",
|
|
42
52
|
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
43
53
|
"prepare": "husky",
|
|
44
54
|
"commit": "cz",
|
|
45
55
|
"prepublishOnly": "npm run build && npm test",
|
|
46
56
|
"release:manual": "./scripts/prepare-release.sh",
|
|
47
57
|
"spellcheck": "cspell \"src/**/*.ts\" \"test/**/*.ts\" \"*.{json,md,yml}\" \".github/**/*.yml\"",
|
|
48
|
-
"semantic-release": "semantic-release"
|
|
58
|
+
"semantic-release": "semantic-release",
|
|
59
|
+
"bundle": "node scripts/bundle.mjs",
|
|
60
|
+
"build:cli-reference": "node scripts/build-cli-reference.mjs",
|
|
61
|
+
"sync:starter": "ts-node scripts/sync-starter.ts",
|
|
62
|
+
"build:binaries": "pnpm build && pnpm bundle && pkg dist/bundle/main.cjs --no-bytecode --public --targets node24-macos-x64,node24-macos-arm64,node24-linux-x64,node24-linux-arm64,node24-win-x64,node24-win-arm64 --out-path dist-bin",
|
|
63
|
+
"check:release-assets": "node scripts/check-release-assets.cjs"
|
|
49
64
|
},
|
|
50
65
|
"dependencies": {
|
|
66
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
51
67
|
"@nestjs/common": "^11.1.15",
|
|
52
68
|
"@nestjs/core": "^11.1.15",
|
|
53
69
|
"@nestjs/platform-express": "^11.1.15",
|
|
70
|
+
"@tappify/extension-sdk": "^2.0.0",
|
|
54
71
|
"archiver": "^7.0.1",
|
|
55
72
|
"chalk": "^5.6.2",
|
|
73
|
+
"chokidar": "^4.0.3",
|
|
56
74
|
"conf": "^15.1.0",
|
|
57
75
|
"form-data": "^4.0.5",
|
|
58
76
|
"nest-commander": "^3.20.1",
|
|
77
|
+
"node-pty": "^1.1.0",
|
|
59
78
|
"open": "^11.0.0",
|
|
60
79
|
"ora": "^9.3.0",
|
|
61
80
|
"reflect-metadata": "^0.2.2",
|
|
62
|
-
"rxjs": "^7.8.2"
|
|
81
|
+
"rxjs": "^7.8.2",
|
|
82
|
+
"semver": "^7.8.5",
|
|
83
|
+
"zod": "^4.3.6"
|
|
63
84
|
},
|
|
64
85
|
"devDependencies": {
|
|
65
86
|
"@commitlint/cli": "^20.4.3",
|
|
@@ -79,11 +100,14 @@
|
|
|
79
100
|
"@types/express": "^5.0.6",
|
|
80
101
|
"@types/jest": "^30.0.0",
|
|
81
102
|
"@types/node": "^25.3.3",
|
|
103
|
+
"@types/semver": "^7.8.0",
|
|
82
104
|
"@types/supertest": "^7.2.0",
|
|
105
|
+
"@yao-pkg/pkg": "^6.21.0",
|
|
83
106
|
"commitizen": "^4.3.1",
|
|
84
107
|
"conventional-changelog-conventionalcommits": "^9.3.0",
|
|
85
108
|
"cspell": "^9.7.0",
|
|
86
109
|
"cz-conventional-changelog": "^3.3.0",
|
|
110
|
+
"esbuild": "^0.28.1",
|
|
87
111
|
"eslint": "^10.0.2",
|
|
88
112
|
"eslint-config-prettier": "^10.1.8",
|
|
89
113
|
"eslint-plugin-prettier": "^5.5.5",
|
|
@@ -112,6 +136,10 @@
|
|
|
112
136
|
],
|
|
113
137
|
"rootDir": "src",
|
|
114
138
|
"testRegex": ".*\\.spec\\.ts$",
|
|
139
|
+
"testPathIgnorePatterns": [
|
|
140
|
+
"/node_modules/",
|
|
141
|
+
"\\.probe\\.spec\\.ts$"
|
|
142
|
+
],
|
|
115
143
|
"transform": {
|
|
116
144
|
"^.+\\.(t|j)s$": [
|
|
117
145
|
"ts-jest",
|
|
@@ -119,7 +147,15 @@
|
|
|
119
147
|
"tsconfig": {
|
|
120
148
|
"module": "commonjs",
|
|
121
149
|
"moduleResolution": "node10",
|
|
122
|
-
"resolvePackageJsonExports": false
|
|
150
|
+
"resolvePackageJsonExports": false,
|
|
151
|
+
"paths": {
|
|
152
|
+
"@/*": [
|
|
153
|
+
"src/*"
|
|
154
|
+
],
|
|
155
|
+
"@modelcontextprotocol/sdk/*": [
|
|
156
|
+
"node_modules/@modelcontextprotocol/sdk/dist/esm/*"
|
|
157
|
+
]
|
|
158
|
+
}
|
|
123
159
|
}
|
|
124
160
|
}
|
|
125
161
|
]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "__Name__Input",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"target": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"title": "Target",
|
|
9
|
+
"description": "Replace this with what the assistant needs to know"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"required": ["target"],
|
|
13
|
+
"additionalProperties": false
|
|
14
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ActionInput } from '@tappify/extension-sdk';
|
|
2
|
+
import type { TappifyRequest } from '@tappify/extension-sdk/server';
|
|
3
|
+
|
|
4
|
+
export function __camel__(request: TappifyRequest<ActionInput<'__name__'>>) {
|
|
5
|
+
const { target } = request.input;
|
|
6
|
+
|
|
7
|
+
return { ok: true, target };
|
|
8
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
MetricsInput,
|
|
3
|
+
MetricsResponse,
|
|
4
|
+
TappifyRequest,
|
|
5
|
+
} from '@tappify/extension-sdk/server';
|
|
6
|
+
|
|
7
|
+
export function metrics(
|
|
8
|
+
request: TappifyRequest<MetricsInput>,
|
|
9
|
+
): MetricsResponse {
|
|
10
|
+
return {
|
|
11
|
+
series: [
|
|
12
|
+
{
|
|
13
|
+
metric: 'sessions',
|
|
14
|
+
unit: 'count',
|
|
15
|
+
points: [[request.input.from, 0]],
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# __title__
|
|
2
|
+
|
|
3
|
+
Write what the assistant should know about this extension's numbers here. Keep
|
|
4
|
+
it factual: definitions, units, time zones, and the mistakes people make when
|
|
5
|
+
reading them. The assistant cites this file, so a sentence you would not sign
|
|
6
|
+
does not belong in it.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TapEmptyState,
|
|
3
|
+
TapPageHeader,
|
|
4
|
+
useTapParams,
|
|
5
|
+
type TapPageProps,
|
|
6
|
+
} from '@tappify/extension-sdk';
|
|
7
|
+
import '@tappify/extension-sdk/styles.css';
|
|
8
|
+
|
|
9
|
+
export default function __Name__(_props: TapPageProps) {
|
|
10
|
+
const params = useTapParams();
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<div className="tap-stack">
|
|
14
|
+
<TapPageHeader title="__title__" description="What this page is for." />
|
|
15
|
+
<TapEmptyState
|
|
16
|
+
title="Nothing here yet"
|
|
17
|
+
description={`Route parameters: ${JSON.stringify(params)}`}
|
|
18
|
+
/>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { renderWithTap } from '@tappify/extension-sdk/testing';
|
|
2
|
+
import { screen } from '@testing-library/react';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import __Name__ from '../src/pages/__file__';
|
|
5
|
+
|
|
6
|
+
describe('the __title__ page', () => {
|
|
7
|
+
it('renders its header', () => {
|
|
8
|
+
renderWithTap(<__Name__ params={{}} />, { scopes: ['ui:render'] });
|
|
9
|
+
|
|
10
|
+
expect(screen.getByText('__title__')).toBeInTheDocument();
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "__Name__Input",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"days": {
|
|
7
|
+
"type": "number",
|
|
8
|
+
"description": "How many days the caller is asking about"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"required": ["days"],
|
|
12
|
+
"additionalProperties": false
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "__Name__Output",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"value": {
|
|
7
|
+
"type": "number",
|
|
8
|
+
"description": "Replace this with what your server answers"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"required": ["value"],
|
|
12
|
+
"additionalProperties": false
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
TapProcedureInput,
|
|
3
|
+
TapProcedureOutput,
|
|
4
|
+
} from '@tappify/extension-sdk';
|
|
5
|
+
import type { TappifyRequest } from '@tappify/extension-sdk/server';
|
|
6
|
+
|
|
7
|
+
export function __camel__(
|
|
8
|
+
request: TappifyRequest<TapProcedureInput<'__name__'>>,
|
|
9
|
+
): TapProcedureOutput<'__name__'> {
|
|
10
|
+
const { days } = request.input;
|
|
11
|
+
|
|
12
|
+
return { value: days };
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "__Name__Input",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"range": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"title": "Range",
|
|
9
|
+
"description": "What the owner fills in before the prompt is sent"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"required": ["range"],
|
|
13
|
+
"additionalProperties": false
|
|
14
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TapButton,
|
|
3
|
+
TapCard,
|
|
4
|
+
useTap,
|
|
5
|
+
type TapRowActionProps,
|
|
6
|
+
} from '@tappify/extension-sdk';
|
|
7
|
+
import '@tappify/extension-sdk/styles.css';
|
|
8
|
+
|
|
9
|
+
export default function __Name__({ row }: TapRowActionProps) {
|
|
10
|
+
const tap = useTap();
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<TapCard title="__title__">
|
|
14
|
+
<pre>{JSON.stringify(row, null, 2)}</pre>
|
|
15
|
+
<TapButton onClick={() => tap.ui.toast('Handled.', 'success')}>
|
|
16
|
+
Do it
|
|
17
|
+
</TapButton>
|
|
18
|
+
</TapCard>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { renderWithTap } from '@tappify/extension-sdk/testing';
|
|
2
|
+
import { screen } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import __Name__ from '../src/row-actions/__file__';
|
|
6
|
+
|
|
7
|
+
describe('the __title__ row action', () => {
|
|
8
|
+
it('toasts when the owner runs it', async () => {
|
|
9
|
+
const { mock } = renderWithTap(<__Name__ row={{ id: '1' }} />, {
|
|
10
|
+
scopes: ['ui:render'],
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
await userEvent.click(screen.getByRole('button', { name: 'Do it' }));
|
|
14
|
+
|
|
15
|
+
expect(mock).toHaveToasted('Handled.');
|
|
16
|
+
});
|
|
17
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "Settings",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"enabled": {
|
|
7
|
+
"type": "boolean",
|
|
8
|
+
"title": "Enabled",
|
|
9
|
+
"description": "Turn this extension's work on for the project"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"required": ["enabled"],
|
|
13
|
+
"additionalProperties": false
|
|
14
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TapForm,
|
|
3
|
+
TapPageHeader,
|
|
4
|
+
type TapSettingsProps,
|
|
5
|
+
} from '@tappify/extension-sdk';
|
|
6
|
+
import '@tappify/extension-sdk/styles.css';
|
|
7
|
+
import schema from '../schemas/settings.json';
|
|
8
|
+
|
|
9
|
+
export default function Settings({ values, onChange }: TapSettingsProps) {
|
|
10
|
+
return (
|
|
11
|
+
<div className="tap-stack">
|
|
12
|
+
<TapPageHeader
|
|
13
|
+
title="__title__"
|
|
14
|
+
description="These values reach your server as documents.settings on every call."
|
|
15
|
+
/>
|
|
16
|
+
<TapForm
|
|
17
|
+
schema={schema}
|
|
18
|
+
value={values}
|
|
19
|
+
submitLabel="Save"
|
|
20
|
+
onSubmit={next => onChange(next)}
|
|
21
|
+
/>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { renderWithTap } from '@tappify/extension-sdk/testing';
|
|
2
|
+
import { screen } from '@testing-library/react';
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import Settings from '../src/settings';
|
|
5
|
+
|
|
6
|
+
describe('the settings panel', () => {
|
|
7
|
+
it('renders one control per schema field', () => {
|
|
8
|
+
renderWithTap(<Settings values={{ enabled: true }} onChange={vi.fn()} />);
|
|
9
|
+
|
|
10
|
+
expect(screen.getByLabelText('Enabled')).toBeInTheDocument();
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# __title__
|
|
2
|
+
|
|
3
|
+
Write the steps the assistant should follow when this skill applies. Name the
|
|
4
|
+
tools it may call and the order it should call them in. Keep it under 4,000
|
|
5
|
+
words; anything longer is a sign the skill is two skills.
|
|
6
|
+
|
|
7
|
+
## When to use this
|
|
8
|
+
|
|
9
|
+
Describe the question or situation that should load this skill.
|
|
10
|
+
|
|
11
|
+
## Steps
|
|
12
|
+
|
|
13
|
+
1. Replace this with the first step.
|
|
14
|
+
2. Replace this with the second step.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "__Name__",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"note": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"title": "Note",
|
|
9
|
+
"description": "Replace this with the fields your document holds"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"required": ["note"],
|
|
13
|
+
"additionalProperties": false
|
|
14
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TapEmptyState,
|
|
3
|
+
TapPageHeader,
|
|
4
|
+
type TapTabProps,
|
|
5
|
+
} from '@tappify/extension-sdk';
|
|
6
|
+
import '@tappify/extension-sdk/styles.css';
|
|
7
|
+
|
|
8
|
+
export default function __Name__(_props: TapTabProps) {
|
|
9
|
+
return (
|
|
10
|
+
<div className="tap-stack">
|
|
11
|
+
<TapPageHeader
|
|
12
|
+
title="__title__"
|
|
13
|
+
description="What this tab shows the owner."
|
|
14
|
+
/>
|
|
15
|
+
<TapEmptyState
|
|
16
|
+
title="Nothing here yet"
|
|
17
|
+
description="Replace this with the content your tab shows."
|
|
18
|
+
/>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { renderWithTap } from '@tappify/extension-sdk/testing';
|
|
2
|
+
import { screen } from '@testing-library/react';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import __Name__ from '../src/tabs/__file__';
|
|
5
|
+
|
|
6
|
+
describe('the __title__ tab', () => {
|
|
7
|
+
it('renders its header', () => {
|
|
8
|
+
renderWithTap(<__Name__ />, { scopes: ['ui:render'] });
|
|
9
|
+
|
|
10
|
+
expect(screen.getByText('__title__')).toBeInTheDocument();
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "__Name__Input",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"target": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"title": "Target",
|
|
9
|
+
"description": "Replace this with what the assistant needs to know"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"required": ["target"],
|
|
13
|
+
"additionalProperties": false
|
|
14
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolInput } from '@tappify/extension-sdk';
|
|
2
|
+
import type { TappifyRequest } from '@tappify/extension-sdk/server';
|
|
3
|
+
|
|
4
|
+
export function __camel__(request: TappifyRequest<ToolInput<'__name__'>>) {
|
|
5
|
+
const { target } = request.input;
|
|
6
|
+
|
|
7
|
+
return { value: target };
|
|
8
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "__Name__Payload",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"why": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"description": "One sentence the owner reads on the alert or banner"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"required": ["why"],
|
|
12
|
+
"additionalProperties": false
|
|
13
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TapCard,
|
|
3
|
+
TapErrorState,
|
|
4
|
+
TapSkeleton,
|
|
5
|
+
TapStat,
|
|
6
|
+
useTap,
|
|
7
|
+
useTapFilters,
|
|
8
|
+
useTapQuery,
|
|
9
|
+
type TapSeriesPoint,
|
|
10
|
+
type TapWidgetProps,
|
|
11
|
+
} from '@tappify/extension-sdk';
|
|
12
|
+
import '@tappify/extension-sdk/styles.css';
|
|
13
|
+
|
|
14
|
+
function total(points: TapSeriesPoint[]): number {
|
|
15
|
+
return points.reduce((sum, point) => sum + point.value, 0);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default function __Name__(_props: TapWidgetProps) {
|
|
19
|
+
const tap = useTap();
|
|
20
|
+
const filters = useTapFilters();
|
|
21
|
+
|
|
22
|
+
const downloads = useTapQuery({
|
|
23
|
+
kind: 'series',
|
|
24
|
+
metric: 'downloads',
|
|
25
|
+
range: filters.range,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<TapCard title="__title__">
|
|
30
|
+
{downloads.isLoading && <TapSkeleton lines={2} />}
|
|
31
|
+
|
|
32
|
+
{downloads.error !== null && (
|
|
33
|
+
<TapErrorState
|
|
34
|
+
title="__title__ did not load"
|
|
35
|
+
description={downloads.error.message}
|
|
36
|
+
onRetry={() => downloads.refetch()}
|
|
37
|
+
/>
|
|
38
|
+
)}
|
|
39
|
+
|
|
40
|
+
{downloads.error === null && downloads.data !== undefined && (
|
|
41
|
+
<TapStat
|
|
42
|
+
label="Downloads"
|
|
43
|
+
value={tap.format.number(total(downloads.data.points))}
|
|
44
|
+
/>
|
|
45
|
+
)}
|
|
46
|
+
</TapCard>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { renderWithTap } from '@tappify/extension-sdk/testing';
|
|
2
|
+
import { screen, waitFor } from '@testing-library/react';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import __Name__ from '../src/widgets/__file__';
|
|
5
|
+
|
|
6
|
+
describe('the __title__ widget', () => {
|
|
7
|
+
it('renders the total for the range the page is showing', async () => {
|
|
8
|
+
renderWithTap(<__Name__ config={{}} />, {
|
|
9
|
+
scopes: ['ui:render', 'analytics:read'],
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
await waitFor(() =>
|
|
13
|
+
expect(screen.getByText('__title__')).toBeInTheDocument(),
|
|
14
|
+
);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TappifyRequest } from '@tappify/extension-sdk/server';
|
|
2
|
+
|
|
3
|
+
type WorkRequest = TappifyRequest<Record<string, unknown>>;
|
|
4
|
+
|
|
5
|
+
export const work = {
|
|
6
|
+
list_containers: () => ({
|
|
7
|
+
containers: [{ id: 'example', label: 'Example project' }],
|
|
8
|
+
}),
|
|
9
|
+
create: (request: WorkRequest) => ({
|
|
10
|
+
id: 'example-1',
|
|
11
|
+
url: 'https://example.com/issues/example-1',
|
|
12
|
+
title: String(request.input.title ?? 'Untitled'),
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# __title__
|
|
2
|
+
|
|
3
|
+
A Tappify extension that shows a one-line install summary on the Analytics page, remembers how each teammate likes it, and answers its own server for the number.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pnpm install
|
|
7
|
+
pnpm dev
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
`pnpm dev` serves `remoteEntry.js` on http://localhost:5273. Open the extension's Preview page in the developer portal to see the widget, or run `tappify extension dev --live` to mount it on your sandbox project.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
pnpm typecheck
|
|
14
|
+
pnpm build
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`pnpm typecheck` runs `tsc` over the widget, the settings panel, the server and the tests. `pnpm build` writes the bundle Tappify loads, `dist/remoteEntry.js`, alongside `dist/mf-manifest.json`.
|
|
18
|
+
|
|
19
|
+
## What is here
|
|
20
|
+
|
|
21
|
+
| Path | What it is |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| `tappify.extension.json` | The manifest. Every contribution, scope and schema reference lives here |
|
|
24
|
+
| `src/widgets/summary.tsx` | The widget that renders in the `kpi-row` slot on Analytics |
|
|
25
|
+
| `src/settings.tsx` | The settings panel owners see on the per-install page |
|
|
26
|
+
| `src/tappify.d.ts` | Generated types. Run `pnpm types` after changing the manifest; commit the result |
|
|
27
|
+
| `schemas/` | JSON Schemas the manifest points at, for storage, settings and the procedure |
|
|
28
|
+
| `server/handler.ts` | The extension server: one health check and one procedure |
|
|
29
|
+
| `test/` | One test per contribution, plus a server test |
|
|
30
|
+
| `test/matchers.d.ts` | Pulls the Vitest matcher declarations from the SDK and `jest-dom` into the type program |
|
|
31
|
+
|
|
32
|
+
## The widget
|
|
33
|
+
|
|
34
|
+
`useTapFilters()` gives the widget the page's date range and platform picker, so both numbers follow the picker with no code of its own. `useTapQuery({ kind: "series", metric: "downloads", range })` reads the project's own analytics from Tappify — that is the `analytics:read` scope the manifest asks for, and dropping the scope turns the query into the error state the widget already renders. `useTapServer("getSummary", input)` posts through the host to the extension server, which means no CORS, no server URL in the browser, and the owner's credentials never leave Tappify. `useTapStorage("preferences")` keeps each teammate's compact toggle in hosted storage, and `tap.data.subscribe("release.shipped")` refreshes the number when a release goes out.
|
|
35
|
+
|
|
36
|
+
Ask for the scopes you use and no others. This extension queries analytics, renders UI and writes storage, so it declares `analytics:read`, `ui:render` and `storage:write` — and nothing else.
|
|
37
|
+
|
|
38
|
+
## The server
|
|
39
|
+
|
|
40
|
+
`server/handler.ts` exports `handlerOptions` and a fetch handler. The same handler deploys two ways:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pnpm deploy:worker
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
deploys `server/worker.ts` to Cloudflare Workers using `wrangler.toml`. The Worker serves the routes at the root, so set `server.baseUrl` in `tappify.extension.json` to `https://__id__-server.<your-subdomain>.workers.dev` — the origin, with no path.
|
|
47
|
+
|
|
48
|
+
`api/tappify/[...path].ts` is a Vercel function over the same handler. Vercel invokes it at `/api/tappify/…`, so the function passes `basePath: "/api"`; deploy the repository to Vercel and set `server.baseUrl` to `https://<your-app>.vercel.app/api` — the origin **and** the `/api` prefix.
|
|
49
|
+
|
|
50
|
+
Whichever you pick, Tappify calls `GET <baseUrl>/tappify/health` at publish and every 15 minutes, and `POST <baseUrl>/tappify/procedures/getSummary` whenever the widget asks.
|
|
51
|
+
|
|
52
|
+
## Changing the manifest
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
pnpm types
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
rewrites `src/tappify.d.ts` from the manifest and its schemas. `tap.storage.preferences`, `tap.server.getSummary`, `TapSettingsProps["values"]` and the telemetry event name are all typed from that file, so a schema change that breaks a component is a type error rather than a runtime surprise. `pnpm types` runs `tappify extension types`, which types the host event payloads too.
|
|
59
|
+
|
|
60
|
+
## Tests
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
pnpm test
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`renderWithTap` mounts a component against an in-memory bridge with the same fixtures the portal preview uses. `createTestClient` drives the server the way Tappify does, with a signed token, so the procedure is tested end to end without a running Tappify.
|
|
67
|
+
|
|
68
|
+
## Publishing
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
tappify extension doctor
|
|
72
|
+
tappify extension publish --notes "First release"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`doctor` runs the same checks the platform runs at publish, including this repository's test script.
|