gennady 0.6.0 → 0.7.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 +2 -15
- package/ai/agents/agent-resolve-conflicts.xml +6 -0
- package/ai/agents/agent-review-verifier.xml +6 -0
- package/ai/directives/architecture/README.md +21 -0
- package/ai/directives/coding/README.md +23 -0
- package/ai/directives/coding/result-conventions.xml +55 -0
- package/ai/directives/coding/svelte5-runes.xml +248 -0
- package/ai/directives/coding/sveltekit-rules.xml +247 -0
- package/ai/directives/coding/typescript-rules.xml +589 -0
- package/ai/directives/coding/uikit-component-storybook.xml +347 -0
- package/ai/directives/coding/uikit-component-svelte.xml +344 -0
- package/ai/directives/coding/uikit-spec-drafting.xml +243 -0
- package/ai/directives/dbc-audit.directive.xml +131 -0
- package/ai/directives/dev-review.directive.xml +148 -0
- package/ai/directives/infra/README.md +11 -0
- package/ai/directives/infra/eslint-setup.xml +467 -0
- package/ai/directives/infra/git-setup.xml +261 -0
- package/ai/directives/infra/nodejs-npm-setup.xml +354 -0
- package/ai/directives/infra/storybook-setup.xml +153 -0
- package/ai/directives/knowledge.xml +206 -0
- package/ai/directives/perf-auditor/perf-auditor.directive.xml +75 -0
- package/ai/directives/perf-auditor/rules/async-latency.xml +101 -0
- package/ai/directives/perf-auditor/rules/data-structures.xml +103 -0
- package/ai/directives/perf-auditor/rules/iteration-fusion.xml +96 -0
- package/ai/directives/perf-auditor/rules/memory-gc.xml +102 -0
- package/ai/directives/sdd/README.md +49 -0
- package/ai/directives/sdd/audit.directive.xml +543 -0
- package/ai/directives/sdd/discovery.directive.xml +824 -0
- package/ai/directives/sdd/fix.directive.xml +249 -0
- package/ai/directives/sdd/module-decomposition.directive.xml +666 -0
- package/ai/directives/sdd/phase-execution-protocol.xml +339 -0
- package/ai/directives/sdd/scaffold.directive.xml +717 -0
- package/ai/directives/sdd/setup.directive.xml +213 -0
- package/ai/directives/sdd/svelte-ui-discovery.directive.xml +263 -0
- package/ai/directives/semantic-change-extractor.directive.xml +99 -0
- package/ai/directives/testing/README.md +25 -0
- package/ai/directives/testing/common.xml +234 -0
- package/ai/directives/testing/node-test.xml +288 -0
- package/ai/directives/testing/playwright-cli.xml +199 -0
- package/ai/directives/testing/playwright-e2e.xml +292 -0
- package/ai/directives/testing/storybook-usage.xml +173 -0
- package/ai/directives/testing/svelte-testing.xml +237 -0
- package/ai/directives/testing/vitest-rules.xml +326 -0
- package/ai/docs/README.md +17 -0
- package/ai/docs/ai-icl.md +538 -0
- package/ai/docs/ai-priming.md +548 -0
- package/ai/docs/ai-prompt-formats.md +406 -0
- package/ai/docs/ai-promting.md +572 -0
- package/ai/drafts/DRAFT.md +120 -0
- package/ai/drafts/agent-devgen-class-from-description.rules.xml +123 -0
- package/ai/drafts/agent-typescript-devgen.v1.xml +303 -0
- package/ai/drafts/d.md +65 -0
- package/ai/drafts/music-posts.md +105 -0
- package/ai/fw/v1/architecture/blueprint-factory.xml +77 -0
- package/ai/fw/v1/core/mental-model.xml +50 -0
- package/ai/fw/v1/discovery/intent-reactor.xml +92 -0
- package/ai/fw/v1/production/swarm-protocol.xml +122 -0
- package/ai/fw/v1/review/quality-pipeline.xml +102 -0
- package/ai/fw/v2/arch-universal.xml +73 -0
- package/ai/fw-draft/README.md +79 -0
- package/ai/fw-draft/bin/discovery.sh +116 -0
- package/ai/fw-draft/gennady.xml +58 -0
- package/ai/fw-draft/provider/claude.xml +16 -0
- package/ai/fw-draft/provider/cursor.xml +23 -0
- package/ai/fw-draft/provider/default.xml +12 -0
- package/ai/fw-draft/roles/developer.xml +18 -0
- package/ai/fw-draft/router.xml +39 -0
- package/ai/fw-draft/routes/development.xml +32 -0
- package/ai/fw-draft/routes/universal.xml +58 -0
- package/ai/fw-draft/rules/dev/base/file-structure-rules.xml +89 -0
- package/ai/fw-draft/rules/dev/typescript/contacts.xml +194 -0
- package/dist/ai/agents/agent-resolve-conflicts.xml +6 -0
- package/dist/ai/agents/agent-review-verifier.xml +6 -0
- package/dist/ai/directives/architecture/README.md +21 -0
- package/dist/ai/directives/coding/README.md +23 -0
- package/dist/ai/directives/coding/result-conventions.xml +55 -0
- package/dist/ai/directives/coding/svelte5-runes.xml +248 -0
- package/dist/ai/directives/coding/sveltekit-rules.xml +247 -0
- package/dist/ai/directives/coding/typescript-rules.xml +589 -0
- package/dist/ai/directives/coding/uikit-component-storybook.xml +347 -0
- package/dist/ai/directives/coding/uikit-component-svelte.xml +344 -0
- package/dist/ai/directives/coding/uikit-spec-drafting.xml +243 -0
- package/dist/ai/directives/dbc-audit.directive.xml +131 -0
- package/dist/ai/directives/dev-review.directive.xml +148 -0
- package/dist/ai/directives/infra/README.md +11 -0
- package/dist/ai/directives/infra/eslint-setup.xml +467 -0
- package/dist/ai/directives/infra/git-setup.xml +261 -0
- package/dist/ai/directives/infra/nodejs-npm-setup.xml +354 -0
- package/dist/ai/directives/infra/storybook-setup.xml +153 -0
- package/dist/ai/directives/knowledge.xml +206 -0
- package/dist/ai/directives/perf-auditor/perf-auditor.directive.xml +75 -0
- package/dist/ai/directives/perf-auditor/rules/async-latency.xml +101 -0
- package/dist/ai/directives/perf-auditor/rules/data-structures.xml +103 -0
- package/dist/ai/directives/perf-auditor/rules/iteration-fusion.xml +96 -0
- package/dist/ai/directives/perf-auditor/rules/memory-gc.xml +102 -0
- package/dist/ai/directives/sdd/README.md +49 -0
- package/dist/ai/directives/sdd/audit.directive.xml +543 -0
- package/dist/ai/directives/sdd/discovery.directive.xml +824 -0
- package/dist/ai/directives/sdd/fix.directive.xml +249 -0
- package/dist/ai/directives/sdd/module-decomposition.directive.xml +666 -0
- package/dist/ai/directives/sdd/phase-execution-protocol.xml +339 -0
- package/dist/ai/directives/sdd/scaffold.directive.xml +717 -0
- package/dist/ai/directives/sdd/setup.directive.xml +213 -0
- package/dist/ai/directives/sdd/svelte-ui-discovery.directive.xml +263 -0
- package/dist/ai/directives/semantic-change-extractor.directive.xml +99 -0
- package/dist/ai/directives/testing/README.md +25 -0
- package/dist/ai/directives/testing/common.xml +234 -0
- package/dist/ai/directives/testing/node-test.xml +288 -0
- package/dist/ai/directives/testing/playwright-cli.xml +199 -0
- package/dist/ai/directives/testing/playwright-e2e.xml +292 -0
- package/dist/ai/directives/testing/storybook-usage.xml +173 -0
- package/dist/ai/directives/testing/svelte-testing.xml +237 -0
- package/dist/ai/directives/testing/vitest-rules.xml +326 -0
- package/dist/ai/docs/README.md +17 -0
- package/dist/ai/docs/ai-icl.md +538 -0
- package/dist/ai/docs/ai-priming.md +548 -0
- package/dist/ai/docs/ai-prompt-formats.md +406 -0
- package/dist/ai/docs/ai-promting.md +572 -0
- package/dist/ai/drafts/DRAFT.md +120 -0
- package/dist/ai/drafts/agent-devgen-class-from-description.rules.xml +123 -0
- package/dist/ai/drafts/agent-typescript-devgen.v1.xml +303 -0
- package/dist/ai/drafts/d.md +65 -0
- package/dist/ai/drafts/music-posts.md +105 -0
- package/dist/ai/fw/v1/architecture/blueprint-factory.xml +77 -0
- package/dist/ai/fw/v1/core/mental-model.xml +50 -0
- package/dist/ai/fw/v1/discovery/intent-reactor.xml +92 -0
- package/dist/ai/fw/v1/production/swarm-protocol.xml +122 -0
- package/dist/ai/fw/v1/review/quality-pipeline.xml +102 -0
- package/dist/ai/fw/v2/arch-universal.xml +73 -0
- package/dist/ai/fw-draft/README.md +79 -0
- package/dist/ai/fw-draft/bin/discovery.sh +116 -0
- package/dist/ai/fw-draft/gennady.xml +58 -0
- package/dist/ai/fw-draft/provider/claude.xml +16 -0
- package/dist/ai/fw-draft/provider/cursor.xml +23 -0
- package/dist/ai/fw-draft/provider/default.xml +12 -0
- package/dist/ai/fw-draft/roles/developer.xml +18 -0
- package/dist/ai/fw-draft/router.xml +39 -0
- package/dist/ai/fw-draft/routes/development.xml +32 -0
- package/dist/ai/fw-draft/routes/universal.xml +58 -0
- package/dist/ai/fw-draft/rules/dev/base/file-structure-rules.xml +89 -0
- package/dist/ai/fw-draft/rules/dev/typescript/contacts.xml +194 -0
- package/dist/chunks/devtools-B-7ugZhF.js +79 -0
- package/dist/chunks/{help.cmd-CWasx25o.js → help.cmd-B_G7EWzF.js} +9 -2
- package/dist/chunks/{index-B63fYXL2.js → index-BeL1Zcbg.js} +1 -1
- package/dist/chunks/index-CVR66voe.js +26963 -0
- package/dist/chunks/index-CXuhZzS3.js +16979 -0
- package/dist/chunks/{index-B5bA2T7A.js → index-CaahtXiM.js} +33 -9
- package/dist/chunks/{index-iqg0w_pE.js → index-CiEM-8nJ.js} +35 -19
- package/dist/chunks/{index-B4m0-PAT.js → index-D1qsi0Uc.js} +57 -33
- package/dist/chunks/index-D9ceRUyB.js +443 -0
- package/dist/chunks/index-DJpVmyp2.js +176 -0
- package/dist/chunks/{index-C0andxna.js → index-DU6jD7SS.js} +1 -1
- package/dist/chunks/index-KxSZKmZn.js +540 -0
- package/dist/chunks/{index-Dqe1TdW4.js → index-UbHoePfr.js} +12 -12
- package/dist/chunks/{index-5xIgwwKx.js → index-g1LXlp77.js} +2 -2
- package/dist/chunks/index-zBnnuvLA.js +3788 -0
- package/dist/chunks/{run-review-command.logic-a_M3CkeZ.js → run-review-command.logic-DpkRoEi8.js} +2 -2
- package/dist/chunks/services-CaLOhuLV.js +2889 -0
- package/dist/chunks/shared-Bjy30TeM.js +665 -0
- package/dist/cli/cmd/_shared/prompt/io/load-agent-template.io.d.ts +3 -3
- package/dist/cli/cmd/_shared/prompt/logic/build-ai-first-knowledge-block.logic.d.ts +3 -3
- package/dist/cli/cmd/_shared/prompt/logic/build-ai-verify-placeholders.logic.d.ts +7 -4
- package/dist/cli/cmd/_shared/prompt/logic/verify-commands/resolve-verify-commands.logic.d.ts +5 -0
- package/dist/cli/cmd/_shared/update-check-worker.d.ts +1 -0
- package/dist/cli/cmd/_shared/update-check.d.ts +38 -0
- package/dist/cli/cmd/agent-mon/cmd/create-providers.d.ts +15 -0
- package/dist/cli/cmd/agent-mon/cmd/index.d.ts +1 -0
- package/dist/cli/cmd/agent-mon/cmd/run.d.ts +12 -0
- package/dist/cli/cmd/agent-mon/state/create-state-manager.d.ts +32 -0
- package/dist/cli/cmd/agent-mon/state/group-by-provider.d.ts +14 -0
- package/dist/cli/cmd/agent-mon/state/index.d.ts +5 -0
- package/dist/cli/cmd/agent-mon/state/is-waiting.d.ts +9 -0
- package/dist/cli/cmd/agent-mon/state/view-model.type.d.ts +74 -0
- package/dist/cli/cmd/agent-mon/ui/app.d.ts +16 -0
- package/dist/cli/cmd/agent-mon/ui/column-view.d.ts +14 -0
- package/dist/cli/cmd/agent-mon/ui/index.d.ts +10 -0
- package/dist/cli/cmd/agent-mon/ui/provider-column.d.ts +14 -0
- package/dist/cli/cmd/agent-mon/ui/session-card.d.ts +12 -0
- package/dist/cli/cmd/agent-mon/ui/status-badge.d.ts +10 -0
- package/dist/cli/cmd/alt-opinion/alt-opinion-parser.d.ts +18 -0
- package/dist/cli/cmd/alt-opinion/alt-opinion-runner.d.ts +32 -0
- package/dist/cli/cmd/alt-opinion/alt-opinion.cmd.d.ts +34 -0
- package/dist/cli/cmd/alt-opinion/alt-opinion.types.d.ts +88 -0
- package/dist/cli/cmd/alt-opinion/index.d.ts +1 -0
- package/dist/cli/cmd/cat/cat-url.fn.d.ts +19 -0
- package/dist/cli/cmd/lint/checks/anchor.check.d.ts +11 -0
- package/dist/cli/cmd/lint/checks/dbc-contract.check.d.ts +16 -0
- package/dist/cli/cmd/lint/checks/disables.check.d.ts +12 -0
- package/dist/cli/cmd/lint/checks/file-header.check.d.ts +10 -0
- package/dist/cli/cmd/lint/checks/language.check.d.ts +11 -0
- package/dist/cli/cmd/lint/index.d.ts +1 -0
- package/dist/cli/cmd/lint/lint.cmd.d.ts +18 -0
- package/dist/cli/cmd/lint/lint.types.d.ts +72 -0
- package/dist/cli/cmd/lint/utils/resolve-references.fn.d.ts +32 -0
- package/dist/cli/cmd/remote-console/index.d.ts +2 -0
- package/dist/cli/cmd/remote-console/remote-console.cmd.d.ts +55 -0
- package/dist/cli/cmd/resolve-conflicts/_core/io/resolve-conflicts-template-load.io.d.ts +2 -2
- package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-command-args-parse.logic.d.ts +3 -3
- package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-command-run.logic.d.ts +3 -3
- package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-context-git-build.logic.d.ts +4 -4
- package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-artifact.type.d.ts +3 -1
- package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-command-args.type.d.ts +3 -1
- package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-command-result.type.d.ts +5 -1
- package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-context-git.type.d.ts +18 -2
- package/dist/cli/cmd/resolve-conflicts/_core/xml/resolve-conflicts-artifact-build.xml.d.ts +6 -6
- package/dist/cli/cmd/resolve-conflicts/_core/xml/resolve-conflicts-render.xml.d.ts +4 -4
- package/dist/cli/cmd/review/_core/io/load-review-verify-template.io.d.ts +2 -2
- package/dist/cli/cmd/review/_core/logic/build-review-context-git.logic.d.ts +3 -3
- package/dist/cli/cmd/review/_core/logic/build-review-context-vcs.logic.d.ts +2 -2
- package/dist/cli/cmd/review/_core/logic/load-review-context-mr.logic.d.ts +5 -5
- package/dist/cli/cmd/review/_core/logic/parse-review-command-args.logic.d.ts +3 -3
- package/dist/cli/cmd/review/_core/logic/resolve-review-intent.logic.d.ts +3 -3
- package/dist/cli/cmd/review/_core/logic/run-review-command.logic.d.ts +3 -3
- package/dist/cli/cmd/review/_core/types/review-artifact.type.d.ts +4 -1
- package/dist/cli/cmd/review/_core/types/review-command-args.type.d.ts +7 -1
- package/dist/cli/cmd/review/_core/types/review-command-mode.type.d.ts +1 -1
- package/dist/cli/cmd/review/_core/types/review-command-options.type.d.ts +3 -1
- package/dist/cli/cmd/review/_core/types/review-command-result.type.d.ts +5 -1
- package/dist/cli/cmd/review/_core/types/review-context-git.type.d.ts +3 -1
- package/dist/cli/cmd/review/_core/types/review-context-mr.type.d.ts +22 -3
- package/dist/cli/cmd/review/_core/types/review-context-vcs.type.d.ts +4 -1
- package/dist/cli/cmd/review/_core/types/review-intent.type.d.ts +1 -1
- package/dist/cli/cmd/review/_core/xml/build-review-artifact.xml.d.ts +10 -10
- package/dist/cli/cmd/review/_core/xml/render-review-issues.xml.d.ts +3 -3
- package/dist/cli/cmd/review/_core/xml/render-review-verify.xml.d.ts +4 -4
- package/dist/cli/cmd/sync/index.d.ts +1 -0
- package/dist/cli/cmd/sync/sync-core.d.ts +65 -0
- package/dist/cli/cmd/sync/sync-formatter.d.ts +12 -0
- package/dist/cli/cmd/sync/sync.cmd.d.ts +33 -0
- package/dist/cli/cmd/sync/sync.types.d.ts +50 -0
- package/dist/cli/cmd/vcs-reply/vcs-reply.cmd.d.ts +4 -4
- package/dist/cli/utils/ai-legacy/ai-legacy-agent.d.ts +12 -11
- package/dist/cli/utils/ai-legacy/ai-legacy-core.d.ts +33 -17
- package/dist/cli/utils/ai-legacy/ai-legacy-model.d.ts +42 -23
- package/dist/cli/utils/cat-gen/cat-gen.d.ts +19 -8
- package/dist/cli/utils/commit-gen/commit-gen.d.ts +39 -15
- package/dist/cli/utils/prompts/index.d.ts +6 -6
- package/dist/cli/utils/review-gen/review-gen.d.ts +33 -9
- package/dist/gennady.js +30 -10
- package/dist/index.d.ts +1 -0
- package/dist/index.js +44 -23
- package/dist/services/agent-mon/diff/diff.d.ts +9 -0
- package/dist/services/agent-mon/diff/index.d.ts +1 -0
- package/dist/services/agent-mon/index.d.ts +10 -0
- package/dist/services/agent-mon/model/agent-provider.type.d.ts +20 -0
- package/dist/services/agent-mon/model/agent-session.type.d.ts +49 -0
- package/dist/services/agent-mon/model/errors.d.ts +20 -0
- package/dist/services/agent-mon/model/index.d.ts +7 -0
- package/dist/services/agent-mon/model/observe-opts.type.d.ts +7 -0
- package/dist/services/agent-mon/model/scan-opts.type.d.ts +7 -0
- package/dist/services/agent-mon/model/session-changes.type.d.ts +10 -0
- package/dist/services/agent-mon/monitor/agent-monitor.d.ts +44 -0
- package/dist/services/agent-mon/monitor/create-monitor.d.ts +6 -0
- package/dist/services/agent-mon/monitor/index.d.ts +2 -0
- package/dist/services/agent-mon/observe/index.d.ts +1 -0
- package/dist/services/agent-mon/observe/observe.d.ts +12 -0
- package/dist/services/agent-mon/providers/claude/claude-provider.d.ts +50 -0
- package/dist/services/agent-mon/providers/claude/index.d.ts +5 -0
- package/dist/services/agent-mon/providers/claude/ps.d.ts +36 -0
- package/dist/services/agent-mon/providers/claude/session-json.d.ts +37 -0
- package/dist/services/agent-mon/providers/opencode/db.d.ts +41 -0
- package/dist/services/agent-mon/providers/opencode/index.d.ts +3 -0
- package/dist/services/agent-mon/providers/opencode/model-parser.d.ts +6 -0
- package/dist/services/agent-mon/providers/opencode/opencode-provider.d.ts +45 -0
- package/dist/services/ai-client/providers/ai-model.type.d.ts +14 -0
- package/dist/services/ai-client/providers/open-router/open-router-model.type.d.ts +1 -4
- package/dist/services/ai-client/providers/open-router/open-router-provider.d.ts +17 -0
- package/dist/services/ai-client/providers/openai-like-provider.d.ts +1 -0
- package/dist/services/data-ore/telegram/telegram-data-ore.d.ts +17 -0
- package/dist/services/data-ore/telegram/telegram-data-ore.types.d.ts +4 -0
- package/dist/services/data-ore/telegram/telegram-demo-music-helper.d.ts +1 -0
- package/dist/services/data-ore/telegram/telegram-demo.d.ts +1 -0
- package/dist/services/dbc/linter/dbc-ast-adapter.types.d.ts +82 -0
- package/dist/services/dbc/linter/dbc-linter.types.d.ts +95 -0
- package/dist/services/dbc/linter/implementations/ts/dbc-ts-ast-adapter.d.ts +183 -0
- package/dist/services/dbc/linter/implementations/ts/dbc-ts-linter.d.ts +152 -0
- package/dist/services/dbc/parser/dbc-parser.types.d.ts +16 -16
- package/dist/services/dbc/parser/implementations/jsdoc/dbc-jsdoc-parser.d.ts +14 -4
- package/dist/services/logger/logger.d.ts +26 -6
- package/dist/services/remote-console/client/remote-console-client-serializer.d.ts +7 -0
- package/dist/services/remote-console/client/remote-console-client.d.ts +20 -0
- package/dist/services/remote-console/client/remote-console-client.types.d.ts +88 -0
- package/dist/services/remote-console/remote-console.d.ts +6 -0
- package/dist/services/remote-console/server/remote-console-server.d.ts +10 -0
- package/dist/services/remote-console/server/remote-console-server.types.d.ts +44 -0
- package/dist/services/remote-console/server/remote-console-stdout-writer.d.ts +26 -0
- package/dist/services/vcs-client/abstract/vcs-client-merge-discussions.d.ts +22 -14
- package/dist/services/vcs-client/abstract/vcs-client-merge-requests.d.ts +31 -14
- package/dist/services/vcs-client/abstract/vcs-client-repository-files.d.ts +16 -0
- package/dist/services/vcs-client/abstract/vcs-client.d.ts +9 -5
- package/dist/services/vcs-client/entities/vcs-file-content.type.d.ts +24 -0
- package/dist/services/vcs-client/entities/vcs-merge-request-changes.type.d.ts +32 -0
- package/dist/services/vcs-client/entities/vcs-url.type.d.ts +14 -0
- package/dist/services/vcs-client/entities/vcs-user.type.d.ts +3 -0
- package/dist/services/vcs-client/github/vcs-github-client.d.ts +31 -0
- package/dist/services/vcs-client/github/vcs-github-merge-requests.d.ts +40 -0
- package/dist/services/vcs-client/github/vcs-github-repository-files.d.ts +27 -0
- package/dist/services/vcs-client/gitlab/vcs-gitlab-client.d.ts +13 -4
- package/dist/services/vcs-client/gitlab/vcs-gitlab-merge-discussions.d.ts +16 -5
- package/dist/services/vcs-client/gitlab/vcs-gitlab-merge-requests.d.ts +24 -5
- package/dist/services/vcs-client/gitlab/vcs-gitlab-repository-files.d.ts +27 -0
- package/dist/services/vcs-client/parse-vcs-url.d.ts +3 -0
- package/dist/shared/backend/git/git-core.d.ts +24 -22
- package/dist/shared/backend/git/git-diff.d.ts +16 -5
- package/dist/shared/backend/rc/rc-config.d.ts +27 -15
- package/dist/shared/common/exec.d.ts +4 -6
- package/dist/shared/common/files.d.ts +1 -3
- package/dist/shared/common/language.d.ts +3 -6
- package/dist/shared/common/parse-args.d.ts +1 -4
- package/dist/shared/common/style.d.ts +3 -3
- package/dist/shared/common/think.d.ts +1 -5
- package/dist/shared/common/tokens.d.ts +1 -5
- package/dist/shared/common/unguard.d.ts +4 -8
- package/dist/shared/common/xml.d.ts +16 -12
- package/package.json +20 -4
- package/dist/.ai/agents/agent-review-verifier.xml +0 -181
- package/dist/chunks/index-CNbmXK8M.js +0 -3548
- package/dist/chunks/services-Sb7TwLxt.js +0 -122
- package/dist/chunks/shared-BgLzFWMH.js +0 -577
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<Rulebook id="rulebook_data_structures" type="knowledge_base">
|
|
2
|
+
<Primary_Goal>
|
|
3
|
+
Предоставить Аудитору строгие критерии, механизмы (Big-O) и предохранители (Guardrails) для оценки эффективности структур данных (Array, Set, Map, Object, WeakMap, TypedArray) в JavaScript/TypeScript.
|
|
4
|
+
</Primary_Goal>
|
|
5
|
+
<Belief_State>
|
|
6
|
+
<Axiom id="AX_BIG_O_MATTERS">Неправильный выбор структуры данных ведет к O(n^2) сложности. На целевом железе (Mid-range CPU) вложенные сканирования массивов недопустимы.</Axiom>
|
|
7
|
+
<Axiom id="AX_ONE_TIME_COST">Конвертация Array в Set стоит O(n) времени и памяти. Это выгодно ТОЛЬКО если далее следуют множественные проверки (в цикле) или массив очень велик.</Axiom>
|
|
8
|
+
<Axiom id="AX_ENGINE_OPTIMIZATIONS">Массивы в JS оптимизированы для индексов. Объекты — для статических (известных заранее) ключей. Использование их не по назначению разрушает JIT-оптимизации (Hidden Classes / Elements Kinds).</Axiom>
|
|
9
|
+
</Belief_State>
|
|
10
|
+
<Rules_Registry>
|
|
11
|
+
<!-- ПРАВИЛО 1: O(n^2) Membership Lookup -->
|
|
12
|
+
<Rule id="DS_ARRAY_VS_SET_LOOKUP">
|
|
13
|
+
<Trigger_Signals>
|
|
14
|
+
- Использование `array.includes(val)`, `array.indexOf(val)` внутри циклов (`for`, `while`, `.filter`, `.map`).
|
|
15
|
+
- Ручная дедупликация: `if (!arr.includes(x)) arr.push(x)`.
|
|
16
|
+
</Trigger_Signals>
|
|
17
|
+
<Performance_Mechanism>
|
|
18
|
+
`.includes()` и `.indexOf()` работают за O(n). Вызов их внутри цикла (который тоже O(n)) дает квадратичную сложность O(n^2). `Set.has()` работает за O(1) (в среднем).
|
|
19
|
+
</Performance_Mechanism>
|
|
20
|
+
<Safety_Guardrails>
|
|
21
|
+
<Guardrail condition="TINY_ARRAY">Если искомый массив (needle) гарантированно мал (например, `['a', 'b', 'c'].includes(x)`), оставь Array. Накладные расходы на создание Set не окупятся.</Guardrail>
|
|
22
|
+
<Guardrail condition="MUTATION_IN_LOOP">Если искомый массив изменяется ВНУТРИ самого цикла, вынос `new Set()` перед циклом сломает логику (Set устареет). Отклонить оптимизацию.</Guardrail>
|
|
23
|
+
<Guardrail condition="ORDER_MATTERS">Если важен порядок элементов при возврате или нужны дубликаты (при дедупликации), убедись, что замена на Set не сломает бизнес-логику.</Guardrail>
|
|
24
|
+
</Safety_Guardrails>
|
|
25
|
+
<Directive_Template>
|
|
26
|
+
"Извлеки массив [ИМЯ] в `new Set([ИМЯ])` до начала цикла. Внутри цикла замени `[ИМЯ].includes(...)` на `[ИМЯ_SET].has(...)`."
|
|
27
|
+
</Directive_Template>
|
|
28
|
+
</Rule>
|
|
29
|
+
<!-- ПРАВИЛО 2: Объекты как Словари (Dynamic Maps) -->
|
|
30
|
+
<Rule id="DS_OBJECT_VS_MAP">
|
|
31
|
+
<Trigger_Signals>
|
|
32
|
+
- Использование `{}` для хранения данных с динамическими ключами (например, ID пользователей).
|
|
33
|
+
- Частые операции `delete obj[key]`.
|
|
34
|
+
- Итерация по ключам через `Object.keys()` в высоконагруженных местах.
|
|
35
|
+
</Trigger_Signals>
|
|
36
|
+
<Performance_Mechanism>
|
|
37
|
+
Добавление/удаление случайных ключей переводит объект V8 в медленный "dictionary mode", ломая Hidden Classes. Оператор `delete` на объектах деоптимизирует доступ. `Map` изначально спроектирован как хеш-таблица для динамических ключей, `Map.delete()` оптимизирован.
|
|
38
|
+
</Performance_Mechanism>
|
|
39
|
+
<Safety_Guardrails>
|
|
40
|
+
<Guardrail condition="STATIC_RECORD">Если объект используется как DTO/Record с известным набором полей (даже если некоторые `undefined`), оставь Object.</Guardrail>
|
|
41
|
+
<Guardrail condition="JSON_SERIALIZATION">Если объект сразу передается в `JSON.stringify()`, замена на `Map` сломает сериализацию (Map сериализуется в `{}`). Отклонить, если нет явного маппинга.</Guardrail>
|
|
42
|
+
</Safety_Guardrails>
|
|
43
|
+
<Directive_Template>
|
|
44
|
+
"Замени инициализацию `{}` на `new Map()`. Замени присвоения `obj[k] = v` на `.set(k, v)`, чтение на `.get(k)`, а удаление на `.delete(k)`."
|
|
45
|
+
</Directive_Template>
|
|
46
|
+
</Rule>
|
|
47
|
+
<!-- ПРАВИЛО 3: Очереди и сдвиги массивов -->
|
|
48
|
+
<Rule id="DS_QUEUE_SHIFT">
|
|
49
|
+
<Trigger_Signals>
|
|
50
|
+
- Использование `array.shift()` или `array.unshift()` внутри циклов (например, при обработке очереди задач или стримов).
|
|
51
|
+
</Trigger_Signals>
|
|
52
|
+
<Performance_Mechanism>
|
|
53
|
+
Удаление первого элемента (`shift`) заставляет движок переиндексировать ВЕСЬ массив. Это операция O(n). В цикле это дает O(n^2) и вызывает скачки Garbage Collector'а при росте очереди.
|
|
54
|
+
</Performance_Mechanism>
|
|
55
|
+
<Safety_Guardrails>
|
|
56
|
+
<Guardrail condition="RARE_CALLS">Если `shift()` вызывается редко или массив мал (менее 100 элементов), игнорировать.</Guardrail>
|
|
57
|
+
</Safety_Guardrails>
|
|
58
|
+
<Directive_Template>
|
|
59
|
+
"Обнаружено использование `shift()` в цикле (O(n^2)). Замени массив на структуру Ring Buffer (циклический буфер) или используй два массива с `push/pop` для эмуляции очереди."
|
|
60
|
+
</Directive_Template>
|
|
61
|
+
</Rule>
|
|
62
|
+
<!-- ПРАВИЛО 4: Утечки памяти в кэшах -->
|
|
63
|
+
<Rule id="DS_WEAKMAP_CACHE">
|
|
64
|
+
<Trigger_Signals>
|
|
65
|
+
- Кэширование данных, где ключом выступает объект (например, DOM-узел, инстанс класса, req/res объекты). `cache.set(obj, data)`.
|
|
66
|
+
</Trigger_Signals>
|
|
67
|
+
<Performance_Mechanism>
|
|
68
|
+
Обычный `Map` или `Object` держит сильную ссылку на ключи. Если объект удален из приложения, кэш не даст Garbage Collector'у очистить память (Memory Leak). `WeakMap` позволяет GC удалять ключи.
|
|
69
|
+
</Performance_Mechanism>
|
|
70
|
+
<Safety_Guardrails>
|
|
71
|
+
<Guardrail condition="PRIMITIVE_KEYS">`WeakMap` поддерживает ТОЛЬКО объекты в качестве ключей. Если ключ — строка или число, замена вызовет TypeError.</Guardrail>
|
|
72
|
+
<Guardrail condition="ITERATION_REQUIRED">`WeakMap` неитерируем (`.keys()`, `.size` недоступны). Если логика требует обхода кэша, отклонить.</Guardrail>
|
|
73
|
+
</Safety_Guardrails>
|
|
74
|
+
<Directive_Template>
|
|
75
|
+
"Измени `new Map()` на `new WeakMap()`, так как ключами выступают объекты. Это предотвратит утечку памяти, позволив GC собирать удаленные объекты."
|
|
76
|
+
</Directive_Template>
|
|
77
|
+
</Rule>
|
|
78
|
+
<!-- ПРАВИЛО 5: Бинарные и числовые вычисления -->
|
|
79
|
+
<Rule id="DS_TYPED_ARRAYS">
|
|
80
|
+
<Trigger_Signals>
|
|
81
|
+
- Инициализация огромных массивов чисел `new Array(1000000)`.
|
|
82
|
+
- Обработка пикселей, аудио, WebGL, парсинг бинарных протоколов.
|
|
83
|
+
</Trigger_Signals>
|
|
84
|
+
<Performance_Mechanism>
|
|
85
|
+
Обычные массивы хранят числа как 64-bit float или Smi, но имеют оверхед на структуру. TypedArrays (`Uint8Array`, `Float32Array`) выделяют непрерывный блок памяти (как в C/C++), что радикально ускоряет доступ и снижает потребление RAM.
|
|
86
|
+
</Performance_Mechanism>
|
|
87
|
+
<Safety_Guardrails>
|
|
88
|
+
<Guardrail condition="MIXED_TYPES">Если массив может содержать `null`, `undefined`, строки или объекты — TypedArray вызовет ошибку. Массив должен быть строго гомогенным (только числа).</Guardrail>
|
|
89
|
+
<Guardrail condition="DYNAMIC_SIZE">TypedArray имеет фиксированную длину. Если код активно использует `.push()` или `.pop()`, замена потребует сложного ручного реаллоцирования памяти. Отклонить, если размер не известен заранее.</Guardrail>
|
|
90
|
+
</Safety_Guardrails>
|
|
91
|
+
<Directive_Template>
|
|
92
|
+
"Замени `new Array(size)` на `new [ТИП]Array(size)` (например, Float64Array). Это обеспечит непрерывное выделение памяти и ускорит математические операции."
|
|
93
|
+
</Directive_Template>
|
|
94
|
+
</Rule>
|
|
95
|
+
</Rules_Registry>
|
|
96
|
+
<Verification_Protocol>
|
|
97
|
+
При получении сигнала от Оркестратора:
|
|
98
|
+
1. Найди соответствующее `<Rule>` по ID или описанию.
|
|
99
|
+
2. Проверь код по КАЖДОМУ `<Guardrail>` в секции `<Safety_Guardrails>`.
|
|
100
|
+
3. Если хоть один Guardrail срабатывает (нарушается безопасность или профит сомнителен) — немедленно отбрасывай триггер (False Positive).
|
|
101
|
+
4. Если проверки пройдены, используй `<Directive_Template>` для формулировки указания DevAgent'у.
|
|
102
|
+
</Verification_Protocol>
|
|
103
|
+
</Rulebook>
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<Rulebook id="rulebook_iteration_fusion" type="knowledge_base">
|
|
2
|
+
<Primary_Goal>
|
|
3
|
+
Предоставить Аудитору критерии для обнаружения избыточных итераций по коллекциям, пропущенных ранних выходов (Early Exit) и скрытых аллокаций промежуточных массивов.
|
|
4
|
+
</Primary_Goal>
|
|
5
|
+
<Belief_State>
|
|
6
|
+
<Axiom id="AX_ALLOCATION_IS_ENEMY">Каждый вызов `.map()`, `.filter()`, `.flat()` или `Array.from()` создает в памяти НОВЫЙ массив. На целевом железе (4-8 GB RAM) цепочка из 3 таких методов вызывает 3 аллокации и 3 прохода по данным, провоцируя микропаузы GC.</Axiom>
|
|
7
|
+
<Axiom id="AX_EARLY_EXIT">Сканирование 100% массива, когда для ответа достаточно найти один элемент — это растрата процессорного времени. Ранний выход всегда предпочтительнее полного прохода.</Axiom>
|
|
8
|
+
<Axiom id="AX_AI_READABILITY">Человеческая привычка писать "декларативные цепочки" (chaining) не имеет ценности для ИИ. Однопроходный императивный `for...of` с условиями работает быстрее и потребляет меньше памяти.</Axiom>
|
|
9
|
+
</Belief_State>
|
|
10
|
+
<Rules_Registry>
|
|
11
|
+
<!-- ПРАВИЛО 1: Упущенный ранний выход (Missed Early Exit) -->
|
|
12
|
+
<Rule id="ITER_EARLY_EXIT">
|
|
13
|
+
<Trigger_Signals>
|
|
14
|
+
- `.filter(predicate)[0]`, `.filter(predicate).at(0)`, `.filter(predicate).slice(0, 1)[0]`.
|
|
15
|
+
- `.filter(predicate).length > 0`, `.filter(predicate).length === 0`.
|
|
16
|
+
- Использование `forEach` с попыткой сделать `return` внутри (что не прерывает цикл).
|
|
17
|
+
</Trigger_Signals>
|
|
18
|
+
<Performance_Mechanism>
|
|
19
|
+
`.filter()` всегда проходит массив до конца и аллоцирует новый массив результатов. Если нужен только один элемент или проверка существования, это пустая трата CPU и RAM. Методы `.find()`, `.some()`, `.every()` останавливают итерацию (Short-circuit) при первом совпадении.
|
|
20
|
+
</Performance_Mechanism>
|
|
21
|
+
<Safety_Guardrails>
|
|
22
|
+
<Guardrail condition="RESULT_REUSED">Если результат `.filter()` сохраняется в переменную и затем используется ПОЛНОСТЬЮ где-то еще, а не только для получения первого элемента/длины — отклонить.</Guardrail>
|
|
23
|
+
</Safety_Guardrails>
|
|
24
|
+
<Directive_Template>
|
|
25
|
+
"Упущенный ранний выход. Для поиска элемента замени `.filter(...)[0]` на `.find(...)`. Для проверки наличия замени `.filter(...).length > 0` на `.some(...)` (или `.every(...)`)."
|
|
26
|
+
</Directive_Template>
|
|
27
|
+
</Rule>
|
|
28
|
+
<!-- ПРАВИЛО 2: Мусорные возвраты (Unused Array Returns) -->
|
|
29
|
+
<Rule id="ITER_UNUSED_RETURN">
|
|
30
|
+
<Trigger_Signals>
|
|
31
|
+
- Вызов `.map()`, `.filter()`, `.flatMap()` как самостоятельного выражения (результат не присваивается переменной и не возвращается из функции).
|
|
32
|
+
</Trigger_Signals>
|
|
33
|
+
<Performance_Mechanism>
|
|
34
|
+
Эти методы специфицированы так, чтобы всегда создавать и возвращать новый массив. Если результат игнорируется, массив сразу помечается как мусор, перегружая GC.
|
|
35
|
+
</Performance_Mechanism>
|
|
36
|
+
<Safety_Guardrails>
|
|
37
|
+
<Guardrail condition="NONE">Это 100% антипаттерн. Исключений нет.</Guardrail>
|
|
38
|
+
</Safety_Guardrails>
|
|
39
|
+
<Directive_Template>
|
|
40
|
+
"Мусорная аллокация. Результат `.map()` / `.filter()` не используется. Замени на `.forEach()` или цикл `for...of` для выполнения побочных эффектов без создания промежуточного массива."
|
|
41
|
+
</Directive_Template>
|
|
42
|
+
</Rule>
|
|
43
|
+
<!-- ПРАВИЛО 3: Слияние циклов (Loop Fusion) -->
|
|
44
|
+
<Rule id="ITER_FUSION_CHAINING">
|
|
45
|
+
<Trigger_Signals>
|
|
46
|
+
- Цепочки вызовов: `.filter(a).map(b)`, `.map(a).filter(b)`, `.filter(a).filter(b)`.
|
|
47
|
+
</Trigger_Signals>
|
|
48
|
+
<Performance_Mechanism>
|
|
49
|
+
Каждый шаг цепочки требует прохода по массиву (O(N)) и создания нового массива в памяти. Слияние (Fusion) этих шагов в один проход снижает сложность с O(K*N) до O(N) и оставляет только 1 аллокацию финального массива.
|
|
50
|
+
</Performance_Mechanism>
|
|
51
|
+
<Safety_Guardrails>
|
|
52
|
+
<Guardrail condition="INDEX_DEPENDENCY">Если коллбэк во второй функции цепочки использует индекс элемента (например, `.filter(x => x > 0).map((x, i) => ...)`), слияние в один цикл изменит значение `i` (индекс отфильтрованного массива не совпадает с оригинальным). Отклонить или предупредить DevAgent о необходимости ручного инкремента индекса.</Guardrail>
|
|
53
|
+
</Safety_Guardrails>
|
|
54
|
+
<Directive_Template>
|
|
55
|
+
"Промежуточные аллокации в цепочке. Слей `.filter().map()` в один проход. Используй цикл `for...of` с `if` и `.push()`, либо `.reduce()`, чтобы избежать создания промежуточных массивов."
|
|
56
|
+
</Directive_Template>
|
|
57
|
+
</Rule>
|
|
58
|
+
<!-- ПРАВИЛО 4: Оптимизация .map().flat() -->
|
|
59
|
+
<Rule id="ITER_FLATMAP">
|
|
60
|
+
<Trigger_Signals>
|
|
61
|
+
- Цепочка `.map(fn).flat()` или `.map(fn).flat(1)`.
|
|
62
|
+
</Trigger_Signals>
|
|
63
|
+
<Performance_Mechanism>
|
|
64
|
+
Создает промежуточный массив после `map`, а затем еще один после `flat`. Метод `flatMap` выполняет обе операции за один проход с одной аллокацией.
|
|
65
|
+
</Performance_Mechanism>
|
|
66
|
+
<Safety_Guardrails>
|
|
67
|
+
<Guardrail condition="DEEP_FLATTEN">Метод `flatMap` сплющивает только на глубину 1. Если в коде используется `.flat(2)` или глубже, замена на `flatMap` сломает структуру. Отклонить.</Guardrail>
|
|
68
|
+
</Safety_Guardrails>
|
|
69
|
+
<Directive_Template>
|
|
70
|
+
"Избыточная аллокация массива. Замени цепочку `.map(...).flat()` на единый вызов `.flatMap(...)`."
|
|
71
|
+
</Directive_Template>
|
|
72
|
+
</Rule>
|
|
73
|
+
<!-- ПРАВИЛО 5: Оптимизация Array.from -->
|
|
74
|
+
<Rule id="ITER_ARRAY_FROM_MAP">
|
|
75
|
+
<Trigger_Signals>
|
|
76
|
+
- Использование `Array.from(iterable).map(fn)`.
|
|
77
|
+
</Trigger_Signals>
|
|
78
|
+
<Performance_Mechanism>
|
|
79
|
+
Создает массив из итерируемого объекта (например, Set, NodeList), а затем создает ЕЩЕ ОДИН массив через `.map()`. Встроенный маппер `Array.from(iterable, fn)` избегает первой аллокации.
|
|
80
|
+
</Performance_Mechanism>
|
|
81
|
+
<Safety_Guardrails>
|
|
82
|
+
<Guardrail condition="THIRD_ARGUMENT_USAGE">Функция маппинга в `Array.from` не получает сам массив в качестве третьего аргумента (в отличие от `.map()`). Если `fn` использует 3-й аргумент, замена сломает код. Отклонить.</Guardrail>
|
|
83
|
+
</Safety_Guardrails>
|
|
84
|
+
<Directive_Template>
|
|
85
|
+
"Двойная аллокация массива. Объедини вызовы: передай функцию маппинга вторым аргументом в `Array.from` (т.е. `Array.from(iterable, fn)`)."
|
|
86
|
+
</Directive_Template>
|
|
87
|
+
</Rule>
|
|
88
|
+
</Rules_Registry>
|
|
89
|
+
<Verification_Protocol>
|
|
90
|
+
При получении сигнала от Оркестратора:
|
|
91
|
+
1. Идентифицируй целевое `<Rule>`.
|
|
92
|
+
2. Обязательно проверь `INDEX_DEPENDENCY` при слиянии циклов и `THIRD_ARGUMENT_USAGE` при `Array.from`. Это самые частые причины поломки логики при автоматическом рефакторинге.
|
|
93
|
+
3. Задокументируй верификацию в `<Verification_Log>`.
|
|
94
|
+
4. Сформируй приказ для DevAgent через `<Directive_Template>`, указав семантический якорь (например, "Внутри функции calculateMetrics, при обработке массива data").
|
|
95
|
+
</Verification_Protocol>
|
|
96
|
+
</Rulebook>
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<Rulebook id="rulebook_memory_gc" type="knowledge_base">
|
|
2
|
+
<Primary_Goal>
|
|
3
|
+
Предоставить Аудитору критерии для выявления утечек памяти (Memory Leaks) и избыточного давления на сборщик мусора (GC Pressure). Обеспечить строгие предохранители (Guardrails) при оптимизации аллокаций.
|
|
4
|
+
</Primary_Goal>
|
|
5
|
+
<Belief_State>
|
|
6
|
+
<Axiom id="AX_GC_PRESSURE">На устройствах с малым объемом RAM высокая скорость выделения памяти (Allocation Rate) заставляет GC работать непрерывно. Это блокирует главный поток (Main Thread) и вызывает лаги.</Axiom>
|
|
7
|
+
<Axiom id="AX_RETAINED_MEMORY">Данные, до которых можно добраться от глобального объекта (window/global) или активного замыкания (таймер/событие), никогда не будут удалены GC. Это прямая утечка памяти.</Axiom>
|
|
8
|
+
<Axiom id="AX_HOISTING_SAFETY">Вынос (hoisting) объектов или регулярных выражений из цикла безопасен только в том случае, если их состояние не мутируется и не сохраняется в массив/замыкание на каждой итерации.</Axiom>
|
|
9
|
+
</Belief_State>
|
|
10
|
+
<Rules_Registry>
|
|
11
|
+
<!-- ПРАВИЛО 1: Утечки в глобальных кэшах -->
|
|
12
|
+
<Rule id="MEM_UNBOUNDED_CACHE">
|
|
13
|
+
<Trigger_Signals>
|
|
14
|
+
- Объявление `const cache = new Map();` или `const cache = {};` на уровне модуля (глобально).
|
|
15
|
+
- Использование функции, которая постоянно делает `cache.set(key, value)`, но нигде не вызывает `cache.delete()` или не имеет лимита размера.
|
|
16
|
+
</Trigger_Signals>
|
|
17
|
+
<Performance_Mechanism>
|
|
18
|
+
Unbounded Cache (неограниченный кэш) бесконечно накапливает ключи и значения. В долгоживущих приложениях (SPA, Node.js серверы) это приводит к исчерпанию памяти (OOM - Out of Memory).
|
|
19
|
+
</Performance_Mechanism>
|
|
20
|
+
<Safety_Guardrails>
|
|
21
|
+
<Guardrail condition="FIXED_ENUM">Если объект используется как статический справочник (например, маппинг кодов ошибок на строки), размер которого фиксирован и известен заранее — игнорировать.</Guardrail>
|
|
22
|
+
<Guardrail condition="WEAK_COLLECTION">Если уже используется `WeakMap` или `WeakSet`, это безопасно (GC сам очистит память при удалении ключа).</Guardrail>
|
|
23
|
+
</Safety_Guardrails>
|
|
24
|
+
<Directive_Template>
|
|
25
|
+
"Обнаружен неограниченный кэш [ИМЯ_ПЕРЕМЕННОЙ], ведущий к утечке памяти. Оберни его в реализацию LRU-кэша (с ограничением `maxSize`), либо используй `WeakMap`, если ключами выступают объекты."
|
|
26
|
+
</Directive_Template>
|
|
27
|
+
</Rule>
|
|
28
|
+
<!-- ПРАВИЛО 2: Незавершенные таймеры и слушатели -->
|
|
29
|
+
<Rule id="MEM_TIMER_LISTENER_LEAK">
|
|
30
|
+
<Trigger_Signals>
|
|
31
|
+
- Вызов `setInterval(...)` или `window.addEventListener(...)` в компонентах/классах.
|
|
32
|
+
- Отсутствие вызовов `clearInterval` или `removeEventListener` в методах очистки (например, `componentWillUnmount`, `useEffect` cleanup).
|
|
33
|
+
</Trigger_Signals>
|
|
34
|
+
<Performance_Mechanism>
|
|
35
|
+
Таймеры и глобальные слушатели событий создают "GC Roots" (корни сборки мусора). Любые переменные, захваченные внутри их коллбэков (замыкания), будут жить в памяти вечно, даже если сам компонент или DOM-узел был удален.
|
|
36
|
+
</Performance_Mechanism>
|
|
37
|
+
<Safety_Guardrails>
|
|
38
|
+
<Guardrail condition="GLOBAL_APP_LIFECYCLE">Если таймер или слушатель должен жить всё время работы приложения (например, глобальный роутер или heartbeat веб-сокета), игнорировать.</Guardrail>
|
|
39
|
+
</Safety_Guardrails>
|
|
40
|
+
<Directive_Template>
|
|
41
|
+
"Утечка памяти:[ИМЯ_ТАЙМЕРА_ИЛИ_СОБЫТИЯ] не очищается. Сохрани возвращаемый ID таймера или ссылку на функцию-обработчик и добавь вызов очистки (`clearInterval` / `removeEventListener`) в фазу демонтирования/завершения."
|
|
42
|
+
</Directive_Template>
|
|
43
|
+
</Rule>
|
|
44
|
+
<!-- ПРАВИЛО 3: Дорогие инстанциации в циклах -->
|
|
45
|
+
<Rule id="MEM_EXPENSIVE_INSTANTIATION">
|
|
46
|
+
<Trigger_Signals>
|
|
47
|
+
- `new RegExp(pattern)` внутри циклов `for`, `.map()`, `.filter()`.
|
|
48
|
+
- `new Intl.DateTimeFormat(...)` или `new Intl.NumberFormat(...)` внутри циклов.
|
|
49
|
+
</Trigger_Signals>
|
|
50
|
+
<Performance_Mechanism>
|
|
51
|
+
Компиляция регулярного выражения или инициализация форматтеров `Intl.*` — крайне тяжелые операции для CPU и памяти. Выполнение их на каждой итерации цикла вызывает катастрофическое падение производительности.
|
|
52
|
+
</Performance_Mechanism>
|
|
53
|
+
<Safety_Guardrails>
|
|
54
|
+
<Guardrail condition="DYNAMIC_PATTERN">Если паттерн регулярки или настройки форматтера зависят от переменной цикла (меняются каждую итерацию), выносить их наружу нельзя. В таком случае предложить кэширование (memoization) инстансов.</Guardrail>
|
|
55
|
+
</Safety_Guardrails>
|
|
56
|
+
<Directive_Template>
|
|
57
|
+
"Дорогая инициализация [ОБЪЕКТ] внутри цикла. Вынеси инициализацию `new RegExp` / `Intl.*Format` за пределы цикла в константу и переиспользуй её внутри итераций."
|
|
58
|
+
</Directive_Template>
|
|
59
|
+
</Rule>
|
|
60
|
+
<!-- ПРАВИЛО 4: Аллокация промежуточных объектов/массивов в горячих путях -->
|
|
61
|
+
<Rule id="MEM_HOT_LOOP_ALLOCATION">
|
|
62
|
+
<Trigger_Signals>
|
|
63
|
+
- Использование spread оператора `...` (например, `acc = [...acc, item]`) внутри `reduce` или циклов.
|
|
64
|
+
- Вызовы `array.slice()`, `array.concat()` на каждой итерации.
|
|
65
|
+
- Создание новых объектов `const obj = { id: i }` в высокочастотных циклах (math, render loops).
|
|
66
|
+
</Trigger_Signals>
|
|
67
|
+
<Performance_Mechanism>
|
|
68
|
+
Синтаксис `[...acc, item]` на каждой итерации создает полностью новый массив, копируя все предыдущие элементы. Это дает алгоритмическую сложность O(n^2) по времени и памяти. Создание временных объектов в tight loops переполняет Nursery (младшее поколение кучи), провоцируя постоянные паузы GC.
|
|
69
|
+
</Performance_Mechanism>
|
|
70
|
+
<Safety_Guardrails>
|
|
71
|
+
<Guardrail condition="IMMUTABILITY_REQUIRED">Если архитектура (например, Redux reducer) жестко требует иммутабельности, замена на мутацию (`.push`) сломает стейт-менеджмент. Отклонить, если это чистая функция редюсера.</Guardrail>
|
|
72
|
+
<Guardrail condition="REFERENCE_CAPTURE">Если создаваемый в цикле объект сохраняется в массив (например, `arr.push(obj)`), НЕЛЬЗЯ выносить создание объекта за цикл и переиспользовать его. Иначе массив будет состоять из ссылок на один и тот же мутированный объект.</Guardrail>
|
|
73
|
+
</Safety_Guardrails>
|
|
74
|
+
<Directive_Template>
|
|
75
|
+
"Квадратичная аллокация памяти в цикле. Замени копирование `[...acc, item]` или `.concat()` на мутацию локальной переменной через `acc.push(item)`. Для объектов — если объект не сохраняется по ссылке, вынеси его декларацию за цикл и переиспользуй поля."
|
|
76
|
+
</Directive_Template>
|
|
77
|
+
</Rule>
|
|
78
|
+
<!-- ПРАВИЛО 5: Утечки отсоединенных DOM-узлов (Detached DOM) -->
|
|
79
|
+
<Rule id="MEM_DETACHED_DOM">
|
|
80
|
+
<Trigger_Signals>
|
|
81
|
+
- Сохранение ссылок на DOM-элементы (`document.getElementById(...)`) в JS-объекты или массивы.
|
|
82
|
+
- Удаление элемента из DOM (`node.remove()` или `innerHTML = ''`), но без `null` в JS-ссылке.
|
|
83
|
+
</Trigger_Signals>
|
|
84
|
+
<Performance_Mechanism>
|
|
85
|
+
Если DOM-узел удален из документа, но JS-переменная всё еще ссылается на него (Detached DOM), сборщик мусора не может удалить ни этот узел, ни всё его поддерево. Это тяжелая утечка памяти в браузерах.
|
|
86
|
+
</Performance_Mechanism>
|
|
87
|
+
<Safety_Guardrails>
|
|
88
|
+
<Guardrail condition="INTENTIONAL_CACHE">Если узел специально кэшируется для быстрого повторного добавления в DOM (например, virtual list/DOM recycling) — игнорировать.</Guardrail>
|
|
89
|
+
</Safety_Guardrails>
|
|
90
|
+
<Directive_Template>
|
|
91
|
+
"Возможна утечка Detached DOM. Переменная ссылается на удаленный узел. Добавь обнуление ссылки (`[ИМЯ] = null` или `delete obj[key]`) сразу после удаления узла из документа."
|
|
92
|
+
</Directive_Template>
|
|
93
|
+
</Rule>
|
|
94
|
+
</Rules_Registry>
|
|
95
|
+
<Verification_Protocol>
|
|
96
|
+
При получении сигнала от Оркестратора:
|
|
97
|
+
1. Найди соответствующее `<Rule>` по ID.
|
|
98
|
+
2. Проверь код по КАЖДОМУ `<Guardrail>` в секции `<Safety_Guardrails>`. Особое внимание обрати на REFERENCE_CAPTURE и IMMUTABILITY_REQUIRED.
|
|
99
|
+
3. Если хоть один Guardrail срабатывает — отбрасывай триггер (False Positive) и фиксируй это в `<Verification_Log>`.
|
|
100
|
+
4. Если проверки пройдены, используй `<Directive_Template>` для формулировки указания DevAgent'у.
|
|
101
|
+
</Verification_Protocol>
|
|
102
|
+
</Rulebook>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# SDD — Spec-Driven Development
|
|
2
|
+
|
|
3
|
+
Фреймворк для разработки через спецификации. Каждая директива запускается в **изолированной сессии** и производит самостоятельный артефакт.
|
|
4
|
+
|
|
5
|
+
## Поток
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
setup ──► discovery ──► module-decomposition? ──► task-scaffolding ──► sdd-execute (orchestrator) ──► audit
|
|
9
|
+
(per scope) (library/product only) (convergence) │
|
|
10
|
+
├─► phase-subagent (P1, P2, ...)
|
|
11
|
+
│ under phase-execution-protocol
|
|
12
|
+
│
|
|
13
|
+
└─► audit-subagent
|
|
14
|
+
(auto-dispatched after Round close)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Директивы
|
|
18
|
+
|
|
19
|
+
| Директива | Что делает | Входные данные | Выходные данные |
|
|
20
|
+
| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------- | ----------------------------------------- |
|
|
21
|
+
| `setup.directive.xml` | Создаёт/обновляет портал проекта — Vision и Scope Graph | Намерение оператора | `specs/README.md` |
|
|
22
|
+
| `discovery.directive.xml` | Проектирует scope: vision, архитектура, инструменты, Bootstrap Requirements | Название scope + scope-type | `specs/<scope>/<scope>.spec.md` |
|
|
23
|
+
| `module-decomposition.directive.xml` | Декомпозирует scope на модули (только library/product) | scope-spec | `specs/<scope>/<module>/<module>.spec.md` |
|
|
24
|
+
| `task-scaffolding.directive.xml` | Строит DAG task-тикетов с Phases Overview, BDD, правилами per phase | Все scope-specs | `tasks/<scope>/*.task-NN.md` |
|
|
25
|
+
| `phase-execution-protocol.xml` | Выполняет ОДНУ фазу одного тикета (диспетчится `sdd-execute` оркестратором) | Phase ID + ticket + Handoff | Изменения в Target Files фазы + лог-блок |
|
|
26
|
+
| `audit.directive.xml` | Проверяет выравнивание: spec ↔ тикет ↔ код; маппит finding-ы на фазы | Закрытый Round + код | Эфемерный отчёт + `phases_to_fix` |
|
|
27
|
+
|
|
28
|
+
Оркестрация — через SKILL-ы (`sdd-execute`, `sdd-execute-batch`). Они читают только заголовок тикета + Phases Overview и диспетчат phase-subagent-ов; никогда не выполняют сами.
|
|
29
|
+
|
|
30
|
+
## Scope Model
|
|
31
|
+
|
|
32
|
+
**Scope** — архитектурно когерентная единица со своим runtime / deployment / стеком / UX-surface.
|
|
33
|
+
|
|
34
|
+
| scope-type | Пример scopes | Ключевые секции спека |
|
|
35
|
+
| ---------------- | ---------------------------- | --------------------------------------------------- |
|
|
36
|
+
| `infrastructure` | `infra-base`, `infra-golang` | Tool Stack, Dev Workflow, Verification Commands |
|
|
37
|
+
| `contracts` | `api-contracts` | Interfaces, Versioning Policy, Compatibility Matrix |
|
|
38
|
+
| `library` | `design-system-core` | Golden DX, Public API, DbC |
|
|
39
|
+
| `product` | `backend`, `web`, `mobile` | Vision, Requirements Gate, Architecture, Modules |
|
|
40
|
+
|
|
41
|
+
## Правила
|
|
42
|
+
|
|
43
|
+
Правила организованы в три категории. Каждый тикет декларирует фазы (`## 2. Phases Overview`), а каждая фаза содержит свой `Rules:` bullet-список — отфильтрованный subset, релевантный именно этой фазе.
|
|
44
|
+
|
|
45
|
+
| Категория | Директория | Назначение |
|
|
46
|
+
| --------- | ------------------------ | -------------------------------- |
|
|
47
|
+
| Coding | `ai/directives/coding/` | Как писать код (язык + паттерны) |
|
|
48
|
+
| Testing | `ai/directives/testing/` | Как писать тесты (фреймворк) |
|
|
49
|
+
| Infra | `ai/directives/infra/` | Как конфигурировать инструменты |
|