@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,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: pass.mjs
|
|
4
|
+
resource: npm/scripts/utils/pass.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/pass.mjs
|
|
4
6
|
crc: 0f69dfba
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# pass.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Цей файл містить функцію для виведення повідомлень про успіх у консоль. Функція використовується в скриптах перевірки для інформування користувача про успішне завершення операцій. Вона забезпечує чіткий візуальний сигнал про успіх, що полегшує інтерпретацію результатів перевірки.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: resolve-cargo-manifest.mjs
|
|
4
|
+
resource: npm/scripts/utils/resolve-cargo-manifest.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/resolve-cargo-manifest.mjs
|
|
4
6
|
crc: af1efa42
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# resolve-cargo-manifest.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Цей файл визначає шлях до файлу Cargo.toml проєкту, незалежно від того, чи це кореневий Cargo.toml або один з підкаталогів workspace-у, особливо з урахуванням Tauri-патерну. Він служить утилітою для coverage-провайдера та test-концерну cargo_mutants_config, повертаючи `null` у разі невдачі для обробки ситуації без виключень. Це забезпечує гнучкий спосіб доступу до конфігурації проєкту Cargo.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: resolve-cmd.mjs
|
|
4
|
+
resource: npm/scripts/utils/resolve-cmd.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/resolve-cmd.mjs
|
|
4
6
|
crc: 31c290fc
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# resolve-cmd.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Цей файл надає функцію `resolveCmd` для отримання абсолютного шляху до виконуваного файлу, який відповідає заданій команді. Це дозволяє викликати зовнішні інструменти, використовуючи повний шлях до файлу, а не команду з змінної PATH. Це корисно для забезпечення чіткої та однозначної ідентифікації виконуваного файлу.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: resolve-js-root.mjs
|
|
4
|
+
resource: npm/scripts/utils/resolve-js-root.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/resolve-js-root.mjs
|
|
4
6
|
crc: 2c2b9f11
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# resolve-js-root.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Цей файл визначає кореневий JavaScript-файл проєкту, необхідний для запуску інструментів аналізу коду. Він використовується як у великих проєктах з декількома workspace-ами, так і в окремих пакетах, забезпечуючи єдине місце для визначення кореневого розташування. Це спрощує інтеграцію з інструментами coverage та тестування.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: test-helpers.mjs
|
|
4
|
+
resource: npm/scripts/utils/test-helpers.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/test-helpers.mjs
|
|
4
6
|
crc: 0e4357fe
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# test-helpers.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Цей файл надає допоміжні функції для тестування скриптів пакета `@nitra/cursor`. Він забезпечує створення тимчасових каталогів та запис JSON-файлів у абсолютний шлях, гарантуючи ізольованість тестів та запобігаючи мутації глобального контексту процесу. Ці функції використовуються для створення безпечного середовища для тестування, особливо при використанні git-операцій та інших файлових операцій.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: walk-cache.mjs
|
|
4
|
+
resource: npm/scripts/utils/walk-cache.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/walk-cache.mjs
|
|
4
6
|
crc: 82798fa2
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# walk-cache.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Файл забезпечує спільний кеш результатів обходу файлової системи для всіх операцій перевірки. Він зберігає список файлів, що відповідають заданим шаблонам, щоб уникнути повторних обходів. Це підвищує ефективність процесу перевірки, особливо при великій кількості файлів та шаблонів.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: walkDir.mjs
|
|
4
|
+
resource: npm/scripts/utils/walkDir.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/walkDir.mjs
|
|
4
6
|
crc: 5e5fec27
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# walkDir.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Файл `n-cursor.js` забезпечує рекурсивний обхід каталогів для скриптів перевірки, дозволяючи виконувати callback-функцію для кожного звичайного файлу. Він обходить дерево каталогів від заданого кореня, ігноруючи певні директорії (наприклад, `.git`, `node_modules`) та шляхи, вказані в `ignorePaths`. Це дозволяє автоматизувати процес аналізу конфігураційних файлів та інших ресурсів у проєкті.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: with-lock.mjs
|
|
4
|
+
resource: npm/scripts/utils/with-lock.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/with-lock.mjs
|
|
4
6
|
crc: 21848085
|
|
5
7
|
score: 95
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
# with-lock.mjs
|
|
9
|
-
|
|
10
|
-
## Огляд
|
|
11
|
-
|
|
12
10
|
Файл реалізує механізм захисту важких команд через атомарне блокування та унікалізацію результатів. Функції дозволяють перевіряти можливість повторного використання результату з кешу та виконувати команду через серіалізований механізм. Механізм використовує `mkdirSync-based lock` та `sha256-dedup` з TTL.
|
|
13
11
|
|
|
14
12
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: worktree-fingerprint.mjs
|
|
4
|
+
resource: npm/scripts/utils/worktree-fingerprint.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/scripts/utils/worktree-fingerprint.mjs
|
|
4
6
|
crc: df297382
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# worktree-fingerprint.mjs
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Файл надає унікальний відбиток робочої директорії. Цей відбиток використовується для ідентифікації та порівняння робочих директорій, забезпечуючи їх унікальність у системі. Він слугує базовим інструментом для відстеження та управління версіями.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: docgen-ignore.mjs
|
|
4
|
+
resource: npm/skills/doc-aggregate/js/docgen-ignore.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/skills/doc-aggregate/js/docgen-ignore.mjs
|
|
4
6
|
crc: 5faaffd0
|
|
5
7
|
---
|
|
6
8
|
|
|
7
|
-
# docgen-ignore
|
|
8
|
-
|
|
9
|
-
## Огляд
|
|
10
|
-
|
|
11
9
|
Re-export спільного списку ignore-глобів зі скіла doc-files: обидва скіли документації (пофайлові доки й агрегати) мусять бачити однакове дерево кодових файлів, інакше агрегат посилатиметься на файли без док або навпаки.
|
|
12
10
|
|
|
13
11
|
## Поведінка
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: docgen-scan.mjs
|
|
4
|
+
resource: npm/skills/doc-aggregate/js/docgen-scan.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/skills/doc-aggregate/js/docgen-scan.mjs
|
|
4
6
|
crc: 193dd362
|
|
5
7
|
score: 100
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
# docgen-scan.mjs
|
|
9
|
-
|
|
10
|
-
## Огляд
|
|
11
|
-
|
|
12
10
|
isSourceFile
|
|
13
11
|
Перевіряє, чи є файл коду, який слугує джерелом для документування.
|
|
14
12
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Directory Index
|
|
3
|
+
title: npm/skills/doc-aggregate/js
|
|
4
|
+
resource: npm/skills/doc-aggregate/js/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# npm/skills/doc-aggregate/js
|
|
8
|
+
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
|---|---|
|
|
11
|
+
| [docgen-ignore.mjs](docgen-ignore.md) | JS Module |
|
|
12
|
+
| [docgen-scan.mjs](docgen-scan.md) | JS Module |
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: check.mjs
|
|
4
|
+
resource: npm/skills/start-check/js/check.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/skills/start-check/js/check.mjs
|
|
4
6
|
crc: 1f8fb2f0
|
|
5
7
|
score: 95
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
# check.mjs
|
|
9
|
-
|
|
10
|
-
## Огляд
|
|
11
|
-
|
|
12
10
|
Файл надає інструменти для класифікації типів процесу, сканування конфігурації воркспейсів, парсингу логів та запуску скриптів.
|
|
13
11
|
|
|
14
12
|
## Поведінка
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: diff.mjs
|
|
4
|
+
resource: npm/skills/taze/js/diff.mjs
|
|
2
5
|
docgen:
|
|
3
|
-
source: npm/skills/taze/js/diff.mjs
|
|
4
6
|
crc: fe4d76ce
|
|
5
7
|
score: 100
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
# diff.mjs
|
|
9
|
-
|
|
10
|
-
## Огляд
|
|
11
|
-
|
|
12
10
|
parseVersion
|
|
13
11
|
Парсить версію з specifier.
|
|
14
12
|
|
package/scripts/lib/worktree.mjs
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Чиста логіка worktree-tool `n-cursor worktree` (без git/fs side-effects).
|
|
3
|
-
*
|
|
4
|
-
* Тут — детерміновані, тестовані без git функції:
|
|
5
|
-
* - `sanitizeBranch` — імʼя гілки → безпечне імʼя каталогу/файла (слеш та інші
|
|
6
|
-
* небезпечні для шляху символи → дефіс), щоб структура `.worktrees/` лишалась пласкою;
|
|
7
|
-
* - `worktreePaths` — шляхи checkout і файла-опису поруч;
|
|
8
|
-
* - `buildDescription` — текст інвентарного `.worktrees/<name>.md` за конвенцією worktree.mdc;
|
|
9
|
-
* - `findOrphanDescFiles` — `.md`-описи без зареєстрованого worktree (для `prune`).
|
|
10
|
-
*
|
|
11
|
-
* Оркестрація (виклики git, запис файлів, argv) — у `npm/scripts/worktree-cli.mjs`.
|
|
12
|
-
*/
|
|
13
|
-
import { basename, join } from 'node:path'
|
|
14
|
-
|
|
15
|
-
/** Символи, безпечні для імені каталогу/файла; решта → дефіс. */
|
|
16
|
-
const UNSAFE_PATH_CHARS_RE = /[^a-zA-Z0-9._-]+/gu
|
|
17
|
-
const MD_EXTENSION_RE = /\.md$/u
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Перетворює імʼя git-гілки на безпечне імʼя каталогу/файла для `.worktrees/`.
|
|
21
|
-
* @param {string} branch імʼя git-гілки (наприклад `feat/skill-meta`)
|
|
22
|
-
* @returns {string} пласке імʼя (наприклад `feat-skill-meta`)
|
|
23
|
-
*/
|
|
24
|
-
export function sanitizeBranch(branch) {
|
|
25
|
-
if (typeof branch !== 'string' || branch.trim() === '') {
|
|
26
|
-
throw new Error('worktree: імʼя гілки обовʼязкове')
|
|
27
|
-
}
|
|
28
|
-
const sanitized = branch
|
|
29
|
-
.trim()
|
|
30
|
-
.replace(UNSAFE_PATH_CHARS_RE, '-')
|
|
31
|
-
.replaceAll(/^-{1,80}|-{1,80}$/gu, '')
|
|
32
|
-
if (sanitized === '') {
|
|
33
|
-
throw new Error(`worktree: імʼя гілки "${branch}" не містить допустимих символів`)
|
|
34
|
-
}
|
|
35
|
-
return sanitized
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Перша вільна назва гілки за конвенцією `base`, `base2`, `base3`, … —
|
|
40
|
-
* суфікс просто число без розділювача (як `main-fix` → `main-fix2`).
|
|
41
|
-
* Дає змогу `worktree add` спершу перевірити зайнятість і обрати назву,
|
|
42
|
-
* що спрацює, замість падіння на `fatal: a branch named '…' already exists`.
|
|
43
|
-
* @param {string} branch бажане імʼя гілки
|
|
44
|
-
* @param {(candidate: string) => boolean} isTaken чи зайнята назва (гілка/worktree вже існують)
|
|
45
|
-
* @param {number} [limit] стеля кількості спроб (захист від нескінченного циклу)
|
|
46
|
-
* @returns {string} перша вільна назва (= `branch`, якщо вона вільна)
|
|
47
|
-
*/
|
|
48
|
-
export function firstFreeBranch(branch, isTaken, limit = 1000) {
|
|
49
|
-
if (typeof branch !== 'string' || branch.trim() === '') {
|
|
50
|
-
throw new Error('worktree: імʼя гілки обовʼязкове')
|
|
51
|
-
}
|
|
52
|
-
const base = branch.trim()
|
|
53
|
-
if (!isTaken(base)) return base
|
|
54
|
-
for (let n = 2; n <= limit; n++) {
|
|
55
|
-
const candidate = `${base}${n}`
|
|
56
|
-
if (!isTaken(candidate)) return candidate
|
|
57
|
-
}
|
|
58
|
-
throw new Error(`worktree: не знайдено вільної назви для "${base}" за ${limit} спроб`)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Детерміновані шляхи checkout і файла-опису для гілки.
|
|
63
|
-
* @param {string} repoRoot абсолютний корінь репозиторію
|
|
64
|
-
* @param {string} branch імʼя git-гілки
|
|
65
|
-
* @returns {{ checkout: string, descFile: string }} абсолютні шляхи
|
|
66
|
-
*/
|
|
67
|
-
export function worktreePaths(repoRoot, branch) {
|
|
68
|
-
const name = sanitizeBranch(branch)
|
|
69
|
-
const dir = join(repoRoot, '.worktrees')
|
|
70
|
-
return { checkout: join(dir, name), descFile: join(dir, `${name}.md`) }
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Текст інвентарного файла-опису worktree.
|
|
75
|
-
* @param {{ branch: string, task: string, baseCommit: string, date: string }} params поля опису
|
|
76
|
-
* @returns {string} markdown-вміст `.worktrees/<name>.md`
|
|
77
|
-
*/
|
|
78
|
-
export function buildDescription({ branch, task, baseCommit, date }) {
|
|
79
|
-
return [
|
|
80
|
-
`# ${branch}`,
|
|
81
|
-
'',
|
|
82
|
-
`**Задача:** ${task}`,
|
|
83
|
-
`**Дата:** ${date}`,
|
|
84
|
-
`**База (коміт):** ${baseCommit}`,
|
|
85
|
-
'',
|
|
86
|
-
`Прибрати: \`npx @nitra/cursor worktree remove ${branch}\``,
|
|
87
|
-
''
|
|
88
|
-
].join('\n')
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/** Поріг переліку файлів у нагадуванні: понад нього показуємо лише кількість. */
|
|
92
|
-
const DIRTY_LIST_LIMIT = 10
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Нагадування про незакомічені зміни основного дерева, які **не** потрапляють
|
|
96
|
-
* у новий worktree (він створюється від HEAD, без брудного стану). До
|
|
97
|
-
* `limit` файлів — перелік шляхів; більше — лише підсумкова кількість, щоб не
|
|
98
|
-
* залити екран. Призначене для виводу одразу після `worktree add`.
|
|
99
|
-
* @param {string} porcelain вивід `git status --porcelain` основного дерева
|
|
100
|
-
* @param {number} [limit] поріг переліку (понад нього — лише кількість)
|
|
101
|
-
* @returns {string | null} текст нагадування або `null`, якщо дерево чисте
|
|
102
|
-
*/
|
|
103
|
-
export function buildDirtyNotice(porcelain, limit = DIRTY_LIST_LIMIT) {
|
|
104
|
-
// Порядок: XY + пробіл (3 символи) + шлях; для перейменування — `orig -> dest`.
|
|
105
|
-
const files = String(porcelain ?? '')
|
|
106
|
-
.split('\n')
|
|
107
|
-
.map(line => line.slice(3).trim())
|
|
108
|
-
.filter(Boolean)
|
|
109
|
-
if (files.length === 0) return null
|
|
110
|
-
const head = `⚠️ Основне дерево має ${files.length} незакомічених змін — вони НЕ потрапили в цей worktree (створено від HEAD).`
|
|
111
|
-
const tail = ' Закоміть потрібні файли, якщо worktree-скіл має їх бачити.'
|
|
112
|
-
if (files.length > limit) return `${head}\n${tail}`
|
|
113
|
-
const list = files.map(f => ` - ${f}`).join('\n')
|
|
114
|
-
return `${head}\n${list}\n${tail}`
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* `.md`-описи без відповідного зареєстрованого worktree-checkout.
|
|
119
|
-
* @param {string[]} descFiles абсолютні шляхи `.worktrees/*.md`
|
|
120
|
-
* @param {string[]} registeredCheckouts абсолютні шляхи зареєстрованих worktree-checkout
|
|
121
|
-
* @returns {string[]} осиротілі `.md` (підмножина `descFiles`)
|
|
122
|
-
*/
|
|
123
|
-
export function findOrphanDescFiles(descFiles, registeredCheckouts) {
|
|
124
|
-
const checkoutBasenames = new Set(registeredCheckouts.map(c => basename(c)))
|
|
125
|
-
return descFiles.filter(md => !checkoutBasenames.has(basename(md).replace(MD_EXTENSION_RE, '')))
|
|
126
|
-
}
|
package/scripts/worktree-cli.mjs
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI-оркестратор worktree-tool `n-cursor worktree` (виконавець конвенції `.worktrees/`).
|
|
3
|
-
*
|
|
4
|
-
* Підкоманди:
|
|
5
|
-
* add <branch> "<опис>" — git worktree add .worktrees/<sanit> -b <branch> (від HEAD) + .md-опис + нагадування про незакомічені зміни
|
|
6
|
-
* remove <branch> [--force] — прибрати checkout + .md (гілку лишає)
|
|
7
|
-
* list — git worktree list + вміст .md-описів
|
|
8
|
-
* prune — git worktree prune + видалити осиротілі .md
|
|
9
|
-
*
|
|
10
|
-
* Чисті функції (санітизація, шляхи, текст опису, осиротілі) — у `lib/worktree.mjs`.
|
|
11
|
-
* Тут лише git-виклики, запис файлів, парсинг argv і звіт.
|
|
12
|
-
*/
|
|
13
|
-
import { spawnSync } from 'node:child_process'
|
|
14
|
-
import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
15
|
-
import { join } from 'node:path'
|
|
16
|
-
import { cwd as processCwd } from 'node:process'
|
|
17
|
-
|
|
18
|
-
import {
|
|
19
|
-
buildDescription,
|
|
20
|
-
buildDirtyNotice,
|
|
21
|
-
findOrphanDescFiles,
|
|
22
|
-
firstFreeBranch,
|
|
23
|
-
worktreePaths
|
|
24
|
-
} from './lib/worktree.mjs'
|
|
25
|
-
|
|
26
|
-
const USAGE = [
|
|
27
|
-
'Usage:',
|
|
28
|
-
' npx @nitra/cursor worktree add <branch> "<опис>"',
|
|
29
|
-
' npx @nitra/cursor worktree remove <branch> [--force]',
|
|
30
|
-
' npx @nitra/cursor worktree list',
|
|
31
|
-
' npx @nitra/cursor worktree prune'
|
|
32
|
-
].join('\n')
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Запускає git, повертає { status, stdout, stderr }.
|
|
36
|
-
* @param {string[]} args аргументи git
|
|
37
|
-
* @param {string} cwd робочий каталог
|
|
38
|
-
* @returns {{ status: number, stdout: string, stderr: string }} результат
|
|
39
|
-
*/
|
|
40
|
-
function git(args, cwd) {
|
|
41
|
-
const r = spawnSync('git', args, { cwd, encoding: 'utf8' })
|
|
42
|
-
return { status: r.status ?? 1, stdout: r.stdout ?? '', stderr: r.stderr ?? '' }
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Поточна дата YYYY-MM-DD (ін'єкція через ctx.now для тестів).
|
|
47
|
-
* @param {() => Date} now фабрика дати
|
|
48
|
-
* @returns {string} дата у форматі YYYY-MM-DD
|
|
49
|
-
*/
|
|
50
|
-
function today(now) {
|
|
51
|
-
return now().toISOString().slice(0, 10)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Реєстровані worktree-checkout (абсолютні шляхи) з `git worktree list --porcelain`.
|
|
56
|
-
* @param {string} cwd корінь репо
|
|
57
|
-
* @returns {string[]} абсолютні шляхи checkout
|
|
58
|
-
*/
|
|
59
|
-
function listRegisteredCheckouts(cwd) {
|
|
60
|
-
return git(['worktree', 'list', '--porcelain'], cwd)
|
|
61
|
-
.stdout.split('\n')
|
|
62
|
-
.filter(line => line.startsWith('worktree '))
|
|
63
|
-
.map(line => line.slice('worktree '.length).trim())
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Абсолютні шляхи `.worktrees/*.md`.
|
|
68
|
-
* @param {string} cwd корінь репо
|
|
69
|
-
* @returns {string[]} шляхи файлів-описів
|
|
70
|
-
*/
|
|
71
|
-
function listDescFiles(cwd) {
|
|
72
|
-
const dir = join(cwd, '.worktrees')
|
|
73
|
-
if (!existsSync(dir)) return []
|
|
74
|
-
return readdirSync(dir)
|
|
75
|
-
.filter(n => n.endsWith('.md'))
|
|
76
|
-
.map(n => join(dir, n))
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* add: створити worktree від HEAD + .md-опис.
|
|
81
|
-
* @param {string[]} rest [branch, ...descParts]
|
|
82
|
-
* @param {{ cwd: string, log: (line: string) => void, logError: (line: string) => void, now: () => Date }} ctx контекст
|
|
83
|
-
* @returns {number} exit code
|
|
84
|
-
*/
|
|
85
|
-
function cmdAdd(rest, ctx) {
|
|
86
|
-
const [branch, ...descParts] = rest
|
|
87
|
-
const task = descParts.join(' ').trim()
|
|
88
|
-
if (!branch) {
|
|
89
|
-
ctx.logError('worktree add: потрібне імʼя гілки')
|
|
90
|
-
ctx.logError(USAGE)
|
|
91
|
-
return 1
|
|
92
|
-
}
|
|
93
|
-
if (!task) {
|
|
94
|
-
ctx.logError('worktree add: опис обовʼязковий — `worktree add <branch> "<опис>"`')
|
|
95
|
-
return 1
|
|
96
|
-
}
|
|
97
|
-
// Зайнята, якщо вже є git-гілка з такою назвою або checkout-каталог `.worktrees/<sanit>`.
|
|
98
|
-
const isTaken = name => {
|
|
99
|
-
if (git(['show-ref', '--verify', '--quiet', `refs/heads/${name}`], ctx.cwd).status === 0) return true
|
|
100
|
-
try {
|
|
101
|
-
return existsSync(worktreePaths(ctx.cwd, name).checkout)
|
|
102
|
-
} catch {
|
|
103
|
-
return false // невалідна для шляху назва — впаде нижче на worktreePaths(chosen) з людинозрозумілим текстом
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
let chosen
|
|
107
|
-
let paths
|
|
108
|
-
try {
|
|
109
|
-
chosen = firstFreeBranch(branch, isTaken)
|
|
110
|
-
paths = worktreePaths(ctx.cwd, chosen)
|
|
111
|
-
} catch (error) {
|
|
112
|
-
ctx.logError(error.message)
|
|
113
|
-
return 1
|
|
114
|
-
}
|
|
115
|
-
if (chosen !== branch) {
|
|
116
|
-
ctx.log(`ℹ️ гілка/worktree "${branch}" уже існує — обрано вільну назву "${chosen}"`)
|
|
117
|
-
}
|
|
118
|
-
// Знімаємо статус ДО створення worktree: інакше щойно створений checkout/опис у `.worktrees/`
|
|
119
|
-
// потрапили б у `git status` (коли `.worktrees/` не в .gitignore) і дали б хибне нагадування.
|
|
120
|
-
const dirty = buildDirtyNotice(git(['status', '--porcelain'], ctx.cwd).stdout)
|
|
121
|
-
const added = git(['worktree', 'add', paths.checkout, '-b', chosen], ctx.cwd)
|
|
122
|
-
if (added.status !== 0) {
|
|
123
|
-
ctx.logError(`worktree add не вдався: ${added.stderr.trim()}`)
|
|
124
|
-
return 1
|
|
125
|
-
}
|
|
126
|
-
const baseCommit = git(['rev-parse', '--short', 'HEAD'], ctx.cwd).stdout.trim()
|
|
127
|
-
const md = buildDescription({ branch: chosen, task, baseCommit, date: today(ctx.now) })
|
|
128
|
-
writeFileSync(paths.descFile, md, 'utf8')
|
|
129
|
-
ctx.log(`✅ worktree: ${paths.checkout}`)
|
|
130
|
-
ctx.log(` опис: ${paths.descFile}`)
|
|
131
|
-
if (dirty) ctx.log(dirty) // нагадування про незакомічені зміни основного дерева (зняте ДО add)
|
|
132
|
-
return 0
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* remove: прибрати checkout + .md (гілку лишає).
|
|
137
|
-
* @param {string[]} rest [branch, ...flags]
|
|
138
|
-
* @param {{ cwd: string, log: (line: string) => void, logError: (line: string) => void }} ctx контекст
|
|
139
|
-
* @returns {number} exit code
|
|
140
|
-
*/
|
|
141
|
-
function cmdRemove(rest, ctx) {
|
|
142
|
-
const branch = rest.find(a => !a.startsWith('--'))
|
|
143
|
-
const force = rest.includes('--force')
|
|
144
|
-
if (!branch) {
|
|
145
|
-
ctx.logError('worktree remove: потрібне імʼя гілки')
|
|
146
|
-
return 1
|
|
147
|
-
}
|
|
148
|
-
let paths
|
|
149
|
-
try {
|
|
150
|
-
paths = worktreePaths(ctx.cwd, branch)
|
|
151
|
-
} catch (error) {
|
|
152
|
-
ctx.logError(error.message)
|
|
153
|
-
return 1
|
|
154
|
-
}
|
|
155
|
-
const args = ['worktree', 'remove', paths.checkout]
|
|
156
|
-
if (force) args.push('--force')
|
|
157
|
-
const removed = git(args, ctx.cwd)
|
|
158
|
-
if (removed.status !== 0) {
|
|
159
|
-
ctx.logError(`worktree remove не вдався: ${removed.stderr.trim()} (спробуй --force, якщо дерево брудне)`)
|
|
160
|
-
return 1
|
|
161
|
-
}
|
|
162
|
-
if (existsSync(paths.descFile)) rmSync(paths.descFile, { force: true })
|
|
163
|
-
// Окремих sibling runtime-файлів більше немає, тож cleanup обмежений checkout і описом.
|
|
164
|
-
ctx.log(`✅ прибрано: ${paths.checkout} (гілку ${branch} лишено)`)
|
|
165
|
-
return 0
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* list: git worktree list + вміст .md-описів.
|
|
170
|
-
* @param {{ cwd: string, log: (line: string) => void }} ctx контекст
|
|
171
|
-
* @returns {number} exit code
|
|
172
|
-
*/
|
|
173
|
-
function cmdList(ctx) {
|
|
174
|
-
ctx.log(git(['worktree', 'list'], ctx.cwd).stdout.trimEnd())
|
|
175
|
-
for (const md of listDescFiles(ctx.cwd)) {
|
|
176
|
-
ctx.log(`\n--- ${md} ---`)
|
|
177
|
-
ctx.log(readFileSync(md, 'utf8').trimEnd())
|
|
178
|
-
}
|
|
179
|
-
return 0
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* prune: git worktree prune + видалити осиротілі .md.
|
|
184
|
-
* @param {{ cwd: string, log: (line: string) => void }} ctx контекст
|
|
185
|
-
* @returns {number} exit code
|
|
186
|
-
*/
|
|
187
|
-
function cmdPrune(ctx) {
|
|
188
|
-
git(['worktree', 'prune'], ctx.cwd)
|
|
189
|
-
const orphans = findOrphanDescFiles(listDescFiles(ctx.cwd), listRegisteredCheckouts(ctx.cwd))
|
|
190
|
-
for (const md of orphans) {
|
|
191
|
-
rmSync(md, { force: true })
|
|
192
|
-
ctx.log(`🧹 видалено осиротілий опис: ${md}`)
|
|
193
|
-
}
|
|
194
|
-
ctx.log(`prune завершено (осиротілих описів: ${orphans.length})`)
|
|
195
|
-
return 0
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Точка входу підкоманди worktree.
|
|
200
|
-
* @param {string[]} argv аргументи після `worktree`
|
|
201
|
-
* @param {{ cwd?: string, log?: (line: string) => void, logError?: (line: string) => void, now?: () => Date }} [options] ін'єкція для тестів
|
|
202
|
-
* @returns {Promise<number>} exit code
|
|
203
|
-
*/
|
|
204
|
-
export function runWorktreeCli(argv, options = {}) {
|
|
205
|
-
const ctx = {
|
|
206
|
-
cwd: options.cwd ?? processCwd(),
|
|
207
|
-
log: options.log ?? (line => console.log(line)),
|
|
208
|
-
logError: options.logError ?? (line => console.error(line)),
|
|
209
|
-
now: options.now ?? (() => new Date())
|
|
210
|
-
}
|
|
211
|
-
const [sub, ...rest] = argv
|
|
212
|
-
switch (sub) {
|
|
213
|
-
case 'add': {
|
|
214
|
-
return Promise.resolve(cmdAdd(rest, ctx))
|
|
215
|
-
}
|
|
216
|
-
case 'remove': {
|
|
217
|
-
return Promise.resolve(cmdRemove(rest, ctx))
|
|
218
|
-
}
|
|
219
|
-
case 'list': {
|
|
220
|
-
return Promise.resolve(cmdList(ctx))
|
|
221
|
-
}
|
|
222
|
-
case 'prune': {
|
|
223
|
-
return Promise.resolve(cmdPrune(ctx))
|
|
224
|
-
}
|
|
225
|
-
default: {
|
|
226
|
-
ctx.logError(USAGE)
|
|
227
|
-
return Promise.resolve(1)
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
package/skills/worktree/SKILL.md
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: worktree
|
|
3
|
-
description: >-
|
|
4
|
-
Створення та керування git-worktree через n-cursor worktree CLI: ізольований
|
|
5
|
-
workspace у .worktrees/<branch>/ з інвентарним файлом-описом
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# worktree — ізольований workspace через CLI
|
|
9
|
-
|
|
10
|
-
Для роботи в окремому git-worktree використовуй CLI `n-cursor worktree` — він
|
|
11
|
-
однаковий у Claude і Cursor, кладе worktree у `.worktrees/` (gitignored) і сам
|
|
12
|
-
створює інвентарний файл-опис поруч.
|
|
13
|
-
|
|
14
|
-
## Команди
|
|
15
|
-
|
|
16
|
-
- Створити (опис **обовʼязковий**):
|
|
17
|
-
`npx @nitra/cursor worktree add <branch> "<навіщо цей worktree>"`
|
|
18
|
-
- Список активних з описами:
|
|
19
|
-
`npx @nitra/cursor worktree list`
|
|
20
|
-
- Прибрати (гілку лишає; `--force` для брудного дерева):
|
|
21
|
-
`npx @nitra/cursor worktree remove <branch> [--force]`
|
|
22
|
-
- Прибрати осиротілі описи / метадані:
|
|
23
|
-
`npx @nitra/cursor worktree prune`
|
|
24
|
-
|
|
25
|
-
## Приклад
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npx @nitra/cursor worktree add feat/skill-meta "реалізація Spec A: meta.json"
|
|
29
|
-
cd .worktrees/feat-skill-meta
|
|
30
|
-
# … робота в ізоляції …
|
|
31
|
-
cd -
|
|
32
|
-
npx @nitra/cursor worktree remove feat/skill-meta
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Слеш у гілці перетворюється на дефіс для пласкої структури: `feat/skill-meta`
|
|
36
|
-
→ `.worktrees/feat-skill-meta/`. Git-гілка лишається `feat/skill-meta`.
|
|
37
|
-
|
|
38
|
-
Конвенція й заборони (де НЕ створювати worktree) — `.cursor/rules/n-worktree.mdc`.
|