From 461d1300adc2df3f2a95ac852d2607cdb542886a Mon Sep 17 00:00:00 2001 From: steven_li Date: Mon, 15 Jun 2026 15:54:39 +0800 Subject: [PATCH] Refactor app instance to Keycloak SSO --- .../speckit-agent-context-update/SKILL.md | 31 - .agents/skills/speckit-analyze/SKILL.md | 257 -- .agents/skills/speckit-checklist/SKILL.md | 371 --- .agents/skills/speckit-clarify/SKILL.md | 283 -- .agents/skills/speckit-constitution/SKILL.md | 154 -- .agents/skills/speckit-git-commit/SKILL.md | 53 - .agents/skills/speckit-git-feature/SKILL.md | 72 - .../skills/speckit-git-initialize/SKILL.md | 54 - .agents/skills/speckit-git-remote/SKILL.md | 50 - .agents/skills/speckit-git-validate/SKILL.md | 54 - .agents/skills/speckit-implement/SKILL.md | 221 -- .agents/skills/speckit-plan/SKILL.md | 168 -- .agents/skills/speckit-specify/SKILL.md | 342 --- .agents/skills/speckit-tasks/SKILL.md | 212 -- .agents/skills/speckit-taskstoissues/SKILL.md | 104 - .codex | 0 .env.example | 64 +- .specify/extensions.yml | 164 -- .specify/extensions/.registry | 47 - .specify/extensions/agent-context/README.md | 57 - .../agent-context/agent-context-config.yml | 4 - .../commands/speckit.agent-context.update.md | 26 - .../extensions/agent-context/extension.yml | 34 - .../scripts/bash/update-agent-context.sh | 200 -- .../powershell/update-agent-context.ps1 | 237 -- .specify/extensions/git/README.md | 100 - .../git/commands/speckit.git.commit.md | 48 - .../git/commands/speckit.git.feature.md | 67 - .../git/commands/speckit.git.initialize.md | 49 - .../git/commands/speckit.git.remote.md | 45 - .../git/commands/speckit.git.validate.md | 49 - .specify/extensions/git/config-template.yml | 62 - .specify/extensions/git/extension.yml | 140 - .specify/extensions/git/git-config.yml | 62 - .../git/scripts/bash/auto-commit.sh | 140 - .../git/scripts/bash/create-new-feature.sh | 453 ---- .../extensions/git/scripts/bash/git-common.sh | 54 - .../git/scripts/bash/initialize-repo.sh | 54 - .../git/scripts/powershell/auto-commit.ps1 | 169 -- .../scripts/powershell/create-new-feature.ps1 | 403 --- .../git/scripts/powershell/git-common.ps1 | 51 - .../scripts/powershell/initialize-repo.ps1 | 69 - .specify/init-options.json | 9 - .specify/integration.json | 19 - .specify/integrations/codex.manifest.json | 16 - .specify/integrations/speckit.manifest.json | 17 - .specify/memory/constitution.md | 50 - .specify/scripts/bash/check-prerequisites.sh | 192 -- .specify/scripts/bash/common.sh | 721 ----- .specify/scripts/bash/create-new-feature.sh | 413 --- .specify/scripts/bash/setup-plan.sh | 91 - .specify/scripts/bash/setup-tasks.sh | 96 - .specify/templates/checklist-template.md | 40 - .specify/templates/constitution-template.md | 50 - .specify/templates/plan-template.md | 113 - .specify/templates/spec-template.md | 131 - .specify/templates/tasks-template.md | 252 -- .specify/workflows/speckit/workflow.yml | 77 - .specify/workflows/workflow-registry.json | 13 - 2026-06-01-hermes-gateway-llm-design.md | 458 ---- AGENTS.md | 16 +- DESIGN.md | 411 --- README.md | 198 +- app-instance/.dockerignore | 2 +- app-instance/.env.example | 28 + app-instance/Dockerfile | 13 +- app-instance/README.md | 162 +- .../backend/beaver/interfaces/web/app.py | 375 +-- .../beaver/interfaces/web/keycloak_auth.py | 152 ++ .../docs/architecture/project-comparison.html | 8 +- app-instance/backend/pyproject.toml | 1 + .../backend/tests/unit/test_keycloak_auth.py | 110 + .../backend/tests/unit/test_web_files_api.py | 17 +- app-instance/backend/uv.lock | 2 + app-instance/create-instance.sh | 861 ------ app-instance/entrypoint.sh | 2 - app-instance/frontend/README.md | 10 +- .../frontend/app/(auth)/login/page.tsx | 30 +- .../frontend/app/(auth)/register/page.tsx | 6 +- .../frontend/app/auth/callback/page.tsx | 68 + app-instance/frontend/app/handoff/page.tsx | 146 - .../frontend/app/logout/callback/page.tsx | 32 + .../frontend/components/AuthGuard.tsx | 11 +- app-instance/frontend/components/Header.tsx | 16 +- app-instance/frontend/env_template | 5 +- app-instance/frontend/lib/api.ts | 66 +- app-instance/frontend/lib/auth-portal.ts | 31 - .../frontend/lib/keycloak-oidc.test.ts | 116 + app-instance/frontend/lib/keycloak-oidc.ts | 324 +++ app-instance/frontend/types/index.ts | 5 +- app-instance/instance-registry.py | 347 --- app-instance/list-instances.sh | 108 - app-instance/remove-instance.sh | 130 - app-instance/run-standalone.sh | 155 ++ app-instance/tests/test_standalone_deploy.py | 40 + auth-portal/src/.dockerignore | 4 - auth-portal/src/.env.example | 5 - auth-portal/src/.gitignore | 4 - auth-portal/src/Dockerfile | 20 - auth-portal/src/README.md | 21 - .../src/app/api/runtime/login/route.ts | 60 - .../api/runtime/provider-onboarding/route.ts | 120 - .../src/app/api/runtime/register/route.ts | 53 - auth-portal/src/app/globals.css | 867 ------ auth-portal/src/app/layout.tsx | 28 - auth-portal/src/app/login/page.tsx | 175 -- auth-portal/src/app/page.tsx | 6 - auth-portal/src/app/register/page.tsx | 312 --- .../src/components/LanguageSwitcher.tsx | 28 - auth-portal/src/env_template | 3 - auth-portal/src/lib/auth-client.ts | 128 - auth-portal/src/lib/i18n/core.ts | 72 - auth-portal/src/lib/i18n/provider.tsx | 57 - auth-portal/src/lib/i18n/server.ts | 17 - auth-portal/src/lib/runtime-control.ts | 128 - auth-portal/src/next-env.d.ts | 5 - auth-portal/src/next.config.js | 7 - auth-portal/src/package-lock.json | 511 ---- auth-portal/src/package.json | 22 - auth-portal/src/public/boardware-logo.jpg | Bin 123151 -> 0 bytes auth-portal/src/public/login-background.png | Bin 1320383 -> 0 bytes auth-portal/src/test-results/.last-run.json | 4 - auth-portal/src/tsconfig.json | 42 - auth-portal/src/types/auth.ts | 46 - authz-service/.env.example | 18 - authz-service/Dockerfile | 30 - authz-service/README.md | 60 - authz-service/docker-entrypoint.sh | 21 - authz-service/env_template | 5 - .../seed-data/backend_credentials.json | 3 - authz-service/runtime/seed-data/backends.json | 3 - .../runtime/seed-data/permissions.json | 3 - authz-service/runtime/seed-data/settings.json | 3 - authz-service/runtime/seed-data/users.json | 3 - authz-service/src/.gitignore | 3 - authz-service/src/README.md | 639 ----- authz-service/src/app/__init__.py | 1 - authz-service/src/app/json_store.py | 318 --- authz-service/src/app/main.py | 832 ------ authz-service/src/app/minio_provisioning.py | 317 --- authz-service/src/app/models.py | 196 -- authz-service/src/app/security.py | 121 - authz-service/src/pyproject.toml | 27 - .../src/tests/test_minio_deprovisioning.py | 212 -- .../src/tests/test_minio_settings.py | 139 - authz-service/src/uv.lock | 1072 -------- authz-service/start-authz.sh | 76 - deploy-control/.env.example | 36 - deploy-control/.gitignore | 3 - deploy-control/Dockerfile | 23 - deploy-control/README.md | 97 - deploy-control/pyproject.toml | 9 - deploy-control/server.py | 732 ----- .../tests/test_connector_instance_config.py | 61 - .../tests/test_delete_orchestration.py | 148 -- deploy-control/uv.lock | 8 - docker-compose.external-connectors.yml | 32 - .../beaver/PRD-beaver-agent-sandbox.md | 489 ---- docs/product-discovery/beaver/README.md | 58 +- docs/product-discovery/beaver/index.html | 1277 --------- .../beaver/launch-maintenance-runbook.md | 455 ---- .../beaver/product-architecture-brief.md | 439 --- .../beaver/product-discovery-report.md | 494 ---- .../product-discovery/beaver/product-prd.html | 1449 ---------- .../beaver/validation-plan.md | 378 --- .../2026-05-22-task-evidence-validation.md | 1528 ----------- .../2026-05-26-task-detail-live-execution.md | 1537 ----------- .../plans/2026-06-01-channel-runtime-v1.md | 2356 ----------------- .../2026-06-01-terminal-websocket-channel.md | 1105 -------- ...026-06-02-channel-connectors-foundation.md | 1802 ------------- ...26-06-02-chat-platform-channel-adapters.md | 1515 ----------- ...6-03-external-connector-backend-runtime.md | 1645 ------------ ...6-03-external-connector-frontend-deploy.md | 792 ------ .../2026-06-03-external-connector-sidecar.md | 1267 --------- .../2026-06-04-auto-accept-on-new-topic.md | 73 - ...26-06-04-chat-task-timeline-consistency.md | 75 - .../2026-06-04-initial-multi-search-engine.md | 104 - .../plans/2026-06-08-skill-replay-eval.md | 2169 --------------- ...6-05-22-task-evidence-validation-design.md | 265 -- ...05-26-task-detail-live-execution-design.md | 440 --- ...06-01-terminal-websocket-channel-design.md | 279 -- ...2-channel-connectors-and-pairing-design.md | 404 --- ...2-chat-platform-channel-adapters-design.md | 307 --- ...6-02-external-sidecar-connectors-design.md | 592 ----- ...6-06-04-auto-accept-on-new-topic-design.md | 60 - ...4-chat-task-timeline-consistency-design.md | 59 - .../2026-06-08-skill-replay-eval-design.md | 219 -- docs/ui-ux/pages/auth-login.md | 220 -- external-connector/Dockerfile | 23 - .../external_connector/__init__.py | 1 - external-connector/external_connector/app.py | 76 - external-connector/external_connector/main.py | 62 - .../external_connector/models.py | 24 - .../node/feishu_event_utils.js | 216 -- .../node/feishu_ws_receiver.js | 121 - .../external_connector/providers/base.py | 28 - .../external_connector/providers/composite.py | 70 - .../external_connector/providers/fake.py | 119 - .../providers/feishu_bot.py | 687 ----- .../providers/vendor_cli.py | 281 -- .../providers/weixin_ilink.py | 500 ---- .../external_connector/state.py | 203 -- external-connector/package.json | 6 - external-connector/pyproject.toml | 20 - .../tests/node/feishu_event_utils.test.js | 189 -- .../tests/test_feishu_bot_provider.py | 541 ---- external-connector/tests/test_sidecar_api.py | 146 - external-connector/tests/test_state.py | 68 - .../tests/test_vendor_cli_provider.py | 182 -- .../tests/test_weixin_ilink_provider.py | 472 ---- external-connector/uv.lock | 621 ----- .../backend_blueprint/blueprint.css | 224 -- .../backend_blueprint/coordinator.html | 60 - projcet_review/backend_blueprint/engine.html | 63 - .../backend_blueprint/foundation.html | 60 - projcet_review/backend_blueprint/index.html | 87 - .../backend_blueprint/integrations.html | 47 - .../backend_blueprint/interfaces.html | 60 - projcet_review/backend_blueprint/memory.html | 58 - .../backend_blueprint/permissions.html | 30 - .../backend_blueprint/prompt-atlas.html | 217 -- .../backend_blueprint/providers.html | 68 - .../backend_blueprint/services.html | 71 - projcet_review/backend_blueprint/skills.html | 82 - projcet_review/backend_blueprint/tasks.html | 74 - projcet_review/backend_blueprint/tools.html | 79 - projcet_review/backend_module_blueprint.html | 954 ------- projcet_review/backend_product_roadshow.md | 421 --- .../backend_recent_completed_features.md | 205 -- projcet_review/blueprinter.md | 228 -- router-proxy/.env.example | 13 - router-proxy/README.md | 55 - router-proxy/nginx.conf | 23 - router-proxy/reload-proxy.sh | 50 - router-proxy/render-routes.py | 112 - router-proxy/start-proxy.sh | 67 - scripts/check-minio-prefix-policy.py | 50 - scripts/cleanup-test-users.py | 143 - scripts/deploy-initial-skills.sh | 101 - scripts/smoke-auth-files.mjs | 190 -- scripts/smoke-auth-files.sh | 16 - scripts/validate-filesystem-automation.mjs | 395 --- scripts/validate-filesystem-automation.sh | 16 - test-results/.last-run.json | 4 - 域名配置指引.md | 335 --- 部署指南.md | 873 ------ 246 files changed, 1350 insertions(+), 52721 deletions(-) delete mode 100644 .agents/skills/speckit-agent-context-update/SKILL.md delete mode 100644 .agents/skills/speckit-analyze/SKILL.md delete mode 100644 .agents/skills/speckit-checklist/SKILL.md delete mode 100644 .agents/skills/speckit-clarify/SKILL.md delete mode 100644 .agents/skills/speckit-constitution/SKILL.md delete mode 100644 .agents/skills/speckit-git-commit/SKILL.md delete mode 100644 .agents/skills/speckit-git-feature/SKILL.md delete mode 100644 .agents/skills/speckit-git-initialize/SKILL.md delete mode 100644 .agents/skills/speckit-git-remote/SKILL.md delete mode 100644 .agents/skills/speckit-git-validate/SKILL.md delete mode 100644 .agents/skills/speckit-implement/SKILL.md delete mode 100644 .agents/skills/speckit-plan/SKILL.md delete mode 100644 .agents/skills/speckit-specify/SKILL.md delete mode 100644 .agents/skills/speckit-tasks/SKILL.md delete mode 100644 .agents/skills/speckit-taskstoissues/SKILL.md delete mode 100644 .codex delete mode 100644 .specify/extensions.yml delete mode 100644 .specify/extensions/.registry delete mode 100644 .specify/extensions/agent-context/README.md delete mode 100644 .specify/extensions/agent-context/agent-context-config.yml delete mode 100644 .specify/extensions/agent-context/commands/speckit.agent-context.update.md delete mode 100644 .specify/extensions/agent-context/extension.yml delete mode 100755 .specify/extensions/agent-context/scripts/bash/update-agent-context.sh delete mode 100644 .specify/extensions/agent-context/scripts/powershell/update-agent-context.ps1 delete mode 100644 .specify/extensions/git/README.md delete mode 100644 .specify/extensions/git/commands/speckit.git.commit.md delete mode 100644 .specify/extensions/git/commands/speckit.git.feature.md delete mode 100644 .specify/extensions/git/commands/speckit.git.initialize.md delete mode 100644 .specify/extensions/git/commands/speckit.git.remote.md delete mode 100644 .specify/extensions/git/commands/speckit.git.validate.md delete mode 100644 .specify/extensions/git/config-template.yml delete mode 100644 .specify/extensions/git/extension.yml delete mode 100644 .specify/extensions/git/git-config.yml delete mode 100755 .specify/extensions/git/scripts/bash/auto-commit.sh delete mode 100755 .specify/extensions/git/scripts/bash/create-new-feature.sh delete mode 100755 .specify/extensions/git/scripts/bash/git-common.sh delete mode 100755 .specify/extensions/git/scripts/bash/initialize-repo.sh delete mode 100644 .specify/extensions/git/scripts/powershell/auto-commit.ps1 delete mode 100644 .specify/extensions/git/scripts/powershell/create-new-feature.ps1 delete mode 100644 .specify/extensions/git/scripts/powershell/git-common.ps1 delete mode 100644 .specify/extensions/git/scripts/powershell/initialize-repo.ps1 delete mode 100644 .specify/init-options.json delete mode 100644 .specify/integration.json delete mode 100644 .specify/integrations/codex.manifest.json delete mode 100644 .specify/integrations/speckit.manifest.json delete mode 100644 .specify/memory/constitution.md delete mode 100755 .specify/scripts/bash/check-prerequisites.sh delete mode 100755 .specify/scripts/bash/common.sh delete mode 100755 .specify/scripts/bash/create-new-feature.sh delete mode 100755 .specify/scripts/bash/setup-plan.sh delete mode 100755 .specify/scripts/bash/setup-tasks.sh delete mode 100644 .specify/templates/checklist-template.md delete mode 100644 .specify/templates/constitution-template.md delete mode 100644 .specify/templates/plan-template.md delete mode 100644 .specify/templates/spec-template.md delete mode 100644 .specify/templates/tasks-template.md delete mode 100644 .specify/workflows/speckit/workflow.yml delete mode 100644 .specify/workflows/workflow-registry.json delete mode 100644 2026-06-01-hermes-gateway-llm-design.md delete mode 100644 DESIGN.md create mode 100644 app-instance/.env.example create mode 100644 app-instance/backend/beaver/interfaces/web/keycloak_auth.py create mode 100644 app-instance/backend/tests/unit/test_keycloak_auth.py delete mode 100755 app-instance/create-instance.sh create mode 100644 app-instance/frontend/app/auth/callback/page.tsx delete mode 100644 app-instance/frontend/app/handoff/page.tsx create mode 100644 app-instance/frontend/app/logout/callback/page.tsx delete mode 100644 app-instance/frontend/lib/auth-portal.ts create mode 100644 app-instance/frontend/lib/keycloak-oidc.test.ts create mode 100644 app-instance/frontend/lib/keycloak-oidc.ts delete mode 100755 app-instance/instance-registry.py delete mode 100755 app-instance/list-instances.sh delete mode 100755 app-instance/remove-instance.sh create mode 100755 app-instance/run-standalone.sh create mode 100644 app-instance/tests/test_standalone_deploy.py delete mode 100644 auth-portal/src/.dockerignore delete mode 100644 auth-portal/src/.env.example delete mode 100644 auth-portal/src/.gitignore delete mode 100644 auth-portal/src/Dockerfile delete mode 100644 auth-portal/src/README.md delete mode 100644 auth-portal/src/app/api/runtime/login/route.ts delete mode 100644 auth-portal/src/app/api/runtime/provider-onboarding/route.ts delete mode 100644 auth-portal/src/app/api/runtime/register/route.ts delete mode 100644 auth-portal/src/app/globals.css delete mode 100644 auth-portal/src/app/layout.tsx delete mode 100644 auth-portal/src/app/login/page.tsx delete mode 100644 auth-portal/src/app/page.tsx delete mode 100644 auth-portal/src/app/register/page.tsx delete mode 100644 auth-portal/src/components/LanguageSwitcher.tsx delete mode 100644 auth-portal/src/env_template delete mode 100644 auth-portal/src/lib/auth-client.ts delete mode 100644 auth-portal/src/lib/i18n/core.ts delete mode 100644 auth-portal/src/lib/i18n/provider.tsx delete mode 100644 auth-portal/src/lib/i18n/server.ts delete mode 100644 auth-portal/src/lib/runtime-control.ts delete mode 100644 auth-portal/src/next-env.d.ts delete mode 100644 auth-portal/src/next.config.js delete mode 100644 auth-portal/src/package-lock.json delete mode 100644 auth-portal/src/package.json delete mode 100644 auth-portal/src/public/boardware-logo.jpg delete mode 100644 auth-portal/src/public/login-background.png delete mode 100644 auth-portal/src/test-results/.last-run.json delete mode 100644 auth-portal/src/tsconfig.json delete mode 100644 auth-portal/src/types/auth.ts delete mode 100644 authz-service/.env.example delete mode 100644 authz-service/Dockerfile delete mode 100644 authz-service/README.md delete mode 100755 authz-service/docker-entrypoint.sh delete mode 100644 authz-service/env_template delete mode 100644 authz-service/runtime/seed-data/backend_credentials.json delete mode 100644 authz-service/runtime/seed-data/backends.json delete mode 100644 authz-service/runtime/seed-data/permissions.json delete mode 100644 authz-service/runtime/seed-data/settings.json delete mode 100644 authz-service/runtime/seed-data/users.json delete mode 100644 authz-service/src/.gitignore delete mode 100644 authz-service/src/README.md delete mode 100644 authz-service/src/app/__init__.py delete mode 100644 authz-service/src/app/json_store.py delete mode 100644 authz-service/src/app/main.py delete mode 100644 authz-service/src/app/minio_provisioning.py delete mode 100644 authz-service/src/app/models.py delete mode 100644 authz-service/src/app/security.py delete mode 100644 authz-service/src/pyproject.toml delete mode 100644 authz-service/src/tests/test_minio_deprovisioning.py delete mode 100644 authz-service/src/tests/test_minio_settings.py delete mode 100644 authz-service/src/uv.lock delete mode 100755 authz-service/start-authz.sh delete mode 100644 deploy-control/.env.example delete mode 100644 deploy-control/.gitignore delete mode 100644 deploy-control/Dockerfile delete mode 100644 deploy-control/README.md delete mode 100644 deploy-control/pyproject.toml delete mode 100755 deploy-control/server.py delete mode 100644 deploy-control/tests/test_connector_instance_config.py delete mode 100644 deploy-control/tests/test_delete_orchestration.py delete mode 100644 deploy-control/uv.lock delete mode 100644 docker-compose.external-connectors.yml delete mode 100644 docs/product-discovery/beaver/PRD-beaver-agent-sandbox.md delete mode 100644 docs/product-discovery/beaver/index.html delete mode 100644 docs/product-discovery/beaver/launch-maintenance-runbook.md delete mode 100644 docs/product-discovery/beaver/product-architecture-brief.md delete mode 100644 docs/product-discovery/beaver/product-discovery-report.md delete mode 100644 docs/product-discovery/beaver/product-prd.html delete mode 100644 docs/product-discovery/beaver/validation-plan.md delete mode 100644 docs/superpowers/plans/2026-05-22-task-evidence-validation.md delete mode 100644 docs/superpowers/plans/2026-05-26-task-detail-live-execution.md delete mode 100644 docs/superpowers/plans/2026-06-01-channel-runtime-v1.md delete mode 100644 docs/superpowers/plans/2026-06-01-terminal-websocket-channel.md delete mode 100644 docs/superpowers/plans/2026-06-02-channel-connectors-foundation.md delete mode 100644 docs/superpowers/plans/2026-06-02-chat-platform-channel-adapters.md delete mode 100644 docs/superpowers/plans/2026-06-03-external-connector-backend-runtime.md delete mode 100644 docs/superpowers/plans/2026-06-03-external-connector-frontend-deploy.md delete mode 100644 docs/superpowers/plans/2026-06-03-external-connector-sidecar.md delete mode 100644 docs/superpowers/plans/2026-06-04-auto-accept-on-new-topic.md delete mode 100644 docs/superpowers/plans/2026-06-04-chat-task-timeline-consistency.md delete mode 100644 docs/superpowers/plans/2026-06-04-initial-multi-search-engine.md delete mode 100644 docs/superpowers/plans/2026-06-08-skill-replay-eval.md delete mode 100644 docs/superpowers/specs/2026-05-22-task-evidence-validation-design.md delete mode 100644 docs/superpowers/specs/2026-05-26-task-detail-live-execution-design.md delete mode 100644 docs/superpowers/specs/2026-06-01-terminal-websocket-channel-design.md delete mode 100644 docs/superpowers/specs/2026-06-02-channel-connectors-and-pairing-design.md delete mode 100644 docs/superpowers/specs/2026-06-02-chat-platform-channel-adapters-design.md delete mode 100644 docs/superpowers/specs/2026-06-02-external-sidecar-connectors-design.md delete mode 100644 docs/superpowers/specs/2026-06-04-auto-accept-on-new-topic-design.md delete mode 100644 docs/superpowers/specs/2026-06-04-chat-task-timeline-consistency-design.md delete mode 100644 docs/superpowers/specs/2026-06-08-skill-replay-eval-design.md delete mode 100644 docs/ui-ux/pages/auth-login.md delete mode 100644 external-connector/Dockerfile delete mode 100644 external-connector/external_connector/__init__.py delete mode 100644 external-connector/external_connector/app.py delete mode 100644 external-connector/external_connector/main.py delete mode 100644 external-connector/external_connector/models.py delete mode 100644 external-connector/external_connector/node/feishu_event_utils.js delete mode 100644 external-connector/external_connector/node/feishu_ws_receiver.js delete mode 100644 external-connector/external_connector/providers/base.py delete mode 100644 external-connector/external_connector/providers/composite.py delete mode 100644 external-connector/external_connector/providers/fake.py delete mode 100644 external-connector/external_connector/providers/feishu_bot.py delete mode 100644 external-connector/external_connector/providers/vendor_cli.py delete mode 100644 external-connector/external_connector/providers/weixin_ilink.py delete mode 100644 external-connector/external_connector/state.py delete mode 100644 external-connector/package.json delete mode 100644 external-connector/pyproject.toml delete mode 100644 external-connector/tests/node/feishu_event_utils.test.js delete mode 100644 external-connector/tests/test_feishu_bot_provider.py delete mode 100644 external-connector/tests/test_sidecar_api.py delete mode 100644 external-connector/tests/test_state.py delete mode 100644 external-connector/tests/test_vendor_cli_provider.py delete mode 100644 external-connector/tests/test_weixin_ilink_provider.py delete mode 100644 external-connector/uv.lock delete mode 100644 projcet_review/backend_blueprint/blueprint.css delete mode 100644 projcet_review/backend_blueprint/coordinator.html delete mode 100644 projcet_review/backend_blueprint/engine.html delete mode 100644 projcet_review/backend_blueprint/foundation.html delete mode 100644 projcet_review/backend_blueprint/index.html delete mode 100644 projcet_review/backend_blueprint/integrations.html delete mode 100644 projcet_review/backend_blueprint/interfaces.html delete mode 100644 projcet_review/backend_blueprint/memory.html delete mode 100644 projcet_review/backend_blueprint/permissions.html delete mode 100644 projcet_review/backend_blueprint/prompt-atlas.html delete mode 100644 projcet_review/backend_blueprint/providers.html delete mode 100644 projcet_review/backend_blueprint/services.html delete mode 100644 projcet_review/backend_blueprint/skills.html delete mode 100644 projcet_review/backend_blueprint/tasks.html delete mode 100644 projcet_review/backend_blueprint/tools.html delete mode 100644 projcet_review/backend_module_blueprint.html delete mode 100644 projcet_review/backend_product_roadshow.md delete mode 100644 projcet_review/backend_recent_completed_features.md delete mode 100644 projcet_review/blueprinter.md delete mode 100644 router-proxy/.env.example delete mode 100644 router-proxy/README.md delete mode 100644 router-proxy/nginx.conf delete mode 100755 router-proxy/reload-proxy.sh delete mode 100755 router-proxy/render-routes.py delete mode 100755 router-proxy/start-proxy.sh delete mode 100755 scripts/check-minio-prefix-policy.py delete mode 100755 scripts/cleanup-test-users.py delete mode 100755 scripts/deploy-initial-skills.sh delete mode 100755 scripts/smoke-auth-files.mjs delete mode 100755 scripts/smoke-auth-files.sh delete mode 100755 scripts/validate-filesystem-automation.mjs delete mode 100755 scripts/validate-filesystem-automation.sh delete mode 100644 test-results/.last-run.json delete mode 100644 域名配置指引.md delete mode 100644 部署指南.md diff --git a/.agents/skills/speckit-agent-context-update/SKILL.md b/.agents/skills/speckit-agent-context-update/SKILL.md deleted file mode 100644 index 667e84b..0000000 --- a/.agents/skills/speckit-agent-context-update/SKILL.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: speckit-agent-context-update -description: Refresh the managed Spec Kit section in the coding agent context file -compatibility: Requires spec-kit project structure with .specify/ directory -metadata: - author: github-spec-kit - source: agent-context:commands/speckit.agent-context.update.md ---- - -# Update Coding Agent Context - -Refresh the managed Spec Kit section inside the active coding agent's context/instruction file (e.g. `CLAUDE.md`, `.github/copilot-instructions.md`, `AGENTS.md`). - -## Behavior - -The script reads the agent-context extension config at -`.specify/extensions/agent-context/agent-context-config.yml` to discover: - -- `context_file` — the path of the coding agent context file to manage. -- `context_markers.start` / `.end` — the delimiters surrounding the managed section. Defaults to `` and `` when the field is missing. - -It then creates, replaces, or appends the managed block so that the section points at the most recent plan path when one can be discovered (`specs//plan.md`). - -If `context_file` is empty or the file cannot be located, the command reports nothing to do and exits successfully. - -## Execution - -- **Bash**: `.specify/extensions/agent-context/scripts/bash/update-agent-context.sh [plan_path]` -- **PowerShell**: `.specify/extensions/agent-context/scripts/powershell/update-agent-context.ps1 [plan_path]` - -When `plan_path` is omitted, the script auto-detects the most recently modified `specs/*/plan.md`. \ No newline at end of file diff --git a/.agents/skills/speckit-analyze/SKILL.md b/.agents/skills/speckit-analyze/SKILL.md deleted file mode 100644 index 115b72e..0000000 --- a/.agents/skills/speckit-analyze/SKILL.md +++ /dev/null @@ -1,257 +0,0 @@ ---- -name: "speckit-analyze" -description: "Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation." -compatibility: "Requires spec-kit project structure with .specify/ directory" -metadata: - author: "github-spec-kit" - source: "templates/commands/analyze.md" ---- - - -## User Input - -```text -$ARGUMENTS -``` - -You **MUST** consider the user input before proceeding (if not empty). - -## Pre-Execution Checks - -**Check for extension hooks (before analysis)**: -- Check if `.specify/extensions.yml` exists in the project root. -- If it exists, read it and look for entries under the `hooks.before_analyze` key -- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally -- Filter out hooks where `enabled` is explicitly `false`. Treat hooks without an `enabled` field as enabled by default. -- For each remaining hook, do **not** attempt to interpret or evaluate hook `condition` expressions: - - If the hook has no `condition` field, or it is null/empty, treat the hook as executable - - If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation -- When constructing slash commands from hook command names, replace dots (`.`) with hyphens (`-`). For example, `speckit.git.commit` → `/speckit-git-commit`. -- For each executable hook, output the following based on its `optional` flag: - - **Optional hook** (`optional: true`): - ``` - ## Extension Hooks - - **Optional Pre-Hook**: {extension} - Command: `/{command}` - Description: {description} - - Prompt: {prompt} - To execute: `/{command}` - ``` - - **Mandatory hook** (`optional: false`): - ``` - ## Extension Hooks - - **Automatic Pre-Hook**: {extension} - Executing: `/{command}` - EXECUTE_COMMAND: {command} - - Wait for the result of the hook command before proceeding to the Goal. - ``` -- If no hooks are registered or `.specify/extensions.yml` does not exist, skip silently - -## Goal - -Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (`spec.md`, `plan.md`, `tasks.md`) before implementation. This command MUST run only after `/speckit-tasks` has successfully produced a complete `tasks.md`. - -## Operating Constraints - -**STRICTLY READ-ONLY**: Do **not** modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually). - -**Constitution Authority**: The project constitution (`.specify/memory/constitution.md`) is **non-negotiable** within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjustment of the spec, plan, or tasks—not dilution, reinterpretation, or silent ignoring of the principle. If a principle itself needs to change, that must occur in a separate, explicit constitution update outside `/speckit-analyze`. - -## Execution Steps - -### 1. Initialize Analysis Context - -Run `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths: - -- SPEC = FEATURE_DIR/spec.md -- PLAN = FEATURE_DIR/plan.md -- TASKS = FEATURE_DIR/tasks.md - -Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command). -For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). - -### 2. Load Artifacts (Progressive Disclosure) - -Load only the minimal necessary context from each artifact: - -**From spec.md:** - -- Overview/Context -- Functional Requirements -- Success Criteria (measurable outcomes — e.g., performance, security, availability, user success, business impact) -- User Stories -- Edge Cases (if present) - -**From plan.md:** - -- Architecture/stack choices -- Data Model references -- Phases -- Technical constraints - -**From tasks.md:** - -- Task IDs -- Descriptions -- Phase grouping -- Parallel markers [P] -- Referenced file paths - -**From constitution:** - -- Load `.specify/memory/constitution.md` for principle validation - -### 3. Build Semantic Models - -Create internal representations (do not include raw artifacts in output): - -- **Requirements inventory**: For each Functional Requirement (FR-###) and Success Criterion (SC-###), record a stable key. Use the explicit FR-/SC- identifier as the primary key when present, and optionally also derive an imperative-phrase slug for readability (e.g., "User can upload file" → `user-can-upload-file`). Include only Success Criteria items that require buildable work (e.g., load-testing infrastructure, security audit tooling), and exclude post-launch outcome metrics and business KPIs (e.g., "Reduce support tickets by 50%"). -- **User story/action inventory**: Discrete user actions with acceptance criteria -- **Task coverage mapping**: Map each task to one or more requirements or stories (inference by keyword / explicit reference patterns like IDs or key phrases) -- **Constitution rule set**: Extract principle names and MUST/SHOULD normative statements - -### 4. Detection Passes (Token-Efficient Analysis) - -Focus on high-signal findings. Limit to 50 findings total; aggregate remainder in overflow summary. - -#### A. Duplication Detection - -- Identify near-duplicate requirements -- Mark lower-quality phrasing for consolidation - -#### B. Ambiguity Detection - -- Flag vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria -- Flag unresolved placeholders (TODO, TKTK, ???, ``, etc.) - -#### C. Underspecification - -- Requirements with verbs but missing object or measurable outcome -- User stories missing acceptance criteria alignment -- Tasks referencing files or components not defined in spec/plan - -#### D. Constitution Alignment - -- Any requirement or plan element conflicting with a MUST principle -- Missing mandated sections or quality gates from constitution - -#### E. Coverage Gaps - -- Requirements with zero associated tasks -- Tasks with no mapped requirement/story -- Success Criteria requiring buildable work (performance, security, availability) not reflected in tasks - -#### F. Inconsistency - -- Terminology drift (same concept named differently across files) -- Data entities referenced in plan but absent in spec (or vice versa) -- Task ordering contradictions (e.g., integration tasks before foundational setup tasks without dependency note) -- Conflicting requirements (e.g., one requires Next.js while other specifies Vue) - -### 5. Severity Assignment - -Use this heuristic to prioritize findings: - -- **CRITICAL**: Violates constitution MUST, missing core spec artifact, or requirement with zero coverage that blocks baseline functionality -- **HIGH**: Duplicate or conflicting requirement, ambiguous security/performance attribute, untestable acceptance criterion -- **MEDIUM**: Terminology drift, missing non-functional task coverage, underspecified edge case -- **LOW**: Style/wording improvements, minor redundancy not affecting execution order - -### 6. Produce Compact Analysis Report - -Output a Markdown report (no file writes) with the following structure: - -## Specification Analysis Report - -| ID | Category | Severity | Location(s) | Summary | Recommendation | -|----|----------|----------|-------------|---------|----------------| -| A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version | - -(Add one row per finding; generate stable IDs prefixed by category initial.) - -**Coverage Summary Table:** - -| Requirement Key | Has Task? | Task IDs | Notes | -|-----------------|-----------|----------|-------| - -**Constitution Alignment Issues:** (if any) - -**Unmapped Tasks:** (if any) - -**Metrics:** - -- Total Requirements -- Total Tasks -- Coverage % (requirements with >=1 task) -- Ambiguity Count -- Duplication Count -- Critical Issues Count - -### 7. Provide Next Actions - -At end of report, output a concise Next Actions block: - -- If CRITICAL issues exist: Recommend resolving before `/speckit-implement` -- If only LOW/MEDIUM: User may proceed, but provide improvement suggestions -- Provide explicit command suggestions: e.g., "Run /speckit-specify with refinement", "Run /speckit-plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'" - -### 8. Offer Remediation - -Ask the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.) - -### 9. Check for extension hooks - -After reporting, check if `.specify/extensions.yml` exists in the project root. -- If it exists, read it and look for entries under the `hooks.after_analyze` key -- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally -- Filter out hooks where `enabled` is explicitly `false`. Treat hooks without an `enabled` field as enabled by default. -- For each remaining hook, do **not** attempt to interpret or evaluate hook `condition` expressions: - - If the hook has no `condition` field, or it is null/empty, treat the hook as executable - - If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation -- When constructing slash commands from hook command names, replace dots (`.`) with hyphens (`-`). For example, `speckit.git.commit` → `/speckit-git-commit`. -- For each executable hook, output the following based on its `optional` flag: - - **Optional hook** (`optional: true`): - ``` - ## Extension Hooks - - **Optional Hook**: {extension} - Command: `/{command}` - Description: {description} - - Prompt: {prompt} - To execute: `/{command}` - ``` - - **Mandatory hook** (`optional: false`): - ``` - ## Extension Hooks - - **Automatic Hook**: {extension} - Executing: `/{command}` - EXECUTE_COMMAND: {command} - ``` -- If no hooks are registered or `.specify/extensions.yml` does not exist, skip silently - -## Operating Principles - -### Context Efficiency - -- **Minimal high-signal tokens**: Focus on actionable findings, not exhaustive documentation -- **Progressive disclosure**: Load artifacts incrementally; don't dump all content into analysis -- **Token-efficient output**: Limit findings table to 50 rows; summarize overflow -- **Deterministic results**: Rerunning without changes should produce consistent IDs and counts - -### Analysis Guidelines - -- **NEVER modify files** (this is read-only analysis) -- **NEVER hallucinate missing sections** (if absent, report them accurately) -- **Prioritize constitution violations** (these are always CRITICAL) -- **Use examples over exhaustive rules** (cite specific instances, not generic patterns) -- **Report zero issues gracefully** (emit success report with coverage statistics) - -## Context - -$ARGUMENTS diff --git a/.agents/skills/speckit-checklist/SKILL.md b/.agents/skills/speckit-checklist/SKILL.md deleted file mode 100644 index 863dc26..0000000 --- a/.agents/skills/speckit-checklist/SKILL.md +++ /dev/null @@ -1,371 +0,0 @@ ---- -name: "speckit-checklist" -description: "Generate a custom checklist for the current feature based on user requirements." -compatibility: "Requires spec-kit project structure with .specify/ directory" -metadata: - author: "github-spec-kit" - source: "templates/commands/checklist.md" ---- - - -## Checklist Purpose: "Unit Tests for English" - -**CRITICAL CONCEPT**: Checklists are **UNIT TESTS FOR REQUIREMENTS WRITING** - they validate the quality, clarity, and completeness of requirements in a given domain. - -**NOT for verification/testing**: - -- ❌ NOT "Verify the button clicks correctly" -- ❌ NOT "Test error handling works" -- ❌ NOT "Confirm the API returns 200" -- ❌ NOT checking if code/implementation matches the spec - -**FOR requirements quality validation**: - -- ✅ "Are visual hierarchy requirements defined for all card types?" (completeness) -- ✅ "Is 'prominent display' quantified with specific sizing/positioning?" (clarity) -- ✅ "Are hover state requirements consistent across all interactive elements?" (consistency) -- ✅ "Are accessibility requirements defined for keyboard navigation?" (coverage) -- ✅ "Does the spec define what happens when logo image fails to load?" (edge cases) - -**Metaphor**: If your spec is code written in English, the checklist is its unit test suite. You're testing whether the requirements are well-written, complete, unambiguous, and ready for implementation - NOT whether the implementation works. - -## User Input - -```text -$ARGUMENTS -``` - -You **MUST** consider the user input before proceeding (if not empty). - -## Pre-Execution Checks - -**Check for extension hooks (before checklist generation)**: -- Check if `.specify/extensions.yml` exists in the project root. -- If it exists, read it and look for entries under the `hooks.before_checklist` key -- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally -- Filter out hooks where `enabled` is explicitly `false`. Treat hooks without an `enabled` field as enabled by default. -- For each remaining hook, do **not** attempt to interpret or evaluate hook `condition` expressions: - - If the hook has no `condition` field, or it is null/empty, treat the hook as executable - - If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation -- When constructing slash commands from hook command names, replace dots (`.`) with hyphens (`-`). For example, `speckit.git.commit` → `/speckit-git-commit`. -- For each executable hook, output the following based on its `optional` flag: - - **Optional hook** (`optional: true`): - ``` - ## Extension Hooks - - **Optional Pre-Hook**: {extension} - Command: `/{command}` - Description: {description} - - Prompt: {prompt} - To execute: `/{command}` - ``` - - **Mandatory hook** (`optional: false`): - ``` - ## Extension Hooks - - **Automatic Pre-Hook**: {extension} - Executing: `/{command}` - EXECUTE_COMMAND: {command} - - Wait for the result of the hook command before proceeding to the Execution Steps. - ``` -- If no hooks are registered or `.specify/extensions.yml` does not exist, skip silently - -## Execution Steps - -1. **Setup**: Run `.specify/scripts/bash/check-prerequisites.sh --json` from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS list. - - All file paths must be absolute. - - For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). - -2. **IF EXISTS**: Load `.specify/memory/constitution.md` for project principles and governance constraints. - -3. **Clarify intent (dynamic)**: Derive up to THREE initial contextual clarifying questions (no pre-baked catalog). They MUST: - - Be generated from the user's phrasing + extracted signals from spec/plan/tasks - - Only ask about information that materially changes checklist content - - Be skipped individually if already unambiguous in `$ARGUMENTS` - - Prefer precision over breadth - - Generation algorithm: - 1. Extract signals: feature domain keywords (e.g., auth, latency, UX, API), risk indicators ("critical", "must", "compliance"), stakeholder hints ("QA", "review", "security team"), and explicit deliverables ("a11y", "rollback", "contracts"). - 2. Cluster signals into candidate focus areas (max 4) ranked by relevance. - 3. Identify probable audience & timing (author, reviewer, QA, release) if not explicit. - 4. Detect missing dimensions: scope breadth, depth/rigor, risk emphasis, exclusion boundaries, measurable acceptance criteria. - 5. Formulate questions chosen from these archetypes: - - Scope refinement (e.g., "Should this include integration touchpoints with X and Y or stay limited to local module correctness?") - - Risk prioritization (e.g., "Which of these potential risk areas should receive mandatory gating checks?") - - Depth calibration (e.g., "Is this a lightweight pre-commit sanity list or a formal release gate?") - - Audience framing (e.g., "Will this be used by the author only or peers during PR review?") - - Boundary exclusion (e.g., "Should we explicitly exclude performance tuning items this round?") - - Scenario class gap (e.g., "No recovery flows detected—are rollback / partial failure paths in scope?") - - Question formatting rules: - - If presenting options, generate a compact table with columns: Option | Candidate | Why It Matters - - Limit to A–E options maximum; omit table if a free-form answer is clearer - - Never ask the user to restate what they already said - - Avoid speculative categories (no hallucination). If uncertain, ask explicitly: "Confirm whether X belongs in scope." - - Defaults when interaction impossible: - - Depth: Standard - - Audience: Reviewer (PR) if code-related; Author otherwise - - Focus: Top 2 relevance clusters - - Output the questions (label Q1/Q2/Q3). After answers: if ≥2 scenario classes (Alternate / Exception / Recovery / Non-Functional domain) remain unclear, you MAY ask up to TWO more targeted follow‑ups (Q4/Q5) with a one-line justification each (e.g., "Unresolved recovery path risk"). Do not exceed five total questions. Skip escalation if user explicitly declines more. - -4. **Understand user request**: Combine `$ARGUMENTS` + clarifying answers: - - Derive checklist theme (e.g., security, review, deploy, ux) - - Consolidate explicit must-have items mentioned by user - - Map focus selections to category scaffolding - - Infer any missing context from spec/plan/tasks (do NOT hallucinate) - -5. **Load feature context**: Read from FEATURE_DIR: - - spec.md: Feature requirements and scope - - plan.md (if exists): Technical details, dependencies - - tasks.md (if exists): Implementation tasks - - **Context Loading Strategy**: - - Load only necessary portions relevant to active focus areas (avoid full-file dumping) - - Prefer summarizing long sections into concise scenario/requirement bullets - - Use progressive disclosure: add follow-on retrieval only if gaps detected - - If source docs are large, generate interim summary items instead of embedding raw text - -6. **Generate checklist** - Create "Unit Tests for Requirements": - - Create `FEATURE_DIR/checklists/` directory if it doesn't exist - - Generate unique checklist filename: - - Use short, descriptive name based on domain (e.g., `ux.md`, `api.md`, `security.md`) - - Format: `[domain].md` - - File handling behavior: - - If file does NOT exist: Create new file and number items starting from CHK001 - - If file exists: Append new items to existing file, continuing from the last CHK ID (e.g., if last item is CHK015, start new items at CHK016) - - Never delete or replace existing checklist content - always preserve and append - - **CORE PRINCIPLE - Test the Requirements, Not the Implementation**: - Every checklist item MUST evaluate the REQUIREMENTS THEMSELVES for: - - **Completeness**: Are all necessary requirements present? - - **Clarity**: Are requirements unambiguous and specific? - - **Consistency**: Do requirements align with each other? - - **Measurability**: Can requirements be objectively verified? - - **Coverage**: Are all scenarios/edge cases addressed? - - **Category Structure** - Group items by requirement quality dimensions: - - **Requirement Completeness** (Are all necessary requirements documented?) - - **Requirement Clarity** (Are requirements specific and unambiguous?) - - **Requirement Consistency** (Do requirements align without conflicts?) - - **Acceptance Criteria Quality** (Are success criteria measurable?) - - **Scenario Coverage** (Are all flows/cases addressed?) - - **Edge Case Coverage** (Are boundary conditions defined?) - - **Non-Functional Requirements** (Performance, Security, Accessibility, etc. - are they specified?) - - **Dependencies & Assumptions** (Are they documented and validated?) - - **Ambiguities & Conflicts** (What needs clarification?) - - **HOW TO WRITE CHECKLIST ITEMS - "Unit Tests for English"**: - - ❌ **WRONG** (Testing implementation): - - "Verify landing page displays 3 episode cards" - - "Test hover states work on desktop" - - "Confirm logo click navigates home" - - ✅ **CORRECT** (Testing requirements quality): - - "Are the exact number and layout of featured episodes specified?" [Completeness] - - "Is 'prominent display' quantified with specific sizing/positioning?" [Clarity] - - "Are hover state requirements consistent across all interactive elements?" [Consistency] - - "Are keyboard navigation requirements defined for all interactive UI?" [Coverage] - - "Is the fallback behavior specified when logo image fails to load?" [Edge Cases] - - "Are loading states defined for asynchronous episode data?" [Completeness] - - "Does the spec define visual hierarchy for competing UI elements?" [Clarity] - - **ITEM STRUCTURE**: - Each item should follow this pattern: - - Question format asking about requirement quality - - Focus on what's WRITTEN (or not written) in the spec/plan - - Include quality dimension in brackets [Completeness/Clarity/Consistency/etc.] - - Reference spec section `[Spec §X.Y]` when checking existing requirements - - Use `[Gap]` marker when checking for missing requirements - - **EXAMPLES BY QUALITY DIMENSION**: - - Completeness: - - "Are error handling requirements defined for all API failure modes? [Gap]" - - "Are accessibility requirements specified for all interactive elements? [Completeness]" - - "Are mobile breakpoint requirements defined for responsive layouts? [Gap]" - - Clarity: - - "Is 'fast loading' quantified with specific timing thresholds? [Clarity, Spec §NFR-2]" - - "Are 'related episodes' selection criteria explicitly defined? [Clarity, Spec §FR-5]" - - "Is 'prominent' defined with measurable visual properties? [Ambiguity, Spec §FR-4]" - - Consistency: - - "Do navigation requirements align across all pages? [Consistency, Spec §FR-10]" - - "Are card component requirements consistent between landing and detail pages? [Consistency]" - - Coverage: - - "Are requirements defined for zero-state scenarios (no episodes)? [Coverage, Edge Case]" - - "Are concurrent user interaction scenarios addressed? [Coverage, Gap]" - - "Are requirements specified for partial data loading failures? [Coverage, Exception Flow]" - - Measurability: - - "Are visual hierarchy requirements measurable/testable? [Acceptance Criteria, Spec §FR-1]" - - "Can 'balanced visual weight' be objectively verified? [Measurability, Spec §FR-2]" - - **Scenario Classification & Coverage** (Requirements Quality Focus): - - Check if requirements exist for: Primary, Alternate, Exception/Error, Recovery, Non-Functional scenarios - - For each scenario class, ask: "Are [scenario type] requirements complete, clear, and consistent?" - - If scenario class missing: "Are [scenario type] requirements intentionally excluded or missing? [Gap]" - - Include resilience/rollback when state mutation occurs: "Are rollback requirements defined for migration failures? [Gap]" - - **Traceability Requirements**: - - MINIMUM: ≥80% of items MUST include at least one traceability reference - - Each item should reference: spec section `[Spec §X.Y]`, or use markers: `[Gap]`, `[Ambiguity]`, `[Conflict]`, `[Assumption]` - - If no ID system exists: "Is a requirement & acceptance criteria ID scheme established? [Traceability]" - - **Surface & Resolve Issues** (Requirements Quality Problems): - Ask questions about the requirements themselves: - - Ambiguities: "Is the term 'fast' quantified with specific metrics? [Ambiguity, Spec §NFR-1]" - - Conflicts: "Do navigation requirements conflict between §FR-10 and §FR-10a? [Conflict]" - - Assumptions: "Is the assumption of 'always available podcast API' validated? [Assumption]" - - Dependencies: "Are external podcast API requirements documented? [Dependency, Gap]" - - Missing definitions: "Is 'visual hierarchy' defined with measurable criteria? [Gap]" - - **Content Consolidation**: - - Soft cap: If raw candidate items > 40, prioritize by risk/impact - - Merge near-duplicates checking the same requirement aspect - - If >5 low-impact edge cases, create one item: "Are edge cases X, Y, Z addressed in requirements? [Coverage]" - - **🚫 ABSOLUTELY PROHIBITED** - These make it an implementation test, not a requirements test: - - ❌ Any item starting with "Verify", "Test", "Confirm", "Check" + implementation behavior - - ❌ References to code execution, user actions, system behavior - - ❌ "Displays correctly", "works properly", "functions as expected" - - ❌ "Click", "navigate", "render", "load", "execute" - - ❌ Test cases, test plans, QA procedures - - ❌ Implementation details (frameworks, APIs, algorithms) - - **✅ REQUIRED PATTERNS** - These test requirements quality: - - ✅ "Are [requirement type] defined/specified/documented for [scenario]?" - - ✅ "Is [vague term] quantified/clarified with specific criteria?" - - ✅ "Are requirements consistent between [section A] and [section B]?" - - ✅ "Can [requirement] be objectively measured/verified?" - - ✅ "Are [edge cases/scenarios] addressed in requirements?" - - ✅ "Does the spec define [missing aspect]?" - -7. **Structure Reference**: Generate the checklist following the canonical template in `.specify/templates/checklist-template.md` for title, meta section, category headings, and ID formatting. If template is unavailable, use: H1 title, purpose/created meta lines, `##` category sections containing `- [ ] CHK### ` lines with globally incrementing IDs starting at CHK001. - -8. **Report**: Output full path to checklist file, item count, and summarize whether the run created a new file or appended to an existing one. Summarize: - - Focus areas selected - - Depth level - - Actor/timing - - Any explicit user-specified must-have items incorporated - -**Important**: Each `/speckit-checklist` command invocation uses a short, descriptive checklist filename and either creates a new file or appends to an existing one. This allows: - -- Multiple checklists of different types (e.g., `ux.md`, `test.md`, `security.md`) -- Simple, memorable filenames that indicate checklist purpose -- Easy identification and navigation in the `checklists/` folder - -To avoid clutter, use descriptive types and clean up obsolete checklists when done. - -## Example Checklist Types & Sample Items - -**UX Requirements Quality:** `ux.md` - -Sample items (testing the requirements, NOT the implementation): - -- "Are visual hierarchy requirements defined with measurable criteria? [Clarity, Spec §FR-1]" -- "Is the number and positioning of UI elements explicitly specified? [Completeness, Spec §FR-1]" -- "Are interaction state requirements (hover, focus, active) consistently defined? [Consistency]" -- "Are accessibility requirements specified for all interactive elements? [Coverage, Gap]" -- "Is fallback behavior defined when images fail to load? [Edge Case, Gap]" -- "Can 'prominent display' be objectively measured? [Measurability, Spec §FR-4]" - -**API Requirements Quality:** `api.md` - -Sample items: - -- "Are error response formats specified for all failure scenarios? [Completeness]" -- "Are rate limiting requirements quantified with specific thresholds? [Clarity]" -- "Are authentication requirements consistent across all endpoints? [Consistency]" -- "Are retry/timeout requirements defined for external dependencies? [Coverage, Gap]" -- "Is versioning strategy documented in requirements? [Gap]" - -**Performance Requirements Quality:** `performance.md` - -Sample items: - -- "Are performance requirements quantified with specific metrics? [Clarity]" -- "Are performance targets defined for all critical user journeys? [Coverage]" -- "Are performance requirements under different load conditions specified? [Completeness]" -- "Can performance requirements be objectively measured? [Measurability]" -- "Are degradation requirements defined for high-load scenarios? [Edge Case, Gap]" - -**Security Requirements Quality:** `security.md` - -Sample items: - -- "Are authentication requirements specified for all protected resources? [Coverage]" -- "Are data protection requirements defined for sensitive information? [Completeness]" -- "Is the threat model documented and requirements aligned to it? [Traceability]" -- "Are security requirements consistent with compliance obligations? [Consistency]" -- "Are security failure/breach response requirements defined? [Gap, Exception Flow]" - -## Anti-Examples: What NOT To Do - -**❌ WRONG - These test implementation, not requirements:** - -```markdown -- [ ] CHK001 - Verify landing page displays 3 episode cards [Spec §FR-001] -- [ ] CHK002 - Test hover states work correctly on desktop [Spec §FR-003] -- [ ] CHK003 - Confirm logo click navigates to home page [Spec §FR-010] -- [ ] CHK004 - Check that related episodes section shows 3-5 items [Spec §FR-005] -``` - -**✅ CORRECT - These test requirements quality:** - -```markdown -- [ ] CHK001 - Are the number and layout of featured episodes explicitly specified? [Completeness, Spec §FR-001] -- [ ] CHK002 - Are hover state requirements consistently defined for all interactive elements? [Consistency, Spec §FR-003] -- [ ] CHK003 - Are navigation requirements clear for all clickable brand elements? [Clarity, Spec §FR-010] -- [ ] CHK004 - Is the selection criteria for related episodes documented? [Gap, Spec §FR-005] -- [ ] CHK005 - Are loading state requirements defined for asynchronous episode data? [Gap] -- [ ] CHK006 - Can "visual hierarchy" requirements be objectively measured? [Measurability, Spec §FR-001] -``` - -**Key Differences:** - -- Wrong: Tests if the system works correctly -- Correct: Tests if the requirements are written correctly -- Wrong: Verification of behavior -- Correct: Validation of requirement quality -- Wrong: "Does it do X?" -- Correct: "Is X clearly specified?" - -## Post-Execution Checks - -**Check for extension hooks (after checklist generation)**: -Check if `.specify/extensions.yml` exists in the project root. -- If it exists, read it and look for entries under the `hooks.after_checklist` key -- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally -- Filter out hooks where `enabled` is explicitly `false`. Treat hooks without an `enabled` field as enabled by default. -- For each remaining hook, do **not** attempt to interpret or evaluate hook `condition` expressions: - - If the hook has no `condition` field, or it is null/empty, treat the hook as executable - - If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation -- When constructing slash commands from hook command names, replace dots (`.`) with hyphens (`-`). For example, `speckit.git.commit` → `/speckit-git-commit`. -- For each executable hook, output the following based on its `optional` flag: - - **Optional hook** (`optional: true`): - ``` - ## Extension Hooks - - **Optional Hook**: {extension} - Command: `/{command}` - Description: {description} - - Prompt: {prompt} - To execute: `/{command}` - ``` - - **Mandatory hook** (`optional: false`): - ``` - ## Extension Hooks - - **Automatic Hook**: {extension} - Executing: `/{command}` - EXECUTE_COMMAND: {command} - ``` -- If no hooks are registered or `.specify/extensions.yml` does not exist, skip silently diff --git a/.agents/skills/speckit-clarify/SKILL.md b/.agents/skills/speckit-clarify/SKILL.md deleted file mode 100644 index 6147d45..0000000 --- a/.agents/skills/speckit-clarify/SKILL.md +++ /dev/null @@ -1,283 +0,0 @@ ---- -name: "speckit-clarify" -description: "Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec." -compatibility: "Requires spec-kit project structure with .specify/ directory" -metadata: - author: "github-spec-kit" - source: "templates/commands/clarify.md" ---- - - -## User Input - -```text -$ARGUMENTS -``` - -You **MUST** consider the user input before proceeding (if not empty). - -## Pre-Execution Checks - -**Check for extension hooks (before clarification)**: -- Check if `.specify/extensions.yml` exists in the project root. -- If it exists, read it and look for entries under the `hooks.before_clarify` key -- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally -- Filter out hooks where `enabled` is explicitly `false`. Treat hooks without an `enabled` field as enabled by default. -- For each remaining hook, do **not** attempt to interpret or evaluate hook `condition` expressions: - - If the hook has no `condition` field, or it is null/empty, treat the hook as executable - - If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation -- When constructing slash commands from hook command names, replace dots (`.`) with hyphens (`-`). For example, `speckit.git.commit` → `/speckit-git-commit`. -- For each executable hook, output the following based on its `optional` flag: - - **Optional hook** (`optional: true`): - ``` - ## Extension Hooks - - **Optional Pre-Hook**: {extension} - Command: `/{command}` - Description: {description} - - Prompt: {prompt} - To execute: `/{command}` - ``` - - **Mandatory hook** (`optional: false`): - ``` - ## Extension Hooks - - **Automatic Pre-Hook**: {extension} - Executing: `/{command}` - EXECUTE_COMMAND: {command} - - Wait for the result of the hook command before proceeding to the Outline. - ``` -- If no hooks are registered or `.specify/extensions.yml` does not exist, skip silently - -## Outline - -Goal: Detect and reduce ambiguity or missing decision points in the active feature specification and record the clarifications directly in the spec file. - -Note: This clarification workflow is expected to run (and be completed) BEFORE invoking `/speckit-plan`. If the user explicitly states they are skipping clarification (e.g., exploratory spike), you may proceed, but must warn that downstream rework risk increases. - -Execution steps: - -1. Run `.specify/scripts/bash/check-prerequisites.sh --json --paths-only` from repo root **once** (combined `--json --paths-only` mode / `-Json -PathsOnly`). Parse minimal JSON payload fields: - - `FEATURE_DIR` - - `FEATURE_SPEC` - - (Optionally capture `IMPL_PLAN`, `TASKS` for future chained flows.) - - If JSON parsing fails, abort and instruct user to re-run `/speckit-specify` or verify feature branch environment. - - For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). - -2. **IF EXISTS**: Load `.specify/memory/constitution.md` for project principles and governance constraints. - -3. Load the current spec file. Perform a structured ambiguity & coverage scan using this taxonomy. For each category, mark status: Clear / Partial / Missing. Produce an internal coverage map used for prioritization (do not output raw map unless no questions will be asked). - - Functional Scope & Behavior: - - Core user goals & success criteria - - Explicit out-of-scope declarations - - User roles / personas differentiation - - Domain & Data Model: - - Entities, attributes, relationships - - Identity & uniqueness rules - - Lifecycle/state transitions - - Data volume / scale assumptions - - Interaction & UX Flow: - - Critical user journeys / sequences - - Error/empty/loading states - - Accessibility or localization notes - - Non-Functional Quality Attributes: - - Performance (latency, throughput targets) - - Scalability (horizontal/vertical, limits) - - Reliability & availability (uptime, recovery expectations) - - Observability (logging, metrics, tracing signals) - - Security & privacy (authN/Z, data protection, threat assumptions) - - Compliance / regulatory constraints (if any) - - Integration & External Dependencies: - - External services/APIs and failure modes - - Data import/export formats - - Protocol/versioning assumptions - - Edge Cases & Failure Handling: - - Negative scenarios - - Rate limiting / throttling - - Conflict resolution (e.g., concurrent edits) - - Constraints & Tradeoffs: - - Technical constraints (language, storage, hosting) - - Explicit tradeoffs or rejected alternatives - - Terminology & Consistency: - - Canonical glossary terms - - Avoided synonyms / deprecated terms - - Completion Signals: - - Acceptance criteria testability - - Measurable Definition of Done style indicators - - Misc / Placeholders: - - TODO markers / unresolved decisions - - Ambiguous adjectives ("robust", "intuitive") lacking quantification - - For each category with Partial or Missing status, add a candidate question opportunity unless: - - Clarification would not materially change implementation or validation strategy - - Information is better deferred to planning phase (note internally) - -4. Generate (internally) a prioritized queue of candidate clarification questions (maximum 5). Do NOT output them all at once. Apply these constraints: - - Maximum of 5 total questions across the whole session. - - Each question must be answerable with EITHER: - - A short multiple‑choice selection (2–5 distinct, mutually exclusive options), OR - - A one-word / short‑phrase answer (explicitly constrain: "Answer in <=5 words"). - - Only include questions whose answers materially impact architecture, data modeling, task decomposition, test design, UX behavior, operational readiness, or compliance validation. - - Ensure category coverage balance: attempt to cover the highest impact unresolved categories first; avoid asking two low-impact questions when a single high-impact area (e.g., security posture) is unresolved. - - Exclude questions already answered, trivial stylistic preferences, or plan-level execution details (unless blocking correctness). - - Favor clarifications that reduce downstream rework risk or prevent misaligned acceptance tests. - - If more than 5 categories remain unresolved, select the top 5 by (Impact * Uncertainty) heuristic. - -5. Sequential questioning loop (interactive): - - Present EXACTLY ONE question at a time. - - For multiple‑choice questions: - - **Analyze all options** and determine the **most suitable option** based on: - - Best practices for the project type - - Common patterns in similar implementations - - Risk reduction (security, performance, maintainability) - - Alignment with any explicit project goals or constraints visible in the spec - - Present your **recommended option prominently** at the top with clear reasoning (1-2 sentences explaining why this is the best choice). - - Format as: `**Recommended:** Option [X] - ` - - Then render all options as a Markdown table: - - | Option | Description | - |--------|-------------| - | A |