@nitra/cursor 11.4.1 → 12.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/.claude-template/hooks/normalize-decisions.sh +34 -3
- package/.pi-template/extensions/n-cursor-adr/docs/index.md +3 -5
- package/CHANGELOG.md +6 -0
- package/bin/n-cursor.js +2 -8
- package/docs/index.md +12 -0
- package/docs/stryker.config.md +3 -5
- package/docs/vitest.config.md +3 -5
- package/lib/docs/index.md +14 -0
- package/lib/docs/llm.md +4 -6
- package/lib/docs/models.md +3 -5
- package/lib/docs/omlx-trace.md +3 -5
- package/lib/docs/omlx.md +4 -6
- package/package.json +2 -1
- package/rules/abie/docs/fix.md +3 -5
- package/rules/abie/docs/index.md +11 -0
- package/rules/abie/js/docs/applies.md +3 -5
- package/rules/abie/js/docs/env_dns.md +3 -5
- package/rules/abie/js/docs/firebase_hosting.md +3 -5
- package/rules/abie/js/docs/hc_pairing.md +3 -5
- package/rules/abie/js/docs/index.md +16 -0
- package/rules/abie/js/docs/ua_http_route.md +3 -5
- package/rules/abie/js/docs/ua_node_selector.md +3 -5
- package/rules/abie/lib/docs/enabled.md +3 -5
- package/rules/abie/lib/docs/env-dns.md +3 -5
- package/rules/abie/lib/docs/hc-yaml.md +3 -5
- package/rules/abie/lib/docs/http-route.md +3 -5
- package/rules/abie/lib/docs/index.md +18 -0
- package/rules/abie/lib/docs/k8s-tree.md +3 -5
- package/rules/abie/lib/docs/kustomization-patches.md +3 -5
- package/rules/abie/lib/docs/overlay-paths.md +3 -5
- package/rules/abie/lib/docs/yaml.md +3 -5
- package/rules/adr/adr.mdc +2 -2
- package/rules/adr/docs/fix.md +3 -5
- package/rules/adr/docs/index.md +11 -0
- package/rules/adr/js/docs/hooks.md +3 -5
- package/rules/adr/js/docs/index.md +11 -0
- package/rules/bun/docs/fix.md +3 -5
- package/rules/bun/docs/index.md +11 -0
- package/rules/bun/js/docs/index.md +11 -0
- package/rules/bun/js/docs/layout.md +3 -5
- package/rules/capacitor/docs/fix.md +3 -5
- package/rules/capacitor/docs/index.md +11 -0
- package/rules/capacitor/js/docs/index.md +11 -0
- package/rules/capacitor/js/docs/platforms.md +3 -5
- package/rules/changelog/docs/fix.md +3 -5
- package/rules/changelog/docs/index.md +11 -0
- package/rules/changelog/js/docs/consistency.md +3 -5
- package/rules/changelog/js/docs/index.md +11 -0
- package/rules/changelog/lib/docs/index.md +11 -0
- package/rules/changelog/lib/docs/package-manifest.md +3 -5
- package/rules/ci4/docs/fix.md +3 -5
- package/rules/ci4/docs/index.md +11 -0
- package/rules/ci4/js/docs/index.md +11 -0
- package/rules/ci4/js/docs/marksman_config.md +3 -5
- package/rules/doc-files/docs/fix.md +3 -5
- package/rules/doc-files/docs/index.md +11 -0
- package/rules/doc-files/js/docgen-crc.mjs +50 -14
- package/rules/doc-files/js/docgen-files-batch.mjs +73 -2
- package/rules/doc-files/js/docs/docgen-crc.md +4 -6
- package/rules/doc-files/js/docs/docgen-extract-anchors.md +3 -5
- package/rules/doc-files/js/docs/docgen-extract.md +3 -5
- package/rules/doc-files/js/docs/docgen-files-batch.md +4 -6
- package/rules/doc-files/js/docs/docgen-gen.md +4 -6
- package/rules/doc-files/js/docs/docgen-ignore.md +3 -5
- package/rules/doc-files/js/docs/docgen-judge-measure.md +3 -5
- package/rules/doc-files/js/docs/docgen-judge.md +3 -5
- package/rules/doc-files/js/docs/docgen-prompts.md +3 -5
- package/rules/doc-files/js/docs/docgen-scan.md +4 -6
- package/rules/doc-files/js/docs/index.md +24 -0
- package/rules/doc-files/js/docs/lint.md +4 -6
- package/rules/doc-files/js/docs/units-js.md +3 -5
- package/rules/doc-files/js/docs/units-rs.md +3 -5
- package/rules/doc-files/js/docs/units.md +3 -5
- package/rules/doc-files/lint/docs/index.md +11 -0
- package/rules/doc-files/lint/docs/lint.md +3 -5
- package/rules/docker/docs/fix.md +3 -5
- package/rules/docker/docs/index.md +11 -0
- package/rules/docker/js/docs/index.md +11 -0
- package/rules/docker/js/docs/lint.md +3 -5
- package/rules/docker/lib/docs/docker-hadolint.md +3 -5
- package/rules/docker/lib/docs/docker-mirror.md +3 -5
- package/rules/docker/lib/docs/docker-native-addon.md +3 -5
- package/rules/docker/lib/docs/docker-nginx-user.md +3 -5
- package/rules/docker/lib/docs/index.md +14 -0
- package/rules/docker/lint/docs/index.md +11 -0
- package/rules/docker/lint/docs/lint.md +3 -5
- package/rules/efes/docs/fix.md +3 -5
- package/rules/efes/docs/index.md +11 -0
- package/rules/feedback/docs/fix.md +3 -5
- package/rules/feedback/docs/index.md +11 -0
- package/rules/ga/docs/fix.md +3 -5
- package/rules/ga/docs/index.md +11 -0
- package/rules/ga/js/docs/index.md +12 -0
- package/rules/ga/js/docs/lint.md +3 -5
- package/rules/ga/js/docs/workflows.md +3 -5
- package/rules/ga/lint/docs/index.md +11 -0
- package/rules/ga/lint/docs/lint.md +3 -5
- package/rules/graphql/docs/fix.md +3 -5
- package/rules/graphql/docs/index.md +11 -0
- package/rules/graphql/js/docs/index.md +11 -0
- package/rules/graphql/js/docs/tooling.md +3 -5
- package/rules/graphql/lib/docs/graphql-gql-scan.md +3 -5
- package/rules/graphql/lib/docs/index.md +11 -0
- package/rules/hasura/docs/fix.md +3 -5
- package/rules/hasura/docs/index.md +11 -0
- package/rules/hasura/js/docs/index.md +11 -0
- package/rules/hasura/js/docs/internal_urls.md +3 -5
- package/rules/image-avif/docs/fix.md +3 -5
- package/rules/image-avif/docs/index.md +11 -0
- package/rules/image-avif/js/docs/avif_generation.md +3 -5
- package/rules/image-avif/js/docs/index.md +11 -0
- package/rules/image-compress/docs/fix.md +3 -5
- package/rules/image-compress/docs/index.md +11 -0
- package/rules/image-compress/js/docs/index.md +11 -0
- package/rules/image-compress/js/docs/package_setup.md +3 -5
- package/rules/js-bun-db/docs/fix.md +3 -5
- package/rules/js-bun-db/docs/index.md +11 -0
- package/rules/js-bun-db/js/docs/index.md +11 -0
- package/rules/js-bun-db/js/docs/safety.md +3 -5
- package/rules/js-bun-db/lib/docs/bun-sql-scan.md +3 -5
- package/rules/js-bun-db/lib/docs/index.md +11 -0
- package/rules/js-bun-redis/docs/fix.md +3 -5
- package/rules/js-bun-redis/docs/index.md +11 -0
- package/rules/js-bun-redis/js/docs/imports.md +3 -5
- package/rules/js-bun-redis/js/docs/index.md +11 -0
- package/rules/js-bun-redis/lib/docs/index.md +11 -0
- package/rules/js-bun-redis/lib/docs/redis-imports.md +3 -5
- package/rules/js-lint/docs/fix.md +3 -5
- package/rules/js-lint/docs/index.md +11 -0
- package/rules/js-lint/js/docs/index.md +14 -0
- package/rules/js-lint/js/docs/lint-findings.md +3 -5
- package/rules/js-lint/js/docs/lint.md +3 -5
- package/rules/js-lint/js/docs/tooling.md +3 -5
- package/rules/js-lint/js/docs/utils_imports.md +3 -5
- package/rules/js-lint-ci/docs/fix.md +3 -5
- package/rules/js-lint-ci/docs/index.md +11 -0
- package/rules/js-lint-ci/js/docs/index.md +11 -0
- package/rules/js-lint-ci/js/docs/lint.md +3 -5
- package/rules/js-mssql/docs/fix.md +3 -5
- package/rules/js-mssql/docs/index.md +11 -0
- package/rules/js-mssql/js/docs/deps.md +3 -5
- package/rules/js-mssql/js/docs/index.md +11 -0
- package/rules/js-mssql/lib/docs/index.md +11 -0
- package/rules/js-mssql/lib/docs/mssql-pool-scan.md +3 -5
- package/rules/js-run/docs/fix.md +3 -5
- package/rules/js-run/docs/index.md +11 -0
- package/rules/js-run/js/docs/index.md +11 -0
- package/rules/js-run/js/docs/runtime.md +3 -5
- package/rules/js-run/lib/docs/bunyan-imports.md +3 -5
- package/rules/js-run/lib/docs/check-env-scan.md +3 -5
- package/rules/js-run/lib/docs/conn-file-rules.md +3 -5
- package/rules/js-run/lib/docs/conn-imports-scan.md +3 -5
- package/rules/js-run/lib/docs/index.md +16 -0
- package/rules/js-run/lib/docs/promise-settimeout-scan.md +3 -5
- package/rules/js-run/lib/docs/temporal-scan.md +3 -5
- package/rules/k8s/docs/fix.md +3 -5
- package/rules/k8s/docs/index.md +11 -0
- package/rules/k8s/k8s.mdc +10 -0
- package/rules/k8s/lint/docs/index.md +11 -0
- package/rules/k8s/lint/docs/lint.md +3 -5
- package/rules/k8s/policy/manifest/manifest.rego +46 -0
- package/rules/lint/docs/fix.md +3 -5
- package/rules/lint/docs/index.md +11 -0
- package/rules/lint/js/docs/index.md +11 -0
- package/rules/lint/js/docs/orchestrate.md +4 -6
- package/rules/nginx-default-tpl/docs/fix.md +3 -5
- package/rules/nginx-default-tpl/docs/index.md +11 -0
- package/rules/nginx-default-tpl/js/docs/index.md +11 -0
- package/rules/nginx-default-tpl/js/docs/template.md +3 -5
- package/rules/npm-module/docs/fix.md +3 -5
- package/rules/npm-module/docs/index.md +11 -0
- package/rules/npm-module/js/docs/header_doc_pointer.md +3 -5
- package/rules/npm-module/js/docs/index.md +14 -0
- package/rules/npm-module/js/docs/package_structure.md +3 -5
- package/rules/npm-module/js/docs/rule_meta.md +3 -5
- package/rules/npm-module/js/docs/skill_meta.md +3 -5
- package/rules/php/docs/fix.md +3 -5
- package/rules/php/docs/index.md +11 -0
- package/rules/php/js/docs/index.md +11 -0
- package/rules/php/js/docs/tooling.md +3 -5
- package/rules/php/lint/docs/index.md +11 -0
- package/rules/php/lint/docs/lint.md +3 -5
- package/rules/python/docs/fix.md +3 -5
- package/rules/python/docs/index.md +11 -0
- package/rules/python/js/docs/applies.md +3 -5
- package/rules/python/js/docs/index.md +12 -0
- package/rules/python/js/docs/tooling.md +3 -5
- package/rules/python/lint/docs/index.md +11 -0
- package/rules/python/lint/docs/lint.md +3 -5
- package/rules/rego/docs/fix.md +3 -5
- package/rules/rego/docs/index.md +11 -0
- package/rules/rego/js/docs/applies.md +3 -5
- package/rules/rego/js/docs/index.md +12 -0
- package/rules/rego/js/docs/lint.md +3 -5
- package/rules/rego/lint/docs/index.md +11 -0
- package/rules/rego/lint/docs/lint.md +3 -5
- package/rules/release/docs/change.md +3 -5
- package/rules/release/docs/fix.md +3 -5
- package/rules/release/docs/index.md +13 -0
- package/rules/release/docs/release.md +4 -6
- package/rules/release/lib/docs/aggregate.md +3 -5
- package/rules/release/lib/docs/change-file.md +3 -3
- package/rules/release/lib/docs/fallback.md +3 -5
- package/rules/release/lib/docs/index.md +13 -0
- package/rules/rust/docs/fix.md +3 -5
- package/rules/rust/docs/index.md +11 -0
- package/rules/rust/js/docs/applies.md +3 -5
- package/rules/rust/js/docs/index.md +11 -0
- package/rules/rust/lib/docs/has-cargo-toml.md +3 -5
- package/rules/rust/lib/docs/index.md +11 -0
- package/rules/security/docs/fix.md +3 -5
- package/rules/security/docs/index.md +11 -0
- package/rules/security/js/docs/index.md +13 -0
- package/rules/security/js/docs/lint.md +3 -5
- package/rules/security/js/docs/sample_secret.md +3 -5
- package/rules/security/js/docs/trufflehog.md +3 -5
- package/rules/style-lint/docs/fix.md +3 -5
- package/rules/style-lint/docs/index.md +11 -0
- package/rules/style-lint/js/docs/index.md +12 -0
- package/rules/style-lint/js/docs/lint.md +3 -5
- package/rules/style-lint/js/docs/tooling.md +3 -5
- package/rules/tauri/docs/fix.md +3 -5
- package/rules/tauri/docs/index.md +11 -0
- package/rules/tauri/js/docs/cargo_mutants_config.md +3 -5
- package/rules/tauri/js/docs/index.md +12 -0
- package/rules/tauri/js/docs/tooling.md +3 -5
- package/rules/test/docs/fix.md +3 -5
- package/rules/test/docs/index.md +11 -0
- package/rules/test/js/data/stryker_config/docs/index.md +13 -0
- package/rules/test/js/data/stryker_config/docs/stryker-vue-macros-ignorer.md +3 -5
- package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +3 -5
- package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +3 -5
- package/rules/test/js/data/vitest_config/docs/index.md +11 -0
- package/rules/test/js/data/vitest_config/docs/vitest.config.baseline.md +3 -5
- package/rules/test/js/docs/cargo_mutants_config.md +3 -5
- package/rules/test/js/docs/index.md +16 -0
- package/rules/test/js/docs/location.md +3 -5
- package/rules/test/js/docs/no-process-chdir.md +3 -5
- package/rules/test/js/docs/no-relative-fs-path.md +3 -5
- package/rules/test/js/docs/stryker_config.md +3 -5
- package/rules/test/js/docs/vitest-config-pool-forks.md +3 -5
- package/rules/text/docs/fix.md +3 -5
- package/rules/text/docs/index.md +11 -0
- package/rules/text/js/docs/forbidden-prettier.md +3 -5
- package/rules/text/js/docs/formatting.md +4 -6
- package/rules/text/js/docs/index.md +13 -0
- package/rules/text/js/docs/lint.md +4 -6
- package/rules/text/lint/docs/cspell-fix.md +4 -6
- package/rules/text/lint/docs/index.md +15 -0
- package/rules/text/lint/docs/lint.md +4 -6
- package/rules/text/lint/docs/run-dotenv-linter.md +3 -5
- package/rules/text/lint/docs/run-shellcheck.md +3 -5
- package/rules/text/lint/docs/run-v8r.md +3 -5
- package/rules/vue/docs/fix.md +3 -5
- package/rules/vue/docs/index.md +11 -0
- package/rules/vue/js/docs/index.md +11 -0
- package/rules/vue/js/docs/packages.md +3 -5
- package/rules/vue/lib/docs/index.md +11 -0
- package/rules/vue/lib/docs/vue-forbidden-imports.md +3 -5
- package/rules/worktree/docs/fix.md +3 -5
- package/rules/worktree/docs/index.md +11 -0
- package/rules/worktree/worktree.mdc +8 -8
- package/scripts/coverage-classify/docs/apply.md +3 -5
- package/scripts/coverage-classify/docs/cache.md +3 -5
- package/scripts/coverage-classify/docs/index.md +9 -27
- package/scripts/coverage-classify/docs/prompt.md +3 -5
- package/scripts/coverage-classify/docs/verdict-schema.md +3 -5
- package/scripts/dispatcher/docs/index.md +11 -0
- package/scripts/dispatcher/docs/trace.md +3 -5
- package/scripts/docs/auto-rules.md +3 -5
- package/scripts/docs/auto-skills.md +3 -5
- package/scripts/docs/build-agents-commands.md +3 -5
- package/scripts/docs/cli-entry.md +3 -5
- package/scripts/docs/coverage-fix-extract.md +3 -5
- package/scripts/docs/coverage-fix.md +3 -5
- package/scripts/docs/ensure-nitra-cursor-dev-dependencies.md +3 -5
- package/scripts/docs/index.md +24 -0
- package/scripts/docs/post-tool-use-fix.md +4 -6
- package/scripts/docs/rename-yaml-extensions.md +3 -5
- package/scripts/docs/skills-cli.md +3 -5
- package/scripts/docs/sync-claude-config.md +3 -5
- package/scripts/docs/sync-setup-bun-deps-action.md +3 -5
- package/scripts/docs/upgrade-nitra-cursor-and-install.md +3 -5
- package/scripts/docs/worktree-cli.md +3 -5
- package/scripts/lib/adr/docs/index.md +12 -0
- package/scripts/lib/adr/docs/normalize-cli.md +3 -5
- package/scripts/lib/adr/docs/normalize-pipeline.md +4 -6
- package/scripts/lib/adr/normalize-pipeline.mjs +140 -46
- package/scripts/lib/docs/assert-project-root.md +3 -5
- package/scripts/lib/docs/changed-files.md +3 -5
- package/scripts/lib/docs/check-mdc-template-refs.md +3 -5
- package/scripts/lib/docs/check-reporter.md +3 -5
- package/scripts/lib/docs/diff-added-lines.md +3 -5
- package/scripts/lib/docs/discover-check-rules-from-cursor.md +3 -5
- package/scripts/lib/docs/discover-checkable-rules.md +3 -5
- package/scripts/lib/docs/ensure-tool.md +3 -5
- package/scripts/lib/docs/generated-markdown.md +3 -5
- package/scripts/lib/docs/gha-workflow.md +3 -5
- package/scripts/lib/docs/index.md +44 -0
- package/scripts/lib/docs/inline-template-links.md +3 -5
- package/scripts/lib/docs/list-project-rules-mdc.md +3 -5
- package/scripts/lib/docs/list-rule-ids.md +3 -5
- package/scripts/lib/docs/load-cursor-config.md +3 -5
- package/scripts/lib/docs/mirror-parity.md +3 -3
- package/scripts/lib/docs/read-n-cursor-config-lite.md +3 -5
- package/scripts/lib/docs/resolve-target-files.md +3 -5
- package/scripts/lib/docs/root-notice.md +3 -5
- package/scripts/lib/docs/rule-meta-helpers.md +3 -5
- package/scripts/lib/docs/rule-meta.md +3 -5
- package/scripts/lib/docs/rule-predicates.md +3 -5
- package/scripts/lib/docs/run-conftest-batch.md +3 -5
- package/scripts/lib/docs/run-lint-step.md +3 -5
- package/scripts/lib/docs/run-rule-cli.md +3 -5
- package/scripts/lib/docs/run-rule.md +3 -5
- package/scripts/lib/docs/run-standard-lint.md +3 -5
- package/scripts/lib/docs/run-standard-rule.md +3 -5
- package/scripts/lib/docs/skill-meta.md +3 -5
- package/scripts/lib/docs/sync-gitignore-worktree.md +3 -5
- package/scripts/lib/docs/template.md +3 -5
- package/scripts/lib/docs/timing-summary.md +3 -5
- package/scripts/lib/docs/workspaces.md +3 -5
- package/scripts/lib/docs/worktree-notice.md +3 -5
- package/scripts/lib/docs/worktree.md +3 -5
- package/scripts/lib/fix/docs/index.md +16 -0
- package/scripts/lib/fix/docs/llm-fix-apply.md +3 -5
- package/scripts/lib/fix/docs/llm-lint-fix.md +3 -5
- package/scripts/lib/fix/docs/llm-worker.md +3 -5
- package/scripts/lib/fix/docs/orchestrator.md +3 -5
- package/scripts/lib/fix/docs/run-fix-check.md +3 -5
- package/scripts/lib/fix/docs/t0.md +3 -5
- package/scripts/lib/worktree-notice.mjs +3 -38
- package/scripts/utils/docs/ast-scan-utils.md +3 -5
- package/scripts/utils/docs/ensure-gitignore-entries.md +3 -5
- package/scripts/utils/docs/find-package-json-paths.md +3 -5
- package/scripts/utils/docs/index.md +23 -0
- package/scripts/utils/docs/lock-cache-dir.md +3 -5
- package/scripts/utils/docs/pass.md +3 -5
- package/scripts/utils/docs/resolve-cargo-manifest.md +3 -5
- package/scripts/utils/docs/resolve-cmd.md +3 -5
- package/scripts/utils/docs/resolve-js-root.md +3 -5
- package/scripts/utils/docs/test-helpers.md +3 -5
- package/scripts/utils/docs/walk-cache.md +3 -5
- package/scripts/utils/docs/walkDir.md +3 -5
- package/scripts/utils/docs/with-lock.md +3 -5
- package/scripts/utils/docs/worktree-fingerprint.md +3 -5
- package/skills/doc-aggregate/js/docs/docgen-ignore.md +3 -5
- package/skills/doc-aggregate/js/docs/docgen-scan.md +3 -5
- package/skills/doc-aggregate/js/docs/index.md +12 -0
- package/skills/start-check/js/docs/check.md +3 -5
- package/skills/start-check/js/docs/index.md +11 -0
- package/skills/taze/js/docs/diff.md +3 -5
- package/skills/taze/js/docs/index.md +11 -0
- package/scripts/lib/worktree.mjs +0 -126
- package/scripts/worktree-cli.mjs +0 -230
- package/skills/worktree/SKILL.md +0 -38
- package/skills/worktree/meta.json +0 -1
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: normalize-cli.mjs
|
|
4
|
+
resource: npm/scripts/lib/adr/normalize-cli.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: normalize-cli.mjs
|
|
4
6
|
crc: ce2f13af
|
|
5
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
6
8
|
score: 90
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-
# normalize-cli.mjs
|
|
10
|
-
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Цей файл є CLI-обгорткою для локального ADR-нормалізатора (`n-cursor adr-normalize-local`). Він використовується скриптом `.claude/hooks/normalize-decisions.sh` як локальний бекенд для обробки батчу чернеток та списку чистих ADR. Обгортка зчитує шляхи до чернеток та параметри з аргументів командного рядка та змінних середовища, а потім проганяє `normalizePipeline`. Результатом роботи є вивід JSON-контракту з операціями у stdout, який парситься зовнішнім скриптом. Прогрес відображається у stderr.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: normalize-pipeline.mjs
|
|
4
|
+
resource: npm/scripts/lib/adr/normalize-pipeline.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
|
|
4
|
-
crc: 6619ff48
|
|
6
|
+
crc: 6eb6ba69
|
|
5
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
6
8
|
score: 100
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-
# normalize-pipeline.mjs
|
|
10
|
-
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Файл реалізує локально-орієнтований конвеєр для нормалізації чернеток ADR. Він використовує LLM лише для вузьких, верифікованих бінарних суджень. Конвеєр працює у послідовних стадіях: JS виконує пошук кандидатів-ребер на основі лексичної схожості, LLM оцінює ці ребра (Stage 1: `same/different`) та драфти (Stage 1b: `standalone/trivial`), JS кластеризує підтверджені ребра (використовуючи `union-find`), LLM реформатує анотера (Stage 2: `gen-MADR`), а LLM генерує доповнення для злиття (Stage 3: `gen-merge`). Глобальний стан (кластери, слаги, покриття) зберігається в JS. Конвеєр повертає операції у форматі `operations[]`, сумісного з контрактом `apply-ops`.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -3,20 +3,22 @@
|
|
|
3
3
|
* LLM відповідає лише на вузькі verifiable-питання). Альтернатива single-shot-у
|
|
4
4
|
* normalize-decisions.sh, заточена під малу локальну модель (omlx/gemma-4b).
|
|
5
5
|
*
|
|
6
|
-
* Принцип: модель НІКОЛИ не приймає глобальних
|
|
7
|
-
*
|
|
6
|
+
* Принцип: модель НІКОЛИ не приймає глобальних рішень, не повертає великих
|
|
7
|
+
* структур і НЕ форматує. Глобальний стан (кластери, слаги, покриття) та весь
|
|
8
|
+
* MADR-каркас (заголовок, Status/Date, назви секцій, fallback-фрази, шаблон
|
|
9
|
+
* "Chosen option…") тримає JS. Модель повертає лише вузький, verifiable зміст:
|
|
8
10
|
* - судить пару записів бінарно «те саме рішення? так/ні» (Stage 1),
|
|
9
11
|
* - для ізольованого драфта каже standalone/trivial (Stage 1b),
|
|
10
|
-
* -
|
|
11
|
-
* - пише short merge-additions (Stage 3).
|
|
12
|
+
* - витягує зміст секцій одного драфта як JSON (Stage 2) — каркас будує JS,
|
|
13
|
+
* - пише short merge-additions без заголовка (Stage 3) — «## Update <date>» додає JS.
|
|
12
14
|
*
|
|
13
15
|
* Стадії:
|
|
14
16
|
* 0. retrieval (JS) — лексична схожість → кандидати-ребра draft↔draft / draft↔clean
|
|
15
17
|
* 1. edge-judge (LLM) — бінарне same/different по кожному ребру (self-consistency)
|
|
16
18
|
* 1b. kind-judge(LLM) — standalone vs trivial для драфтів без ребер
|
|
17
19
|
* ── cluster (JS) — union-find по підтверджених ребрах, вибір anchor, призначення op
|
|
18
|
-
* 2. gen-MADR
|
|
19
|
-
* 3. gen-merge
|
|
20
|
+
* 2. gen-MADR — LLM витягує секції-JSON → assembleMadr() (JS) збирає канон → validation gate
|
|
21
|
+
* 3. gen-merge — LLM пише additions-прозу → JS додає «## Update <date>»-заголовок
|
|
20
22
|
* ── assemble (JS) — operations[] у форматі, сумісному з apply-ops
|
|
21
23
|
*
|
|
22
24
|
* Повертає той самий operations[]-контракт, що й single-shot — apply-логіка спільна.
|
|
@@ -38,6 +40,7 @@ const RE_SLUG_NONWORD = /[^a-zа-яіїєґ0-9]+/gi
|
|
|
38
40
|
const RE_LEAD_HYPHEN = /^-+/
|
|
39
41
|
const RE_TRAIL_HYPHEN = /-+$/
|
|
40
42
|
const RE_UPDATE_HEAD = /^##\s+Update/
|
|
43
|
+
const RE_UPDATE_HEAD_LINE = /^##\s+Update[^\n]*\n+/
|
|
41
44
|
const RE_DECISION_SECTION = /##\s*Decision Outcome\s*([\s\S]{0,500})/i
|
|
42
45
|
const RE_NO_DECISION = /(не\s+обрано|не\s+прийнят|рішення\s+не\s+прийн|не\s+зроблен|no\s+decision|undecided)/i
|
|
43
46
|
const RE_FENCE_LEAD = /^\s*```/
|
|
@@ -300,79 +303,170 @@ export function validateMadr(content) {
|
|
|
300
303
|
const errors = []
|
|
301
304
|
if (!content || content.length < 80) errors.push('too short')
|
|
302
305
|
if (RE_FENCE_LEAD.test(content) || RE_FENCE_TRAIL.test(content.trim())) errors.push('code-fence wrapper')
|
|
303
|
-
|
|
306
|
+
// OKF conformance: must have YAML frontmatter with type: ADR (not draft session: fields)
|
|
307
|
+
const fmMatch = /^---\n([\s\S]*?)\n---/.exec(content)
|
|
308
|
+
if (!fmMatch || !/^type:\s*ADR\s*$/m.test(fmMatch[1])) errors.push('missing OKF type: ADR frontmatter')
|
|
304
309
|
if (RE_SESSION.test(content)) errors.push('leaked session: field')
|
|
305
|
-
if (!RE_H1.test(content)) errors.push('missing # title')
|
|
306
310
|
if (!RE_STATUS.test(content)) errors.push('missing Status')
|
|
307
311
|
if (!RE_DATE.test(content)) errors.push('missing/!ISO Date')
|
|
308
312
|
for (const h of MADR_HEADINGS) if (!content.includes(h)) errors.push(`missing heading ${h}`)
|
|
309
313
|
return { ok: errors.length === 0, errors }
|
|
310
314
|
}
|
|
311
315
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
316
|
+
// Інверсія форматування: модель НЕ генерує markdown-каркас MADR (заголовок,
|
|
317
|
+
// Status/Date, назви секцій, fallback-фрази, шаблон "Chosen option…") — усе це
|
|
318
|
+
// детерміновано, тому його будує JS у assembleMadr(). Модель повертає ЛИШЕ
|
|
319
|
+
// контент секцій як вузький JSON — те, що справді треба "витягти" з чернетки.
|
|
320
|
+
// Контракт: модель віддає ЛИШЕ зміст секцій (значення полів — markdown-проза зі
|
|
321
|
+
// збереженим inline-кодом). Каркас (заголовок, Status/Date, назви секцій ##,
|
|
322
|
+
// fallback-фрази, шаблон "Chosen option…") будує assembleMadr() детерміновано —
|
|
323
|
+
// тому модель НЕ пише жодних ## і не торкається заголовка/дати/статусу.
|
|
324
|
+
const GEN_SYS = `Ти витягуєш зміст архітектурного рішення з чернетки ADR у JSON. Нічого не вигадуй — бери лише те, що є в чернетці.
|
|
325
|
+
|
|
326
|
+
{
|
|
327
|
+
"context": "<2-4 речення: проблема й контекст рішення>",
|
|
328
|
+
"options": ["<розглянутий варіант>", "..."],
|
|
329
|
+
"chosen": "<обраний варіант, коротко>",
|
|
330
|
+
"rationale": "<чому обрано саме його>",
|
|
331
|
+
"good": ["<позитивний наслідок>", "..."],
|
|
332
|
+
"bad": ["<негативний наслідок>", "..."],
|
|
333
|
+
"more": "<файли/команди/API; можна кілька рядків і bullets>"
|
|
334
|
+
}
|
|
318
335
|
|
|
319
|
-
|
|
320
|
-
|
|
336
|
+
ВАЖЛИВО про значення полів:
|
|
337
|
+
- Зберігай inline-форматування: backticks навколо \`шляхів\`, \`назв.функцій()\`, \`команд\` — це частина змісту, не прибирай їх.
|
|
338
|
+
- НЕ додавай markdown-ЗАГОЛОВКИ (рядки з ##) і не пиши сам каркас (Status, Date, назви секцій) — лише зміст.
|
|
339
|
+
- Якщо чогось нема в чернетці — порожній рядок "" або порожній масив [].
|
|
321
340
|
|
|
322
|
-
|
|
323
|
-
<...>
|
|
341
|
+
Поверни ЛИШЕ JSON, без code-fence, без передмови.`
|
|
324
342
|
|
|
325
|
-
|
|
326
|
-
|
|
343
|
+
const slugify = (title) =>
|
|
344
|
+
title.toLowerCase().replace(RE_SLUG_NONWORD, '-').replace(RE_LEAD_HYPHEN, '').slice(0, 60).replace(RE_TRAIL_HYPHEN, '') || 'adr'
|
|
327
345
|
|
|
328
|
-
|
|
329
|
-
|
|
346
|
+
const RE_FNAME_DATE = /^(\d{2})(\d{2})(\d{2})-/
|
|
347
|
+
const RE_TRAIL_DOT = /\.+\s*$/
|
|
330
348
|
|
|
331
|
-
|
|
332
|
-
|
|
349
|
+
/**
|
|
350
|
+
* Детермінована ISO-дата для поля **Date:**. Пріоритет — `captured` frontmatter
|
|
351
|
+
* (перші 10 символів ISO-стемпа); fallback — timestamp-префікс імені файлу
|
|
352
|
+
* (`YYMMDD-…` → `20YY-MM-DD`). Каркас MADR не повинен залежати від LLM навіть тут.
|
|
353
|
+
* @param {string|undefined} captured значення поля captured (ISO-рядок)
|
|
354
|
+
* @param {string} [file] basename чернетки (для fallback-дати)
|
|
355
|
+
* @returns {string} ISO-дата `YYYY-MM-DD` або '' якщо нічого не вдалося витягти
|
|
356
|
+
*/
|
|
357
|
+
export function madrDate(captured, file = '') {
|
|
358
|
+
const iso = (captured ?? '').slice(0, 10)
|
|
359
|
+
if (RE_DATE.test(`**Date:** ${iso}`)) return iso
|
|
360
|
+
const m = file.match(RE_FNAME_DATE)
|
|
361
|
+
return m ? `20${m[1]}-${m[2]}-${m[3]}` : ''
|
|
362
|
+
}
|
|
333
363
|
|
|
334
|
-
|
|
335
|
-
|
|
364
|
+
const secStr = (v) => (typeof v === 'string' ? v.trim() : v === null || v === undefined ? '' : String(v).trim())
|
|
365
|
+
const secArr = (v) => (Array.isArray(v) ? v.map(secStr).filter(Boolean) : secStr(v) ? [secStr(v)] : [])
|
|
336
366
|
|
|
337
|
-
|
|
367
|
+
/**
|
|
368
|
+
* Нормалізує сирий JSON-вивід gen-моделі у строгу форму секцій. Толерантна до
|
|
369
|
+
* дрібних відхилень малої моделі: рядок замість масиву → масив із одного елемента,
|
|
370
|
+
* число/null → рядок/порожньо, обрізає пробіли й порожні елементи.
|
|
371
|
+
* @param {any} obj розпарсений JSON-обʼєкт від моделі
|
|
372
|
+
* @returns {{context:string, options:string[], chosen:string, rationale:string, good:string[], bad:string[], more:string}} нормалізовані секції
|
|
373
|
+
*/
|
|
374
|
+
export function normalizeSections(obj) {
|
|
375
|
+
return {
|
|
376
|
+
context: secStr(obj?.context),
|
|
377
|
+
options: secArr(obj?.options),
|
|
378
|
+
chosen: secStr(obj?.chosen),
|
|
379
|
+
rationale: secStr(obj?.rationale),
|
|
380
|
+
good: secArr(obj?.good),
|
|
381
|
+
bad: secArr(obj?.bad),
|
|
382
|
+
more: secStr(obj?.more)
|
|
383
|
+
}
|
|
384
|
+
}
|
|
338
385
|
|
|
339
|
-
|
|
340
|
-
|
|
386
|
+
/**
|
|
387
|
+
* Детермінована збірка канонічного MADR 4.0.0 з заголовка, дати й секцій-контенту.
|
|
388
|
+
* Увесь каркас (Status, назви секцій, шаблон "Chosen option…", fallback-фрази,
|
|
389
|
+
* bullets) — тут, не в моделі. Заголовок і дата — JS-власність (draftTitle/captured),
|
|
390
|
+
* модель їх не торкається.
|
|
391
|
+
* @param {{title:string, date:string, sections:ReturnType<typeof normalizeSections>}} input заголовок, ISO-дата, нормалізовані секції
|
|
392
|
+
* @returns {string} готовий MADR-markdown
|
|
393
|
+
*/
|
|
394
|
+
export function assembleMadr({ title, date, sections: s }) {
|
|
395
|
+
// Знімаємо кінцеву крапку контенту, бо шаблон додає свою (інакше "..").
|
|
396
|
+
const noDot = (x) => x.replace(RE_TRAIL_DOT, '')
|
|
397
|
+
const optBlock = s.options.length ? s.options.map((o) => `* ${o}`).join('\n') : 'Інші варіанти не обговорювалися.'
|
|
398
|
+
const cons = [...s.good.map((g) => `* Good, because ${noDot(g)}.`), ...s.bad.map((b) => `* Bad, because ${noDot(b)}.`)]
|
|
399
|
+
const consBlock = cons.length ? cons.join('\n') : 'Підтверджених наслідків не зафіксовано.'
|
|
400
|
+
const outcome = s.chosen
|
|
401
|
+
? `Chosen option: "${s.chosen}"${s.rationale ? `, because ${noDot(s.rationale)}` : ''}.`
|
|
402
|
+
: s.rationale ? `${noDot(s.rationale)}.` : 'Рішення зафіксовано у чернетці.'
|
|
403
|
+
return [
|
|
404
|
+
`# ${title}`,
|
|
405
|
+
'',
|
|
406
|
+
'**Status:** Accepted',
|
|
407
|
+
`**Date:** ${date}`,
|
|
408
|
+
'',
|
|
409
|
+
'## Context and Problem Statement',
|
|
410
|
+
s.context || 'Контекст не зафіксовано у чернетці.',
|
|
411
|
+
'',
|
|
412
|
+
'## Considered Options',
|
|
413
|
+
optBlock,
|
|
414
|
+
'',
|
|
415
|
+
'## Decision Outcome',
|
|
416
|
+
outcome,
|
|
417
|
+
'',
|
|
418
|
+
'### Consequences',
|
|
419
|
+
consBlock,
|
|
420
|
+
'',
|
|
421
|
+
'## More Information',
|
|
422
|
+
s.more || 'Додаткової інформації не зафіксовано.',
|
|
423
|
+
''
|
|
424
|
+
].join('\n')
|
|
425
|
+
}
|
|
341
426
|
|
|
342
|
-
function genMadr(title, body, captured, cfg) {
|
|
343
|
-
const date = (captured
|
|
344
|
-
const
|
|
427
|
+
export function genMadr(title, body, captured, cfg, file = '') {
|
|
428
|
+
const date = madrDate(captured, file)
|
|
429
|
+
const slug = slugify(title)
|
|
430
|
+
const user = `Чернетка "${title}":\n\n${body.slice(0, 4000)}\n\nВитягни зміст рішення у JSON.`
|
|
345
431
|
const parse = (raw) => {
|
|
346
|
-
const
|
|
432
|
+
const sections = normalizeSections(extractJson(raw))
|
|
433
|
+
if (!sections.context && !sections.chosen && !sections.rationale) throw new Error('empty extraction (no context/decision)')
|
|
434
|
+
const content = assembleMadr({ title, date, sections })
|
|
347
435
|
const v = validateMadr(content)
|
|
348
436
|
if (!v.ok) throw new Error(`MADR invalid: ${v.errors.join('; ')}`)
|
|
349
437
|
return content
|
|
350
438
|
}
|
|
351
439
|
try {
|
|
352
|
-
const content = callWithCascade([{ role: 'system', content: GEN_SYS }, { role: 'user', content: user }], parse, { label: 'gen', allowCloud: cfg.allowCloud, stats: cfg.stats, attempts: 3, maxTokens:
|
|
353
|
-
return { content, slug
|
|
440
|
+
const content = callWithCascade([{ role: 'system', content: GEN_SYS }, { role: 'user', content: user }], parse, { label: 'gen', allowCloud: cfg.allowCloud, stats: cfg.stats, attempts: 3, maxTokens: 2048 })
|
|
441
|
+
return { content, slug, valid: true }
|
|
354
442
|
} catch (error) {
|
|
355
443
|
cfg.stats.madrInvalid++
|
|
356
|
-
return { content: null, slug
|
|
444
|
+
return { content: null, slug, valid: false, error: error.message }
|
|
357
445
|
}
|
|
358
446
|
}
|
|
359
447
|
|
|
360
448
|
// ─────────────────────────── Stage 3: gen-merge (LLM) ──────────────────────────
|
|
361
449
|
|
|
362
|
-
|
|
450
|
+
// Каркас merge-блоку («## Update <date>») — теж JS-власність. Модель пише ЛИШЕ
|
|
451
|
+
// новий зміст-прозу; заголовок із детермінованою датою додає genMerge.
|
|
452
|
+
const MERGE_SYS = `Ти готуєш короткий додаток до існуючого ADR. Напиши ЛИШЕ новий зміст (проза/bullets), якого ще НЕМА в цільовому ADR — уточнення/виправлення/продовження. Стисло, українською, без заголовків, без code-fence, без передмови.`
|
|
363
453
|
|
|
364
|
-
function genMerge(title, body, captured, targetTitle, cfg) {
|
|
365
|
-
const date = (captured
|
|
366
|
-
const user = `Цільовий ADR: "${targetTitle}".\nЧернетка-доповнення "${title}" (${date}):\n${body.slice(0, 2500)}\n\n
|
|
454
|
+
function genMerge(title, body, captured, targetTitle, cfg, file = '') {
|
|
455
|
+
const date = madrDate(captured, file)
|
|
456
|
+
const user = `Цільовий ADR: "${targetTitle}".\nЧернетка-доповнення "${title}" (${date}):\n${body.slice(0, 2500)}\n\nЛише новий зміст, без заголовка.`
|
|
457
|
+
const head = `## Update ${date}`
|
|
367
458
|
const parse = (raw) => {
|
|
368
459
|
const t = stripFence(raw)
|
|
369
|
-
|
|
370
|
-
|
|
460
|
+
// Захист від моделі, що все одно вписала свій заголовок: знімаємо його, щоб
|
|
461
|
+
// не подвоїти. Канонічний head додаємо детерміновано нижче.
|
|
462
|
+
const cleaned = RE_UPDATE_HEAD.test(t) ? t.replace(RE_UPDATE_HEAD_LINE, '').trim() : t
|
|
463
|
+
if (!cleaned) throw new Error('empty merge additions')
|
|
464
|
+
return `${head}\n\n${cleaned}`
|
|
371
465
|
}
|
|
372
466
|
try {
|
|
373
467
|
return callWithCascade([{ role: 'system', content: MERGE_SYS }, { role: 'user', content: user }], parse, { label: 'merge', allowCloud: cfg.allowCloud, stats: cfg.stats, attempts: 2, maxTokens: 1500 })
|
|
374
468
|
} catch {
|
|
375
|
-
return
|
|
469
|
+
return `${head}\n\n(доповнення з чернетки "${title}")`
|
|
376
470
|
}
|
|
377
471
|
}
|
|
378
472
|
|
|
@@ -493,7 +587,7 @@ export function normalizePipeline(drafts, cleanList, opts = {}) {
|
|
|
493
587
|
const slugByIdx = Array.from({ length: drafts.length }).fill(null)
|
|
494
588
|
for (let i = 0; i < drafts.length; i++) {
|
|
495
589
|
if (decision[i].op !== 'rewrite') continue
|
|
496
|
-
const g = genMadr(titles[i], drafts[i].body, captured[i], cfg)
|
|
590
|
+
const g = genMadr(titles[i], drafts[i].body, captured[i], cfg, drafts[i].file)
|
|
497
591
|
slugByIdx[i] = g.slug
|
|
498
592
|
if (g.valid) {
|
|
499
593
|
operations.push({ op: 'rewrite', file: drafts[i].file, slug: g.slug, content: g.content })
|
|
@@ -509,11 +603,11 @@ export function normalizePipeline(drafts, cleanList, opts = {}) {
|
|
|
509
603
|
if (d.op === 'merge-anchor') {
|
|
510
604
|
const slug = slugByIdx[d.anchorIdx]
|
|
511
605
|
if (!slug) { log(`merge-anchor ${drafts[i].file}: anchor gen failed → skip`); continue }
|
|
512
|
-
const add = genMerge(titles[i], drafts[i].body, captured[i], titles[d.anchorIdx], cfg)
|
|
606
|
+
const add = genMerge(titles[i], drafts[i].body, captured[i], titles[d.anchorIdx], cfg, drafts[i].file)
|
|
513
607
|
operations.push({ op: 'merge-into', file: drafts[i].file, target: `${slug}.md`, additions: add })
|
|
514
608
|
} else if (d.op === 'merge-existing') {
|
|
515
609
|
const cTitle = stripAdrName(d.target)
|
|
516
|
-
const add = genMerge(titles[i], drafts[i].body, captured[i], cTitle, cfg)
|
|
610
|
+
const add = genMerge(titles[i], drafts[i].body, captured[i], cTitle, cfg, drafts[i].file)
|
|
517
611
|
operations.push({ op: 'merge-into', file: drafts[i].file, target: d.target, additions: add })
|
|
518
612
|
} else if (d.op === 'delete') {
|
|
519
613
|
operations.push({ op: 'delete', file: drafts[i].file, reason: d.reason })
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: assert-project-root.mjs
|
|
4
|
+
resource: npm/scripts/lib/assert-project-root.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/assert-project-root.mjs
|
|
4
6
|
crc: adb87c16
|
|
5
7
|
score: 100
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
# assert-project-root.mjs
|
|
9
|
-
|
|
10
|
-
## Огляд
|
|
11
|
-
|
|
12
10
|
Файл перевіряє розташування поточного каталогу відносно кореня git-репозиторію. Функції надають доступ до шляху кореня репозиторію та перевірку, чи знаходиться поточний каталог саме в цьому корені. Код спирається на конфіги, визначені у `.n-cursor.json`.
|
|
13
11
|
|
|
14
12
|
## Поведінка
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: changed-files.mjs
|
|
4
|
+
resource: npm/scripts/lib/changed-files.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/changed-files.mjs
|
|
4
6
|
crc: 8148d84e
|
|
5
7
|
score: 100
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
# changed-files.mjs
|
|
9
|
-
|
|
10
|
-
## Огляд
|
|
11
|
-
|
|
12
10
|
Файл збирає змінені та незакомічені файли з робочого дерева. Визначає базовий комміт для перевірок у межах зміненого діапазону. Збирає змінені та незакомічені файли відносно базового комміту.
|
|
13
11
|
|
|
14
12
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: check-mdc-template-refs.mjs
|
|
4
|
+
resource: npm/scripts/lib/check-mdc-template-refs.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/check-mdc-template-refs.mjs
|
|
4
6
|
crc: 17b81322
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# check-mdc-template-refs.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Модуль `check-mdc-template-refs.mjs` — це невелика утиліта, призначена для перевірки цілісності посилань між файлом правила `<id>.mdc` та шаблонами, що лежать у підкаталогах `template/` цього самого правила. Він обходить структуру каталогів правила (`fix/<concern>/template/`, `policy/<concern>/template/`), збирає всі знайдені файли й порівнює їхні відносні шляхи з вмістом основного файлу правила `<id>.mdc`. Результатом є перелік шаблонних файлів, на які у `.mdc` немає жодного markdown-посилання, тобто «осиротілі» (orphaned) шаблони.
|
|
12
10
|
|
|
13
11
|
Типовий контекст застосування: модуль використовується в утилітах перевірки/лінтингу правил репозиторію (`npm/rules/<id>/`), де `.mdc`-файл описує правило людською мовою й має посилатися на свої шаблони. Якщо шаблон існує, але не згаданий у `.mdc`, цей модуль повідомить про нього, щоб супровідник правила або додав посилання, або видалив зайвий шаблон.
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: check-reporter.mjs
|
|
4
|
+
resource: npm/scripts/lib/check-reporter.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/check-reporter.mjs
|
|
4
6
|
crc: b76ed480
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# check-reporter.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Модуль `check-reporter.mjs` — це невелика спільна (shared) бібліотека-фабрика для check-скриптів (`check-*.mjs`) і для `lint-docker`. Вона надає уніфікований спосіб репортити результати перевірок: успіхи (`pass`) та помилки (`fail`), а також акумулювати фінальний код виходу процесу (`exit code`).
|
|
12
10
|
|
|
13
11
|
Основна ідея: викликаючи фабрику `createCheckReporter()`, споживач отримує об’єкт з трьома методами — `pass`, `fail` і `getExitCode`. Будь-який виклик `fail` переводить внутрішній лічильник у стан помилки (`exitCode = 1`), і подальший `getExitCode()` повертатиме `1`. Якщо `fail` жодного разу не викликали — `getExitCode()` поверне `0`.
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: diff-added-lines.mjs
|
|
4
|
+
resource: npm/scripts/lib/diff-added-lines.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/diff-added-lines.mjs
|
|
4
6
|
crc: 161edaca
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# diff-added-lines.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Файл визначає, чи є рядок коду новим (introduced) або вже існував у проєкті. Він використовується для класифікації результатів аналізу коду (lint-findings) на основі їхнього розташування відносно версії проєкту. Це допомагає розробникам розуміти, які зміни коду потребують негайної уваги.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: discover-check-rules-from-cursor.mjs
|
|
4
|
+
resource: npm/scripts/lib/discover-check-rules-from-cursor.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/discover-check-rules-from-cursor.mjs
|
|
4
6
|
crc: 9a6916e1
|
|
5
7
|
score: 100
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
# discover-check-rules-from-cursor.mjs
|
|
9
|
-
|
|
10
|
-
## Огляд
|
|
11
|
-
|
|
12
10
|
Файл зчитує базові імена файлів `.mdc` у директорії `.cursor/rules/` та генерує список ідентифікаторів правил для `npx @nitra/cursor fix`, використовуючи перевірку через JS-концерн або policy з `target.json`.
|
|
13
11
|
|
|
14
12
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: discover-checkable-rules.mjs
|
|
4
|
+
resource: npm/scripts/lib/discover-checkable-rules.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/discover-checkable-rules.mjs
|
|
4
6
|
crc: 39016d17
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# discover-checkable-rules.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Модуль `discover-checkable-rules.mjs` — це discovery-шар для CLI-команди `fix`. Його завдання — швидко просканувати файлову структуру каталогу `npm/rules/` та виявити «прогонні» правила, тобто правила, у яких є щонайменше один JS-концерн або policy-концерн. Правила, які складаються тільки з декларативних артефактів (`.mdc` + `auto.md`) без жодного прогонного концерну, відсіюються.
|
|
12
10
|
|
|
13
11
|
Виокремлюються два типи концернів:
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: ensure-tool.mjs
|
|
4
|
+
resource: npm/scripts/lib/ensure-tool.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/ensure-tool.mjs
|
|
4
6
|
crc: 230254b3
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# ensure-tool.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Модуль `ensure-tool.mjs` — єдина точка резолву зовнішніх CLI-залежностей пакета `@nitra/cursor`. Він гарантує, що потрібний бінарник (`hk`, `conftest`, `shellcheck`, `actionlint`, `dotenv-linter`, `opa`, `regal`, `hadolint`, `kubeconform`, `kubescape`) доступний у системі, виконуючи послідовний пошук:
|
|
12
10
|
|
|
13
11
|
1. У системному `PATH` (через `resolveCmd`).
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: generated-markdown.mjs
|
|
4
|
+
resource: npm/scripts/lib/generated-markdown.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/generated-markdown.mjs
|
|
4
6
|
crc: 14b85a57
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# generated-markdown.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Модуль `generated-markdown.mjs` містить набір чистих утиліт для генерації згенерованих маркдаун-файлів (зокрема `AGENTS.md` та `CLAUDE.md`) у межах CLI `n-cursor`. Він виконує дві основні задачі:
|
|
12
10
|
|
|
13
11
|
1. Розгортає Mustache-подібні блоки `{{#section}}…{{/section}}` із простою підстановкою одного поля `{{prop}}` для кожного елемента переданого масиву.
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: gha-workflow.mjs
|
|
4
|
+
resource: npm/scripts/lib/gha-workflow.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/gha-workflow.mjs
|
|
4
6
|
crc: 266986bf
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# gha-workflow.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Модуль `gha-workflow.mjs` — це набір допоміжних чистих функцій для **структурного аналізу GitHub Actions workflow-файлів** (`.yml`) після їх розбору як YAML.
|
|
12
10
|
|
|
13
11
|
Призначення модуля — замінити крихкий пошук підрядків у сирому тексті workflow-файла на **типобезпечну** перевірку значень `uses:` та `run:` у кроках (`steps`) робіт (`jobs`). Модуль використовується сценаріями перевірки (checkers) проєктних правил:
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Directory Index
|
|
3
|
+
title: npm/scripts/lib
|
|
4
|
+
resource: npm/scripts/lib/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# npm/scripts/lib
|
|
8
|
+
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
|---|---|
|
|
11
|
+
| [assert-project-root.mjs](assert-project-root.md) | JS Module |
|
|
12
|
+
| [changed-files.mjs](changed-files.md) | JS Module |
|
|
13
|
+
| [check-mdc-template-refs.mjs](check-mdc-template-refs.md) | JS Module |
|
|
14
|
+
| [check-reporter.mjs](check-reporter.md) | JS Module |
|
|
15
|
+
| [diff-added-lines.mjs](diff-added-lines.md) | JS Module |
|
|
16
|
+
| [discover-check-rules-from-cursor.mjs](discover-check-rules-from-cursor.md) | JS Module |
|
|
17
|
+
| [discover-checkable-rules.mjs](discover-checkable-rules.md) | JS Module |
|
|
18
|
+
| [ensure-tool.mjs](ensure-tool.md) | JS Module |
|
|
19
|
+
| [generated-markdown.mjs](generated-markdown.md) | JS Module |
|
|
20
|
+
| [gha-workflow.mjs](gha-workflow.md) | JS Module |
|
|
21
|
+
| [inline-template-links.mjs](inline-template-links.md) | JS Module |
|
|
22
|
+
| [list-project-rules-mdc.mjs](list-project-rules-mdc.md) | JS Module |
|
|
23
|
+
| [list-rule-ids.mjs](list-rule-ids.md) | JS Module |
|
|
24
|
+
| [load-cursor-config.mjs](load-cursor-config.md) | JS Module |
|
|
25
|
+
| [mirror-parity.mjs](mirror-parity.md) | JS Module |
|
|
26
|
+
| [read-n-cursor-config-lite.mjs](read-n-cursor-config-lite.md) | JS Module |
|
|
27
|
+
| [resolve-target-files.mjs](resolve-target-files.md) | JS Module |
|
|
28
|
+
| [root-notice.mjs](root-notice.md) | JS Module |
|
|
29
|
+
| [rule-meta-helpers.mjs](rule-meta-helpers.md) | JS Module |
|
|
30
|
+
| [rule-meta.mjs](rule-meta.md) | JS Module |
|
|
31
|
+
| [rule-predicates.mjs](rule-predicates.md) | JS Module |
|
|
32
|
+
| [run-conftest-batch.mjs](run-conftest-batch.md) | JS Module |
|
|
33
|
+
| [run-lint-step.mjs](run-lint-step.md) | JS Module |
|
|
34
|
+
| [run-rule-cli.mjs](run-rule-cli.md) | JS Module |
|
|
35
|
+
| [run-rule.mjs](run-rule.md) | JS Module |
|
|
36
|
+
| [run-standard-lint.mjs](run-standard-lint.md) | JS Module |
|
|
37
|
+
| [run-standard-rule.mjs](run-standard-rule.md) | JS Module |
|
|
38
|
+
| [skill-meta.mjs](skill-meta.md) | JS Module |
|
|
39
|
+
| [sync-gitignore-worktree.mjs](sync-gitignore-worktree.md) | JS Module |
|
|
40
|
+
| [template.mjs](template.md) | JS Module |
|
|
41
|
+
| [timing-summary.mjs](timing-summary.md) | JS Module |
|
|
42
|
+
| [workspaces.mjs](workspaces.md) | JS Module |
|
|
43
|
+
| [worktree-notice.mjs](worktree-notice.md) | JS Module |
|
|
44
|
+
| [worktree.mjs](worktree.md) | JS Module |
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: inline-template-links.mjs
|
|
4
|
+
resource: npm/scripts/lib/inline-template-links.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/inline-template-links.mjs
|
|
4
6
|
crc: 7726f0ef
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# inline-template-links.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Модуль `inline-template-links.mjs` — допоміжна утиліта для **build-кроку обробки `.mdc`-правил**. Її роль: у текстовому вмісті `.mdc`-документа знайти Markdown-посилання, які ведуть на template-файли (шлях містить сегмент `/template/` або `/templates/`), і **замінити** ці посилання на **інлайн fenced-блоки** з фактичним вмістом target-файлу.
|
|
12
10
|
|
|
13
11
|
Простими словами: замість того щоб у згенерованому правилі читач бачив посилання `[конфіг](./templates/package.json.snippet.json)`, він побачить безпосередньо назву реального файлу (`package.json`) і fenced-блок із його вмістом — це робить правило «самодостатнім», без потреби клікати по лінках.
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: list-project-rules-mdc.mjs
|
|
4
|
+
resource: npm/scripts/lib/list-project-rules-mdc.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/list-project-rules-mdc.mjs
|
|
4
6
|
crc: e17e0855
|
|
5
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
6
8
|
score: 100
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-
# list-project-rules-mdc.mjs
|
|
10
|
-
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Експортує константу CURSOR_RULES_DIR, яка вказує на каталог правил у проєкті-споживачі. Надає функцію для отримання відсортованого списку всіх файлів правил `.mdc` з цього каталогу.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: list-rule-ids.mjs
|
|
4
|
+
resource: npm/scripts/lib/list-rule-ids.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/list-rule-ids.mjs
|
|
4
6
|
crc: 5ef1ead5
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# list-rule-ids.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Модуль `list-rule-ids.mjs` — невелика бібліотечна утиліта, призначена для перебору директорій-правил у каталозі `npm/rules/` та повернення відсортованого алфавітно списку ідентифікаторів правил, які реально містять виконуваний модуль `fix.mjs`.
|
|
12
10
|
|
|
13
11
|
Логіка модуля побудована навколо архітектурної інваріанти проєкту: після так званої «атомарної міграції» кожне валідне правило **зобов'язане** мати файл `fix.mjs` у власній директорії `rules/<id>/`. Будь-яка піддиректорія без `fix.mjs` вважається або «не-правилом» (службова тека), або заглушкою-чернеткою — і ігнорується. Прихованих директорій (імена, що починаються з `.`) також не існує в результаті.
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: load-cursor-config.mjs
|
|
4
|
+
resource: npm/scripts/lib/load-cursor-config.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/load-cursor-config.mjs
|
|
4
6
|
crc: c86a80f4
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# load-cursor-config.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Утилітарний модуль для читання конфігураційного файлу `.n-cursor.json` з кореня репозиторію. Призначений для використання check-скриптами, що обходять файлову систему й мають виключати певні каталоги зі сканування.
|
|
12
10
|
|
|
13
11
|
Наразі експортує лише одну публічну функцію — `loadCursorIgnorePaths(root)`, яка повертає нормалізовані абсолютні posix-шляхи з масиву `ignore` у конфізі. Якщо конфіг відсутній, пошкоджений, або поле `ignore` має невалідний формат — функція повертає порожній масив без кидання винятків (fail-soft підхід).
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: mirror-parity.mjs
|
|
4
|
+
resource: npm/scripts/lib/mirror-parity.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/lib/mirror-parity.mjs
|
|
4
6
|
crc: 15dc336a
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
## Огляд
|
|
8
|
-
|
|
9
9
|
Модуль `mirror-parity.mjs` забезпечує перевірку парності (parity) між «дзеркальними» файлами правил Cursor у `.cursor/rules/n-<id>.mdc` та їх канонічними джерелами у `npm/rules/<id>/<id>.mdc`. Ідея така: репозиторій містить два представлення одного й того ж правила:
|
|
10
10
|
|
|
11
11
|
- канонічне джерело правила лежить у `npm/rules/<id>/<id>.mdc` (з можливими посиланнями на шаблони у тій самій теці);
|