timsquad 2.1.0 → 3.4.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.ko.md +288 -0
- package/README.md +170 -763
- package/dist/commands/compile.d.ts +3 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +170 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/daemon.d.ts +7 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +229 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +235 -14
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/full.js +2 -2
- package/dist/commands/full.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +118 -22
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge.d.ts +3 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +316 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/log.d.ts +27 -0
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +965 -0
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/meta-index.d.ts +3 -0
- package/dist/commands/meta-index.d.ts.map +1 -0
- package/dist/commands/meta-index.js +401 -0
- package/dist/commands/meta-index.js.map +1 -0
- package/dist/commands/metrics.d.ts.map +1 -1
- package/dist/commands/metrics.js +239 -4
- package/dist/commands/metrics.js.map +1 -1
- package/dist/commands/retro.js +154 -6
- package/dist/commands/retro.js.map +1 -1
- package/dist/commands/skills.d.ts +12 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +231 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/upgrade.d.ts +8 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +292 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workflow.d.ts +3 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +607 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/daemon/context-writer.d.ts +16 -0
- package/dist/daemon/context-writer.d.ts.map +1 -0
- package/dist/daemon/context-writer.js +35 -0
- package/dist/daemon/context-writer.js.map +1 -0
- package/dist/daemon/entry.d.ts +7 -0
- package/dist/daemon/entry.d.ts.map +1 -0
- package/dist/daemon/entry.js +17 -0
- package/dist/daemon/entry.js.map +1 -0
- package/dist/daemon/event-queue.d.ts +52 -0
- package/dist/daemon/event-queue.d.ts.map +1 -0
- package/dist/daemon/event-queue.js +255 -0
- package/dist/daemon/event-queue.js.map +1 -0
- package/dist/daemon/file-watcher.d.ts +19 -0
- package/dist/daemon/file-watcher.d.ts.map +1 -0
- package/dist/daemon/file-watcher.js +87 -0
- package/dist/daemon/file-watcher.js.map +1 -0
- package/dist/daemon/index.d.ts +29 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +296 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/jsonl-watcher.d.ts +49 -0
- package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
- package/dist/daemon/jsonl-watcher.js +258 -0
- package/dist/daemon/jsonl-watcher.js.map +1 -0
- package/dist/daemon/meta-cache.d.ts +63 -0
- package/dist/daemon/meta-cache.d.ts.map +1 -0
- package/dist/daemon/meta-cache.js +249 -0
- package/dist/daemon/meta-cache.js.map +1 -0
- package/dist/daemon/session-state.d.ts +19 -0
- package/dist/daemon/session-state.d.ts.map +1 -0
- package/dist/daemon/session-state.js +132 -0
- package/dist/daemon/session-state.js.map +1 -0
- package/dist/daemon/shutdown.d.ts +21 -0
- package/dist/daemon/shutdown.d.ts.map +1 -0
- package/dist/daemon/shutdown.js +164 -0
- package/dist/daemon/shutdown.js.map +1 -0
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-composer.d.ts +38 -0
- package/dist/lib/agent-composer.d.ts.map +1 -0
- package/dist/lib/agent-composer.js +128 -0
- package/dist/lib/agent-composer.js.map +1 -0
- package/dist/lib/agent-generator.d.ts +22 -0
- package/dist/lib/agent-generator.d.ts.map +1 -0
- package/dist/lib/agent-generator.js +150 -0
- package/dist/lib/agent-generator.js.map +1 -0
- package/dist/lib/ast-parser.d.ts +11 -0
- package/dist/lib/ast-parser.d.ts.map +1 -0
- package/dist/lib/ast-parser.js +282 -0
- package/dist/lib/ast-parser.js.map +1 -0
- package/dist/lib/compile-rules.d.ts +66 -0
- package/dist/lib/compile-rules.d.ts.map +1 -0
- package/dist/lib/compile-rules.js +114 -0
- package/dist/lib/compile-rules.js.map +1 -0
- package/dist/lib/compiler.d.ts +105 -0
- package/dist/lib/compiler.d.ts.map +1 -0
- package/dist/lib/compiler.js +368 -0
- package/dist/lib/compiler.js.map +1 -0
- package/dist/lib/config.d.ts +7 -2
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +34 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/meta-index.d.ts +19 -0
- package/dist/lib/meta-index.d.ts.map +1 -0
- package/dist/lib/meta-index.js +573 -0
- package/dist/lib/meta-index.js.map +1 -0
- package/dist/lib/project.js +1 -1
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/skill-generator.d.ts +32 -0
- package/dist/lib/skill-generator.d.ts.map +1 -0
- package/dist/lib/skill-generator.js +187 -0
- package/dist/lib/skill-generator.js.map +1 -0
- package/dist/lib/template.d.ts +16 -2
- package/dist/lib/template.d.ts.map +1 -1
- package/dist/lib/template.js +115 -20
- package/dist/lib/template.js.map +1 -1
- package/dist/lib/ui-index.d.ts +12 -0
- package/dist/lib/ui-index.d.ts.map +1 -0
- package/dist/lib/ui-index.js +239 -0
- package/dist/lib/ui-index.js.map +1 -0
- package/dist/lib/ui-parser.d.ts +12 -0
- package/dist/lib/ui-parser.d.ts.map +1 -0
- package/dist/lib/ui-parser.js +472 -0
- package/dist/lib/ui-parser.js.map +1 -0
- package/dist/lib/update-check.d.ts +6 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +121 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/upgrade-backup.d.ts +33 -0
- package/dist/lib/upgrade-backup.d.ts.map +1 -0
- package/dist/lib/upgrade-backup.js +101 -0
- package/dist/lib/upgrade-backup.js.map +1 -0
- package/dist/lib/version.d.ts +19 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +35 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/workflow-state.d.ts +48 -0
- package/dist/lib/workflow-state.d.ts.map +1 -0
- package/dist/lib/workflow-state.js +67 -0
- package/dist/lib/workflow-state.js.map +1 -0
- package/dist/types/config.d.ts +103 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +184 -9
- package/dist/types/config.js.map +1 -1
- package/dist/types/feedback.d.ts +7 -0
- package/dist/types/feedback.d.ts.map +1 -1
- package/dist/types/feedback.js +1 -1
- package/dist/types/feedback.js.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/meta-index.d.ts +146 -0
- package/dist/types/meta-index.d.ts.map +1 -0
- package/dist/types/meta-index.js +7 -0
- package/dist/types/meta-index.js.map +1 -0
- package/dist/types/project.d.ts +19 -3
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/project.js +23 -0
- package/dist/types/project.js.map +1 -1
- package/dist/types/task-log.d.ts +208 -0
- package/dist/types/task-log.d.ts.map +1 -0
- package/dist/types/task-log.js +6 -0
- package/dist/types/task-log.js.map +1 -0
- package/dist/types/ui-meta.d.ts +118 -0
- package/dist/types/ui-meta.d.ts.map +1 -0
- package/dist/types/ui-meta.js +7 -0
- package/dist/types/ui-meta.js.map +1 -0
- package/package.json +12 -4
- package/templates/base/agents/base/tsq-architect.md +68 -0
- package/templates/base/agents/base/tsq-dba.md +56 -0
- package/templates/base/agents/base/tsq-designer.md +72 -0
- package/templates/base/agents/base/tsq-developer.md +67 -0
- package/templates/base/agents/base/tsq-qa.md +55 -0
- package/templates/base/agents/base/tsq-security.md +65 -0
- package/templates/base/agents/overlays/domain/general-web/_common.md +11 -0
- package/templates/base/agents/overlays/domain/mobile/_common.md +13 -0
- package/templates/base/agents/overlays/platform/claude-code.md +12 -0
- package/templates/base/config.template.yaml +213 -0
- package/templates/base/knowledge/checklists/accessibility.md +37 -0
- package/templates/base/knowledge/checklists/architecture-review.md +28 -0
- package/templates/base/knowledge/checklists/database-standards.md +84 -0
- package/templates/base/knowledge/checklists/design-reference.md +97 -0
- package/templates/base/knowledge/checklists/security.md +50 -0
- package/templates/base/knowledge/checklists/ssot-validation.md +19 -0
- package/templates/base/knowledge/domains/_template.md +16 -0
- package/templates/base/knowledge/platforms/_template.md +16 -0
- package/templates/base/knowledge/templates/sequence-report.md +44 -0
- package/templates/base/knowledge/templates/task-result.md +105 -0
- package/templates/base/skills/_template/SKILL.md +59 -0
- package/templates/base/skills/_template/references/_template.md +35 -0
- package/templates/base/skills/_template/rules/_sections.md +34 -0
- package/templates/base/skills/_template/rules/_template.md +32 -0
- package/templates/base/skills/_template/scripts/_template.sh +31 -0
- package/templates/base/skills/architecture/SKILL.md +54 -0
- package/templates/base/skills/architecture/references/adr-template.md +50 -0
- package/templates/base/skills/architecture/references/api-design.md +64 -0
- package/templates/base/skills/backend/node/SKILL.md +81 -0
- package/templates/base/skills/backend/node/rules/async-patterns.md +81 -0
- package/templates/base/skills/backend/node/rules/deployment.md +33 -0
- package/templates/base/skills/backend/node/rules/env-config.md +41 -0
- package/templates/base/skills/backend/node/rules/error-handling.md +83 -0
- package/templates/base/skills/backend/node/rules/hono-app-setup.md +98 -0
- package/templates/base/skills/backend/node/rules/jwt-auth.md +76 -0
- package/templates/base/skills/backend/node/rules/middleware.md +56 -0
- package/templates/base/skills/backend/node/rules/testing.md +82 -0
- package/templates/base/skills/coding/SKILL.md +47 -0
- package/templates/base/skills/coding/rules/patterns.md +81 -0
- package/templates/base/skills/controller/SKILL.md +111 -0
- package/templates/base/skills/controller/references/README.md +35 -0
- package/templates/base/skills/controller/rules/README.md +18 -0
- package/templates/base/skills/database/SKILL.md +98 -0
- package/templates/base/skills/database/prisma/SKILL.md +57 -0
- package/templates/base/skills/database/prisma/rules/queries.md +133 -0
- package/templates/base/skills/database/prisma/rules/schema-design.md +80 -0
- package/templates/base/skills/frontend/nextjs/SKILL.md +59 -0
- package/templates/base/skills/frontend/nextjs/rules/app-router.md +138 -0
- package/templates/base/skills/frontend/react/SKILL.md +86 -0
- package/templates/base/skills/frontend/react/rules/_sections.md +88 -0
- package/templates/base/skills/frontend/react/rules/anti-patterns.md +67 -0
- package/templates/base/skills/frontend/react/rules/async-api-routes.md +38 -0
- package/templates/base/skills/frontend/react/rules/async-defer-await.md +80 -0
- package/templates/base/skills/frontend/react/rules/async-dependencies.md +36 -0
- package/templates/base/skills/frontend/react/rules/async-parallel.md +28 -0
- package/templates/base/skills/frontend/react/rules/async-suspense-boundaries.md +99 -0
- package/templates/base/skills/frontend/react/rules/bundle-barrel-imports.md +59 -0
- package/templates/base/skills/frontend/react/rules/bundle-defer-third-party.md +49 -0
- package/templates/base/skills/frontend/react/rules/bundle-dynamic-imports.md +35 -0
- package/templates/base/skills/frontend/react/rules/component-conventions.md +74 -0
- package/templates/base/skills/frontend/react/rules/js-combine-iterations.md +32 -0
- package/templates/base/skills/frontend/react/rules/js-early-exit.md +50 -0
- package/templates/base/skills/frontend/react/rules/js-index-maps.md +37 -0
- package/templates/base/skills/frontend/react/rules/js-set-map-lookups.md +24 -0
- package/templates/base/skills/frontend/react/rules/rendering-conditional-render.md +40 -0
- package/templates/base/skills/frontend/react/rules/rendering-content-visibility.md +38 -0
- package/templates/base/skills/frontend/react/rules/rendering-hoist-jsx.md +46 -0
- package/templates/base/skills/frontend/react/rules/rerender-defer-reads.md +39 -0
- package/templates/base/skills/frontend/react/rules/rerender-derived-state.md +29 -0
- package/templates/base/skills/frontend/react/rules/rerender-memo.md +44 -0
- package/templates/base/skills/frontend/react/rules/rerender-transitions.md +40 -0
- package/templates/base/skills/frontend/react/rules/server-after-nonblocking.md +73 -0
- package/templates/base/skills/frontend/react/rules/server-cache-react.md +26 -0
- package/templates/base/skills/frontend/react/rules/server-parallel-fetching.md +79 -0
- package/templates/base/skills/frontend/react/rules/state-location.md +55 -0
- package/templates/base/skills/methodology/bdd/SKILL.md +69 -0
- package/templates/base/skills/methodology/bdd/rules/gherkin-patterns.md +113 -0
- package/templates/base/skills/methodology/ddd/SKILL.md +74 -0
- package/templates/base/skills/methodology/ddd/rules/strategic-patterns.md +98 -0
- package/templates/base/skills/methodology/debugging/SKILL.md +60 -0
- package/templates/base/skills/methodology/debugging/references/root-cause-tracing.md +84 -0
- package/templates/base/skills/methodology/tdd/SKILL.md +66 -0
- package/templates/base/skills/methodology/tdd/rules/real-world-example.md +88 -0
- package/templates/base/skills/methodology/tdd/rules/techniques.md +185 -0
- package/templates/base/skills/mobile/dart/SKILL.md +69 -0
- package/templates/base/skills/mobile/dart/rules/async-patterns.md +112 -0
- package/templates/base/skills/mobile/dart/rules/code-style.md +96 -0
- package/templates/base/skills/mobile/dart/rules/null-safety.md +84 -0
- package/templates/base/skills/mobile/dart/rules/type-system.md +111 -0
- package/templates/base/skills/mobile/flutter/SKILL.md +89 -0
- package/templates/base/skills/mobile/flutter/ci-cd/SKILL.md +82 -0
- package/templates/base/skills/mobile/flutter/ci-cd/references/ci-cd-pipeline.md +314 -0
- package/templates/base/skills/mobile/flutter/ci-cd/rules/code-signing.md +106 -0
- package/templates/base/skills/mobile/flutter/ci-cd/rules/codemagic-setup.md +116 -0
- package/templates/base/skills/mobile/flutter/ci-cd/rules/fastlane-setup.md +105 -0
- package/templates/base/skills/mobile/flutter/ci-cd/rules/github-actions.md +112 -0
- package/templates/base/skills/mobile/flutter/ci-cd/rules/store-deployment.md +106 -0
- package/templates/base/skills/mobile/flutter/ci-cd/rules/versioning.md +107 -0
- package/templates/base/skills/mobile/flutter/i18n/SKILL.md +78 -0
- package/templates/base/skills/mobile/flutter/i18n/references/i18n-architecture.md +225 -0
- package/templates/base/skills/mobile/flutter/i18n/rules/arb-files.md +182 -0
- package/templates/base/skills/mobile/flutter/i18n/rules/locale-switching.md +226 -0
- package/templates/base/skills/mobile/flutter/i18n/rules/localization-setup.md +137 -0
- package/templates/base/skills/mobile/flutter/i18n/rules/plural-gender.md +159 -0
- package/templates/base/skills/mobile/flutter/i18n/rules/text-direction.md +199 -0
- package/templates/base/skills/mobile/flutter/monitoring/SKILL.md +81 -0
- package/templates/base/skills/mobile/flutter/monitoring/references/monitoring-architecture.md +269 -0
- package/templates/base/skills/mobile/flutter/monitoring/rules/analytics.md +227 -0
- package/templates/base/skills/mobile/flutter/monitoring/rules/crashlytics-setup.md +195 -0
- package/templates/base/skills/mobile/flutter/monitoring/rules/logging.md +258 -0
- package/templates/base/skills/mobile/flutter/monitoring/rules/performance-monitoring.md +248 -0
- package/templates/base/skills/mobile/flutter/monitoring/rules/sentry-integration.md +249 -0
- package/templates/base/skills/mobile/flutter/networking/SKILL.md +88 -0
- package/templates/base/skills/mobile/flutter/networking/references/api-client-architecture.md +305 -0
- package/templates/base/skills/mobile/flutter/networking/rules/caching.md +212 -0
- package/templates/base/skills/mobile/flutter/networking/rules/connectivity.md +213 -0
- package/templates/base/skills/mobile/flutter/networking/rules/dio-setup.md +159 -0
- package/templates/base/skills/mobile/flutter/networking/rules/error-handling.md +209 -0
- package/templates/base/skills/mobile/flutter/networking/rules/interceptors.md +205 -0
- package/templates/base/skills/mobile/flutter/networking/rules/retrofit-patterns.md +194 -0
- package/templates/base/skills/mobile/flutter/push-notifications/SKILL.md +87 -0
- package/templates/base/skills/mobile/flutter/push-notifications/references/notification-architecture.md +340 -0
- package/templates/base/skills/mobile/flutter/push-notifications/references/platform-setup.md +286 -0
- package/templates/base/skills/mobile/flutter/push-notifications/rules/background-processing.md +308 -0
- package/templates/base/skills/mobile/flutter/push-notifications/rules/deep-linking.md +217 -0
- package/templates/base/skills/mobile/flutter/push-notifications/rules/fcm-setup.md +164 -0
- package/templates/base/skills/mobile/flutter/push-notifications/rules/local-notifications.md +262 -0
- package/templates/base/skills/mobile/flutter/push-notifications/rules/notification-handling.md +210 -0
- package/templates/base/skills/mobile/flutter/push-notifications/rules/notification-permissions.md +246 -0
- package/templates/base/skills/mobile/flutter/push-notifications/rules/rich-notifications.md +320 -0
- package/templates/base/skills/mobile/flutter/references/freezed-patterns.md +162 -0
- package/templates/base/skills/mobile/flutter/references/project-structure.md +170 -0
- package/templates/base/skills/mobile/flutter/rules/animations.md +112 -0
- package/templates/base/skills/mobile/flutter/rules/architecture.md +121 -0
- package/templates/base/skills/mobile/flutter/rules/navigation-routing.md +117 -0
- package/templates/base/skills/mobile/flutter/rules/performance.md +112 -0
- package/templates/base/skills/mobile/flutter/rules/platform-adaptive.md +126 -0
- package/templates/base/skills/mobile/flutter/rules/state-management.md +110 -0
- package/templates/base/skills/mobile/flutter/rules/testing.md +131 -0
- package/templates/base/skills/mobile/flutter/rules/widget-conventions.md +122 -0
- package/templates/base/skills/mobile/flutter/security/SKILL.md +86 -0
- package/templates/base/skills/mobile/flutter/security/references/mobile-security-checklist.md +168 -0
- package/templates/base/skills/mobile/flutter/security/rules/api-key-protection.md +206 -0
- package/templates/base/skills/mobile/flutter/security/rules/authentication.md +248 -0
- package/templates/base/skills/mobile/flutter/security/rules/data-protection.md +271 -0
- package/templates/base/skills/mobile/flutter/security/rules/obfuscation.md +213 -0
- package/templates/base/skills/mobile/flutter/security/rules/secure-storage.md +171 -0
- package/templates/base/skills/mobile/flutter/security/rules/ssl-pinning.md +197 -0
- package/templates/base/skills/planning/SKILL.md +58 -0
- package/templates/base/skills/planning/references/prd-guide.md +47 -0
- package/templates/base/skills/planning/references/requirements-guide.md +46 -0
- package/templates/base/skills/prompt-engineering/SKILL.md +103 -0
- package/templates/base/skills/retrospective/SKILL.md +102 -0
- package/templates/base/skills/security/SKILL.md +55 -0
- package/templates/base/skills/security/rules/owasp-examples.md +119 -0
- package/templates/base/skills/security/scripts/check-secrets.sh +55 -0
- package/templates/base/skills/testing/SKILL.md +63 -0
- package/templates/base/skills/testing/references/testing-patterns.md +103 -0
- package/templates/base/skills/tsq-protocol/SKILL.md +51 -0
- package/templates/base/skills/typescript/SKILL.md +67 -0
- package/templates/base/skills/typescript/rules/type-patterns.md +135 -0
- package/templates/base/skills/typescript/rules/utility-types.md +76 -0
- package/templates/base/skills/ui-design/SKILL.md +70 -0
- package/templates/{common → base}/timsquad/feedback/routing-rules.yaml +1 -1
- package/templates/{common → base}/timsquad/retrospective/metrics/metrics-schema.json +46 -1
- package/templates/platforms/claude-code/CLAUDE.md.template +89 -0
- package/templates/platforms/claude-code/rules/adr-rules.md +32 -0
- package/templates/platforms/claude-code/rules/feedback-routing.md +18 -0
- package/templates/platforms/claude-code/rules/phase-management.md +23 -0
- package/templates/platforms/claude-code/rules/reporting-format.md +26 -0
- package/templates/platforms/claude-code/rules/sequence-management.md +72 -0
- package/templates/platforms/claude-code/rules/workspace-sync.md +33 -0
- package/templates/platforms/claude-code/scripts/completion-guard.sh +57 -0
- package/templates/platforms/claude-code/scripts/phase-guard.sh +79 -0
- package/templates/platforms/claude-code/settings.json +98 -0
- package/templates/project-types/api-backend/config.yaml +227 -0
- package/templates/project-types/api-backend/process/workflow.xml +214 -0
- package/templates/project-types/fintech/config.yaml +151 -0
- package/templates/project-types/fintech/process/workflow.xml +316 -0
- package/templates/project-types/infra/config.yaml +327 -0
- package/templates/project-types/infra/process/workflow.xml +296 -0
- package/templates/project-types/mobile-app/config.yaml +123 -0
- package/templates/project-types/mobile-app/process/workflow.xml +191 -0
- package/templates/project-types/platform/config.yaml +254 -0
- package/templates/project-types/platform/process/workflow.xml +254 -0
- package/templates/project-types/web-app/config.yaml +198 -0
- package/templates/project-types/web-app/process/workflow.xml +210 -0
- package/templates/project-types/web-service/config.yaml +136 -0
- package/templates/project-types/web-service/process/workflow.xml +184 -0
- package/templates/common/CLAUDE.md.template +0 -254
- package/templates/common/claude/agents/tsq-dba.md +0 -311
- package/templates/common/claude/agents/tsq-designer.md +0 -323
- package/templates/common/claude/agents/tsq-developer.md +0 -177
- package/templates/common/claude/agents/tsq-planner.md +0 -190
- package/templates/common/claude/agents/tsq-prompter.md +0 -356
- package/templates/common/claude/agents/tsq-qa.md +0 -168
- package/templates/common/claude/agents/tsq-retro.md +0 -193
- package/templates/common/claude/agents/tsq-security.md +0 -221
- package/templates/common/claude/hooks/auto-metrics.sh +0 -165
- package/templates/common/claude/hooks/auto-worklog.sh +0 -245
- package/templates/common/claude/hooks/event-logger.sh +0 -208
- package/templates/common/claude/settings.json +0 -86
- package/templates/common/claude/skills/architecture/SKILL.md +0 -123
- package/templates/common/claude/skills/backend/node/SKILL.md +0 -1015
- package/templates/common/claude/skills/coding/SKILL.md +0 -171
- package/templates/common/claude/skills/database/prisma/SKILL.md +0 -357
- package/templates/common/claude/skills/frontend/nextjs/SKILL.md +0 -279
- package/templates/common/claude/skills/frontend/react/SKILL.md +0 -1729
- package/templates/common/claude/skills/methodology/bdd/SKILL.md +0 -234
- package/templates/common/claude/skills/methodology/ddd/SKILL.md +0 -311
- package/templates/common/claude/skills/methodology/tdd/SKILL.md +0 -512
- package/templates/common/claude/skills/planning/SKILL.md +0 -90
- package/templates/common/claude/skills/security/SKILL.md +0 -234
- package/templates/common/claude/skills/testing/SKILL.md +0 -146
- package/templates/common/claude/skills/typescript/SKILL.md +0 -435
- package/templates/common/config.template.yaml +0 -132
- /package/templates/{common → base}/timsquad/architectures/clean/ARCHITECTURE.md +0 -0
- /package/templates/{common → base}/timsquad/architectures/clean/backend.xml +0 -0
- /package/templates/{common → base}/timsquad/architectures/clean/frontend.xml +0 -0
- /package/templates/{common → base}/timsquad/architectures/fsd/ARCHITECTURE.md +0 -0
- /package/templates/{common → base}/timsquad/architectures/fsd/frontend.xml +0 -0
- /package/templates/{common → base}/timsquad/architectures/hexagonal/ARCHITECTURE.md +0 -0
- /package/templates/{common → base}/timsquad/architectures/hexagonal/backend.xml +0 -0
- /package/templates/{common → base}/timsquad/constraints/competency-framework.xml +0 -0
- /package/templates/{common → base}/timsquad/constraints/ssot-schema.xml +0 -0
- /package/templates/{common → base}/timsquad/feedback/feedback-router.sh +0 -0
- /package/templates/{common → base}/timsquad/generators/data-design.xml +0 -0
- /package/templates/{common → base}/timsquad/generators/prd.xml +0 -0
- /package/templates/{common → base}/timsquad/generators/requirements.xml +0 -0
- /package/templates/{common → base}/timsquad/generators/service-spec.xml +0 -0
- /package/templates/{common → base}/timsquad/logs/_example.md +0 -0
- /package/templates/{common → base}/timsquad/logs/_template.md +0 -0
- /package/templates/{common → base}/timsquad/patterns/cqrs.xml +0 -0
- /package/templates/{common → base}/timsquad/patterns/event-sourcing.xml +0 -0
- /package/templates/{common → base}/timsquad/patterns/repository.xml +0 -0
- /package/templates/{common → base}/timsquad/process/phase-checklist.yaml +0 -0
- /package/templates/{common → base}/timsquad/process/state-machine.xml +0 -0
- /package/templates/{common → base}/timsquad/process/validation-rules.xml +0 -0
- /package/templates/{common → base}/timsquad/process/workflow-base.xml +0 -0
- /package/templates/{common → base}/timsquad/retrospective/cycle-report.template.md +0 -0
- /package/templates/{common → base}/timsquad/retrospective/patterns/failure-patterns.md +0 -0
- /package/templates/{common → base}/timsquad/retrospective/patterns/success-patterns.md +0 -0
- /package/templates/{common → base}/timsquad/retrospective/retrospective-config.xml +0 -0
- /package/templates/{common → base}/timsquad/retrospective/retrospective-state.xml +0 -0
- /package/templates/{common → base}/timsquad/ssot/adr/ADR-000-template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/adr/ADR-001-example.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/data-design.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/deployment-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/env-config.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/error-codes.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/functional-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/glossary.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/integration-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/planning.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/prd.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/requirements.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/security-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/service-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/test-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/ui-ux-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/state/workspace.xml +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flutter
|
|
3
|
+
description: Flutter 개발 가이드라인. Feature-first 아키텍처, Riverpod 상태관리, 위젯 합성, 성능 최적화, 크로스플랫폼 적응형 UI.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
tags: [flutter, mobile, cross-platform, riverpod]
|
|
6
|
+
user-invocable: false
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Flutter Development Guidelines
|
|
10
|
+
|
|
11
|
+
Flutter 3.x 기반 크로스플랫폼 앱 개발 가이드라인.
|
|
12
|
+
Flutter 공식 아키텍처 가이드 + VGV + Riverpod 커뮤니티 베스트 프랙티스 종합.
|
|
13
|
+
|
|
14
|
+
## Philosophy
|
|
15
|
+
|
|
16
|
+
- 위젯은 합성 — 상속보다 조합, 작게 분리
|
|
17
|
+
- 상태는 구조화 — Riverpod로 선언적 의존성
|
|
18
|
+
- Feature-first — 기능 단위로 코드 구성
|
|
19
|
+
- const 는 습관 — 불필요한 리빌드 원천 차단
|
|
20
|
+
|
|
21
|
+
## Resources
|
|
22
|
+
|
|
23
|
+
8개 규칙 + 2개 참조. 카테고리별 배치.
|
|
24
|
+
|
|
25
|
+
| Priority | Type | Resource | Description |
|
|
26
|
+
|----------|------|----------|-------------|
|
|
27
|
+
| CRITICAL | rule | [widget-conventions](rules/widget-conventions.md) | 위젯 합성, const, Key 사용, 크기 제한 |
|
|
28
|
+
| CRITICAL | rule | [state-management](rules/state-management.md) | Riverpod Provider/Notifier 패턴 |
|
|
29
|
+
| CRITICAL | rule | [architecture](rules/architecture.md) | Feature-first + MVVM + Data/Domain/UI 레이어 |
|
|
30
|
+
| HIGH | rule | [navigation-routing](rules/navigation-routing.md) | go_router 선언적 라우팅, 딥링크 |
|
|
31
|
+
| HIGH | rule | [performance](rules/performance.md) | 리빌드 최적화, ListView.builder, Impeller |
|
|
32
|
+
| HIGH | rule | [testing](rules/testing.md) | Widget/Golden/Integration 테스트, mocktail |
|
|
33
|
+
| MEDIUM | rule | [platform-adaptive](rules/platform-adaptive.md) | 적응형 UI, 반응형 레이아웃, 플랫폼 분기 |
|
|
34
|
+
| MEDIUM | rule | [animations](rules/animations.md) | 암시적/명시적 애니메이션, Hero, 모션 가이드라인 |
|
|
35
|
+
| — | ref | [project-structure](references/project-structure.md) | Feature-first + melos 모노레포 구조 |
|
|
36
|
+
| — | ref | [freezed-patterns](references/freezed-patterns.md) | freezed + json_serializable 불변 모델 |
|
|
37
|
+
|
|
38
|
+
## Quick Rules
|
|
39
|
+
|
|
40
|
+
### 위젯
|
|
41
|
+
- `const` 생성자 적극 사용 (리빌드 스킵)
|
|
42
|
+
- 위젯 200줄 이하 — 초과 시 추출
|
|
43
|
+
- build() 안에서 로직 금지 — ViewModel/Notifier로 분리
|
|
44
|
+
- `GlobalKey` 남용 금지 — `ValueKey`/`ObjectKey` 사용
|
|
45
|
+
|
|
46
|
+
### 상태 관리 (Riverpod)
|
|
47
|
+
- UI 상태: `NotifierProvider` + `Notifier`
|
|
48
|
+
- 서버 데이터: `FutureProvider` / `StreamProvider`
|
|
49
|
+
- 파생 상태: `Provider` (computed)
|
|
50
|
+
- `ref.watch` (build), `ref.listen` (side effect), `ref.read` (이벤트 핸들러)
|
|
51
|
+
|
|
52
|
+
### 아키텍처
|
|
53
|
+
- Feature-first 구조 (`lib/features/{name}/`)
|
|
54
|
+
- 각 feature: `data/` + `domain/` + `presentation/`
|
|
55
|
+
- Repository 패턴으로 데이터 소스 추상화
|
|
56
|
+
- DTO ↔ Domain Model 변환 레이어
|
|
57
|
+
|
|
58
|
+
### 네비게이션
|
|
59
|
+
- go_router 선언적 라우팅
|
|
60
|
+
- 딥링크/유니버설 링크 지원
|
|
61
|
+
- 중첩 네비게이션 (ShellRoute)
|
|
62
|
+
|
|
63
|
+
### 성능
|
|
64
|
+
- `const` 위젯 우선
|
|
65
|
+
- 리스트는 `ListView.builder` (lazy)
|
|
66
|
+
- `RepaintBoundary`로 리빌드 범위 격리
|
|
67
|
+
- 이미지: `cached_network_image` + 적절한 크기
|
|
68
|
+
|
|
69
|
+
### 테스트
|
|
70
|
+
- Widget test: `testWidgets` + `pumpWidget`
|
|
71
|
+
- Unit test: Notifier/Repository 독립 테스트
|
|
72
|
+
- Integration test: `patrol` (네이티브 상호작용)
|
|
73
|
+
- Mock: `mocktail` (코드 생성 불필요)
|
|
74
|
+
|
|
75
|
+
## Checklist
|
|
76
|
+
|
|
77
|
+
| Priority | Item |
|
|
78
|
+
|----------|------|
|
|
79
|
+
| CRITICAL | const 생성자 사용 (lint: prefer_const_constructors) |
|
|
80
|
+
| CRITICAL | Riverpod Provider 타입 올바르게 선택 |
|
|
81
|
+
| CRITICAL | Feature-first 디렉토리 구조 |
|
|
82
|
+
| CRITICAL | build() 안에 비즈니스 로직 없음 |
|
|
83
|
+
| HIGH | ListView.builder 사용 (10+ 아이템) |
|
|
84
|
+
| HIGH | Repository 패턴 (데이터 소스 추상화) |
|
|
85
|
+
| HIGH | go_router 선언적 라우팅 |
|
|
86
|
+
| HIGH | Widget test 작성 |
|
|
87
|
+
| MEDIUM | RepaintBoundary 적용 (복잡한 서브트리) |
|
|
88
|
+
| MEDIUM | 적응형 UI (Material + Cupertino) |
|
|
89
|
+
| MEDIUM | 이미지 캐싱 + 적절한 리사이징 |
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ci-cd
|
|
3
|
+
description: |
|
|
4
|
+
Flutter CI/CD 파이프라인 가이드라인.
|
|
5
|
+
코드 서명, Fastlane, Codemagic, GitHub Actions,
|
|
6
|
+
스토어 배포, 버전 관리 자동화.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
tags: [flutter, ci-cd, fastlane, codemagic, github-actions, code-signing, deployment]
|
|
9
|
+
user-invocable: false
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# CI/CD Pipeline
|
|
13
|
+
|
|
14
|
+
Flutter 앱의 빌드, 테스트, 서명, 배포 자동화 가이드.
|
|
15
|
+
iOS/Android 코드 서명, Fastlane/Codemagic/GitHub Actions 파이프라인, 스토어 배포, 버전 관리.
|
|
16
|
+
|
|
17
|
+
## Philosophy
|
|
18
|
+
|
|
19
|
+
- 배포는 자동 — 수동 빌드/업로드 금지, CI가 전부 처리
|
|
20
|
+
- 서명은 분리 — 코드 서명 키를 CI 환경에 안전하게 주입, 레포에 절대 포함 금지
|
|
21
|
+
- 버전은 규칙 — 시맨틱 버저닝 + 빌드 넘버 자동 증가
|
|
22
|
+
- 환경은 격리 — dev/staging/prod 설정 분리, 환경별 독립 파이프라인
|
|
23
|
+
|
|
24
|
+
## Resources
|
|
25
|
+
|
|
26
|
+
6개 규칙 + 1개 참조. CI/CD 파이프라인 전체를 커버.
|
|
27
|
+
|
|
28
|
+
| Priority | Type | Resource | Description |
|
|
29
|
+
|----------|------|----------|-------------|
|
|
30
|
+
| CRITICAL | rule | [code-signing](rules/code-signing.md) | iOS provisioning profile, Android keystore, 인증서 관리 |
|
|
31
|
+
| HIGH | rule | [fastlane-setup](rules/fastlane-setup.md) | Fastfile 구성, match, supply, deliver, .env 관리 |
|
|
32
|
+
| HIGH | rule | [codemagic-setup](rules/codemagic-setup.md) | codemagic.yaml 워크플로우, 환경변수, 빌드 트리거 |
|
|
33
|
+
| HIGH | rule | [github-actions](rules/github-actions.md) | Flutter 빌드 워크플로우, 테스트-빌드-업로드 파이프라인 |
|
|
34
|
+
| HIGH | rule | [store-deployment](rules/store-deployment.md) | TestFlight, Play Store tracks, 메타데이터, 단계적 출시 |
|
|
35
|
+
| MEDIUM | rule | [versioning](rules/versioning.md) | 시맨틱 버저닝, 빌드 넘버 자동 증가, CHANGELOG, git 태그 |
|
|
36
|
+
| — | ref | [ci-cd-pipeline](references/ci-cd-pipeline.md) | 파이프라인 아키텍처, 환경 설정, 시크릿 관리, 롤백 |
|
|
37
|
+
|
|
38
|
+
## Quick Rules
|
|
39
|
+
|
|
40
|
+
### 코드 서명
|
|
41
|
+
- iOS: `match` 로 인증서/프로필 Git 저장소 관리 (팀 공유)
|
|
42
|
+
- Android: keystore 파일을 CI 환경변수로 base64 주입
|
|
43
|
+
- 개발용/배포용 인증서 분리 — 동일 인증서 사용 금지
|
|
44
|
+
- 서명 키를 레포에 커밋 금지 — `.gitignore` 에 `*.keystore`, `*.jks`, `*.p12` 추가
|
|
45
|
+
|
|
46
|
+
### Fastlane
|
|
47
|
+
- `Fastfile` 에 `ios`/`android` 레인 분리
|
|
48
|
+
- `match` → iOS 인증서 자동 관리 (Git 저장소 or Google Cloud Storage)
|
|
49
|
+
- `supply` → Google Play 업로드, `deliver` → App Store 업로드
|
|
50
|
+
- `.env` 로 환경별 설정 분리 (`.env.production`, `.env.staging`)
|
|
51
|
+
|
|
52
|
+
### CI/CD 플랫폼
|
|
53
|
+
- Codemagic: Flutter 네이티브 지원, `codemagic.yaml` 로 워크플로우 정의
|
|
54
|
+
- GitHub Actions: `subosito/flutter-action` 으로 Flutter 설치, pub cache 캐시 필수
|
|
55
|
+
- 빌드 트리거: 태그 푸시 (`v*`) → 릴리스, PR → 테스트만
|
|
56
|
+
|
|
57
|
+
### 스토어 배포
|
|
58
|
+
- TestFlight: `deliver` 또는 `app-store-connect` API로 업로드
|
|
59
|
+
- Play Store: internal → closed → open → production 트랙 순서
|
|
60
|
+
- 단계적 출시 (staged rollout): 1% → 5% → 20% → 50% → 100%
|
|
61
|
+
- 메타데이터 (스크린샷, 설명) 코드로 관리 (`fastlane/metadata/`)
|
|
62
|
+
|
|
63
|
+
### 버전 관리
|
|
64
|
+
- `pubspec.yaml`: `version: major.minor.patch+buildNumber`
|
|
65
|
+
- 빌드 넘버: CI에서 자동 증가 (`--build-number=$CI_BUILD_NUMBER`)
|
|
66
|
+
- git 태그: `v1.2.3` 형식, 릴리스 빌드와 1:1 매핑
|
|
67
|
+
|
|
68
|
+
## Checklist
|
|
69
|
+
|
|
70
|
+
| Priority | Item |
|
|
71
|
+
|----------|------|
|
|
72
|
+
| CRITICAL | iOS 코드 서명 (provisioning profile + 인증서) CI에 구성 |
|
|
73
|
+
| CRITICAL | Android keystore CI 환경변수로 안전하게 주입 |
|
|
74
|
+
| CRITICAL | 서명 키/인증서 `.gitignore` 에 추가 확인 |
|
|
75
|
+
| CRITICAL | CI 파이프라인: test → build → deploy 순서 보장 |
|
|
76
|
+
| HIGH | Fastlane match 설정 (iOS 인증서 팀 공유) |
|
|
77
|
+
| HIGH | 환경별 (dev/staging/prod) 빌드 설정 분리 |
|
|
78
|
+
| HIGH | 스토어 업로드 자동화 (TestFlight + Play Store) |
|
|
79
|
+
| HIGH | 빌드 넘버 자동 증가 전략 구현 |
|
|
80
|
+
| MEDIUM | CHANGELOG 자동 생성 (conventional commits 기반) |
|
|
81
|
+
| MEDIUM | 슬랙/디스코드 배포 알림 설정 |
|
|
82
|
+
| MEDIUM | 롤백 절차 문서화 및 테스트 |
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: CI/CD Pipeline Architecture
|
|
3
|
+
category: reference
|
|
4
|
+
source: internal
|
|
5
|
+
tags: pipeline, architecture, environment, secrets, rollback, diagram
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# CI/CD Pipeline Architecture
|
|
9
|
+
|
|
10
|
+
파이프라인 아키텍처 다이어그램, 환경별 설정, 시크릿 관리 전략, 롤백 절차.
|
|
11
|
+
|
|
12
|
+
## Key Concepts
|
|
13
|
+
|
|
14
|
+
- **파이프라인**: 코드 변경 → 테스트 → 빌드 → 배포 자동화 흐름
|
|
15
|
+
- **환경 분리**: dev/staging/prod 각각 독립 설정, 시크릿, 배포 대상
|
|
16
|
+
- **시크릿 관리**: 서명 키, API 키, 서비스 계정을 안전하게 저장/주입
|
|
17
|
+
- **롤백**: 문제 발생 시 이전 버전으로 빠르게 복원
|
|
18
|
+
|
|
19
|
+
## Pipeline Architecture
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
코드 변경 흐름:
|
|
23
|
+
|
|
24
|
+
Feature Branch PR (→ main) Tag (v*) Store
|
|
25
|
+
│ │ │ │
|
|
26
|
+
▼ ▼ ▼ ▼
|
|
27
|
+
[Lint] [Test] [Build] [Deploy]
|
|
28
|
+
분석 + 단위 테스트 iOS IPA TestFlight
|
|
29
|
+
포맷 검사 통합 테스트 Android AAB Play Store
|
|
30
|
+
커버리지 단계적 출시
|
|
31
|
+
│ │ │ │
|
|
32
|
+
▼ ▼ ▼ ▼
|
|
33
|
+
피드백 PR 체크 Artifact Notify
|
|
34
|
+
즉시 알림 통과/실패 저장 Slack/Email
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 상세 파이프라인
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
PR 생성/업데이트:
|
|
41
|
+
├─ 1. Checkout
|
|
42
|
+
├─ 2. flutter pub get (캐시)
|
|
43
|
+
├─ 3. flutter analyze
|
|
44
|
+
├─ 4. flutter test --coverage
|
|
45
|
+
├─ 5. 커버리지 리포트 업로드
|
|
46
|
+
└─ 6. PR 상태 업데이트 (pass/fail)
|
|
47
|
+
|
|
48
|
+
태그 푸시 (v1.2.3):
|
|
49
|
+
├─ 1. Checkout + 태그에서 버전 추출
|
|
50
|
+
├─ 2. flutter pub get
|
|
51
|
+
├─ 3. flutter test (릴리스 전 최종 검증)
|
|
52
|
+
├─ 4. 코드 서명 설정
|
|
53
|
+
│ ├─ iOS: match (provisioning + 인증서)
|
|
54
|
+
│ └─ Android: keystore 복원
|
|
55
|
+
├─ 5. 빌드
|
|
56
|
+
│ ├─ iOS: flutter build ipa --release
|
|
57
|
+
│ └─ Android: flutter build appbundle --release
|
|
58
|
+
├─ 6. 스토어 업로드
|
|
59
|
+
│ ├─ iOS: upload_to_testflight
|
|
60
|
+
│ └─ Android: supply (internal track)
|
|
61
|
+
├─ 7. Artifact 저장 (30일)
|
|
62
|
+
├─ 8. GitHub Release 생성 + CHANGELOG
|
|
63
|
+
└─ 9. Slack 알림 (#deployments)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Environment Configuration
|
|
67
|
+
|
|
68
|
+
### Flavor/Scheme 기반 환경 분리
|
|
69
|
+
|
|
70
|
+
```dart
|
|
71
|
+
// lib/config/environment.dart
|
|
72
|
+
enum Environment { dev, staging, prod }
|
|
73
|
+
|
|
74
|
+
class EnvConfig {
|
|
75
|
+
final Environment env;
|
|
76
|
+
final String apiBaseUrl;
|
|
77
|
+
final String sentryDsn;
|
|
78
|
+
final bool enableAnalytics;
|
|
79
|
+
|
|
80
|
+
const EnvConfig({
|
|
81
|
+
required this.env,
|
|
82
|
+
required this.apiBaseUrl,
|
|
83
|
+
required this.sentryDsn,
|
|
84
|
+
required this.enableAnalytics,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
static const dev = EnvConfig(
|
|
88
|
+
env: Environment.dev,
|
|
89
|
+
apiBaseUrl: 'https://api-dev.yourapp.com',
|
|
90
|
+
sentryDsn: '',
|
|
91
|
+
enableAnalytics: false,
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
static const staging = EnvConfig(
|
|
95
|
+
env: Environment.staging,
|
|
96
|
+
apiBaseUrl: 'https://api-staging.yourapp.com',
|
|
97
|
+
sentryDsn: 'https://xxx@sentry.io/staging',
|
|
98
|
+
enableAnalytics: false,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
static const prod = EnvConfig(
|
|
102
|
+
env: Environment.prod,
|
|
103
|
+
apiBaseUrl: 'https://api.yourapp.com',
|
|
104
|
+
sentryDsn: 'https://xxx@sentry.io/prod',
|
|
105
|
+
enableAnalytics: true,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### --dart-define 으로 빌드 시 주입
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# Dev
|
|
114
|
+
flutter run \
|
|
115
|
+
--dart-define=ENV=dev \
|
|
116
|
+
--dart-define=API_URL=https://api-dev.yourapp.com
|
|
117
|
+
|
|
118
|
+
# Staging
|
|
119
|
+
flutter build apk \
|
|
120
|
+
--dart-define=ENV=staging \
|
|
121
|
+
--dart-define=API_URL=https://api-staging.yourapp.com
|
|
122
|
+
|
|
123
|
+
# Production
|
|
124
|
+
flutter build appbundle \
|
|
125
|
+
--release \
|
|
126
|
+
--dart-define=ENV=prod \
|
|
127
|
+
--dart-define=API_URL=https://api.yourapp.com
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
```dart
|
|
131
|
+
// 빌드 시 주입된 값 읽기
|
|
132
|
+
class BuildConfig {
|
|
133
|
+
static const env = String.fromEnvironment('ENV', defaultValue: 'dev');
|
|
134
|
+
static const apiUrl = String.fromEnvironment('API_URL');
|
|
135
|
+
|
|
136
|
+
static bool get isProduction => env == 'prod';
|
|
137
|
+
static bool get isDev => env == 'dev';
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### CI 환경별 워크플로우
|
|
142
|
+
|
|
143
|
+
```yaml
|
|
144
|
+
# Codemagic: 환경별 워크플로우
|
|
145
|
+
workflows:
|
|
146
|
+
dev-build:
|
|
147
|
+
triggering:
|
|
148
|
+
events: [push]
|
|
149
|
+
branch_patterns:
|
|
150
|
+
- pattern: "develop"
|
|
151
|
+
scripts:
|
|
152
|
+
- name: Build dev
|
|
153
|
+
script: |
|
|
154
|
+
flutter build apk --dart-define=ENV=dev
|
|
155
|
+
|
|
156
|
+
staging-build:
|
|
157
|
+
triggering:
|
|
158
|
+
events: [push]
|
|
159
|
+
branch_patterns:
|
|
160
|
+
- pattern: "release/*"
|
|
161
|
+
scripts:
|
|
162
|
+
- name: Build staging
|
|
163
|
+
script: |
|
|
164
|
+
flutter build appbundle --dart-define=ENV=staging
|
|
165
|
+
|
|
166
|
+
prod-build:
|
|
167
|
+
triggering:
|
|
168
|
+
events: [tag]
|
|
169
|
+
tag_patterns:
|
|
170
|
+
- pattern: "v*"
|
|
171
|
+
scripts:
|
|
172
|
+
- name: Build production
|
|
173
|
+
script: |
|
|
174
|
+
flutter build appbundle --release --dart-define=ENV=prod
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Secrets Management
|
|
178
|
+
|
|
179
|
+
### 시크릿 분류
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
Level 1 — 최고 기밀 (유출 시 앱 탈취):
|
|
183
|
+
├── Android keystore + 비밀번호
|
|
184
|
+
├── iOS Distribution 인증서 + 개인키
|
|
185
|
+
└── App Store Connect API Key (.p8)
|
|
186
|
+
|
|
187
|
+
Level 2 — 기밀 (유출 시 서비스 악용):
|
|
188
|
+
├── Google Play 서비스 계정 키
|
|
189
|
+
├── Firebase 서비스 계정
|
|
190
|
+
├── Sentry DSN (prod)
|
|
191
|
+
└── match 암호화 비밀번호
|
|
192
|
+
|
|
193
|
+
Level 3 — 일반 (유출 시 정보 노출):
|
|
194
|
+
├── Slack Webhook URL
|
|
195
|
+
├── Codecov Token
|
|
196
|
+
└── Firebase App ID
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 시크릿 저장 위치
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
GitHub Actions:
|
|
203
|
+
Repository > Settings > Secrets and variables > Actions
|
|
204
|
+
├── Repository secrets (레포 전체)
|
|
205
|
+
└── Environment secrets (환경별 분리)
|
|
206
|
+
├── production (승인 필요 설정 가능)
|
|
207
|
+
└── staging
|
|
208
|
+
|
|
209
|
+
Codemagic:
|
|
210
|
+
App Settings > Environment variables
|
|
211
|
+
├── Variable groups (그룹별 관리)
|
|
212
|
+
└── Secure 체크 → 로그에 마스킹
|
|
213
|
+
|
|
214
|
+
Fastlane:
|
|
215
|
+
.env 파일 (로컬) + CI 환경변수 (CI)
|
|
216
|
+
├── .env.default (공통, .gitignore)
|
|
217
|
+
└── .env.production (.gitignore)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 시크릿 접근 제한
|
|
221
|
+
|
|
222
|
+
```yaml
|
|
223
|
+
# GitHub Actions: 환경별 보호 규칙
|
|
224
|
+
# Repository > Settings > Environments > production
|
|
225
|
+
# ├── Required reviewers: 2명
|
|
226
|
+
# ├── Wait timer: 5분
|
|
227
|
+
# └── Deployment branches: main only
|
|
228
|
+
|
|
229
|
+
jobs:
|
|
230
|
+
deploy-production:
|
|
231
|
+
runs-on: ubuntu-latest
|
|
232
|
+
environment: production # 승인 필요
|
|
233
|
+
steps:
|
|
234
|
+
- name: Deploy
|
|
235
|
+
env:
|
|
236
|
+
# production 환경의 시크릿만 접근 가능
|
|
237
|
+
KEYSTORE: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
|
|
238
|
+
run: ...
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Rollback Procedures
|
|
242
|
+
|
|
243
|
+
### iOS 롤백
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
App Store:
|
|
247
|
+
1. 이전 버전으로 롤백 불가 (Apple 정책)
|
|
248
|
+
2. 대안: 핫픽스 빌드를 새 버전으로 긴급 제출
|
|
249
|
+
- Expedited Review 요청 (App Store Connect)
|
|
250
|
+
- 심사 시간: 보통 24시간 → 긴급 시 수시간
|
|
251
|
+
3. TestFlight: 이전 빌드 재활성화 가능
|
|
252
|
+
|
|
253
|
+
긴급 핫픽스 절차:
|
|
254
|
+
git checkout -b hotfix/v1.2.4 v1.2.3
|
|
255
|
+
# 수정 적용
|
|
256
|
+
git tag v1.2.4
|
|
257
|
+
git push origin v1.2.4
|
|
258
|
+
# → CI 자동 빌드 → TestFlight 업로드 → 긴급 심사 요청
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Android 롤백
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
Play Store:
|
|
265
|
+
1. Console > Release > Production > Release history
|
|
266
|
+
2. 이전 릴리스의 "..." > "Release to Production"
|
|
267
|
+
(이전 버전을 새 릴리스로 재배포)
|
|
268
|
+
3. 또는 단계적 출시 중이라면 "Halt rollout"
|
|
269
|
+
|
|
270
|
+
자동 롤백 (Fastlane):
|
|
271
|
+
lane :rollback do |options|
|
|
272
|
+
version_code = options[:version_code]
|
|
273
|
+
# Play Store에서 이전 AAB 다운로드 후 재배포
|
|
274
|
+
# 또는 CI artifact에서 이전 빌드 가져와 재업로드
|
|
275
|
+
supply(
|
|
276
|
+
track: "production",
|
|
277
|
+
rollout: "1.0",
|
|
278
|
+
version_code: version_code,
|
|
279
|
+
json_key: ENV["GOOGLE_PLAY_JSON_KEY_PATH"],
|
|
280
|
+
)
|
|
281
|
+
end
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### 롤백 판단 기준
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
즉시 롤백 (< 1시간 이내 판단):
|
|
288
|
+
├── 크래시율 > 2% (이전 버전 대비 3배 이상 증가)
|
|
289
|
+
├── ANR 비율 > 1%
|
|
290
|
+
├── 결제/인증 등 핵심 기능 장애
|
|
291
|
+
└── 데이터 손실 발생
|
|
292
|
+
|
|
293
|
+
모니터링 후 판단 (24시간):
|
|
294
|
+
├── 크래시율 1-2%
|
|
295
|
+
├── 특정 기기/OS 버전에서만 발생
|
|
296
|
+
├── 사용자 리뷰 평점 급락
|
|
297
|
+
└── 비핵심 기능 장애
|
|
298
|
+
|
|
299
|
+
유지 + 핫픽스:
|
|
300
|
+
├── 크래시율 < 1% (경미)
|
|
301
|
+
├── UI 버그 (기능 작동)
|
|
302
|
+
└── 성능 저하 (크래시 아님)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Common Pitfalls
|
|
306
|
+
|
|
307
|
+
1. **빌드 넘버 충돌**: iOS/Android 빌드 넘버를 별도 관리 → 동일 CI 변수 사용 권장
|
|
308
|
+
2. **캐시 오염**: Flutter/Gradle/CocoaPods 캐시가 오래되면 빌드 실패 → 주기적 캐시 무효화
|
|
309
|
+
3. **시크릿 로그 노출**: `echo $SECRET` → CI 로그에 노출 → 항상 마스킹 확인
|
|
310
|
+
4. **인증서 만료**: match 인증서 1년 만료 → 알림 설정 필수
|
|
311
|
+
5. **Xcode 버전 차이**: CI와 로컬 Xcode 버전 불일치 → `xcode: 16.2` 고정
|
|
312
|
+
6. **Gradle 메모리**: Android 빌드 OOM → `org.gradle.jvmargs=-Xmx4g` 설정
|
|
313
|
+
7. **동시 빌드**: 같은 브랜치 여러 빌드 → `cancel_previous_builds` 설정
|
|
314
|
+
8. **태그 실수**: 잘못된 태그 푸시 → production 빌드 트리거 → 태그 보호 규칙 설정
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Code Signing
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: "서명 누락 → 스토어 업로드 불가, 키 유출 → 앱 탈취 위험"
|
|
5
|
+
tags: code-signing, ios, android, provisioning, keystore, match
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Code Signing
|
|
9
|
+
|
|
10
|
+
**Impact: CRITICAL (서명 누락 → 스토어 업로드 불가, 키 유출 → 앱 탈취 위험)**
|
|
11
|
+
|
|
12
|
+
iOS provisioning profile, Android keystore 관리. CI 환경에서 안전한 서명 키 주입.
|
|
13
|
+
|
|
14
|
+
### iOS 코드 서명 (match)
|
|
15
|
+
|
|
16
|
+
**Incorrect (수동 관리):**
|
|
17
|
+
```
|
|
18
|
+
Xcode > Automatically manage signing 체크
|
|
19
|
+
→ 개발자마다 다른 profile, CI 빌드 실패, 인증서 충돌
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (match로 중앙 관리):**
|
|
23
|
+
```ruby
|
|
24
|
+
# fastlane/Matchfile
|
|
25
|
+
git_url(ENV["MATCH_GIT_URL"])
|
|
26
|
+
storage_mode("git")
|
|
27
|
+
type("appstore")
|
|
28
|
+
app_identifier("com.yourapp.id")
|
|
29
|
+
|
|
30
|
+
# CI에서 실행
|
|
31
|
+
create_keychain(
|
|
32
|
+
name: "ci_keychain",
|
|
33
|
+
password: ENV["KEYCHAIN_PASSWORD"],
|
|
34
|
+
default_keychain: true, unlock: true, timeout: 3600,
|
|
35
|
+
)
|
|
36
|
+
match(
|
|
37
|
+
type: "appstore",
|
|
38
|
+
keychain_name: "ci_keychain",
|
|
39
|
+
keychain_password: ENV["KEYCHAIN_PASSWORD"],
|
|
40
|
+
readonly: true, # CI에서는 readonly — 인증서 생성 금지
|
|
41
|
+
)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Android 코드 서명
|
|
45
|
+
|
|
46
|
+
**Incorrect (keystore를 레포에 포함):**
|
|
47
|
+
```
|
|
48
|
+
android/app/release.keystore # 절대 금지!
|
|
49
|
+
android/key.properties # 비밀번호 하드코딩
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Correct (CI 환경변수로 주입):**
|
|
53
|
+
```groovy
|
|
54
|
+
// android/app/build.gradle
|
|
55
|
+
android {
|
|
56
|
+
signingConfigs {
|
|
57
|
+
release {
|
|
58
|
+
if (System.getenv("ANDROID_KEYSTORE_BASE64")) {
|
|
59
|
+
storeFile file("../release.keystore")
|
|
60
|
+
storePassword System.getenv("ANDROID_KEYSTORE_PASSWORD")
|
|
61
|
+
keyAlias System.getenv("ANDROID_KEY_ALIAS")
|
|
62
|
+
keyPassword System.getenv("ANDROID_KEY_PASSWORD")
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# CI에서 keystore 복원
|
|
71
|
+
echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > android/release.keystore
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 개발/배포 인증서 분리
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
├── Development — 디버그/테스트 (iOS provisioning, Android debug.keystore)
|
|
78
|
+
├── Ad Hoc — 내부 테스트 배포 (iOS only)
|
|
79
|
+
└── Distribution — 스토어 제출 (iOS App Store, Android release.keystore)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 키 로테이션
|
|
83
|
+
|
|
84
|
+
- iOS: Apple 인증서 1년 만료 → `match nuke distribution` → `match appstore`
|
|
85
|
+
- Android: Play App Signing 활성화 → Google이 앱 서명 키 관리, upload key만 팀 관리
|
|
86
|
+
- Upload Key 분실 시 → Google Play Console에서 리셋 요청
|
|
87
|
+
|
|
88
|
+
### .gitignore 필수 항목
|
|
89
|
+
|
|
90
|
+
```gitignore
|
|
91
|
+
*.mobileprovision
|
|
92
|
+
*.p12
|
|
93
|
+
*.cer
|
|
94
|
+
*.keystore
|
|
95
|
+
*.jks
|
|
96
|
+
key.properties
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 규칙
|
|
100
|
+
|
|
101
|
+
- `match` 로 iOS 인증서 관리 — 수동 Xcode 서명 관리 금지
|
|
102
|
+
- CI에서 `match(readonly: true)` — 인증서 신규 생성 방지
|
|
103
|
+
- Android keystore → base64 → CI 환경변수 주입
|
|
104
|
+
- `key.properties` `.gitignore` 추가 — 레포 커밋 금지
|
|
105
|
+
- Play App Signing 활성화 — upload key만 팀 관리
|
|
106
|
+
- 개발/배포 인증서 분리 — 동일 인증서 혼용 금지
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Codemagic Setup
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: "CI 미구성 → 수동 빌드, Codemagic 자동화 → Flutter 네이티브 지원"
|
|
5
|
+
tags: codemagic, ci, yaml, workflow, artifact, trigger
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Codemagic Setup
|
|
9
|
+
|
|
10
|
+
**Impact: HIGH (CI 미구성 → 수동 빌드, Codemagic 자동화 → Flutter 네이티브 지원)**
|
|
11
|
+
|
|
12
|
+
codemagic.yaml 워크플로우 구성, 환경변수/시크릿, 빌드 트리거, artifact 배포.
|
|
13
|
+
|
|
14
|
+
### codemagic.yaml
|
|
15
|
+
|
|
16
|
+
**Incorrect (GUI만 사용):**
|
|
17
|
+
```
|
|
18
|
+
Codemagic 웹 UI에서 빌드 설정 → 코드 관리 불가, 롤백 불가, 팀 차이 발생
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Correct (yaml 코드 관리):**
|
|
22
|
+
```yaml
|
|
23
|
+
workflows:
|
|
24
|
+
ios-release:
|
|
25
|
+
name: iOS Release
|
|
26
|
+
max_build_duration: 30
|
|
27
|
+
instance_type: mac_mini_m2
|
|
28
|
+
environment:
|
|
29
|
+
groups: [ios_credentials, app_store_connect]
|
|
30
|
+
flutter: "3.27.0"
|
|
31
|
+
xcode: latest
|
|
32
|
+
cocoapods: default
|
|
33
|
+
triggering:
|
|
34
|
+
events: [tag]
|
|
35
|
+
tag_patterns:
|
|
36
|
+
- pattern: "v*"
|
|
37
|
+
include: true
|
|
38
|
+
cancel_previous_builds: true
|
|
39
|
+
scripts:
|
|
40
|
+
- name: Set up code signing
|
|
41
|
+
script: |
|
|
42
|
+
keychain initialize
|
|
43
|
+
app-store-connect fetch-signing-files $(BUNDLE_ID) --type IOS_APP_STORE --create
|
|
44
|
+
keychain add-certificates
|
|
45
|
+
- name: Build
|
|
46
|
+
script: |
|
|
47
|
+
xcode-project use-profiles
|
|
48
|
+
flutter packages pub get
|
|
49
|
+
flutter build ipa --release --build-number=$PROJECT_BUILD_NUMBER \
|
|
50
|
+
--export-options-plist=/Users/builder/export_options.plist
|
|
51
|
+
artifacts:
|
|
52
|
+
- build/ios/ipa/*.ipa
|
|
53
|
+
publishing:
|
|
54
|
+
app_store_connect:
|
|
55
|
+
auth: integration
|
|
56
|
+
submit_to_testflight: true
|
|
57
|
+
slack:
|
|
58
|
+
channel: "#deployments"
|
|
59
|
+
notify:
|
|
60
|
+
success: true
|
|
61
|
+
failure: true
|
|
62
|
+
|
|
63
|
+
android-release:
|
|
64
|
+
name: Android Release
|
|
65
|
+
instance_type: linux_x2
|
|
66
|
+
environment:
|
|
67
|
+
groups: [android_credentials, google_play]
|
|
68
|
+
flutter: "3.27.0"
|
|
69
|
+
triggering:
|
|
70
|
+
events: [tag]
|
|
71
|
+
tag_patterns:
|
|
72
|
+
- pattern: "v*"
|
|
73
|
+
scripts:
|
|
74
|
+
- name: Set up signing + Build
|
|
75
|
+
script: |
|
|
76
|
+
echo $ANDROID_KEYSTORE_BASE64 | base64 --decode > android/release.keystore
|
|
77
|
+
flutter packages pub get
|
|
78
|
+
flutter build appbundle --release --build-number=$PROJECT_BUILD_NUMBER
|
|
79
|
+
artifacts:
|
|
80
|
+
- build/app/outputs/bundle/release/*.aab
|
|
81
|
+
publishing:
|
|
82
|
+
google_play:
|
|
83
|
+
credentials: $GCLOUD_SERVICE_ACCOUNT_CREDENTIALS
|
|
84
|
+
track: internal
|
|
85
|
+
|
|
86
|
+
test:
|
|
87
|
+
name: Test & Analyze
|
|
88
|
+
instance_type: linux_x2
|
|
89
|
+
environment:
|
|
90
|
+
flutter: "3.27.0"
|
|
91
|
+
triggering:
|
|
92
|
+
events: [pull_request]
|
|
93
|
+
scripts:
|
|
94
|
+
- name: Test
|
|
95
|
+
script: |
|
|
96
|
+
flutter packages pub get && flutter analyze && flutter test --coverage
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 환경변수/시크릿
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
Codemagic UI > Environment variables:
|
|
103
|
+
├── ios_credentials: CERTIFICATE_PRIVATE_KEY, BUNDLE_ID, PROVISIONING_PROFILE
|
|
104
|
+
├── app_store_connect: ASC_KEY_ID, ASC_ISSUER_ID, ASC_API_KEY (.p8)
|
|
105
|
+
├── android_credentials: ANDROID_KEYSTORE_BASE64, PASSWORD, ALIAS, KEY_PASSWORD
|
|
106
|
+
└── google_play: GCLOUD_SERVICE_ACCOUNT_CREDENTIALS (JSON)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 규칙
|
|
110
|
+
|
|
111
|
+
- `codemagic.yaml` 로 워크플로우 정의 — GUI 설정 대신 코드 관리
|
|
112
|
+
- 시크릿은 Codemagic UI에서만 설정 — yaml에 비밀값 금지
|
|
113
|
+
- `instance_type: mac_mini_m2` — iOS 빌드는 macOS 필수
|
|
114
|
+
- `cancel_previous_builds: true` — 동일 브랜치 중복 빌드 방지
|
|
115
|
+
- PR → test, 태그 → release 워크플로우 분리
|
|
116
|
+
- `PROJECT_BUILD_NUMBER` 활용 — 자동 증가 빌드 넘버
|