@trungtamcongnghedigital/vsaf 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +887 -0
- package/package.json +69 -0
- package/packages/cli/dist/commands/apply-pack.d.ts +29 -0
- package/packages/cli/dist/commands/apply-pack.d.ts.map +1 -0
- package/packages/cli/dist/commands/apply-pack.js +30 -0
- package/packages/cli/dist/commands/apply-pack.js.map +1 -0
- package/packages/cli/dist/commands/doctor.d.ts +22 -0
- package/packages/cli/dist/commands/doctor.d.ts.map +1 -0
- package/packages/cli/dist/commands/doctor.js +196 -0
- package/packages/cli/dist/commands/doctor.js.map +1 -0
- package/packages/cli/dist/commands/init/sdlc-docs.d.ts +11 -0
- package/packages/cli/dist/commands/init/sdlc-docs.d.ts.map +1 -0
- package/packages/cli/dist/commands/init/sdlc-docs.js +95 -0
- package/packages/cli/dist/commands/init/sdlc-docs.js.map +1 -0
- package/packages/cli/dist/commands/init.d.ts +51 -0
- package/packages/cli/dist/commands/init.d.ts.map +1 -0
- package/packages/cli/dist/commands/init.js +392 -0
- package/packages/cli/dist/commands/init.js.map +1 -0
- package/packages/cli/dist/commands/install/backup.d.ts +11 -0
- package/packages/cli/dist/commands/install/backup.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/backup.js +34 -0
- package/packages/cli/dist/commands/install/backup.js.map +1 -0
- package/packages/cli/dist/commands/install/bitbucket.d.ts +53 -0
- package/packages/cli/dist/commands/install/bitbucket.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/bitbucket.js +278 -0
- package/packages/cli/dist/commands/install/bitbucket.js.map +1 -0
- package/packages/cli/dist/commands/install/bootstrap-repo.d.ts +205 -0
- package/packages/cli/dist/commands/install/bootstrap-repo.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/bootstrap-repo.js +687 -0
- package/packages/cli/dist/commands/install/bootstrap-repo.js.map +1 -0
- package/packages/cli/dist/commands/install/credentials.d.ts +96 -0
- package/packages/cli/dist/commands/install/credentials.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/credentials.js +265 -0
- package/packages/cli/dist/commands/install/credentials.js.map +1 -0
- package/packages/cli/dist/commands/install/delegate.d.ts +163 -0
- package/packages/cli/dist/commands/install/delegate.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/delegate.js +663 -0
- package/packages/cli/dist/commands/install/delegate.js.map +1 -0
- package/packages/cli/dist/commands/install/ds-registry.d.ts +38 -0
- package/packages/cli/dist/commands/install/ds-registry.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/ds-registry.js +131 -0
- package/packages/cli/dist/commands/install/ds-registry.js.map +1 -0
- package/packages/cli/dist/commands/install/engine-range.d.ts +13 -0
- package/packages/cli/dist/commands/install/engine-range.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/engine-range.js +50 -0
- package/packages/cli/dist/commands/install/engine-range.js.map +1 -0
- package/packages/cli/dist/commands/install/engine-version.d.ts +16 -0
- package/packages/cli/dist/commands/install/engine-version.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/engine-version.js +43 -0
- package/packages/cli/dist/commands/install/engine-version.js.map +1 -0
- package/packages/cli/dist/commands/install/flow-home.d.ts +24 -0
- package/packages/cli/dist/commands/install/flow-home.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/flow-home.js +63 -0
- package/packages/cli/dist/commands/install/flow-home.js.map +1 -0
- package/packages/cli/dist/commands/install/flow-script.d.ts +97 -0
- package/packages/cli/dist/commands/install/flow-script.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/flow-script.js +300 -0
- package/packages/cli/dist/commands/install/flow-script.js.map +1 -0
- package/packages/cli/dist/commands/install/flow-source.d.ts +165 -0
- package/packages/cli/dist/commands/install/flow-source.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/flow-source.js +549 -0
- package/packages/cli/dist/commands/install/flow-source.js.map +1 -0
- package/packages/cli/dist/commands/install/gitignore.d.ts +15 -0
- package/packages/cli/dist/commands/install/gitignore.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/gitignore.js +73 -0
- package/packages/cli/dist/commands/install/gitignore.js.map +1 -0
- package/packages/cli/dist/commands/install/global-sync.d.ts +41 -0
- package/packages/cli/dist/commands/install/global-sync.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/global-sync.js +123 -0
- package/packages/cli/dist/commands/install/global-sync.js.map +1 -0
- package/packages/cli/dist/commands/install/hooks.d.ts +38 -0
- package/packages/cli/dist/commands/install/hooks.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/hooks.js +215 -0
- package/packages/cli/dist/commands/install/hooks.js.map +1 -0
- package/packages/cli/dist/commands/install/ide-mirror.d.ts +50 -0
- package/packages/cli/dist/commands/install/ide-mirror.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/ide-mirror.js +160 -0
- package/packages/cli/dist/commands/install/ide-mirror.js.map +1 -0
- package/packages/cli/dist/commands/install/install-plan.d.ts +80 -0
- package/packages/cli/dist/commands/install/install-plan.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/install-plan.js +164 -0
- package/packages/cli/dist/commands/install/install-plan.js.map +1 -0
- package/packages/cli/dist/commands/install/manifest.d.ts +84 -0
- package/packages/cli/dist/commands/install/manifest.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/manifest.js +152 -0
- package/packages/cli/dist/commands/install/manifest.js.map +1 -0
- package/packages/cli/dist/commands/install/option-channels.d.ts +20 -0
- package/packages/cli/dist/commands/install/option-channels.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/option-channels.js +40 -0
- package/packages/cli/dist/commands/install/option-channels.js.map +1 -0
- package/packages/cli/dist/commands/install/pick-repos.d.ts +84 -0
- package/packages/cli/dist/commands/install/pick-repos.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/pick-repos.js +208 -0
- package/packages/cli/dist/commands/install/pick-repos.js.map +1 -0
- package/packages/cli/dist/commands/install/plan.d.ts +14 -0
- package/packages/cli/dist/commands/install/plan.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/plan.js +197 -0
- package/packages/cli/dist/commands/install/plan.js.map +1 -0
- package/packages/cli/dist/commands/install/precommit.d.ts +15 -0
- package/packages/cli/dist/commands/install/precommit.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/precommit.js +42 -0
- package/packages/cli/dist/commands/install/precommit.js.map +1 -0
- package/packages/cli/dist/commands/install/project-name.d.ts +16 -0
- package/packages/cli/dist/commands/install/project-name.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/project-name.js +45 -0
- package/packages/cli/dist/commands/install/project-name.js.map +1 -0
- package/packages/cli/dist/commands/install/prompt-read.d.ts +27 -0
- package/packages/cli/dist/commands/install/prompt-read.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/prompt-read.js +60 -0
- package/packages/cli/dist/commands/install/prompt-read.js.map +1 -0
- package/packages/cli/dist/commands/install/python.d.ts +25 -0
- package/packages/cli/dist/commands/install/python.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/python.js +58 -0
- package/packages/cli/dist/commands/install/python.js.map +1 -0
- package/packages/cli/dist/commands/install/repo-scope.d.ts +36 -0
- package/packages/cli/dist/commands/install/repo-scope.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/repo-scope.js +182 -0
- package/packages/cli/dist/commands/install/repo-scope.js.map +1 -0
- package/packages/cli/dist/commands/install/repos-config.d.ts +48 -0
- package/packages/cli/dist/commands/install/repos-config.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/repos-config.js +160 -0
- package/packages/cli/dist/commands/install/repos-config.js.map +1 -0
- package/packages/cli/dist/commands/install/resolve-inputs.d.ts +94 -0
- package/packages/cli/dist/commands/install/resolve-inputs.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/resolve-inputs.js +297 -0
- package/packages/cli/dist/commands/install/resolve-inputs.js.map +1 -0
- package/packages/cli/dist/commands/install/rules.d.ts +22 -0
- package/packages/cli/dist/commands/install/rules.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/rules.js +131 -0
- package/packages/cli/dist/commands/install/rules.js.map +1 -0
- package/packages/cli/dist/commands/install/selftest.d.ts +14 -0
- package/packages/cli/dist/commands/install/selftest.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/selftest.js +105 -0
- package/packages/cli/dist/commands/install/selftest.js.map +1 -0
- package/packages/cli/dist/commands/install/session-hook.d.ts +29 -0
- package/packages/cli/dist/commands/install/session-hook.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/session-hook.js +59 -0
- package/packages/cli/dist/commands/install/session-hook.js.map +1 -0
- package/packages/cli/dist/commands/install/skill-hooks.d.ts +19 -0
- package/packages/cli/dist/commands/install/skill-hooks.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/skill-hooks.js +73 -0
- package/packages/cli/dist/commands/install/skill-hooks.js.map +1 -0
- package/packages/cli/dist/commands/install/skills-lock.d.ts +31 -0
- package/packages/cli/dist/commands/install/skills-lock.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/skills-lock.js +72 -0
- package/packages/cli/dist/commands/install/skills-lock.js.map +1 -0
- package/packages/cli/dist/commands/install/spec-scaffold.d.ts +84 -0
- package/packages/cli/dist/commands/install/spec-scaffold.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/spec-scaffold.js +238 -0
- package/packages/cli/dist/commands/install/spec-scaffold.js.map +1 -0
- package/packages/cli/dist/commands/install/workspace-file.d.ts +17 -0
- package/packages/cli/dist/commands/install/workspace-file.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/workspace-file.js +53 -0
- package/packages/cli/dist/commands/install/workspace-file.js.map +1 -0
- package/packages/cli/dist/commands/install/workspace.d.ts +95 -0
- package/packages/cli/dist/commands/install/workspace.d.ts.map +1 -0
- package/packages/cli/dist/commands/install/workspace.js +278 -0
- package/packages/cli/dist/commands/install/workspace.js.map +1 -0
- package/packages/cli/dist/commands/install.d.ts +156 -0
- package/packages/cli/dist/commands/install.d.ts.map +1 -0
- package/packages/cli/dist/commands/install.js +1100 -0
- package/packages/cli/dist/commands/install.js.map +1 -0
- package/packages/cli/dist/commands/list.d.ts +7 -0
- package/packages/cli/dist/commands/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/list.js +40 -0
- package/packages/cli/dist/commands/list.js.map +1 -0
- package/packages/cli/dist/commands/mcp.d.ts +2 -0
- package/packages/cli/dist/commands/mcp.d.ts.map +1 -0
- package/packages/cli/dist/commands/mcp.js +8 -0
- package/packages/cli/dist/commands/mcp.js.map +1 -0
- package/packages/cli/dist/commands/run.d.ts +13 -0
- package/packages/cli/dist/commands/run.d.ts.map +1 -0
- package/packages/cli/dist/commands/run.js +121 -0
- package/packages/cli/dist/commands/run.js.map +1 -0
- package/packages/cli/dist/commands/serve.d.ts +6 -0
- package/packages/cli/dist/commands/serve.d.ts.map +1 -0
- package/packages/cli/dist/commands/serve.js +28 -0
- package/packages/cli/dist/commands/serve.js.map +1 -0
- package/packages/cli/dist/commands/skill.d.ts +176 -0
- package/packages/cli/dist/commands/skill.d.ts.map +1 -0
- package/packages/cli/dist/commands/skill.js +399 -0
- package/packages/cli/dist/commands/skill.js.map +1 -0
- package/packages/cli/dist/commands/status.d.ts +4 -0
- package/packages/cli/dist/commands/status.d.ts.map +1 -0
- package/packages/cli/dist/commands/status.js +21 -0
- package/packages/cli/dist/commands/status.js.map +1 -0
- package/packages/cli/dist/commands/sync.d.ts +25 -0
- package/packages/cli/dist/commands/sync.d.ts.map +1 -0
- package/packages/cli/dist/commands/sync.js +46 -0
- package/packages/cli/dist/commands/sync.js.map +1 -0
- package/packages/cli/dist/commands/telemetry-skill.d.ts +73 -0
- package/packages/cli/dist/commands/telemetry-skill.d.ts.map +1 -0
- package/packages/cli/dist/commands/telemetry-skill.js +347 -0
- package/packages/cli/dist/commands/telemetry-skill.js.map +1 -0
- package/packages/cli/dist/commands/uninstall.d.ts +23 -0
- package/packages/cli/dist/commands/uninstall.d.ts.map +1 -0
- package/packages/cli/dist/commands/uninstall.js +226 -0
- package/packages/cli/dist/commands/uninstall.js.map +1 -0
- package/packages/cli/dist/index.d.ts +3 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +1003 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/mcp/drift-glue.d.ts +10 -0
- package/packages/cli/dist/mcp/drift-glue.d.ts.map +1 -0
- package/packages/cli/dist/mcp/drift-glue.js +27 -0
- package/packages/cli/dist/mcp/drift-glue.js.map +1 -0
- package/packages/cli/dist/mcp/server.d.ts +107 -0
- package/packages/cli/dist/mcp/server.d.ts.map +1 -0
- package/packages/cli/dist/mcp/server.js +477 -0
- package/packages/cli/dist/mcp/server.js.map +1 -0
- package/packages/cli/dist/server/app.d.ts +8 -0
- package/packages/cli/dist/server/app.d.ts.map +1 -0
- package/packages/cli/dist/server/app.js +29 -0
- package/packages/cli/dist/server/app.js.map +1 -0
- package/packages/cli/dist/server/routes/health.d.ts +3 -0
- package/packages/cli/dist/server/routes/health.d.ts.map +1 -0
- package/packages/cli/dist/server/routes/health.js +13 -0
- package/packages/cli/dist/server/routes/health.js.map +1 -0
- package/packages/cli/dist/server/routes/runs.d.ts +9 -0
- package/packages/cli/dist/server/routes/runs.d.ts.map +1 -0
- package/packages/cli/dist/server/routes/runs.js +57 -0
- package/packages/cli/dist/server/routes/runs.js.map +1 -0
- package/packages/cli/dist/server/routes/workflows.d.ts +5 -0
- package/packages/cli/dist/server/routes/workflows.d.ts.map +1 -0
- package/packages/cli/dist/server/routes/workflows.js +56 -0
- package/packages/cli/dist/server/routes/workflows.js.map +1 -0
- package/packages/cli/dist/server/services/execution-manager.d.ts +15 -0
- package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -0
- package/packages/cli/dist/server/services/execution-manager.js +92 -0
- package/packages/cli/dist/server/services/execution-manager.js.map +1 -0
- package/packages/cli/dist/server/services/sse-manager.d.ts +9 -0
- package/packages/cli/dist/server/services/sse-manager.d.ts.map +1 -0
- package/packages/cli/dist/server/services/sse-manager.js +41 -0
- package/packages/cli/dist/server/services/sse-manager.js.map +1 -0
- package/packages/cli/dist/server/static.d.ts +3 -0
- package/packages/cli/dist/server/static.d.ts.map +1 -0
- package/packages/cli/dist/server/static.js +30 -0
- package/packages/cli/dist/server/static.js.map +1 -0
- package/packages/cli/dist/telemetry/active-node.d.ts +36 -0
- package/packages/cli/dist/telemetry/active-node.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/active-node.js +195 -0
- package/packages/cli/dist/telemetry/active-node.js.map +1 -0
- package/packages/cli/dist/telemetry/callbacks.d.ts +58 -0
- package/packages/cli/dist/telemetry/callbacks.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/callbacks.js +140 -0
- package/packages/cli/dist/telemetry/callbacks.js.map +1 -0
- package/packages/cli/dist/telemetry/config.d.ts +32 -0
- package/packages/cli/dist/telemetry/config.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/config.js +90 -0
- package/packages/cli/dist/telemetry/config.js.map +1 -0
- package/packages/cli/dist/telemetry/fs-safe.d.ts +10 -0
- package/packages/cli/dist/telemetry/fs-safe.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/fs-safe.js +15 -0
- package/packages/cli/dist/telemetry/fs-safe.js.map +1 -0
- package/packages/cli/dist/telemetry/index.d.ts +31 -0
- package/packages/cli/dist/telemetry/index.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/index.js +89 -0
- package/packages/cli/dist/telemetry/index.js.map +1 -0
- package/packages/cli/dist/telemetry/langfuse-scores.d.ts +23 -0
- package/packages/cli/dist/telemetry/langfuse-scores.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/langfuse-scores.js +54 -0
- package/packages/cli/dist/telemetry/langfuse-scores.js.map +1 -0
- package/packages/cli/dist/telemetry/metrics/code-roots.d.ts +15 -0
- package/packages/cli/dist/telemetry/metrics/code-roots.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/metrics/code-roots.js +85 -0
- package/packages/cli/dist/telemetry/metrics/code-roots.js.map +1 -0
- package/packages/cli/dist/telemetry/metrics/output-metrics.d.ts +124 -0
- package/packages/cli/dist/telemetry/metrics/output-metrics.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/metrics/output-metrics.js +440 -0
- package/packages/cli/dist/telemetry/metrics/output-metrics.js.map +1 -0
- package/packages/cli/dist/telemetry/otel-sdk.d.ts +58 -0
- package/packages/cli/dist/telemetry/otel-sdk.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/otel-sdk.js +148 -0
- package/packages/cli/dist/telemetry/otel-sdk.js.map +1 -0
- package/packages/cli/dist/telemetry/otel-tracer.d.ts +39 -0
- package/packages/cli/dist/telemetry/otel-tracer.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/otel-tracer.js +391 -0
- package/packages/cli/dist/telemetry/otel-tracer.js.map +1 -0
- package/packages/cli/dist/telemetry/session/claude-session.d.ts +9 -0
- package/packages/cli/dist/telemetry/session/claude-session.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/session/claude-session.js +33 -0
- package/packages/cli/dist/telemetry/session/claude-session.js.map +1 -0
- package/packages/cli/dist/telemetry/skill-metrics-paths.d.ts +9 -0
- package/packages/cli/dist/telemetry/skill-metrics-paths.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/skill-metrics-paths.js +12 -0
- package/packages/cli/dist/telemetry/skill-metrics-paths.js.map +1 -0
- package/packages/cli/dist/telemetry/tracer.d.ts +63 -0
- package/packages/cli/dist/telemetry/tracer.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/tracer.js +15 -0
- package/packages/cli/dist/telemetry/tracer.js.map +1 -0
- package/packages/cli/dist/telemetry/user.d.ts +9 -0
- package/packages/cli/dist/telemetry/user.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/user.js +37 -0
- package/packages/cli/dist/telemetry/user.js.map +1 -0
- package/packages/cli/dist/ui/progress.d.ts +3 -0
- package/packages/cli/dist/ui/progress.d.ts.map +1 -0
- package/packages/cli/dist/ui/progress.js +27 -0
- package/packages/cli/dist/ui/progress.js.map +1 -0
- package/packages/core/dist/commands/command-loader.d.ts +9 -0
- package/packages/core/dist/commands/command-loader.d.ts.map +1 -0
- package/packages/core/dist/commands/command-loader.js +32 -0
- package/packages/core/dist/commands/command-loader.js.map +1 -0
- package/packages/core/dist/commands/prompt-builder.d.ts +3 -0
- package/packages/core/dist/commands/prompt-builder.d.ts.map +1 -0
- package/packages/core/dist/commands/prompt-builder.js +9 -0
- package/packages/core/dist/commands/prompt-builder.js.map +1 -0
- package/packages/core/dist/config/config-loader.d.ts +60 -0
- package/packages/core/dist/config/config-loader.d.ts.map +1 -0
- package/packages/core/dist/config/config-loader.js +54 -0
- package/packages/core/dist/config/config-loader.js.map +1 -0
- package/packages/core/dist/engine/condition-evaluator.d.ts +7 -0
- package/packages/core/dist/engine/condition-evaluator.d.ts.map +1 -0
- package/packages/core/dist/engine/condition-evaluator.js +37 -0
- package/packages/core/dist/engine/condition-evaluator.js.map +1 -0
- package/packages/core/dist/engine/contract-validator.d.ts +2 -0
- package/packages/core/dist/engine/contract-validator.d.ts.map +1 -0
- package/packages/core/dist/engine/contract-validator.js +8 -0
- package/packages/core/dist/engine/contract-validator.js.map +1 -0
- package/packages/core/dist/engine/cycle-detector.d.ts +4 -0
- package/packages/core/dist/engine/cycle-detector.d.ts.map +1 -0
- package/packages/core/dist/engine/cycle-detector.js +39 -0
- package/packages/core/dist/engine/cycle-detector.js.map +1 -0
- package/packages/core/dist/engine/dag-executor.d.ts +135 -0
- package/packages/core/dist/engine/dag-executor.d.ts.map +1 -0
- package/packages/core/dist/engine/dag-executor.js +535 -0
- package/packages/core/dist/engine/dag-executor.js.map +1 -0
- package/packages/core/dist/engine/dag-parser.d.ts +3 -0
- package/packages/core/dist/engine/dag-parser.d.ts.map +1 -0
- package/packages/core/dist/engine/dag-parser.js +92 -0
- package/packages/core/dist/engine/dag-parser.js.map +1 -0
- package/packages/core/dist/engine/node-runner.d.ts +31 -0
- package/packages/core/dist/engine/node-runner.d.ts.map +1 -0
- package/packages/core/dist/engine/node-runner.js +145 -0
- package/packages/core/dist/engine/node-runner.js.map +1 -0
- package/packages/core/dist/engine/variable-resolver.d.ts +24 -0
- package/packages/core/dist/engine/variable-resolver.d.ts.map +1 -0
- package/packages/core/dist/engine/variable-resolver.js +55 -0
- package/packages/core/dist/engine/variable-resolver.js.map +1 -0
- package/packages/core/dist/index.d.ts +22 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +60 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/isolation/artifact-store.d.ts +9 -0
- package/packages/core/dist/isolation/artifact-store.d.ts.map +1 -0
- package/packages/core/dist/isolation/artifact-store.js +30 -0
- package/packages/core/dist/isolation/artifact-store.js.map +1 -0
- package/packages/core/dist/isolation/workspace-manager.d.ts +65 -0
- package/packages/core/dist/isolation/workspace-manager.d.ts.map +1 -0
- package/packages/core/dist/isolation/workspace-manager.js +272 -0
- package/packages/core/dist/isolation/workspace-manager.js.map +1 -0
- package/packages/core/dist/isolation/workspace-resolver.d.ts +18 -0
- package/packages/core/dist/isolation/workspace-resolver.d.ts.map +1 -0
- package/packages/core/dist/isolation/workspace-resolver.js +24 -0
- package/packages/core/dist/isolation/workspace-resolver.js.map +1 -0
- package/packages/core/dist/providers/provider-registry.d.ts +8 -0
- package/packages/core/dist/providers/provider-registry.d.ts.map +1 -0
- package/packages/core/dist/providers/provider-registry.js +21 -0
- package/packages/core/dist/providers/provider-registry.js.map +1 -0
- package/packages/core/dist/schema/ajv-instance.d.ts +3 -0
- package/packages/core/dist/schema/ajv-instance.d.ts.map +1 -0
- package/packages/core/dist/schema/ajv-instance.js +12 -0
- package/packages/core/dist/schema/ajv-instance.js.map +1 -0
- package/packages/core/dist/schema/validators.d.ts +11 -0
- package/packages/core/dist/schema/validators.d.ts.map +1 -0
- package/packages/core/dist/schema/validators.js +68 -0
- package/packages/core/dist/schema/validators.js.map +1 -0
- package/packages/core/dist/schema/workflow-schema.d.ts +188 -0
- package/packages/core/dist/schema/workflow-schema.d.ts.map +1 -0
- package/packages/core/dist/schema/workflow-schema.js +104 -0
- package/packages/core/dist/schema/workflow-schema.js.map +1 -0
- package/packages/core/dist/skills/skill-loader.d.ts +9 -0
- package/packages/core/dist/skills/skill-loader.d.ts.map +1 -0
- package/packages/core/dist/skills/skill-loader.js +42 -0
- package/packages/core/dist/skills/skill-loader.js.map +1 -0
- package/packages/core/dist/store/event-log.d.ts +8 -0
- package/packages/core/dist/store/event-log.d.ts.map +1 -0
- package/packages/core/dist/store/event-log.js +30 -0
- package/packages/core/dist/store/event-log.js.map +1 -0
- package/packages/core/dist/store/run-lock.d.ts +19 -0
- package/packages/core/dist/store/run-lock.d.ts.map +1 -0
- package/packages/core/dist/store/run-lock.js +70 -0
- package/packages/core/dist/store/run-lock.js.map +1 -0
- package/packages/core/dist/store/run-store.d.ts +31 -0
- package/packages/core/dist/store/run-store.d.ts.map +1 -0
- package/packages/core/dist/store/run-store.js +136 -0
- package/packages/core/dist/store/run-store.js.map +1 -0
- package/packages/core/dist/store/types.d.ts +30 -0
- package/packages/core/dist/store/types.d.ts.map +1 -0
- package/packages/core/dist/store/types.js +3 -0
- package/packages/core/dist/store/types.js.map +1 -0
- package/packages/core/dist/types/dag.d.ts +49 -0
- package/packages/core/dist/types/dag.d.ts.map +1 -0
- package/packages/core/dist/types/dag.js +3 -0
- package/packages/core/dist/types/dag.js.map +1 -0
- package/packages/core/dist/types/index.d.ts +4 -0
- package/packages/core/dist/types/index.d.ts.map +1 -0
- package/packages/core/dist/types/index.js +20 -0
- package/packages/core/dist/types/index.js.map +1 -0
- package/packages/core/dist/types/provider.d.ts +19 -0
- package/packages/core/dist/types/provider.d.ts.map +1 -0
- package/packages/core/dist/types/provider.js +3 -0
- package/packages/core/dist/types/provider.js.map +1 -0
- package/packages/core/dist/types/workflow.d.ts +63 -0
- package/packages/core/dist/types/workflow.d.ts.map +1 -0
- package/packages/core/dist/types/workflow.js +3 -0
- package/packages/core/dist/types/workflow.js.map +1 -0
- package/packages/web/dist/web/3rdpartylicenses.txt +614 -0
- package/packages/web/dist/web/browser/chunk-2QJBTGYU.js +3 -0
- package/packages/web/dist/web/browser/chunk-3VYLP4FZ.js +1 -0
- package/packages/web/dist/web/browser/chunk-6HRQZQXD.js +1 -0
- package/packages/web/dist/web/browser/chunk-7PK6Q4UU.js +1 -0
- package/packages/web/dist/web/browser/chunk-O7TQGEFF.js +8 -0
- package/packages/web/dist/web/browser/chunk-PWF76NCM.js +1 -0
- package/packages/web/dist/web/browser/favicon.ico +0 -0
- package/packages/web/dist/web/browser/index.html +13 -0
- package/packages/web/dist/web/browser/main-AZU5W3KI.js +1 -0
- package/packages/web/dist/web/browser/polyfills-YMBILSHJ.js +2 -0
- package/packages/web/dist/web/browser/styles-JBPZVY54.css +1 -0
- package/packages/web/dist/web/prerendered-routes.json +3 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/agents/agent_a_context_strategist.md +23 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/agents/agent_b_research_scout.md +23 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/agents/agent_c_system_architect.md +30 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/agents/agent_d_implementation_sec.md +24 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/agents/agent_e_orchestrator.md +31 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/agents/agent_f_integration_architect.md +28 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/principles/iron_rules.md +111 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-01-init.md +138 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-02-strategy.md +142 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-03-research.md +111 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-04.1-architecture-global.md +153 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-04.1b-wbs-audit.md +97 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-04.2-architecture-modules.md +75 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-05-implementation-security.md +170 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-06-module0.md +106 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/steps/step-07-assembly.md +168 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/templates/architecture_design_final_template.md +268 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/templates/coverage_matrix_wbs.md +210 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/templates/module_0_template.md +76 -0
- package/skills/NTAPP/.agent/skills/NTAPP-architecture-design/workflow.md +235 -0
- package/skills/NTAPP/.agent/skills/NTAPP-bug-fix-engine/SKILL.md +35 -0
- package/skills/NTAPP/.agent/skills/NTAPP-bug-fix-engine/steps/step-01-rootcause-gates.md +42 -0
- package/skills/NTAPP/.agent/skills/NTAPP-bug-fix-engine/steps/step-02-fix-verify-review.md +46 -0
- package/skills/NTAPP/.agent/skills/NTAPP-bug-fix-engine/steps/step-03-close.md +46 -0
- package/skills/NTAPP/.agent/skills/NTAPP-bug-fix-engine/workflow.md +100 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/SKILL.md +111 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/agents/agent_erd_data_architect.md +30 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/references/confluence-publish.md +113 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/references/diagram-drawio.md +108 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/references/erd-consolidation.md +102 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/references/extract-from-code.md +19 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/references/scope-brownfield-vs-newbuild.md +28 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/references/style-conventions.md +120 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/scripts/confluence-get.ps1 +73 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/scripts/confluence-publish.ps1 +210 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/scripts/drawio_lib.py +578 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/scripts/preview.py +487 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/scripts/test_drawio_erd.py +61 -0
- package/skills/NTAPP/.agent/skills/NTAPP-business-overview-confluence/workflow.md +175 -0
- package/skills/NTAPP/.agent/skills/NTAPP-create-pull-request/SKILL.md +162 -0
- package/skills/NTAPP/.agent/skills/NTAPP-create-pull-request/bitbucket_pr.py +414 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/agents/agent_d0_orchestrator.md +27 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/agents/agent_d1_strategic_analyst.md +24 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/agents/agent_d2_tactical_modeler.md +24 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/agents/agent_d3_maturity_assessor.md +24 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/agents/agent_d4_target_migration.md +24 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/principles/iron_rules.md +110 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/principles/maturity_rubric.md +88 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/steps/step-01-init.md +94 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/steps/step-02-strategic.md +70 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/steps/step-03-tactical.md +66 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/steps/step-04-maturity.md +64 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/steps/step-05-target-migration.md +71 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/steps/step-06-assembly.md +76 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/templates/aggregates_template.md +46 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/templates/context_bc_template.md +33 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/templates/context_map_template.md +58 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/templates/events_template.md +33 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/templates/maturity_template.md +58 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/templates/migration_template.md +38 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/templates/target_template.md +47 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-design/workflow.md +185 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-to-confluence/SKILL.md +35 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-to-confluence/references/confluence-api.md +121 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-to-confluence/references/mermaid-to-plantuml.md +93 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-to-confluence/references/storage-format.md +91 -0
- package/skills/NTAPP/.agent/skills/NTAPP-dd-to-confluence/workflow.md +207 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/SKILL.md +14 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/agents/bootstrap-applier.md +110 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/agents/component-discoverer.md +255 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/agents/conflict-resolver.md +181 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/agents/library-api-parser.md +143 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/agents/normalizer.md +213 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/agents/raw-style-extractor.md +144 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/agents/stack-detector.md +135 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-01-stack-detect.md +127 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-01b-library-api-parse.md +155 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-02-extract.md +55 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-03-discover.md +96 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-03b-visual-reference.md +83 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-04-normalize.md +82 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-05-conflict-resolve.md +58 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-06-human-approval.md +92 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/steps/step-07-apply.md +123 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-bootstrap/workflow.md +147 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/SKILL.md +16 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/agents/component-patcher.md +103 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/agents/component-scaffolder.md +214 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/agents/delta-router.md +97 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/agents/metadata-registrar.md +140 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/agents/runtime-token-exporter.md +214 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/agents/token-applier.md +70 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/agents/warning-blocker.md +71 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/steps/step-01-route.md +111 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/steps/step-02-warning-gate.md +87 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/steps/step-03-apply-tokens.md +97 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/steps/step-03b-export-runtime-tokens.md +110 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/steps/step-04-apply-components.md +228 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/steps/step-05-archive-report.md +79 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ds-build-component/workflow.md +151 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/SKILL.md +13 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/agents/agent_f0_orchestrator.md +33 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/agents/agent_f1_logic_specialist.md +19 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/agents/agent_f2_test_data_specialist.md +23 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/agents/agent_f3_ui_specialist.md +40 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/agents/agent_f4_qa_specialist.md +22 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/principles/iron_rules.md +144 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/steps/step-01-inheritance-audit.md +110 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/steps/step-02-ui-interaction-design.md +152 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/steps/step-03-logic-modeling.md +39 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/steps/step-04-data-integration.md +47 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/steps/step-05-qa-protocol.md +32 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/steps/step-06-sync-audit.md +84 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/steps/step-07-assembly.md +84 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/templates/master_detailed_design_v4_template.md +190 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-design/workflow.md +318 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-triage/SKILL.md +12 -0
- package/skills/NTAPP/.agent/skills/NTAPP-feature-triage/workflow.md +271 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/SKILL.md +14 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/agents/frame-mapper.md +74 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/references/figma-manifest-schema.md +151 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/scripts/figma-fetch.sh +263 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/steps/step-01-source-resolve.md +112 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/steps/step-01t-token-export.md +77 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/steps/step-02-frame-harvest.md +99 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/steps/step-03-unit-mapping.md +139 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/steps/step-04-spec-extract.md +276 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/steps/step-05-ds-reconcile.md +135 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/steps/step-06-frame-export.md +77 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/steps/step-07-emit.md +147 -0
- package/skills/NTAPP/.agent/skills/NTAPP-figma-ingest/workflow.md +255 -0
- package/skills/NTAPP/.agent/skills/NTAPP-fix-bug/SKILL.md +48 -0
- package/skills/NTAPP/.agent/skills/NTAPP-fix-bug/steps/step-01-triage-plan.md +76 -0
- package/skills/NTAPP/.agent/skills/NTAPP-fix-bug/steps/step-02-fix-and-verify.md +60 -0
- package/skills/NTAPP/.agent/skills/NTAPP-fix-bug/steps/step-03-doc-sync-report.md +102 -0
- package/skills/NTAPP/.agent/skills/NTAPP-fix-bug/workflow.md +110 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/SKILL.md +14 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/references/api-spec-template.md +160 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/references/elicitation-questions.md +113 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/references/erd-and-mapping.md +124 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/references/integration-types.md +87 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/references/output-template.md +157 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/references/qa-file-template.md +25 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/references/sequence-diagram-examples.md +163 -0
- package/skills/NTAPP/.agent/skills/NTAPP-integration-inspection/workflow.md +144 -0
- package/skills/NTAPP/.agent/skills/NTAPP-jira-subtask-creator/SKILL.md +236 -0
- package/skills/NTAPP/.agent/skills/NTAPP-jira-subtask-creator/env.example.md +15 -0
- package/skills/NTAPP/.agent/skills/NTAPP-jira-subtask-creator/jira_subtask.py +711 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/SKILL.md +74 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/references/confluence-resolve.md +106 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/references/delta-detection.md +96 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/references/kbnt-authoring.md +128 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/references/merge-rules.md +113 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/scripts/build-kbnt-storage.py +273 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/scripts/confluence-create.ps1 +51 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/scripts/confluence-update.ps1 +59 -0
- package/skills/NTAPP/.agent/skills/NTAPP-kbnt-to-confluence/workflow.md +244 -0
- package/skills/NTAPP/.agent/skills/NTAPP-keycloak-integrate/SKILL.md +56 -0
- package/skills/NTAPP/.agent/skills/NTAPP-keycloak-integrate/references/be-integration.md +135 -0
- package/skills/NTAPP/.agent/skills/NTAPP-keycloak-integrate/references/fe-integration.md +120 -0
- package/skills/NTAPP/.agent/skills/NTAPP-keycloak-integrate/references/keycloak-config.md +155 -0
- package/skills/NTAPP/.agent/skills/NTAPP-keycloak-integrate/references/troubleshooting.md +61 -0
- package/skills/NTAPP/.agent/skills/NTAPP-keycloak-integrate/scripts/kc-admin.js +903 -0
- package/skills/NTAPP/.agent/skills/NTAPP-log-bug/SKILL.md +331 -0
- package/skills/NTAPP/.agent/skills/NTAPP-log-bug/capture-bug-image.sh +176 -0
- package/skills/NTAPP/.agent/skills/NTAPP-log-bug/env.example.md +19 -0
- package/skills/NTAPP/.agent/skills/NTAPP-log-bug/jira_bug.py +481 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/agents/chief_editor.md +33 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/agents/feature_analyst.md +45 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/agents/market_researcher.md +30 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/agents/product_strategist.md +46 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/agents/scout_agent.md +28 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/steps/step-00-scout-jtbd.md +19 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/steps/step-01-market-research.md +11 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/steps/step-02-product-strategy.md +14 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/steps/step-03-feature-analysis.md +13 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/steps/step-04-chief-editor-synthesis.md +19 -0
- package/skills/NTAPP/.agent/skills/NTAPP-market-research/workflow.md +66 -0
- package/skills/NTAPP/.agent/skills/NTAPP-okf-refresh/SKILL.md +238 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/agents/pr_chief_editor.md +17 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/agents/product_manager.md +18 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/agents/user_researcher.md +18 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/steps/step-01-init.md +18 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/steps/step-02-segmentation.md +28 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/steps/step-03-journey.md +32 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/steps/step-04-pain-matrix.md +22 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/steps/step-05-prioritization.md +17 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/steps/step-06-synthesis.md +19 -0
- package/skills/NTAPP/.agent/skills/NTAPP-product-research/workflow.md +58 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/SKILL.md +10 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/agents/agent_qa_auditor.md +33 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/references/behavior-completeness-rules.md +45 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/references/contract-consistency-rules.md +38 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/references/no-hallucination-rule.md +44 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/references/ntapp-core-compliance.md +45 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/steps/step-01-ambiguity-audit.md +44 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/templates/qa_report_template.md +90 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-audit/workflow.md +85 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-gap-resolver/SKILL.md +12 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-gap-resolver/references/no-hallucination-rule.md +23 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-gap-resolver/references/priority-resolution-rule.md +64 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-gap-resolver/steps/step-01-parse-and-map.md +49 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-gap-resolver/steps/step-02-evidence-and-propose.md +48 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-gap-resolver/steps/step-03-writeback-gate.md +51 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-gap-resolver/steps/step-04-execute.md +44 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-gap-resolver/workflow.md +106 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/SKILL.md +20 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/agents/agent_generate_manual_testcase.md +27 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/automation_contract_rules.md +125 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/borrowed_surface_rules.md +63 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/dynamic_data_rules.md +152 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/explore_and_consistency_rules.md +128 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/finalization_rules.md +30 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/incremental_update_rules.md +50 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/iron_rules.md +121 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/markdown_safety_rules.md +48 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/risk_based_allocation_rules.md +118 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/run_mode_rules.md +84 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/service_surface_rules.md +136 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/slice_planning_rules.md +54 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/testcase_generation_gates.md +76 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/principles/unit_classification_rules.md +49 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/00-core/README.md +19 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/00-core/e2e-traceability-rule.md +46 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/00-core/kbkt-format-rule.md +68 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/00-core/no-hallucination-rule.md +63 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/00-core/ntapp-core-compliance.md +45 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/00-core/test-coverage-checklist-rule.md +46 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/00-core/test-design-techniques-rule.md +21 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/01-ui/keyboard-navigation-rule.md +34 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/01-ui/layout-visual-rule.md +39 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/01-ui/responsive-zoom-rule.md +30 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/01-ui/screen-default-display-rule.md +68 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/02-input/datepicker-rule.md +56 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/02-input/file-upload-rule.md +39 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/02-input/maxlength-rule.md +72 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/02-input/required-field-rule.md +59 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/02-input/security-input-rule.md +40 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/02-input/space-handling-rule.md +49 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/02-input/textbox-base-rule.md +69 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/03-selection/checkbox-rule.md +35 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/03-selection/combobox-base-rule.md +55 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/03-selection/dependent-combobox-rule.md +46 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/03-selection/radio-rule.md +33 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/04-dynamic-form/dynamic-form-rendering-rule.md +38 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/04-dynamic-form/dynamic-row-add-remove-rule.md +52 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/04-dynamic-form/multiple-group-toggle-rule.md +56 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/05-dependent-filter/filter-rule-block-rule.md +69 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/05-dependent-filter/filter-save-validation-rule.md +49 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/06-validation/duplicate-data-rule.md +44 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/06-validation/error-response-behavior-rule.md +42 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/06-validation/field-level-validation-rule.md +26 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/06-validation/inline-error-rule.md +62 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/07-save-cancel/action-button-rule.md +67 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/07-save-cancel/cancel-button-rule.md +42 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/07-save-cancel/save-button-rule.md +48 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/08-review/compliance-audit-rule.md +30 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/08-review/coverage-audit-rule.md +48 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/08-review/kbkt-review-gate-rule.md +42 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/08-review/ntapp-review-anti-patterns.md +16 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/09-data-grid/grid-base-rule.md +41 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/10-be/backend-resilience-rule.md +78 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/10-be/data-visibility-rule.md +51 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/11-independent-filter/independent-filter-rule.md +100 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/kbkt-generation/README.md +47 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/templates/exploratory_charter_template.md +28 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/templates/fixtures_template.yaml +72 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/templates/plan_template.md +55 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/templates/slice_testcase_table_template.md +124 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/references/templates/testspec_feature_template.feature +93 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/steps/step-00-shiftleft-gate.md +45 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/steps/step-01-init-slice.md +39 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/steps/step-02-plan-screen.md +29 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/steps/step-02b-risk-allocation.md +38 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/steps/step-03-write-testcase.md +52 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/steps/step-04-finalize-testcase.md +26 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/steps/step-05-roundtrip.md +25 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-generate-testcase/workflow.md +114 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/SKILL.md +25 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/agents/agent_robot_generator.md +18 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/agents/agent_robot_reviewer.md +27 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/principles/iron_rules.md +123 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/references/automation/auto_coding_convention.md +53 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/references/automation/auto_db_oracle_rules.md +150 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/references/automation/auto_framework_structure.md +99 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/references/automation/auto_gate_commands.md +117 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/references/automation/auto_locator_strategy.md +99 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/references/automation/auto_robot_rules.md +90 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/references/automation/automation_standards.md +19 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/steps/step-01-parse.md +79 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/steps/step-02-generate-resources.md +75 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/steps/step-03-generate-suite.md +77 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/steps/step-04-review-code.md +121 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/steps/step-05-execute-and-analyze-logs.md +95 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-robot/workflow.md +110 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-setup-data/SKILL.md +10 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-setup-data/agents/agent_robot_generator.md +21 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-setup-data/references/auto_robot_rules.md +42 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-setup-data/references/automation_standards.md +7 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-setup-data/steps/step-01-setup-test-data.md +81 -0
- package/skills/NTAPP/.agent/skills/NTAPP-qa-setup-data/workflow.md +95 -0
- package/skills/NTAPP/.agent/skills/NTAPP-slice-planning/SKILL.md +12 -0
- package/skills/NTAPP/.agent/skills/NTAPP-slice-planning/workflow.md +253 -0
- package/skills/NTAPP/.agent/skills/NTAPP-sprint-worklog-from-git/SKILL.md +240 -0
- package/skills/NTAPP/.agent/skills/NTAPP-sprint-worklog-from-git/config.example.md +35 -0
- package/skills/NTAPP/.agent/skills/NTAPP-srs-to-confluence/SKILL.md +65 -0
- package/skills/NTAPP/.agent/skills/NTAPP-srs-to-confluence/references/confluence-server-publish.md +142 -0
- package/skills/NTAPP/.agent/skills/NTAPP-srs-to-confluence/references/srs-mapping.md +157 -0
- package/skills/NTAPP/.agent/skills/NTAPP-srs-to-confluence/references/terminology.md +50 -0
- package/skills/NTAPP/.agent/skills/NTAPP-srs-to-confluence/scripts/build-activity-diagram.mjs +355 -0
- package/skills/NTAPP/.agent/skills/NTAPP-srs-to-confluence/scripts/confluence-get.ps1 +73 -0
- package/skills/NTAPP/.agent/skills/NTAPP-srs-to-confluence/scripts/confluence-publish.ps1 +210 -0
- package/skills/NTAPP/.agent/skills/NTAPP-srs-to-confluence/workflow.md +220 -0
- package/skills/NTAPP/.agent/skills/NTAPP-sync-skills-global/SKILL.md +62 -0
- package/skills/NTAPP/.agent/skills/NTAPP-sync-skills-global/sync-global.sh +31 -0
- package/skills/NTAPP/.agent/skills/NTAPP-system-overview/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/NTAPP-system-overview/modes/baseline.md +447 -0
- package/skills/NTAPP/.agent/skills/NTAPP-system-overview/modes/overview.md +121 -0
- package/skills/NTAPP/.agent/skills/NTAPP-system-overview/principles.md +120 -0
- package/skills/NTAPP/.agent/skills/NTAPP-system-overview/templates/cross_system.md +128 -0
- package/skills/NTAPP/.agent/skills/NTAPP-system-overview/templates/per_repo.md +285 -0
- package/skills/NTAPP/.agent/skills/NTAPP-system-overview/workflow.md +160 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/agents/agent_0_orchestrator.md +30 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/agents/agent_1_business_strategist.md +22 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/agents/agent_2_system_architect.md +36 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/agents/agent_3_implementation_lead.md +37 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/principles/iron_rules.md +129 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/steps/step-01-audit-hld.md +89 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/steps/step-02-strategy-rules.md +29 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/steps/step-03-architectural-modeling.md +33 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/steps/step-04-implementation-contracts.md +46 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/steps/step-05-orchestration-qa.md +38 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/templates/techspec_v3_ultimate_template.md +244 -0
- package/skills/NTAPP/.agent/skills/NTAPP-technical-design/workflow.md +183 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/SKILL.md +16 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/agents/design_system_agent.md +42 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/agents/ui_schema_agent.md +128 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/agents/visual_composition_auditor.md +49 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/steps/step-01-audit.md +134 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/steps/step-02-hitl-review.md +85 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/steps/step-03-schema-gen.md +198 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/steps/step-04-aesthetic-critique.md +131 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ui-generation/workflow.md +156 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/SKILL.md +31 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/bmad-skill-manifest.yaml +9 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/principles/iron_rules.md +167 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-01-init-discovery.md +113 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-02-executive-summary.md +38 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-04-ux-principles.md +53 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-06-content-strategy.md +48 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-07-information-architecture.md +61 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-08-information-hierarchy.md +59 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-09-primary-journey.md +59 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-10-secondary-journeys.md +43 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-11-interaction-patterns.md +47 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-12-notification-error.md +65 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-13-responsive-accessibility.md +48 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/steps/step-14-traceability-assembly.md +89 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/templates/ux-conventions-template.md +51 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/templates/ux-design-spec-template.md +134 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-design/workflow.md +139 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/SKILL.md +55 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/bmad-skill-manifest.yaml +9 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/principles/iron_rules.md +127 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/steps/step-01-init.md +88 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/steps/step-02-rough-personas.md +51 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/steps/step-03-rough-ia.md +69 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/steps/step-04-primary-journey.md +89 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/steps/step-05-validation.md +188 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/steps/step-06-assembly.md +130 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/templates/ux-sketch-template.md +174 -0
- package/skills/NTAPP/.agent/skills/NTAPP-ux-sketch/workflow.md +157 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-ad-hoc-per-unit/SKILL.md +30 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-express-hotfix/SKILL.md +22 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-fix-bug/SKILL.md +65 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-path-b-quick-dev/SKILL.md +20 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-reproduce-architecture/SKILL.md +36 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-resume/SKILL.md +24 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-run/SKILL.md +12 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-run/workflow.md +98 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-slice-loop/SKILL.md +21 -0
- package/skills/NTAPP/.agent/skills/NTAPP-vsaf-staging-deploy/SKILL.md +23 -0
- package/skills/NTAPP/.agent/skills/bmad-advanced-elicitation/SKILL.md +136 -0
- package/skills/NTAPP/.agent/skills/bmad-advanced-elicitation/methods.csv +51 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-analyst/SKILL.md +59 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-analyst/bmad-skill-manifest.yaml +11 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-architect/SKILL.md +54 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-architect/bmad-skill-manifest.yaml +11 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/SKILL.md +70 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/BOND-template.md +14 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/CAPABILITIES-template.md +30 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/CREED-template.md +52 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/INDEX-template.md +15 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/MEMORY-template.md +7 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/PERSONA-template.md +24 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/PULSE-template.md +38 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/SKILL-template-bootloader.md +60 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/SKILL-template.md +90 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/capability-authoring-template.md +110 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/customize-template.toml +62 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/first-breath-config-template.md +80 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/first-breath-template.md +115 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/init-sanctum-template.py +277 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/memory-guidance-template.md +93 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/assets/sample-customize-analyst.toml +87 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/agent-type-guidance.md +88 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/build-process.md +349 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/edit-guidance.md +88 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/first-breath-adaptation-guidance.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/mission-writing-guidance.md +81 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-analysis.md +139 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-dimensions.md +77 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-scan-agent-cohesion.md +151 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-scan-customization-surface.md +188 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-scan-enhancement-opportunities.md +189 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-scan-execution-efficiency.md +159 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-scan-prompt-craft.md +228 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-scan-sanctum-architecture.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-scan-script-opportunities.md +220 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/quality-scan-structure.md +168 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/report-quality-scan-creator.md +319 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/sample-capability-authoring.md +110 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/sample-capability-prompt.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/sample-first-breath.md +117 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/sample-init-sanctum.py +274 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/sample-memory-guidance.md +93 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/script-opportunities-reference.md +392 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/script-standards.md +91 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/skill-best-practices.md +144 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/standard-fields.md +198 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/standing-order-guidance.md +76 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/references/template-substitution-rules.md +92 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/scripts/generate-html-report.py +534 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/scripts/prepass-execution-deps.py +337 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py +425 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/scripts/prepass-sanctum-architecture.py +385 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py +482 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/scripts/process-template.py +190 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/scripts/scan-path-standards.py +324 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-builder/scripts/scan-scripts.py +747 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-dev/SKILL.md +69 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-dev/bmad-skill-manifest.yaml +11 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-pm/SKILL.md +59 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-pm/bmad-skill-manifest.yaml +11 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-tech-writer/SKILL.md +57 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-tech-writer/bmad-skill-manifest.yaml +11 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-tech-writer/explain-concept.md +20 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-tech-writer/mermaid-gen.md +20 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-tech-writer/validate-doc.md +19 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-tech-writer/write-document.md +20 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-ux-designer/SKILL.md +55 -0
- package/skills/NTAPP/.agent/skills/bmad-agent-ux-designer/bmad-skill-manifest.yaml +11 -0
- package/skills/NTAPP/.agent/skills/bmad-bmb-setup/SKILL.md +76 -0
- package/skills/NTAPP/.agent/skills/bmad-bmb-setup/assets/module-help.csv +10 -0
- package/skills/NTAPP/.agent/skills/bmad-bmb-setup/assets/module.yaml +20 -0
- package/skills/NTAPP/.agent/skills/bmad-bmb-setup/scripts/cleanup-legacy.py +259 -0
- package/skills/NTAPP/.agent/skills/bmad-bmb-setup/scripts/merge-config.py +408 -0
- package/skills/NTAPP/.agent/skills/bmad-bmb-setup/scripts/merge-help-csv.py +218 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/brain-methods.csv +62 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/steps/step-01-session-setup.md +214 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/steps/step-01b-continue.md +124 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/steps/step-02a-user-selected.md +229 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/steps/step-02b-ai-recommended.md +239 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/steps/step-02c-random-selection.md +211 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/steps/step-02d-progressive-flow.md +266 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/steps/step-03-technique-execution.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/steps/step-04-idea-organization.md +305 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/template.md +15 -0
- package/skills/NTAPP/.agent/skills/bmad-brainstorming/workflow.md +53 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/skills/NTAPP/.agent/skills/bmad-check-implementation-readiness/workflow.md +47 -0
- package/skills/NTAPP/.agent/skills/bmad-checkpoint-preview/SKILL.md +29 -0
- package/skills/NTAPP/.agent/skills/bmad-checkpoint-preview/generate-trail.md +38 -0
- package/skills/NTAPP/.agent/skills/bmad-checkpoint-preview/step-01-orientation.md +105 -0
- package/skills/NTAPP/.agent/skills/bmad-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/skills/NTAPP/.agent/skills/bmad-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/skills/NTAPP/.agent/skills/bmad-checkpoint-preview/step-04-testing.md +74 -0
- package/skills/NTAPP/.agent/skills/bmad-checkpoint-preview/step-05-wrapup.md +24 -0
- package/skills/NTAPP/.agent/skills/bmad-code-review/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-code-review/steps/step-01-gather-context.md +85 -0
- package/skills/NTAPP/.agent/skills/bmad-code-review/steps/step-02-review.md +34 -0
- package/skills/NTAPP/.agent/skills/bmad-code-review/steps/step-03-triage.md +49 -0
- package/skills/NTAPP/.agent/skills/bmad-code-review/steps/step-04-present.md +129 -0
- package/skills/NTAPP/.agent/skills/bmad-code-review/templates/review_report_template.md +79 -0
- package/skills/NTAPP/.agent/skills/bmad-code-review/workflow.md +55 -0
- package/skills/NTAPP/.agent/skills/bmad-correct-course/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-correct-course/checklist.md +288 -0
- package/skills/NTAPP/.agent/skills/bmad-correct-course/workflow.md +267 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/architecture-decision-template.md +12 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/data/domain-complexity.csv +13 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/data/project-types.csv +7 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-01-init.md +153 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-01b-continue.md +173 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-02-context.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-03-starter.md +329 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-04-decisions.md +318 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-05-patterns.md +359 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-06-structure.md +379 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-07-validation.md +359 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/steps/step-08-complete.md +76 -0
- package/skills/NTAPP/.agent/skills/bmad-create-architecture/workflow.md +32 -0
- package/skills/NTAPP/.agent/skills/bmad-create-epics-and-stories/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
- package/skills/NTAPP/.agent/skills/bmad-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
- package/skills/NTAPP/.agent/skills/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/skills/NTAPP/.agent/skills/bmad-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
- package/skills/NTAPP/.agent/skills/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
- package/skills/NTAPP/.agent/skills/bmad-create-epics-and-stories/workflow.md +51 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/data/domain-complexity.csv +15 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/data/prd-purpose.md +197 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/data/project-types.csv +11 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-01-init.md +178 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-01b-continue.md +161 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-02-discovery.md +208 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-02b-vision.md +142 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-02c-executive-summary.md +158 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-03-success.md +214 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-04-journeys.md +201 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-05-domain.md +194 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-06-innovation.md +211 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-07-project-type.md +222 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-08-scoping.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-09-functional.md +219 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-10-nonfunctional.md +230 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-11-polish.md +221 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/steps-c/step-12-complete.md +115 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/templates/prd-template.md +10 -0
- package/skills/NTAPP/.agent/skills/bmad-create-prd/workflow.md +61 -0
- package/skills/NTAPP/.agent/skills/bmad-create-story/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-create-story/checklist.md +357 -0
- package/skills/NTAPP/.agent/skills/bmad-create-story/discover-inputs.md +88 -0
- package/skills/NTAPP/.agent/skills/bmad-create-story/template.md +49 -0
- package/skills/NTAPP/.agent/skills/bmad-create-story/workflow.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-01-init.md +135 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-01b-continue.md +127 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-02-discovery.md +190 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-03-core-experience.md +217 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-04-emotional-response.md +220 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-05-inspiration.md +235 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-06-design-system.md +253 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-07-defining-experience.md +255 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-08-visual-foundation.md +225 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-09-design-directions.md +225 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-10-user-journeys.md +242 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-11-component-strategy.md +249 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-12-ux-patterns.md +238 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-13-responsive-accessibility.md +265 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/steps/step-14-complete.md +171 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/ux-design-template.md +13 -0
- package/skills/NTAPP/.agent/skills/bmad-create-ux-design/workflow.md +35 -0
- package/skills/NTAPP/.agent/skills/bmad-dev-story/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-dev-story/checklist.md +80 -0
- package/skills/NTAPP/.agent/skills/bmad-dev-story/workflow.md +450 -0
- package/skills/NTAPP/.agent/skills/bmad-distillator/SKILL.md +177 -0
- package/skills/NTAPP/.agent/skills/bmad-distillator/agents/distillate-compressor.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-distillator/agents/round-trip-reconstructor.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-distillator/resources/compression-rules.md +51 -0
- package/skills/NTAPP/.agent/skills/bmad-distillator/resources/distillate-format-reference.md +227 -0
- package/skills/NTAPP/.agent/skills/bmad-distillator/resources/splitting-strategy.md +78 -0
- package/skills/NTAPP/.agent/skills/bmad-distillator/scripts/analyze_sources.py +300 -0
- package/skills/NTAPP/.agent/skills/bmad-distillator/scripts/tests/test_analyze_sources.py +204 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/checklist.md +245 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/documentation-requirements.csv +12 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/instructions.md +128 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/templates/deep-dive-template.md +345 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/templates/index-template.md +169 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/templates/project-overview-template.md +103 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/templates/project-scan-report-schema.json +160 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/templates/source-tree-template.md +135 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/workflow.md +25 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/workflows/deep-dive-instructions.md +299 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/workflows/full-scan-instructions.md +1107 -0
- package/skills/NTAPP/.agent/skills/bmad-document-project/workflows/full-scan-workflow.md +34 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/domain-steps/step-01-init.md +137 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/domain-steps/step-05-technical-trends.md +234 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/research.template.md +29 -0
- package/skills/NTAPP/.agent/skills/bmad-domain-research/workflow.md +51 -0
- package/skills/NTAPP/.agent/skills/bmad-edit-prd/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-edit-prd/data/prd-purpose.md +197 -0
- package/skills/NTAPP/.agent/skills/bmad-edit-prd/steps-e/step-e-01-discovery.md +242 -0
- package/skills/NTAPP/.agent/skills/bmad-edit-prd/steps-e/step-e-01b-legacy-conversion.md +204 -0
- package/skills/NTAPP/.agent/skills/bmad-edit-prd/steps-e/step-e-02-review.md +245 -0
- package/skills/NTAPP/.agent/skills/bmad-edit-prd/steps-e/step-e-03-edit.md +250 -0
- package/skills/NTAPP/.agent/skills/bmad-edit-prd/steps-e/step-e-04-complete.md +163 -0
- package/skills/NTAPP/.agent/skills/bmad-edit-prd/workflow.md +62 -0
- package/skills/NTAPP/.agent/skills/bmad-editorial-review-prose/SKILL.md +86 -0
- package/skills/NTAPP/.agent/skills/bmad-editorial-review-structure/SKILL.md +179 -0
- package/skills/NTAPP/.agent/skills/bmad-generate-project-context/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-generate-project-context/project-context-template.md +21 -0
- package/skills/NTAPP/.agent/skills/bmad-generate-project-context/steps/step-01-discover.md +186 -0
- package/skills/NTAPP/.agent/skills/bmad-generate-project-context/steps/step-02-generate.md +321 -0
- package/skills/NTAPP/.agent/skills/bmad-generate-project-context/steps/step-03-complete.md +278 -0
- package/skills/NTAPP/.agent/skills/bmad-generate-project-context/workflow.md +39 -0
- package/skills/NTAPP/.agent/skills/bmad-help/SKILL.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-index-docs/SKILL.md +66 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/research.template.md +29 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/steps/step-01-init.md +184 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/steps/step-06-research-completion.md +478 -0
- package/skills/NTAPP/.agent/skills/bmad-market-research/workflow.md +51 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/SKILL.md +32 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/module-plan-template.md +128 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/setup-skill-template/SKILL.md +76 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/setup-skill-template/assets/module-help.csv +1 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/setup-skill-template/assets/module.yaml +6 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/setup-skill-template/scripts/cleanup-legacy.py +259 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-config.py +408 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-help-csv.py +218 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/standalone-module-template/merge-config.py +408 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/standalone-module-template/merge-help-csv.py +218 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/assets/standalone-module-template/module-setup.md +81 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/references/create-module.md +277 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/references/ideate-module.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/references/validate-module.md +86 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/scripts/scaffold-setup-skill.py +124 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/scripts/scaffold-standalone-module.py +190 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/scripts/tests/test-scaffold-setup-skill.py +230 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/scripts/tests/test-scaffold-standalone-module.py +266 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/scripts/tests/test-validate-module.py +314 -0
- package/skills/NTAPP/.agent/skills/bmad-module-builder/scripts/validate-module.py +293 -0
- package/skills/NTAPP/.agent/skills/bmad-party-mode/SKILL.md +125 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/SKILL.md +96 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/agents/artifact-analyzer.md +60 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/agents/web-researcher.md +49 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/assets/prfaq-template.md +62 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/bmad-manifest.json +16 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/references/customer-faq.md +55 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/references/internal-faq.md +51 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/references/press-release.md +60 -0
- package/skills/NTAPP/.agent/skills/bmad-prfaq/references/verdict.md +79 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/SKILL.md +82 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/agents/artifact-analyzer.md +60 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/agents/opportunity-reviewer.md +44 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/agents/skeptic-reviewer.md +44 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/agents/web-researcher.md +49 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/bmad-manifest.json +17 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/prompts/contextual-discovery.md +57 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/prompts/draft-and-review.md +86 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/prompts/finalize.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/prompts/guided-elicitation.md +70 -0
- package/skills/NTAPP/.agent/skills/bmad-product-brief/resources/brief-template.md +60 -0
- package/skills/NTAPP/.agent/skills/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-qa-generate-e2e-tests/checklist.md +33 -0
- package/skills/NTAPP/.agent/skills/bmad-qa-generate-e2e-tests/workflow.md +136 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/compile-epic-context.md +62 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/spec-template.md +88 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/step-01-clarify-and-route.md +91 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/step-02-plan.md +47 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/step-03-implement.md +39 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/step-04-review.md +49 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/step-05-present.md +63 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/step-oneshot.md +61 -0
- package/skills/NTAPP/.agent/skills/bmad-quick-dev/workflow.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-retrospective/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-retrospective/workflow.md +1479 -0
- package/skills/NTAPP/.agent/skills/bmad-review-adversarial-general/SKILL.md +37 -0
- package/skills/NTAPP/.agent/skills/bmad-review-edge-case-hunter/SKILL.md +67 -0
- package/skills/NTAPP/.agent/skills/bmad-shard-doc/SKILL.md +105 -0
- package/skills/NTAPP/.agent/skills/bmad-sprint-planning/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-sprint-planning/checklist.md +33 -0
- package/skills/NTAPP/.agent/skills/bmad-sprint-planning/sprint-status-template.yaml +56 -0
- package/skills/NTAPP/.agent/skills/bmad-sprint-planning/workflow.md +263 -0
- package/skills/NTAPP/.agent/skills/bmad-sprint-status/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-sprint-status/workflow.md +261 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/SKILL.md +80 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/customize.toml +104 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/contract-testing.md +1067 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pactjs-utils-overview.md +219 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/pactjs-utils-zod-to-pact.md +262 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-tea/resources/tea-index.csv +52 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/SKILL.md +129 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/checklist.md +198 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/data/curriculum.yaml +129 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/data/quiz-questions.yaml +206 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/data/role-paths.yaml +136 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/data/session-content-map.yaml +219 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/data/tea-resources-index.yaml +394 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/instructions.md +137 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-01-init.md +235 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-01b-continue.md +147 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-02-assess.md +258 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-03-session-menu.md +219 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-04-session-01.md +460 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-04-session-02.md +465 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-04-session-03.md +301 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-04-session-04.md +234 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-04-session-05.md +234 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-04-session-06.md +209 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-04-session-07.md +220 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-c/step-05-completion.md +347 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-e/step-e-01-assess-workflow.md +141 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-e/step-e-02-apply-edits.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/steps-v/step-v-01-validate.md +272 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/templates/certificate-template.md +86 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/templates/progress-template.yaml +95 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/templates/session-notes-template.md +83 -0
- package/skills/NTAPP/.agent/skills/bmad-teach-me-testing/workflow-plan-teach-me-testing.md +950 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/research.template.md +29 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/technical-steps/step-01-init.md +137 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/technical-steps/step-02-technical-overview.md +239 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/technical-steps/step-05-implementation-research.md +233 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/technical-steps/step-06-research-synthesis.md +487 -0
- package/skills/NTAPP/.agent/skills/bmad-technical-research/workflow.md +52 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/SKILL.md +85 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/atdd-checklist-template.md +394 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/checklist.md +375 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/instructions.md +44 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/contract-testing.md +1067 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pactjs-utils-overview.md +219 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/pactjs-utils-zod-to-pact.md +262 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/resources/tea-index.csv +52 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-01-preflight-and-context.md +244 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-01b-resume.md +96 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-02-generation-mode.md +125 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-03-test-strategy.md +110 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-04-generate-tests.md +335 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-04a-subagent-api-failing.md +294 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-04b-subagent-e2e-failing.md +244 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-04c-aggregate.md +394 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-c/step-05-validate-and-complete.md +123 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-e/step-01-assess.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-e/step-02-apply-edit.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/steps-v/step-01-validate.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/validation-report-20260127-095021.md +73 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/validation-report-20260127-102401.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/workflow-plan.md +21 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-atdd/workflow.yaml +46 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/SKILL.md +85 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/checklist.md +611 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/instructions.md +49 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/contract-testing.md +1066 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/pactjs-utils-overview.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/resources/tea-index.csv +51 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-01-preflight-and-context.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-01b-resume.md +94 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-02-identify-targets.md +169 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-03-generate-tests.md +394 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-03a-subagent-api.md +271 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-03b-subagent-backend.md +246 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-03b-subagent-e2e.md +213 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-03c-aggregate.md +398 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-c/step-04-validate-and-summarize.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-e/step-01-assess.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-e/step-02-apply-edit.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/steps-v/step-01-validate.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/validation-report-20260127-095021.md +72 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/validation-report-20260127-102401.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/workflow-plan.md +20 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-automate/workflow.yaml +53 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/SKILL.md +85 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/azure-pipelines-template.yaml +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/checklist.md +289 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/github-actions-template.yaml +328 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/gitlab-ci-template.yaml +158 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/harness-pipeline-template.yaml +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/instructions.md +44 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/jenkins-pipeline-template.groovy +129 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/contract-testing.md +1066 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/pactjs-utils-overview.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/resources/tea-index.csv +51 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/steps-c/step-01-preflight.md +158 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/steps-c/step-01b-resume.md +110 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/steps-c/step-02-generate-pipeline.md +293 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/steps-c/step-03-configure-quality-gates.md +145 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/steps-c/step-04-validate-and-summary.md +100 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/steps-e/step-01-assess.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/steps-e/step-02-apply-edit.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/steps-v/step-01-validate.md +89 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/validation-report-20260127-095021.md +72 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/validation-report-20260127-102401.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/workflow-plan.md +20 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-ci/workflow.yaml +48 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/SKILL.md +85 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/checklist.md +345 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/instructions.md +44 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/contract-testing.md +1066 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/pactjs-utils-overview.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/resources/tea-index.csv +51 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-c/step-01-preflight.md +132 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-c/step-01b-resume.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-c/step-02-select-framework.md +117 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-c/step-03-scaffold-framework.md +328 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-c/step-04-docs-and-scripts.md +105 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-c/step-05-validate-and-summary.md +101 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-e/step-01-assess.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-e/step-02-apply-edit.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/steps-v/step-01-validate.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/validation-report-20260127-095021.md +73 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/validation-report-20260127-102401.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/workflow-plan.md +22 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-framework/workflow.yaml +48 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/SKILL.md +85 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/checklist.md +407 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/instructions.md +43 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/nfr-report-template.md +470 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/contract-testing.md +1066 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/pactjs-utils-overview.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/resources/tea-index.csv +51 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-01-load-context.md +138 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-01b-resume.md +106 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-02-define-thresholds.md +107 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-03-gather-evidence.md +108 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-04-evaluate-and-score.md +254 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-04a-subagent-security.md +138 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-04b-subagent-performance.md +84 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-04c-subagent-reliability.md +85 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-04d-subagent-scalability.md +88 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-04e-aggregate-nfr.md +264 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-c/step-05-generate-report.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-e/step-01-assess.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-e/step-02-apply-edit.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/steps-v/step-01-validate.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/validation-report-20260127-095021.md +73 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/validation-report-20260127-102401.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/workflow-plan.md +19 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-nfr/workflow.yaml +48 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/SKILL.md +87 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/checklist.md +464 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/instructions.md +104 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/contract-testing.md +1066 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/pactjs-utils-overview.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/resources/tea-index.csv +51 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-c/step-01-detect-mode.md +140 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-c/step-01b-resume.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-c/step-02-load-context.md +248 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +129 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-c/step-05-generate-output.md +236 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-e/step-01-assess.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-e/step-02-apply-edit.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/steps-v/step-01-validate.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/test-design-architecture-template.md +233 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/test-design-handoff-template.md +70 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/test-design-qa-template.md +399 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/test-design-template.md +347 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/validation-report-20260127-095021.md +73 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/validation-report-20260127-102401.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/workflow-plan.md +22 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-design/workflow.yaml +77 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/SKILL.md +85 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/checklist.md +475 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/instructions.md +45 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/contract-testing.md +1066 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/pactjs-utils-overview.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/resources/tea-index.csv +51 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-01-load-context.md +197 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-01b-resume.md +104 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-02-discover-tests.md +120 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-03-quality-evaluation.md +274 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-03a-subagent-determinism.md +257 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-03b-subagent-isolation.md +125 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-03c-subagent-maintainability.md +102 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-03e-subagent-performance.md +117 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-03f-aggregate-scores.md +277 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-c/step-04-generate-report.md +119 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-e/step-01-assess.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-e/step-02-apply-edit.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/steps-v/step-01-validate.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/test-review-template.md +387 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/validation-report-20260127-095021.md +72 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/validation-report-20260127-102401.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/workflow-plan.md +18 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-test-review/workflow.yaml +48 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/SKILL.md +87 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/checklist.md +671 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/customize.toml +40 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/instructions.md +45 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/adr-quality-readiness-checklist.md +377 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/api-request.md +563 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/api-testing-patterns.md +915 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/auth-session.md +548 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/burn-in.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/ci-burn-in.md +717 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/component-tdd.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/contract-testing.md +1066 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/data-factories.md +500 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/email-auth.md +721 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/error-handling.md +725 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/feature-flags.md +750 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/file-utils.md +456 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/fixture-architecture.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/fixtures-composition.md +382 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/intercept-network-call.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/log.md +426 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/network-error-monitor.md +401 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/network-first.md +486 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/network-recorder.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/nfr-criteria.md +670 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/overview.md +286 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/pact-consumer-di.md +310 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/pact-consumer-framework-setup.md +757 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/pact-mcp.md +205 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/pactjs-utils-overview.md +216 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/pactjs-utils-provider-verifier.md +397 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/pactjs-utils-request-filter.md +224 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/playwright-cli.md +280 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/playwright-config.md +734 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/probability-impact.md +601 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/recurse.md +421 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/risk-governance.md +615 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/selective-testing.md +732 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/selector-resilience.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/test-healing-patterns.md +644 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/test-levels-framework.md +473 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/test-priorities-matrix.md +373 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/test-quality.md +664 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/timing-debugging.md +372 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/visual-debugging.md +527 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/webhook-module-setup.md +122 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/webhook-providers.md +155 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/webhook-template-matchers.md +160 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/webhook-timeout-error.md +130 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/resources/tea-index.csv +51 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-c/step-01-load-context.md +166 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-c/step-01b-resume.md +102 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-c/step-02-discover-tests.md +132 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-c/step-03-map-criteria.md +101 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-c/step-04-analyze-gaps.md +628 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-c/step-05-gate-decision.md +681 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-e/step-01-assess.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-e/step-02-apply-edit.md +68 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/steps-v/step-01-validate.md +75 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/trace-template.md +716 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/validation-report-20260127-095021.md +73 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/validation-report-20260127-102401.md +116 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/workflow-plan.md +24 -0
- package/skills/NTAPP/.agent/skills/bmad-testarch-trace/workflow.yaml +80 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/data/domain-complexity.csv +15 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/data/prd-purpose.md +197 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/data/project-types.csv +11 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
- package/skills/NTAPP/.agent/skills/bmad-validate-prd/workflow.md +61 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/SKILL.md +71 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/assets/SKILL-template.md +53 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/assets/customize-template.toml +56 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml +51 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/build-process.md +229 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/classification-reference.md +65 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/complex-workflow-patterns.md +123 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/convert-process.md +106 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-analysis.md +151 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-dimensions.md +63 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-scan-customization-surface.md +166 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-scan-enhancement-opportunities.md +185 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-scan-execution-efficiency.md +235 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-scan-prompt-craft.md +273 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-scan-script-opportunities.md +212 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-scan-skill-cohesion.md +154 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/quality-scan-workflow-integrity.md +210 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/report-quality-scan-creator.md +262 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/script-opportunities-reference.md +100 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/script-standards.md +92 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/skill-best-practices.md +109 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/standard-fields.md +198 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/references/template-substitution-rules.md +47 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/scripts/generate-convert-report.py +406 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/scripts/generate-html-report.py +539 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py +288 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +285 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/scripts/prepass-workflow-integrity.py +475 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/scripts/scan-path-standards.py +298 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/scripts/scan-scripts.py +745 -0
- package/skills/NTAPP/.agent/skills/bmad-workflow-builder/scripts/tests/test_generate_convert_report.py +243 -0
- package/skills/NTAPP/.agent/skills/c4-diagram-optimizer/SKILL.md +6 -0
- package/skills/NTAPP/.agent/skills/c4-diagram-optimizer/workflow.md +69 -0
- package/skills/NTAPP/.agent/skills/diagnose/SKILL.md +117 -0
- package/skills/NTAPP/.agent/skills/directional-branch-merge/SKILL.md +87 -0
- package/skills/NTAPP/.agent/skills/grill-me/SKILL.md +10 -0
- package/skills/NTAPP/.agent/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/skills/NTAPP/.agent/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
- package/skills/NTAPP/.agent/skills/grill-with-docs/SKILL.md +88 -0
- package/skills/NTAPP/.agent/skills/improve-codebase-architecture/SKILL.md +70 -0
- package/skills/NTAPP/.agent/skills/lavish/SKILL.md +85 -0
- package/skills/NTAPP/.agent/skills/sdlc-architecture/SKILL.md +218 -0
- package/skills/NTAPP/.agent/skills/sdlc-discovery/SKILL.md +197 -0
- package/skills/NTAPP/.agent/skills/sdlc-feature-complete/SKILL.md +159 -0
- package/skills/NTAPP/.agent/skills/sdlc-hotfix-analyze/SKILL.md +198 -0
- package/skills/NTAPP/.agent/skills/sdlc-hotfix-implement/SKILL.md +227 -0
- package/skills/NTAPP/.agent/skills/sdlc-hotfix-prd/SKILL.md +161 -0
- package/skills/NTAPP/.agent/skills/sdlc-hotfix-review/SKILL.md +151 -0
- package/skills/NTAPP/.agent/skills/sdlc-hotfix-ship/SKILL.md +221 -0
- package/skills/NTAPP/.agent/skills/sdlc-implement/SKILL.md +267 -0
- package/skills/NTAPP/.agent/skills/sdlc-init/SKILL.md +195 -0
- package/skills/NTAPP/.agent/skills/sdlc-onboard-code/SKILL.md +195 -0
- package/skills/NTAPP/.agent/skills/sdlc-onboard-docs/SKILL.md +121 -0
- package/skills/NTAPP/.agent/skills/sdlc-prd/SKILL.md +180 -0
- package/skills/NTAPP/.agent/skills/sdlc-review/SKILL.md +235 -0
- package/skills/NTAPP/.agent/skills/sdlc-sdlc-health/SKILL.md +168 -0
- package/skills/NTAPP/.agent/skills/sdlc-ship/SKILL.md +194 -0
- package/skills/NTAPP/.agent/skills/sdlc-srs/SKILL.md +138 -0
- package/skills/NTAPP/.agent/skills/sdlc-test-design/SKILL.md +132 -0
- package/skills/NTAPP/.agent/skills/superpowers-brainstorming/SKILL.md +164 -0
- package/skills/NTAPP/.agent/skills/superpowers-brainstorming/scripts/frame-template.html +214 -0
- package/skills/NTAPP/.agent/skills/superpowers-brainstorming/scripts/helper.js +88 -0
- package/skills/NTAPP/.agent/skills/superpowers-brainstorming/scripts/server.cjs +354 -0
- package/skills/NTAPP/.agent/skills/superpowers-brainstorming/scripts/start-server.sh +148 -0
- package/skills/NTAPP/.agent/skills/superpowers-brainstorming/scripts/stop-server.sh +56 -0
- package/skills/NTAPP/.agent/skills/superpowers-brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/skills/NTAPP/.agent/skills/superpowers-brainstorming/visual-companion.md +287 -0
- package/skills/NTAPP/.agent/skills/superpowers-dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/NTAPP/.agent/skills/superpowers-finishing-a-development-branch/SKILL.md +251 -0
- package/skills/NTAPP/.agent/skills/superpowers-receiving-code-review/SKILL.md +213 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/SKILL.md +296 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/defense-in-depth.md +122 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/find-polluter.sh +63 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/test-academic.md +14 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/test-pressure-1.md +58 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/test-pressure-2.md +68 -0
- package/skills/NTAPP/.agent/skills/superpowers-systematic-debugging/test-pressure-3.md +69 -0
- package/skills/NTAPP/.agent/skills/superpowers-test-driven-development/SKILL.md +371 -0
- package/skills/NTAPP/.agent/skills/superpowers-test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/NTAPP/.agent/skills/superpowers-using-git-worktrees/SKILL.md +215 -0
- package/skills/NTAPP/.agent/skills/superpowers-using-superpowers/SKILL.md +117 -0
- package/skills/NTAPP/.agent/skills/superpowers-using-superpowers/references/codex-tools.md +59 -0
- package/skills/NTAPP/.agent/skills/superpowers-using-superpowers/references/copilot-tools.md +42 -0
- package/skills/NTAPP/.agent/skills/superpowers-using-superpowers/references/gemini-tools.md +51 -0
- package/skills/NTAPP/.agent/skills/superpowers-verification-before-completion/SKILL.md +139 -0
- package/skills/NTAPP/.agent/skills/superpowers-writing-skills/SKILL.md +655 -0
- package/skills/NTAPP/.agent/skills/superpowers-writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/NTAPP/.agent/skills/superpowers-writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/NTAPP/.agent/skills/superpowers-writing-skills/graphviz-conventions.dot +172 -0
- package/skills/NTAPP/.agent/skills/superpowers-writing-skills/persuasion-principles.md +187 -0
- package/skills/NTAPP/.agent/skills/superpowers-writing-skills/render-graphs.js +168 -0
- package/skills/NTAPP/.agent/skills/superpowers-writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/NTAPP/.agent/skills/tdd/SKILL.md +107 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/SKILL.md +145 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/audit-commands.md +171 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/capability-index.md +34 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/confluence-content-export.md +158 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/development-commands.md +12 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/google-sheets.md +71 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/integration-commands.md +17 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/platform-bootstrap.md +25 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/specialist-routing.md +14 -0
- package/skills/NTAPP/.agent/skills/vds-scripts-skill/references/validation-commands.md +15 -0
- package/skills/NTAPP/.agent/skills/zoom-out/SKILL.md +7 -0
- package/skills/NTAPP/.mcp.json +19 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-architecture-design.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-ds-bootstrap.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-ds-build-component.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-feature-design.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-feature-triage.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-slice-planning.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-system-overview.md +12 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-technical-design.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-ui-generation.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-ux-design.md +9 -0
- package/skills/NTAPP/.vsaf/commands/NTAPP-ux-sketch.md +9 -0
- package/skills/NTAPP/.vsaf/commands/bmad-advanced-elicitation.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-agent-analyst.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-brainstorming.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-check-implementation-readiness.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-checkpoint-preview.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-code-review.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-correct-course.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-create-architecture.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-create-epics-and-stories.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-create-prd.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-create-story.md +9 -0
- package/skills/NTAPP/.vsaf/commands/bmad-dev-story.md +9 -0
- package/skills/NTAPP/.vsaf/commands/bmad-domain-research.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-party-mode.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-prfaq.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-qa-generate-e2e-tests.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-quick-dev.md +9 -0
- package/skills/NTAPP/.vsaf/commands/bmad-review-adversarial-general.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-review-edge-case-hunter.md +7 -0
- package/skills/NTAPP/.vsaf/commands/bmad-testarch-atdd.md +9 -0
- package/skills/NTAPP/.vsaf/commands/bmad-validate-prd.md +7 -0
- package/skills/NTAPP/.vsaf/commands/diagnose.md +7 -0
- package/skills/NTAPP/.vsaf/commands/grill-me.md +7 -0
- package/skills/NTAPP/.vsaf/commands/improve-codebase-architecture.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-architecture.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-discovery.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-feature-complete.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-hotfix-analyze.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-hotfix-implement.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-hotfix-prd.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-hotfix-review.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-hotfix-ship.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-implement.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-init.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-onboard-code.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-onboard-docs.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-prd.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-review.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-sdlc-health.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-ship.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-srs.md +7 -0
- package/skills/NTAPP/.vsaf/commands/sdlc-test-design.md +7 -0
- package/skills/NTAPP/.vsaf/commands/superpowers-finishing-a-development-branch.md +9 -0
- package/skills/NTAPP/.vsaf/commands/tdd.md +7 -0
- package/skills/NTAPP/.vsaf/commands/vds-scripts-skill.md +7 -0
- package/skills/NTAPP/.vsaf/commands/zoom-out.md +7 -0
- package/skills/NTAPP/.vsaf/config.yaml +37 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/ad-hoc-per-unit.yaml +232 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/bug-fix-batch.yaml +633 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/create_prd_epics.yaml +67 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/express-hotfix.yaml +160 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/path-b-quick-dev.yaml +433 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/reproduce_architecture.yaml +215 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/slice-loop.yaml +538 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/slice-planning.yaml +54 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/staging-deploy.yaml +191 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/tests/args-quoting-fixture.yaml +37 -0
- package/skills/NTAPP/.vsaf/workflows/NTAPP/tests/loop-exhaust-fixture.yaml +18 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/hotfix-tdd.yaml +18 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/hotfix.yaml +35 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/master-sdlc.yaml +55 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/onboarding.yaml +11 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/sdlc-build.yaml +18 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/sdlc-design.yaml +14 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/sdlc-qa.yaml +20 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/sdlc-testcase.yaml +8 -0
- package/skills/NTAPP/.vsaf/workflows/sdlc/sdlc-thinking.yaml +12 -0
- package/skills/NTAPP/CLAUDE.md +346 -0
- package/skills/NTAPP/NTAPP-output/Stage_1_Discovery/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/Stage_1_Discovery/brainstorms/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/Stage_1_Discovery/brainstorms/2026-08-07-sync-skills-global-design.md +65 -0
- package/skills/NTAPP/NTAPP-output/Stage_2_Architecture/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/Stage_2_Architecture/archive/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/Stage_3_Specs/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/Stage_4_Design/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/Stage_5_Build_Verify/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/_notifications/inbox.md +12 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/aesthetic-rubric.md +142 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/best-practices.md +472 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/bmm-config.template.yaml +362 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/component-metadata-schema.md +639 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/delta-categorizer.md +220 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/ds-registry-schema.md +66 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/ds-resolution.md +71 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/layout-best-practices.md +284 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/library-api-schema.md +373 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/pattern-matcher.md +204 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/proposal-schema.md +358 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/stack-profile-schema.md +432 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/token-format-schema.md +290 -0
- package/skills/NTAPP/NTAPP-output/design-system/_shared/w3c-converter.md +371 -0
- package/skills/NTAPP/NTAPP-output/design-system/archive/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/design-system/feature_deltas/.gitkeep +0 -0
- package/skills/NTAPP/NTAPP-output/evaluation/archive/metrics-v1.json +241 -0
- package/skills/NTAPP/NTAPP-output/evaluation/archive/metrics-v2.json +312 -0
- package/skills/NTAPP/NTAPP-output/evaluation/archive/metrics-v3.json +295 -0
- package/skills/NTAPP/NTAPP-output/evaluation/archive/scorecard-v1.md +206 -0
- package/skills/NTAPP/NTAPP-output/evaluation/archive/scorecard-v2.md +215 -0
- package/skills/NTAPP/NTAPP-output/evaluation/archive/scorecard-v3.md +214 -0
- package/skills/NTAPP/NTAPP-output/evaluation/evaluation_metrics.md +209 -0
- package/skills/NTAPP/NTAPP-output/evaluation/metrics.json +295 -0
- package/skills/NTAPP/NTAPP-output/evaluation/scorecard.md +214 -0
- package/skills/NTAPP/NTAPP-output/evaluation/token-log.json +118 -0
- package/skills/NTAPP/README.md +470 -0
- package/skills/NTAPP/README.spec-template.md +208 -0
- package/skills/NTAPP/_bmad/_config/agent-manifest.csv +7 -0
- package/skills/NTAPP/_bmad/_config/bmad-help.csv +64 -0
- package/skills/NTAPP/_bmad/_config/files-manifest.csv +1029 -0
- package/skills/NTAPP/_bmad/_config/manifest.yaml +37 -0
- package/skills/NTAPP/_bmad/_config/skill-manifest.csv +56 -0
- package/skills/NTAPP/_bmad/bmb/config.yaml +13 -0
- package/skills/NTAPP/_bmad/bmb/module-help.csv +11 -0
- package/skills/NTAPP/_bmad/bmm/config.yaml +32 -0
- package/skills/NTAPP/_bmad/bmm/module-help.csv +33 -0
- package/skills/NTAPP/_bmad/core/config.yaml +9 -0
- package/skills/NTAPP/_bmad/core/module-help.csv +12 -0
- package/skills/NTAPP/_bmad/tea/config.yaml +29 -0
- package/skills/NTAPP/_bmad/tea/module-help.csv +11 -0
- package/skills/NTAPP/_bmad/tea/workflows/testarch/README.md +76 -0
- package/skills/NTAPP/config/bmm-config.template.yaml +41 -0
- package/skills/NTAPP/docs/Process/Manual_phase_1.md +642 -0
- package/skills/NTAPP/docs/Process/Manual_phase_1_brownfield.md +364 -0
- package/skills/NTAPP/docs/Process/Manual_phase_1_greenfield.md +415 -0
- package/skills/NTAPP/docs/Process/OKF_conventions.md +150 -0
- package/skills/NTAPP/git-hooks/pre-commit +695 -0
- package/skills/NTAPP/hooks/README.md +185 -0
- package/skills/NTAPP/hooks/approval_gate.sh +83 -0
- package/skills/NTAPP/hooks/atdd_classifier.sh +123 -0
- package/skills/NTAPP/hooks/build_component_verify.sh +98 -0
- package/skills/NTAPP/hooks/build_loop.sh +199 -0
- package/skills/NTAPP/hooks/drift_detector.py +347 -0
- package/skills/NTAPP/hooks/ds_build_approval_gate.sh +72 -0
- package/skills/NTAPP/hooks/ds_delta_router.sh +132 -0
- package/skills/NTAPP/hooks/hotfix_classifier.sh +41 -0
- package/skills/NTAPP/hooks/lib/common.sh +300 -0
- package/skills/NTAPP/hooks/lib/entry_mode.sh +53 -0
- package/skills/NTAPP/hooks/lib/hookcommon.py +22 -0
- package/skills/NTAPP/hooks/lib/slice_paths.py +339 -0
- package/skills/NTAPP/hooks/lib/telegram.sh +30 -0
- package/skills/NTAPP/hooks/lib/wbs_parser.py +333 -0
- package/skills/NTAPP/hooks/notify.sh +70 -0
- package/skills/NTAPP/hooks/settings.json +34 -0
- package/skills/NTAPP/hooks/slice_coverage_dag_validate.py +382 -0
- package/skills/NTAPP/hooks/stage2_completeness.sh +72 -0
- package/skills/NTAPP/hooks/stage3_input_gate.sh +153 -0
- package/skills/NTAPP/hooks/stage4a_complete.sh +160 -0
- package/skills/NTAPP/hooks/story_bridge_gate.sh +66 -0
- package/skills/NTAPP/hooks/tests/run.sh +360 -0
- package/skills/NTAPP/hooks/tests/test_slice_paths.py +233 -0
- package/skills/NTAPP/hooks/tests/workflow_bash_lint.py +147 -0
- package/skills/NTAPP/hooks/triage_decision_validate.sh +71 -0
- package/skills/NTAPP/hooks/triage_prereq_gate.sh +50 -0
- package/skills/NTAPP/hooks/verification_gate.sh +142 -0
- package/skills/NTAPP/pack.yaml +177 -0
- package/skills/NTAPP/rules/be-finance-rules.md +139 -0
- package/skills/NTAPP/rules/fe-angular-rules.md +96 -0
- package/skills/NTAPP/rules/rules.json +4 -0
- package/skills/NTAPP/scripts/antigravity/README.md +90 -0
- package/skills/NTAPP/scripts/antigravity/agy-skills/NTAPP-agy-vsaf-ad-hoc-per-unit/SKILL.md +33 -0
- package/skills/NTAPP/scripts/antigravity/agy-skills/NTAPP-agy-vsaf-slice-loop/SKILL.md +39 -0
- package/skills/NTAPP/scripts/antigravity/hooks/README.md +84 -0
- package/skills/NTAPP/scripts/antigravity/hooks/agy-hooks.reference.json +13 -0
- package/skills/NTAPP/scripts/antigravity/hooks/agy-posttool-shim.cjs +101 -0
- package/skills/NTAPP/scripts/antigravity/hooks/install-agy-hooks.sh +54 -0
- package/skills/NTAPP/scripts/antigravity/hooks/run-hooks.cjs +185 -0
- package/skills/NTAPP/scripts/antigravity/hooks/test-driver-hooks.cjs +117 -0
- package/skills/NTAPP/scripts/antigravity/hooks/workflow-hooks.js +123 -0
- package/skills/NTAPP/scripts/antigravity/install-agy-skills.sh +55 -0
- package/skills/NTAPP/scripts/antigravity/vsaf-agy +57 -0
- package/skills/NTAPP/scripts/antigravity/vsaf-agy-driver.cjs +240 -0
- package/skills/NTAPP/scripts/bootstrap.sh +2841 -0
- package/skills/NTAPP/scripts/eval-harvester.py +2764 -0
- package/skills/NTAPP/scripts/okf_project.py +5161 -0
- package/skills/NTAPP/scripts/reachability_check.README.md +122 -0
- package/skills/NTAPP/scripts/reachability_check.py +504 -0
- package/skills/NTAPP/scripts/sync-skills-to-user.sh +200 -0
- package/skills/NTAPP/scripts/templates/.gitattributes +24 -0
- package/skills/NTAPP/scripts/templates/AGENTS.md +20 -0
- package/skills/NTAPP/scripts/templates/GEMINI.md +20 -0
- package/skills/NTAPP/scripts/templates/bmm-config-coderepo.template.yaml +41 -0
- package/skills/NTAPP/scripts/templates/bmm-config-specrepo.template.yaml +356 -0
- package/skills/NTAPP/scripts/templates/claude-hooks.settings.json +34 -0
- package/skills/NTAPP/scripts/templates/pre-commit.template.sh +695 -0
- package/skills/NTAPP/scripts/templates/workspace.template.json +19 -0
- package/skills/autotest-skill/_shared/rf-requirements.txt +39 -0
- package/skills/autotest-skill/autotest-android/SKILL.md +1094 -0
- package/skills/autotest-skill/autotest-android-best-practices/SKILL.md +976 -0
- package/skills/autotest-skill/autotest-android-best-practices/examples/android-form-input.robot +101 -0
- package/skills/autotest-skill/autotest-android-best-practices/examples/android-list-navigation.robot +77 -0
- package/skills/autotest-skill/autotest-android-best-practices/examples/android-login.robot +85 -0
- package/skills/autotest-skill/autotest-android-best-practices/references/android-specific.md +206 -0
- package/skills/autotest-skill/autotest-android-best-practices/references/capabilities.md +183 -0
- package/skills/autotest-skill/autotest-android-best-practices/references/device-farm.md +177 -0
- package/skills/autotest-skill/autotest-android-best-practices/references/gestures.md +160 -0
- package/skills/autotest-skill/autotest-android-best-practices/references/locators.md +192 -0
- package/skills/autotest-skill/autotest-android-best-practices/references/troubleshooting.md +218 -0
- package/skills/autotest-skill/autotest-api/SKILL.md +1267 -0
- package/skills/autotest-skill/autotest-api-best-practices/SKILL.md +643 -0
- package/skills/autotest-skill/autotest-api-best-practices/examples/api-auth.robot +166 -0
- package/skills/autotest-skill/autotest-api-best-practices/examples/api-crud.robot +216 -0
- package/skills/autotest-skill/autotest-api-best-practices/examples/api-error-cases.robot +179 -0
- package/skills/autotest-skill/autotest-api-best-practices/references/authentication.md +191 -0
- package/skills/autotest-skill/autotest-api-best-practices/references/data-driven.md +215 -0
- package/skills/autotest-skill/autotest-api-best-practices/references/http-methods.md +146 -0
- package/skills/autotest-skill/autotest-api-best-practices/references/response-validation.md +220 -0
- package/skills/autotest-skill/autotest-api-best-practices/references/troubleshooting.md +171 -0
- package/skills/autotest-skill/autotest-db/SKILL.md +465 -0
- package/skills/autotest-skill/autotest-db/scripts/db_tunnel.py +78 -0
- package/skills/autotest-skill/autotest-ios/SKILL.md +993 -0
- package/skills/autotest-skill/autotest-ios-best-practices/SKILL.md +974 -0
- package/skills/autotest-skill/autotest-ios-best-practices/examples/ios-form-input.robot +120 -0
- package/skills/autotest-skill/autotest-ios-best-practices/examples/ios-list-navigation.robot +85 -0
- package/skills/autotest-skill/autotest-ios-best-practices/examples/ios-login.robot +103 -0
- package/skills/autotest-skill/autotest-ios-best-practices/references/capabilities.md +187 -0
- package/skills/autotest-skill/autotest-ios-best-practices/references/device-farm.md +180 -0
- package/skills/autotest-skill/autotest-ios-best-practices/references/gestures.md +191 -0
- package/skills/autotest-skill/autotest-ios-best-practices/references/ios-specific.md +308 -0
- package/skills/autotest-skill/autotest-ios-best-practices/references/locators.md +198 -0
- package/skills/autotest-skill/autotest-ios-best-practices/references/troubleshooting.md +271 -0
- package/skills/autotest-skill/autotest-jenkins/SKILL.md +1833 -0
- package/skills/autotest-skill/autotest-mcp-assist/SKILL.md +198 -0
- package/skills/autotest-skill/autotest-project-docs/SKILL.md +344 -0
- package/skills/autotest-skill/autotest-project-docs/scripts/confluence_fetch.py +415 -0
- package/skills/autotest-skill/autotest-results/SKILL.md +109 -0
- package/skills/autotest-skill/autotest-results/scripts/rf_results.py +419 -0
- package/skills/autotest-skill/autotest-scenarios/SKILL.md +415 -0
- package/skills/autotest-skill/autotest-scenarios/scripts/tc_import.py +299 -0
- package/skills/autotest-skill/autotest-strategy/SKILL.md +632 -0
- package/skills/autotest-skill/autotest-web/SKILL.md +880 -0
- package/skills/autotest-skill/autotest-web-best-practices/SKILL.md +1217 -0
- package/skills/autotest-skill/autotest-web-best-practices/examples/basic-web-test.robot +69 -0
- package/skills/autotest-skill/autotest-web-best-practices/examples/form-handling.robot +162 -0
- package/skills/autotest-skill/autotest-web-best-practices/examples/multi-window.robot +259 -0
- package/skills/autotest-skill/autotest-web-best-practices/examples/wait-patterns.robot +229 -0
- package/skills/autotest-skill/autotest-web-best-practices/references/frames-windows.md +434 -0
- package/skills/autotest-skill/autotest-web-best-practices/references/javascript-execution.md +427 -0
- package/skills/autotest-skill/autotest-web-best-practices/references/keywords-reference.md +604 -0
- package/skills/autotest-skill/autotest-web-best-practices/references/locators.md +345 -0
- package/skills/autotest-skill/autotest-web-best-practices/references/screenshots-logs.md +353 -0
- package/skills/autotest-skill/autotest-web-best-practices/references/troubleshooting.md +380 -0
- package/skills/autotest-skill/autotest-web-best-practices/references/waiting-strategies.md +355 -0
- package/skills/autotest-skill/autotest-web-best-practices/references/webdriver-setup.md +430 -0
- package/skills/autotest-skill/pack.yaml +33 -0
- package/skills/autotest-skill/workflows/automation-test.yaml +80 -0
- package/skills/sdlc/_shared/sonar-viettel/quality-gate.md +74 -0
- package/skills/sdlc/_shared/sonar-viettel/sonar-viettel-gate.json +33 -0
- package/skills/sdlc/_shared/sonar-viettel/sonar-viettel-profile.xml +1 -0
- package/skills/sdlc/architecture/SKILL.md +216 -0
- package/skills/sdlc/autotest-android/SKILL.md +1094 -0
- package/skills/sdlc/autotest-android-best-practices/SKILL.md +976 -0
- package/skills/sdlc/autotest-android-best-practices/examples/android-form-input.robot +101 -0
- package/skills/sdlc/autotest-android-best-practices/examples/android-list-navigation.robot +77 -0
- package/skills/sdlc/autotest-android-best-practices/examples/android-login.robot +85 -0
- package/skills/sdlc/autotest-android-best-practices/references/android-specific.md +206 -0
- package/skills/sdlc/autotest-android-best-practices/references/capabilities.md +183 -0
- package/skills/sdlc/autotest-android-best-practices/references/device-farm.md +177 -0
- package/skills/sdlc/autotest-android-best-practices/references/gestures.md +160 -0
- package/skills/sdlc/autotest-android-best-practices/references/locators.md +192 -0
- package/skills/sdlc/autotest-android-best-practices/references/troubleshooting.md +218 -0
- package/skills/sdlc/autotest-api/SKILL.md +1267 -0
- package/skills/sdlc/autotest-api-best-practices/SKILL.md +643 -0
- package/skills/sdlc/autotest-api-best-practices/examples/api-auth.robot +166 -0
- package/skills/sdlc/autotest-api-best-practices/examples/api-crud.robot +216 -0
- package/skills/sdlc/autotest-api-best-practices/examples/api-error-cases.robot +179 -0
- package/skills/sdlc/autotest-api-best-practices/references/authentication.md +191 -0
- package/skills/sdlc/autotest-api-best-practices/references/data-driven.md +215 -0
- package/skills/sdlc/autotest-api-best-practices/references/http-methods.md +146 -0
- package/skills/sdlc/autotest-api-best-practices/references/response-validation.md +220 -0
- package/skills/sdlc/autotest-api-best-practices/references/troubleshooting.md +171 -0
- package/skills/sdlc/autotest-db/SKILL.md +465 -0
- package/skills/sdlc/autotest-db/scripts/db_tunnel.py +78 -0
- package/skills/sdlc/autotest-ios/SKILL.md +993 -0
- package/skills/sdlc/autotest-ios-best-practices/SKILL.md +974 -0
- package/skills/sdlc/autotest-ios-best-practices/examples/ios-form-input.robot +120 -0
- package/skills/sdlc/autotest-ios-best-practices/examples/ios-list-navigation.robot +85 -0
- package/skills/sdlc/autotest-ios-best-practices/examples/ios-login.robot +103 -0
- package/skills/sdlc/autotest-ios-best-practices/references/capabilities.md +187 -0
- package/skills/sdlc/autotest-ios-best-practices/references/device-farm.md +180 -0
- package/skills/sdlc/autotest-ios-best-practices/references/gestures.md +191 -0
- package/skills/sdlc/autotest-ios-best-practices/references/ios-specific.md +308 -0
- package/skills/sdlc/autotest-ios-best-practices/references/locators.md +198 -0
- package/skills/sdlc/autotest-ios-best-practices/references/troubleshooting.md +271 -0
- package/skills/sdlc/autotest-jenkins/SKILL.md +1833 -0
- package/skills/sdlc/autotest-mcp-assist/SKILL.md +198 -0
- package/skills/sdlc/autotest-project-docs/SKILL.md +344 -0
- package/skills/sdlc/autotest-project-docs/scripts/confluence_fetch.py +415 -0
- package/skills/sdlc/autotest-results/SKILL.md +109 -0
- package/skills/sdlc/autotest-results/scripts/rf_results.py +419 -0
- package/skills/sdlc/autotest-scenarios/SKILL.md +415 -0
- package/skills/sdlc/autotest-scenarios/scripts/tc_import.py +299 -0
- package/skills/sdlc/autotest-strategy/SKILL.md +632 -0
- package/skills/sdlc/autotest-web/SKILL.md +880 -0
- package/skills/sdlc/autotest-web-best-practices/SKILL.md +1217 -0
- package/skills/sdlc/autotest-web-best-practices/examples/basic-web-test.robot +69 -0
- package/skills/sdlc/autotest-web-best-practices/examples/form-handling.robot +162 -0
- package/skills/sdlc/autotest-web-best-practices/examples/multi-window.robot +259 -0
- package/skills/sdlc/autotest-web-best-practices/examples/wait-patterns.robot +229 -0
- package/skills/sdlc/autotest-web-best-practices/references/frames-windows.md +434 -0
- package/skills/sdlc/autotest-web-best-practices/references/javascript-execution.md +427 -0
- package/skills/sdlc/autotest-web-best-practices/references/keywords-reference.md +604 -0
- package/skills/sdlc/autotest-web-best-practices/references/locators.md +345 -0
- package/skills/sdlc/autotest-web-best-practices/references/screenshots-logs.md +353 -0
- package/skills/sdlc/autotest-web-best-practices/references/troubleshooting.md +380 -0
- package/skills/sdlc/autotest-web-best-practices/references/waiting-strategies.md +355 -0
- package/skills/sdlc/autotest-web-best-practices/references/webdriver-setup.md +430 -0
- package/skills/sdlc/bmad-advanced-elicitation/SKILL.md +136 -0
- package/skills/sdlc/bmad-advanced-elicitation/methods.csv +51 -0
- package/skills/sdlc/bmad-agent-analyst/SKILL.md +59 -0
- package/skills/sdlc/bmad-agent-analyst/bmad-skill-manifest.yaml +11 -0
- package/skills/sdlc/bmad-brainstorming/SKILL.md +6 -0
- package/skills/sdlc/bmad-brainstorming/brain-methods.csv +62 -0
- package/skills/sdlc/bmad-brainstorming/steps/step-01-session-setup.md +214 -0
- package/skills/sdlc/bmad-brainstorming/steps/step-01b-continue.md +124 -0
- package/skills/sdlc/bmad-brainstorming/steps/step-02a-user-selected.md +229 -0
- package/skills/sdlc/bmad-brainstorming/steps/step-02b-ai-recommended.md +239 -0
- package/skills/sdlc/bmad-brainstorming/steps/step-02c-random-selection.md +211 -0
- package/skills/sdlc/bmad-brainstorming/steps/step-02d-progressive-flow.md +266 -0
- package/skills/sdlc/bmad-brainstorming/steps/step-03-technique-execution.md +401 -0
- package/skills/sdlc/bmad-brainstorming/steps/step-04-idea-organization.md +305 -0
- package/skills/sdlc/bmad-brainstorming/template.md +15 -0
- package/skills/sdlc/bmad-brainstorming/workflow.md +53 -0
- package/skills/sdlc/bmad-check-implementation-readiness/SKILL.md +6 -0
- package/skills/sdlc/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
- package/skills/sdlc/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
- package/skills/sdlc/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
- package/skills/sdlc/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
- package/skills/sdlc/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
- package/skills/sdlc/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
- package/skills/sdlc/bmad-check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/skills/sdlc/bmad-check-implementation-readiness/workflow.md +47 -0
- package/skills/sdlc/bmad-checkpoint-preview/SKILL.md +29 -0
- package/skills/sdlc/bmad-checkpoint-preview/generate-trail.md +38 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-01-orientation.md +105 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-04-testing.md +74 -0
- package/skills/sdlc/bmad-checkpoint-preview/step-05-wrapup.md +24 -0
- package/skills/sdlc/bmad-code-review/SKILL.md +6 -0
- package/skills/sdlc/bmad-code-review/steps/step-01-gather-context.md +85 -0
- package/skills/sdlc/bmad-code-review/steps/step-02-review.md +34 -0
- package/skills/sdlc/bmad-code-review/steps/step-03-triage.md +49 -0
- package/skills/sdlc/bmad-code-review/steps/step-04-present.md +129 -0
- package/skills/sdlc/bmad-code-review/workflow.md +55 -0
- package/skills/sdlc/bmad-correct-course/SKILL.md +6 -0
- package/skills/sdlc/bmad-correct-course/checklist.md +288 -0
- package/skills/sdlc/bmad-correct-course/workflow.md +267 -0
- package/skills/sdlc/bmad-create-architecture/SKILL.md +6 -0
- package/skills/sdlc/bmad-create-architecture/architecture-decision-template.md +12 -0
- package/skills/sdlc/bmad-create-architecture/data/domain-complexity.csv +13 -0
- package/skills/sdlc/bmad-create-architecture/data/project-types.csv +7 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-01-init.md +153 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-01b-continue.md +173 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-02-context.md +224 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-03-starter.md +329 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-04-decisions.md +318 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-05-patterns.md +359 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-06-structure.md +379 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-07-validation.md +359 -0
- package/skills/sdlc/bmad-create-architecture/steps/step-08-complete.md +76 -0
- package/skills/sdlc/bmad-create-architecture/workflow.md +32 -0
- package/skills/sdlc/bmad-create-epics-and-stories/SKILL.md +6 -0
- package/skills/sdlc/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
- package/skills/sdlc/bmad-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
- package/skills/sdlc/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/skills/sdlc/bmad-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
- package/skills/sdlc/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
- package/skills/sdlc/bmad-create-epics-and-stories/workflow.md +51 -0
- package/skills/sdlc/bmad-create-prd/SKILL.md +6 -0
- package/skills/sdlc/bmad-create-prd/data/domain-complexity.csv +15 -0
- package/skills/sdlc/bmad-create-prd/data/prd-purpose.md +197 -0
- package/skills/sdlc/bmad-create-prd/data/project-types.csv +11 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-01-init.md +178 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-01b-continue.md +161 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-02-discovery.md +208 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-02b-vision.md +142 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-02c-executive-summary.md +158 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-03-success.md +214 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-04-journeys.md +201 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-05-domain.md +194 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-06-innovation.md +211 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-07-project-type.md +222 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-08-scoping.md +216 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-09-functional.md +219 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-10-nonfunctional.md +230 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-11-polish.md +221 -0
- package/skills/sdlc/bmad-create-prd/steps-c/step-12-complete.md +115 -0
- package/skills/sdlc/bmad-create-prd/templates/prd-template.md +10 -0
- package/skills/sdlc/bmad-create-prd/workflow.md +61 -0
- package/skills/sdlc/bmad-domain-research/SKILL.md +6 -0
- package/skills/sdlc/bmad-domain-research/domain-steps/step-01-init.md +137 -0
- package/skills/sdlc/bmad-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
- package/skills/sdlc/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/skills/sdlc/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/skills/sdlc/bmad-domain-research/domain-steps/step-05-technical-trends.md +234 -0
- package/skills/sdlc/bmad-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
- package/skills/sdlc/bmad-domain-research/research.template.md +29 -0
- package/skills/sdlc/bmad-domain-research/workflow.md +51 -0
- package/skills/sdlc/bmad-party-mode/SKILL.md +125 -0
- package/skills/sdlc/bmad-prfaq/SKILL.md +96 -0
- package/skills/sdlc/bmad-prfaq/agents/artifact-analyzer.md +60 -0
- package/skills/sdlc/bmad-prfaq/agents/web-researcher.md +49 -0
- package/skills/sdlc/bmad-prfaq/assets/prfaq-template.md +62 -0
- package/skills/sdlc/bmad-prfaq/bmad-manifest.json +16 -0
- package/skills/sdlc/bmad-prfaq/references/customer-faq.md +55 -0
- package/skills/sdlc/bmad-prfaq/references/internal-faq.md +51 -0
- package/skills/sdlc/bmad-prfaq/references/press-release.md +60 -0
- package/skills/sdlc/bmad-prfaq/references/verdict.md +79 -0
- package/skills/sdlc/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
- package/skills/sdlc/bmad-qa-generate-e2e-tests/checklist.md +33 -0
- package/skills/sdlc/bmad-qa-generate-e2e-tests/workflow.md +136 -0
- package/skills/sdlc/bmad-review-adversarial-general/SKILL.md +37 -0
- package/skills/sdlc/bmad-review-edge-case-hunter/SKILL.md +67 -0
- package/skills/sdlc/bmad-validate-prd/SKILL.md +6 -0
- package/skills/sdlc/bmad-validate-prd/data/domain-complexity.csv +15 -0
- package/skills/sdlc/bmad-validate-prd/data/prd-purpose.md +197 -0
- package/skills/sdlc/bmad-validate-prd/data/project-types.csv +11 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
- package/skills/sdlc/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
- package/skills/sdlc/bmad-validate-prd/workflow.md +61 -0
- package/skills/sdlc/diagnose/SKILL.md +117 -0
- package/skills/sdlc/discovery/SKILL.md +197 -0
- package/skills/sdlc/drift-check/SKILL.md +93 -0
- package/skills/sdlc/drift-check/lib/resolve-drift-edges.mjs +144 -0
- package/skills/sdlc/feature-complete/SKILL.md +159 -0
- package/skills/sdlc/freso-domain-sample/SKILL.md +35 -0
- package/skills/sdlc/freso-domain-sample/agricultural-marketplace-system-overview.md +103 -0
- package/skills/sdlc/freso-domain-sample/api-reference.md +39 -0
- package/skills/sdlc/freso-domain-sample/farm/product-management/business-scenario.md +67 -0
- package/skills/sdlc/freso-domain-sample/farm/product-management/detail-design.md +190 -0
- package/skills/sdlc/freso-domain-sample/global-data.md +37 -0
- package/skills/sdlc/freso-domain-sample/restaurant/home-page/product-listing-page-by-category/business-scenario.md +120 -0
- package/skills/sdlc/freso-domain-sample/restaurant/home-page/product-listing-page-by-category/detail-design.md +100 -0
- package/skills/sdlc/grill-me/SKILL.md +10 -0
- package/skills/sdlc/hotfix-analyze/SKILL.md +198 -0
- package/skills/sdlc/hotfix-green/SKILL.md +101 -0
- package/skills/sdlc/hotfix-red/SKILL.md +96 -0
- package/skills/sdlc/hotfix-review/SKILL.md +151 -0
- package/skills/sdlc/implement/SKILL.md +267 -0
- package/skills/sdlc/improve-codebase-architecture/SKILL.md +70 -0
- package/skills/sdlc/init/SKILL.md +195 -0
- package/skills/sdlc/install-deps.mjs +145 -0
- package/skills/sdlc/onboard-code/SKILL.md +193 -0
- package/skills/sdlc/onboard-docs/SKILL.md +121 -0
- package/skills/sdlc/onboard-docs/convert.py +199 -0
- package/skills/sdlc/onboarding/SKILL.md +57 -0
- package/skills/sdlc/pack.yaml +95 -0
- package/skills/sdlc/prd/SKILL.md +181 -0
- package/skills/sdlc/review/SKILL.md +236 -0
- package/skills/sdlc/sdlc-e2e/SKILL.md +56 -0
- package/skills/sdlc/sdlc-e2e/rf-requirements.txt +39 -0
- package/skills/sdlc/sdlc-e2e/scripts/vsaf_e2e_bridge.py +107 -0
- package/skills/sdlc/sdlc-health/SKILL.md +167 -0
- package/skills/sdlc/setup/SKILL.md +162 -0
- package/skills/sdlc/ship/SKILL.md +279 -0
- package/skills/sdlc/srs/SKILL.md +139 -0
- package/skills/sdlc/tdd/SKILL.md +107 -0
- package/skills/sdlc/test-design/SKILL.md +130 -0
- package/skills/sdlc/validate-srs/SKILL.md +10 -0
- package/skills/sdlc/validate-srs/data/domain-checklists/insurance.yaml +110 -0
- package/skills/sdlc/validate-srs/data/grep-patterns-srs.yaml +158 -0
- package/skills/sdlc/validate-srs/data/srs-review-glossary.md +237 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-01-discovery.md +280 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-02-business-alignment.md +351 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-03-completeness.md +353 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-04-consistency.md +352 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-05-quality.md +347 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-06-system-nfr.md +217 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-07-delivery-readiness.md +288 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-08-risk-analysis.md +283 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-09-user-impact.md +262 -0
- package/skills/sdlc/validate-srs/steps-v/step-v-10-report.md +308 -0
- package/skills/sdlc/validate-srs/workflow.md +269 -0
- package/skills/sdlc/vsaf/SKILL.md +102 -0
- package/skills/sdlc/workflows/automation-test.yaml +80 -0
- package/skills/sdlc/workflows/drift-check-only.yaml +7 -0
- package/skills/sdlc/workflows/hotfix-tdd.yaml +22 -0
- package/skills/sdlc/workflows/hotfix.yaml +36 -0
- package/skills/sdlc/workflows/master-sdlc-to-srs.yaml +48 -0
- package/skills/sdlc/workflows/master-sdlc.yaml +102 -0
- package/skills/sdlc/workflows/onboarding.yaml +9 -0
- package/skills/sdlc/workflows/sdlc-build.yaml +18 -0
- package/skills/sdlc/workflows/sdlc-design.yaml +12 -0
- package/skills/sdlc/workflows/sdlc-qa.yaml +17 -0
- package/skills/sdlc/workflows/sdlc-testcase.yaml +7 -0
- package/skills/sdlc/workflows/sdlc-thinking.yaml +12 -0
- package/skills/sdlc/write-srs/SKILL.md +50 -0
- package/skills/sdlc/write-srs/examples/srs-good-bad.md +89 -0
- package/skills/sdlc/write-srs/srs-feature-template.md +844 -0
- package/skills/sdlc/write-srs/srs-system-template.md +540 -0
- package/skills/sdlc/write-srs/workflow.md +331 -0
- package/skills/sdlc/zoom-out/SKILL.md +7 -0
- package/skills/vds-skill/_shared/credentials.sh +79 -0
- package/skills/vds-skill/create-bitbucket-pr/SKILL.md +73 -0
- package/skills/vds-skill/create-bitbucket-pr/scripts/create-pr.sh +105 -0
- package/skills/vds-skill/create-jira-epic/SKILL.md +73 -0
- package/skills/vds-skill/create-jira-epic/scripts/create-epic.sh +113 -0
- package/skills/vds-skill/install-deps.mjs +299 -0
- package/skills/vds-skill/pack.yaml +24 -0
- package/skills/vds-skill/pull/SKILL.md +38 -0
- package/skills/vds-skill/pull/scripts/pull.sh +52 -0
- package/skills/vds-skill/push-prd/SKILL.md +246 -0
- package/skills/vds-skill/push-srs/SKILL.md +135 -0
- package/skills/vds-skill/search-confluence/SKILL.md +73 -0
- package/skills/vds-skill/search-confluence/scripts/search.sh +128 -0
- package/skills/vds-skill/vds-scripts/.claude/phase7-CLOSURE.md +100 -0
- package/skills/vds-skill/vds-scripts/.dockerignore +62 -0
- package/skills/vds-skill/vds-scripts/.github/ISSUE_TEMPLATE/cli-change.md +92 -0
- package/skills/vds-skill/vds-scripts/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +48 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/chaos-smoke.yml +266 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/confluence-sync.yml +44 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/docs-confluence-evidence.yml +170 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/docs-quality.yml +59 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/lint-and-test.yml +90 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/scheduler-load-smoke.yml +104 -0
- package/skills/vds-skill/vds-scripts/.github/workflows/telegram-bridge-ci.yml +131 -0
- package/skills/vds-skill/vds-scripts/.graphifyignore +29 -0
- package/skills/vds-skill/vds-scripts/.importlinter +86 -0
- package/skills/vds-skill/vds-scripts/.mcp.json +11 -0
- package/skills/vds-skill/vds-scripts/.pre-commit-config.yaml +62 -0
- package/skills/vds-skill/vds-scripts/.ruffignore +3 -0
- package/skills/vds-skill/vds-scripts/.secrets.baseline +133 -0
- package/skills/vds-skill/vds-scripts/AGENTS.md +250 -0
- package/skills/vds-skill/vds-scripts/AGENTS.vi.md +92 -0
- package/skills/vds-skill/vds-scripts/ECOSYSTEM-CHANGELOG.md +52 -0
- package/skills/vds-skill/vds-scripts/ECOSYSTEM-DOCS.md +602 -0
- package/skills/vds-skill/vds-scripts/ECOSYSTEM_ALIGNMENT.md +133 -0
- package/skills/vds-skill/vds-scripts/Makefile +119 -0
- package/skills/vds-skill/vds-scripts/README.md +103 -0
- package/skills/vds-skill/vds-scripts/bitbucket_manifest_mapping.toml +34 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/ARCHITECTURE_ANALYSIS.md +258 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/BITBUCKET_API_PRACTICES.md +393 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/EVALUATION_REPORT.md +61 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/FEATURES.md +908 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/README.md +817 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/pyproject.toml +49 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/__init__.py +50 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/async_client.py +641 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/cli.py +2271 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/client.py +2693 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/config.py +186 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/factory.py +185 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/parsers.py +113 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/protocols.py +244 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/src/vds_bitbucket_orchestrator/repo_ops.py +325 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/__init__.py +8 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/conftest.py +65 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_advanced_search.py +155 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_async_client.py +505 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_branch_permissions.py +172 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli.py +113 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli_archive.py +122 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_cli_clone.py +131 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client.py +207 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_archive.py +73 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_branch_conditions.py +101 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_code_advanced.py +180 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_code_file.py +33 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_deployment_environments.py +193 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_issues.py +163 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_pipelines_advanced.py +171 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_pr_blockers.py +118 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_client_repository_variables.py +155 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code.py +98 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code_advanced.py +279 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_code_insights.py +334 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_conditions.py +149 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_config.py +297 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_deployment_env.py +352 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_errors.py +67 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_factory.py +352 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_fork_operations.py +203 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_issue_cli.py +262 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_pipeline_advanced.py +265 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_pr_blocker.py +206 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_protocols.py +336 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_archive.py +169 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_clone.py +115 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_ops_parsing.py +149 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_settings.py +336 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_repo_variables.py +266 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_webhooks.py +188 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/test_workspace.py +234 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/unit/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/bitbucket_orchestrator/tests/unit/test_parsers.py +254 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/README.md +29 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/pyproject.toml +63 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/__init__.py +17 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/cli.py +187 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/src/vds_brd_orchestrator/validator.py +121 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/test_cli.py +62 -0
- package/skills/vds-skill/vds-scripts/brd_orchestrator/tests/test_validator.py +33 -0
- package/skills/vds-skill/vds-scripts/code/code_evidence_pack.json +435 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/Dockerfile +19 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/README.md +479 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/SYNC_SCRIPTS.md +127 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/SYNC_STANDARDIZATION.md +108 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/pyproject.toml +50 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/__init__.py +56 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/async_client.py +100 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/cli.py +3160 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/config.py +215 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content.py +368 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/content_v2.py +144 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/crawl_tree.py +1833 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/errors.py +44 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/eventing.py +111 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/http.py +1850 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/orchestration.py +166 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/protocols.py +61 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/reporting.py +78 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree.py +122 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/src/confluence_orchestrator/tree_copier.py +431 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_pdfs_from_markdown.py +203 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_pdfs_to_confluence.py +299 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/sync_png_attachments.py +299 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/conftest.py +46 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_advanced_content.py +252 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_advanced_search.py +193 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_async_client.py +104 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_cache_management.py +246 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_cli.py +716 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_config.py +130 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content.py +192 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content_flags.py +27 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_content_labels.py +94 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_crawl_tree.py +2252 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_degraded_write_safety.py +176 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_draft_management.py +225 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_errors.py +75 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing.py +73 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_chaos.py +37 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_rate_limit.py +44 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_eventing_timeout.py +49 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_export.py +231 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_history.py +217 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_http.py +375 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_orchestration.py +93 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_reporting.py +24 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_search_cql.py +36 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_space_management.py +236 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_space_permissions.py +384 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_tree_copier.py +644 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_tree_copier_remap.py +289 -0
- package/skills/vds-skill/vds-scripts/confluence_orchestrator/tests/test_user_group_management.py +387 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/README.md +663 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/ci_validate.sh +16 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-component.png +0 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-component.puml +23 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-sequence.png +0 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-sequence.puml +21 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-usecase.png +0 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/docs-nttc/projects/INSURANCE/analysis/current-state/insurance-claim-business/insurance-claim-business-usecase.puml +14 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/examples/github-actions-validate.yml +39 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/generate_all_diagrams.py +827 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/generate_insurance_c4_diagrams.py +261 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/generate_insurance_c4_quick.py +486 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/pyproject.toml +28 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/render_png.py +59 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/src/vds_diagram_generator/__init__.py +3 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/src/vds_diagram_generator/cli.py +50 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/test_c4_hierarchical.py +142 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/test_c4_quick.py +131 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_analyzer_completeness.py +260 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_c4_syntax_correctness.py +138 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_component_coverage.py +182 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_mermaid_output.py +80 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_png_generation.py +112 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_scenario_templates.py +15 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_sequence_accuracy.py +93 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_structurizr_export.py +177 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_style_consistency.py +174 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_usecase_generator.py +201 -0
- package/skills/vds-skill/vds-scripts/diagram_generator/tests/test_usecase_integration.py +124 -0
- package/skills/vds-skill/vds-scripts/docker/.dockerignore +38 -0
- package/skills/vds-skill/vds-scripts/docker/ADR.md +392 -0
- package/skills/vds-skill/vds-scripts/docker/Dockerfile +68 -0
- package/skills/vds-skill/vds-scripts/docker/MIGRATION.md +453 -0
- package/skills/vds-skill/vds-scripts/docker/README.md +347 -0
- package/skills/vds-skill/vds-scripts/docker/ROLLBACK.md +596 -0
- package/skills/vds-skill/vds-scripts/docker/compose.phase2-verification.yml +31 -0
- package/skills/vds-skill/vds-scripts/docker/docker-compose.cli.yml +206 -0
- package/skills/vds-skill/vds-scripts/docker/docker-compose.infra.yml +276 -0
- package/skills/vds-skill/vds-scripts/docker/docker-compose.services.yml +425 -0
- package/skills/vds-skill/vds-scripts/docker/infrastructure/init-schemas.sql +177 -0
- package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/pgbouncer.ini +75 -0
- package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/userlist.txt +50 -0
- package/skills/vds-skill/vds-scripts/docker/infrastructure/pgbouncer/userlist.txt.template +36 -0
- package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/.gitkeep +0 -0
- package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/PREFLIGHT.md +132 -0
- package/skills/vds-skill/vds-scripts/docs/.confluence-evidence/README.md +84 -0
- package/skills/vds-skill/vds-scripts/docs/.confluence.yaml +157 -0
- package/skills/vds-skill/vds-scripts/docs/.freshness.yaml +54 -0
- package/skills/vds-skill/vds-scripts/docs/README.md +235 -0
- package/skills/vds-skill/vds-scripts/docs/agents/README.md +33 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/data-flow.md +132 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/development-roadmap.md +49 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/features-overview.md +62 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/index.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/runtime-verification-and-gap-reporting.md +127 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/system-architecture.md +139 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/whats-new.md +75 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/who-ecosystem-introduction.md +65 -0
- package/skills/vds-skill/vds-scripts/docs/agents/explanation/who-ecosystem-model.md +41 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/02-using-vds-ai-memory.md +98 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/03-memory-cross-agent.md +241 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/04-using-progress-reports.md +240 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/08-semantic-search.md +46 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/apply-phase3-migration.md +148 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/choose-the-right-command-or-skill.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/contribute-new-orchestrator.md +149 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/decision-tree.md +63 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/first-audit-run.md +83 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/index.md +49 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +314 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +165 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +138 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +130 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +142 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +140 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +135 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-all-project-preparation.md +211 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-bounded-parallel-analysis.md +123 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase131-confluence-upload-recovery.md +204 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/phase132-department-preparation.md +144 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/run-ecosystem-daily-report.md +213 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/tips-and-tricks.md +138 -0
- package/skills/vds-skill/vds-scripts/docs/agents/how-to/troubleshooting-guide.md +221 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/agent-operational-contract.md +162 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/alignment-phase179-report.md +144 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/audit-triage-playbook.md +256 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/backup-restore.md +132 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/bitbucket-orchestrator.md +56 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/brd-orchestrator.md +52 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/capability-coverage-review.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/ci-workflows.md +98 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/circular-dependency-orchestrator.md +55 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-commands.md +583 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-development-standards.md +41 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/cli-help-matrix.md +84 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/common-errors.md +126 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/configuration-reference.md +128 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-orchestrator.md +56 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-sync-target.md +111 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/confluence-sync.md +46 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/db-query-orchestrator.md +93 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/diagrams-orchestrator.md +52 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/ecosystem-daily-report.md +229 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/elastic-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/env-git-helper.md +216 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/evolution-orchestrator.md +113 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/excel-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/git-orchestrator.md +62 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/google-sheets-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/grafana-orchestrator.md +52 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/hexagonal-orchestrator.md +64 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/index.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/infrastructure-v2.15.md +67 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/intellij-orchestrator.md +50 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/jira-orchestrator.md +60 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/links-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/lint-cli.md +99 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/lsp-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/markdown-orchestrator.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/mcp-orchestrator.md +88 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/memory-orchestrator.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/metabase-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/migration-playbook.md +71 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/multi-agent-orchestrator.md +52 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/openapi-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-architecture.md +194 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-comparison-matrix.md +79 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/orchestrator-index.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/pdf-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/portable-paths-and-config.md +0 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/portable-paths-validation-matrix.md +129 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/progress-orchestrator.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/progress-report-cli.md +215 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/public-interface-orchestrator.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/research-orchestrator.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/schema-orchestrator.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/search-tools.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/skills-commands.md +256 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/skills-reference.md +32 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/sonarqube-orchestrator.md +62 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/spec-orchestrator.md +56 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/structure-orchestrator.md +69 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/system-requirements.md +76 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/tasks-orchestrator.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/validation-and-sync-notes.md +54 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/vds-ai-memory-api.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/vds-cli-reference.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/who-capability-inventory.md +96 -0
- package/skills/vds-skill/vds-scripts/docs/agents/reference/who-capability-routing-matrix.md +14 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/feature-progression-guide.md +112 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/index.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/quick-start.md +50 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/who-skills-and-scripts-onboarding.md +47 -0
- package/skills/vds-skill/vds-scripts/docs/agents/tutorials/zero-to-productive-developer.md +339 -0
- package/skills/vds-skill/vds-scripts/docs/confluence/IMPLEMENTATION-SUMMARY.md +78 -0
- package/skills/vds-skill/vds-scripts/docs/confluence/SYNC-GUIDE.md +47 -0
- package/skills/vds-skill/vds-scripts/docs/deployment/offline-docker-image-load.md +59 -0
- package/skills/vds-skill/vds-scripts/docs/evolution-auto-run-rollout.md +325 -0
- package/skills/vds-skill/vds-scripts/docs/evolution-loop-deep-integration.md +496 -0
- package/skills/vds-skill/vds-scripts/docs/evolution-loop-integration-guide.md +359 -0
- package/skills/vds-skill/vds-scripts/docs/openspace-schema-snapshot.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/operations/sla-mttr-policy.md +44 -0
- package/skills/vds-skill/vds-scripts/docs/p0-closure-evidence/SUMMARY.md +58 -0
- package/skills/vds-skill/vds-scripts/docs/p4-closure-evidence/.gitkeep +0 -0
- package/skills/vds-skill/vds-scripts/docs/p4-closure-evidence/smoke-20260427T024137Z-b95b586b.json +15 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/alembic-and-runtime-advisory-locks.md +45 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/dbos-listen-notify.md +54 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/pgbouncer-search-path-empirical.md +110 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/pgvector-set-local-audit.md +51 -0
- package/skills/vds-skill/vds-scripts/docs/p8-preflight-evidence/topology-decision-session-mode.md +57 -0
- package/skills/vds-skill/vds-scripts/docs/phases/CHANGELOG.md +103 -0
- package/skills/vds-skill/vds-scripts/docs/phases/PHASE_125_COMPLETION_AND_MERGE.md +212 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125/IMPLEMENTATION_REPORT.md +227 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125/TSK-125.10-11-implementation-summary.md +196 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125/profile-patch-ollama-local-anthropic.md +122 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125_completion_summary.md +369 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125_llm_analysis_skill.md +164 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125_merge_complete.md +147 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase125_skill_runtime_closure_20260321.md +91 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/closure-handoff-summary-2026-03-23.md +290 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/remaining-risk-register-2026-03-25.md +143 -0
- package/skills/vds-skill/vds-scripts/docs/phases/phase2-portable-paths/verification-evidence-2026-03-23.md +135 -0
- package/skills/vds-skill/vds-scripts/docs/v0-sunset-known-issues.md +88 -0
- package/skills/vds-skill/vds-scripts/docs/vi/TRANSLATION-BACKLOG.md +72 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/README.md +41 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/features-overview.md +29 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/index.md +14 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/runtime-verification-and-gap-reporting.md +129 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/whats-new.md +37 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/who-ecosystem-introduction.md +21 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/explanation/who-ecosystem-model.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/02-using-vds-ai-memory.md +100 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/03-memory-cross-agent.md +243 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/04-using-progress-reports.md +242 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/08-semantic-search.md +16 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/choose-the-right-command-or-skill.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/decision-tree.md +77 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/first-audit-run.md +85 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/index.md +21 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +156 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +174 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +147 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +139 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +151 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +149 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +144 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-all-project-preparation.md +213 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-bounded-parallel-analysis.md +125 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase131-confluence-upload-recovery.md +206 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/phase132-department-preparation.md +146 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/tips-and-tricks.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/how-to/troubleshooting-guide.md +36 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/agent-operational-contract.md +98 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/audit-triage-playbook.md +258 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/bitbucket-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/brd-orchestrator.md +29 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/capability-coverage-review.md +46 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/circular-dependency-orchestrator.md +29 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-commands.md +409 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-development-standards.md +19 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/cli-help-matrix.md +71 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/common-errors.md +133 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/configuration-reference.md +25 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/confluence-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/db-query-orchestrator.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/diagrams-orchestrator.md +31 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/elastic-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/evolution-orchestrator.md +31 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/excel-orchestrator.md +60 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/git-orchestrator.md +31 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/google-sheets-orchestrator.md +60 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/grafana-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/hexagonal-orchestrator.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/index.md +25 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/intellij-orchestrator.md +59 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/jira-orchestrator.md +32 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/links-orchestrator.md +66 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/lsp-orchestrator.md +60 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/markdown-orchestrator.md +62 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/mcp-orchestrator.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/memory-orchestrator.md +45 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/metabase-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/multi-agent-orchestrator.md +61 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/openapi-orchestrator.md +66 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/orchestrator-architecture.md +24 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/orchestrator-index.md +73 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/pdf-orchestrator.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/portable-paths-and-config.md +123 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/portable-paths-validation-matrix.md +131 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/progress-orchestrator.md +43 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/progress-report-cli.md +217 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/public-interface-orchestrator.md +82 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/research-orchestrator.md +45 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/schema-orchestrator.md +66 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/search-tools.md +19 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/skills-reference.md +27 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/sonarqube-orchestrator.md +71 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/spec-orchestrator.md +56 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/structure-orchestrator.md +78 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/system-requirements.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/tasks-orchestrator.md +45 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/validation-and-sync-notes.md +26 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/vds-ai-memory-api.md +53 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/vds-cli-reference.md +34 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/who-capability-inventory.md +98 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/reference/who-capability-routing-matrix.md +16 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/feature-progression-guide.md +124 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/index.md +13 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/quick-start.md +30 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/who-skills-and-scripts-onboarding.md +42 -0
- package/skills/vds-skill/vds-scripts/docs/vi/agents/tutorials/zero-to-productive-developer.md +137 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/README.md +450 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/pyproject.toml +97 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/__init__.py +81 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/cli.py +652 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/client.py +743 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/config.py +208 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/src/vds_elastic_orchestrator/py.typed +0 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/conftest.py +227 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_client.py +990 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_config.py +268 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_e2e_verification.py +272 -0
- package/skills/vds-skill/vds-scripts/elastic_orchestrator/tests/test_errors.py +78 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/README.md +288 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/RESEARCH_BASED_UPDATES_REPORT.md +261 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/add_essential_missing_effort.py +255 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/adjust_effort_complexity.py +184 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/brd_analysis_and_task_breakdown.py +632 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/brd_analysis_comprehensive.py +1029 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/check_overlaps_and_brd_coverage.py +570 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/clean_remarks_column.py +127 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/comprehensive_brd_check.py +322 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/create_buffered_summary.py +119 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/create_service_totals_sheet.py +118 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/examples/basic_operations.py +85 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/expand_all_tasks.py +341 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/expand_tasks.py +304 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fill_brd_references.py +347 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fill_remarks_and_colors.py +132 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/finalize_brd_and_cleanup.py +295 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/finalize_brd_coverage.py +327 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_all_formulas.py +99 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_detail_presentation.py +113 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_presentation_and_effort.py +116 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_presentation_consistency.py +231 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/fix_remarks_matching.py +179 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/group_tasks_by_service_id.py +210 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/increase_brd_coverage.py +497 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/increase_effort_complexity.py +155 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/organize_and_deduplicate.py +273 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/pyproject.toml +64 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/rebuild_all_formulas.py +146 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/remove_base_multiplier_and_check_duplicates.py +310 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/remove_duplicate_brd_tasks.py +137 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/research_based_updates.py +457 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/restore_e_values.py +172 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/__init__.py +5 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/cli.py +746 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/config.py +74 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/converters.py +226 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/errors.py +88 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/excel_client.py +443 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/formatters.py +211 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/logging.py +57 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/source_contract.py +29 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/target_state_status.py +837 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/ulnc_alignment.py +1291 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/src/vds_excel_orchestrator/validators.py +164 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/sync_detail_and_total_sheets.py +211 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/conftest.py +36 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_cli.py +383 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_excel_client.py +129 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_ulnc_alignment.py +373 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/tests/test_validators.py +64 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_api_database_effort.py +261 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_buffers_inline.py +115 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_complex_services_and_add_new.py +336 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_responsibility_and_fix_rows.py +208 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_task_breakdown_vietnamese.py +309 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/update_vietnamese_and_responsibility.py +415 -0
- package/skills/vds-skill/vds-scripts/excel_orchestrator/verify_brd_coverage_comprehensive.py +401 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/ENHANCEMENT_SUMMARY.md +119 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/README.md +286 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/VERIFICATION_REPORT.md +152 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/pyproject.toml +37 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__init__.py +30 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/__main__.py +4 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/branch_probe.py +271 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/cli.py +892 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/logging_config.py +63 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/manifest.py +249 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/orchestrator.py +1647 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/protocols.py +35 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/src/vds_git_orchestrator/reporting.py +55 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_cli_settings.py +19 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_integration.py +79 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_manifest.py +79 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_orchestrator.py +207 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_public_api.py +235 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/test_resilience.py +343 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/test_branch_probe.py +327 -0
- package/skills/vds-skill/vds-scripts/git_orchestrator/tests/unit/test_protocols.py +132 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/README.md +241 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/pyproject.toml +45 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/__init__.py +69 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/cli.py +568 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/client.py +186 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/config.py +46 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/src/vds_google_sheets_orchestrator/errors.py +41 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/conftest.py +1 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_cli.py +212 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_client.py +24 -0
- package/skills/vds-skill/vds-scripts/google_sheets_orchestrator/tests/unit/test_config.py +16 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/README.md +572 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/pyproject.toml +102 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/__init__.py +78 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/cli.py +455 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/client.py +700 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/config.py +243 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/src/vds_grafana_orchestrator/py.typed +1 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/conftest.py +308 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_client.py +458 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_config.py +203 -0
- package/skills/vds-skill/vds-scripts/grafana_orchestrator/tests/test_errors.py +78 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/README.md +864 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/pyproject.toml +43 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/__init__.py +65 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/adapter.py +1685 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/cli.py +2806 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/config.py +168 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/src/vds_jira_orchestrator/reporting.py +66 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/conftest.py +86 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_agile_list_payloads.py +54 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_bulk_operations.py +91 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_components.py +56 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_createmeta.py +45 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_dashboard.py +119 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_issue_properties.py +53 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_permissions_compat.py +41 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_reindex.py +42 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_remote_links.py +75 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_transitions.py +90 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_user_management.py +116 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_version_management.py +181 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_adapter_watchers.py +43 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_advanced_search.py +179 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_agile.py +304 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_application_properties.py +243 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_backlog.py +91 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_bulk_operations.py +403 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_cli.py +108 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_components.py +119 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_config.py +166 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_dashboard.py +122 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_discover_fields.py +207 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_errors.py +72 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_filter_management.py +411 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_archiving.py +179 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_links.py +257 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_issue_properties.py +189 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_link_types.py +407 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_parse_set.py +37 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_permissions.py +343 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_reindex.py +81 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_remote_links.py +269 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_security_schemes.py +202 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_transitions_changelog.py +109 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_user_management.py +246 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_version_management.py +503 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_watchers.py +116 -0
- package/skills/vds-skill/vds-scripts/jira_orchestrator/tests/test_worklog.py +243 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/README.md +864 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/pyproject.toml +43 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/__init__.py +65 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/adapter.py +1689 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/cli.py +2799 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/config.py +137 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/src/vds_jira_viettelmoney_orchestrator/reporting.py +65 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/conftest.py +86 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_agile_list_payloads.py +54 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_bulk_operations.py +101 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_components.py +64 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_createmeta.py +45 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_dashboard.py +135 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_issue_properties.py +63 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_permissions_compat.py +42 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_reindex.py +42 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_remote_links.py +89 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_transitions.py +91 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_user_management.py +130 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_version_management.py +189 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_adapter_watchers.py +49 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_advanced_search.py +213 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_agile.py +334 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_application_properties.py +261 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_backlog.py +91 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_bulk_operations.py +443 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_cli.py +106 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_components.py +133 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_config.py +166 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_dashboard.py +130 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_discover_fields.py +207 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_errors.py +61 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_filter_management.py +478 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_archiving.py +181 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_links.py +257 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_issue_properties.py +203 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_link_types.py +426 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_parse_set.py +37 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_permissions.py +358 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_reindex.py +81 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_remote_links.py +292 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_security_schemes.py +218 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_transitions_changelog.py +121 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_user_management.py +283 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_version_management.py +561 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_watchers.py +128 -0
- package/skills/vds-skill/vds-scripts/jira_viettelmoney_orchestrator/tests/test_worklog.py +265 -0
- package/skills/vds-skill/vds-scripts/llms.txt +159 -0
- package/skills/vds-skill/vds-scripts/markdown_orchestrator/README.md +72 -0
- package/skills/vds-skill/vds-scripts/markdown_orchestrator/pyproject.toml +39 -0
- package/skills/vds-skill/vds-scripts/markdown_orchestrator/src/vds_markdown_orchestrator/__init__.py +5 -0
- package/skills/vds-skill/vds-scripts/markdown_orchestrator/src/vds_markdown_orchestrator/cli.py +102 -0
- package/skills/vds-skill/vds-scripts/mcp_server/Dockerfile +63 -0
- package/skills/vds-skill/vds-scripts/mcp_server/README.md +140 -0
- package/skills/vds-skill/vds-scripts/mcp_server/pyproject.toml +41 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/__init__.py +3 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/config.py +36 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/server.py +111 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/__init__.py +15 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/bitbucket_tools.py +47 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/confluence_tools.py +53 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/git_tools.py +71 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/jira_tools.py +63 -0
- package/skills/vds-skill/vds-scripts/mcp_server/src/vds_mcp_server/tools/vidp_tools.py +64 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/conftest.py +31 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_bitbucket_tools.py +28 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_confluence_tools.py +28 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_git_tools.py +35 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/unit/test_jira_tools.py +35 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/__init__.py +6 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/conftest.py +51 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_confluence_tools.py +40 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_jira_tools.py +39 -0
- package/skills/vds-skill/vds-scripts/mcp_server/tests/verification/test_mcp_tool_registration.py +50 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/.dockerignore +93 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/.env.example +40 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/.ruff_rules.py +350 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/.yamllint.yml +43 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/DEVELOPMENT_PLAN.md +80 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/Dockerfile +87 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/README.md +608 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/cli_verification_test/test.md +6 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/cli_verification_test/test.pdf +0 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/alertmanager.yml +83 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/prometheus.prod.yml +98 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/prometheus.yml +40 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/config/redis.conf +78 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/COMPETITIVE_ANALYSIS_REPORT.md +309 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/FEATURES_GUIDE.md +518 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/MULTI_USER_DEPLOYMENT_GUIDE.md +615 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/docs/USER_GUIDE.md +829 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/pyproject.toml +87 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/pytest.ini +71 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/ruff.toml +6 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/debug_security_report.py +59 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/demo_library_selector.py +109 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/generate_project_stats.py +52 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/generate_styled_pdf.py +95 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/migrate_render_pdfs.py +285 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/setup_team.bat +283 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/scripts/setup_team.sh +324 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/__init__.py +5 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/cli.py +542 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/src/vds_pdf_orchestrator/config.py +33 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/README.md +650 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/conftest.py +520 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/requirements.txt +51 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/run_tests.py +659 -0
- package/skills/vds-skill/vds-scripts/pdf_orchestrator/tests/test_config.py +36 -0
- package/skills/vds-skill/vds-scripts/platform_core/pyproject.toml +49 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/__init__.py +16 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/alembic/__init__.py +18 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/alembic/runtime.py +139 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/config.py +88 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/credentials.py +40 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/env.py +24 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/errors.py +127 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/__init__.py +18 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/auth.py +32 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/errors.py +47 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/pagination.py +65 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/retry.py +62 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/http/stack.py +61 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/logging.py +132 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/protocols.py +77 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/serialization.py +80 -0
- package/skills/vds-skill/vds-scripts/platform_core/src/vds_platform_core/severity.py +175 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/conftest.py +1 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_alembic_runtime.py +300 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_auth.py +84 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_config.py +83 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_credentials.py +73 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_env.py +56 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_errors.py +201 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_errors_http.py +74 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_http_settings.py +116 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_logging.py +148 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_pagination.py +153 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_protocols.py +132 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_retry.py +151 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_serialization.py +92 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_severity.py +178 -0
- package/skills/vds-skill/vds-scripts/platform_core/tests/test_stack.py +130 -0
- package/skills/vds-skill/vds-scripts/platform_core/uv.lock +341 -0
- package/skills/vds-skill/vds-scripts/pyproject.toml +145 -0
- package/skills/vds-skill/vds-scripts/pyrightconfig.json +82 -0
- package/skills/vds-skill/vds-scripts/repo-manifest.yaml +380 -0
- package/skills/vds-skill/vds-scripts/repo-manifest.yaml.example +25 -0
- package/skills/vds-skill/vds-scripts/ruff.toml +100 -0
- package/skills/vds-skill/vds-scripts/scripts/BRD-Validation-API.postman_collection.json +706 -0
- package/skills/vds-skill/vds-scripts/scripts/BRD-Validation-README.md +308 -0
- package/skills/vds-skill/vds-scripts/scripts/README.md +271 -0
- package/skills/vds-skill/vds-scripts/scripts/_validate_alias_phase2.py +137 -0
- package/skills/vds-skill/vds-scripts/scripts/audit-cli-patterns.sh +135 -0
- package/skills/vds-skill/vds-scripts/scripts/audit-dashboard.sh +525 -0
- package/skills/vds-skill/vds-scripts/scripts/backup.sh +123 -0
- package/skills/vds-skill/vds-scripts/scripts/bootstrap_uv.sh +69 -0
- package/skills/vds-skill/vds-scripts/scripts/brd-validation-environment.json +51 -0
- package/skills/vds-skill/vds-scripts/scripts/brd-validation-test-results.json +13023 -0
- package/skills/vds-skill/vds-scripts/scripts/brd_coverage_report.json +276 -0
- package/skills/vds-skill/vds-scripts/scripts/check-future-annotations.py +22 -0
- package/skills/vds-skill/vds-scripts/scripts/check-invalid-symlinks.py +183 -0
- package/skills/vds-skill/vds-scripts/scripts/check-no-debug-markers.py +21 -0
- package/skills/vds-skill/vds-scripts/scripts/check-no-unittest.py +21 -0
- package/skills/vds-skill/vds-scripts/scripts/ci/assert_no_openspace_commits.sh +37 -0
- package/skills/vds-skill/vds-scripts/scripts/ci/verify_branch_protection.sh +64 -0
- package/skills/vds-skill/vds-scripts/scripts/closure/phase1_check.sh +483 -0
- package/skills/vds-skill/vds-scripts/scripts/closure/phase2_check.sh +500 -0
- package/skills/vds-skill/vds-scripts/scripts/create_memory_session.py +36 -0
- package/skills/vds-skill/vds-scripts/scripts/deploy-bootstrap.sh +201 -0
- package/skills/vds-skill/vds-scripts/scripts/deployment/load_docker_images_offline.sh +90 -0
- package/skills/vds-skill/vds-scripts/scripts/dev/cli_smoke.sh +259 -0
- package/skills/vds-skill/vds-scripts/scripts/final_completion_report.md +139 -0
- package/skills/vds-skill/vds-scripts/scripts/folder_structure_report.json +321 -0
- package/skills/vds-skill/vds-scripts/scripts/generate_completion_report.py +132 -0
- package/skills/vds-skill/vds-scripts/scripts/generate_intellij_modules.py +154 -0
- package/skills/vds-skill/vds-scripts/scripts/init-pgbouncer-userlist.sh +154 -0
- package/skills/vds-skill/vds-scripts/scripts/link_integrity_report.json +807 -0
- package/skills/vds-skill/vds-scripts/scripts/move_audit_artifact_pages.py +252 -0
- package/skills/vds-skill/vds-scripts/scripts/move_audit_artifact_pages_rest.py +165 -0
- package/skills/vds-skill/vds-scripts/scripts/move_wrong_dept_pages.py +235 -0
- package/skills/vds-skill/vds-scripts/scripts/openspace_bootstrap.sh +56 -0
- package/skills/vds-skill/vds-scripts/scripts/openspace_common.sh +75 -0
- package/skills/vds-skill/vds-scripts/scripts/openspace_doctor.sh +61 -0
- package/skills/vds-skill/vds-scripts/scripts/openspace_sync_shadow.sh +65 -0
- package/skills/vds-skill/vds-scripts/scripts/phase7-baseline.sh +77 -0
- package/skills/vds-skill/vds-scripts/scripts/preflight/env_check.sh +102 -0
- package/skills/vds-skill/vds-scripts/scripts/repair_autopay_reports.sh +173 -0
- package/skills/vds-skill/vds-scripts/scripts/rollback_drill.sh +659 -0
- package/skills/vds-skill/vds-scripts/scripts/run-audit-in-tmux.sh +286 -0
- package/skills/vds-skill/vds-scripts/scripts/run-department-audit.sh +495 -0
- package/skills/vds-skill/vds-scripts/scripts/run-project-audit.sh +267 -0
- package/skills/vds-skill/vds-scripts/scripts/save_intellij_memories.py +112 -0
- package/skills/vds-skill/vds-scripts/scripts/save_memories_to_vds_ai.py +81 -0
- package/skills/vds-skill/vds-scripts/scripts/save_memories_vds_style.py +133 -0
- package/skills/vds-skill/vds-scripts/scripts/search_intellij_memories.py +48 -0
- package/skills/vds-skill/vds-scripts/scripts/setup_intellij_workspace.py +71 -0
- package/skills/vds-skill/vds-scripts/scripts/smoke-test-deploy.sh +137 -0
- package/skills/vds-skill/vds-scripts/scripts/smoke_deploy_lib.py +205 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/README.md +89 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/confluence_sync_coordinator.sh +27 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/coordination.sh +114 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/diagram_coordinator.sh +25 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/docs_root.sh +22 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/generate_diagrams.sh +22 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/markdown_coordinator.sh +25 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/progress_dashboard.sh +17 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/schema_coordinator.sh +25 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/sync_confluence.sh +30 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/update_dependencies.sh +19 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_links.sh +86 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_markdown.sh +52 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_schemas.sh +26 -0
- package/skills/vds-skill/vds-scripts/scripts/target-state-automation/validate_structure.sh +98 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_dockerfile_correctness.py +815 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_makefile_loadouts.py +560 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_smoke_deploy.py +313 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_verify_alembic.py +581 -0
- package/skills/vds-skill/vds-scripts/scripts/tests/test_verify_infra_topology.py +254 -0
- package/skills/vds-skill/vds-scripts/scripts/update_modules_xml.py +194 -0
- package/skills/vds-skill/vds-scripts/scripts/uv-workspace-alignment-verification-2026-03-25.md +128 -0
- package/skills/vds-skill/vds-scripts/scripts/uv-workspace-alignment-verification-2026-04-18.md +100 -0
- package/skills/vds-skill/vds-scripts/scripts/validate-cli-standardization.sh +188 -0
- package/skills/vds-skill/vds-scripts/scripts/validate_brd_coverage.py +197 -0
- package/skills/vds-skill/vds-scripts/scripts/validate_folder_structure.py +234 -0
- package/skills/vds-skill/vds-scripts/scripts/validate_link_integrity.py +274 -0
- package/skills/vds-skill/vds-scripts/scripts/vami017-caller-compat-report.md +62 -0
- package/skills/vds-skill/vds-scripts/scripts/vami017-phase-b-scaffold-notes.md +79 -0
- package/skills/vds-skill/vds-scripts/scripts/vds_sh_helpers.sh +180 -0
- package/skills/vds-skill/vds-scripts/scripts/verification/phase2_portable_paths_ubuntu_docker.sh +26 -0
- package/skills/vds-skill/vds-scripts/scripts/verify-infra-topology.py +868 -0
- package/skills/vds-skill/vds-scripts/scripts/verify-memory-cli-e2e.sh +598 -0
- package/skills/vds-skill/vds-scripts/scripts/verify-worktree-features.sh +306 -0
- package/skills/vds-skill/vds-scripts/scripts/worktree-add.sh +128 -0
- package/skills/vds-skill/vds-scripts/scripts/worktree-remove.sh +112 -0
- package/skills/vds-skill/vds-scripts/scripts/worktree_compose.sh +269 -0
- package/skills/vds-skill/vds-scripts/scripts/worktree_uv.sh +77 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/IMPLEMENTATION_AUDIT.md +376 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/README.md +507 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/pyproject.toml +106 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/scripts/ensure_symlink.sh +38 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/__init__.py +164 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/batch.py +212 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/cli.py +1407 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/client.py +608 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/config.py +260 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/diff.py +220 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/errors.py +34 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/external_sca.py +932 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/portfolio.py +225 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/pr.py +505 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/reports.py +342 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/scanner.py +351 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/webhooks.py +269 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/conftest.py +134 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_batch.py +419 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_config.py +145 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_errors.py +78 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_external_sca.py +466 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_pr.py +471 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_reports.py +511 -0
- package/skills/vds-skill/vds-scripts/sonarqube_orchestrator/tests/test_webhooks.py +660 -0
- package/skills/vds-skill/vds-scripts/uv.lock +5046 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/CHANGELOG.md +36 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/README.md +453 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/docs/PHASE9A_ASSESSMENT.md +50 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/docs/embedding.md +468 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/pyproject.toml +51 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/__init__.py +29 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/__init__.py +26 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/hooks.py +119 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/loop.py +864 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/agents/tools.py +41 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/config.py +252 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/__init__.py +55 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/_cascade.py +143 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/budget.py +353 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/cache.py +373 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/embedding.py +815 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/provider.py +173 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/llm/schemas.py +45 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/__init__.py +77 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/decorators.py +258 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/jsonl_exporter.py +236 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/observability/tracer.py +497 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/profiles.py +2015 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/runtime/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/runtime/agent_id.py +60 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/security/__init__.py +13 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/security/credentials.py +106 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/executor.py +238 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/manager.py +381 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/skills/policy.py +568 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/__init__.py +19 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/langgraph_runner.py +102 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/src/vds_agent_core/workflows/protocols.py +81 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/conftest.py +62 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_audit_loop_hooks_integration.py +135 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_audit_observability_integration.py +246 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/integration/test_public_api_stability.py +91 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_call_site_parallelism.py +30 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_dimension_guardrail.py +25 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_drop_in_provider_extensibility.py +76 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding.py +393 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_cache.py +302 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_extra.py +696 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_embedding_subclass.py +49 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_no_provider_leakage_in_env.py +34 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_provider_auto_route.py +48 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_runtime_log_clean.py +111 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/llm/test_w7_logic_fixes.py +219 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_embedding_block_parser.py +194 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_env_resolver_allowlist.py +141 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_profile_authorization.py +158 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_profiles_w3_extra.py +547 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/profiles/test_real_audit_profile_compat.py +129 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/test_for_agent.py +322 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/runtime/test_w9_cascade_edges.py +369 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/security/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/security/test_credentials.py +132 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agent_loop.py +663 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agent_loop_coverage.py +429 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_agents_hooks_defaults.py +22 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget.py +155 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget_coverage.py +264 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_budget_tracking_only.py +71 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_cache.py +251 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_cache_context.py +62 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_config.py +155 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_langgraph_runner.py +45 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_langgraph_runner_coverage.py +98 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_llm_cache_deep.py +113 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_decorators.py +697 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_hooks.py +217 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_jsonl_exporter.py +542 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_jsonl_wiring.py +313 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_observability_tracer.py +896 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_profiles.py +1571 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_profiles_coverage.py +444 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_provider.py +316 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_schemas.py +63 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_executor.py +297 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_manager.py +370 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_manager_coverage.py +364 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_policy.py +402 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_skill_rubric.py +47 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_tools.py +51 -0
- package/skills/vds-skill/vds-scripts/vds_agent_core/tests/unit/test_workflow_protocols.py +136 -0
- package/skills/vds-skill/vds-scripts/vds_cli/README.md +201 -0
- package/skills/vds-skill/vds-scripts/vds_cli/VERIFICATION_REPORT.md +41 -0
- package/skills/vds-skill/vds-scripts/vds_cli/pyproject.toml +50 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/__init__.py +3 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/assets/git-credential-helper.py +235 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/cli.py +1126 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/commands/__init__.py +1 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/commands/lint_cli.py +389 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/confluence_sync.py +846 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/__init__.py +7 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/funnel.py +105 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/consumption/scanner.py +211 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/freshness/report.py +90 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs/types.py +27 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_cmd.py +672 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_metrics.py +75 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/docs_sync.py +1171 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem/__init__.py +39 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem/report.py +439 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/ecosystem_docs.py +164 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/env.py +111 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/env_git_helper.py +281 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/__init__.py +3 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/google_sheets_orchestrator/google_sheets_orchestrator.py +173 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/router.py +232 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/skills_cmd.py +274 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/sync_api.py +613 -0
- package/skills/vds-skill/vds-scripts/vds_cli/src/vds_cli/sync_service.py +283 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/conftest.py +62 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/test_env_git_helper_lifecycle.py +261 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/test_git_credential_helper.py +240 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/test_router_help_proxy.py +43 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_cli.py +241 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_cli_DOC004.py +110 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_confluence_sync.py +315 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_confluence_sync_wave7.py +375 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_consumption_funnel.py +106 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_consumption_scanner.py +144 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_cmd.py +89 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_cmd_wave8.py +161 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_metrics.py +16 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_quality_score.py +61 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_docs_sync.py +417 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_cli_dashboard.py +667 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_cli_dashboard_rendering.py +143 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_ecosystem_docs.py +63 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_env.py +85 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_freshness_report.py +125 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_lint_cli.py +224 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_router.py +101 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_skills_cmd.py +419 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_sync_api.py +357 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/unit/test_sync_service.py +170 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/conftest.py +51 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_bitbucket_real.py +32 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_confluence_real.py +32 -0
- package/skills/vds-skill/vds-scripts/vds_cli/tests/verification/test_jira_real.py +40 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/README.md +190 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/pyproject.toml +96 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/__init__.py +36 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/app.py +55 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/completers.py +139 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/context.py +201 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/env.py +163 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/errors.py +440 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/output.py +284 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/paths.py +78 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/testing.py +211 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/src/vds_cli_common/version.py +85 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/__init__.py +0 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_app.py +126 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_completers.py +148 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_context.py +192 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_env.py +235 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_errors.py +275 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_output.py +229 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_paths.py +61 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_testing.py +138 -0
- package/skills/vds-skill/vds-scripts/vds_cli_common/tests/test_version.py +64 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/README.md +31 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/pyproject.toml +50 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/__init__.py +26 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/cli.py +246 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/client.py +104 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/config.py +82 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/workflows.json +3 -0
- package/skills/vds-skill/vds-scripts/vidp_orchestrator/src/vds_vidp_orchestrator/workflows.py +130 -0
- package/skills/vds-skill/vds-scripts-skill/.openskills.json +6 -0
- package/skills/vds-skill/vds-scripts-skill/QUALITY.md +44 -0
- package/skills/vds-skill/vds-scripts-skill/SKILL.md +129 -0
- package/skills/vds-skill/vds-scripts-skill/references/audit-commands.md +171 -0
- package/skills/vds-skill/vds-scripts-skill/references/capability-index.md +34 -0
- package/skills/vds-skill/vds-scripts-skill/references/development-commands.md +12 -0
- package/skills/vds-skill/vds-scripts-skill/references/google-sheets.md +71 -0
- package/skills/vds-skill/vds-scripts-skill/references/integration-commands.md +17 -0
- package/skills/vds-skill/vds-scripts-skill/references/platform-bootstrap.md +31 -0
- package/skills/vds-skill/vds-scripts-skill/references/specialist-routing.md +14 -0
- package/skills/vds-skill/vds-scripts-skill/references/validation-commands.md +15 -0
- package/telemetry.defaults.json +7 -0
|
@@ -0,0 +1,2764 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# id: EVAL-HARVESTER | dd_version: v1
|
|
3
|
+
"""
|
|
4
|
+
Evaluation harvester for the NTAPP/BMAD AI-coding workflow.
|
|
5
|
+
|
|
6
|
+
Parses the structured sections that the Stage 1-5 skills already emit
|
|
7
|
+
(Change Log tables, Review Findings checkboxes, Completion Notes DEVIATIONs,
|
|
8
|
+
AC status tags, deferred-work.md bullets, archive/ versions) and produces a
|
|
9
|
+
per-SLICE baseline scorecard for the three evaluation axes:
|
|
10
|
+
|
|
11
|
+
A. Hieu qua (Effectiveness) -> First-Pass Yield, deviation density
|
|
12
|
+
B. Hieu suat (Efficiency) -> rework (archive versions), changelog depth
|
|
13
|
+
C. Defer / CR / Change Log -> defer backlog, avoidability index, AC churn
|
|
14
|
+
|
|
15
|
+
Outputs (single root, per CLAUDE.md):
|
|
16
|
+
NTAPP-output/evaluation/metrics.json (raw machine-readable)
|
|
17
|
+
NTAPP-output/evaluation/scorecard.md (human-readable baseline)
|
|
18
|
+
|
|
19
|
+
Pure stdlib. Run from spec-repo root: python3 scripts/eval-harvester.py
|
|
20
|
+
The numbers are HARVESTED, not authoritative judgement -- parser heuristics
|
|
21
|
+
and their known blind spots are documented in scorecard.md section "Limits".
|
|
22
|
+
|
|
23
|
+
Token-burn engine (gop tu build_token_log.py): real token burn duoc tu gom tu
|
|
24
|
+
session JSONL cua Claude Code -> token-log.json. Khong con file rieng; chay
|
|
25
|
+
`python3 scripts/eval-harvester.py --refresh-burn` de re-harvest burn cache.
|
|
26
|
+
"""
|
|
27
|
+
import datetime
|
|
28
|
+
import json
|
|
29
|
+
import os
|
|
30
|
+
import re
|
|
31
|
+
import statistics
|
|
32
|
+
import sys
|
|
33
|
+
from collections import defaultdict
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
|
|
36
|
+
# Project "current date" for aging math (EFF-8). Bump when re-running on a real clock.
|
|
37
|
+
AS_OF = datetime.date(2026, 6, 11)
|
|
38
|
+
# G2 — ngưỡng độ phủ session-log: phiên phủ ≥ ngần này khoảng git → coi là 'đủ',
|
|
39
|
+
# dưới ngưỡng → burn đánh dấu 'một phần (cận dưới)'.
|
|
40
|
+
COVERAGE_FULL = 0.8
|
|
41
|
+
DEFER_CATEGORY_ORDER = ["contract-blocked", "arch-limit", "asset-gap", "scope-deferred",
|
|
42
|
+
"test-deferred", "cross-slice-dep", "deferred-bug", "security-hardening"]
|
|
43
|
+
|
|
44
|
+
ROOT = Path(__file__).resolve().parent.parent
|
|
45
|
+
# Output root: ưu tiên '_bmad-output' (tên cũ trước commit rename), fallback
|
|
46
|
+
# 'NTAPP-output' (tên mới) để đọc được cả cây dự án đã/chưa migrate. Default
|
|
47
|
+
# '_bmad-output' nếu chưa có thư mục nào (project chưa chạy).
|
|
48
|
+
BMAD_OUT = next((ROOT / n for n in ("_bmad-output", "NTAPP-output") if (ROOT / n).is_dir()),
|
|
49
|
+
ROOT / "_bmad-output")
|
|
50
|
+
S5 = BMAD_OUT / "Stage_5_Build_Verify"
|
|
51
|
+
SLICES_DIR = BMAD_OUT / "Stage_2_Architecture" / "slices"
|
|
52
|
+
DESIGN_DIR = BMAD_OUT / "Stage_4_Design"
|
|
53
|
+
UI_SCHEMA_DIR = DESIGN_DIR / "ui_schema" # drift_report_*.md sống ở đây (G8)
|
|
54
|
+
DD_DIR = DESIGN_DIR / "detailed_design" # *_detailed_design.md (CR table + drift §1.2 — G10)
|
|
55
|
+
DD_ARCHIVE = DD_DIR / "archive"
|
|
56
|
+
OUT_DIR = BMAD_OUT / "evaluation"
|
|
57
|
+
|
|
58
|
+
# --- Cost lens (Bộ C) -------------------------------------------------------
|
|
59
|
+
# Token PROXY: deliverable weight, NOT real LLM burn. ~4 chars/token (rough,
|
|
60
|
+
# language-agnostic). Real burn (input+thinking+retries+re-reads) is typically
|
|
61
|
+
# 5-50x this. Burn nay AUTO-harvest tu session JSONL qua harvest_burn() (engine
|
|
62
|
+
# gop trong chinh file nay) khi token-log.json chua co (hoac --refresh-burn) --
|
|
63
|
+
# xem load_token_log() + section "Token-burn engine" o cuoi file.
|
|
64
|
+
CHARS_PER_TOKEN = 4
|
|
65
|
+
# Mở rộng cho cả FE (TS/JS/Vue/...) lẫn BE (Java/Kotlin/Go/Rust/C#/...) — multi-repo.
|
|
66
|
+
CODE_EXT = re.compile(
|
|
67
|
+
r"\.(ts|tsx|js|jsx|mjs|cjs|css|scss|sass|less|vue|svelte|py"
|
|
68
|
+
r"|java|kt|kts|go|rs|cs|rb|php|scala|swift|c|cc|cpp|cxx|h|hpp|hxx)$")
|
|
69
|
+
# Test-detection: pattern JS (.test./.spec./.cy.) + path/name convention BE.
|
|
70
|
+
TEST_FILE = re.compile(r"\.(test|spec|cy)\.|\.integration\.test\.")
|
|
71
|
+
TEST_NAME = re.compile(r"(Test|Tests|IT|Spec)\.[A-Za-z]+$|_test\.(go|py|rb)$|_spec\.rb$")
|
|
72
|
+
TEST_PATH = re.compile(r"(^|/)(tests?|__tests__|spec|specs)/|/src/test/|(^|/)src/test/")
|
|
73
|
+
# Thư mục build/dep KHÔNG đo (khớp theo segment, kể cả khi lồng trong module con).
|
|
74
|
+
SKIP_DIRS = {"node_modules", "build", "dist", ".pnpm-store", "target", ".gradle",
|
|
75
|
+
"out", "vendor", "__pycache__", ".venv", "venv", ".next", ".nuxt",
|
|
76
|
+
"coverage", "obj"}
|
|
77
|
+
ID_HEADER = re.compile(r"id:\s*([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+)")
|
|
78
|
+
TOKEN_LOG = OUT_DIR / "token-log.json" # real-burn cache (auto-harvested if missing)
|
|
79
|
+
|
|
80
|
+
# --- Claude API pricing (hard reference) ------------------------------------
|
|
81
|
+
# Nguon: Claude API pricing. USD / 1 TRIEU token. Quy uoc chung moi model:
|
|
82
|
+
# cache_write = 1.25x input (5-min TTL); cache_read = 0.1x input.
|
|
83
|
+
# PRICE_PER_MTOK = default/fallback (Opus 4.8) cho model khong nam trong
|
|
84
|
+
# PRICE_BY_MODEL. Chi phi tinh THEO TUNG MODEL qua price_for_model() (session dung
|
|
85
|
+
# ca Opus lan Haiku cho sub-agent → dinh gia phang mot model se lech).
|
|
86
|
+
PRICING_MODEL = "claude-opus-4-8"
|
|
87
|
+
PRICE_PER_MTOK = {
|
|
88
|
+
"input": 5.00, # input_tokens (uncached)
|
|
89
|
+
"cache_write": 6.25, # cache_creation_input_tokens (1.25x, ephemeral 5-min)
|
|
90
|
+
"cache_read": 0.50, # cache_read_input_tokens (0.1x)
|
|
91
|
+
"output": 25.00, # output_tokens
|
|
92
|
+
}
|
|
93
|
+
# Bang gia per-model (input, output tra cuu; cache_write=1.25x, cache_read=0.1x input).
|
|
94
|
+
# Key = base model id (đã bỏ hậu tố [1m]/-YYYYMMDD qua _price_norm).
|
|
95
|
+
PRICE_BY_MODEL = {
|
|
96
|
+
"claude-opus-4-8": {"input": 5.00, "cache_write": 6.25, "cache_read": 0.50, "output": 25.00},
|
|
97
|
+
"claude-opus-4-7": {"input": 5.00, "cache_write": 6.25, "cache_read": 0.50, "output": 25.00},
|
|
98
|
+
"claude-opus-4-6": {"input": 5.00, "cache_write": 6.25, "cache_read": 0.50, "output": 25.00},
|
|
99
|
+
"claude-sonnet-5": {"input": 3.00, "cache_write": 3.75, "cache_read": 0.30, "output": 15.00},
|
|
100
|
+
"claude-sonnet-4-6": {"input": 3.00, "cache_write": 3.75, "cache_read": 0.30, "output": 15.00},
|
|
101
|
+
"claude-sonnet-4-5": {"input": 3.00, "cache_write": 3.75, "cache_read": 0.30, "output": 15.00},
|
|
102
|
+
"claude-haiku-4-5": {"input": 1.00, "cache_write": 1.25, "cache_read": 0.10, "output": 5.00},
|
|
103
|
+
"claude-fable-5": {"input": 10.00, "cache_write": 12.50, "cache_read": 1.00, "output": 50.00},
|
|
104
|
+
"claude-mythos-5": {"input": 10.00, "cache_write": 12.50, "cache_read": 1.00, "output": 50.00},
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _price_norm(mid):
|
|
109
|
+
"""Chuẩn hoá model_id thô → base id để tra PRICE_BY_MODEL (bỏ [1m]/-YYYYMMDD)."""
|
|
110
|
+
base = re.sub(r"\[.*?\]$", "", mid or "")
|
|
111
|
+
return re.sub(r"-\d{8}$", "", base)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def price_for_model(mid):
|
|
115
|
+
"""Bảng giá 4 thành phần cho 1 model; fallback Opus 4.8 nếu model lạ."""
|
|
116
|
+
return PRICE_BY_MODEL.get(_price_norm(mid), PRICE_PER_MTOK)
|
|
117
|
+
|
|
118
|
+
# --- Model display names (model_id thô trong session JSONL → tên gọn) ----------
|
|
119
|
+
MODEL_NAMES = {
|
|
120
|
+
"claude-opus-4-8": "Opus 4.8", "claude-opus-4-7": "Opus 4.7", "claude-opus-4-6": "Opus 4.6",
|
|
121
|
+
"claude-sonnet-5": "Sonnet 5",
|
|
122
|
+
"claude-sonnet-4-6": "Sonnet 4.6", "claude-sonnet-4-5": "Sonnet 4.5",
|
|
123
|
+
"claude-haiku-4-5": "Haiku 4.5", "claude-fable-5": "Fable 5", "claude-mythos-5": "Mythos 5",
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def model_label(mid):
|
|
128
|
+
"""Chuẩn hoá model_id (bỏ hậu tố [1m]/-YYYYMMDD) rồi map sang tên gọn."""
|
|
129
|
+
if not mid:
|
|
130
|
+
return "unknown"
|
|
131
|
+
base = re.sub(r"\[.*?\]$", "", mid) # bỏ '[1m]'
|
|
132
|
+
base = re.sub(r"-\d{8}$", "", base) # bỏ date-suffix
|
|
133
|
+
return MODEL_NAMES.get(base, base)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def merge_models(dicts):
|
|
137
|
+
"""Gộp nhiều dict {model_id:{input,output}} lại (cộng token)."""
|
|
138
|
+
out = {}
|
|
139
|
+
for d in dicts:
|
|
140
|
+
for mid, v in (d or {}).items():
|
|
141
|
+
o = out.setdefault(mid, {"input": 0, "output": 0})
|
|
142
|
+
o["input"] += v.get("input", 0)
|
|
143
|
+
o["output"] += v.get("output", 0)
|
|
144
|
+
return out
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def model_share(by_model):
|
|
148
|
+
"""{model_id: {input, output}} → 'Opus 4.8 (15%), Sonnet 4.6 (85%)' theo token total."""
|
|
149
|
+
if not by_model:
|
|
150
|
+
return "n/a"
|
|
151
|
+
tot = {}
|
|
152
|
+
for mid, v in by_model.items():
|
|
153
|
+
tot[model_label(mid)] = tot.get(model_label(mid), 0) + v.get("input", 0) + v.get("output", 0)
|
|
154
|
+
grand = sum(tot.values())
|
|
155
|
+
if not grand:
|
|
156
|
+
return "n/a"
|
|
157
|
+
items = sorted(tot.items(), key=lambda kv: -kv[1])
|
|
158
|
+
return ", ".join(f"{name} ({round(100 * t / grand)}%)" for name, t in items if t)
|
|
159
|
+
|
|
160
|
+
def read(path):
|
|
161
|
+
return path.read_text(encoding="utf-8") if path.exists() else ""
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def parse_slices():
|
|
165
|
+
"""slice_id -> [unit_id]; also unit_id -> slice_id, plus slice meta (type)."""
|
|
166
|
+
slice_units, unit_slice, slice_meta = {}, {}, {}
|
|
167
|
+
for f in sorted(SLICES_DIR.glob("SLICE-*.md")):
|
|
168
|
+
txt = read(f)
|
|
169
|
+
sid_m = re.search(r"SLICE-(\d+)", f.name)
|
|
170
|
+
sid = f"SLICE-{int(sid_m.group(1))}" if sid_m else f.stem
|
|
171
|
+
units = re.findall(r"-\s*\{\s*id:\s*([A-Z0-9-]+)", txt)
|
|
172
|
+
slice_units[sid] = units
|
|
173
|
+
for u in units:
|
|
174
|
+
unit_slice[u] = sid
|
|
175
|
+
stype = "HITL" if re.search(r"^type:\s*HITL", txt, re.M) else "AFK"
|
|
176
|
+
demo = (re.search(r"demo_status:\s*(\w+)", txt) or [None, "?"])[1]
|
|
177
|
+
slice_meta[sid] = {"type": stype, "demo_status": demo}
|
|
178
|
+
return slice_units, unit_slice, slice_meta
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def section(txt, start_pat, end_pat=r"\n##\s"):
|
|
182
|
+
"""Return text of the section starting at start_pat up to next end_pat."""
|
|
183
|
+
m = re.search(start_pat, txt)
|
|
184
|
+
if not m:
|
|
185
|
+
return ""
|
|
186
|
+
rest = txt[m.end():]
|
|
187
|
+
e = re.search(end_pat, rest)
|
|
188
|
+
return rest[: e.start()] if e else rest
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def count_ac(txt):
|
|
192
|
+
"""AC total + method. Prefer bold headers (**AC-N); fall back qua nhiều style.
|
|
193
|
+
|
|
194
|
+
Thứ tự ưu tiên: bold-header → numbered-bold (WGT) → referenced AC-id →
|
|
195
|
+
plain-list (BE/prose). Nhánh plain-list bắt unit BE liệt kê tiêu chí bằng
|
|
196
|
+
list thường (KHÔNG `**AC-N**`, KHÔNG AC-id) — nếu thiếu nhánh này, unit BE
|
|
197
|
+
trả 0 AC, làm mẫu số FPY lệch nguồn so với tử số `[Review][Patch]` và đẩy
|
|
198
|
+
FPY xuống âm (xem build(): guard `fpy_ac`)."""
|
|
199
|
+
ac_sec = section(txt, r"##\s*Acceptance Criteria")
|
|
200
|
+
bold = set(re.findall(r"\*\*AC-?(\d+)", ac_sec)) # **AC-N —** header style
|
|
201
|
+
numbered = re.findall(r"^\d+\.\s+\*\*", ac_sec, re.M) # N. **Title.** list style (WGT)
|
|
202
|
+
if len(bold) > 1:
|
|
203
|
+
return len(bold), "bold-header"
|
|
204
|
+
if len(numbered) > 1:
|
|
205
|
+
return len(numbered), "numbered-list"
|
|
206
|
+
refs = set(re.findall(r"\bAC-?(\d+)\b", ac_sec))
|
|
207
|
+
if len(refs) > 1:
|
|
208
|
+
return len(refs), "referenced"
|
|
209
|
+
# BE/prose: list thường top-level (không thụt đầu dòng → khỏi đếm sub-bullet
|
|
210
|
+
# giải thích). Lấy max(numbered, bullet) để không cộng dồn 2 kiểu list.
|
|
211
|
+
plain = max(len(re.findall(r"^\d+\.\s+\S", ac_sec, re.M)),
|
|
212
|
+
len(re.findall(r"^[-*]\s+\S", ac_sec, re.M)))
|
|
213
|
+
if plain > 1:
|
|
214
|
+
return plain, "plain-list"
|
|
215
|
+
return (len(refs), "referenced") if refs else (0, "none")
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def count_ac_churn(txt):
|
|
219
|
+
"""AC status changes flagged in the AC callout: [vN] [cancelled] [defer] [vN-caveat].
|
|
220
|
+
`vN` khớp MỌI số phiên ([v2]/[v3]/[v4]/...) — trước đây hardcode 'v3' nên AC
|
|
221
|
+
đổi ở phiên khác bị sót im lặng, làm 'tỉ lệ yêu cầu đổi giữa chừng' hụt."""
|
|
222
|
+
ac_sec = section(txt, r"##\s*Acceptance Criteria")
|
|
223
|
+
tags = re.findall(r"\[(v\d+(?:-caveat)?|cancelled|defer)\]", ac_sec)
|
|
224
|
+
by = defaultdict(int)
|
|
225
|
+
for t in tags:
|
|
226
|
+
by[t] += 1
|
|
227
|
+
return len(tags), dict(by)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def count_deviations(txt):
|
|
231
|
+
"""Explicit 'DEVIATION N' tokens + numbered items under a 'Deviation' labelled
|
|
232
|
+
bullet. DEDUP within-doc: 1 numbered child mang sẵn token `DEVIATION N` thì đã
|
|
233
|
+
nằm trong `explicit` (set theo số) → KHÔNG cộng lần 2. Trước đây
|
|
234
|
+
`len(explicit) + listed` chồng nhau khi story vừa đánh số `DEVIATION N` vừa liệt
|
|
235
|
+
kê chính nó dưới header 'Deviations:' → phồng số lệch."""
|
|
236
|
+
explicit = set(re.findall(r"DEVIATION ?(\d+)", txt, re.I))
|
|
237
|
+
listed_extra = 0
|
|
238
|
+
# find a bullet/line that introduces a deviation list, count its numbered children
|
|
239
|
+
for m in re.finditer(r"Deviations?\b[^\n]*:[^\n]*\n", txt):
|
|
240
|
+
block = txt[m.end():]
|
|
241
|
+
stop = re.search(r"\n#{2,3}\s|\n- \*\*[^D]", block) # next section or next top bullet
|
|
242
|
+
block = block[: stop.start()] if stop else block
|
|
243
|
+
for ln in re.findall(r"^\s+\d+\.\s+\*\*.*$", block, re.M):
|
|
244
|
+
# child có token `DEVIATION N` → đã đếm ở `explicit`; chỉ child KHÔNG
|
|
245
|
+
# mang token mới là deviation chưa được đếm.
|
|
246
|
+
if not re.search(r"DEVIATION ?\d+", ln, re.I):
|
|
247
|
+
listed_extra += 1
|
|
248
|
+
return len(explicit) + listed_extra
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def count_findings(txt):
|
|
252
|
+
return (len(re.findall(r"\[Review\]\[Patch\]", txt)),
|
|
253
|
+
len(re.findall(r"\[Review\]\[Defer\]", txt)))
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
# ── Phân loại patch cho F-FPY (Functional First-Pass Yield) ──────────────────
|
|
257
|
+
# Mục tiêu chỉ số: "tính năng chạy ĐÚNG SPEC sau lần code đầu từ spec+design".
|
|
258
|
+
# CHỈ lỗi chức năng (luồng chính / AC sai) mới trừ điểm. Lỗi bảo mật, edge-case,
|
|
259
|
+
# chất lượng/convention = feature VẪN chạy, chỉ cần gia cố → KHÔNG trừ F-FPY.
|
|
260
|
+
#
|
|
261
|
+
# Anchor: 3 layer review của `/bmad-code-review` map gần 1:1 với phân loại này —
|
|
262
|
+
# Acceptance Auditor → đúng AC/chức năng (TÍNH vào F-FPY)
|
|
263
|
+
# Edge Case Hunter → biên/hiếm (loại)
|
|
264
|
+
# Blind Hunter → adversarial/bảo mật (loại)
|
|
265
|
+
# Patch corpus tự gắn tag lăng kính `(auditor)` / `(blind+edge)` / ... ở cuối bullet.
|
|
266
|
+
_HUNTER_PAREN = re.compile(r"\(([^)]*\b(?:blind|edge|auditor|acceptance)\b[^)]*)\)", re.I)
|
|
267
|
+
# T2 fallback (story KHÔNG tag — 6/17 story HUB rơi vào đây): lexicon nội dung.
|
|
268
|
+
_AC_REF = re.compile(r"\bAC-?\d+\b")
|
|
269
|
+
_FUNC_VERB = re.compile(
|
|
270
|
+
r"\b(sai|thiếu|lệch\s*DD|broken|wrong|incorrect|missing|mismatch|fails?\b|"
|
|
271
|
+
r"does\s*n.?t|returns?\s+(?:wrong|null|sai))\b"
|
|
272
|
+
r"|không\s+(?:trả|chạy|đúng|match|khớp|hoạt động)"
|
|
273
|
+
r"|chưa\s+(?:đúng|implement|trả|chạy)", re.I)
|
|
274
|
+
_SEC = re.compile(
|
|
275
|
+
r"\b(password|token|auth|inject|mask(?:ing|ed)?|vault|signature|secret|TLS|"
|
|
276
|
+
r"SSRF|XSS|CSRF|leak|sanitiz|escap|defen[cs]e[- ]in[- ]depth|hardening|poison)\b", re.I)
|
|
277
|
+
_EDGE = re.compile(
|
|
278
|
+
r"\b(edge|boundary|biên|race|concurren|overflow|null[- ]?check|empty|rỗng|"
|
|
279
|
+
r"hiếm|rare|DLQ|retry|backoff|timeout|idempoten)\b", re.I)
|
|
280
|
+
_QUAL = re.compile(
|
|
281
|
+
r"\b(convention|naming|lint|refactor|dead\s*code|log[- ]?level|style|"
|
|
282
|
+
r"observability|gauge|metric|magic\s*number|đặt\s*tên)\b", re.I)
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def _excl_class(text):
|
|
286
|
+
"""Lớp của 1 patch bị loại khỏi F-FPY, ưu tiên bảo mật > edge > chất lượng."""
|
|
287
|
+
if _SEC.search(text):
|
|
288
|
+
return "security"
|
|
289
|
+
if _EDGE.search(text):
|
|
290
|
+
return "edge"
|
|
291
|
+
if _QUAL.search(text):
|
|
292
|
+
return "quality"
|
|
293
|
+
return None
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def classify_patch(text):
|
|
297
|
+
"""Phân loại 1 patch review → (bucket, method, klass).
|
|
298
|
+
|
|
299
|
+
bucket: 'functional' = Acceptance Auditor / luồng AC hỏng → TÍNH vào F-FPY
|
|
300
|
+
'excluded' = bảo mật / edge / chất lượng → feature vẫn chạy, chỉ gia cố
|
|
301
|
+
'unclassified' = không đủ tín hiệu → KHÔNG ngầm tính clean, report riêng
|
|
302
|
+
method: 'tag' (lăng kính review — tin cao) > 'inferred' (lexicon) > 'unclassified'
|
|
303
|
+
klass : với 'excluded' = 'security'|'edge'|'quality'; còn lại None."""
|
|
304
|
+
tags = _HUNTER_PAREN.findall(text)
|
|
305
|
+
if tags:
|
|
306
|
+
joined = " ".join(tags).lower()
|
|
307
|
+
if re.search(r"\b(auditor|acceptance)\b", joined):
|
|
308
|
+
return "functional", "tag", None
|
|
309
|
+
return "excluded", "tag", (_excl_class(text) or ("edge" if "edge" in joined else "security"))
|
|
310
|
+
# T2 — không tag: dẫn AC-id + động từ hỏng chức năng ⇒ functional
|
|
311
|
+
if _AC_REF.search(text) and _FUNC_VERB.search(text):
|
|
312
|
+
return "functional", "inferred", None
|
|
313
|
+
klass = _excl_class(text)
|
|
314
|
+
if klass:
|
|
315
|
+
return "excluded", "inferred", klass
|
|
316
|
+
return "unclassified", "unclassified", None
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def parse_patches(txt):
|
|
320
|
+
"""Trích từng bullet `[Review][Patch]` (gồm dòng wrap) để classify. Marker chỉ
|
|
321
|
+
xuất hiện ở checklist Patch — Change Log narrative ghi 'N patch' nên không lẫn."""
|
|
322
|
+
out = []
|
|
323
|
+
for m in re.finditer(r"\[Review\]\[Patch\]", txt):
|
|
324
|
+
seg = txt[m.end():]
|
|
325
|
+
stop = re.search(r"\n\s*[-*]\s|\n#{1,6}\s|\n\s*\n", seg) # bullet/heading/blank kế tiếp
|
|
326
|
+
out.append(seg[: stop.start()] if stop else seg[:400])
|
|
327
|
+
return out
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def classify_unit_patches(txt):
|
|
331
|
+
"""Gộp classify mọi patch của 1 unit → dict đếm + method trội + breakdown lớp loại."""
|
|
332
|
+
func = excl = uncl = 0
|
|
333
|
+
excl_by = defaultdict(int)
|
|
334
|
+
methods = set()
|
|
335
|
+
for p in parse_patches(txt):
|
|
336
|
+
bucket, method, klass = classify_patch(p)
|
|
337
|
+
methods.add(method)
|
|
338
|
+
if bucket == "functional":
|
|
339
|
+
func += 1
|
|
340
|
+
elif bucket == "excluded":
|
|
341
|
+
excl += 1
|
|
342
|
+
excl_by[klass] += 1
|
|
343
|
+
else:
|
|
344
|
+
uncl += 1
|
|
345
|
+
# method trội phục vụ cờ độ tin: 'tag' (story có tag) > 'inferred' > 'none'
|
|
346
|
+
pm = "tag" if "tag" in methods else ("inferred" if "inferred" in methods else "none")
|
|
347
|
+
return {
|
|
348
|
+
"functional_patch": func,
|
|
349
|
+
"patch_excluded": excl,
|
|
350
|
+
"patch_unclassified": uncl,
|
|
351
|
+
"patch_excluded_by": dict(excl_by),
|
|
352
|
+
"patch_class_method": pm,
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def count_changelog(txt):
|
|
357
|
+
"""Số lần CẬP NHẬT sau khi tạo unit = (số dòng Change Log có ngày) − 1.
|
|
358
|
+
Dòng đầu tiên = dòng khai sinh (tạo story / scaffold), không tính là 'thay đổi'.
|
|
359
|
+
Clamp max(0, …) để unit thiếu Change Log không ra số âm. Lưu ý heuristic: giả
|
|
360
|
+
định dòng-1 luôn là dòng tạo; nếu Change Log bắt đầu giữa chừng sẽ hụt 1."""
|
|
361
|
+
# end_pat chặn ở `##` HOẶC `###` kế tiếp: Change Log thường là `###`, mặc định
|
|
362
|
+
# `\n##\s` không dừng ở `###` sau nó → đọc lố sang section khác có bảng `| 20xx-`.
|
|
363
|
+
sec = section(txt, r"#{2,3}\s*Change Log", end_pat=r"\n#{2,3}\s")
|
|
364
|
+
rows = len(re.findall(r"^\|\s*20\d{2}-", sec, re.M))
|
|
365
|
+
return max(0, rows - 1)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def find_unit_story(unit_id):
|
|
369
|
+
"""Định vị file story Stage 5 của unit_id, KHOAN DUNG khi AI ảo giác và tự
|
|
370
|
+
chèn tiền tố lạ vào tên file (vd `STORY-SCR-FOO.md`, `1.2-SCR-FOO.md`,
|
|
371
|
+
`slice3_MPF-01.md`). Tìm theo unit_id trước, rồi mới nới regex:
|
|
372
|
+
|
|
373
|
+
1. Khớp đúng: S5/{unit_id}.md (canonical — skill emit chuẩn)
|
|
374
|
+
2. Khớp đuôi: S5/*.md có stem KẾT THÚC bằng {unit_id} tại token boundary
|
|
375
|
+
(AI thêm prefix nhưng giữ nguyên unit_id ở cuối)
|
|
376
|
+
3. Khớp giữa: S5/*.md có stem CHỨA {unit_id} giữa 2 token boundary
|
|
377
|
+
(unit_id bị kẹp giữa prefix lẫn suffix lạ)
|
|
378
|
+
|
|
379
|
+
Trả về Path (kể cả khi không tồn tại) để caller vẫn read() bình thường."""
|
|
380
|
+
exact = S5 / f"{unit_id}.md"
|
|
381
|
+
if exact.exists() or not S5.is_dir():
|
|
382
|
+
return exact
|
|
383
|
+
uid = re.escape(unit_id)
|
|
384
|
+
suffix_re = re.compile(rf"(?:^|[^A-Za-z0-9]){uid}$") # ...-{uid}
|
|
385
|
+
embed_re = re.compile(rf"(?:^|[^A-Za-z0-9]){uid}(?:[^A-Za-z0-9]|$)") # ...{uid}...
|
|
386
|
+
suffix_hits, embed_hits = [], []
|
|
387
|
+
for f in sorted(S5.glob("*.md")):
|
|
388
|
+
if f.stem == unit_id: # phòng race với check exact ở trên
|
|
389
|
+
return f
|
|
390
|
+
if suffix_re.search(f.stem):
|
|
391
|
+
suffix_hits.append(f)
|
|
392
|
+
elif embed_re.search(f.stem):
|
|
393
|
+
embed_hits.append(f)
|
|
394
|
+
pool = suffix_hits or embed_hits
|
|
395
|
+
if pool:
|
|
396
|
+
# stem ngắn nhất = ít rác ảo giác bao quanh unit_id thật nhất
|
|
397
|
+
best = min(pool, key=lambda p: len(p.stem))
|
|
398
|
+
print(f"[eval-harvester] story '{unit_id}' khớp mờ qua tên file "
|
|
399
|
+
f"'{best.name}' (đã khoan dung tiền tố ảo giác)")
|
|
400
|
+
return best
|
|
401
|
+
return exact
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
def parse_unit(unit_id):
|
|
405
|
+
txt = read(find_unit_story(unit_id))
|
|
406
|
+
if not txt:
|
|
407
|
+
return None
|
|
408
|
+
ac, ac_method = count_ac(txt)
|
|
409
|
+
churn, churn_by = count_ac_churn(txt)
|
|
410
|
+
patch, rdefer = count_findings(txt)
|
|
411
|
+
rec = {
|
|
412
|
+
"unit": unit_id,
|
|
413
|
+
"ac_total": ac,
|
|
414
|
+
"ac_count_method": ac_method,
|
|
415
|
+
"ac_churn": churn,
|
|
416
|
+
"ac_churn_by": churn_by,
|
|
417
|
+
"deviations": count_deviations(txt),
|
|
418
|
+
"review_patch": patch,
|
|
419
|
+
"review_defer": rdefer,
|
|
420
|
+
"changelog_rows": count_changelog(txt),
|
|
421
|
+
}
|
|
422
|
+
rec.update(classify_unit_patches(txt)) # F-FPY: tách patch chức năng vs gia cố
|
|
423
|
+
return rec
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def _parse_date(s):
|
|
427
|
+
if not s:
|
|
428
|
+
return None
|
|
429
|
+
m = re.match(r"(\d{4})-(\d{2})-(\d{2})", s)
|
|
430
|
+
return datetime.date(int(m.group(1)), int(m.group(2)), int(m.group(3))) if m else None
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def parse_defers(unit_slice):
|
|
434
|
+
"""Parse the defer-ledger từ `deferred-work.md`. Đọc HAI format (G1 —
|
|
435
|
+
xem NTAPP_Evaluation/harvester_upgrade.md):
|
|
436
|
+
|
|
437
|
+
1. Block giàu trường `### DEF-<ID> — title` + opened/status/category/
|
|
438
|
+
avoidable/... → record đầy đủ (`source='ledger'`). Chuẩn lý tưởng,
|
|
439
|
+
hiện chưa skill nào phát.
|
|
440
|
+
2. Bullet `- [x] [Review][Defer] <title> [file:line] — reason` dưới heading
|
|
441
|
+
`## Deferred from: <nguồn> (<date>)` — ĐÂY là format `bmad-code-review`
|
|
442
|
+
đang phát. Sinh record NHẸ (`source='bullet'`, avoidable=None vì thiếu
|
|
443
|
+
trường) qua _parse_defer_bullets(). Trước G1 các bullet này bị bỏ qua
|
|
444
|
+
hoàn toàn → defer_count=0 dù review sinh defer.
|
|
445
|
+
|
|
446
|
+
Consumer-only: harvester đọc hiểu artifact skill phát, KHÔNG sửa skill."""
|
|
447
|
+
txt = read(S5 / "deferred-work.md")
|
|
448
|
+
defers = []
|
|
449
|
+
for chunk in txt.split("\n### ")[1:]:
|
|
450
|
+
first, _, body = chunk.partition("\n")
|
|
451
|
+
h = re.match(r"(DEF-[A-Z0-9-]+)\s*[—-]+\s*(.*)", first)
|
|
452
|
+
if not h:
|
|
453
|
+
continue
|
|
454
|
+
did, title = h.group(1), h.group(2).strip()
|
|
455
|
+
|
|
456
|
+
def field(key, default=None):
|
|
457
|
+
m = re.search(rf"\b{key}:\s*([^\n·]+)", body)
|
|
458
|
+
return m.group(1).strip() if m else default
|
|
459
|
+
|
|
460
|
+
opened = _parse_date(field("opened"))
|
|
461
|
+
closed = _parse_date(field("closed"))
|
|
462
|
+
status = (field("status", "open") or "open").lower()
|
|
463
|
+
age_days = ((closed or AS_OF) - opened).days if opened else None
|
|
464
|
+
defers.append({
|
|
465
|
+
"id": did,
|
|
466
|
+
"title": title,
|
|
467
|
+
"slice": field("slice") or unit_slice.get((field("unit") or "").strip()),
|
|
468
|
+
"unit": field("unit"),
|
|
469
|
+
"owner": field("owner"),
|
|
470
|
+
"category": field("category", "uncategorized"),
|
|
471
|
+
"avoidable": (field("avoidable", "no") or "no").lower() == "yes",
|
|
472
|
+
"severity": field("severity"),
|
|
473
|
+
"status": status,
|
|
474
|
+
"opened": opened.isoformat() if opened else None,
|
|
475
|
+
"closed": closed.isoformat() if closed else None,
|
|
476
|
+
"age_days": age_days,
|
|
477
|
+
"blocking_condition": field("blocking-condition"),
|
|
478
|
+
"target_reentry": field("target-reentry"),
|
|
479
|
+
"excludable_by": _norm_excludable(field("excludable-by")),
|
|
480
|
+
"source": "ledger",
|
|
481
|
+
})
|
|
482
|
+
defers.extend(_parse_defer_bullets(txt, unit_slice))
|
|
483
|
+
return defers
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def _parse_defer_bullets(txt, unit_slice):
|
|
487
|
+
"""Format bullet mà bmad-code-review phát (G1). Heading
|
|
488
|
+
`## Deferred from: <nguồn> (<date>)` + bullet `[Review][Defer]`. Record NHẸ:
|
|
489
|
+
thiếu category/avoidable nên để consumer ĐO ĐƯỢC capture-rate, nhưng KHÔNG
|
|
490
|
+
đưa vào mẫu số avoidability (`avoidable=None`) — không suy diễn bừa."""
|
|
491
|
+
records = []
|
|
492
|
+
units = sorted((u for u in unit_slice if u), key=len, reverse=True) # khớp dài trước
|
|
493
|
+
for part in re.split(r"\n##\s+Deferred from:\s*", txt)[1:]:
|
|
494
|
+
head, _, body = part.partition("\n")
|
|
495
|
+
dm = re.search(r"\((\d{4}-\d{2}-\d{2})\)", head)
|
|
496
|
+
opened = _parse_date(dm.group(1)) if dm else None
|
|
497
|
+
unit = next((u for u in units if u in head), None) # nguồn chứa unit_id đã biết?
|
|
498
|
+
sid = unit_slice.get(unit) if unit else None
|
|
499
|
+
seq = 0
|
|
500
|
+
for line in body.splitlines():
|
|
501
|
+
if line.startswith("## "): # sang section khác cùng cấp → dừng
|
|
502
|
+
break
|
|
503
|
+
if "[Review][Defer]" not in line:
|
|
504
|
+
continue
|
|
505
|
+
seq += 1
|
|
506
|
+
title = re.sub(r"^[\s>*-]*\[[ xX]\]\s*\[Review\]\[Defer\]\s*", "", line).strip()
|
|
507
|
+
records.append({
|
|
508
|
+
# 'rev' = phân biệt với DEF-<ID> block giàu, tránh trùng id.
|
|
509
|
+
"id": f"DEF-{(unit or 'REVIEW')}-rev{seq}",
|
|
510
|
+
"title": title[:120],
|
|
511
|
+
"slice": sid,
|
|
512
|
+
"unit": unit,
|
|
513
|
+
"owner": None,
|
|
514
|
+
"category": "uncategorized",
|
|
515
|
+
"avoidable": None, # unknown — loại khỏi mẫu số EFF-7
|
|
516
|
+
"severity": None,
|
|
517
|
+
"status": "open", # defer = nợ đang mở
|
|
518
|
+
"opened": opened.isoformat() if opened else None,
|
|
519
|
+
"closed": None,
|
|
520
|
+
"age_days": ((AS_OF - opened).days if opened else None),
|
|
521
|
+
"blocking_condition": None,
|
|
522
|
+
"target_reentry": None,
|
|
523
|
+
"excludable_by": None,
|
|
524
|
+
"source": "bullet",
|
|
525
|
+
})
|
|
526
|
+
return records
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
def _norm_excludable(v):
|
|
530
|
+
"""Normalise excludable-by; treat dash/empty as scattered (no single-action close)."""
|
|
531
|
+
if not v or v.strip() in {"—", "-", "none", "n/a"}:
|
|
532
|
+
return None
|
|
533
|
+
return v.strip()
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
def cluster_defers(defers):
|
|
537
|
+
"""Group OPEN defers by excludable-by action. Returns sorted list of clusters."""
|
|
538
|
+
by = defaultdict(lambda: {"count": 0, "avoidable": 0, "slices": set(), "ids": []})
|
|
539
|
+
scattered = {"count": 0, "avoidable": 0, "slices": set(), "ids": []}
|
|
540
|
+
for d in defers:
|
|
541
|
+
if d["status"] == "closed":
|
|
542
|
+
continue
|
|
543
|
+
bucket = by[d["excludable_by"]] if d["excludable_by"] else scattered
|
|
544
|
+
bucket["count"] += 1
|
|
545
|
+
bucket["avoidable"] += 1 if d["avoidable"] else 0
|
|
546
|
+
bucket["slices"].add(d["slice"])
|
|
547
|
+
bucket["ids"].append(d["id"])
|
|
548
|
+
out = [{"action": k, **v, "slices": sorted(v["slices"])} for k, v in by.items()]
|
|
549
|
+
out.sort(key=lambda c: (-c["count"], c["action"]))
|
|
550
|
+
scat = {"action": "— (rải rác)", **scattered, "slices": sorted(scattered["slices"])}
|
|
551
|
+
return out, scat
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
# ============================================================================
|
|
555
|
+
# Drift gate L3↔L2 (G8) — đọc drift_report_*.md ở Stage_4_Design/ui_schema.
|
|
556
|
+
# Đo số lệch thiết-kế(L3) ↔ hợp-đồng-dữ-liệu(L2) BẮT ĐƯỢC ở cổng thiết kế trước
|
|
557
|
+
# khi vào code. Format thực tế biến thiên: item dạng `### Item N`, `### NB-N`,
|
|
558
|
+
# `- **Item N**`; section `## [BLOCKING]/[NON-BLOCKING]/[RECONCILED]` (có thể kèm
|
|
559
|
+
# hậu tố `— RECONCILED`); section rỗng ghi `(none …)`. Mỗi unit có thể có 2 file
|
|
560
|
+
# (flat `drift_report_<ID>.md` + nested `<ID>/drift_report.md`, re-run) → dedup
|
|
561
|
+
# theo ngày mới nhất. Đây là heuristic đếm — không phải phán xử.
|
|
562
|
+
# ============================================================================
|
|
563
|
+
DRIFT_ITEM_RE = re.compile(r"^[ \t]*(?:#{3,4}[ \t]+|[-*][ \t]+\*\*)(?:Item\b|NB-|N\d+\b)[^\n]*", re.M)
|
|
564
|
+
DRIFT_H2_RE = re.compile(r"^##\s+(.*)$", re.M)
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
def _drift_unit_from_path(p):
|
|
568
|
+
if p.name == "drift_report.md":
|
|
569
|
+
return p.parent.name
|
|
570
|
+
m = re.match(r"drift_report_(.+)\.md$", p.name)
|
|
571
|
+
return m.group(1) if m else p.stem
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
def _drift_date(txt):
|
|
575
|
+
head = "\n".join(txt.splitlines()[:14]) # header blockquote
|
|
576
|
+
m = re.search(r"\b(20\d{2}-\d{2}-\d{2})\b", head)
|
|
577
|
+
return m.group(1) if m else None
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
def _drift_item_key(text):
|
|
581
|
+
"""ID phân biệt của 1 drift item từ dòng tiêu đề (`Item 3` / `NB-2` / `N4`).
|
|
582
|
+
Giữ NGUYÊN loại (item/nb/n) để `NB-2` ≠ `Item 2`. None nếu không bắt được số →
|
|
583
|
+
item không định danh, KHÔNG dedup được (đếm thô như cũ)."""
|
|
584
|
+
m = re.search(r"\bItem\s*(\d+)\b|\bNB-?(\d+)\b|\bN(\d+)\b", text, re.I)
|
|
585
|
+
if not m:
|
|
586
|
+
return None
|
|
587
|
+
if m.group(1):
|
|
588
|
+
return "item" + m.group(1)
|
|
589
|
+
if m.group(2):
|
|
590
|
+
return "nb" + m.group(2)
|
|
591
|
+
return "n" + m.group(3)
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
def _drift_section_items(body):
|
|
595
|
+
"""(active_ids, recon_ids, active_idless, recon_idless) của 1 section. `*_ids` =
|
|
596
|
+
list ID drift item (để dedup xuyên section ở `_parse_one_drift`); `*_idless` = số
|
|
597
|
+
item KHÔNG định danh (đếm thô). '(none' → rỗng, nhưng vớt được số trong câu
|
|
598
|
+
'… N (historic) items reconciled' (prose-only re-run) để khỏi hụt im lặng."""
|
|
599
|
+
for line in body.splitlines():
|
|
600
|
+
s = line.strip()
|
|
601
|
+
if not s or s.startswith(">"):
|
|
602
|
+
continue
|
|
603
|
+
if s.lower().startswith("(none"):
|
|
604
|
+
pm = re.search(r"(\d+)\s+(?:historic\s+)?items?\s+reconciled", body, re.I)
|
|
605
|
+
return [], [], 0, (int(pm.group(1)) if pm else 0)
|
|
606
|
+
break
|
|
607
|
+
a_ids, r_ids, a_idless, r_idless = [], [], 0, 0
|
|
608
|
+
for m in DRIFT_ITEM_RE.finditer(body):
|
|
609
|
+
key = _drift_item_key(m.group(0))
|
|
610
|
+
if "RECONCILED" in m.group(0).upper():
|
|
611
|
+
r_ids.append(key) if key else None
|
|
612
|
+
r_idless += 0 if key else 1
|
|
613
|
+
else:
|
|
614
|
+
a_ids.append(key) if key else None
|
|
615
|
+
a_idless += 0 if key else 1
|
|
616
|
+
return a_ids, r_ids, a_idless, r_idless
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
# Precedence khi 1 item-id xuất hiện ở nhiều section: trạng thái "mới/đã giải quyết
|
|
620
|
+
# hơn" thắng — reconciled > blocking > nonblocking. Tránh đếm 1 item cả ở BLOCKING
|
|
621
|
+
# lẫn RECONCILED (lifecycle move) thành 2.
|
|
622
|
+
_DRIFT_PREC = {"nonblocking": 0, "blocking": 1, "reconciled": 2}
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
def _parse_one_drift(txt, unit):
|
|
626
|
+
rec = {"unit": unit, "date": _drift_date(txt),
|
|
627
|
+
"blocking": 0, "reconciled": 0, "nonblocking": 0,
|
|
628
|
+
"gate_outcome": None, "res_l2": 0, "res_l3": 0}
|
|
629
|
+
item_bucket = {} # id → bucket cuối (dedup xuyên section)
|
|
630
|
+
idless = {"blocking": 0, "reconciled": 0, "nonblocking": 0}
|
|
631
|
+
|
|
632
|
+
def assign(key, bucket):
|
|
633
|
+
cur = item_bucket.get(key)
|
|
634
|
+
if cur is None or _DRIFT_PREC[bucket] > _DRIFT_PREC[cur]:
|
|
635
|
+
item_bucket[key] = bucket
|
|
636
|
+
|
|
637
|
+
heads = list(DRIFT_H2_RE.finditer(txt))
|
|
638
|
+
for i, m in enumerate(heads):
|
|
639
|
+
tm = re.match(r"\[(BLOCKING|NON-BLOCKING|RECONCILED)\]", m.group(1))
|
|
640
|
+
if not tm:
|
|
641
|
+
continue
|
|
642
|
+
tag = tm.group(1)
|
|
643
|
+
sec_reconciled = "RECONCILED" in m.group(1).upper()
|
|
644
|
+
end = heads[i + 1].start() if i + 1 < len(heads) else len(txt)
|
|
645
|
+
a_ids, r_ids, a_idless, r_idless = _drift_section_items(txt[m.end():end])
|
|
646
|
+
if tag == "NON-BLOCKING":
|
|
647
|
+
for k in a_ids + r_ids:
|
|
648
|
+
assign(k, "nonblocking")
|
|
649
|
+
idless["nonblocking"] += a_idless + r_idless
|
|
650
|
+
elif tag == "RECONCILED":
|
|
651
|
+
for k in a_ids + r_ids:
|
|
652
|
+
assign(k, "reconciled")
|
|
653
|
+
idless["reconciled"] += a_idless + r_idless
|
|
654
|
+
else: # BLOCKING (có thể đã reconciled qua hậu tố section hoặc per-item)
|
|
655
|
+
if sec_reconciled:
|
|
656
|
+
for k in a_ids + r_ids:
|
|
657
|
+
assign(k, "reconciled")
|
|
658
|
+
idless["reconciled"] += a_idless + r_idless
|
|
659
|
+
else:
|
|
660
|
+
for k in a_ids:
|
|
661
|
+
assign(k, "blocking")
|
|
662
|
+
for k in r_ids:
|
|
663
|
+
assign(k, "reconciled")
|
|
664
|
+
idless["blocking"] += a_idless
|
|
665
|
+
idless["reconciled"] += r_idless
|
|
666
|
+
for b in item_bucket.values(): # mỗi item-id chỉ tính 1 lần
|
|
667
|
+
rec[b] += 1
|
|
668
|
+
for b, n in idless.items():
|
|
669
|
+
rec[b] += n
|
|
670
|
+
rec["res_l2"] = len(re.findall(r"\[L2\]|update L2", txt, re.I))
|
|
671
|
+
rec["res_l3"] = len(re.findall(r"\[L3\]|update L3", txt, re.I))
|
|
672
|
+
# Cổng = đọc RIÊNG dòng Verdict/Outcome (fallback Status) — không quét cả doc,
|
|
673
|
+
# vì 'HALT' hay xuất hiện khi mô tả lần chạy TRƯỚC → false positive.
|
|
674
|
+
vm = re.search(r"(?im)^\s*>?\s*\*\*(?:Verdict|Outcome)\b[^\n]*", txt) \
|
|
675
|
+
or re.search(r"(?im)^\s*>?\s*\*\*Status:[^\n]*", txt)
|
|
676
|
+
vline = vm.group(0).upper() if vm else ""
|
|
677
|
+
if "HALT" in vline:
|
|
678
|
+
rec["gate_outcome"] = "halted"
|
|
679
|
+
elif re.search(r"NO BLOCKING|PASS|PROCEED|RESOLVED|UNBLOCK", vline):
|
|
680
|
+
rec["gate_outcome"] = "proceeded"
|
|
681
|
+
else:
|
|
682
|
+
rec["gate_outcome"] = "halted" if rec["blocking"] else "proceeded"
|
|
683
|
+
return rec
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
def parse_drift_reports(ui_dir=None):
|
|
687
|
+
"""Đọc mọi drift_report ở Stage_4_Design/ui_schema → đếm BLOCKING/RECONCILED/
|
|
688
|
+
NON-BLOCKING bắt ở cổng thiết kế (G8). Dedup 2 file/unit theo ngày mới nhất
|
|
689
|
+
(tie → bản nested re-run thắng)."""
|
|
690
|
+
d = ui_dir or UI_SCHEMA_DIR
|
|
691
|
+
out = {"available": False, "reports": 0, "blocking": 0, "reconciled": 0,
|
|
692
|
+
"nonblocking": 0, "halted": 0, "res_l2": 0, "res_l3": 0, "by_unit": {}}
|
|
693
|
+
if not d.exists():
|
|
694
|
+
return out
|
|
695
|
+
files = sorted(d.glob("drift_report_*.md")) + sorted(d.glob("*/drift_report.md"))
|
|
696
|
+
if not files:
|
|
697
|
+
return out
|
|
698
|
+
best = {} # unit -> (sortkey, record)
|
|
699
|
+
for f in files:
|
|
700
|
+
txt = read(f)
|
|
701
|
+
if not txt:
|
|
702
|
+
continue
|
|
703
|
+
unit = _drift_unit_from_path(f)
|
|
704
|
+
rec = _parse_one_drift(txt, unit)
|
|
705
|
+
key = (rec["date"] or "", 1 if f.name == "drift_report.md" else 0)
|
|
706
|
+
if unit not in best or key > best[unit][0]:
|
|
707
|
+
best[unit] = (key, rec)
|
|
708
|
+
out["available"] = True
|
|
709
|
+
out["reports"] = len(best)
|
|
710
|
+
for unit, (_, rec) in sorted(best.items()):
|
|
711
|
+
out["by_unit"][unit] = rec
|
|
712
|
+
for k in ("blocking", "reconciled", "nonblocking", "res_l2", "res_l3"):
|
|
713
|
+
out[k] += rec[k]
|
|
714
|
+
out["halted"] += 1 if rec["gate_outcome"] == "halted" else 0
|
|
715
|
+
return out
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
def parse_rework():
|
|
719
|
+
"""unit -> archived DD versions (current = archived + 1)."""
|
|
720
|
+
rework = defaultdict(int)
|
|
721
|
+
for f in DD_ARCHIVE.glob("*_detailed_design_v*.md"):
|
|
722
|
+
m = re.match(r"(.+)_detailed_design_v(\d+)", f.name)
|
|
723
|
+
if m:
|
|
724
|
+
rework[m.group(1)] = max(rework[m.group(1)], int(m.group(2)))
|
|
725
|
+
return dict(rework)
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
# ============================================================================
|
|
729
|
+
# CR & drift trong Detailed Design L3 (G10) — đọc detailed_design/*_detailed_design.md.
|
|
730
|
+
# DD chứa 3 khối tín hiệu mà trước đây harvester KHÔNG đọc (chỉ cân token-proxy):
|
|
731
|
+
# 1. `## BẢNG LỊCH SỬ THAY ĐỔI` — bảng CR/change-history (cột Link CR/Jira, A/M/D,
|
|
732
|
+
# Phiên bản). count_changelog cũ khớp 'Change Log' tiếng Anh + chỉ chạy trên
|
|
733
|
+
# story Stage-5 → bảng này vô hình.
|
|
734
|
+
# 2. `### 1.2 Drift resolution log` — bảng D1..Dn (L3↔TechSpec). Khác hẳn G8
|
|
735
|
+
# (G8 = drift UI L3↔L2 schema ở ui_schema/drift_report). Với feature BE
|
|
736
|
+
# (id_type=feature_id, không UI) KHÔNG có drift_report → §1.2 là NGUỒN DRIFT
|
|
737
|
+
# DUY NHẤT. Bổ khuyết điểm mù drift BE.
|
|
738
|
+
# 3. `[TBD-confirm]` / `[TBD…]` — quyết định thiết kế treo (defer ở tầng thiết kế).
|
|
739
|
+
# Heuristic đếm theo cấu trúc bảng markdown — không phải phán xử. Bù trục C
|
|
740
|
+
# (Defer / CR / Change Log) vốn chỉ đọc từ Stage-5.
|
|
741
|
+
# ============================================================================
|
|
742
|
+
def _md_table(block):
|
|
743
|
+
"""(headers, rows) của bảng markdown đầu tiên trong block. headers = list cell
|
|
744
|
+
dòng tiêu đề; rows = list[list cell] data. Bỏ separator (:---); dừng ở dòng
|
|
745
|
+
đầu tiên KHÔNG bắt đầu '|' sau khi bảng đã mở."""
|
|
746
|
+
cells_rows, started = [], False
|
|
747
|
+
for ln in block.splitlines():
|
|
748
|
+
s = ln.strip()
|
|
749
|
+
if not s.startswith("|"):
|
|
750
|
+
if started:
|
|
751
|
+
break
|
|
752
|
+
continue
|
|
753
|
+
started = True
|
|
754
|
+
if re.fullmatch(r"[:\-\s|]+", s): # dòng separator
|
|
755
|
+
continue
|
|
756
|
+
cells_rows.append([c.strip() for c in s.strip("|").split("|")])
|
|
757
|
+
if not cells_rows:
|
|
758
|
+
return [], []
|
|
759
|
+
return cells_rows[0], cells_rows[1:]
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
def _col_idx(headers, *keywords):
|
|
763
|
+
"""Index cột đầu tiên có header chứa 1 trong keywords (lower-case substring)."""
|
|
764
|
+
for i, h in enumerate(headers):
|
|
765
|
+
hl = h.lower()
|
|
766
|
+
if any(k in hl for k in keywords):
|
|
767
|
+
return i
|
|
768
|
+
return None
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
# Ticket CR/Jira THẬT: token `CR-123`/`CR 123`, hoặc URL Jira/Atlassian/`/browse/`.
|
|
772
|
+
# Cố ý KHÔNG nhận: `[TBD]`, story-ref ('E3 Story 3.2'), tên file, prose, URL bất kỳ
|
|
773
|
+
# (staging/schema URL lẫn trong mô tả), và KHÔNG nhận `[A-Z]{2,}-\d+` vì đụng chính
|
|
774
|
+
# WBS-ID (`HUB-12`/`PMT-EXT-01`). Tác giả DD điền cột "Link CR/Jira" rất tùy tiện nên
|
|
775
|
+
# 'có chữ' ≠ 'có CR ngoài' — pattern chặt để cr_ticketed không bị thổi. Vẫn portable:
|
|
776
|
+
# project thật sự dùng Jira (link `/browse/PROJ-123`) vẫn bắt được.
|
|
777
|
+
DD_TICKET_RE = re.compile(r"\bCR[-\s]?\d+\b|https?://\S*(?:jira|atlassian|/browse/)", re.I)
|
|
778
|
+
|
|
779
|
+
|
|
780
|
+
# G11 — tombstone (DD của feature bị XÓA theo CR): header `dd_version: v*-removed`
|
|
781
|
+
# hoặc banner `🚫 REMOVED` ở đầu file. Đây KHÔNG phải deliverable sống → tách khỏi
|
|
782
|
+
# mẫu số DD, drift/CR/TBD; surface riêng thành tín hiệu trục-C scope-removal. Quét
|
|
783
|
+
# 800 ký tự đầu (header + banner). Bắt kèm CR-id để quy nhóm. Consumer-only: harvester
|
|
784
|
+
# nhận diện format skill ĐÃ emit (`-removed` + `🚫 REMOVED`), không sửa skill gốc.
|
|
785
|
+
DD_REMOVED_RE = re.compile(
|
|
786
|
+
r"dd_version:\s*v[\w.]*-removed|🚫\s*\*{0,2}\s*REMOVED\b|—\s*REMOVED\s*$", re.I | re.M)
|
|
787
|
+
DD_REMOVED_CR_RE = re.compile(r"\bCR-[A-Z0-9][A-Z0-9-]*\b")
|
|
788
|
+
|
|
789
|
+
|
|
790
|
+
def _dd_removed_info(txt):
|
|
791
|
+
"""Nếu DD là tombstone (feature bị xóa theo CR) → {removed: True, cr, date}; ngược
|
|
792
|
+
lại {removed: False}. Chỉ soi 800 ký tự đầu (header + banner XÓA)."""
|
|
793
|
+
head = txt[:800]
|
|
794
|
+
if not DD_REMOVED_RE.search(head):
|
|
795
|
+
return {"removed": False}
|
|
796
|
+
crm = DD_REMOVED_CR_RE.search(head)
|
|
797
|
+
dm = re.search(r"REMOVED\s+(\d{4}-\d{2}-\d{2})", head)
|
|
798
|
+
return {"removed": True, "cr": crm.group(0) if crm else None,
|
|
799
|
+
"date": dm.group(1) if dm else None}
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
def _dd_cr_table(txt):
|
|
803
|
+
"""Bảng `## BẢNG LỊCH SỬ THAY ĐỔI` → cr_total (= số lần sửa DD, tín hiệu chính),
|
|
804
|
+
cr_ticketed (số dòng có link CR/Jira NGOÀI chính thức — strict), A/M/D, version,
|
|
805
|
+
D-id tham chiếu. Map cột theo tên tiêu đề (chịu được DD đổi thứ tự cột)."""
|
|
806
|
+
block = section(txt, r"##\s*BẢNG LỊCH SỬ THAY ĐỔI", end_pat=r"\n##\s")
|
|
807
|
+
headers, rows = _md_table(block)
|
|
808
|
+
if not rows:
|
|
809
|
+
return None
|
|
810
|
+
i_type = _col_idx(headers, "a*", "a, m", "m, d") # cột A/M/D
|
|
811
|
+
i_cr = _col_idx(headers, "cr", "jira")
|
|
812
|
+
i_ver = _col_idx(headers, "phiên bản", "version")
|
|
813
|
+
i_desc = _col_idx(headers, "mô tả")
|
|
814
|
+
by_type, versions, drift_refs = defaultdict(int), set(), set()
|
|
815
|
+
total = ticketed = 0
|
|
816
|
+
for r in rows:
|
|
817
|
+
total += 1
|
|
818
|
+
if i_cr is not None and i_cr < len(r) and DD_TICKET_RE.search(r[i_cr]):
|
|
819
|
+
ticketed += 1
|
|
820
|
+
if i_type is not None and i_type < len(r):
|
|
821
|
+
for t in re.findall(r"\b([AMD])\b", r[i_type]):
|
|
822
|
+
by_type[t] += 1
|
|
823
|
+
if i_ver is not None and i_ver < len(r):
|
|
824
|
+
vm = re.search(r"v\d+(?:\.\d+)*", r[i_ver])
|
|
825
|
+
if vm:
|
|
826
|
+
versions.add(vm.group(0))
|
|
827
|
+
if i_desc is not None and i_desc < len(r):
|
|
828
|
+
for d in re.findall(r"\bD\d+\b", r[i_desc]):
|
|
829
|
+
drift_refs.add(d)
|
|
830
|
+
return {"cr_total": total, "cr_ticketed": ticketed,
|
|
831
|
+
"by_type": dict(by_type), "versions": versions, "drift_refs": drift_refs}
|
|
832
|
+
|
|
833
|
+
|
|
834
|
+
# --- G10 drift: per-unit VERDICT, KHÔNG đếm per-item `Dn` ---------------------
|
|
835
|
+
# Validate trên 13 file có section drift cho thấy ID drift đa convention
|
|
836
|
+
# (`Dn` / `drift-N` / `D-DRIFT-N` / `DW-<unit>-N` / chỉ nêu prose) và status nằm ở
|
|
837
|
+
# cấp section/verdict CHỨ KHÔNG per-row → đếm `Dn` ra số sai (HUB-18 từng bị chấm
|
|
838
|
+
# 4/4-open trong khi file ghi "ĐÃ RESOLVED"; HUB-07 bị bỏ sót vì `D-DRIFT-1`≠`Dn`).
|
|
839
|
+
# Thay bằng phân 3 bucket: resolved (mọi finding đã LAND — kể cả fix tại
|
|
840
|
+
# L2/Module-0/WBS) / flags (≥1 finding còn treo: [TBD], 'cần upstream resolve',
|
|
841
|
+
# build trên mock, finding-row thiếu ✅) / none (section có nhưng không drift finding).
|
|
842
|
+
DRIFT_KEEP = re.compile(r"drift|inheritance\s+compliance|phát hiện (trước|cần)|đối soát l2", re.I)
|
|
843
|
+
DRIFT_SKIP = re.compile(r"đối soát (fe-be|logic|chất lượng|vết)|traceability", re.I)
|
|
844
|
+
DRIFT_DEDICATED = re.compile(r"drift\s+(resolution|notes|register|flags|&|và)", re.I)
|
|
845
|
+
FINDING_ID = re.compile(r"\b(?:drift[-\s]?\d+|D-DRIFT-\d+|DW-[A-Z0-9]+-\d+)\b", re.I)
|
|
846
|
+
BARE_DN = re.compile(r"\bD\d+\b")
|
|
847
|
+
RESOLVED_MARK = re.compile(
|
|
848
|
+
r"✅|\bRESOLVED\b|đã đóng|đã chốt|\bDone\b|không còn blocked|zero (internal )?drift", re.I)
|
|
849
|
+
PENDING_MARK = re.compile(
|
|
850
|
+
r"\[TBD|cần\s+upstream|cần[^\n]{0,12}resolve|chưa (resolve|fix|đóng|chốt)|"
|
|
851
|
+
r"build[^\n]{0,6}mock|carried|logged[^\n]{0,8}non-?block|không block release|"
|
|
852
|
+
r"ghi nhận[^\n]{0,14}không block|pass-?with-?flags|với mock", re.I)
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
def _dd_drift_status(txt):
|
|
856
|
+
"""Phân loại verdict drift L3↔TechSpec của 1 DD → {verdict, findings, open}.
|
|
857
|
+
verdict ∈ {resolved, flags, none}. Anchor vào section drift/inheritance (loại
|
|
858
|
+
P1-P4 QA-sync), đếm finding-row mang ID drift (bare `Dn` chỉ trong bảng drift
|
|
859
|
+
chuyên dụng → tránh false-positive `Dn`=cột-DB), chấm resolved theo marker
|
|
860
|
+
✅/RESOLVED/Done ở row, fallback theo marker của heading section."""
|
|
861
|
+
heads = [(m.start(), m.end(), m.group(1))
|
|
862
|
+
for m in re.finditer(r"(?im)^#{2,4}\s+(.*)$", txt)]
|
|
863
|
+
saw_section = saw_resolved_heading = False
|
|
864
|
+
res_map, pend_map = {}, {} # finding-id (lower) → đã-thấy-resolved / đã-thấy-pending
|
|
865
|
+
for i, (s, e, title) in enumerate(heads):
|
|
866
|
+
if not DRIFT_KEEP.search(title) or DRIFT_SKIP.search(title):
|
|
867
|
+
continue
|
|
868
|
+
saw_section = True
|
|
869
|
+
nxt = heads[i + 1][0] if i + 1 < len(heads) else len(txt)
|
|
870
|
+
body = txt[e:nxt]
|
|
871
|
+
dedicated = bool(DRIFT_DEDICATED.search(title))
|
|
872
|
+
h_res = bool(RESOLVED_MARK.search(title))
|
|
873
|
+
h_pend = bool(PENDING_MARK.search(title))
|
|
874
|
+
default_open = h_pend and not h_res
|
|
875
|
+
if h_res:
|
|
876
|
+
saw_resolved_heading = True
|
|
877
|
+
for ln in body.splitlines():
|
|
878
|
+
ls = ln.strip()
|
|
879
|
+
is_bullet = bool(re.match(r"[-*]\s*\**\[?(?:drift|DW-|D-DRIFT)", ls, re.I)) \
|
|
880
|
+
and FINDING_ID.search(ls)
|
|
881
|
+
is_row = ls.startswith("|") and not re.fullmatch(r"[:\-\s|]+", ls)
|
|
882
|
+
if not (is_bullet or is_row):
|
|
883
|
+
continue
|
|
884
|
+
fid = FINDING_ID.search(ls)
|
|
885
|
+
if fid:
|
|
886
|
+
key = re.sub(r"[\s-]", "", fid.group(0).lower())
|
|
887
|
+
elif is_row and dedicated and BARE_DN.search(ls):
|
|
888
|
+
key = BARE_DN.search(ls).group(0).lower()
|
|
889
|
+
else:
|
|
890
|
+
continue
|
|
891
|
+
r = bool(RESOLVED_MARK.search(ls))
|
|
892
|
+
# resolved-marker THẮNG pending cùng dòng: '✅ RESOLVED … không còn [TBD]'
|
|
893
|
+
# là tác giả xác nhận đóng, không phải còn treo.
|
|
894
|
+
p = bool(PENDING_MARK.search(ls)) and not r
|
|
895
|
+
if not r and not p: # row trung tính → kế thừa marker heading section
|
|
896
|
+
r, p = h_res, default_open
|
|
897
|
+
res_map[key] = res_map.get(key, False) or r
|
|
898
|
+
pend_map[key] = pend_map.get(key, False) or p
|
|
899
|
+
if not saw_section:
|
|
900
|
+
return {"verdict": "none", "findings": 0, "open": 0}
|
|
901
|
+
findings = [(res_map[k] and not pend_map[k]) for k in res_map]
|
|
902
|
+
if not findings:
|
|
903
|
+
return {"verdict": "resolved" if saw_resolved_heading else "none",
|
|
904
|
+
"findings": 0, "open": 0}
|
|
905
|
+
open_ = sum(1 for ok in findings if not ok)
|
|
906
|
+
return {"verdict": "flags" if open_ else "resolved",
|
|
907
|
+
"findings": len(findings), "open": open_}
|
|
908
|
+
|
|
909
|
+
|
|
910
|
+
def _dd_count_tbd(txt):
|
|
911
|
+
"""Đếm marker `[TBD…]` còn treo. BỎ mention bị phủ định — DD hay viết 'không
|
|
912
|
+
còn [TBD]', '0 [TBD]', 'Gỡ toàn bộ [TBD]', 'Ghi nhận 3 [TBD]' (lịch sử đã đóng),
|
|
913
|
+
hay tiêu đề 'Trạng thái [TBD]'; đếm thô thổi số quyết-định-treo (HUB-16 báo 12,
|
|
914
|
+
thực tế 0). Quét cả prefix (phủ định trước) lẫn suffix gần (status sau)."""
|
|
915
|
+
NEG = re.compile(
|
|
916
|
+
r"không còn|đã gỡ|gỡ bỏ|gỡ toàn bộ|đã chốt|resolved|đã xử lý|"
|
|
917
|
+
r"\b0\s*[`'\"]*$|ghi nhận\s+\d+\s*[`'\"]*$|trạng thái\s*[`'\"]*$", re.I)
|
|
918
|
+
# DEDUP within-doc: cùng 1 quyết định treo CÓ payload phân biệt (vd
|
|
919
|
+
# `[TBD-confirm: latency budget]`, `[TBD-PUSH-03]`) nhắc lại nhiều chỗ → đếm 1.
|
|
920
|
+
# KHÔNG dedup marker generic (`[TBD]`, `[TBD-confirm]`) vì nhiều quyết định khác
|
|
921
|
+
# nhau cùng viết generic → gộp lại sẽ HỤT số (over-dedup).
|
|
922
|
+
GENERIC = {"[tbd]", "[tbd-confirm]", "[tbd confirm]"}
|
|
923
|
+
seen = set()
|
|
924
|
+
n = 0
|
|
925
|
+
for m in re.finditer(r"\[TBD[^\]]*\]", txt):
|
|
926
|
+
pre = txt[max(0, m.start() - 30):m.start()]
|
|
927
|
+
post = txt[m.end():m.end() + 24].lower()
|
|
928
|
+
if NEG.search(pre):
|
|
929
|
+
continue
|
|
930
|
+
if re.search(r"đã (chốt|đóng|resolve|xử lý)|resolved|→\s*\S", post):
|
|
931
|
+
continue
|
|
932
|
+
key = re.sub(r"\s+", "", m.group(0).lower())
|
|
933
|
+
if key not in GENERIC: # có payload → lặp lại = cùng 1 TBD
|
|
934
|
+
if key in seen:
|
|
935
|
+
continue
|
|
936
|
+
seen.add(key)
|
|
937
|
+
n += 1
|
|
938
|
+
return n
|
|
939
|
+
|
|
940
|
+
|
|
941
|
+
def parse_dd_reports(dd_dir=None):
|
|
942
|
+
"""Đọc mọi detailed_design/*_detailed_design.md (KHÔNG đệ quy → bỏ archive/ +
|
|
943
|
+
feature_design_parts/) → CR + drift L3↔TechSpec + TBD (G10)."""
|
|
944
|
+
d = dd_dir or DD_DIR
|
|
945
|
+
out = {"available": False, "files": 0,
|
|
946
|
+
"cr_total": 0, "cr_ticketed": 0, "by_type": {},
|
|
947
|
+
"verdict_counts": {"resolved": 0, "flags": 0, "none": 0},
|
|
948
|
+
"flagged_units": [], "findings_open": 0,
|
|
949
|
+
"tbd_confirm": 0, "by_unit": {},
|
|
950
|
+
"removed_units": [], "removed_by_cr": {}}
|
|
951
|
+
if not d.exists():
|
|
952
|
+
return out
|
|
953
|
+
files = sorted(d.glob("*_detailed_design.md"))
|
|
954
|
+
if not files:
|
|
955
|
+
return out
|
|
956
|
+
by_type = defaultdict(int)
|
|
957
|
+
for f in files:
|
|
958
|
+
txt = read(f)
|
|
959
|
+
if not txt:
|
|
960
|
+
continue
|
|
961
|
+
um = re.match(r"(.+)_detailed_design\.md$", f.name)
|
|
962
|
+
unit = um.group(1) if um else f.stem
|
|
963
|
+
rmv = _dd_removed_info(txt)
|
|
964
|
+
if rmv["removed"]:
|
|
965
|
+
# Tombstone: KHÔNG vào mẫu số DD / drift / CR / TBD. Gom riêng trục-C.
|
|
966
|
+
out["removed_units"].append(unit)
|
|
967
|
+
cr_key = rmv["cr"] or "(CR không rõ)"
|
|
968
|
+
out["removed_by_cr"].setdefault(cr_key, []).append(unit)
|
|
969
|
+
out["by_unit"][unit] = {"version": "removed", "cr_total": 0,
|
|
970
|
+
"cr_ticketed": 0, "drift_verdict": "removed",
|
|
971
|
+
"drift_findings": 0, "drift_open": 0, "tbd": 0,
|
|
972
|
+
"removed": True, "removed_cr": rmv["cr"],
|
|
973
|
+
"removed_date": rmv["date"]}
|
|
974
|
+
continue
|
|
975
|
+
cr = _dd_cr_table(txt)
|
|
976
|
+
dr = _dd_drift_status(txt)
|
|
977
|
+
tbd = _dd_count_tbd(txt)
|
|
978
|
+
rec = {"version": None, "cr_total": 0, "cr_ticketed": 0,
|
|
979
|
+
"drift_verdict": dr["verdict"], "drift_findings": dr["findings"],
|
|
980
|
+
"drift_open": dr["open"], "tbd": tbd}
|
|
981
|
+
if cr:
|
|
982
|
+
rec.update(cr_total=cr["cr_total"], cr_ticketed=cr["cr_ticketed"],
|
|
983
|
+
version=(sorted(cr["versions"])[-1] if cr["versions"] else None))
|
|
984
|
+
out["cr_total"] += cr["cr_total"]
|
|
985
|
+
out["cr_ticketed"] += cr["cr_ticketed"]
|
|
986
|
+
for t, n in cr["by_type"].items():
|
|
987
|
+
by_type[t] += n
|
|
988
|
+
out["verdict_counts"][dr["verdict"]] += 1
|
|
989
|
+
if dr["verdict"] == "flags":
|
|
990
|
+
out["flagged_units"].append(unit)
|
|
991
|
+
out["findings_open"] += dr["open"]
|
|
992
|
+
out["tbd_confirm"] += tbd
|
|
993
|
+
out["by_unit"][unit] = rec
|
|
994
|
+
out["available"] = True
|
|
995
|
+
# Mẫu số DD = chỉ deliverable sống (loại tombstone). by_unit vẫn giữ tombstone
|
|
996
|
+
# (đánh dấu removed) để render bảng nhưng KHÔNG tính vào "files".
|
|
997
|
+
out["files"] = len(out["by_unit"]) - len(out["removed_units"])
|
|
998
|
+
out["by_type"] = dict(by_type)
|
|
999
|
+
return out
|
|
1000
|
+
|
|
1001
|
+
|
|
1002
|
+
def est_tokens(text):
|
|
1003
|
+
"""Deliverable-weight proxy. NOT real LLM burn — see module header."""
|
|
1004
|
+
return len(text) / CHARS_PER_TOKEN
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
# Marker file nhận diện code repo — FE (package.json) + BE đa ngôn ngữ.
|
|
1008
|
+
REPO_MARKERS = ("package.json", "pom.xml", "build.gradle", "build.gradle.kts",
|
|
1009
|
+
"settings.gradle", "settings.gradle.kts", "go.mod", "Cargo.toml",
|
|
1010
|
+
"build.sbt", "composer.json", "pyproject.toml", "requirements.txt",
|
|
1011
|
+
"*.csproj", "*.sln")
|
|
1012
|
+
|
|
1013
|
+
|
|
1014
|
+
def _looks_like_code_repo(d):
|
|
1015
|
+
"""True nếu d có marker của 1 code repo (FE hoặc BE). Bỏ qua spec/meta repo."""
|
|
1016
|
+
for marker in REPO_MARKERS:
|
|
1017
|
+
if "*" in marker:
|
|
1018
|
+
if any(d.glob(marker)):
|
|
1019
|
+
return True
|
|
1020
|
+
elif (d / marker).exists():
|
|
1021
|
+
return True
|
|
1022
|
+
return False
|
|
1023
|
+
|
|
1024
|
+
|
|
1025
|
+
def resolve_code_roots():
|
|
1026
|
+
"""Danh sách code repo. Override qua EVAL_CODE_ROOT (1 hoặc nhiều path, ngăn bằng
|
|
1027
|
+
os.pathsep ':' hoặc ','). Mặc định: quét sibling của spec repo, nhận mọi thư mục
|
|
1028
|
+
có marker (package.json / pom.xml / build.gradle / go.mod / Cargo.toml / ...) →
|
|
1029
|
+
hỗ trợ multi-repo + backend Java/Kotlin/Go trong cùng workspace."""
|
|
1030
|
+
env = os.environ.get("EVAL_CODE_ROOT")
|
|
1031
|
+
if env:
|
|
1032
|
+
roots = []
|
|
1033
|
+
for part in re.split(r"[%s,]" % re.escape(os.pathsep), env):
|
|
1034
|
+
part = part.strip()
|
|
1035
|
+
if not part:
|
|
1036
|
+
continue
|
|
1037
|
+
p = Path(part).expanduser()
|
|
1038
|
+
if p.is_dir():
|
|
1039
|
+
roots.append(p)
|
|
1040
|
+
return roots
|
|
1041
|
+
roots = []
|
|
1042
|
+
for d in sorted(ROOT.parent.iterdir()):
|
|
1043
|
+
if d.resolve() == ROOT or not d.is_dir():
|
|
1044
|
+
continue
|
|
1045
|
+
if _looks_like_code_repo(d):
|
|
1046
|
+
roots.append(d)
|
|
1047
|
+
return roots
|
|
1048
|
+
|
|
1049
|
+
|
|
1050
|
+
def _classify_artifact(rel):
|
|
1051
|
+
"""rel = posix path under NTAPP-output → (bucket, archived) or None to skip."""
|
|
1052
|
+
if rel.startswith("evaluation/"):
|
|
1053
|
+
return None # don't measure our own outputs
|
|
1054
|
+
archived = "/archive/" in rel or "/_v" in rel
|
|
1055
|
+
head = rel.split("/", 1)[0]
|
|
1056
|
+
bucket = {
|
|
1057
|
+
"Stage_1_Discovery": "discovery",
|
|
1058
|
+
"Stage_2_Architecture": "architecture",
|
|
1059
|
+
"Stage_3_Specs": "spec",
|
|
1060
|
+
"Stage_4_Design": "design",
|
|
1061
|
+
"design-system": "design_system",
|
|
1062
|
+
}.get(head)
|
|
1063
|
+
if head == "Stage_5_Build_Verify":
|
|
1064
|
+
bucket = "test_audit" if ("/atdd/" in rel or "test-artifacts" in rel
|
|
1065
|
+
or "test-framework" in rel) else "build_review"
|
|
1066
|
+
return (bucket, archived) if bucket else None
|
|
1067
|
+
|
|
1068
|
+
|
|
1069
|
+
def harvest_artifact_tokens():
|
|
1070
|
+
"""Token-proxy weight per artifact bucket, split current vs archived (rework)."""
|
|
1071
|
+
buckets = defaultdict(lambda: {"files": 0, "tokens": 0.0,
|
|
1072
|
+
"arch_files": 0, "arch_tokens": 0.0})
|
|
1073
|
+
for f in BMAD_OUT.rglob("*"):
|
|
1074
|
+
if not f.is_file() or f.suffix not in (".md", ".json"):
|
|
1075
|
+
continue
|
|
1076
|
+
rel = f.relative_to(BMAD_OUT).as_posix()
|
|
1077
|
+
c = _classify_artifact(rel)
|
|
1078
|
+
if not c:
|
|
1079
|
+
continue
|
|
1080
|
+
bucket, archived = c
|
|
1081
|
+
tok = est_tokens(read(f))
|
|
1082
|
+
b = buckets[bucket]
|
|
1083
|
+
if archived:
|
|
1084
|
+
b["arch_files"] += 1
|
|
1085
|
+
b["arch_tokens"] += tok
|
|
1086
|
+
else:
|
|
1087
|
+
b["files"] += 1
|
|
1088
|
+
b["tokens"] += tok
|
|
1089
|
+
return {k: dict(v) for k, v in buckets.items()}
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
def _unit_for_name(name, units_by_len):
|
|
1093
|
+
"""First (longest) workflow unit id appearing in a filename."""
|
|
1094
|
+
for u in units_by_len:
|
|
1095
|
+
if u in name:
|
|
1096
|
+
return u
|
|
1097
|
+
return None
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
def _skip_path(rel):
|
|
1101
|
+
"""True nếu rel nằm trong thư mục build/dep (khớp segment, kể cả lồng module con)."""
|
|
1102
|
+
return any(seg in SKIP_DIRS for seg in rel.split("/")[:-1])
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
def _is_test(rel, name):
|
|
1106
|
+
"""Test code? — pattern JS (.test/.spec/.cy) + convention BE (src/test/, *Test.java,
|
|
1107
|
+
*_test.go, tests/...)."""
|
|
1108
|
+
return bool(TEST_FILE.search(name) or TEST_NAME.search(name) or TEST_PATH.search(rel))
|
|
1109
|
+
|
|
1110
|
+
|
|
1111
|
+
def harvest_code_tokens(unit_slice):
|
|
1112
|
+
"""Walk các code repo; attribute tagged files (id: header) to prod/test + slice.
|
|
1113
|
+
|
|
1114
|
+
Hỗ trợ multi-repo (FE + BE Java/Kotlin/Go/...): gộp số liệu qua mọi code root."""
|
|
1115
|
+
roots = resolve_code_roots()
|
|
1116
|
+
out = {"code_roots": [str(r) for r in roots],
|
|
1117
|
+
"prod": {"files": 0, "tokens": 0.0}, "test": {"files": 0, "tokens": 0.0},
|
|
1118
|
+
"by_slice": defaultdict(lambda: {"prod": 0.0, "test": 0.0}),
|
|
1119
|
+
"untagged_tests": {"files": 0, "tokens": 0.0}}
|
|
1120
|
+
if not roots:
|
|
1121
|
+
out["by_slice"] = {}
|
|
1122
|
+
return out
|
|
1123
|
+
for code_root in roots:
|
|
1124
|
+
for f in code_root.rglob("*"):
|
|
1125
|
+
if not f.is_file() or not CODE_EXT.search(f.name):
|
|
1126
|
+
continue
|
|
1127
|
+
rel = f.relative_to(code_root).as_posix()
|
|
1128
|
+
if _skip_path(rel):
|
|
1129
|
+
continue
|
|
1130
|
+
txt = read(f)
|
|
1131
|
+
m = ID_HEADER.search(txt[:600])
|
|
1132
|
+
is_test = _is_test(rel, f.name)
|
|
1133
|
+
if not m:
|
|
1134
|
+
# untagged test code (e.g. e2e, src/test) — counted separately, not attributed
|
|
1135
|
+
if is_test:
|
|
1136
|
+
out["untagged_tests"]["files"] += 1
|
|
1137
|
+
out["untagged_tests"]["tokens"] += est_tokens(txt)
|
|
1138
|
+
continue
|
|
1139
|
+
uid = m.group(1)
|
|
1140
|
+
tok = est_tokens(txt)
|
|
1141
|
+
kind = "test" if is_test else "prod"
|
|
1142
|
+
out[kind]["files"] += 1
|
|
1143
|
+
out[kind]["tokens"] += tok
|
|
1144
|
+
sid = unit_slice.get(uid, "(unmapped)")
|
|
1145
|
+
out["by_slice"][sid][kind] += tok
|
|
1146
|
+
out["by_slice"] = {k: dict(v) for k, v in out["by_slice"].items()}
|
|
1147
|
+
return out
|
|
1148
|
+
|
|
1149
|
+
|
|
1150
|
+
def _loc(txt):
|
|
1151
|
+
"""Dòng code (LOC) thô: đếm \\n, +1 nếu file không kết thúc bằng newline."""
|
|
1152
|
+
if not txt:
|
|
1153
|
+
return 0
|
|
1154
|
+
return txt.count("\n") + (0 if txt.endswith("\n") else 1)
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
def _current_code_index(code_root, unit_slice):
|
|
1158
|
+
"""rel-path → {kind: prod|test, slice, loc} cho file code đang nằm trên đĩa.
|
|
1159
|
+
|
|
1160
|
+
Dùng để (a) phân loại churn theo path và (b) lấy LOC sống-sót làm mẫu số
|
|
1161
|
+
EFFY-3b. Cùng quy ước attribution với harvest_code_tokens (header id:)."""
|
|
1162
|
+
idx = {}
|
|
1163
|
+
if not code_root:
|
|
1164
|
+
return idx
|
|
1165
|
+
for f in code_root.rglob("*"):
|
|
1166
|
+
if not f.is_file() or not CODE_EXT.search(f.name):
|
|
1167
|
+
continue
|
|
1168
|
+
rel = f.relative_to(code_root).as_posix()
|
|
1169
|
+
if _skip_path(rel):
|
|
1170
|
+
continue
|
|
1171
|
+
txt = read(f)
|
|
1172
|
+
m = ID_HEADER.search(txt[:600])
|
|
1173
|
+
is_test = _is_test(rel, f.name)
|
|
1174
|
+
loc = _loc(txt)
|
|
1175
|
+
if not m:
|
|
1176
|
+
if is_test:
|
|
1177
|
+
idx[rel] = {"kind": "test", "slice": None, "loc": loc}
|
|
1178
|
+
continue
|
|
1179
|
+
idx[rel] = {"kind": "test" if is_test else "prod",
|
|
1180
|
+
"slice": unit_slice.get(m.group(1), "(unmapped)"), "loc": loc}
|
|
1181
|
+
return idx
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
def harvest_code_churn(unit_slice):
|
|
1185
|
+
"""LOC committed (added/deleted) qua git history của code repo → EFFY-3b.
|
|
1186
|
+
|
|
1187
|
+
Số TUYỆT ĐỐI added/deleted là base data; churn_ratio = Σ(added+deleted) prod
|
|
1188
|
+
÷ LOC prod sống-sót (=net) là chỉ số phái sinh (1.0 = mọi dòng viết ra đều
|
|
1189
|
+
sống; >1 = viết-rồi-xoá-rồi-viết-lại, code thrash). KHÔNG phụ thuộc timestamp
|
|
1190
|
+
nên đo được ngay (🟢) dù mọi mốc Change Log đều giả."""
|
|
1191
|
+
import subprocess
|
|
1192
|
+
roots = resolve_code_roots()
|
|
1193
|
+
out = {"available": False, "code_roots": [str(r) for r in roots],
|
|
1194
|
+
"commits": 0,
|
|
1195
|
+
"prod": {"added": 0, "deleted": 0, "net_loc": 0, "churn_ratio": None},
|
|
1196
|
+
"test": {"added": 0, "deleted": 0},
|
|
1197
|
+
"other": {"added": 0, "deleted": 0},
|
|
1198
|
+
"by_slice": {}}
|
|
1199
|
+
if not roots:
|
|
1200
|
+
return out
|
|
1201
|
+
by_slice = defaultdict(lambda: {"added": 0, "deleted": 0})
|
|
1202
|
+
for code_root in roots:
|
|
1203
|
+
idx = _current_code_index(code_root, unit_slice)
|
|
1204
|
+
out["prod"]["net_loc"] += sum(v["loc"] for v in idx.values()
|
|
1205
|
+
if v["kind"] == "prod")
|
|
1206
|
+
try:
|
|
1207
|
+
res = subprocess.run(
|
|
1208
|
+
["git", "-C", str(code_root), "log", "--numstat", "--format=tformat:__C__"],
|
|
1209
|
+
capture_output=True, text=True, timeout=60)
|
|
1210
|
+
except (OSError, subprocess.SubprocessError):
|
|
1211
|
+
continue
|
|
1212
|
+
if res.returncode != 0:
|
|
1213
|
+
continue # repo này không phải git / git thiếu → bỏ qua, repo khác vẫn đo
|
|
1214
|
+
out["available"] = True
|
|
1215
|
+
for ln in res.stdout.splitlines():
|
|
1216
|
+
if ln.startswith("__C__"):
|
|
1217
|
+
out["commits"] += 1
|
|
1218
|
+
continue
|
|
1219
|
+
m = re.match(r"^(\d+|-)\t(\d+|-)\t(.+)$", ln)
|
|
1220
|
+
if not m:
|
|
1221
|
+
continue
|
|
1222
|
+
a, d, path = m.group(1), m.group(2), m.group(3)
|
|
1223
|
+
if a == "-" or d == "-": # binary file → numstat cho "-"
|
|
1224
|
+
continue
|
|
1225
|
+
if not CODE_EXT.search(path) or _skip_path(path):
|
|
1226
|
+
continue
|
|
1227
|
+
added, deleted = int(a), int(d)
|
|
1228
|
+
info = idx.get(path)
|
|
1229
|
+
if info and info["kind"] == "prod":
|
|
1230
|
+
bucket = "prod"
|
|
1231
|
+
by_slice[info["slice"]]["added"] += added
|
|
1232
|
+
by_slice[info["slice"]]["deleted"] += deleted
|
|
1233
|
+
elif (info and info["kind"] == "test") or _is_test(path, path.rsplit("/", 1)[-1]):
|
|
1234
|
+
bucket = "test"
|
|
1235
|
+
else:
|
|
1236
|
+
bucket = "other" # file đã xoá / không gắn id → không quy được prod
|
|
1237
|
+
out[bucket]["added"] += added
|
|
1238
|
+
out[bucket]["deleted"] += deleted
|
|
1239
|
+
pr = out["prod"]
|
|
1240
|
+
net = pr["net_loc"]
|
|
1241
|
+
pr["churn_ratio"] = ((pr["added"] + pr["deleted"]) / net) if net else None
|
|
1242
|
+
out["by_slice"] = {k: dict(v) for k, v in by_slice.items()}
|
|
1243
|
+
return out
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
# ============================================================================
|
|
1247
|
+
# Token-burn engine — gộp từ build_token_log.py (file cũ đã xoá sau khi merge).
|
|
1248
|
+
# ----------------------------------------------------------------------------
|
|
1249
|
+
# Gom token THẬT (burn / ra tiền) từ session JSONL của Claude Code:
|
|
1250
|
+
# ~/.claude/projects/<project-slug>/*.jsonl (phiên chính) + transcript của
|
|
1251
|
+
# MỖI sub-agent do tool Agent/Task sinh ra ở <session-id>/subagents/*.jsonl.
|
|
1252
|
+
# Bản Claude Code hiện tại KHÔNG còn ghi sub-agent inline (isSidechain) mà tách
|
|
1253
|
+
# ra thư mục con → glob top-level `*.jsonl` bỏ sót toàn bộ burn sub-agent (có
|
|
1254
|
+
# phiên tới ~6% input + model Haiku phụ). Vì vậy đọc cả nested, nhóm theo phiên
|
|
1255
|
+
# cha (_burn_order_files) để burn sub-agent kế thừa slice/stage của cha, không
|
|
1256
|
+
# rơi _unattributed. Mỗi dòng assistant có message.usage {input_tokens,
|
|
1257
|
+
# cache_creation_input_tokens, cache_read_input_tokens, output_tokens} + message.model.
|
|
1258
|
+
# Quy ước gộp (xấp xỉ cận-trên về token, không phải $ chính xác vì cache_read rẻ ~10×):
|
|
1259
|
+
# input = input_tokens + cache_creation_input_tokens + cache_read_input_tokens
|
|
1260
|
+
# output = output_tokens
|
|
1261
|
+
# Gán per-turn ra by_slice / by_stage / by_model theo resolve_context():
|
|
1262
|
+
# 1. Explicit marker: lastPrompt = slash-command + arg (SLICE-N hoặc unit-id).
|
|
1263
|
+
# 2. File-header: Edit/Write → id (tên artifact hoặc header `id:` code file) → slice.
|
|
1264
|
+
# 3. Sticky: turn không tín hiệu kế thừa context gần nhất (reset mỗi phiên).
|
|
1265
|
+
# 4. _unattributed: turn đầu phiên trước mọi tín hiệu.
|
|
1266
|
+
# Đảm bảo Σ(by_slice) == total. Reuse CODE_EXT/ID_HEADER (định nghĩa ở trên, trùng hệt).
|
|
1267
|
+
# ============================================================================
|
|
1268
|
+
UNIT_ID = re.compile(r"\b([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+)\b")
|
|
1269
|
+
SLICE_RE = re.compile(r"\bSLICE-0*(\d+)\b", re.I)
|
|
1270
|
+
TECHSPEC_DIR = BMAD_OUT / "Stage_3_Specs" / "techspec"
|
|
1271
|
+
|
|
1272
|
+
# slash-command (prefix, case-insensitive) → stage label
|
|
1273
|
+
CMD_STAGE = [
|
|
1274
|
+
("market-research", "Stage_1"), ("product-research", "Stage_1"),
|
|
1275
|
+
("create-prd", "Stage_1"), ("create-epics", "Stage_1"), ("brainstorm", "Stage_1"),
|
|
1276
|
+
("grill", "Stage_1"), ("feature-triage", "Stage_1"),
|
|
1277
|
+
("architecture-design", "Stage_2"), ("system-overview", "Stage_2"),
|
|
1278
|
+
("slice-planning", "Stage_2b"),
|
|
1279
|
+
("technical-design", "Stage_3"), ("ux-design", "Stage_3"), ("ux-sketch", "Stage_3"),
|
|
1280
|
+
("feature-design", "Stage_4"), ("ui-generation", "Stage_4"), ("ds-", "Stage_4"),
|
|
1281
|
+
("dev-story", "Stage_5"), ("code-review", "Stage_5"), ("testarch", "Stage_5"),
|
|
1282
|
+
("dev-this", "Stage_5"), ("feature-complete", "Stage_5"), ("quick-dev", "Stage_5"),
|
|
1283
|
+
]
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
def _burn_norm_slice(n):
|
|
1287
|
+
return "SLICE-%d" % int(n)
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
def _burn_load_slice_map():
|
|
1291
|
+
"""unit_id → SLICE-N, từ frontmatter `units[].id` của mỗi slice file."""
|
|
1292
|
+
m = {}
|
|
1293
|
+
if not SLICES_DIR.exists():
|
|
1294
|
+
return m
|
|
1295
|
+
for f in sorted(SLICES_DIR.glob("SLICE-*.md")):
|
|
1296
|
+
sm = SLICE_RE.search(f.stem)
|
|
1297
|
+
if not sm:
|
|
1298
|
+
continue
|
|
1299
|
+
slice_id = _burn_norm_slice(sm.group(1))
|
|
1300
|
+
txt = read(f)
|
|
1301
|
+
fm = txt.split("---", 2)
|
|
1302
|
+
body = fm[1] if len(fm) >= 3 else txt
|
|
1303
|
+
for uid in re.findall(r"id:\s*([A-Z][A-Z0-9-]+)", body):
|
|
1304
|
+
if not uid.startswith("SLICE-"):
|
|
1305
|
+
m[uid] = slice_id
|
|
1306
|
+
return m
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
def _burn_load_techspec_units():
|
|
1310
|
+
"""{MODULE: [unit_id,...]} từ cột đầu bảng §2.1 'Đối soát kiến trúc' của mỗi
|
|
1311
|
+
{MODULE}_techspec.md. MODULE = stem bỏ hậu tố '_techspec'."""
|
|
1312
|
+
out = {}
|
|
1313
|
+
if not TECHSPEC_DIR.exists():
|
|
1314
|
+
return out
|
|
1315
|
+
for f in sorted(TECHSPEC_DIR.glob("*_techspec.md")):
|
|
1316
|
+
module = f.stem[:-len("_techspec")] if f.stem.endswith("_techspec") else f.stem
|
|
1317
|
+
lines = read(f).splitlines()
|
|
1318
|
+
units, in_audit = [], False
|
|
1319
|
+
for ln in lines:
|
|
1320
|
+
if re.search(r"2\.1.*[Đđ]ối\s*so[áa]t", ln):
|
|
1321
|
+
in_audit = True
|
|
1322
|
+
continue
|
|
1323
|
+
if in_audit:
|
|
1324
|
+
if re.match(r"^\s*#{1,4}\s", ln) or re.match(r"^\s*---\s*$", ln):
|
|
1325
|
+
break # sang section khác
|
|
1326
|
+
if ln.lstrip().startswith("|"):
|
|
1327
|
+
cell = ln.split("|")[1].strip().strip("`")
|
|
1328
|
+
mm = UNIT_ID.fullmatch(cell)
|
|
1329
|
+
if mm:
|
|
1330
|
+
units.append(cell)
|
|
1331
|
+
if units:
|
|
1332
|
+
out[module.upper()] = units
|
|
1333
|
+
return out
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
def _burn_default_sessions_dir():
|
|
1337
|
+
"""~/.claude/projects/<slug> — slug = abs path, mọi ký tự non-alnum → '-'."""
|
|
1338
|
+
slug = re.sub(r"[^A-Za-z0-9]", "-", str(ROOT))
|
|
1339
|
+
d = Path.home() / ".claude" / "projects" / slug
|
|
1340
|
+
return d if d.exists() else None
|
|
1341
|
+
|
|
1342
|
+
|
|
1343
|
+
def _burn_iter_records(jsonl_path):
|
|
1344
|
+
for ln in jsonl_path.read_text(errors="replace").splitlines():
|
|
1345
|
+
ln = ln.strip()
|
|
1346
|
+
if not ln:
|
|
1347
|
+
continue
|
|
1348
|
+
try:
|
|
1349
|
+
yield json.loads(ln)
|
|
1350
|
+
except json.JSONDecodeError:
|
|
1351
|
+
continue
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
def _burn_stage_from_cmd(cmd):
|
|
1355
|
+
"""Stage từ slash-command. Chỉ xét TÊN lệnh (token đầu sau '/'), KHÔNG quét arg
|
|
1356
|
+
— key ngắn như 'ds-' dễ trúng nhầm trong đường dẫn/arg (vd '/code-review
|
|
1357
|
+
cards-list.tsx' chứa 'ds-' ở 'cards-list' → Stage_4 sai). Vẫn để 'in' để khoan
|
|
1358
|
+
dung tiền tố wrapper ('ntapp-'/'bmad-' trong '/ntapp-architecture-design')."""
|
|
1359
|
+
m = re.match(r"\s*/(\S+)", cmd)
|
|
1360
|
+
name = m.group(1).lower() if m else cmd.lower()
|
|
1361
|
+
for key, stage in CMD_STAGE:
|
|
1362
|
+
if key in name:
|
|
1363
|
+
return stage
|
|
1364
|
+
return None
|
|
1365
|
+
|
|
1366
|
+
|
|
1367
|
+
def _burn_id_from_path(path, slice_map):
|
|
1368
|
+
"""Tên artifact (SCR-FOO.md) hoặc header `id:` của code file → unit id."""
|
|
1369
|
+
base = Path(path).stem
|
|
1370
|
+
if base in slice_map:
|
|
1371
|
+
return base
|
|
1372
|
+
for uid in UNIT_ID.findall(base):
|
|
1373
|
+
if uid in slice_map:
|
|
1374
|
+
return uid
|
|
1375
|
+
if CODE_EXT.search(path):
|
|
1376
|
+
p = Path(path)
|
|
1377
|
+
if p.exists():
|
|
1378
|
+
head = "\n".join(p.read_text(errors="replace").splitlines()[:10])
|
|
1379
|
+
hm = ID_HEADER.search(head)
|
|
1380
|
+
if hm:
|
|
1381
|
+
return hm.group(1)
|
|
1382
|
+
return None
|
|
1383
|
+
|
|
1384
|
+
|
|
1385
|
+
def _burn_resolve_context(rec, slice_map, techspec_units):
|
|
1386
|
+
"""(slice, stage, is_cmd, techspec_module) của record này."""
|
|
1387
|
+
slice_hit = stage_hit = ts_module = None
|
|
1388
|
+
is_cmd = False
|
|
1389
|
+
lp = rec.get("lastPrompt")
|
|
1390
|
+
if isinstance(lp, str) and lp.strip().startswith("/"):
|
|
1391
|
+
is_cmd = True
|
|
1392
|
+
stage_hit = _burn_stage_from_cmd(lp)
|
|
1393
|
+
if "technical-design" in lp.lower():
|
|
1394
|
+
for mod in techspec_units:
|
|
1395
|
+
if re.search(r"\b" + re.escape(mod) + r"\b", lp, re.I):
|
|
1396
|
+
ts_module = mod
|
|
1397
|
+
break
|
|
1398
|
+
sm = SLICE_RE.search(lp)
|
|
1399
|
+
if sm:
|
|
1400
|
+
slice_hit = _burn_norm_slice(sm.group(1))
|
|
1401
|
+
else: # unit-id arg → slice qua slice plan
|
|
1402
|
+
for uid in UNIT_ID.findall(lp):
|
|
1403
|
+
if uid in slice_map:
|
|
1404
|
+
slice_hit = slice_map[uid]
|
|
1405
|
+
break
|
|
1406
|
+
msg = rec.get("message")
|
|
1407
|
+
if slice_hit is None and ts_module is None and isinstance(msg, dict):
|
|
1408
|
+
c = msg.get("content")
|
|
1409
|
+
if isinstance(c, list):
|
|
1410
|
+
for b in c:
|
|
1411
|
+
if isinstance(b, dict) and b.get("type") == "tool_use" \
|
|
1412
|
+
and b.get("name") in ("Edit", "Write", "NotebookEdit"):
|
|
1413
|
+
fp = (b.get("input") or {}).get("file_path", "")
|
|
1414
|
+
uid = _burn_id_from_path(fp, slice_map) if fp else None
|
|
1415
|
+
if uid and uid in slice_map:
|
|
1416
|
+
slice_hit = slice_map[uid]
|
|
1417
|
+
break
|
|
1418
|
+
return slice_hit, stage_hit, is_cmd, ts_module
|
|
1419
|
+
|
|
1420
|
+
|
|
1421
|
+
def _burn_finalize(buckets, total_in, total_out):
|
|
1422
|
+
"""Làm tròn float → int, dồn residual vào bucket lớn nhất để Σ khớp."""
|
|
1423
|
+
rounded = {k: {"input": round(v["input"]), "output": round(v["output"])}
|
|
1424
|
+
for k, v in buckets.items()}
|
|
1425
|
+
for key, tot in (("input", total_in), ("output", total_out)):
|
|
1426
|
+
diff = tot - sum(b[key] for b in rounded.values())
|
|
1427
|
+
if diff and rounded:
|
|
1428
|
+
big = max(rounded, key=lambda k: rounded[k][key])
|
|
1429
|
+
rounded[big][key] += diff
|
|
1430
|
+
return rounded
|
|
1431
|
+
|
|
1432
|
+
|
|
1433
|
+
def _burn_accumulate(ordered, slice_map, techspec_units):
|
|
1434
|
+
"""`ordered` = list[(Path, is_group_start)] từ _burn_order_files: mỗi file
|
|
1435
|
+
phiên cha đứng ngay trước transcript sub-agent của nó. Sticky-context reset ở
|
|
1436
|
+
ranh giới NHÓM (is_group_start=True), KHÔNG reset giữa cha ↔ sub-agent → burn
|
|
1437
|
+
sub-agent kế thừa slice/stage của phiên cha thay vì rơi _unattributed."""
|
|
1438
|
+
inp = out = 0
|
|
1439
|
+
breakdown = {"input_tokens": 0, "cache_creation_input_tokens": 0,
|
|
1440
|
+
"cache_read_input_tokens": 0, "output_tokens": 0}
|
|
1441
|
+
n_msgs = 0
|
|
1442
|
+
by_slice = defaultdict(lambda: {"input": 0.0, "output": 0.0})
|
|
1443
|
+
by_stage = defaultdict(lambda: {"input": 0.0, "output": 0.0})
|
|
1444
|
+
by_model = defaultdict(lambda: {"input": 0.0, "output": 0.0})
|
|
1445
|
+
# per-model 4-component breakdown → định giá chính xác theo bảng giá từng model
|
|
1446
|
+
by_model_breakdown = defaultdict(lambda: {"input_tokens": 0, "cache_creation_input_tokens": 0,
|
|
1447
|
+
"cache_read_input_tokens": 0, "output_tokens": 0})
|
|
1448
|
+
by_slice_model = defaultdict(lambda: defaultdict(lambda: {"input": 0.0, "output": 0.0}))
|
|
1449
|
+
by_stage_model = defaultdict(lambda: defaultdict(lambda: {"input": 0.0, "output": 0.0}))
|
|
1450
|
+
ts_min = ts_max = None # G2 — khoảng ngày phiên (đo độ phủ session-log)
|
|
1451
|
+
cur_slice = cur_stage = cur_ts = None
|
|
1452
|
+
for f, group_start in ordered:
|
|
1453
|
+
if group_start:
|
|
1454
|
+
cur_slice = cur_stage = cur_ts = None # reset mỗi NHÓM (phiên cha + sub-agent)
|
|
1455
|
+
else:
|
|
1456
|
+
cur_ts = None # sub-agent: giữ slice/stage của cha, thoát techspec-split mode
|
|
1457
|
+
for rec in _burn_iter_records(f):
|
|
1458
|
+
rts = rec.get("timestamp")
|
|
1459
|
+
if isinstance(rts, str) and len(rts) >= 10:
|
|
1460
|
+
day = rts[:10]
|
|
1461
|
+
if ts_min is None or day < ts_min:
|
|
1462
|
+
ts_min = day
|
|
1463
|
+
if ts_max is None or day > ts_max:
|
|
1464
|
+
ts_max = day
|
|
1465
|
+
s, st, is_cmd, ts = _burn_resolve_context(rec, slice_map, techspec_units)
|
|
1466
|
+
if is_cmd:
|
|
1467
|
+
cur_ts = ts # command mới: vào techspec mode, hoặc thoát nó
|
|
1468
|
+
if s:
|
|
1469
|
+
cur_slice = s
|
|
1470
|
+
if st:
|
|
1471
|
+
cur_stage = st
|
|
1472
|
+
msg = rec.get("message")
|
|
1473
|
+
if not (isinstance(msg, dict) and isinstance(msg.get("usage"), dict)):
|
|
1474
|
+
continue
|
|
1475
|
+
u = msg["usage"]
|
|
1476
|
+
it = u.get("input_tokens", 0) or 0
|
|
1477
|
+
cc = u.get("cache_creation_input_tokens", 0) or 0
|
|
1478
|
+
cr = u.get("cache_read_input_tokens", 0) or 0
|
|
1479
|
+
ot = u.get("output_tokens", 0) or 0
|
|
1480
|
+
ti, to = it + cc + cr, ot
|
|
1481
|
+
model = msg.get("model") or "unknown"
|
|
1482
|
+
n_msgs += 1
|
|
1483
|
+
breakdown["input_tokens"] += it
|
|
1484
|
+
breakdown["cache_creation_input_tokens"] += cc
|
|
1485
|
+
breakdown["cache_read_input_tokens"] += cr
|
|
1486
|
+
breakdown["output_tokens"] += ot
|
|
1487
|
+
inp += ti
|
|
1488
|
+
out += to
|
|
1489
|
+
by_model[model]["input"] += ti
|
|
1490
|
+
by_model[model]["output"] += to
|
|
1491
|
+
bmb = by_model_breakdown[model]
|
|
1492
|
+
bmb["input_tokens"] += it
|
|
1493
|
+
bmb["cache_creation_input_tokens"] += cc
|
|
1494
|
+
bmb["cache_read_input_tokens"] += cr
|
|
1495
|
+
bmb["output_tokens"] += ot
|
|
1496
|
+
# --- by_slice: techspec → chia đều cho unit của §2.1; ngược lại sticky
|
|
1497
|
+
if cur_ts:
|
|
1498
|
+
units = techspec_units[cur_ts]
|
|
1499
|
+
n = len(units)
|
|
1500
|
+
for uid in units:
|
|
1501
|
+
tgt = slice_map.get(uid, "_unattributed")
|
|
1502
|
+
by_slice[tgt]["input"] += ti / n
|
|
1503
|
+
by_slice[tgt]["output"] += to / n
|
|
1504
|
+
by_slice_model[tgt][model]["input"] += ti / n
|
|
1505
|
+
by_slice_model[tgt][model]["output"] += to / n
|
|
1506
|
+
else:
|
|
1507
|
+
sk = cur_slice or "_unattributed"
|
|
1508
|
+
by_slice[sk]["input"] += ti
|
|
1509
|
+
by_slice[sk]["output"] += to
|
|
1510
|
+
by_slice_model[sk][model]["input"] += ti
|
|
1511
|
+
by_slice_model[sk][model]["output"] += to
|
|
1512
|
+
stk = cur_stage or "_unattributed"
|
|
1513
|
+
by_stage[stk]["input"] += ti
|
|
1514
|
+
by_stage[stk]["output"] += to
|
|
1515
|
+
by_stage_model[stk][model]["input"] += ti
|
|
1516
|
+
by_stage_model[stk][model]["output"] += to
|
|
1517
|
+
|
|
1518
|
+
def round_nested(d):
|
|
1519
|
+
return {k: {m: {"input": round(v["input"]), "output": round(v["output"])}
|
|
1520
|
+
for m, v in mv.items()} for k, mv in d.items()}
|
|
1521
|
+
|
|
1522
|
+
return {
|
|
1523
|
+
"input": inp, "output": out, "breakdown": breakdown, "n_msgs": n_msgs,
|
|
1524
|
+
"ts_min": ts_min, "ts_max": ts_max,
|
|
1525
|
+
"by_slice": _burn_finalize(by_slice, inp, out),
|
|
1526
|
+
"by_stage": _burn_finalize(by_stage, inp, out),
|
|
1527
|
+
"by_model": _burn_finalize(by_model, inp, out),
|
|
1528
|
+
"by_model_breakdown": {m: dict(bd) for m, bd in by_model_breakdown.items()},
|
|
1529
|
+
"by_slice_model": round_nested(by_slice_model),
|
|
1530
|
+
"by_stage_model": round_nested(by_stage_model),
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
def _burn_resolve_files(sessions_dir=None, session=None):
|
|
1535
|
+
"""Danh sách file .jsonl cần đọc: phiên chính top-level + transcript sub-agent
|
|
1536
|
+
lồng trong <session-id>/subagents/*.jsonl (bản Claude Code mới tách sub-agent
|
|
1537
|
+
ra thư mục con, không còn inline isSidechain → glob non-recursive bỏ sót toàn
|
|
1538
|
+
bộ burn sub-agent). Trả [] nếu không tìm thấy."""
|
|
1539
|
+
if session:
|
|
1540
|
+
p = Path(session)
|
|
1541
|
+
# <session>.jsonl ↔ subagents của nó ở <session-dir>/<stem>/subagents/
|
|
1542
|
+
return [p] + sorted((p.parent / p.stem / "subagents").glob("*.jsonl"))
|
|
1543
|
+
d = Path(sessions_dir) if sessions_dir else _burn_default_sessions_dir()
|
|
1544
|
+
if not d or not d.exists():
|
|
1545
|
+
return []
|
|
1546
|
+
return sorted(d.glob("*.jsonl")) + sorted(d.glob("*/subagents/*.jsonl"))
|
|
1547
|
+
|
|
1548
|
+
|
|
1549
|
+
def _burn_order_files(files):
|
|
1550
|
+
"""Sắp `files` theo NHÓM: mỗi file phiên cha (top-level) đứng ngay trước các
|
|
1551
|
+
transcript sub-agent của nó (<session-id>/subagents/*.jsonl). Trả
|
|
1552
|
+
list[(path, is_group_start)] — is_group_start=True ở file cha (=False ở
|
|
1553
|
+
sub-agent) để _burn_accumulate reset sticky-context theo nhóm, cho sub-agent
|
|
1554
|
+
kế thừa slice/stage của phiên cha. Sub-agent mồ côi (không thấy file cha
|
|
1555
|
+
trong `files`) tự mở nhóm riêng — vẫn được đếm vào total."""
|
|
1556
|
+
subs_by_parent = defaultdict(list)
|
|
1557
|
+
tops = []
|
|
1558
|
+
for f in files:
|
|
1559
|
+
if f.parent.name == "subagents":
|
|
1560
|
+
subs_by_parent[f.parent.parent.name].append(f)
|
|
1561
|
+
else:
|
|
1562
|
+
tops.append(f)
|
|
1563
|
+
ordered, seen = [], set()
|
|
1564
|
+
for f in sorted(tops):
|
|
1565
|
+
ordered.append((f, True))
|
|
1566
|
+
seen.add(f.stem)
|
|
1567
|
+
for s in sorted(subs_by_parent.get(f.stem, [])):
|
|
1568
|
+
ordered.append((s, False))
|
|
1569
|
+
for parent, subs in sorted(subs_by_parent.items()): # sub-agent mồ côi
|
|
1570
|
+
if parent not in seen:
|
|
1571
|
+
for i, s in enumerate(sorted(subs)):
|
|
1572
|
+
ordered.append((s, i == 0))
|
|
1573
|
+
return ordered
|
|
1574
|
+
|
|
1575
|
+
|
|
1576
|
+
def _burn_build_log_dict(files, total_only=False):
|
|
1577
|
+
"""Dựng dict token-log từ files (schema mà load_token_log đọc)."""
|
|
1578
|
+
slice_map = {} if total_only else _burn_load_slice_map()
|
|
1579
|
+
techspec_units = {} if total_only else _burn_load_techspec_units()
|
|
1580
|
+
r = _burn_accumulate(_burn_order_files(files), slice_map, techspec_units)
|
|
1581
|
+
inp, out, bd, n = r["input"], r["output"], r["breakdown"], r["n_msgs"]
|
|
1582
|
+
by_slice, by_stage = r["by_slice"], r["by_stage"]
|
|
1583
|
+
log = {
|
|
1584
|
+
"total": {"input": inp, "output": out},
|
|
1585
|
+
"_meta": {
|
|
1586
|
+
"source": "claude-code session jsonl",
|
|
1587
|
+
"files": len(files),
|
|
1588
|
+
"assistant_messages": n,
|
|
1589
|
+
"session_date_min": r.get("ts_min"), # G2 — độ phủ session-log
|
|
1590
|
+
"session_date_max": r.get("ts_max"),
|
|
1591
|
+
"breakdown_raw": bd,
|
|
1592
|
+
"slice_plan_units": len(slice_map),
|
|
1593
|
+
"techspec_split": {m: techspec_units[m] for m in techspec_units},
|
|
1594
|
+
"by_model": r["by_model"], # model_id → {input, output} (toàn cục)
|
|
1595
|
+
"by_model_breakdown": r["by_model_breakdown"], # model_id → 4 thành phần (định giá per-model)
|
|
1596
|
+
"by_slice_model": r["by_slice_model"], # slice → model_id → {input, output}
|
|
1597
|
+
"by_stage_model": r["by_stage_model"], # stage → model_id → {input, output}
|
|
1598
|
+
"note": "input = input_tokens + cache_creation + cache_read; output = output_tokens",
|
|
1599
|
+
},
|
|
1600
|
+
}
|
|
1601
|
+
if not total_only:
|
|
1602
|
+
log["by_slice"] = by_slice
|
|
1603
|
+
log["by_stage"] = by_stage
|
|
1604
|
+
si = sum(v["input"] for v in by_slice.values())
|
|
1605
|
+
so = sum(v["output"] for v in by_slice.values())
|
|
1606
|
+
assert (si, so) == (inp, out), f"by_slice mismatch: {(si, so)} != {(inp, out)}"
|
|
1607
|
+
return log
|
|
1608
|
+
|
|
1609
|
+
|
|
1610
|
+
def harvest_burn(sessions_dir=None, session=None, write=False, total_only=False):
|
|
1611
|
+
"""High-level entry. Trả dict token-log, hoặc None nếu không có session.
|
|
1612
|
+
write=True → ghi TOKEN_LOG (token-log.json)."""
|
|
1613
|
+
files = _burn_resolve_files(sessions_dir, session)
|
|
1614
|
+
if not files:
|
|
1615
|
+
return None
|
|
1616
|
+
log = _burn_build_log_dict(files, total_only=total_only)
|
|
1617
|
+
if write:
|
|
1618
|
+
TOKEN_LOG.parent.mkdir(parents=True, exist_ok=True)
|
|
1619
|
+
TOKEN_LOG.write_text(json.dumps(log, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
1620
|
+
return log
|
|
1621
|
+
|
|
1622
|
+
|
|
1623
|
+
def _burn_cache_stale():
|
|
1624
|
+
"""True nếu có transcript phiên mới hơn cache burn (so theo thời gian sửa file).
|
|
1625
|
+
Nghĩa là cache đang bỏ sót burn của phiên vừa chạy. Thiếu cache hoặc thiếu
|
|
1626
|
+
phiên nào để đối chiếu → False, nhường quyết định cho nhánh gọi."""
|
|
1627
|
+
if not TOKEN_LOG.exists():
|
|
1628
|
+
return False
|
|
1629
|
+
try:
|
|
1630
|
+
cache_mtime = TOKEN_LOG.stat().st_mtime
|
|
1631
|
+
except OSError:
|
|
1632
|
+
return False
|
|
1633
|
+
for f in _burn_resolve_files():
|
|
1634
|
+
try:
|
|
1635
|
+
if f.stat().st_mtime > cache_mtime:
|
|
1636
|
+
return True
|
|
1637
|
+
except OSError:
|
|
1638
|
+
continue
|
|
1639
|
+
return False
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
def load_token_log(refresh=False):
|
|
1643
|
+
"""Real-burn input. Schema: {total:{input,output}, by_stage:{...}, by_slice:{...}}.
|
|
1644
|
+
|
|
1645
|
+
Tự harvest từ session JSONL (harvest_burn — engine gộp ở trên) khi:
|
|
1646
|
+
- file token-log.json chưa tồn tại, hoặc
|
|
1647
|
+
- refresh=True (cờ --refresh-burn) — đọc lại session mới nhất, hoặc
|
|
1648
|
+
- cache cũ hơn transcript phiên mới (auto — chống bẫy dùng burn cũ).
|
|
1649
|
+
Có file + còn mới + không refresh → dùng cached. Không có session → None (hiển thị 🔴 n/a)."""
|
|
1650
|
+
stale = _burn_cache_stale()
|
|
1651
|
+
if TOKEN_LOG.exists() and not refresh and not stale:
|
|
1652
|
+
try:
|
|
1653
|
+
return json.loads(read(TOKEN_LOG))
|
|
1654
|
+
except (json.JSONDecodeError, ValueError):
|
|
1655
|
+
pass
|
|
1656
|
+
if stale and not refresh:
|
|
1657
|
+
print("[eval-harvester] cache burn cũ hơn phiên mới → tự re-harvest")
|
|
1658
|
+
try:
|
|
1659
|
+
log = harvest_burn(write=True) # ghi luôn token-log.json
|
|
1660
|
+
if log:
|
|
1661
|
+
print(f"[eval-harvester] auto-harvested burn từ session JSONL "
|
|
1662
|
+
f"({log['_meta']['files']} files, {log['_meta']['assistant_messages']} msgs)")
|
|
1663
|
+
return log
|
|
1664
|
+
except Exception as e: # harvest lỗi → fallback file cũ nếu có, ngược lại None
|
|
1665
|
+
print(f"[eval-harvester] burn auto-harvest skip: {e}")
|
|
1666
|
+
if TOKEN_LOG.exists():
|
|
1667
|
+
try:
|
|
1668
|
+
return json.loads(read(TOKEN_LOG))
|
|
1669
|
+
except (json.JSONDecodeError, ValueError):
|
|
1670
|
+
return None
|
|
1671
|
+
return None
|
|
1672
|
+
|
|
1673
|
+
|
|
1674
|
+
def _git_commit_span():
|
|
1675
|
+
"""(first_date, last_date, n_commits) theo author-date qua mọi code root.
|
|
1676
|
+
Trả (None, None, 0) nếu không repo nào đọc được git. Dùng cho G2 — đối
|
|
1677
|
+
chiếu khoảng hoạt động git với khoảng phiên Claude Code để bắt 'thiếu phiên'."""
|
|
1678
|
+
import subprocess
|
|
1679
|
+
dates = []
|
|
1680
|
+
for r in resolve_code_roots():
|
|
1681
|
+
try:
|
|
1682
|
+
res = subprocess.run(
|
|
1683
|
+
["git", "-C", str(r), "log", "--format=%ad", "--date=short"],
|
|
1684
|
+
capture_output=True, text=True, timeout=60)
|
|
1685
|
+
except (OSError, subprocess.SubprocessError):
|
|
1686
|
+
continue
|
|
1687
|
+
if res.returncode != 0:
|
|
1688
|
+
continue
|
|
1689
|
+
dates += [l.strip() for l in res.stdout.splitlines() if l.strip()]
|
|
1690
|
+
if not dates:
|
|
1691
|
+
return None, None, 0
|
|
1692
|
+
return min(dates), max(dates), len(dates)
|
|
1693
|
+
|
|
1694
|
+
|
|
1695
|
+
def _burn_coverage(meta):
|
|
1696
|
+
"""G2 — tín hiệu độ phủ session-log. So khoảng ngày phiên (session_date_*)
|
|
1697
|
+
với khoảng author-date của commit git. Burn gom từ JSONL từng máy; nếu phiên
|
|
1698
|
+
chạy ở máy khác / đã xoá thì burn hụt trong im lặng. Phủ thấp → đánh dấu burn
|
|
1699
|
+
'một phần (cận dưới)' thay vì để số trần.
|
|
1700
|
+
|
|
1701
|
+
Trả dict {level: full|partial|unknown, lower_bound: bool, ratio, ...}.
|
|
1702
|
+
'unknown' khi thiếu mốc git hoặc thiếu mốc phiên → không kết luận, không cảnh báo sai."""
|
|
1703
|
+
smin, smax = (meta or {}).get("session_date_min"), (meta or {}).get("session_date_max")
|
|
1704
|
+
gfirst, glast, gn = _git_commit_span()
|
|
1705
|
+
cov = {"session_min": smin, "session_max": smax,
|
|
1706
|
+
"git_first": gfirst, "git_last": glast, "git_commits": gn,
|
|
1707
|
+
"span_days": None, "covered_days": None, "ratio": None,
|
|
1708
|
+
"level": "unknown", "lower_bound": False}
|
|
1709
|
+
sd0, sd1 = _parse_date(smin), _parse_date(smax)
|
|
1710
|
+
gd0, gd1 = _parse_date(gfirst), _parse_date(glast)
|
|
1711
|
+
if not (sd0 and sd1 and gd0 and gd1):
|
|
1712
|
+
return cov # thiếu một đầu mốc → unknown
|
|
1713
|
+
span = (gd1 - gd0).days + 1
|
|
1714
|
+
ov0, ov1 = max(sd0, gd0), min(sd1, gd1)
|
|
1715
|
+
covered = (ov1 - ov0).days + 1 if ov1 >= ov0 else 0
|
|
1716
|
+
ratio = covered / span if span else None
|
|
1717
|
+
cov.update(span_days=span, covered_days=covered, ratio=ratio)
|
|
1718
|
+
if ratio is not None:
|
|
1719
|
+
cov["level"] = "full" if ratio >= COVERAGE_FULL else "partial"
|
|
1720
|
+
cov["lower_bound"] = ratio < COVERAGE_FULL
|
|
1721
|
+
return cov
|
|
1722
|
+
|
|
1723
|
+
|
|
1724
|
+
def build_cost(art, code, totals, token_log, units):
|
|
1725
|
+
"""Assemble the Bộ C cost block: proxy ratios (🟢) + real-burn (🔴 if logged)."""
|
|
1726
|
+
def tok(bucket):
|
|
1727
|
+
return art.get(bucket, {}).get("tokens", 0.0)
|
|
1728
|
+
|
|
1729
|
+
prod = code["prod"]["tokens"]
|
|
1730
|
+
spec_design = tok("spec") + tok("design")
|
|
1731
|
+
review_test = (tok("build_review") + tok("test_audit") + code["test"]["tokens"]
|
|
1732
|
+
+ code["untagged_tests"]["tokens"])
|
|
1733
|
+
governance = tok("discovery") + tok("architecture") + tok("design_system")
|
|
1734
|
+
all_artifact = sum(tok(b) for b in ("discovery", "architecture", "spec",
|
|
1735
|
+
"design", "build_review", "test_audit",
|
|
1736
|
+
"design_system"))
|
|
1737
|
+
# archive waste = superseded (archived) versions of the iterated design artifacts
|
|
1738
|
+
archived_arch = sum(art.get(b, {}).get("arch_tokens", 0.0)
|
|
1739
|
+
for b in ("architecture", "design"))
|
|
1740
|
+
archived_curr = sum(art.get(b, {}).get("tokens", 0.0)
|
|
1741
|
+
for b in ("architecture", "design"))
|
|
1742
|
+
|
|
1743
|
+
def ratio(n, d):
|
|
1744
|
+
return (n / d) if d else None
|
|
1745
|
+
|
|
1746
|
+
delivered = all_artifact + prod + code["test"]["tokens"]
|
|
1747
|
+
meta = (token_log.get("_meta") or {}) if token_log else {}
|
|
1748
|
+
burn = None
|
|
1749
|
+
if token_log and token_log.get("total"):
|
|
1750
|
+
t = token_log["total"]
|
|
1751
|
+
burn_total = (t.get("input", 0) + t.get("output", 0))
|
|
1752
|
+
ac = totals.get("ac_total") or 0
|
|
1753
|
+
# Phan ra 4 thanh phan input tu breakdown_raw (neu co); quy doi chi phi $.
|
|
1754
|
+
bd = (token_log.get("_meta") or {}).get("breakdown_raw") or {}
|
|
1755
|
+
comp = {
|
|
1756
|
+
"input": bd.get("input_tokens", 0),
|
|
1757
|
+
"cache_write": bd.get("cache_creation_input_tokens", 0),
|
|
1758
|
+
"cache_read": bd.get("cache_read_input_tokens", 0),
|
|
1759
|
+
"output": bd.get("output_tokens", t.get("output", 0)),
|
|
1760
|
+
}
|
|
1761
|
+
# Định giá THEO TỪNG MODEL (session dùng cả Opus lẫn Haiku cho sub-agent →
|
|
1762
|
+
# định giá phẳng một model sẽ lệch). Fallback định giá phẳng Opus nếu
|
|
1763
|
+
# token-log.json cũ chưa có by_model_breakdown.
|
|
1764
|
+
bmb = meta.get("by_model_breakdown") or {}
|
|
1765
|
+
cost_by_model = {}
|
|
1766
|
+
for mid, bd_m in bmb.items():
|
|
1767
|
+
comp_m = {
|
|
1768
|
+
"input": bd_m.get("input_tokens", 0),
|
|
1769
|
+
"cache_write": bd_m.get("cache_creation_input_tokens", 0),
|
|
1770
|
+
"cache_read": bd_m.get("cache_read_input_tokens", 0),
|
|
1771
|
+
"output": bd_m.get("output_tokens", 0),
|
|
1772
|
+
}
|
|
1773
|
+
if sum(comp_m.values()) == 0: # model 0 token (vd '<synthetic>') → bỏ, khỏi rối bảng
|
|
1774
|
+
continue
|
|
1775
|
+
price = price_for_model(mid)
|
|
1776
|
+
cusd = {k: comp_m[k] / 1_000_000 * price[k] for k in comp_m}
|
|
1777
|
+
cost_by_model[mid] = {
|
|
1778
|
+
"label": model_label(mid), "components": comp_m, "cost_usd": cusd,
|
|
1779
|
+
"cost_total_usd": sum(cusd.values()), "tokens_total": sum(comp_m.values()),
|
|
1780
|
+
}
|
|
1781
|
+
if cost_by_model: # per-component $ = tổng qua các model (giá khác nhau) → tổng đúng
|
|
1782
|
+
cost = {k: sum(c["cost_usd"][k] for c in cost_by_model.values())
|
|
1783
|
+
for k in ("input", "cache_write", "cache_read", "output")}
|
|
1784
|
+
else:
|
|
1785
|
+
cost = {k: comp[k] / 1_000_000 * PRICE_PER_MTOK[k] for k in comp}
|
|
1786
|
+
burn = {
|
|
1787
|
+
"input": t.get("input"), "output": t.get("output"), "total": burn_total,
|
|
1788
|
+
"per_ac": ratio(burn_total, ac),
|
|
1789
|
+
"amplification": ratio(burn_total, delivered), # burn ÷ delivered weight
|
|
1790
|
+
"by_stage": token_log.get("by_stage"),
|
|
1791
|
+
"by_slice": token_log.get("by_slice"),
|
|
1792
|
+
"components": comp if bd else None, # 4-way input/output split (toàn cục)
|
|
1793
|
+
"cost_usd": cost if bd else None, # per-component $ (blended per-model)
|
|
1794
|
+
"cost_total_usd": sum(cost.values()) if bd else None,
|
|
1795
|
+
# per-model, sắp theo chi phí giảm dần (list; label carries model id)
|
|
1796
|
+
"cost_by_model": sorted(cost_by_model.values(),
|
|
1797
|
+
key=lambda c: -c["cost_total_usd"]) or None,
|
|
1798
|
+
"cost_priced_per_model": bool(cost_by_model),
|
|
1799
|
+
"coverage": _burn_coverage(meta), # G2 — độ phủ session-log
|
|
1800
|
+
}
|
|
1801
|
+
return {
|
|
1802
|
+
"unit": "token-proxy (~chars/%d)" % CHARS_PER_TOKEN,
|
|
1803
|
+
"buckets": {k: round(art[k].get("tokens", 0.0)) for k in sorted(art)},
|
|
1804
|
+
"buckets_archived": {k: round(art[k].get("arch_tokens", 0.0))
|
|
1805
|
+
for k in sorted(art) if art[k].get("arch_tokens")},
|
|
1806
|
+
"code_prod_tokens": round(prod),
|
|
1807
|
+
"code_test_tokens": round(code["test"]["tokens"]),
|
|
1808
|
+
"code_untagged_test_tokens": round(code["untagged_tests"]["tokens"]),
|
|
1809
|
+
"code_roots": code["code_roots"],
|
|
1810
|
+
"ratios": {
|
|
1811
|
+
"spec_design_to_code": ratio(spec_design, prod), # COST-2
|
|
1812
|
+
"review_test_to_code": ratio(review_test, prod), # COST-3
|
|
1813
|
+
"all_artifact_to_code": ratio(all_artifact, prod), # COST-4
|
|
1814
|
+
"governance_to_code": ratio(governance, prod), # COST-5
|
|
1815
|
+
"archive_waste": ratio(archived_arch, archived_curr + archived_arch), # COST-6
|
|
1816
|
+
},
|
|
1817
|
+
"delivered_tokens": round(delivered),
|
|
1818
|
+
"burn": burn, # COST-1/7/8 — None unless token-log.json present
|
|
1819
|
+
"by_slice": code.get("by_slice", {}),
|
|
1820
|
+
"by_model": meta.get("by_model") or {}, # model_id → {input, output}
|
|
1821
|
+
"by_slice_model": meta.get("by_slice_model") or {}, # slice → model_id → {input, output}
|
|
1822
|
+
"by_stage_model": meta.get("by_stage_model") or {}, # stage → model_id → {input, output}
|
|
1823
|
+
}
|
|
1824
|
+
|
|
1825
|
+
|
|
1826
|
+
def fmt_pct(x):
|
|
1827
|
+
return f"{round(100 * x):d}%" if x is not None else "n/a"
|
|
1828
|
+
|
|
1829
|
+
|
|
1830
|
+
def fmt_ratio(x):
|
|
1831
|
+
return f"{x:.2f}×" if x is not None else "n/a"
|
|
1832
|
+
|
|
1833
|
+
|
|
1834
|
+
def fmt_tok(x):
|
|
1835
|
+
"""Token gọn theo bậc: ≥1 tỉ → B, ≥1 triệu → M, ≥1 nghìn → k."""
|
|
1836
|
+
if not x:
|
|
1837
|
+
return "0"
|
|
1838
|
+
if abs(x) >= 1_000_000_000:
|
|
1839
|
+
return f"{x/1_000_000_000:.2f}B"
|
|
1840
|
+
if abs(x) >= 1_000_000:
|
|
1841
|
+
return f"{x/1_000_000:.1f}M"
|
|
1842
|
+
return f"{round(x/1000, 1)}k"
|
|
1843
|
+
|
|
1844
|
+
|
|
1845
|
+
def build(refresh_burn=False):
|
|
1846
|
+
slice_units, unit_slice, slice_meta = parse_slices()
|
|
1847
|
+
units = {u: parse_unit(u) for sl in slice_units.values() for u in sl}
|
|
1848
|
+
units = {u: v for u, v in units.items() if v}
|
|
1849
|
+
defers = parse_defers(unit_slice)
|
|
1850
|
+
drift = parse_drift_reports() # G8 — lệch L3↔L2 (UI schema) bắt ở cổng thiết kế
|
|
1851
|
+
dd = parse_dd_reports() # G10 — CR + drift L3↔TechSpec + TBD trong DD
|
|
1852
|
+
rework = parse_rework()
|
|
1853
|
+
|
|
1854
|
+
# G11 — unit bị XÓA theo CR (tombstone DD `dd_version: v*-removed`). Loại khỏi
|
|
1855
|
+
# mọi chấm điểm FPY/AC/slice: chúng KHÔNG phải deliverable sống. Vẫn liệt kê
|
|
1856
|
+
# riêng (removed_slices / removed_in_slice) để surface trục-C scope-removal.
|
|
1857
|
+
removed = set(dd.get("removed_units") or [])
|
|
1858
|
+
removed_slices = []
|
|
1859
|
+
|
|
1860
|
+
slices = {}
|
|
1861
|
+
for sid, ulist in slice_units.items():
|
|
1862
|
+
live_ulist = [u for u in ulist if u not in removed]
|
|
1863
|
+
rin_slice = [u for u in ulist if u in removed]
|
|
1864
|
+
us = [units[u] for u in live_ulist if u in units]
|
|
1865
|
+
if not us:
|
|
1866
|
+
# Slice rỗng SAU khi loại scope-removal = slice bị CR xóa hẳn → report
|
|
1867
|
+
# riêng thay vì nuốt im lặng (trước G11 bị `continue` bỏ qua vô hình).
|
|
1868
|
+
if rin_slice:
|
|
1869
|
+
removed_slices.append({"slice": sid, "units": rin_slice,
|
|
1870
|
+
"type": slice_meta.get(sid, {}).get("type"),
|
|
1871
|
+
"demo_status": slice_meta.get(sid, {}).get("demo_status")})
|
|
1872
|
+
continue
|
|
1873
|
+
ac_total = sum(u["ac_total"] for u in us)
|
|
1874
|
+
patch = sum(u["review_patch"] for u in us)
|
|
1875
|
+
# FPY chỉ tính trên unit CÓ AC đếm được (ac_total>0): tử & mẫu cùng nguồn.
|
|
1876
|
+
# Unit có patch nhưng AC=0 (parser trượt) bị loại khỏi tỉ lệ + gắn cờ,
|
|
1877
|
+
# tránh tử số `[Review][Patch]` ăn vào mẫu số 0 → FPY âm vô nghĩa.
|
|
1878
|
+
ac_bearing = [u for u in us if u["ac_total"] > 0]
|
|
1879
|
+
fpy_ac = sum(u["ac_total"] for u in ac_bearing)
|
|
1880
|
+
fpy_patch = sum(u["review_patch"] for u in ac_bearing)
|
|
1881
|
+
# F-FPY: tử số = CHỈ patch chức năng (Acceptance). Bảo mật/edge/quality loại.
|
|
1882
|
+
fpy_func = sum(u["functional_patch"] for u in ac_bearing)
|
|
1883
|
+
func_patch = sum(u["functional_patch"] for u in us)
|
|
1884
|
+
patch_excl = sum(u["patch_excluded"] for u in us)
|
|
1885
|
+
patch_uncl = sum(u["patch_unclassified"] for u in us)
|
|
1886
|
+
slice_excl_by = defaultdict(int)
|
|
1887
|
+
for u in us:
|
|
1888
|
+
for k, v in (u.get("patch_excluded_by") or {}).items():
|
|
1889
|
+
slice_excl_by[k] += v
|
|
1890
|
+
# Headline = unit-incidence: bao nhiêu unit chạy đúng luồng chính ngay lần đầu
|
|
1891
|
+
units_func_clean = sum(1 for u in ac_bearing if u["functional_patch"] == 0)
|
|
1892
|
+
# Cờ độ tin: story có tag lăng kính (tin cao) hay phải suy luận lexicon
|
|
1893
|
+
patch_inferred = any(u.get("patch_class_method") == "inferred" for u in ac_bearing)
|
|
1894
|
+
unscored_patch_units = [u["unit"] for u in us
|
|
1895
|
+
if u["ac_total"] == 0 and u["review_patch"] > 0]
|
|
1896
|
+
rdefer = sum(u["review_defer"] for u in us)
|
|
1897
|
+
churn = sum(u["ac_churn"] for u in us)
|
|
1898
|
+
dev = sum(u["deviations"] for u in us)
|
|
1899
|
+
clog = sum(u["changelog_rows"] for u in us)
|
|
1900
|
+
sl_defers = [d for d in defers if d["slice"] == sid]
|
|
1901
|
+
# Avoidability chỉ tính trên record GIÀU trường (avoidable đã ghi rõ);
|
|
1902
|
+
# record bullet (avoidable=None) bị loại khỏi mẫu số — xem G1.
|
|
1903
|
+
sl_rich = [d for d in sl_defers if d["avoidable"] is not None]
|
|
1904
|
+
avoidable = sum(1 for d in sl_rich if d["avoidable"])
|
|
1905
|
+
closed = sum(1 for d in sl_defers if d["status"] == "closed")
|
|
1906
|
+
open_ages = [d["age_days"] for d in sl_defers if d["status"] != "closed" and d["age_days"] is not None]
|
|
1907
|
+
rework_versions = max([rework.get(u, 1) for u in live_ulist] + [1])
|
|
1908
|
+
slices[sid] = {
|
|
1909
|
+
"units": live_ulist,
|
|
1910
|
+
"removed_units_in_slice": rin_slice,
|
|
1911
|
+
"type": slice_meta.get(sid, {}).get("type"),
|
|
1912
|
+
"demo_status": slice_meta.get(sid, {}).get("demo_status"),
|
|
1913
|
+
"ac_total": ac_total,
|
|
1914
|
+
"review_patch": patch,
|
|
1915
|
+
"review_defer": rdefer,
|
|
1916
|
+
"fpy_ac": fpy_ac,
|
|
1917
|
+
"fpy_patch": fpy_patch,
|
|
1918
|
+
"fpy_func": fpy_func,
|
|
1919
|
+
# F-FPY headline = unit-incidence chức năng: % unit (feature) chạy đúng
|
|
1920
|
+
# luồng chính ngay lần đầu (functional_patch==0). Dễ "hình dung" hơn tỉ lệ.
|
|
1921
|
+
"fpy": (units_func_clean / len(ac_bearing)) if ac_bearing else None,
|
|
1922
|
+
"units_func_clean": units_func_clean,
|
|
1923
|
+
"units_ac_bearing": len(ac_bearing),
|
|
1924
|
+
# AC-normalized functional (phụ): 1 − lỗi-chức-năng/AC.
|
|
1925
|
+
"ffpy_acnorm": (max(0.0, 1 - fpy_func / fpy_ac) if fpy_ac else None),
|
|
1926
|
+
"func_density": (fpy_func / fpy_ac) if fpy_ac else None,
|
|
1927
|
+
# SFPY = yield GỒM CẢ hardening (số FPY cũ) — giữ để so sánh gánh nặng review.
|
|
1928
|
+
"sfpy": (max(0.0, 1 - fpy_patch / fpy_ac) if fpy_ac else None),
|
|
1929
|
+
"patch_density": (fpy_patch / fpy_ac) if fpy_ac else None,
|
|
1930
|
+
"functional_patch": func_patch,
|
|
1931
|
+
"patch_excluded": patch_excl,
|
|
1932
|
+
"patch_unclassified": patch_uncl,
|
|
1933
|
+
"patch_excluded_by": dict(slice_excl_by),
|
|
1934
|
+
"patch_inferred": patch_inferred,
|
|
1935
|
+
"unscored_patch_units": unscored_patch_units,
|
|
1936
|
+
"ac_churn": churn,
|
|
1937
|
+
"ac_churn_rate": (churn / ac_total) if ac_total else None,
|
|
1938
|
+
"deviations": dev,
|
|
1939
|
+
"changelog_rows": clog,
|
|
1940
|
+
"defer_count": len(sl_defers),
|
|
1941
|
+
"defer_avoidable": avoidable,
|
|
1942
|
+
"avoidability_index": (avoidable / len(sl_rich)) if sl_rich else None,
|
|
1943
|
+
# G1: defer ghi vào sổ ÷ defer review sinh ra. <1 = nợ mất dấu.
|
|
1944
|
+
"defer_capture_rate": (len(sl_defers) / rdefer) if rdefer else None,
|
|
1945
|
+
"defer_by_category": dict(_count_cat(sl_defers)),
|
|
1946
|
+
"defer_closed": closed,
|
|
1947
|
+
"defer_open": len(sl_defers) - closed,
|
|
1948
|
+
"closure_rate": (closed / len(sl_defers)) if sl_defers else None,
|
|
1949
|
+
"median_open_age_days": (statistics.median(open_ages) if open_ages else None),
|
|
1950
|
+
"rework_versions": rework_versions,
|
|
1951
|
+
}
|
|
1952
|
+
|
|
1953
|
+
clusters, scattered = cluster_defers(defers)
|
|
1954
|
+
totals = _totals(slices, defers)
|
|
1955
|
+
art = harvest_artifact_tokens()
|
|
1956
|
+
code = harvest_code_tokens(unit_slice)
|
|
1957
|
+
churn = harvest_code_churn(unit_slice)
|
|
1958
|
+
# Gắn LOC committed (prod, đã gắn id) per-slice vào slice dict cho §1.
|
|
1959
|
+
for sid, sd in slices.items():
|
|
1960
|
+
cs = churn["by_slice"].get(sid)
|
|
1961
|
+
sd["code_added"] = cs["added"] if cs else 0
|
|
1962
|
+
sd["code_deleted"] = cs["deleted"] if cs else 0
|
|
1963
|
+
cost = build_cost(art, code, totals, load_token_log(refresh=refresh_burn), set(units))
|
|
1964
|
+
return {
|
|
1965
|
+
"slices": slices,
|
|
1966
|
+
"units": units,
|
|
1967
|
+
"defers": defers,
|
|
1968
|
+
"totals": totals,
|
|
1969
|
+
"clusters": clusters,
|
|
1970
|
+
"scattered": scattered,
|
|
1971
|
+
"cost": cost,
|
|
1972
|
+
"code_churn": churn,
|
|
1973
|
+
"drift": drift,
|
|
1974
|
+
"dd": dd,
|
|
1975
|
+
"removed_slices": removed_slices,
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
|
|
1979
|
+
def _count_cat(defers):
|
|
1980
|
+
c = defaultdict(int)
|
|
1981
|
+
for d in defers:
|
|
1982
|
+
c[d["category"]] += 1
|
|
1983
|
+
return c
|
|
1984
|
+
|
|
1985
|
+
|
|
1986
|
+
def _totals(slices, defers):
|
|
1987
|
+
ac = sum(s["ac_total"] for s in slices.values())
|
|
1988
|
+
patch = sum(s["review_patch"] for s in slices.values())
|
|
1989
|
+
# FPY tổng: cùng nguồn AC-bearing như per-slice (xem build()), không phải
|
|
1990
|
+
# patch/ac thô — gộp tử/mẫu đã lọc rồi mới chia + clamp.
|
|
1991
|
+
fpy_ac = sum(s["fpy_ac"] for s in slices.values())
|
|
1992
|
+
fpy_patch = sum(s["fpy_patch"] for s in slices.values())
|
|
1993
|
+
fpy_func = sum(s["fpy_func"] for s in slices.values())
|
|
1994
|
+
units_clean = sum(s["units_func_clean"] for s in slices.values())
|
|
1995
|
+
units_ab = sum(s["units_ac_bearing"] for s in slices.values())
|
|
1996
|
+
func_patch = sum(s["functional_patch"] for s in slices.values())
|
|
1997
|
+
patch_excl = sum(s["patch_excluded"] for s in slices.values())
|
|
1998
|
+
patch_uncl = sum(s["patch_unclassified"] for s in slices.values())
|
|
1999
|
+
excl_by = defaultdict(int)
|
|
2000
|
+
for s in slices.values():
|
|
2001
|
+
for k, v in (s.get("patch_excluded_by") or {}).items():
|
|
2002
|
+
excl_by[k] += v
|
|
2003
|
+
closed = sum(1 for d in defers if d["status"] == "closed")
|
|
2004
|
+
rich = [d for d in defers if d["avoidable"] is not None] # G1: chỉ record giàu
|
|
2005
|
+
rdefer = sum(s["review_defer"] for s in slices.values())
|
|
2006
|
+
return {
|
|
2007
|
+
"ac_total": ac,
|
|
2008
|
+
"review_patch": patch,
|
|
2009
|
+
"review_defer": rdefer,
|
|
2010
|
+
"defer_count": len(defers),
|
|
2011
|
+
"defer_avoidable": sum(1 for d in rich if d["avoidable"]),
|
|
2012
|
+
"defer_rich": len(rich),
|
|
2013
|
+
"defer_bullet": len(defers) - len(rich),
|
|
2014
|
+
# G1: tỉ lệ defer review-time được ghi vào sổ deferred-work.md.
|
|
2015
|
+
"defer_capture_rate": (len(defers) / rdefer) if rdefer else None,
|
|
2016
|
+
"defer_closed": closed,
|
|
2017
|
+
"closure_rate": (closed / len(defers)) if defers else None,
|
|
2018
|
+
# F-FPY headline = unit-incidence chức năng (xem build()).
|
|
2019
|
+
"fpy": (units_clean / units_ab) if units_ab else None,
|
|
2020
|
+
"units_func_clean": units_clean,
|
|
2021
|
+
"units_ac_bearing": units_ab,
|
|
2022
|
+
"ffpy_acnorm": (max(0.0, 1 - fpy_func / fpy_ac) if fpy_ac else None),
|
|
2023
|
+
"func_density": (fpy_func / fpy_ac) if fpy_ac else None,
|
|
2024
|
+
"sfpy": max(0.0, 1 - fpy_patch / fpy_ac) if fpy_ac else None,
|
|
2025
|
+
"patch_density": (fpy_patch / fpy_ac) if fpy_ac else None,
|
|
2026
|
+
"functional_patch": func_patch,
|
|
2027
|
+
"patch_excluded": patch_excl,
|
|
2028
|
+
"patch_unclassified": patch_uncl,
|
|
2029
|
+
"patch_excluded_by": dict(excl_by),
|
|
2030
|
+
"defer_by_category": dict(_count_cat(defers)),
|
|
2031
|
+
}
|
|
2032
|
+
|
|
2033
|
+
|
|
2034
|
+
def render_scorecard(data, run_meta=None):
|
|
2035
|
+
s = data["slices"]
|
|
2036
|
+
order = sorted(s.keys(), key=lambda x: int(re.search(r"\d+", x).group()))
|
|
2037
|
+
L = []
|
|
2038
|
+
w = L.append
|
|
2039
|
+
w("# Báo cáo đánh giá quy trình code bằng AI (bản nền)\n")
|
|
2040
|
+
if run_meta:
|
|
2041
|
+
w(f"**Ngày đánh giá:** {run_meta['date']} · **Lần đánh giá thứ:** {run_meta['round']}\n")
|
|
2042
|
+
bym = (data.get("cost") or {}).get("by_model") or {}
|
|
2043
|
+
if bym:
|
|
2044
|
+
w(f"**Model AI đã dùng:** {model_share(bym)} *(tỉ lệ tính theo tổng token input+output)*\n")
|
|
2045
|
+
w("> Báo cáo này do `scripts/eval-harvester.py` **tự đọc các tài liệu Stage 1–5 rồi đếm ra số**, "
|
|
2046
|
+
"KHÔNG phải nhận xét chủ quan của con người. Mỗi con số chỉ phản ánh đúng những gì tài liệu ghi lại; "
|
|
2047
|
+
"muốn biết chỗ nào dễ sai, đọc mục **6. Giới hạn** trước khi kết luận.\n")
|
|
2048
|
+
w(f"**Phạm vi:** {len(order)} lát cắt (slice) — {', '.join(order)}. "
|
|
2049
|
+
"*Lát cắt (slice) = một mảng tính năng làm trọn vẹn từ thiết kế đến code+test.*\n")
|
|
2050
|
+
dd0 = data.get("dd") or {}
|
|
2051
|
+
rmv_units = dd0.get("removed_units") or []
|
|
2052
|
+
rmv_slices = data.get("removed_slices") or []
|
|
2053
|
+
if rmv_units:
|
|
2054
|
+
by_cr = dd0.get("removed_by_cr") or {}
|
|
2055
|
+
crbits = "; ".join(f"**{cr}** xóa {', '.join(us)}" for cr, us in by_cr.items())
|
|
2056
|
+
emptied = ", ".join(f"{r['slice']} ({', '.join(r['units'])})" for r in rmv_slices)
|
|
2057
|
+
emptynote = (f" Trong đó **{len(rmv_slices)}** lát cắt không còn unit sống chấm điểm "
|
|
2058
|
+
f"được sau khi loại scope-removal ({emptied}) → bỏ khỏi bảng tổng hợp "
|
|
2059
|
+
"(trước đây các lát cắt này bị chấm FPY DỰA TRÊN unit đã xóa)."
|
|
2060
|
+
if rmv_slices else "")
|
|
2061
|
+
w(f"> 🚫 **Phạm vi bị CR xóa (trục C — KHÔNG tính là sản phẩm):** {len(rmv_units)} feature "
|
|
2062
|
+
f"đã bị xóa hẳn — {crbits}. Các unit này đã **loại khỏi mọi chấm điểm FPY/AC/slice** "
|
|
2063
|
+
f"(tombstone DD `dd_version: v*-removed`).{emptynote} Effort thiết kế+story từng đổ vào "
|
|
2064
|
+
"scope này là **lãng phí trục-C**, không phải output — xem §3c.\n")
|
|
2065
|
+
|
|
2066
|
+
w("\n## 1. Bảng tổng hợp từng lát cắt\n")
|
|
2067
|
+
w("> Mỗi cột là một lát cắt; mỗi dòng là một chỉ số. Các chỉ số được xếp theo **4 nhóm kể "
|
|
2068
|
+
"thành một mạch** — đọc từ trên xuống là đi hết vòng đời một lát cắt:\n"
|
|
2069
|
+
">\n"
|
|
2070
|
+
"> **① Quy mô** (làm bao nhiêu) → **② Chất lượng ngay lần đầu** (code sạch tới đâu trước khi sửa) "
|
|
2071
|
+
"→ **③ Độ ổn định** (yêu cầu & thiết kế có phải làm đi làm lại không) → **④ Nợ để lại** "
|
|
2072
|
+
"(việc đã biết nhưng cố ý hoãn sang sau).\n"
|
|
2073
|
+
">\n"
|
|
2074
|
+
"> Tên viết tắt (FPY, EFF-…) giữ để tra cứu, nhưng luôn kèm nghĩa tiếng Việt.\n")
|
|
2075
|
+
w("| Chỉ số | " + " | ".join(order) + " |")
|
|
2076
|
+
w("|---|" + "|".join(["---"] * len(order)) + "|")
|
|
2077
|
+
GROUP = object() # dòng tiêu đề nhóm (label-only, các ô lát cắt để trống)
|
|
2078
|
+
rows = [
|
|
2079
|
+
(GROUP, "▸ ① QUY MÔ — lát cắt này gồm những gì"),
|
|
2080
|
+
("Số đơn vị code (unit)", lambda x: str(len(x["units"]))),
|
|
2081
|
+
("Kiểu chạy (AFK tự động / HITL có người duyệt)", lambda x: x["type"] or "?"),
|
|
2082
|
+
("Số tiêu chí nghiệm thu (AC)", lambda x: str(x["ac_total"])),
|
|
2083
|
+
(GROUP, "▸ ② TÍNH NĂNG CHẠY ĐÚNG NGAY LẦN ĐẦU — đo đúng-spec, không tính gia cố"),
|
|
2084
|
+
("Số lỗi review phải sửa (tổng Patch)", lambda x: str(x["review_patch"])),
|
|
2085
|
+
(" ↳ lỗi CHỨC NĂNG (Acceptance) / gia cố (bảo mật·edge·chất lượng) / chưa rõ",
|
|
2086
|
+
lambda x: f"{x['functional_patch']}/{x['patch_excluded']}/{x['patch_unclassified']}"
|
|
2087
|
+
+ (" ⚠️suy luận" if x.get("patch_inferred") else "")),
|
|
2088
|
+
("**Tính năng chạy đúng ngay lần đầu — F-FPY** (% feature KHÔNG lỗi chức năng; càng cao càng tốt)",
|
|
2089
|
+
lambda x: fmt_pct(x["fpy"])),
|
|
2090
|
+
(" ↳ theo mật độ AC (1 − lỗi-chức-năng/AC; dịu hơn, không nhị phân hoá cả unit)",
|
|
2091
|
+
lambda x: fmt_pct(x["ffpy_acnorm"])),
|
|
2092
|
+
("Yield gồm CẢ gia cố — SFPY (số FPY kiểu cũ; F-FPY≫SFPY = chạy được nhưng tốn công gia cố)",
|
|
2093
|
+
lambda x: fmt_pct(x["sfpy"])),
|
|
2094
|
+
(GROUP, "▸ ③ ĐỘ ỔN ĐỊNH — yêu cầu & thiết kế có phải làm lại không"),
|
|
2095
|
+
("Số yêu cầu đổi giữa chừng (hủy/sửa/hoãn AC)", lambda x: str(x["ac_churn"])),
|
|
2096
|
+
("Tỉ lệ yêu cầu đổi giữa chừng (càng thấp càng ổn định)", lambda x: fmt_pct(x["ac_churn_rate"])),
|
|
2097
|
+
("Số lần làm khác thiết kế (Deviation)", lambda x: str(x["deviations"])),
|
|
2098
|
+
("Dòng code thêm/xoá đã commit (LOC +/−, prod đã gắn id)", lambda x: f"+{x['code_added']}/−{x['code_deleted']}"),
|
|
2099
|
+
("Số lần làm lại thiết kế (phiên bản DD)", lambda x: f"v{x['rework_versions']}"),
|
|
2100
|
+
("Số lần cập nhật sau khi tạo (Change Log, đã trừ dòng khai sinh)", lambda x: str(x["changelog_rows"])),
|
|
2101
|
+
(GROUP, "▸ ④ NỢ ĐỂ LẠI — việc đã biết nhưng cố ý hoãn sang sau"),
|
|
2102
|
+
("**Việc bị hoãn lại** (đang mở / đã đóng)", lambda x: f"{x['defer_count']} ({x['defer_open']}/{x['defer_closed']})"),
|
|
2103
|
+
("**Defer review ghi vào sổ — G1** (sổ ÷ review-defer)", lambda x: fmt_pct(x["defer_capture_rate"])),
|
|
2104
|
+
("Trong đó: lẽ ra tránh được", lambda x: str(x["defer_avoidable"])),
|
|
2105
|
+
("**Tỉ lệ nợ lẽ-ra-tránh-được — EFF-7** (càng thấp càng tốt)", lambda x: fmt_pct(x["avoidability_index"])),
|
|
2106
|
+
("**Tỉ lệ nợ đã xử lý xong — EFF-8** (càng cao càng tốt)", lambda x: fmt_pct(x["closure_rate"])),
|
|
2107
|
+
("Số ngày trung bình nợ còn treo (EFF-8)", lambda x: ("—" if x["median_open_age_days"] is None else str(int(x["median_open_age_days"])))),
|
|
2108
|
+
]
|
|
2109
|
+
blanks = " | ".join([""] * len(order))
|
|
2110
|
+
for entry in rows:
|
|
2111
|
+
if entry[0] is GROUP:
|
|
2112
|
+
w(f"| **{entry[1]}** | {blanks} |")
|
|
2113
|
+
else:
|
|
2114
|
+
label, fn = entry
|
|
2115
|
+
w(f"| {label} | " + " | ".join(fn(s[o]) for o in order) + " |")
|
|
2116
|
+
bsm = (data.get("cost") or {}).get("by_slice_model") or {}
|
|
2117
|
+
if bsm:
|
|
2118
|
+
def slice_models(sid):
|
|
2119
|
+
return model_share(bsm.get(sid) or {}) if bsm.get(sid) else "—"
|
|
2120
|
+
w("| Model AI dùng (% token) | " + " | ".join(slice_models(o) for o in order) + " |")
|
|
2121
|
+
w("\n*Cách đọc nhanh — lần theo đúng 4 nhóm:* "
|
|
2122
|
+
"**② F-FPY thấp** → tính năng KHÔNG chạy đúng spec ngay lần đầu (Acceptance Auditor phải sửa "
|
|
2123
|
+
"lỗi luồng chính/AC). *F-FPY chỉ đếm lỗi chức năng; lỗi bảo mật/edge/chất lượng nằm ở SFPY — "
|
|
2124
|
+
"F-FPY cao nhưng SFPY thấp = feature chạy được nhưng tốn nhiều công gia cố.* "
|
|
2125
|
+
"**③ Tỉ lệ đổi-giữa-chừng cao / Deviation nhiều / DD lên nhiều phiên bản** → yêu cầu & thiết kế "
|
|
2126
|
+
"chưa được chốt kỹ trước khi code. "
|
|
2127
|
+
"**④ Tỉ lệ nợ tránh-được cao** → phần lớn việc bị hoãn là do quy trình, không phải lý do khách quan.\n")
|
|
2128
|
+
|
|
2129
|
+
w("\n## 2. Việc bị hoãn lại — phân theo lý do\n")
|
|
2130
|
+
w("> \"Việc bị hoãn\" (defer) = phần đã biết nhưng cố ý để làm sau. Chia 2 nhóm: "
|
|
2131
|
+
"**hợp lệ** (lý do khách quan, ngoài tầm kiểm soát) và **lẽ ra tránh được** (in đậm — nợ do quy trình). "
|
|
2132
|
+
"Mục tiêu là kéo nhóm tránh-được về 0.\n")
|
|
2133
|
+
# G1 — đối soát defer: review sinh bao nhiêu vs sổ deferred-work.md ghi bao nhiêu.
|
|
2134
|
+
t0 = data["totals"]
|
|
2135
|
+
trd, tdc, cap = t0["review_defer"], t0["defer_count"], t0.get("defer_capture_rate")
|
|
2136
|
+
if trd and (tdc == 0 or (cap is not None and cap < 0.5)):
|
|
2137
|
+
w(f"> ⚠️ **Lỗ hổng truy vết defer (G1):** review sinh **{trd}** defer "
|
|
2138
|
+
f"(`[Review][Defer]` trong story) nhưng sổ `deferred-work.md` chỉ đọc được **{tdc}** "
|
|
2139
|
+
f"(**{fmt_pct(cap)}** ghi sổ). Phần thiếu = nợ đã nhận diện nhưng **mất dấu** — "
|
|
2140
|
+
"không phân biệt được \"sạch nợ\" với \"không ghi sổ\". Xem `harvester_upgrade.md` G1.\n")
|
|
2141
|
+
elif trd:
|
|
2142
|
+
bullet = t0.get("defer_bullet", 0)
|
|
2143
|
+
w(f"> **Đối soát defer (G1):** {tdc}/{trd} defer review-time có trong sổ "
|
|
2144
|
+
f"(**{fmt_pct(cap)}** ghi sổ; {bullet} từ bullet `## Deferred from:`, "
|
|
2145
|
+
f"{t0.get('defer_rich', 0)} từ block `### DEF-`). "
|
|
2146
|
+
"*Capture-rate là tín hiệu định hướng — sổ có thể chứa defer ngoài review nên không phải 1:1.*\n")
|
|
2147
|
+
cats = DEFER_CATEGORY_ORDER + ["uncategorized"]
|
|
2148
|
+
w("| Lý do hoãn | " + " | ".join(order) + " | Tổng | Đánh giá bản chất |")
|
|
2149
|
+
w("|---|" + "|".join(["---"] * (len(order) + 2)) + "|")
|
|
2150
|
+
nature = {"contract-blocked": "chờ chốt hợp đồng API bên ngoài → hợp lệ",
|
|
2151
|
+
"arch-limit": "giới hạn kiến trúc đã biết, cố ý → hợp lệ",
|
|
2152
|
+
"asset-gap": "chờ tài nguyên/thiết kế bên ngoài → hợp lệ",
|
|
2153
|
+
"scope-deferred": "chủ động cắt bớt phạm vi → hợp lệ",
|
|
2154
|
+
"test-deferred": "**bỏ viết test → nợ quy trình (tránh được)**",
|
|
2155
|
+
"cross-slice-dep": "**chờ lát cắt khác xong → nợ điều phối (tránh được)**",
|
|
2156
|
+
"deferred-bug": "**bug/UX để lại làm sau → tránh được**",
|
|
2157
|
+
"security-hardening": "**gia cố bảo mật để sau → tránh được**",
|
|
2158
|
+
"uncategorized": "chưa ghi rõ lý do"}
|
|
2159
|
+
label_cat = {"contract-blocked": "Chờ hợp đồng API", "arch-limit": "Giới hạn kiến trúc",
|
|
2160
|
+
"asset-gap": "Thiếu tài nguyên", "scope-deferred": "Cắt phạm vi",
|
|
2161
|
+
"test-deferred": "Bỏ test", "cross-slice-dep": "Phụ thuộc lát cắt khác",
|
|
2162
|
+
"deferred-bug": "Bug để sau", "security-hardening": "Bảo mật để sau",
|
|
2163
|
+
"uncategorized": "Chưa phân loại"}
|
|
2164
|
+
tot = data["totals"]["defer_by_category"]
|
|
2165
|
+
for c in cats:
|
|
2166
|
+
if tot.get(c, 0) == 0:
|
|
2167
|
+
continue
|
|
2168
|
+
cells = [str(s[o]["defer_by_category"].get(c, 0)) for o in order]
|
|
2169
|
+
w(f"| {label_cat.get(c,c)} `{c}` | " + " | ".join(cells) + f" | {tot.get(c,0)} | {nature.get(c,'?')} |")
|
|
2170
|
+
t = data["totals"]
|
|
2171
|
+
if t["defer_count"]:
|
|
2172
|
+
rich = t.get("defer_rich", t["defer_count"]) # chỉ record có avoidable đã ghi
|
|
2173
|
+
bullet = t.get("defer_bullet", 0)
|
|
2174
|
+
if rich:
|
|
2175
|
+
avoid_pct = fmt_pct(t["defer_avoidable"] / rich) # mẫu số = record đã phân loại
|
|
2176
|
+
w(f"\n**Tổng cộng {t['defer_count']} việc bị hoãn**, trong đó {rich} việc đã phân loại — "
|
|
2177
|
+
f"**{t['defer_avoidable']} ({avoid_pct}) lẽ ra tránh được** (nợ do quy trình, nên ưu tiên xử lý).")
|
|
2178
|
+
else:
|
|
2179
|
+
w(f"\n**Tổng cộng {t['defer_count']} việc bị hoãn.**")
|
|
2180
|
+
if bullet:
|
|
2181
|
+
w(f" Trong đó **{bullet}** việc từ review (bullet `## Deferred from:`) **chưa phân loại** "
|
|
2182
|
+
"avoidable/category — cần enrich → block `### DEF-` để chấm (G1).")
|
|
2183
|
+
w("\n")
|
|
2184
|
+
else:
|
|
2185
|
+
w("\n**Chưa có việc hoãn nào được ghi nhận** — không có nợ quy trình để xử lý ở thời điểm này.\n")
|
|
2186
|
+
|
|
2187
|
+
w("\n## 2b. Gom nợ theo \"một hành động đóng được nhiều việc\"\n")
|
|
2188
|
+
w("> Nhiều việc bị hoãn thực ra cùng chờ MỘT điều kiện. Bảng này gom chúng lại: mỗi dòng là một hành động "
|
|
2189
|
+
"(hoặc sự kiện) mà khi xong sẽ đóng luôn nhiều việc cùng lúc — giúp biết nên ưu tiên làm gì. "
|
|
2190
|
+
"Dòng `— (rải rác)` = các việc không gom được, phải xử lý lẻ từng cái.\n")
|
|
2191
|
+
w("| Hành động đóng nợ | Số việc đóng được | Trong đó tránh-được | Thuộc lát cắt |")
|
|
2192
|
+
w("|---|--:|--:|---|")
|
|
2193
|
+
clusters = data["clusters"]
|
|
2194
|
+
for c in clusters:
|
|
2195
|
+
w(f"| `{c['action']}` | {c['count']} | {c['avoidable']} | {', '.join(c['slices'])} |")
|
|
2196
|
+
sc = data["scattered"]
|
|
2197
|
+
w(f"| **{sc['action']}** | {sc['count']} | {sc['avoidable']} | {', '.join(sc['slices'])} |")
|
|
2198
|
+
open_total = sum(c["count"] for c in clusters) + sc["count"]
|
|
2199
|
+
open_av = sum(c["avoidable"] for c in clusters) + sc["avoidable"]
|
|
2200
|
+
clustered_av = sum(c["avoidable"] for c in clusters) # closeable by 1 action / dependency event
|
|
2201
|
+
w(f"\n**Đang mở {open_av} việc tránh-được**: **{clustered_av} việc gom cụm được** "
|
|
2202
|
+
f"(chỉ cần làm xong 1 hành động/sự kiện là đóng cả cụm) + **{sc['avoidable']} việc rải rác** "
|
|
2203
|
+
"(phải xử lý từng cái). "
|
|
2204
|
+
f"→ Phần rải-rác chiếm {fmt_pct(sc['avoidable']/open_total) if open_total else 'n/a'} — "
|
|
2205
|
+
"đây mới là phần khó giải quyết thật sự (không có đòn bẩy chung).\n")
|
|
2206
|
+
|
|
2207
|
+
w("\n## 3. Lỗi sinh ra ở đâu, bắt được ở đâu (từng đơn vị code)\n")
|
|
2208
|
+
w("> Bảng truy ngược theo từng unit: nhiều lỗi review (Patch) + ít việc hoãn → lỗi bị dồn về cuối; "
|
|
2209
|
+
"ngược lại nhiều việc hoãn → vấn đề được nhận ra nhưng đẩy sang sau.\n")
|
|
2210
|
+
w("> Cột **Lỗi chức năng** = patch luồng chính/AC (trừ F-FPY); **Gia cố** = bảo mật·edge·chất lượng "
|
|
2211
|
+
"(không trừ F-FPY). `⚠️suy luận` = story không tag lăng kính review nên phải đoán từ nội dung.\n")
|
|
2212
|
+
w("| Đơn vị code | Lát cắt | Số AC | Lỗi chức năng | Gia cố | Tổng Patch | Việc hoãn | Làm khác thiết kế | Lần cập nhật sau tạo |")
|
|
2213
|
+
w("|---|---|--:|--:|--:|--:|--:|--:|--:|")
|
|
2214
|
+
for o in order:
|
|
2215
|
+
for u in s[o]["units"]:
|
|
2216
|
+
uu = data["units"].get(u)
|
|
2217
|
+
if not uu:
|
|
2218
|
+
continue
|
|
2219
|
+
note = " ⚠️(đếm gián tiếp)" if uu["ac_count_method"] in ("referenced", "plain-list") else ""
|
|
2220
|
+
fnote = " ⚠️suy luận" if uu.get("patch_class_method") == "inferred" else ""
|
|
2221
|
+
uncl = uu.get("patch_unclassified", 0)
|
|
2222
|
+
unote = f" (+{uncl}?)" if uncl else ""
|
|
2223
|
+
w(f"| {u} | {o} | {uu['ac_total']}{note} | {uu.get('functional_patch', 0)}{fnote} | "
|
|
2224
|
+
f"{uu.get('patch_excluded', 0)}{unote} | {uu['review_patch']} | "
|
|
2225
|
+
f"{uu['review_defer']} | {uu['deviations']} | {uu['changelog_rows']} |")
|
|
2226
|
+
|
|
2227
|
+
render_drift(w, data)
|
|
2228
|
+
render_dd(w, data)
|
|
2229
|
+
render_crosslayer(w, data)
|
|
2230
|
+
|
|
2231
|
+
w("\n## 4. Cảnh báo tự động — lát cắt nào cần chú ý\n")
|
|
2232
|
+
w("> Máy tự gắn cờ khi một chỉ số vượt ngưỡng đáng lo. Không có cờ = chỉ số trong vùng an toàn.\n")
|
|
2233
|
+
for o in order:
|
|
2234
|
+
x = s[o]
|
|
2235
|
+
flags = []
|
|
2236
|
+
if x["fpy"] is not None and x["fpy"] < 0.8:
|
|
2237
|
+
dens = x.get("func_density")
|
|
2238
|
+
extra = (f" — mật độ {fmt_ratio(dens)} lỗi-chức-năng/AC" if dens else "")
|
|
2239
|
+
inf = " *(suy luận — story không tag review)*" if x.get("patch_inferred") else ""
|
|
2240
|
+
flags.append(f"Tính-năng-chạy-đúng-lần-đầu chỉ {fmt_pct(x['fpy'])} (<80%){extra}{inf} → "
|
|
2241
|
+
"Acceptance Auditor phải sửa lỗi luồng chính/AC mà lẽ ra spec+design Stage 3–4 "
|
|
2242
|
+
"phải làm rõ trước")
|
|
2243
|
+
if x.get("patch_unclassified", 0) >= 3:
|
|
2244
|
+
flags.append(f"{x['patch_unclassified']} patch chưa phân loại được (không tag, không khớp lexicon) "
|
|
2245
|
+
"→ F-FPY của lát cắt này kém chắc; soi tay mục *Patch* để xác nhận chức năng hay gia cố")
|
|
2246
|
+
if x.get("unscored_patch_units"):
|
|
2247
|
+
flags.append(f"{len(x['unscored_patch_units'])} unit có lỗi review nhưng parser không đếm được AC "
|
|
2248
|
+
f"({', '.join(x['unscored_patch_units'])}) → đã loại khỏi F-FPY; kiểm tra mục "
|
|
2249
|
+
"*Acceptance Criteria* của các unit này có viết đúng style không")
|
|
2250
|
+
if x["ac_churn_rate"] and x["ac_churn_rate"] >= 0.15:
|
|
2251
|
+
flags.append(f"Yêu cầu đổi giữa chừng {fmt_pct(x['ac_churn_rate'])} (cao) → yêu cầu chưa chốt kỹ "
|
|
2252
|
+
"trước khi bắt tay code")
|
|
2253
|
+
if x["avoidability_index"] and x["avoidability_index"] >= 0.4:
|
|
2254
|
+
flags.append(f"{fmt_pct(x['avoidability_index'])} việc hoãn là loại tránh-được → phần lớn nợ do quy trình")
|
|
2255
|
+
if x["rework_versions"] >= 3:
|
|
2256
|
+
flags.append(f"Thiết kế đã làm lại tới phiên bản v{x['rework_versions']} → tốn nhiều vòng sửa thiết kế")
|
|
2257
|
+
if x["code_added"] and x["code_deleted"] / x["code_added"] >= 0.5:
|
|
2258
|
+
flags.append(f"Code viết-rồi-xoá nhiều (+{x['code_added']}/−{x['code_deleted']} dòng, "
|
|
2259
|
+
f"xoá ≈ {fmt_pct(x['code_deleted']/x['code_added'])} số dòng thêm) → thrash ở tầng code (EFFY-3b)")
|
|
2260
|
+
w(f"- **{o}**: " + ("; ".join(flags) if flags else "không có cảnh báo nào — ổn ✓"))
|
|
2261
|
+
|
|
2262
|
+
render_cost(w, data)
|
|
2263
|
+
|
|
2264
|
+
w("\n## 6. Giới hạn của báo cáo — đọc trước khi kết luận\n")
|
|
2265
|
+
w("> Báo cáo do máy đọc văn bản đếm ra, nên có những chỗ dễ lệch. Biết trước các giới hạn này để "
|
|
2266
|
+
"không hiểu sai con số.\n")
|
|
2267
|
+
w("- **Cách đếm số tiêu chí nghiệm thu (AC)**: máy thử 3 cách theo thứ tự ưu tiên — (1) đề mục đậm "
|
|
2268
|
+
"`**AC-N**`, (2) danh sách đánh số `N. **…**`. Cả hai đều đáng tin. Chỉ khi cả hai đều trượt mới rơi "
|
|
2269
|
+
"xuống (3) *đếm gián tiếp* (`⚠️`): gom mọi chuỗi `AC-N` xuất hiện trong phần AC rồi đếm số khác nhau — "
|
|
2270
|
+
"cách này dễ lệch (không nở dải `AC7–AC14`, đếm nhầm cả tham chiếu chéo) nên FPY của unit đó kém tin cậy. "
|
|
2271
|
+
"*Hiện chưa unit nào rơi vào cách (3); nếu thấy `⚠️` ở §3 thì mới cần dè chừng.*")
|
|
2272
|
+
w("- **F-FPY chỉ đo lỗi CHỨC NĂNG, không đo gia cố**: tử số chỉ gồm patch khiến *tính năng chạy "
|
|
2273
|
+
"sai spec/luồng chính* — bám theo lăng kính **Acceptance Auditor** của `/bmad-code-review`. Lỗi "
|
|
2274
|
+
"bảo mật, edge-case, chất lượng/convention **cố ý loại** (feature vẫn chạy, chỉ cần gia cố) → "
|
|
2275
|
+
"xem ở **SFPY** và cột *Gia cố* §3. Cách phân loại 3 tầng: (1) **tag lăng kính** `(auditor)`/`(blind+edge)` "
|
|
2276
|
+
"ở cuối bullet patch — tin cao; (2) story không tag → *suy luận* (`⚠️`): dẫn `AC-N` + động từ hỏng "
|
|
2277
|
+
"⇒ chức năng, còn lexicon bảo mật/edge/quality ⇒ gia cố; (3) không đủ tín hiệu → **chưa phân loại** "
|
|
2278
|
+
"(cột Gia cố ghi `(+N?)`), KHÔNG ngầm tính sạch. *6/17 story HUB không tag lăng kính → rơi tầng (2), "
|
|
2279
|
+
"F-FPY của chúng kém chắc hơn — đã gắn `⚠️suy luận`.* Ngưỡng severity (Critical/High) hiện CHƯA dùng "
|
|
2280
|
+
"để lọc; một AC-nit nhỏ vẫn tính như một lỗi chức năng.")
|
|
2281
|
+
w("- **Chưa đo được tốc độ làm việc**: mọi mốc thời gian trong Change Log đều ghi cùng một ngày, "
|
|
2282
|
+
"nên không tính được mất bao lâu cho mỗi bước. Muốn đo cần ghi mốc bắt đầu/kết thúc cho từng stage.")
|
|
2283
|
+
w("- **\"Số lần cập nhật sau khi tạo\"**: đếm số dòng Change Log có ngày rồi **trừ 1 dòng khai sinh** "
|
|
2284
|
+
"(dòng \"tạo story / scaffold\" đầu tiên) — để unit tạo-xong-là-done tính 0 lần sửa, không phải 1. "
|
|
2285
|
+
"Giả định dòng đầu luôn là dòng tạo; nếu một unit ghi Change Log bắt đầu giữa chừng (thiếu dòng tạo) "
|
|
2286
|
+
"thì con số sẽ bị hụt 1.")
|
|
2287
|
+
w("- **Có thể sót \"làm khác thiết kế\"**: máy chỉ bắt được khi ghi rõ là deviation; nếu viết lẫn trong "
|
|
2288
|
+
"đoạn văn dài thì có thể bỏ lọt.")
|
|
2289
|
+
w(f"- **Phân loại việc-hoãn do người ghi**: lý do/đánh-giá-tránh-được/trạng-thái lấy thẳng từ sổ "
|
|
2290
|
+
f"`deferred-work.md` (do người điền), không phải máy đoán. Tuổi nợ tính tới ngày mốc {AS_OF.isoformat()}.")
|
|
2291
|
+
w("- **Số liệu do AI tự khai**: số lần làm-khác-thiết-kế và việc-hoãn là do agent tự ghi, nên phụ thuộc "
|
|
2292
|
+
"mức độ trung thực khi ghi chép.")
|
|
2293
|
+
w("- **Dòng code thêm/xoá (LOC committed, §5.3b)**: đếm từ `git log --numstat` của **mọi code repo** phát "
|
|
2294
|
+
"hiện được (multi-repo FE+BE: gộp qua từng repo, mỗi repo chạy git log riêng). Churn của "
|
|
2295
|
+
"file đã **bị xoá hẳn** không quy được về prod/lát cắt (không còn header `id:`) → gom vào dòng \"Khác\". "
|
|
2296
|
+
"Repo brownfield **chưa gắn `id:` header** (code cũ Java/FE) sẽ rơi hết vào \"Khác\" và prod=0 — đó là theo "
|
|
2297
|
+
"thiết kế (attribution dựa header), không phải lỗi đọc. "
|
|
2298
|
+
"Đổi-tên file (nếu git không nhận diện được rename) bị tính thành xoá+thêm → có thể thổi nhẹ tỉ lệ thrash. "
|
|
2299
|
+
"Commit đầu của dự án brownfield dồn codebase cũ vào một lần làm cột \"thêm\" rất lớn (nhưng không thổi tỉ lệ "
|
|
2300
|
+
"vì gần như không có dòng xoá). LOC chỉ là **mẫu số chuẩn-hoá**, KHÔNG phải thước đo năng suất — nhiều dòng "
|
|
2301
|
+
"≠ nhiều giá trị.")
|
|
2302
|
+
w("- **Mẫu còn nhỏ** (3 lát cắt): chỉ nên xem là xu hướng, chưa đủ để kết luận chắc; dự án dựng lại từ "
|
|
2303
|
+
"code cũ (brownfield) thường có nhiều việc-hoãn/tái-sử-dụng hơn do nền tảng cũ.")
|
|
2304
|
+
w(f"- **Hai loại token khác nhau, đừng nhầm**: §5 có cả *token-proxy* (cân theo độ dài văn bản, ~{CHARS_PER_TOKEN} "
|
|
2305
|
+
"ký tự/token — KHÔNG phải tiền) và *token thật* (LLM thực sự xử lý, gồm cả đọc-lại ngữ cảnh + suy luận + "
|
|
2306
|
+
"thử lại, mới ra chi phí $). Token thật được tự gom từ nhật ký phiên Claude Code; nếu không có sẽ hiện `n/a`. "
|
|
2307
|
+
"Token code đếm theo file có dòng `id:` trong code repo; test `tests/` không gắn id thì đếm riêng, "
|
|
2308
|
+
"không quy về lát cắt nào.")
|
|
2309
|
+
return "\n".join(L) + "\n"
|
|
2310
|
+
|
|
2311
|
+
|
|
2312
|
+
def render_drift(w, data):
|
|
2313
|
+
"""§3b — Drift gate L3↔L2 (G8): lệch thiết kế ↔ hợp đồng bắt TRƯỚC khi vào code."""
|
|
2314
|
+
dr = data.get("drift") or {}
|
|
2315
|
+
w("\n## 3b. Lệch thiết kế ↔ hợp đồng bắt ở cổng thiết kế (drift L3↔L2 — G8)\n")
|
|
2316
|
+
if not dr.get("available") or not dr.get("reports"):
|
|
2317
|
+
w("> 🔴 Chưa đọc được drift report nào (`Stage_4_Design/ui_schema/drift_report_*.md`). "
|
|
2318
|
+
"Khi có, phần này đếm số lệch L3↔L2 chặn được ở cổng thiết kế trước khi code.\n")
|
|
2319
|
+
return
|
|
2320
|
+
w("> Mỗi unit UI sinh **drift report** đối chiếu thiết kế chi tiết (L3) ↔ hợp đồng dữ liệu (L2). "
|
|
2321
|
+
"**BLOCKING** = lệch chặn sinh schema (phải sửa trước khi code) · **RECONCILED** = blocking đã hoà giải "
|
|
2322
|
+
"tại cổng · **NON-BLOCKING** = lệch nhỏ ghi nhận. Bắt ở đây = chặn lỗi **trước** Stage 5 (code). "
|
|
2323
|
+
"*Heuristic đếm theo cấu trúc văn bản, dedup re-run theo ngày mới nhất.*\n")
|
|
2324
|
+
b, r, nb = dr["blocking"], dr["reconciled"], dr["nonblocking"]
|
|
2325
|
+
w(f"- **{dr['reports']}** unit có drift report; **{dr['halted']}** unit bị HALT Phase B vì còn blocking.")
|
|
2326
|
+
w(f"- **Tổng lệch bắt ở cổng thiết kế: {b + r + nb}** — "
|
|
2327
|
+
f"**{b}** blocking đang mở · **{r}** blocking đã hoà giải · **{nb}** non-blocking.")
|
|
2328
|
+
if dr["res_l2"] + dr["res_l3"]:
|
|
2329
|
+
w(f"- Hướng hoà giải (ai là chuẩn): **L2 hợp đồng thắng {dr['res_l2']}** lần · "
|
|
2330
|
+
f"**L3 thiết kế phải sửa {dr['res_l3']}** lần" +
|
|
2331
|
+
(" — L2 thắng nhiều hơn ⇒ phần lớn là thiết kế lệch khỏi hợp đồng dữ liệu."
|
|
2332
|
+
if dr["res_l3"] >= dr["res_l2"] else "."))
|
|
2333
|
+
w("")
|
|
2334
|
+
w("| Unit | Ngày | Blocking (mở) | Đã hoà giải | Non-blocking | Cổng thiết kế |")
|
|
2335
|
+
w("|---|---|--:|--:|--:|---|")
|
|
2336
|
+
for unit, rec in dr["by_unit"].items():
|
|
2337
|
+
gate = "⛔ HALT" if rec["gate_outcome"] == "halted" else "✅ qua"
|
|
2338
|
+
w(f"| {unit} | {rec['date'] or '—'} | {rec['blocking']} | {rec['reconciled']} | "
|
|
2339
|
+
f"{rec['nonblocking']} | {gate} |")
|
|
2340
|
+
w("\n*Cách đọc: blocking-đang-mở cao = thiết kế còn lệch hợp đồng chưa chốt; đã-hoà-giải cao = cổng "
|
|
2341
|
+
"đang làm đúng việc (bắt & ép sửa trước khi code); non-blocking = nợ nhỏ ghi vào `_drift_notes` schema.*\n")
|
|
2342
|
+
|
|
2343
|
+
|
|
2344
|
+
def render_dd(w, data):
|
|
2345
|
+
"""§3c — CR & drift trong Detailed Design L3 (G10): bù trục C từ tầng thiết kế."""
|
|
2346
|
+
dd = data.get("dd") or {}
|
|
2347
|
+
w("\n## 3c. CR & lệch thiết kế trong Đặc tả chi tiết (L3 — G10)\n")
|
|
2348
|
+
if not dd.get("available") or not dd.get("files"):
|
|
2349
|
+
w("> 🔴 Chưa đọc được file `detailed_design/*_detailed_design.md` nào. Khi có, phần này đếm "
|
|
2350
|
+
"CR (bảng lịch sử thay đổi), lệch thiết kế L3↔TechSpec (§1.2) và quyết định treo `[TBD]`.\n")
|
|
2351
|
+
return
|
|
2352
|
+
w("> Mỗi DD chứa **bảng lịch sử thay đổi** (số lần sửa thiết kế) + (với feature có lệch) "
|
|
2353
|
+
"**section drift/inheritance-audit §1.x**. Tín hiệu **bổ sung** cho §3b: §3b đo drift **UI** (L3↔L2 "
|
|
2354
|
+
"schema, file `drift_report`); §3c đo drift **L3↔TechSpec** + lịch sử sửa DD — nguồn drift DUY NHẤT cho "
|
|
2355
|
+
"feature **BE** (không có UI schema). *Drift chấm theo **verdict per-unit** (resolved / flags / none) — "
|
|
2356
|
+
"KHÔNG đếm per-item `Dn` vì ID drift đa convention & status nằm ở cấp section, đếm thô ra số sai.*\n")
|
|
2357
|
+
ct, tk = dd["cr_total"], dd["cr_ticketed"]
|
|
2358
|
+
bt = dd.get("by_type") or {}
|
|
2359
|
+
amd = " · ".join(f"{k}={bt[k]}" for k in ("A", "M", "D") if bt.get(k)) or "—"
|
|
2360
|
+
ticknote = (f"; trong đó **{tk}** có link CR/Jira ngoài chính thức" if tk else
|
|
2361
|
+
"; **không dòng nào** link CR/Jira ngoài chính thức → mọi lần sửa là vòng lặp thiết kế nội bộ")
|
|
2362
|
+
rmv = dd.get("removed_units") or []
|
|
2363
|
+
rmv_note = (f" (+ **{len(rmv)}** tombstone bị XÓA theo CR — tách riêng bên dưới, "
|
|
2364
|
+
"KHÔNG tính vào mẫu số)" if rmv else "")
|
|
2365
|
+
w(f"- **{dd['files']}** DD sống đọc được{rmv_note}; tổng **{ct}** lần sửa thiết kế "
|
|
2366
|
+
f"(dòng change-history){ticknote}. Loại thay đổi: {amd} *(A=tạo mới, M=sửa, D=xoá)*.")
|
|
2367
|
+
if rmv:
|
|
2368
|
+
by_cr = dd.get("removed_by_cr") or {}
|
|
2369
|
+
crbits = " · ".join(f"**{cr}**: {', '.join(us)}" for cr, us in by_cr.items())
|
|
2370
|
+
w(f"- 🚫 **Scope-removal (trục C):** **{len(rmv)}** feature bị XÓA hẳn theo CR — "
|
|
2371
|
+
f"{crbits}. DD đã gut thành tombstone (`dd_version: v*-removed`). Các unit này đã "
|
|
2372
|
+
"**loại khỏi mẫu số §3c VÀ khỏi mọi chấm điểm FPY/AC/slice** (§1/§A) — không tính "
|
|
2373
|
+
"là deliverable sống. Effort thiết kế+story từng đổ vào scope sắp xóa là **lãng phí "
|
|
2374
|
+
"trục-C**, không phải output.")
|
|
2375
|
+
vc = dd.get("verdict_counts") or {}
|
|
2376
|
+
nres, nflag, nnone = vc.get("resolved", 0), vc.get("flags", 0), vc.get("none", 0)
|
|
2377
|
+
flagged = dd.get("flagged_units") or []
|
|
2378
|
+
if nres or nflag:
|
|
2379
|
+
flagnote = (f" — **{', '.join(flagged)}**" if flagged else "")
|
|
2380
|
+
w(f"- **Drift L3↔TechSpec (verdict per-unit):** **{nres}** unit resolved (mọi finding đã land, "
|
|
2381
|
+
f"kể cả fix tại L2/Module-0/WBS) · **{nflag}** unit còn **flags** (≥1 finding treo){flagnote} · "
|
|
2382
|
+
f"{nnone} unit có section nhưng không drift finding." +
|
|
2383
|
+
(" Không unit nào còn flag ⇒ cổng thiết kế L3 đang ép hoà giải trước khi code."
|
|
2384
|
+
if nflag == 0 else " Các unit flags cần review nợ thiết kế trước khi đóng."))
|
|
2385
|
+
else:
|
|
2386
|
+
w("- Không DD nào surface section drift/inheritance-audit (feature đơn giản, không lệch).")
|
|
2387
|
+
if dd["tbd_confirm"]:
|
|
2388
|
+
w(f"- **{dd['tbd_confirm']}** quyết định thiết kế còn treo (`[TBD]`/`[TBD-confirm]`) — defer ở tầng thiết kế, "
|
|
2389
|
+
"cần chốt trước khi đóng feature.")
|
|
2390
|
+
w("")
|
|
2391
|
+
w("| Unit | Bản DD | Lần sửa DD | có ticket | Drift verdict | finding treo/tổng | TBD |")
|
|
2392
|
+
w("|---|---|--:|--:|:--|--:|--:|")
|
|
2393
|
+
VMARK = {"resolved": "✅ resolved", "flags": "⚠️ flags", "none": "—",
|
|
2394
|
+
"removed": "🚫 XÓA (CR)"}
|
|
2395
|
+
for unit, rec in dd["by_unit"].items():
|
|
2396
|
+
ver = rec.get("version") or "—"
|
|
2397
|
+
vt = VMARK.get(rec.get("drift_verdict"), "—")
|
|
2398
|
+
fc = f"{rec['drift_open']}/{rec['drift_findings']}" if rec["drift_findings"] else "—"
|
|
2399
|
+
tb = rec["tbd"] or "—"
|
|
2400
|
+
tk = rec["cr_ticketed"] or "—"
|
|
2401
|
+
w(f"| {unit} | {ver} | {rec['cr_total']} | {tk} | {vt} | {fc} | {tb} |")
|
|
2402
|
+
w("\n*Cách đọc: lần-sửa-DD cao = thiết kế churn nhiều sau khi tạo (yêu cầu/thiết kế chưa ổn định); "
|
|
2403
|
+
"verdict **flags** = ≥1 finding drift còn treo (TBD / cần upstream / build trên mock) — nợ thiết kế "
|
|
2404
|
+
"cần đóng; **resolved** = mọi finding đã land (sửa L3 hoặc L2 đều tính); TBD = quyết định thiết kế đang "
|
|
2405
|
+
"hoãn. Cột 'có ticket' = số lần sửa truy được CR/Jira ngoài (— = sửa nội bộ, không ticket).*\n")
|
|
2406
|
+
|
|
2407
|
+
|
|
2408
|
+
def render_crosslayer(w, data):
|
|
2409
|
+
"""§3d — Drift & điều chỉnh tài liệu XUYÊN TẦNG L2 → L3 → Story. Tổng hợp lại 3
|
|
2410
|
+
nguồn đã có (G8 drift_report UI, G10 DD inheritance/TechSpec audit, deviation +
|
|
2411
|
+
change-log story) thành 2 bảng: (A) tỉ lệ drift xuôi dòng, (B) chiều điều chỉnh
|
|
2412
|
+
tài liệu 2 chiều. Consumer-only — không thêm parser, chỉ chiếu lại số đã đếm."""
|
|
2413
|
+
dd = data.get("dd") or {}
|
|
2414
|
+
dr = data.get("drift") or {}
|
|
2415
|
+
removed = set(dd.get("removed_units") or [])
|
|
2416
|
+
units = {u: v for u, v in (data.get("units") or {}).items() if u not in removed}
|
|
2417
|
+
N = len(units)
|
|
2418
|
+
w("\n## 3d. Drift & điều chỉnh tài liệu xuyên tầng (L2 → L3 → Story)\n")
|
|
2419
|
+
if not N:
|
|
2420
|
+
w("> Chưa đủ dữ liệu unit để tính drift xuyên tầng.\n")
|
|
2421
|
+
return
|
|
2422
|
+
w("> Gộp 3 nguồn đã đo ở §3b/§3c/§1 theo **ranh giới tầng tài liệu**: "
|
|
2423
|
+
"**L2** = thượng nguồn của thiết kế (HLD / Module-0 / TechSpec) · **L3** = Đặc tả chi "
|
|
2424
|
+
"tiết (DD) · **Story** = story build Stage-5. *Drift = tầng dưới lệch khỏi tầng trên; "
|
|
2425
|
+
"điều chỉnh 2 chiều = khi phát hiện lệch thì sửa tầng dưới (xuôi) hay đẩy ngược sửa tầng "
|
|
2426
|
+
"trên (escalate).* Mẫu số = **%d** unit sống (đã loại tombstone scope-removal).\n" % N)
|
|
2427
|
+
|
|
2428
|
+
# --- Bảng A: drift xuôi dòng (unit-incidence, KHÔNG đếm per-item) ---
|
|
2429
|
+
g8u = {u for u, r in (dr.get("by_unit") or {}).items()
|
|
2430
|
+
if u not in removed and (r["blocking"] + r["reconciled"] + r["nonblocking"]) > 0}
|
|
2431
|
+
g10u = {u for u, r in (dd.get("by_unit") or {}).items()
|
|
2432
|
+
if u not in removed and r.get("drift_findings", 0) > 0}
|
|
2433
|
+
l2l3 = g8u | g10u
|
|
2434
|
+
devu = {u for u, v in units.items() if v["deviations"] > 0}
|
|
2435
|
+
w("\n**A. Tỉ lệ drift xuôi dòng** — **đơn vị đo: SỐ UNIT** *(1 unit có nhiều drift vẫn "
|
|
2436
|
+
"tính 1; đo theo unit chứ không theo per-item vì ID drift đa convention, xem §3c)*\n")
|
|
2437
|
+
w("| Ranh giới tầng | Đơn vị lệch / tổng (số unit) | Tỉ lệ drift (% unit) | Tín hiệu nguồn |")
|
|
2438
|
+
w("|---|--:|--:|:--|")
|
|
2439
|
+
w(f"| **L2 → L3** (Kiến trúc → Thiết kế chi tiết) | {len(l2l3)}/{N} | "
|
|
2440
|
+
f"**{fmt_pct(len(l2l3)/N)}** | drift_report UI ({len(g8u)} unit, G8) ∪ "
|
|
2441
|
+
f"inheritance/TechSpec audit DD ({len(g10u)} unit, G10) |")
|
|
2442
|
+
devnote = (f"{len(devu)}/{N}", fmt_pct(len(devu) / N)) if devu else ("0/%d" % N, "0%")
|
|
2443
|
+
w(f"| **L3 → Story** (Thiết kế chi tiết → Story build) | {devnote[0]} | "
|
|
2444
|
+
f"**{devnote[1]}** | Deviation \"làm khác thiết kế\" trong story |")
|
|
2445
|
+
if not devu:
|
|
2446
|
+
w("\n> ⚠️ *L3→Story = 0 vì story KHÔNG ghi token `DEVIATION` nào (format chưa được skill "
|
|
2447
|
+
"phát) — KHÔNG kết luận \"story bám sát thiết kế tuyệt đối\". Đọc kèm **AC đổi giữa "
|
|
2448
|
+
"chừng** (§1, ac_churn) và **lỗi review phải sửa** (§1, patch) làm tín hiệu thay thế cho "
|
|
2449
|
+
"độ lệch story↔thiết kế.*")
|
|
2450
|
+
|
|
2451
|
+
# --- Bảng B: chiều điều chỉnh tài liệu 2 chiều ---
|
|
2452
|
+
rl2, rl3 = dr.get("res_l2", 0), dr.get("res_l3", 0)
|
|
2453
|
+
tot_res = rl2 + rl3
|
|
2454
|
+
esc = fmt_pct(rl2 / tot_res) if tot_res else "—"
|
|
2455
|
+
l3_rev = dd.get("cr_total", 0)
|
|
2456
|
+
story_rev = sum(v["changelog_rows"] for v in units.values())
|
|
2457
|
+
w("\n**B. Điều chỉnh tài liệu 2 chiều** — **đơn vị đo: SỐ LẦN** *(khi có lệch: sửa tầng dưới "
|
|
2458
|
+
"cho khớp = xuôi; sửa ngược tầng trên = escalate). ⚠️ 2 hàng dùng 2 counter khác nhau: "
|
|
2459
|
+
"L2↔L3 đếm **lần marker** `[L2]`/`[L3]`, L3↔Story đếm **dòng change-log** → KHÔNG so chéo "
|
|
2460
|
+
"giữa 2 hàng, chỉ đọc chiều xuôi/ngược trong cùng 1 hàng.*\n")
|
|
2461
|
+
w("| Ranh giới | Sửa tầng DƯỚI — xuôi (số lần) | Đẩy ngược sửa TRÊN (số lần) | "
|
|
2462
|
+
"Tỉ lệ escalate ngược (lần/lần) | Đơn vị đếm + nguồn |")
|
|
2463
|
+
w("|---|--:|--:|--:|:--|")
|
|
2464
|
+
w(f"| **L2 ↔ L3** | {rl3} | {rl2} | **{esc}** | "
|
|
2465
|
+
"số lần marker `[L3]`/`[L2]` trong drift_report (G8) |")
|
|
2466
|
+
w(f"| **L3 ↔ Story** | {story_rev} | {l3_rev} | — | "
|
|
2467
|
+
"số dòng change-log story vs change-log DD |")
|
|
2468
|
+
w("\n*Cách đọc: **L2↔L3** tách được chiều nhờ marker `[L2]`/`[L3]` ghi rõ trong drift_report "
|
|
2469
|
+
f"— escalate ngược **{esc}** nghĩa là gần ngần ấy lượt hoà giải phải sửa LÊN kiến trúc "
|
|
2470
|
+
"(L2 chưa chốt kỹ trước khi xuống L3), không chỉ sửa xuống L3. **L3↔Story** chỉ đếm được "
|
|
2471
|
+
"TỔNG số lần sửa mỗi tầng (change-log), **KHÔNG** tách được lần sửa nào do phản hồi ngược "
|
|
2472
|
+
"từ tầng kia (thiếu ticket liên kết) → cột escalate để `—`. Số lần sửa L3 cao so với Story "
|
|
2473
|
+
"= phần lớn churn tài liệu nằm ở tầng thiết kế.*\n")
|
|
2474
|
+
|
|
2475
|
+
|
|
2476
|
+
def render_cost(w, data):
|
|
2477
|
+
c = data.get("cost")
|
|
2478
|
+
w("\n## 5. Chi phí token\n")
|
|
2479
|
+
if not c:
|
|
2480
|
+
w("> Không có dữ liệu chi phí.\n")
|
|
2481
|
+
return
|
|
2482
|
+
w("> **Đọc kỹ phần này có 2 loại token, đừng nhầm:**\n"
|
|
2483
|
+
f"> - **Token-proxy** = cân độ dài tài liệu/code (~{CHARS_PER_TOKEN} ký tự = 1 token). Đây CHỈ là thước "
|
|
2484
|
+
"đo \"khối lượng sản phẩm làm ra\", **không phải tiền**. Dùng để so tỉ lệ tài-liệu/code.\n"
|
|
2485
|
+
"> - **Token thật (burn)** = số token LLM thực sự xử lý (gồm đọc-lại ngữ cảnh, suy luận, thử lại). "
|
|
2486
|
+
"Đây mới là cái **ra tiền $** — xem §5.4.\n")
|
|
2487
|
+
roots = c.get("code_roots") or []
|
|
2488
|
+
if not roots:
|
|
2489
|
+
w("> ⚠️ Không tìm thấy code repo nào (sibling của spec repo phải có marker "
|
|
2490
|
+
"`package.json` / `pom.xml` / `build.gradle` / `go.mod` / `Cargo.toml`... — "
|
|
2491
|
+
"hoặc chỉ định thủ công qua `EVAL_CODE_ROOT`, nhiều path ngăn bằng `:` hoặc `,`) "
|
|
2492
|
+
"→ các tỉ lệ \"so với code\" sẽ là n/a.\n")
|
|
2493
|
+
elif len(roots) > 1:
|
|
2494
|
+
w("> 📦 Đo gộp **%d code repo** (multi-repo FE+BE): %s\n"
|
|
2495
|
+
% (len(roots), ", ".join("`%s`" % r.rsplit("/", 1)[-1] for r in roots)))
|
|
2496
|
+
|
|
2497
|
+
w("\n**5.1 Khối lượng theo từng bước (stage)**\n")
|
|
2498
|
+
w("> Cột **Token-proxy** = độ dài tài liệu sinh ra ở mỗi bước (không phải tiền). "
|
|
2499
|
+
"Cột **Token thật** = token LLM đã burn ở bước đó (ra tiền). Đặt cạnh nhau để thấy bước nào "
|
|
2500
|
+
"\"nhẹ giấy tờ nhưng tốn AI\" và ngược lại.\n")
|
|
2501
|
+
bk = c["buckets"]
|
|
2502
|
+
art_total = sum(v for k, v in bk.items())
|
|
2503
|
+
label = {"discovery": "Stage 1 Discovery", "architecture": "Stage 2 Architecture",
|
|
2504
|
+
"spec": "Stage 3 Specs", "design": "Stage 4 Design",
|
|
2505
|
+
"build_review": "Stage 5 Story+Review", "test_audit": "Stage 5 Test/ATDD",
|
|
2506
|
+
"design_system": "Design System"}
|
|
2507
|
+
bsm = c.get("by_stage_model") or {}
|
|
2508
|
+
bystage = (c.get("burn") or {}).get("by_stage") or {}
|
|
2509
|
+
bucket_stages = {"discovery": ["Stage_1"], "architecture": ["Stage_2", "Stage_2b"],
|
|
2510
|
+
"spec": ["Stage_3"], "design": ["Stage_4"],
|
|
2511
|
+
"build_review": ["Stage_5"], "test_audit": ["Stage_5"], "design_system": []}
|
|
2512
|
+
mcol = bool(bsm) # chỉ thêm cột burn/Model khi có burn-log
|
|
2513
|
+
|
|
2514
|
+
def bucket_models(k):
|
|
2515
|
+
merged = merge_models(bsm.get(st) for st in bucket_stages.get(k, []))
|
|
2516
|
+
return model_share(merged) if merged else "—"
|
|
2517
|
+
|
|
2518
|
+
def bucket_burn(k):
|
|
2519
|
+
if k == "test_audit": # burn của Stage_5 đã gộp ở dòng Story+Review → tránh đếm đôi
|
|
2520
|
+
return None
|
|
2521
|
+
stages = bucket_stages.get(k, [])
|
|
2522
|
+
if not stages:
|
|
2523
|
+
return None
|
|
2524
|
+
return sum((bystage.get(st) or {}).get("input", 0) + (bystage.get(st) or {}).get("output", 0)
|
|
2525
|
+
for st in stages)
|
|
2526
|
+
|
|
2527
|
+
def burn_cell(k):
|
|
2528
|
+
b = bucket_burn(k)
|
|
2529
|
+
return fmt_tok(b) if b is not None else "—"
|
|
2530
|
+
|
|
2531
|
+
w("| Bước (stage) | Token-proxy (giấy tờ) | % giấy tờ |"
|
|
2532
|
+
+ (" Token thật (ra tiền) | Model AI |" if mcol else ""))
|
|
2533
|
+
w("|---|--:|--:|" + ("--:|--:|" if mcol else ""))
|
|
2534
|
+
for k in ["discovery", "architecture", "spec", "design", "build_review", "test_audit", "design_system"]:
|
|
2535
|
+
if k not in bk:
|
|
2536
|
+
continue
|
|
2537
|
+
row = f"| {label.get(k,k)} | {fmt_tok(bk[k])} | {fmt_pct(bk[k]/art_total) if art_total else 'n/a'} |"
|
|
2538
|
+
w(row + (f" {burn_cell(k)} | {bucket_models(k)} |" if mcol else ""))
|
|
2539
|
+
tot_burn = (c.get("burn") or {}).get("total")
|
|
2540
|
+
tot_extra = (f" {fmt_tok(tot_burn) if tot_burn else '—'} | {model_share(c.get('by_model') or {})} |"
|
|
2541
|
+
if mcol else "")
|
|
2542
|
+
w(f"| **Tổng tài liệu** | **{fmt_tok(art_total)}** | 100% |" + tot_extra)
|
|
2543
|
+
w(f"| _Code chạy thật (đã gắn id)_ | {fmt_tok(c['code_prod_tokens'])} | — |" + (" — | — |" if mcol else ""))
|
|
2544
|
+
w(f"| _Code test (đã gắn id)_ | {fmt_tok(c['code_test_tokens'])} | — |" + (" — | — |" if mcol else ""))
|
|
2545
|
+
if c["code_untagged_test_tokens"]:
|
|
2546
|
+
w(f"| _Code test (chưa gắn id, thư mục `tests/`)_ | {fmt_tok(c['code_untagged_test_tokens'])} | — |" + (" — | — |" if mcol else ""))
|
|
2547
|
+
if mcol:
|
|
2548
|
+
w("\n> *Vài lưu ý khi đọc bảng:*\n"
|
|
2549
|
+
"> - *Cột **Token thật** là tiền thật; cột **Token-proxy** chỉ là độ dài văn bản. Hai cột lệch nhau "
|
|
2550
|
+
"nhiều là bình thường — bước ít giấy tờ vẫn có thể tốn nhiều AI (đọc lại ngữ cảnh, thử nhiều lần).*\n"
|
|
2551
|
+
"> - *Dòng `Stage 5 Test/ATDD` để token-thật `—` vì phần burn đó đã gộp chung trong `Stage 5 Story+Review` "
|
|
2552
|
+
"(cùng một bước), ghi lại sẽ thành đếm hai lần.*\n"
|
|
2553
|
+
"> - *Các dòng code để `—` vì việc viết code do AI làm ngay trong bước Stage 5 rồi — không có \"bước viết code\" "
|
|
2554
|
+
"riêng để gán token.*\n"
|
|
2555
|
+
"> - ***Tổng token thật** lớn hơn tổng các dòng phía trên, vì có cả những lượt làm việc đầu phiên chưa kịp gán "
|
|
2556
|
+
"vào bước nào.*\n"
|
|
2557
|
+
"> - *`Design System` để model `—` vì không nhận diện được bước riêng cho nó.*")
|
|
2558
|
+
|
|
2559
|
+
w("\n**5.2 Đầu tư bao nhiêu \"giấy tờ\" cho mỗi phần code? (token-proxy)**\n")
|
|
2560
|
+
w("> Mỗi tỉ lệ trả lời: cứ 1 phần code chạy thật thì kèm theo bao nhiêu phần tài liệu. **Số càng nhỏ càng gọn.** "
|
|
2561
|
+
"(Đây là token-proxy — đo công sức, không phải tiền.)\n")
|
|
2562
|
+
r = c["ratios"]
|
|
2563
|
+
w("| Mã | So sánh | Cách tính | Kết quả |")
|
|
2564
|
+
w("|---|---|---|--:|")
|
|
2565
|
+
w(f"| COST-2 | Thiết kế (spec+design) so với code | (Stage 3 + Stage 4) ÷ code chạy thật | **{fmt_ratio(r['spec_design_to_code'])}** |")
|
|
2566
|
+
w(f"| COST-3 | Kiểm thử + review so với code | (story/review + test/ATDD + code test) ÷ code chạy thật | **{fmt_ratio(r['review_test_to_code'])}** |")
|
|
2567
|
+
w(f"| COST-4 | Toàn bộ tài liệu so với code | tổng tài liệu ÷ code chạy thật | **{fmt_ratio(r['all_artifact_to_code'])}** |")
|
|
2568
|
+
w(f"| COST-5 | Quản trị/định hướng so với code | (discovery + kiến trúc + design-system) ÷ code chạy thật | {fmt_ratio(r['governance_to_code'])} |")
|
|
2569
|
+
w(f"| COST-6 | Tỉ lệ \"phí phạm\" do làm lại | phần tài liệu bản cũ đã thay ÷ tổng (cũ+mới) của kiến trúc & thiết kế | {fmt_pct(r['archive_waste'])} |")
|
|
2570
|
+
|
|
2571
|
+
bys = c.get("by_slice") or {}
|
|
2572
|
+
if bys:
|
|
2573
|
+
w("\n**5.3 Khối lượng code theo từng lát cắt (token-proxy)**\n")
|
|
2574
|
+
w("> \"Code chạy thật\" so với \"code test\" của từng lát cắt; tỉ lệ test/code cao = phủ test nhiều hơn.\n")
|
|
2575
|
+
w("| Lát cắt | Code chạy thật | Code test | Test so với code |")
|
|
2576
|
+
w("|---|--:|--:|--:|")
|
|
2577
|
+
for sid in sorted(bys, key=lambda x: (x == "(unmapped)", x)):
|
|
2578
|
+
v = bys[sid]
|
|
2579
|
+
p, t = v.get("prod", 0), v.get("test", 0)
|
|
2580
|
+
name = "(chưa gán lát cắt)" if sid == "(unmapped)" else sid
|
|
2581
|
+
w(f"| {name} | {fmt_tok(p)} | {fmt_tok(t)} | {fmt_ratio(t/p) if p else 'n/a'} |")
|
|
2582
|
+
|
|
2583
|
+
render_churn(w, data)
|
|
2584
|
+
|
|
2585
|
+
w("\n**5.4 Chi phí tiền thật (token LLM đã burn)**\n")
|
|
2586
|
+
burn = c.get("burn")
|
|
2587
|
+
if not burn:
|
|
2588
|
+
w("> 🔴 Chưa gom được token thật (chưa có file `NTAPP-output/evaluation/token-log.json` và "
|
|
2589
|
+
"không đọc được nhật ký phiên Claude Code). Khi có, phần này sẽ tự tính tổng chi phí $, "
|
|
2590
|
+
"chi phí cho mỗi tiêu chí nghiệm thu, và hệ số \"khuếch đại\".")
|
|
2591
|
+
else:
|
|
2592
|
+
cov = burn.get("coverage") or {}
|
|
2593
|
+
lvl = cov.get("level")
|
|
2594
|
+
if lvl == "partial":
|
|
2595
|
+
w(f"> ⚠️ **Độ phủ nhật ký phiên thấp (G2) — burn dưới đây là CẬN DƯỚI, không phải con số đủ.** "
|
|
2596
|
+
f"Phiên Claude Code chỉ trải **{cov.get('session_min')} → {cov.get('session_max')}**, "
|
|
2597
|
+
f"trong khi commit git của code repo trải **{cov.get('git_first')} → {cov.get('git_last')}** "
|
|
2598
|
+
f"({cov.get('git_commits')} commit). Phủ ~{fmt_pct(cov.get('ratio'))} khoảng hoạt động → "
|
|
2599
|
+
"nhiều phiên (chạy máy khác / đã xoá / không gom đủ) **thiếu**. Mọi con số $/token bên dưới "
|
|
2600
|
+
"là **một phần**, KHÔNG dùng để so sánh giữa dự án.\n")
|
|
2601
|
+
elif lvl == "full":
|
|
2602
|
+
w(f"> ✅ Độ phủ nhật ký phiên đủ (G2): phiên **{cov.get('session_min')} → {cov.get('session_max')}** "
|
|
2603
|
+
f"phủ ~{fmt_pct(cov.get('ratio'))} khoảng commit git "
|
|
2604
|
+
f"(**{cov.get('git_first')} → {cov.get('git_last')}**, {cov.get('git_commits')} commit).\n")
|
|
2605
|
+
elif cov: # unknown — thiếu mốc git hoặc mốc phiên → nói rõ chưa kiểm chứng được
|
|
2606
|
+
w("> ℹ️ Chưa kiểm chứng được độ phủ nhật ký phiên (G2): thiếu mốc git của code repo hoặc "
|
|
2607
|
+
"thiếu mốc thời gian phiên → không khẳng định burn đã gom **đủ**. Hãy coi là cận dưới cho tới khi đối chiếu được.\n")
|
|
2608
|
+
comp, cost = burn.get("components"), burn.get("cost_usd")
|
|
2609
|
+
cbm = burn.get("cost_by_model")
|
|
2610
|
+
priced_pm = burn.get("cost_priced_per_model")
|
|
2611
|
+
if comp and cost:
|
|
2612
|
+
tot_tok = sum(comp.values())
|
|
2613
|
+
tot_usd = burn["cost_total_usd"]
|
|
2614
|
+
if priced_pm:
|
|
2615
|
+
w("> Token thật chia làm 4 loại; **đơn giá theo TỪNG model** (Opus/Sonnet/Haiku khác nhau — "
|
|
2616
|
+
"chi tiết ở bảng 5.4b). Quy ước cache giống nhau mọi model: **ghi cache = 1.25× input** "
|
|
2617
|
+
"(lưu ngữ cảnh, TTL 5 phút), **đọc cache = 0.1× input** (rẻ bằng 1/10), **output** đắt nhất "
|
|
2618
|
+
"(= 5× input). Cột \"Đơn giá TB\" bên dưới là bình quân gia quyền theo cơ cấu model.\n")
|
|
2619
|
+
else:
|
|
2620
|
+
w("> Token thật chia làm 4 loại, đơn giá khác nhau (theo bảng giá Claude API, model "
|
|
2621
|
+
f"**{PRICING_MODEL}**, tính trên 1 triệu token):\n"
|
|
2622
|
+
f"> - **Input mới**: ${PRICE_PER_MTOK['input']:.2f} — phần ngữ cảnh gửi lần đầu.\n"
|
|
2623
|
+
f"> - **Ghi cache**: ${PRICE_PER_MTOK['cache_write']:.2f} — lưu ngữ cảnh để tái dùng (đắt hơn input 1.25×).\n"
|
|
2624
|
+
f"> - **Đọc cache**: ${PRICE_PER_MTOK['cache_read']:.2f} — đọc lại ngữ cảnh đã lưu (rẻ, bằng 1/10 input).\n"
|
|
2625
|
+
f"> - **Output**: ${PRICE_PER_MTOK['output']:.2f} — phần AI sinh ra (đắt nhất).\n")
|
|
2626
|
+
unit_hdr = "Đơn giá TB ($/1M)" if priced_pm else "Đơn giá ($/1 triệu)"
|
|
2627
|
+
w(f"| Loại token | Số token | {unit_hdr} | Thành tiền | % chi phí |")
|
|
2628
|
+
w("|---|--:|--:|--:|--:|")
|
|
2629
|
+
rows = [
|
|
2630
|
+
("Input mới (chưa cache)", "input"),
|
|
2631
|
+
("Ghi cache", "cache_write"),
|
|
2632
|
+
("Đọc cache", "cache_read"),
|
|
2633
|
+
("Output (AI sinh ra)", "output"),
|
|
2634
|
+
]
|
|
2635
|
+
for label, key in rows:
|
|
2636
|
+
pct = (cost[key] / tot_usd) if tot_usd else 0
|
|
2637
|
+
# per-model: đơn giá là bình quân hiệu dụng (tiền ÷ token); phẳng: giá cứng
|
|
2638
|
+
unit = (cost[key] / comp[key] * 1_000_000) if (priced_pm and comp[key]) \
|
|
2639
|
+
else PRICE_PER_MTOK[key]
|
|
2640
|
+
w(f"| {label} | {fmt_tok(comp[key])} | {unit:.2f} | "
|
|
2641
|
+
f"${cost[key]:,.2f} | {round(100*pct)}% |")
|
|
2642
|
+
w(f"| **Tổng cộng** | **{fmt_tok(tot_tok)}** | — | **${tot_usd:,.2f}** | 100% |")
|
|
2643
|
+
w("")
|
|
2644
|
+
if cbm:
|
|
2645
|
+
w("\n**5.4b Chi phí theo model AI**\n")
|
|
2646
|
+
w("> Mỗi model một đơn giá (Opus 4.8 $5/$25, Sonnet 4.6 $3/$15, Haiku 4.5 $1/$5 — "
|
|
2647
|
+
"input/output trên 1 triệu token). Sub-agent thường chạy model rẻ (Haiku) → tách ra để "
|
|
2648
|
+
"thấy đúng cơ cấu tiền, không quy hết về Opus.\n")
|
|
2649
|
+
w("| Model | Input mới | Ghi cache | Đọc cache | Output | Tổng token | Thành tiền | % chi phí |")
|
|
2650
|
+
w("|---|--:|--:|--:|--:|--:|--:|--:|")
|
|
2651
|
+
for m in cbm:
|
|
2652
|
+
cm = m["components"]
|
|
2653
|
+
pct = (m["cost_total_usd"] / tot_usd) if tot_usd else 0
|
|
2654
|
+
w(f"| {m['label']} | {fmt_tok(cm['input'])} | {fmt_tok(cm['cache_write'])} | "
|
|
2655
|
+
f"{fmt_tok(cm['cache_read'])} | {fmt_tok(cm['output'])} | {fmt_tok(m['tokens_total'])} | "
|
|
2656
|
+
f"${m['cost_total_usd']:,.2f} | {round(100*pct)}% |")
|
|
2657
|
+
w(f"| **Tổng** | | | | | **{fmt_tok(sum(m['tokens_total'] for m in cbm))}** | "
|
|
2658
|
+
f"**${tot_usd:,.2f}** | 100% |")
|
|
2659
|
+
w("")
|
|
2660
|
+
lb = " **(một phần — cận dưới)**" if (burn.get("coverage") or {}).get("lower_bound") else ""
|
|
2661
|
+
w(f"- **Tổng token thật đã burn**: {fmt_tok(burn['total'])} token{lb} "
|
|
2662
|
+
f"(gồm input {fmt_tok(burn.get('input') or 0)} + output {fmt_tok(burn.get('output') or 0)})")
|
|
2663
|
+
if burn.get("cost_total_usd") is not None:
|
|
2664
|
+
_basis = "định giá theo từng model" if burn.get("cost_priced_per_model") \
|
|
2665
|
+
else f"đơn giá {PRICING_MODEL}"
|
|
2666
|
+
w(f"- **Tổng chi phí tiền thật: ${burn['cost_total_usd']:,.2f}** ({_basis})")
|
|
2667
|
+
w(f"- **Chi phí cho mỗi tiêu chí nghiệm thu (AC)**: "
|
|
2668
|
+
f"{fmt_tok(burn['per_ac']) if burn['per_ac'] else 'n/a'} token/AC")
|
|
2669
|
+
w(f"- **Hệ số khuếch đại**: {fmt_ratio(burn['amplification'])} — cứ mỗi 1 token \"sản phẩm cuối\" "
|
|
2670
|
+
f"({fmt_tok(c['delivered_tokens'])} token-proxy) thì AI thực sự xử lý chừng đó token. "
|
|
2671
|
+
"Phần lớn là đọc lại ngữ cảnh và thử lại — bình thường với quy trình nhiều bước.")
|
|
2672
|
+
|
|
2673
|
+
|
|
2674
|
+
def render_churn(w, data):
|
|
2675
|
+
"""§5.3b — LOC committed (added/deleted) + tỉ lệ sửa-đi-sửa-lại tầng code (EFFY-3b)."""
|
|
2676
|
+
ch = data.get("code_churn") or {}
|
|
2677
|
+
w("\n**5.3b Sửa đi sửa lại ở tầng code — LOC đã commit (EFFY-3b)**\n")
|
|
2678
|
+
if not ch.get("available"):
|
|
2679
|
+
w("> 🔴 Chưa đọc được lịch sử git của code repo (không tìm thấy repo, hoặc `git` không chạy được). "
|
|
2680
|
+
"Khi có, phần này tự tính số dòng code đã thêm/xoá và tỉ lệ \"viết rồi xoá\".\n")
|
|
2681
|
+
return
|
|
2682
|
+
pr, te, ot = ch["prod"], ch["test"], ch["other"]
|
|
2683
|
+
w("> Đếm trực tiếp từ `git log --numstat` của code repo (đo **dòng chảy commit**, khác với token-proxy ở "
|
|
2684
|
+
"trên đo **trạng thái file cuối**). Cột **+/−** là số dòng tuyệt đối đã thêm/xoá qua toàn bộ lịch sử. "
|
|
2685
|
+
"**Tỉ lệ thrash** = (thêm+xoá) ÷ số dòng prod còn sống = bao nhiêu dòng phải viết để giữ lại 1 dòng "
|
|
2686
|
+
"(**1.0 = không phí**; càng cao càng viết-rồi-xoá nhiều).\n")
|
|
2687
|
+
w(f"> Quét **{ch['commits']}** commit.\n")
|
|
2688
|
+
w("| Loại code | Dòng thêm (+) | Dòng xoá (−) | Dòng còn sống | Tỉ lệ thrash |")
|
|
2689
|
+
w("|---|--:|--:|--:|--:|")
|
|
2690
|
+
w(f"| **Code chạy thật (prod, đã gắn id)** | +{pr['added']:,} | −{pr['deleted']:,} | "
|
|
2691
|
+
f"{pr['net_loc']:,} | **{fmt_ratio(pr['churn_ratio'])}** |")
|
|
2692
|
+
w(f"| Code test | +{te['added']:,} | −{te['deleted']:,} | — | — |")
|
|
2693
|
+
w(f"| Khác (đã xoá / chưa gắn id) | +{ot['added']:,} | −{ot['deleted']:,} | — | — |")
|
|
2694
|
+
bys = ch.get("by_slice") or {}
|
|
2695
|
+
if bys:
|
|
2696
|
+
w("\n*Phân theo lát cắt (chỉ file prod đã gắn id còn trên đĩa):*\n")
|
|
2697
|
+
w("| Lát cắt | Dòng thêm (+) | Dòng xoá (−) |")
|
|
2698
|
+
w("|---|--:|--:|")
|
|
2699
|
+
for sid in sorted(bys, key=lambda x: (x == "(unmapped)", x)):
|
|
2700
|
+
v = bys[sid]
|
|
2701
|
+
name = "(chưa gán lát cắt)" if sid == "(unmapped)" else sid
|
|
2702
|
+
w(f"| {name} | +{v['added']:,} | −{v['deleted']:,} |")
|
|
2703
|
+
w("\n> *Lưu ý:* commit ĐẦU TIÊN của dự án dựng-lại (brownfield) dồn cả codebase cũ vào một lần → cột "
|
|
2704
|
+
"**+** phình to nhưng **−**≈0 nên tỉ lệ thrash vẫn ~1.0 (không bị thổi). Dòng \"Khác\" gom churn của file "
|
|
2705
|
+
"đã bị xoá hẳn (không còn header để quy về prod/slice) — đây là giới hạn attribution, không phải lỗi.\n")
|
|
2706
|
+
|
|
2707
|
+
|
|
2708
|
+
def next_round(archive_dir):
|
|
2709
|
+
"""Lần đánh giá kế tiếp = max version đã archive + 1 (snapshot history)."""
|
|
2710
|
+
vs = []
|
|
2711
|
+
if archive_dir.exists():
|
|
2712
|
+
for f in archive_dir.glob("scorecard-v*.md"):
|
|
2713
|
+
m = re.match(r"scorecard-v(\d+)\.md$", f.name)
|
|
2714
|
+
if m:
|
|
2715
|
+
vs.append(int(m.group(1)))
|
|
2716
|
+
return max(vs, default=0) + 1
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
def main():
|
|
2720
|
+
import argparse
|
|
2721
|
+
ap = argparse.ArgumentParser(description="NTAPP eval harvester (gồm token-burn từ session JSONL)")
|
|
2722
|
+
ap.add_argument("--refresh-burn", action="store_true",
|
|
2723
|
+
help="re-harvest token-log.json từ session JSONL (mặc định: auto-harvest nếu chưa có, "
|
|
2724
|
+
"dùng cached nếu đã có)")
|
|
2725
|
+
args = ap.parse_args()
|
|
2726
|
+
data = build(refresh_burn=args.refresh_burn)
|
|
2727
|
+
|
|
2728
|
+
archive_dir = OUT_DIR / "archive"
|
|
2729
|
+
run_meta = {"date": datetime.date.today().isoformat(), "round": next_round(archive_dir)}
|
|
2730
|
+
data["_run_meta"] = run_meta
|
|
2731
|
+
|
|
2732
|
+
metrics_json = json.dumps(data, ensure_ascii=False, indent=2)
|
|
2733
|
+
scorecard_md = render_scorecard(data, run_meta)
|
|
2734
|
+
|
|
2735
|
+
# Dual-write: canonical (latest, overwrite) + archive (snapshot version mới mỗi run)
|
|
2736
|
+
OUT_DIR.mkdir(parents=True, exist_ok=True)
|
|
2737
|
+
(OUT_DIR / "metrics.json").write_text(metrics_json, encoding="utf-8")
|
|
2738
|
+
(OUT_DIR / "scorecard.md").write_text(scorecard_md, encoding="utf-8")
|
|
2739
|
+
archive_dir.mkdir(parents=True, exist_ok=True)
|
|
2740
|
+
v = run_meta["round"]
|
|
2741
|
+
(archive_dir / f"metrics-v{v}.json").write_text(metrics_json, encoding="utf-8")
|
|
2742
|
+
(archive_dir / f"scorecard-v{v}.md").write_text(scorecard_md, encoding="utf-8")
|
|
2743
|
+
|
|
2744
|
+
t = data["totals"]
|
|
2745
|
+
print(f"[eval-harvester] slices={len(data['slices'])} units={len(data['units'])} "
|
|
2746
|
+
f"defers={t['defer_count']} (avoidable={t['defer_avoidable']}) "
|
|
2747
|
+
f"F-FPY={fmt_pct(t['fpy'])} (func-patch={t['functional_patch']}/excl={t['patch_excluded']}"
|
|
2748
|
+
f"/uncl={t['patch_unclassified']}; SFPY={fmt_pct(t['sfpy'])})")
|
|
2749
|
+
c = data["cost"]
|
|
2750
|
+
print(f"[eval-harvester] cost-proxy: code-prod={fmt_tok(c['code_prod_tokens'])}tok "
|
|
2751
|
+
f"spec+design:code={fmt_ratio(c['ratios']['spec_design_to_code'])} "
|
|
2752
|
+
f"test+review:code={fmt_ratio(c['ratios']['review_test_to_code'])} "
|
|
2753
|
+
f"all-artifact:code={fmt_ratio(c['ratios']['all_artifact_to_code'])} "
|
|
2754
|
+
f"(burn={'logged' if c['burn'] else 'n/a'})")
|
|
2755
|
+
bym = c.get("by_model") or {}
|
|
2756
|
+
if bym:
|
|
2757
|
+
print(f"[eval-harvester] models: {model_share(bym)}")
|
|
2758
|
+
print(f"[eval-harvester] đánh giá #{run_meta['round']} ({run_meta['date']})")
|
|
2759
|
+
print(f"[eval-harvester] canonical → {OUT_DIR/'scorecard.md'} + metrics.json")
|
|
2760
|
+
print(f"[eval-harvester] archive → {archive_dir}/scorecard-v{v}.md + metrics-v{v}.json")
|
|
2761
|
+
|
|
2762
|
+
|
|
2763
|
+
if __name__ == "__main__":
|
|
2764
|
+
sys.exit(main())
|