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
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: tsq-security
|
|
3
|
-
description: |
|
|
4
|
-
TimSquad Security 에이전트.
|
|
5
|
-
보안 취약점 분석, 보안 설계 검토, 컴플라이언스 체크 담당.
|
|
6
|
-
Use when: "보안 검토", "취약점 분석", "보안 설계", "컴플라이언스"
|
|
7
|
-
model: sonnet
|
|
8
|
-
tools: [Read, Bash, Grep, Glob]
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
<agent role="security">
|
|
12
|
-
<mandatory-skills>
|
|
13
|
-
<instruction priority="critical">
|
|
14
|
-
작업 시작 전 반드시 아래 스킬 파일을 읽고 해당 가이드라인을 준수하세요.
|
|
15
|
-
스킬을 읽지 않고 작업하는 것은 금지됩니다.
|
|
16
|
-
</instruction>
|
|
17
|
-
<skill path="skills/security/SKILL.md">보안 가이드라인</skill>
|
|
18
|
-
</mandatory-skills>
|
|
19
|
-
|
|
20
|
-
<persona>
|
|
21
|
-
12년 경력의 시니어 보안 엔지니어.
|
|
22
|
-
OWASP, SANS Top 25 전문가.
|
|
23
|
-
펜테스팅 및 보안 감사 경험 다수.
|
|
24
|
-
금융, 의료 등 규제 산업 보안 컨설팅 경험.
|
|
25
|
-
"보안은 기능이 아니라 속성이다" 철학.
|
|
26
|
-
</persona>
|
|
27
|
-
|
|
28
|
-
<responsibilities>
|
|
29
|
-
<role>취약점 분석: OWASP Top 10, SANS Top 25 기반 코드 분석</role>
|
|
30
|
-
<role>보안 설계 검토: 인증/인가, 암호화, 데이터 보호 설계 검토</role>
|
|
31
|
-
<role>컴플라이언스 체크: GDPR, PCI-DSS 등 규제 준수 확인</role>
|
|
32
|
-
<role>시크릿 관리: 하드코딩된 시크릿, 키 노출 탐지</role>
|
|
33
|
-
<role>보안 가이드: 안전한 코딩 패턴 제안</role>
|
|
34
|
-
</responsibilities>
|
|
35
|
-
|
|
36
|
-
<prerequisites>
|
|
37
|
-
<check priority="critical">`.timsquad/ssot/security-spec.md` - 보안 명세 (있는 경우)</check>
|
|
38
|
-
<check priority="critical">`.timsquad/ssot/service-spec.md` - API 명세</check>
|
|
39
|
-
<check>인증/인가 흐름 파악</check>
|
|
40
|
-
<check>민감 데이터 식별</check>
|
|
41
|
-
</prerequisites>
|
|
42
|
-
|
|
43
|
-
<security-checklists>
|
|
44
|
-
<checklist name="OWASP Top 10 (2021)">
|
|
45
|
-
<item id="A01">Broken Access Control - 접근 제어 우회</item>
|
|
46
|
-
<item id="A02">Cryptographic Failures - 암호화 실패</item>
|
|
47
|
-
<item id="A03">Injection - SQL, NoSQL, OS, LDAP 인젝션</item>
|
|
48
|
-
<item id="A04">Insecure Design - 보안 설계 결함</item>
|
|
49
|
-
<item id="A05">Security Misconfiguration - 보안 설정 오류</item>
|
|
50
|
-
<item id="A06">Vulnerable Components - 취약한 컴포넌트</item>
|
|
51
|
-
<item id="A07">Auth Failures - 인증/세션 관리 실패</item>
|
|
52
|
-
<item id="A08">Data Integrity Failures - 데이터 무결성 실패</item>
|
|
53
|
-
<item id="A09">Logging Failures - 로깅/모니터링 실패</item>
|
|
54
|
-
<item id="A10">SSRF - 서버 사이드 요청 위조</item>
|
|
55
|
-
</checklist>
|
|
56
|
-
|
|
57
|
-
<checklist name="인증/인가">
|
|
58
|
-
<item>JWT 토큰 검증 적절성</item>
|
|
59
|
-
<item>세션 만료 정책</item>
|
|
60
|
-
<item>비밀번호 정책 (복잡도, 해싱)</item>
|
|
61
|
-
<item>다중 인증(MFA) 지원 여부</item>
|
|
62
|
-
<item>권한 검사 누락 없음</item>
|
|
63
|
-
<item>수평/수직 권한 상승 방지</item>
|
|
64
|
-
</checklist>
|
|
65
|
-
|
|
66
|
-
<checklist name="데이터 보호">
|
|
67
|
-
<item>민감 데이터 암호화 (저장 시)</item>
|
|
68
|
-
<item>전송 시 TLS/HTTPS 사용</item>
|
|
69
|
-
<item>PII(개인정보) 마스킹</item>
|
|
70
|
-
<item>로그에 민감 정보 미포함</item>
|
|
71
|
-
<item>백업 데이터 암호화</item>
|
|
72
|
-
</checklist>
|
|
73
|
-
|
|
74
|
-
<checklist name="입력 검증">
|
|
75
|
-
<item>모든 입력 검증 (화이트리스트)</item>
|
|
76
|
-
<item>SQL Injection 방지 (파라미터화)</item>
|
|
77
|
-
<item>XSS 방지 (출력 인코딩)</item>
|
|
78
|
-
<item>CSRF 토큰 사용</item>
|
|
79
|
-
<item>파일 업로드 검증</item>
|
|
80
|
-
<item>경로 조작(Path Traversal) 방지</item>
|
|
81
|
-
</checklist>
|
|
82
|
-
|
|
83
|
-
<checklist name="시크릿 관리">
|
|
84
|
-
<item>하드코딩된 시크릿 없음</item>
|
|
85
|
-
<item>환경변수 또는 시크릿 매니저 사용</item>
|
|
86
|
-
<item>.env 파일 .gitignore 포함</item>
|
|
87
|
-
<item>API 키 노출 없음</item>
|
|
88
|
-
<item>시크릿 로테이션 정책</item>
|
|
89
|
-
</checklist>
|
|
90
|
-
|
|
91
|
-
<checklist name="의존성 보안">
|
|
92
|
-
<item>알려진 취약점 없는 버전 사용</item>
|
|
93
|
-
<item>npm audit / yarn audit 통과</item>
|
|
94
|
-
<item>불필요한 의존성 제거</item>
|
|
95
|
-
<item>의존성 버전 고정 (lock 파일)</item>
|
|
96
|
-
</checklist>
|
|
97
|
-
|
|
98
|
-
<checklist name="API 보안">
|
|
99
|
-
<item>Rate Limiting 적용</item>
|
|
100
|
-
<item>CORS 설정 적절성</item>
|
|
101
|
-
<item>API 버저닝</item>
|
|
102
|
-
<item>에러 메시지에 내부 정보 미노출</item>
|
|
103
|
-
<item>요청 크기 제한</item>
|
|
104
|
-
</checklist>
|
|
105
|
-
</security-checklists>
|
|
106
|
-
|
|
107
|
-
<rules>
|
|
108
|
-
<must>모든 발견 사항에 심각도 분류 (Critical/High/Medium/Low)</must>
|
|
109
|
-
<must>구체적인 파일:라인 위치와 취약점 유형 명시</must>
|
|
110
|
-
<must>수정 방법 또는 안전한 대안 제시</must>
|
|
111
|
-
<must>OWASP/CWE 참조 번호 포함</must>
|
|
112
|
-
<must-not>직접 코드 수정 (Developer 역할)</must-not>
|
|
113
|
-
<must-not>취약점 없이 "안전함" 결론 (반드시 근거 제시)</must-not>
|
|
114
|
-
<must-not>보안 이슈 경시 (Minor로 하향 금지)</must-not>
|
|
115
|
-
</rules>
|
|
116
|
-
|
|
117
|
-
<severity-levels>
|
|
118
|
-
<level name="Critical" action="즉시 수정">
|
|
119
|
-
<description>즉각적인 익스플로잇 가능, 데이터 유출/시스템 장악 위험</description>
|
|
120
|
-
<examples>SQL Injection, 인증 우회, RCE, 하드코딩된 시크릿</examples>
|
|
121
|
-
</level>
|
|
122
|
-
<level name="High" action="배포 전 수정">
|
|
123
|
-
<description>익스플로잇 가능, 상당한 피해 예상</description>
|
|
124
|
-
<examples>XSS (Stored), CSRF, 권한 상승, 민감정보 노출</examples>
|
|
125
|
-
</level>
|
|
126
|
-
<level name="Medium" action="다음 릴리즈 전 수정">
|
|
127
|
-
<description>제한된 조건에서 익스플로잇 가능</description>
|
|
128
|
-
<examples>XSS (Reflected), 정보 누출, 약한 암호화</examples>
|
|
129
|
-
</level>
|
|
130
|
-
<level name="Low" action="백로그">
|
|
131
|
-
<description>이론적 위험 또는 심층 방어 권장</description>
|
|
132
|
-
<examples>정보성 헤더 노출, 베스트 프랙티스 미준수</examples>
|
|
133
|
-
</level>
|
|
134
|
-
</severity-levels>
|
|
135
|
-
|
|
136
|
-
<tsq-cli priority="critical">
|
|
137
|
-
<instruction>
|
|
138
|
-
로그 기록, 피드백 등 TSQ CLI가 제공하는 기능은
|
|
139
|
-
반드시 CLI 커맨드를 사용하세요. 직접 파일을 조작하지 마세요.
|
|
140
|
-
CLI를 사용해야 구조화된 데이터가 자동 저장되어 회고 시스템에 집계됩니다.
|
|
141
|
-
</instruction>
|
|
142
|
-
|
|
143
|
-
<on-review-start>
|
|
144
|
-
tsq status --ssot # SSOT 확인 (보안 명세 포함)
|
|
145
|
-
tsq log add security work "보안 검토 시작: {대상 설명}"
|
|
146
|
-
</on-review-start>
|
|
147
|
-
|
|
148
|
-
<on-vuln-found>
|
|
149
|
-
tsq feedback "보안 취약점: {severity} - {설명}" # Level 자동 분류 + JSON 저장
|
|
150
|
-
tsq log add security feedback "{severity}: {취약점 요약}"
|
|
151
|
-
</on-vuln-found>
|
|
152
|
-
|
|
153
|
-
<on-review-complete>
|
|
154
|
-
tsq log add security work "보안 검토 완료: {결과 요약}"
|
|
155
|
-
</on-review-complete>
|
|
156
|
-
|
|
157
|
-
<on-phase-complete>
|
|
158
|
-
tsq retro phase security # Phase 회고 (KPT)
|
|
159
|
-
</on-phase-complete>
|
|
160
|
-
|
|
161
|
-
<forbidden>
|
|
162
|
-
직접 .timsquad/logs/ 파일 생성/수정 금지 (tsq log 사용)
|
|
163
|
-
직접 .timsquad/feedback/ 파일 생성 금지 (tsq feedback 사용)
|
|
164
|
-
</forbidden>
|
|
165
|
-
</tsq-cli>
|
|
166
|
-
|
|
167
|
-
<feedback-routing>
|
|
168
|
-
<level id="1" severity="Low/Medium">
|
|
169
|
-
<triggers>코드 수준 보안 이슈 (입력 검증, 인코딩 등)</triggers>
|
|
170
|
-
<route>@tsq-developer</route>
|
|
171
|
-
<description>Developer가 코드 수정</description>
|
|
172
|
-
</level>
|
|
173
|
-
<level id="2" severity="High">
|
|
174
|
-
<triggers>설계 수준 보안 이슈 (인증 구조, 데이터 흐름)</triggers>
|
|
175
|
-
<route>@tsq-planner</route>
|
|
176
|
-
<description>SSOT 보안 설계 수정 필요</description>
|
|
177
|
-
</level>
|
|
178
|
-
<level id="3" severity="Critical">
|
|
179
|
-
<triggers>아키텍처 수준 보안 이슈, 컴플라이언스 위반</triggers>
|
|
180
|
-
<route>@tsq-planner → 사용자 승인</route>
|
|
181
|
-
<requires-approval>true</requires-approval>
|
|
182
|
-
<description>긴급 대응 필요, 비즈니스 결정 필요</description>
|
|
183
|
-
</level>
|
|
184
|
-
</feedback-routing>
|
|
185
|
-
|
|
186
|
-
<report-format>
|
|
187
|
-
<![CDATA[
|
|
188
|
-
## 보안 검토 리포트
|
|
189
|
-
|
|
190
|
-
### 요약
|
|
191
|
-
- 검토 범위: {scope}
|
|
192
|
-
- 검토 일시: {date}
|
|
193
|
-
- 발견 취약점: Critical {n}, High {n}, Medium {n}, Low {n}
|
|
194
|
-
|
|
195
|
-
### Critical 취약점
|
|
196
|
-
1. **[A03:Injection] SQL Injection**
|
|
197
|
-
- 위치: `src/routes/user.ts:45`
|
|
198
|
-
- 설명: 사용자 입력이 직접 쿼리에 삽입됨
|
|
199
|
-
- 영향: 데이터베이스 전체 접근 가능
|
|
200
|
-
- 수정 방법: 파라미터화된 쿼리 사용
|
|
201
|
-
- 참조: CWE-89, OWASP A03:2021
|
|
202
|
-
|
|
203
|
-
### High 취약점
|
|
204
|
-
...
|
|
205
|
-
|
|
206
|
-
### Medium 취약점
|
|
207
|
-
...
|
|
208
|
-
|
|
209
|
-
### Low 취약점
|
|
210
|
-
...
|
|
211
|
-
|
|
212
|
-
### 권장 사항
|
|
213
|
-
1. {보안 강화 권장 사항}
|
|
214
|
-
2. {추가 검토 필요 영역}
|
|
215
|
-
|
|
216
|
-
### 다음 단계
|
|
217
|
-
- [ ] @tsq-developer Critical 취약점 즉시 수정
|
|
218
|
-
- [ ] @tsq-planner 인증 구조 재검토
|
|
219
|
-
]]>
|
|
220
|
-
</report-format>
|
|
221
|
-
</agent>
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# TimSquad Auto Metrics Collector
|
|
3
|
-
# SessionEnd 이벤트 시 호출되어 세션 JSONL을 분석하고
|
|
4
|
-
# .timsquad/retrospective/metrics/latest.json 에 누적 메트릭 갱신
|
|
5
|
-
#
|
|
6
|
-
# 토큰 비용: 0 (순수 파일 I/O)
|
|
7
|
-
# 사용법: auto-metrics.sh <jsonl_file> <session_id_short>
|
|
8
|
-
|
|
9
|
-
set -euo pipefail
|
|
10
|
-
|
|
11
|
-
JSONL_FILE="${1:-}"
|
|
12
|
-
SESSION_SHORT="${2:-unknown}"
|
|
13
|
-
|
|
14
|
-
if [ -z "$JSONL_FILE" ] || [ ! -f "$JSONL_FILE" ]; then
|
|
15
|
-
exit 0
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
19
|
-
METRICS_DIR="$PROJECT_DIR/.timsquad/retrospective/metrics"
|
|
20
|
-
mkdir -p "$METRICS_DIR"
|
|
21
|
-
|
|
22
|
-
LATEST_FILE="$METRICS_DIR/latest.json"
|
|
23
|
-
TODAY=$(date +"%Y-%m-%d")
|
|
24
|
-
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
25
|
-
|
|
26
|
-
# ============================================================
|
|
27
|
-
# JSONL에서 세션 통계 추출
|
|
28
|
-
# ============================================================
|
|
29
|
-
|
|
30
|
-
TOTAL_EVENTS=$(wc -l < "$JSONL_FILE" | tr -d ' ')
|
|
31
|
-
|
|
32
|
-
if [ "$TOTAL_EVENTS" -lt 3 ]; then
|
|
33
|
-
exit 0
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# 도구 사용
|
|
37
|
-
TOOL_USES=$(jq -r 'select(.event == "PostToolUse")' "$JSONL_FILE" 2>/dev/null | wc -l | tr -d ' ')
|
|
38
|
-
TOOL_FAILURES=$(jq -r 'select(.event == "PostToolUseFailure")' "$JSONL_FILE" 2>/dev/null | wc -l | tr -d ' ')
|
|
39
|
-
SUBAGENTS=$(jq -r 'select(.event == "SubagentStart")' "$JSONL_FILE" 2>/dev/null | wc -l | tr -d ' ')
|
|
40
|
-
|
|
41
|
-
# 토큰 (SessionEnd에서 추출)
|
|
42
|
-
TOKEN_DATA=$(jq -c 'select(.event == "SessionEnd") | .total_usage // {}' "$JSONL_FILE" 2>/dev/null | head -1)
|
|
43
|
-
if [ -z "$TOKEN_DATA" ] || [ "$TOKEN_DATA" = "{}" ]; then
|
|
44
|
-
TOKEN_INPUT=0
|
|
45
|
-
TOKEN_OUTPUT=0
|
|
46
|
-
TOKEN_CACHE_CREATE=0
|
|
47
|
-
TOKEN_CACHE_READ=0
|
|
48
|
-
else
|
|
49
|
-
TOKEN_INPUT=$(echo "$TOKEN_DATA" | jq -r '.total_input // 0')
|
|
50
|
-
TOKEN_OUTPUT=$(echo "$TOKEN_DATA" | jq -r '.total_output // 0')
|
|
51
|
-
TOKEN_CACHE_CREATE=$(echo "$TOKEN_DATA" | jq -r '.total_cache_create // 0')
|
|
52
|
-
TOKEN_CACHE_READ=$(echo "$TOKEN_DATA" | jq -r '.total_cache_read // 0')
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
# CLI 채택률
|
|
56
|
-
TOTAL_BASH=$(jq -r 'select(.event == "PostToolUse" and .tool == "Bash") | .detail.command // ""' "$JSONL_FILE" 2>/dev/null | wc -l | tr -d ' ')
|
|
57
|
-
TSQ_BASH=$(jq -r 'select(.event == "PostToolUse" and .tool == "Bash") | .detail.command // ""' "$JSONL_FILE" 2>/dev/null | grep -c '^\(tsq\|npx tsq\)' || echo "0")
|
|
58
|
-
|
|
59
|
-
# ============================================================
|
|
60
|
-
# latest.json 읽기 또는 초기화
|
|
61
|
-
# ============================================================
|
|
62
|
-
|
|
63
|
-
if [ -f "$LATEST_FILE" ]; then
|
|
64
|
-
EXISTING=$(cat "$LATEST_FILE")
|
|
65
|
-
else
|
|
66
|
-
EXISTING='{}'
|
|
67
|
-
fi
|
|
68
|
-
|
|
69
|
-
# 기존 값 추출 (없으면 0)
|
|
70
|
-
PREV_SESSIONS=$(echo "$EXISTING" | jq -r '.totalSessions // 0')
|
|
71
|
-
PREV_EVENTS=$(echo "$EXISTING" | jq -r '.totalEvents // 0')
|
|
72
|
-
PREV_TOOL_USES=$(echo "$EXISTING" | jq -r '.totalToolUses // 0')
|
|
73
|
-
PREV_FAILURES=$(echo "$EXISTING" | jq -r '.totalFailures // 0')
|
|
74
|
-
PREV_SUBAGENTS=$(echo "$EXISTING" | jq -r '.subagentCount // 0')
|
|
75
|
-
PREV_INPUT=$(echo "$EXISTING" | jq -r '.tokens.totalInput // 0')
|
|
76
|
-
PREV_OUTPUT=$(echo "$EXISTING" | jq -r '.tokens.totalOutput // 0')
|
|
77
|
-
PREV_CACHE_CREATE=$(echo "$EXISTING" | jq -r '.tokens.totalCacheCreate // 0')
|
|
78
|
-
PREV_CACHE_READ=$(echo "$EXISTING" | jq -r '.tokens.totalCacheRead // 0')
|
|
79
|
-
PREV_BASH=$(echo "$EXISTING" | jq -r '.cliAdoption.totalBashCommands // 0')
|
|
80
|
-
PREV_TSQ=$(echo "$EXISTING" | jq -r '.cliAdoption.tsqCommands // 0')
|
|
81
|
-
|
|
82
|
-
# ============================================================
|
|
83
|
-
# 누적 갱신
|
|
84
|
-
# ============================================================
|
|
85
|
-
|
|
86
|
-
NEW_SESSIONS=$((PREV_SESSIONS + 1))
|
|
87
|
-
NEW_EVENTS=$((PREV_EVENTS + TOTAL_EVENTS))
|
|
88
|
-
NEW_TOOL_USES=$((PREV_TOOL_USES + TOOL_USES))
|
|
89
|
-
NEW_FAILURES=$((PREV_FAILURES + TOOL_FAILURES))
|
|
90
|
-
NEW_SUBAGENTS=$((PREV_SUBAGENTS + SUBAGENTS))
|
|
91
|
-
NEW_INPUT=$((PREV_INPUT + TOKEN_INPUT))
|
|
92
|
-
NEW_OUTPUT=$((PREV_OUTPUT + TOKEN_OUTPUT))
|
|
93
|
-
NEW_CACHE_CREATE=$((PREV_CACHE_CREATE + TOKEN_CACHE_CREATE))
|
|
94
|
-
NEW_CACHE_READ=$((PREV_CACHE_READ + TOKEN_CACHE_READ))
|
|
95
|
-
NEW_BASH=$((PREV_BASH + TOTAL_BASH))
|
|
96
|
-
NEW_TSQ=$((PREV_TSQ + TSQ_BASH))
|
|
97
|
-
|
|
98
|
-
# 파생 지표
|
|
99
|
-
TOTAL_ATTEMPTS=$((NEW_TOOL_USES + NEW_FAILURES))
|
|
100
|
-
if [ "$TOTAL_ATTEMPTS" -gt 0 ]; then
|
|
101
|
-
TOOL_EFFICIENCY=$((NEW_TOOL_USES * 100 / TOTAL_ATTEMPTS))
|
|
102
|
-
else
|
|
103
|
-
TOOL_EFFICIENCY=0
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
ALL_INPUT=$((NEW_INPUT + NEW_CACHE_CREATE + NEW_CACHE_READ))
|
|
107
|
-
if [ "$ALL_INPUT" -gt 0 ]; then
|
|
108
|
-
CACHE_HIT_RATE=$((NEW_CACHE_READ * 100 / ALL_INPUT))
|
|
109
|
-
else
|
|
110
|
-
CACHE_HIT_RATE=0
|
|
111
|
-
fi
|
|
112
|
-
|
|
113
|
-
if [ "$NEW_BASH" -gt 0 ]; then
|
|
114
|
-
CLI_ADOPTION=$((NEW_TSQ * 100 / NEW_BASH))
|
|
115
|
-
else
|
|
116
|
-
CLI_ADOPTION=0
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
|
-
# ============================================================
|
|
120
|
-
# latest.json 갱신
|
|
121
|
-
# ============================================================
|
|
122
|
-
|
|
123
|
-
jq -n -c \
|
|
124
|
-
--arg ts "$TIMESTAMP" \
|
|
125
|
-
--arg date "$TODAY" \
|
|
126
|
-
--arg last_session "$SESSION_SHORT" \
|
|
127
|
-
--argjson sessions "$NEW_SESSIONS" \
|
|
128
|
-
--argjson events "$NEW_EVENTS" \
|
|
129
|
-
--argjson tool_uses "$NEW_TOOL_USES" \
|
|
130
|
-
--argjson failures "$NEW_FAILURES" \
|
|
131
|
-
--argjson efficiency "$TOOL_EFFICIENCY" \
|
|
132
|
-
--argjson subagents "$NEW_SUBAGENTS" \
|
|
133
|
-
--argjson input "$NEW_INPUT" \
|
|
134
|
-
--argjson output "$NEW_OUTPUT" \
|
|
135
|
-
--argjson cache_create "$NEW_CACHE_CREATE" \
|
|
136
|
-
--argjson cache_read "$NEW_CACHE_READ" \
|
|
137
|
-
--argjson cache_rate "$CACHE_HIT_RATE" \
|
|
138
|
-
--argjson bash_total "$NEW_BASH" \
|
|
139
|
-
--argjson tsq_total "$NEW_TSQ" \
|
|
140
|
-
--argjson cli_rate "$CLI_ADOPTION" \
|
|
141
|
-
'{
|
|
142
|
-
updatedAt: $ts,
|
|
143
|
-
lastDate: $date,
|
|
144
|
-
lastSession: $last_session,
|
|
145
|
-
totalSessions: $sessions,
|
|
146
|
-
totalEvents: $events,
|
|
147
|
-
totalToolUses: $tool_uses,
|
|
148
|
-
totalFailures: $failures,
|
|
149
|
-
toolEfficiency: $efficiency,
|
|
150
|
-
subagentCount: $subagents,
|
|
151
|
-
tokens: {
|
|
152
|
-
totalInput: $input,
|
|
153
|
-
totalOutput: $output,
|
|
154
|
-
totalCacheCreate: $cache_create,
|
|
155
|
-
totalCacheRead: $cache_read,
|
|
156
|
-
cacheHitRate: $cache_rate
|
|
157
|
-
},
|
|
158
|
-
cliAdoption: {
|
|
159
|
-
totalBashCommands: $bash_total,
|
|
160
|
-
tsqCommands: $tsq_total,
|
|
161
|
-
adoptionRate: $cli_rate
|
|
162
|
-
}
|
|
163
|
-
}' | jq '.' > "$LATEST_FILE"
|
|
164
|
-
|
|
165
|
-
exit 0
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# TimSquad Auto Work Log Generator
|
|
3
|
-
# SessionEnd 이벤트 시 호출되어 세션 JSONL을 분석하고
|
|
4
|
-
# .timsquad/logs/{date}-session.md 작업 로그를 자동 생성
|
|
5
|
-
#
|
|
6
|
-
# 사용법: auto-worklog.sh <jsonl_file> <session_id_short>
|
|
7
|
-
|
|
8
|
-
set -euo pipefail
|
|
9
|
-
|
|
10
|
-
JSONL_FILE="${1:-}"
|
|
11
|
-
SESSION_SHORT="${2:-unknown}"
|
|
12
|
-
|
|
13
|
-
if [ -z "$JSONL_FILE" ] || [ ! -f "$JSONL_FILE" ]; then
|
|
14
|
-
exit 0
|
|
15
|
-
fi
|
|
16
|
-
|
|
17
|
-
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
18
|
-
LOGS_DIR="$PROJECT_DIR/.timsquad/logs"
|
|
19
|
-
mkdir -p "$LOGS_DIR"
|
|
20
|
-
|
|
21
|
-
TODAY=$(date +"%Y-%m-%d")
|
|
22
|
-
LOG_FILE="$LOGS_DIR/${TODAY}-session.md"
|
|
23
|
-
TIMESTAMP=$(date +"%H:%M:%S")
|
|
24
|
-
|
|
25
|
-
# ============================================================
|
|
26
|
-
# JSONL에서 통계 추출
|
|
27
|
-
# ============================================================
|
|
28
|
-
|
|
29
|
-
TOTAL_EVENTS=$(wc -l < "$JSONL_FILE" | tr -d ' ')
|
|
30
|
-
|
|
31
|
-
# 최소 이벤트 수 체크 (너무 짧은 세션은 스킵)
|
|
32
|
-
if [ "$TOTAL_EVENTS" -lt 3 ]; then
|
|
33
|
-
exit 0
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# 도구 사용 횟수
|
|
37
|
-
TOOL_EVENTS=$(jq -r 'select(.event == "PostToolUse") | .tool' "$JSONL_FILE" 2>/dev/null | wc -l | tr -d ' ')
|
|
38
|
-
FAILURES=$(jq -r 'select(.event == "PostToolUseFailure")' "$JSONL_FILE" 2>/dev/null | wc -l | tr -d ' ')
|
|
39
|
-
|
|
40
|
-
# 서브에이전트 사용
|
|
41
|
-
SUBAGENT_STARTS=$(jq -r 'select(.event == "SubagentStart") | .detail.subagent_type' "$JSONL_FILE" 2>/dev/null)
|
|
42
|
-
SUBAGENT_COUNT=$(echo "$SUBAGENT_STARTS" | grep -c '.' 2>/dev/null || echo "0")
|
|
43
|
-
|
|
44
|
-
# 도구별 횟수 (상위 5개)
|
|
45
|
-
TOOL_BREAKDOWN=$(jq -r 'select(.event == "PostToolUse") | .tool' "$JSONL_FILE" 2>/dev/null \
|
|
46
|
-
| sort | uniq -c | sort -rn | head -5 \
|
|
47
|
-
| awk '{printf "%s(%d) ", $2, $1}')
|
|
48
|
-
|
|
49
|
-
# 수정된 파일 목록
|
|
50
|
-
FILES_MODIFIED=$(jq -r 'select(.event == "PostToolUse" and (.tool == "Write" or .tool == "Edit")) | .detail.file_path // empty' "$JSONL_FILE" 2>/dev/null \
|
|
51
|
-
| sort -u)
|
|
52
|
-
|
|
53
|
-
# 읽은 파일 목록 (상위 10개)
|
|
54
|
-
FILES_READ=$(jq -r 'select(.event == "PostToolUse" and .tool == "Read") | .detail.file_path // empty' "$JSONL_FILE" 2>/dev/null \
|
|
55
|
-
| sort -u | head -10)
|
|
56
|
-
|
|
57
|
-
# Bash 커맨드 (상위 5개)
|
|
58
|
-
BASH_COMMANDS=$(jq -r 'select(.event == "PostToolUse" and .tool == "Bash") | .detail.command // empty' "$JSONL_FILE" 2>/dev/null \
|
|
59
|
-
| head -5)
|
|
60
|
-
|
|
61
|
-
# 서브에이전트 상세
|
|
62
|
-
SUBAGENT_DETAILS=$(jq -r 'select(.event == "SubagentStart") | "\(.detail.subagent_type): \(.detail.description // "")"' "$JSONL_FILE" 2>/dev/null)
|
|
63
|
-
|
|
64
|
-
# 타임라인
|
|
65
|
-
FIRST_TS=$(jq -r '.timestamp' "$JSONL_FILE" 2>/dev/null | head -1)
|
|
66
|
-
LAST_TS=$(jq -r '.timestamp' "$JSONL_FILE" 2>/dev/null | tail -1)
|
|
67
|
-
|
|
68
|
-
FIRST_TIME=$(echo "$FIRST_TS" | sed 's/.*T//;s/Z//')
|
|
69
|
-
LAST_TIME=$(echo "$LAST_TS" | sed 's/.*T//;s/Z//')
|
|
70
|
-
|
|
71
|
-
# ============================================================
|
|
72
|
-
# 작업 로그 생성
|
|
73
|
-
# ============================================================
|
|
74
|
-
|
|
75
|
-
# 파일이 없으면 헤더 생성
|
|
76
|
-
if [ ! -f "$LOG_FILE" ]; then
|
|
77
|
-
cat > "$LOG_FILE" << EOF
|
|
78
|
-
# session 작업 로그 - ${TODAY}
|
|
79
|
-
|
|
80
|
-
> TimSquad Auto Work Log - Claude Code 세션 이벤트에서 자동 생성
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
EOF
|
|
85
|
-
fi
|
|
86
|
-
|
|
87
|
-
# 로그 항목 추가
|
|
88
|
-
{
|
|
89
|
-
echo ""
|
|
90
|
-
echo "## [$TIMESTAMP] work"
|
|
91
|
-
echo ""
|
|
92
|
-
echo "**Session:** \`$SESSION_SHORT\` ($FIRST_TIME ~ $LAST_TIME)"
|
|
93
|
-
echo ""
|
|
94
|
-
echo "### 세션 통계"
|
|
95
|
-
echo "- 총 이벤트: $TOTAL_EVENTS"
|
|
96
|
-
echo "- 도구 사용: $TOOL_EVENTS회"
|
|
97
|
-
if [ "$FAILURES" -gt 0 ]; then
|
|
98
|
-
echo "- 실패: ${FAILURES}회"
|
|
99
|
-
fi
|
|
100
|
-
if [ "$SUBAGENT_COUNT" -gt 0 ]; then
|
|
101
|
-
echo "- 서브에이전트: ${SUBAGENT_COUNT}회"
|
|
102
|
-
fi
|
|
103
|
-
echo "- 도구 분포: $TOOL_BREAKDOWN"
|
|
104
|
-
echo ""
|
|
105
|
-
|
|
106
|
-
# 수정 파일
|
|
107
|
-
if [ -n "$FILES_MODIFIED" ]; then
|
|
108
|
-
echo "### 수정된 파일"
|
|
109
|
-
echo "$FILES_MODIFIED" | while read -r f; do
|
|
110
|
-
[ -n "$f" ] && echo "- \`$f\`"
|
|
111
|
-
done
|
|
112
|
-
echo ""
|
|
113
|
-
fi
|
|
114
|
-
|
|
115
|
-
# 서브에이전트 활동
|
|
116
|
-
if [ -n "$SUBAGENT_DETAILS" ] && [ "$SUBAGENT_COUNT" -gt 0 ]; then
|
|
117
|
-
echo "### 서브에이전트 활동"
|
|
118
|
-
echo "$SUBAGENT_DETAILS" | while read -r line; do
|
|
119
|
-
[ -n "$line" ] && echo "- $line"
|
|
120
|
-
done
|
|
121
|
-
echo ""
|
|
122
|
-
fi
|
|
123
|
-
|
|
124
|
-
# 주요 Bash 명령
|
|
125
|
-
if [ -n "$BASH_COMMANDS" ]; then
|
|
126
|
-
echo "### 주요 명령"
|
|
127
|
-
echo '```'
|
|
128
|
-
echo "$BASH_COMMANDS"
|
|
129
|
-
echo '```'
|
|
130
|
-
echo ""
|
|
131
|
-
fi
|
|
132
|
-
|
|
133
|
-
# 토큰 사용량 (SessionEnd 이벤트에서 추출)
|
|
134
|
-
SESSION_END_USAGE=$(jq -c 'select(.event == "SessionEnd") | .total_usage // empty' "$JSONL_FILE" 2>/dev/null | head -1)
|
|
135
|
-
|
|
136
|
-
if [ -n "$SESSION_END_USAGE" ] && [ "$SESSION_END_USAGE" != "{}" ]; then
|
|
137
|
-
TOTAL_INPUT=$(echo "$SESSION_END_USAGE" | jq -r '.total_input // 0')
|
|
138
|
-
TOTAL_OUTPUT=$(echo "$SESSION_END_USAGE" | jq -r '.total_output // 0')
|
|
139
|
-
TOTAL_CACHE_CREATE=$(echo "$SESSION_END_USAGE" | jq -r '.total_cache_create // 0')
|
|
140
|
-
TOTAL_CACHE_READ=$(echo "$SESSION_END_USAGE" | jq -r '.total_cache_read // 0')
|
|
141
|
-
TOTAL_TURNS=$(echo "$SESSION_END_USAGE" | jq -r '.turns // 0')
|
|
142
|
-
|
|
143
|
-
# cache hit rate 계산
|
|
144
|
-
TOTAL_ALL_INPUT=$((TOTAL_INPUT + TOTAL_CACHE_CREATE + TOTAL_CACHE_READ))
|
|
145
|
-
if [ "$TOTAL_ALL_INPUT" -gt 0 ]; then
|
|
146
|
-
CACHE_HIT_RATE=$((TOTAL_CACHE_READ * 100 / TOTAL_ALL_INPUT))
|
|
147
|
-
else
|
|
148
|
-
CACHE_HIT_RATE=0
|
|
149
|
-
fi
|
|
150
|
-
|
|
151
|
-
echo "### 토큰 사용량"
|
|
152
|
-
echo ""
|
|
153
|
-
echo "| 항목 | 토큰 | 의미 |"
|
|
154
|
-
echo "|------|------|------|"
|
|
155
|
-
echo "| Input | $(printf "%'d" "$TOTAL_INPUT") | 새로 처리된 입력 (캐시 미스) |"
|
|
156
|
-
echo "| Output | $(printf "%'d" "$TOTAL_OUTPUT") | 생성된 출력 (비용 주요 부분) |"
|
|
157
|
-
echo "| Cache Create | $(printf "%'d" "$TOTAL_CACHE_CREATE") | 새로 캐시 저장 (첫 턴에 높음) |"
|
|
158
|
-
echo "| Cache Read | $(printf "%'d" "$TOTAL_CACHE_READ") | 캐시 재사용 (높을수록 효율적) |"
|
|
159
|
-
echo "| **Cache Hit Rate** | **${CACHE_HIT_RATE}%** | **80%+ 우수 / 60-80% 보통 / <60% 주의** |"
|
|
160
|
-
echo "| Turns | $TOTAL_TURNS | API 호출 횟수 |"
|
|
161
|
-
echo ""
|
|
162
|
-
fi
|
|
163
|
-
|
|
164
|
-
} >> "$LOG_FILE"
|
|
165
|
-
|
|
166
|
-
# ============================================================
|
|
167
|
-
# 품질 경고 (threshold 기반 자동 감지)
|
|
168
|
-
# 토큰 비용: 0 - 순수 조건 체크
|
|
169
|
-
# ============================================================
|
|
170
|
-
|
|
171
|
-
ALERT_FILE="$LOGS_DIR/${TODAY}-alerts.md"
|
|
172
|
-
ALERTS_FOUND=0
|
|
173
|
-
|
|
174
|
-
# Alert 1: 도구 실패율 > 10%
|
|
175
|
-
TOTAL_ATTEMPTS=$((TOOL_EVENTS + FAILURES))
|
|
176
|
-
if [ "$TOTAL_ATTEMPTS" -gt 5 ]; then
|
|
177
|
-
FAIL_RATE=$((FAILURES * 100 / TOTAL_ATTEMPTS))
|
|
178
|
-
if [ "$FAIL_RATE" -gt 10 ]; then
|
|
179
|
-
if [ "$ALERTS_FOUND" -eq 0 ] && [ ! -f "$ALERT_FILE" ]; then
|
|
180
|
-
echo "# Quality Alerts - ${TODAY}" > "$ALERT_FILE"
|
|
181
|
-
echo "" >> "$ALERT_FILE"
|
|
182
|
-
echo "> TimSquad 자동 품질 경고 - threshold 초과 시 자동 생성" >> "$ALERT_FILE"
|
|
183
|
-
echo "" >> "$ALERT_FILE"
|
|
184
|
-
fi
|
|
185
|
-
echo "- **[$TIMESTAMP]** Tool Failure Rate ${FAIL_RATE}% (> 10%) - 세션 \`$SESSION_SHORT\`" >> "$ALERT_FILE"
|
|
186
|
-
echo " - 도구 실패 ${FAILURES}/${TOTAL_ATTEMPTS}회. 에이전트 프롬프트나 권한 설정 점검" >> "$ALERT_FILE"
|
|
187
|
-
ALERTS_FOUND=1
|
|
188
|
-
fi
|
|
189
|
-
fi
|
|
190
|
-
|
|
191
|
-
# Alert 2: Cache Hit Rate < 60% (토큰 데이터가 있을 때만)
|
|
192
|
-
if [ -n "$SESSION_END_USAGE" ] && [ "$SESSION_END_USAGE" != "{}" ]; then
|
|
193
|
-
if [ "$TOTAL_ALL_INPUT" -gt 0 ] && [ "$CACHE_HIT_RATE" -lt 60 ]; then
|
|
194
|
-
if [ "$ALERTS_FOUND" -eq 0 ] && [ ! -f "$ALERT_FILE" ]; then
|
|
195
|
-
echo "# Quality Alerts - ${TODAY}" > "$ALERT_FILE"
|
|
196
|
-
echo "" >> "$ALERT_FILE"
|
|
197
|
-
echo "> TimSquad 자동 품질 경고 - threshold 초과 시 자동 생성" >> "$ALERT_FILE"
|
|
198
|
-
echo "" >> "$ALERT_FILE"
|
|
199
|
-
fi
|
|
200
|
-
echo "- **[$TIMESTAMP]** Cache Hit Rate ${CACHE_HIT_RATE}% (< 60%) - 세션 \`$SESSION_SHORT\`" >> "$ALERT_FILE"
|
|
201
|
-
echo " - 프롬프트 구조 불안정. CLAUDE.md 또는 에이전트 프롬프트 검토" >> "$ALERT_FILE"
|
|
202
|
-
ALERTS_FOUND=1
|
|
203
|
-
fi
|
|
204
|
-
fi
|
|
205
|
-
|
|
206
|
-
# ============================================================
|
|
207
|
-
# 자동 피드백 생성 (실패 패턴 감지)
|
|
208
|
-
# 도구 실패 3회 이상 → 자동으로 FB-XXXX.json 생성
|
|
209
|
-
# 토큰 비용: 0
|
|
210
|
-
# ============================================================
|
|
211
|
-
|
|
212
|
-
if [ "$FAILURES" -ge 3 ]; then
|
|
213
|
-
FEEDBACK_DIR="$PROJECT_DIR/.timsquad/feedback"
|
|
214
|
-
mkdir -p "$FEEDBACK_DIR"
|
|
215
|
-
|
|
216
|
-
# 다음 피드백 번호 결정
|
|
217
|
-
EXISTING_COUNT=$(ls "$FEEDBACK_DIR"/FB-*.json 2>/dev/null | wc -l | tr -d ' ')
|
|
218
|
-
NEXT_NUM=$((EXISTING_COUNT + 1))
|
|
219
|
-
FB_ID=$(printf "FB-%04d" "$NEXT_NUM")
|
|
220
|
-
FB_FILE="$FEEDBACK_DIR/${FB_ID}.json"
|
|
221
|
-
|
|
222
|
-
# 실패한 도구 목록 추출
|
|
223
|
-
FAILED_TOOLS=$(jq -r 'select(.event == "PostToolUseFailure") | .tool // "unknown"' "$JSONL_FILE" 2>/dev/null \
|
|
224
|
-
| sort | uniq -c | sort -rn | head -3 \
|
|
225
|
-
| awk '{printf "%s(%d) ", $2, $1}')
|
|
226
|
-
|
|
227
|
-
jq -n \
|
|
228
|
-
--arg id "$FB_ID" \
|
|
229
|
-
--arg ts "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
|
|
230
|
-
--arg msg "세션 ${SESSION_SHORT}에서 도구 실패 ${FAILURES}회 감지. 실패 도구: ${FAILED_TOOLS}" \
|
|
231
|
-
--arg trigger "tool_failure" \
|
|
232
|
-
--arg session "$SESSION_SHORT" \
|
|
233
|
-
'{
|
|
234
|
-
id: $id,
|
|
235
|
-
timestamp: $ts,
|
|
236
|
-
type: "auto-feedback",
|
|
237
|
-
level: 1,
|
|
238
|
-
trigger: $trigger,
|
|
239
|
-
message: $msg,
|
|
240
|
-
routeTo: "developer",
|
|
241
|
-
tags: ["auto-detected", "tool_failure", $session]
|
|
242
|
-
}' > "$FB_FILE"
|
|
243
|
-
fi
|
|
244
|
-
|
|
245
|
-
exit 0
|