@nitra/cursor 11.4.0 → 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 +12 -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/release/release.mjs +40 -1
- 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/vue/vue.mdc +19 -1
- 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
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`.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "auto": "завжди", "worktree": false, "requireRoot": false }
|