@joshuafolkken/kit 1.1010.0 → 1.1050.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/settings.json +1 -5
- package/.claude/skills/dependency-update/SKILL.md +6 -3
- package/.claude/skills/epic-commands/SKILL.md +46 -17
- package/.claude/skills/verify-ui/SKILL.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +10 -25
- package/.claude/skills/workflow-commands/background-commands.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-child.md +6 -4
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -36
- package/.claude/skills/workflow-commands/backlogrun-steps.md +16 -16
- package/.claude/skills/workflow-commands/backlogrun.md +3 -12
- package/.claude/skills/workflow-commands/chain-rule.md +2 -2
- package/.claude/skills/workflow-commands/followup-reference.md +2 -2
- package/.claude/skills/workflow-commands/fullrun-steps.md +4 -3
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/halfrun.md +2 -1
- package/.claude/skills/workflow-commands/into-target.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +80 -126
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +2 -2
- package/.codex/hooks.json +1 -5
- package/.github/workflows/auto-tag.yml +21 -0
- package/.github/workflows/publish.yml +9 -10
- package/.github/workflows/sonar-qube.yml +1 -1
- package/AGENTS.md +4 -25
- package/CLAUDE.md +24 -38
- package/GEMINI.md +4 -24
- package/README.md +22 -56
- package/dist/CLAUDE.md +24 -38
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-6PSTVOLH.js → chunk-5BK3K7V4.js} +114 -90
- package/dist/hooks/{chunk-PAXMLGSS.js → chunk-7VPDUBRN.js} +93 -175
- package/dist/hooks/{chunk-KPZN42RT.js → chunk-DMQN45FN.js} +3 -3
- package/dist/hooks/{chunk-WMIR5SNX.js → chunk-EJDX2TOB.js} +13 -3
- package/dist/hooks/{chunk-A2H5I2VD.js → chunk-GQ7KP45M.js} +2 -2
- package/dist/hooks/{chunk-4GDR2YTV.js → chunk-HJIISEAC.js} +4 -4
- package/dist/hooks/{chunk-AWTFKKFW.js → chunk-NAS4C7GP.js} +6 -33
- package/dist/hooks/{chunk-56LGMJJV.js → chunk-NJQOBE6L.js} +2 -2
- package/dist/hooks/{chunk-EZLHXKJ6.js → chunk-RLDX5SOC.js} +1222 -941
- package/dist/hooks/{chunk-GBJUERYK.js → chunk-WQ4OSBSS.js} +10 -3
- package/dist/hooks/codex-hook-adapter.js +10 -10
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +15 -34
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +23 -16
- package/dist/hooks/stop-guard.js +21 -200
- package/dist/josh.js +42 -125
- package/dist/version/index.js +466 -42
- package/eslint/base.js +2 -11
- package/package.json +36 -10
- package/prompts/coding-standards.md +15 -290
- package/prompts/collaboration-workflow/cross-repo-epic.md +2 -51
- package/prompts/collaboration-workflow/epic-audit.md +2 -53
- package/prompts/collaboration-workflow/epic-bundle.md +2 -106
- package/prompts/collaboration-workflow/file-edits.md +6 -53
- package/prompts/collaboration-workflow/issue-template.md +4 -4
- package/prompts/collaboration-workflow/operating-rules.md +18 -75
- package/prompts/collaboration-workflow/principles.md +74 -0
- package/prompts/collaboration-workflow/residency.md +55 -15
- package/prompts/collaboration-workflow/rule-delivery.md +5 -46
- package/prompts/collaboration-workflow/shell-body.md +7 -9
- package/prompts/collaboration-workflow/turn-batching.md +21 -37
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +15 -18
- package/prompts/collaboration-workflow.md +22 -28
- package/prompts/sonar-hotspot-handling.md +1 -1
- package/scripts/adopt/adopt-logic.ts +2 -2
- package/scripts/adopt/adopt-toolkits.ts +3 -1
- package/scripts/adopt/adopt.ts +2 -2
- package/scripts/agent/agent-event.ts +2 -9
- package/scripts/agent/agent-exit-record.ts +2 -9
- package/scripts/auto-ok/auto-ok-cli.ts +9 -9
- package/scripts/backlog/backlog-budget-cli.ts +2 -6
- package/scripts/backlog/backlog-drive-cli.ts +20 -10
- package/scripts/backlog/backlog-drive.ts +50 -16
- package/scripts/backlog/backlog-next.ts +24 -8
- package/scripts/backlog/backlog-offer-cli.ts +6 -5
- package/scripts/backlog/backlog-plan-cli.ts +5 -1
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +31 -11
- package/scripts/backlog/backlog-rank.ts +106 -0
- package/scripts/backlog/backlog-waves.ts +42 -29
- package/scripts/build/build-bin.ts +2 -1
- package/scripts/build/build-config-merge.ts +2 -1
- package/scripts/build/build-hooks.ts +31 -6
- package/scripts/build/build-managed-marker.ts +2 -1
- package/scripts/build/build-self-sync-guard.ts +2 -1
- package/scripts/build/build-version.ts +2 -1
- package/scripts/cases/cases-logic.ts +2 -6
- package/scripts/ci/pr-classification.ts +13 -11
- package/scripts/cost-runtime/cost-transcript.ts +4 -11
- package/scripts/delegation/delegation-policy.ts +11 -0
- package/scripts/doctor/doctor-consumer.ts +5 -12
- package/scripts/doctor/doctor-ports.ts +2 -2
- package/scripts/document/document-byte-budget.ts +13 -21
- package/scripts/document/document-section.ts +2 -6
- package/scripts/document/entry-read-budget.ts +6 -5
- package/scripts/{git/git-epic-add-body.ts → epic/epic-add-body.ts} +23 -23
- package/scripts/{git/git-epic-add-plan.ts → epic/epic-add-plan.ts} +23 -26
- package/scripts/{git/git-epic-add.ts → epic/epic-add.ts} +17 -17
- package/scripts/epic/epic-audit-cli.ts +4 -4
- package/scripts/epic/epic-audit-orphans.ts +2 -2
- package/scripts/epic/epic-audit-rationale.ts +1 -1
- package/scripts/epic/epic-audit.ts +1 -1
- package/scripts/{git/git-epic-body.ts → epic/epic-body.ts} +6 -6
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle.ts +2 -2
- package/scripts/epic/epic-candidate-confirm.ts +2 -1
- package/scripts/{git/git-epic-chains.ts → epic/epic-chains.ts} +4 -4
- package/{scripts-ai → scripts/epic}/epic-check.ts +5 -4
- package/{scripts-ai → scripts/epic}/epic-cli.ts +4 -4
- package/scripts/{git/git-epic-close-comment.ts → epic/epic-close-comment.ts} +9 -9
- package/scripts/{git/git-epic-close.ts → epic/epic-close.ts} +23 -19
- package/scripts/epic/epic-cross-repo.ts +21 -38
- package/scripts/{git/git-epic-decision.ts → epic/epic-decision.ts} +12 -14
- package/scripts/epic/epic-fetch.ts +3 -3
- package/scripts/epic/epic-graph.ts +3 -3
- package/scripts/epic/epic-index.ts +2 -2
- package/scripts/epic/epic-issue.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +11 -22
- package/scripts/epic/epic-next.ts +3 -3
- package/scripts/{git/git-epic-parse.ts → epic/epic-parse.ts} +3 -3
- package/scripts/{git/git-epic-promote.ts → epic/epic-promote.ts} +10 -10
- package/scripts/epic/epic-rank.ts +37 -0
- package/scripts/{git/git-epic-read.ts → epic/epic-read.ts} +9 -9
- package/scripts/{git/git-epic-reconcile.ts → epic/epic-reconcile.ts} +18 -20
- package/scripts/{git/git-epic-reference.ts → epic/epic-reference.ts} +4 -23
- package/scripts/epic/epic-relation-recheck.ts +4 -3
- package/scripts/{git/git-epic-relations.ts → epic/epic-relations.ts} +5 -5
- package/scripts/{git/git-epic-remove-plan.ts → epic/epic-remove-plan.ts} +17 -19
- package/scripts/{git/git-epic-remove.ts → epic/epic-remove.ts} +13 -13
- package/scripts/{git/git-epic-run.ts → epic/epic-run.ts} +27 -27
- package/scripts/{git/git-epic-sections.ts → epic/epic-sections.ts} +6 -6
- package/scripts/{git/git-epic-shape.ts → epic/epic-shape.ts} +7 -7
- package/scripts/epic/epic-solo.ts +29 -28
- package/scripts/{git/git-epic-validate.ts → epic/epic-validate.ts} +13 -13
- package/{scripts-ai → scripts/epic}/epic.ts +17 -16
- package/scripts/gh/fix-gh-packages.ts +2 -1
- package/scripts/gh/gh-spawn.ts +12 -10
- package/scripts/git/constants.ts +1 -1
- package/scripts/git/git-branch.ts +10 -1
- package/scripts/git/git-command.ts +2 -2
- package/scripts/git/git-error.ts +2 -5
- package/scripts/git/git-execa-error.ts +6 -1
- package/{scripts-ai → scripts/git}/git-followup-finish.ts +7 -7
- package/scripts/git/git-followup-flush.ts +74 -48
- package/scripts/git/git-followup-issue-close.ts +2 -2
- package/scripts/git/git-followup-label.ts +1 -1
- package/scripts/git/git-followup-pending.ts +1 -1
- package/{scripts-ai → scripts/git}/git-followup-workflow.ts +23 -11
- package/scripts/git/git-gh-exec.ts +85 -26
- package/scripts/git/git-gh-issue-read.ts +2 -2
- package/scripts/git/git-gh-issue-rest.ts +2 -2
- package/scripts/git/git-gh-issue-write.ts +6 -6
- package/scripts/git/git-gh-pr-read.ts +0 -21
- package/scripts/git/git-gh-pr.ts +2 -23
- package/scripts/git/git-next-issues.ts +34 -5
- package/scripts/git/git-pr-followup-wrapup.ts +2 -6
- package/scripts/git/git-preflight.ts +25 -10
- package/scripts/git/git-push-transport.ts +12 -69
- package/scripts/git/git-spawn.ts +79 -3
- package/scripts/git/git-ssh-keepalive.ts +74 -0
- package/scripts/git/git-staging.ts +21 -9
- package/{scripts-ai → scripts/git}/git-workflow.ts +11 -11
- package/scripts/git/github-issue-url.ts +1 -1
- package/scripts/git/gone-branch.ts +3 -2
- package/scripts/git/issue-labels.ts +13 -1
- package/scripts/git/issue-rank.ts +89 -0
- package/scripts/git/issue-reference.ts +19 -0
- package/scripts/git/main-merge.ts +2 -1
- package/scripts/git/main-sync.ts +3 -2
- package/scripts/git/schemas.ts +1 -1
- package/scripts/git/stash-pop-args.ts +7 -13
- package/scripts/git/stash-pop-cli.ts +2 -1
- package/{scripts-ai → scripts/git}/telegram-test-logic.ts +2 -2
- package/{scripts-ai → scripts/git}/telegram-test.ts +7 -7
- package/scripts/hooks/format-edited-cli.ts +15 -0
- package/scripts/hooks/format-edited-file.ts +2 -9
- package/scripts/hooks/format-rewrite-notice.ts +2 -8
- package/scripts/hooks/pretool-guard-cli.ts +21 -0
- package/scripts/hooks/pretool-guard.ts +14 -15
- package/scripts/init/init-ai-copy.ts +2 -5
- package/scripts/init/init.ts +8 -4
- package/scripts/init/start-exec.ts +7 -1
- package/scripts/init/start-plan.ts +18 -5
- package/scripts/init/start-setup-pr.ts +46 -19
- package/scripts/init/start-steps.ts +43 -10
- package/scripts/init/start.ts +42 -11
- package/scripts/issue/issue-cite.ts +19 -1
- package/scripts/issue/issue-comment-cli.ts +2 -1
- package/scripts/issue/issue-file-cli.ts +2 -1
- package/scripts/issue/issue-fold-cli.ts +9 -16
- package/scripts/issue/issue-scout-cli.ts +8 -13
- package/scripts/issue/measure-rerun-cli.ts +7 -6
- package/scripts/josh/josh-command-map.ts +0 -102
- package/scripts/josh/josh-commands-ai.ts +2 -2
- package/scripts/josh/josh-commands-backlog.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +3 -3
- package/scripts/josh/josh-commands-project.ts +1 -1
- package/scripts/josh/josh-commands-workflow.ts +4 -4
- package/scripts/lane/lane-child-marker.ts +16 -2
- package/scripts/lane/lane-cli.ts +34 -15
- package/scripts/lane/lane-open.ts +3 -2
- package/scripts/lane/lane-registry.ts +3 -6
- package/scripts/lane/lane-report.ts +10 -4
- package/scripts/lib/cli-flags.ts +20 -2
- package/scripts/lib/error-message.ts +9 -0
- package/scripts/lib/read-file.ts +26 -2
- package/scripts/observations/observation-ledger-home.ts +98 -26
- package/scripts/observations/observation-ledger-migrate.ts +26 -21
- package/scripts/observations/observation-ledger-prepare.ts +10 -20
- package/scripts/observations/observation-ledger.ts +58 -25
- package/scripts/observations/observations-flush-cli.ts +6 -23
- package/scripts/observations/observations-flush-landing.ts +2 -1
- package/scripts/observations/observations-flush.ts +29 -20
- package/scripts/package/package-scout-cli.ts +8 -16
- package/scripts/ports/port-command.ts +2 -1
- package/scripts/propagate/propagate-plan.ts +185 -0
- package/scripts/propagate/propagate-publish.ts +6 -7
- package/scripts/propagate/propagate-run.ts +5 -1
- package/scripts/propagate/propagate-steps.ts +18 -2
- package/scripts/propagate/propagate-targets.ts +13 -2
- package/scripts/propagate/propagate.ts +63 -44
- package/scripts/refactor/import-graph.ts +2 -6
- package/scripts/registry-migration/migrate-logic.ts +1 -0
- package/scripts/registry-migration/migrate.ts +3 -2
- package/scripts/registry-migration/user-npmrc.ts +2 -2
- package/scripts/release/github-release.ts +1 -1
- package/scripts/release/release-cli.ts +2 -1
- package/scripts/repo/repo-setting.ts +10 -8
- package/scripts/review/review-attest.ts +44 -0
- package/scripts/review/review-brief-cli.ts +49 -2
- package/scripts/review/review-brief.ts +46 -1
- package/scripts/review/review-finding-ledger.ts +3 -3
- package/scripts/review/review-findings-cli.ts +4 -11
- package/scripts/review/review-record-cli.ts +14 -11
- package/scripts/review/review-record.ts +6 -16
- package/scripts/review/review-stamps.ts +7 -0
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/implementation-cut.ts +1 -1
- package/scripts/rules/issue-fold.ts +1 -2
- package/scripts/rules/lane-carry-conflict.ts +1 -2
- package/scripts/rules/lane-park.ts +1 -2
- package/scripts/rules/pre-gate-cut.ts +2 -2
- package/scripts/rules/rule-body-guard.ts +2 -2
- package/scripts/rules/rule-value-cache.ts +99 -0
- package/scripts/rules/rule-value-cli.ts +10 -9
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/run/run-carry-args.ts +2 -6
- package/scripts/run/run-carry-cli.ts +5 -7
- package/scripts/run/run-cut-args.ts +7 -13
- package/scripts/run/run-ending-cli.ts +4 -7
- package/scripts/run/run-event-stream.ts +2 -5
- package/scripts/run/run-headless.ts +22 -6
- package/scripts/run/run-liveness-cli.ts +4 -7
- package/scripts/run/run-parent-cut-hook.ts +144 -0
- package/scripts/run/run-progress-args.ts +2 -6
- package/scripts/run/run-progress-cli.ts +2 -1
- package/scripts/run/run-progress-read.ts +2 -1
- package/scripts/run/run-progress.ts +21 -8
- package/scripts/run/run-ship-cli.ts +6 -74
- package/scripts/run/run-ship-preflight.ts +87 -0
- package/scripts/run/run-ship-review-steps.ts +5 -26
- package/scripts/run/run-ship-review.ts +9 -0
- package/scripts/run/run-ship-scoped.ts +44 -0
- package/scripts/run/run-ship-stage.ts +5 -1
- package/scripts/run/run-ship-steps.ts +105 -0
- package/scripts/run/run-ship.ts +2 -0
- package/scripts/run/run-tail-cli.ts +3 -3
- package/scripts/run/run-tidy-stashes.ts +7 -14
- package/scripts/run/run-wake-cli.ts +4 -8
- package/scripts/run/run-wake-describe.ts +19 -1
- package/scripts/run/run-wake-driver.ts +15 -2
- package/scripts/run/run-wake-session.ts +14 -4
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/project-config.ts +3 -6
- package/scripts/security/security-audit-provision.ts +6 -7
- package/scripts/sonar/sonar-hotspots-cli.ts +2 -1
- package/scripts/sync/directory-copy-guard.ts +2 -1
- package/scripts/sync/sync-ai-files.ts +3 -3
- package/scripts/sync/template-source-logic.ts +3 -4
- package/scripts/test/e2e-retry-check.ts +3 -6
- package/scripts/time-runtime/time-bundle-call.ts +2 -2
- package/scripts/ui/ui-routes-cli.ts +3 -6
- package/scripts/version/bump-version.ts +2 -1
- package/scripts/version/npm-registry.ts +97 -0
- package/scripts/version/version-commands.ts +5 -4
- package/scripts/version/version-remote.ts +38 -33
- package/scripts/version/version-targets.ts +3 -3
- package/.claude/skills/workflow-commands/rule-residency.md +0 -267
- package/evals/scenarios/consult-not-execute.json +0 -20
- package/evals/scenarios/no-implicit-workflow.json +0 -26
- package/evals/scenarios/overrides-both-locations.json +0 -29
- package/evals/scenarios/upstream-interrupt.json +0 -23
- package/evals/scenarios/workflow-skill-loaded.json +0 -16
- package/prompts/agent-lint-protocol.json +0 -79
- package/prompts/agent-rules.md +0 -63
- package/prompts/collaboration-workflow/consultation-vs-execution.md +0 -8
- package/prompts/collaboration-workflow/distributed-docs.md +0 -7
- package/prompts/collaboration-workflow/durable-rules.md +0 -24
- package/prompts/collaboration-workflow/latest-first.md +0 -14
- package/prompts/collaboration-workflow/no-clones.md +0 -11
- package/prompts/collaboration-workflow/simplicity-first.md +0 -9
- package/prompts/collaboration-workflow/single-source-rules.md +0 -13
- package/scripts/build/shim-shell.ts +0 -25
- package/scripts/claude/skill-meta.ts +0 -37
- package/scripts/document/document-scan.ts +0 -108
- package/scripts/document/generate-catalog.ts +0 -69
- package/scripts/document/retired-phrases.ts +0 -143
- package/scripts/document/review-agent-type.ts +0 -46
- package/scripts/document/single-source.ts +0 -73
- package/scripts/git/git-fixture-workspace.ts +0 -88
- package/scripts/hooks/format-edited-file-fixtures.ts +0 -109
- package/scripts/hooks/prompt-hooks.ts +0 -38
- package/scripts/init/hook-command-bootstrap.ts +0 -83
- package/scripts/issue/issue-logic.ts +0 -50
- package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +0 -1227
- package/scripts/josh/josh-script-reader.ts +0 -11
- package/scripts/package/production-dependency-graph.ts +0 -68
- package/scripts/retrospective/retrospective-cli.ts +0 -97
- package/scripts/retrospective/retrospective.ts +0 -127
- package/scripts/rules/delivered-rules-harness.ts +0 -72
- package/scripts/rules/top-level-scripts-guard.ts +0 -47
- package/scripts/run/run-carry-flush.ts +0 -58
- package/scripts/run/run-transcript.golden.txt +0 -57
- package/scripts/run/run-wake-work.ts +0 -108
- package/scripts/sync/dependabot-pin-logic.ts +0 -135
- package/scripts/test/classify-isolation.ts +0 -149
- package/scripts/test/http-fault-injection.ts +0 -79
- package/scripts/test/josh-harness-environment.ts +0 -260
- package/scripts/test/josh-harness.ts +0 -96
- package/scripts/test/pilot-files.ts +0 -452
- package/scripts/test/pilot-measure.ts +0 -78
- package/scripts/test/test-network-guard.ts +0 -453
- package/scripts/test/test-repository-guard.ts +0 -317
- package/scripts/test/test-state-guard.ts +0 -85
- package/scripts/test/test-stdout-guard.ts +0 -54
- package/scripts/test/test-telegram-guard.ts +0 -90
- package/scripts/test/unit-guard-environment.ts +0 -12
- package/scripts/test/unit-projects.ts +0 -139
- package/scripts/test/vitest-include-globs.ts +0 -12
- package/scripts/time-runtime/time-batch-guard-fixtures.ts +0 -66
- package/scripts-ai/completion-gate.ts +0 -13
- package/scripts-ai/environment-loader.ts +0 -9
- /package/{scripts-ai → scripts/epic}/epic-cli-argv.ts +0 -0
- /package/{scripts-ai → scripts/epic}/epic-cli-remove.ts +0 -0
- /package/{scripts-ai → scripts/git}/followup-issue-number.ts +0 -0
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
2
|
+
"version": "1.1050.0",
|
|
3
3
|
"name": "@joshuafolkken/kit",
|
|
4
4
|
"description": "Development toolkit for AI-assisted projects: formatting, AI assistant rules and a Git/GitHub Issue workflow for any repository, plus lint, type check, tests and hooks for Node projects",
|
|
5
5
|
"keywords": [
|
|
@@ -30,9 +30,7 @@
|
|
|
30
30
|
"files": [
|
|
31
31
|
"dist",
|
|
32
32
|
"scripts",
|
|
33
|
-
"scripts-ai",
|
|
34
33
|
"prompts",
|
|
35
|
-
"evals",
|
|
36
34
|
"templates",
|
|
37
35
|
"env",
|
|
38
36
|
"eslint",
|
|
@@ -65,10 +63,38 @@
|
|
|
65
63
|
"!**/*.test.ts",
|
|
66
64
|
"!scripts/gh/gh-subcommand-guard.ts",
|
|
67
65
|
"!**/*.spec.ts",
|
|
68
|
-
"!**/*-fixture
|
|
66
|
+
"!**/*-fixture*.ts",
|
|
67
|
+
"!**/__snapshots__",
|
|
68
|
+
"!**/*.golden.txt",
|
|
69
69
|
"!scripts/eval",
|
|
70
70
|
"!scripts/time",
|
|
71
|
-
"!scripts/cost"
|
|
71
|
+
"!scripts/cost",
|
|
72
|
+
"!scripts/retrospective",
|
|
73
|
+
"!scripts/test/classify-isolation.ts",
|
|
74
|
+
"!scripts/test/http-fault-injection.ts",
|
|
75
|
+
"!scripts/test/josh-harness*.ts",
|
|
76
|
+
"!scripts/test/pure-files.ts",
|
|
77
|
+
"!scripts/test/test-network-guard.ts",
|
|
78
|
+
"!scripts/test/test-repository-guard.ts",
|
|
79
|
+
"!scripts/test/test-state-guard.ts",
|
|
80
|
+
"!scripts/test/test-stdout-guard.ts",
|
|
81
|
+
"!scripts/test/test-telegram-guard.ts",
|
|
82
|
+
"!scripts/test/unit-guard-environment.ts",
|
|
83
|
+
"!scripts/test/unit-projects.ts",
|
|
84
|
+
"!scripts/test/vitest-include-globs.ts",
|
|
85
|
+
"!scripts/build/shim-shell.ts",
|
|
86
|
+
"!scripts/claude/skill-meta.ts",
|
|
87
|
+
"!scripts/document/document-scan.ts",
|
|
88
|
+
"!scripts/document/generate-catalog.ts",
|
|
89
|
+
"!scripts/document/retired-phrases.ts",
|
|
90
|
+
"!scripts/document/review-agent-type.ts",
|
|
91
|
+
"!scripts/document/single-source.ts",
|
|
92
|
+
"!scripts/hooks/prompt-hooks.ts",
|
|
93
|
+
"!scripts/init/hook-command-bootstrap.ts",
|
|
94
|
+
"!scripts/josh/josh-script-reader.ts",
|
|
95
|
+
"!scripts/package/production-dependency-graph.ts",
|
|
96
|
+
"!scripts/rules/delivered-rules-harness.ts",
|
|
97
|
+
"!scripts/rules/top-level-scripts-guard.ts"
|
|
72
98
|
],
|
|
73
99
|
"imports": {
|
|
74
100
|
"#eslint/*": "./eslint/*",
|
|
@@ -195,7 +221,7 @@
|
|
|
195
221
|
"@playwright/test": "^1.63.0",
|
|
196
222
|
"@secretlint/secretlint-rule-preset-recommend": "^13.0.6",
|
|
197
223
|
"@stylistic/eslint-plugin": "^5.10.0",
|
|
198
|
-
"@types/node": "^26.6.
|
|
224
|
+
"@types/node": "^26.6.4",
|
|
199
225
|
"@types/semver": "^7.8.0",
|
|
200
226
|
"cspell": "^10.3.6",
|
|
201
227
|
"esbuild": "^0.28.2",
|
|
@@ -207,17 +233,17 @@
|
|
|
207
233
|
"eslint-plugin-sonarjs": "^4.2.2",
|
|
208
234
|
"eslint-plugin-unicorn": "^76.0.0",
|
|
209
235
|
"eslint_d": "^15.0.3",
|
|
210
|
-
"globals": "^17.
|
|
211
|
-
"lefthook": "^2.1.
|
|
236
|
+
"globals": "^17.13.0",
|
|
237
|
+
"lefthook": "^2.1.16",
|
|
212
238
|
"prettier": "^3.9.9",
|
|
213
239
|
"prettier-plugin-svelte": "^4.1.1",
|
|
214
240
|
"prettier-plugin-tailwindcss": "^0.8.1",
|
|
215
|
-
"rollup": "^4.63.
|
|
241
|
+
"rollup": "^4.63.6",
|
|
216
242
|
"rollup-plugin-dts": "^6.5.1",
|
|
217
243
|
"secretlint": "^13.0.6",
|
|
218
244
|
"typescript": "^6.0.3",
|
|
219
245
|
"typescript-eslint": "^8.71.0",
|
|
220
|
-
"vitest": "^5.0.
|
|
246
|
+
"vitest": "^5.0.3"
|
|
221
247
|
},
|
|
222
248
|
"dependencies": {
|
|
223
249
|
"execa": "^10.0.1",
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# コーディング指針 — lint では表せない書き方
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
命名・関数の構文・エクスポート・ファイル名・品質上限・型安全・早期 return・マジックナンバーといった機械的な規約の単一ソースは `CLAUDE.md` → "Critical Conventions (non-standard — always apply)" である。その大半は ESLint が強制する(クラスのプロパティ・メソッドの `snake_case` など `CLAUDE.md` に書いていない細目は `eslint/rules/naming-convention.js` が持つ)。ただし **`function` 構文(アロー関数を使わない)と早期 return の 1 行形式は lint が検査しない**ので、書き手とレビューが確かめる。このファイルは本文を写さず、lint では表せない書き方の指針だけを持つ。
|
|
4
|
+
|
|
5
|
+
lint・型検査の実行手順は `CLAUDE.md` → "Code Change Rules" の検証ゲート(`pnpm josh gate`、実装中は `pnpm josh lint:related` / `pnpm josh test:related`)が単一ソースである。
|
|
4
6
|
|
|
5
7
|
## 📝 基本方針
|
|
6
8
|
|
|
@@ -24,7 +26,7 @@
|
|
|
24
26
|
- **過度な抽象化を避ける**: 現在の要件で必要な抽象化のみを行う。将来の拡張性を考慮した抽象化は不要
|
|
25
27
|
- **パターンの強制は避ける**: デザインパターンやアーキテクチャパターンを無理に適用しない
|
|
26
28
|
- **コードの重複は撲滅**: コードクローン(重複)は完全に撲滅する。重複が見つかった場合は関数やモジュールに抽出して共通化する
|
|
27
|
-
- **仕組みを足す前に原因を問う**: これは**書かれたコードの可読性**の規則。仕組み(フック・ガード・ルール)を足すか・どこへ置くかという**設計時の判断**は `prompts/collaboration-workflow/
|
|
29
|
+
- **仕組みを足す前に原因を問う**: これは**書かれたコードの可読性**の規則。仕組み(フック・ガード・ルール)を足すか・どこへ置くかという**設計時の判断**は `prompts/collaboration-workflow/principles.md` → "設計はエレガント" の担当なので、本文を写さずそちらを参照する
|
|
28
30
|
|
|
29
31
|
### エラーハンドリング
|
|
30
32
|
|
|
@@ -37,59 +39,8 @@
|
|
|
37
39
|
- **略語は避ける**: 一般的でない略語は使わず、明確な単語を使用する
|
|
38
40
|
- **長すぎる名前も避ける**: 必要以上に長い名前は避け、適切な長さで意図を表現する
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
### ❌ よくある間違い:camelCase を使う
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
// ❌ 間違い(標準的なTypeScript)
|
|
46
|
-
const userName = 'john'
|
|
47
|
-
const isLoggedIn = true
|
|
48
|
-
const getUserData = () => {}
|
|
49
|
-
|
|
50
|
-
// ✅ 正しい(このプロジェクト)
|
|
51
|
-
const user_name = 'john'
|
|
52
|
-
const is_logged_in = true
|
|
53
|
-
const get_user_data = () => {}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 正しい命名規則
|
|
57
|
-
|
|
58
|
-
- **変数・関数・パラメータ**: `snake_case`
|
|
59
|
-
- **定数(const)**: `UPPER_CASE` または `snake_case`
|
|
60
|
-
- **boolean変数**: `is_`, `has_`, `should_`, `can_`, `will_`, `did_` で始める
|
|
61
|
-
- **型・クラス・インターフェース・Enum**: `PascalCase`
|
|
62
|
-
- **Enumメンバー**: `UPPER_CASE`
|
|
63
|
-
- **クラスプロパティ・メソッド**: `snake_case`
|
|
64
|
-
|
|
65
|
-
## 🔧 必須:型安全性ルール
|
|
66
|
-
|
|
67
|
-
### 明示的な型定義が必須
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
// ❌ 間違い
|
|
71
|
-
const processData = (data) => {
|
|
72
|
-
return data.map((item) => item.value)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// ✅ 正しい
|
|
76
|
-
const process_data = (data: Array<{ value: string }>): Array<string> => {
|
|
77
|
-
return data.map((item) => item.value)
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### 禁止事項
|
|
82
|
-
|
|
83
|
-
- `any` の使用は完全禁止
|
|
84
|
-
- 未使用変数は禁止
|
|
85
|
-
- 浮動Promiseは禁止
|
|
86
|
-
- 型アサーションは制限あり
|
|
87
|
-
|
|
88
|
-
### 早期returnの書き方
|
|
42
|
+
### 条件式と定数
|
|
89
43
|
|
|
90
|
-
- 条件の本体が単一の `return` だけで、かつ行長が100文字未満のときは1行で書く
|
|
91
|
-
`if (value === undefined) return default_value`
|
|
92
|
-
- 100文字以上になる、または複数ステートメントがある場合はブロック構文を使う
|
|
93
44
|
- **条件式が複雑な場合は関数に抽出**: 条件式の意図が不明瞭な場合は、関数に抽出して関数名で意図を明確にする
|
|
94
45
|
|
|
95
46
|
```typescript
|
|
@@ -104,10 +55,7 @@ const process_data = (data: Array<{ value: string }>): Array<string> => {
|
|
|
104
55
|
}
|
|
105
56
|
```
|
|
106
57
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
- `0`, `1`, `-1` 以外の数値リテラルは原則として定数へ抽出する
|
|
110
|
-
- 繰り返し使用する文字列や識別子は定数化し、意味の分かる名前を付ける
|
|
58
|
+
- **文字列も定数化する**: 数値リテラルの抽出は lint が強制するが、繰り返し使用する文字列や識別子も定数化し、意味の分かる名前を付ける
|
|
111
59
|
|
|
112
60
|
## 📁 新規作成時の手順
|
|
113
61
|
|
|
@@ -118,59 +66,23 @@ const process_data = (data: Array<{ value: string }>): Array<string> => {
|
|
|
118
66
|
find src -name "*.ts" -o -name "*.svelte" | grep -i [関連キーワード]
|
|
119
67
|
```
|
|
120
68
|
|
|
121
|
-
### 2.
|
|
122
|
-
|
|
123
|
-
- **Svelteファイル**: `PascalCase.svelte`(例: `UserProfile.svelte`)
|
|
124
|
-
- **`*.svelte.ts` ファイル**: Svelte のリアクティブな状態やロジックを格納するファイルも `PascalCase.svelte.ts` 形式とする(例: `ThemeStore.svelte.ts`, `LocaleStore.svelte.ts`)
|
|
125
|
-
- **TypeScriptファイル**: `kebab-case.ts`(例: `user-service.ts`)
|
|
126
|
-
- **テストファイル**: ユニット/統合テストは `*.test.ts`(`*.spec.ts` は禁止)、コンポーネント/ブラウザテストは `*.svelte.test.ts`(`.svelte.` の中置は必須・保持する)、E2E は `src/routes/**/*.e2e.ts`。テストは対象モジュールの隣に colocate し、トップレベルの `tests/` ディレクトリは使わない(詳細は `prompts/testing-guide.md` の「Test file naming & placement」を参照)
|
|
127
|
-
- **ルートファイル**: `+page.svelte`, `+layout.svelte` などは例外
|
|
128
|
-
- **関数定義**: `function` で表現できる処理はアロー関数ではなく通常の `function` 構文で記述する
|
|
129
|
-
- **複数関数のエクスポート**: 複数の関数を公開する場合は名前空間オブジェクト(namespace object)にまとめてエクスポートする(定数のみのエクスポートは個別で問題ない)
|
|
130
|
-
|
|
131
|
-
### ファイル分割の指針
|
|
69
|
+
### 2. ファイル分割の指針
|
|
132
70
|
|
|
133
|
-
-
|
|
71
|
+
- **上限に近づいたら分割を検討**: 関数やファイルが `CLAUDE.md` → "Quality limits" の上限に近づいたら分割を検討する。編集前に `pnpm josh lines <path>` で余裕を確認する
|
|
134
72
|
- **責任が複数ある場合**: 1つのファイルが複数の責任を持つ場合は、責任ごとにファイルを分割
|
|
135
73
|
- **再利用性**: 他のファイルからも使用される可能性があるロジックは、別ファイルに分離
|
|
136
74
|
- **メインファイルの肥大化を避ける**: メインファイルの肥大化を避けることを優先する。再利用可能な機能や独立した責任を持つ機能は、積極的に別ファイルに分割する。メインファイルは主要な処理フローに集中し、詳細な実装は別ファイルに分離する
|
|
137
75
|
- **過度な分割は避ける**: 小さすぎるファイルの分割は避け、関連する機能は同じファイルにまとめる
|
|
138
76
|
|
|
139
|
-
### 3.
|
|
140
|
-
|
|
141
|
-
```typescript
|
|
142
|
-
// ❌ 間違い
|
|
143
|
-
export default class UserService {}
|
|
144
|
-
|
|
145
|
-
// ✅ 正しい
|
|
146
|
-
export class UserService {}
|
|
147
|
-
export type { UserData }
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
#### 名前空間オブジェクトエクスポート(必須)
|
|
151
|
-
|
|
152
|
-
**重要**: 複数の関数を公開する場合は、必ず名前空間オブジェクト(namespace object)にまとめてエクスポートする。リファクタリング時も同様に適用する。
|
|
153
|
-
|
|
154
|
-
**注意**: このルールは**関数のみ**に適用される。定数(`const`で定義された値やオブジェクト)は個別エクスポートで問題なく、名前空間オブジェクトにまとめる必要はない。
|
|
77
|
+
### 3. 名前空間オブジェクトの名付け方
|
|
155
78
|
|
|
156
|
-
|
|
157
|
-
// ❌ 間違い: 個別の関数エクスポート
|
|
158
|
-
async function exec_git_branch(): Promise<string> {
|
|
159
|
-
return await exec_git_command('rev-parse --abbrev-ref HEAD')
|
|
160
|
-
}
|
|
79
|
+
複数の関数を名前空間オブジェクトにまとめてエクスポートする規則そのものは `CLAUDE.md` → "Functions & exports" にある(定数は個別エクスポートでよい)。ここでは名付け方だけを述べる。
|
|
161
80
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export { exec_git_branch, exec_git_status }
|
|
167
|
-
```
|
|
81
|
+
- ファイル名と名前空間名で意図を明確にする(例: `git-command.ts` → `git_command`)
|
|
82
|
+
- メソッド名は短く、名前空間で補完する(例: `exec_git_branch()` → `git_command.branch()`)
|
|
168
83
|
|
|
169
84
|
```typescript
|
|
170
|
-
// ✅
|
|
171
|
-
// ファイル名: git-command.ts
|
|
172
|
-
// 名前空間名: git_command
|
|
173
|
-
|
|
85
|
+
// ✅ ファイル名: git-command.ts / 名前空間名: git_command
|
|
174
86
|
async function branch(): Promise<string> {
|
|
175
87
|
return await exec_git_command('rev-parse --abbrev-ref HEAD')
|
|
176
88
|
}
|
|
@@ -187,196 +99,9 @@ const git_command = {
|
|
|
187
99
|
export { git_command }
|
|
188
100
|
```
|
|
189
101
|
|
|
190
|
-
**命名の工夫**:
|
|
191
|
-
|
|
192
|
-
- ファイル名と名前空間名で意図を明確にする(例: `git-command.ts` → `git_command`)
|
|
193
|
-
- メソッド名は短く、名前空間で補完する(例: `exec_git_branch()` → `git_command.branch()`)
|
|
194
|
-
- アロー関数は使わず、通常の`function`構文を使用する
|
|
195
|
-
|
|
196
|
-
**使用例**:
|
|
197
|
-
|
|
198
102
|
```typescript
|
|
199
|
-
//
|
|
103
|
+
// 使用側
|
|
200
104
|
import { git_command } from './git/git-command.js'
|
|
201
105
|
|
|
202
|
-
// 使用
|
|
203
106
|
const branch_name = await git_command.branch()
|
|
204
|
-
const status_output = await git_command.status()
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
## 🧹 必須:Lintチェック手順
|
|
208
|
-
|
|
209
|
-
### 基本ルール
|
|
210
|
-
|
|
211
|
-
- **ファイルを変更したときは、最後にかならず lint チェックを行うこと**
|
|
212
|
-
- エラーがある場合は修正してからコミットする
|
|
213
|
-
- 変更したファイルだけでなく、依存関係にあるファイルも含めてチェックする
|
|
214
|
-
|
|
215
|
-
### チェック対象
|
|
216
|
-
|
|
217
|
-
- 編集したファイル、新規作成したファイル、削除したファイル(インポート元がある場合)
|
|
218
|
-
- 依存ファイル:変更したファイルからインポートしているファイル、変更したファイルがインポートしているファイル、同じ機能領域のファイル
|
|
219
|
-
|
|
220
|
-
### 編集後の必須作業
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
# 1. ESLintチェック
|
|
224
|
-
pnpm run lint
|
|
225
|
-
|
|
226
|
-
# 2. エラーがある場合は修正
|
|
227
|
-
pnpm run lint:fix
|
|
228
|
-
|
|
229
|
-
# 3. 型チェック
|
|
230
|
-
pnpm run check
|
|
231
|
-
|
|
232
|
-
# 4. 最終確認
|
|
233
|
-
pnpm run build
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### Agentモード運用(報告=Lintゼロの保証)
|
|
237
|
-
|
|
238
|
-
1. **変更完了直後にLintを実行**
|
|
239
|
-
- `read_lints([変更ファイルの絶対パス配列])` で初期確認
|
|
240
|
-
- **必須**: `pnpm run lint` で検証(`read_lints` は一部のESLintルールやPrettierを検出しないため)
|
|
241
|
-
- エラーが1件でもあれば修正→再実行。ゼロになるまで報告禁止
|
|
242
|
-
|
|
243
|
-
2. **複数ファイル変更時**
|
|
244
|
-
- すべての関与ファイルを明示的に指定してチェック
|
|
245
|
-
- 大きな変更はファイル群ごとに区切り、群ごとにLintゼロを達成してから次へ
|
|
246
|
-
|
|
247
|
-
3. **報告文**
|
|
248
|
-
- 「Lint: 0 errors(確認対象: 変更ファイル/またはsrc配下)」を明記
|
|
249
|
-
- ゼロ以外は報告不可
|
|
250
|
-
|
|
251
|
-
**`read_lints` の制限**: 一部のESLintルール(例: `id-length`)やPrettierのフォーマットチェックを検出しない。報告前に必ず `pnpm run lint` で再確認すること。
|
|
252
|
-
|
|
253
|
-
補足: 本運用ルールの機械可読版は `prompts/agent-lint-protocol.json` に格納。
|
|
254
|
-
|
|
255
|
-
### よくあるLintエラーと対処法
|
|
256
|
-
|
|
257
|
-
#### 1. 命名規則エラー
|
|
258
|
-
|
|
259
|
-
```bash
|
|
260
|
-
# エラー例
|
|
261
|
-
error: Identifier 'userName' is not in snake_case
|
|
262
|
-
|
|
263
|
-
# 修正
|
|
264
|
-
const user_name = 'john'; // snake_caseに変更
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
#### 2. 型定義エラー
|
|
268
|
-
|
|
269
|
-
```bash
|
|
270
|
-
# エラー例
|
|
271
|
-
error: Missing return type on function
|
|
272
|
-
|
|
273
|
-
# 修正
|
|
274
|
-
const get_user_data = (): UserData => { // 戻り値の型を明記
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
#### 3. 未使用変数エラー
|
|
278
|
-
|
|
279
|
-
```bash
|
|
280
|
-
# エラー例
|
|
281
|
-
error: 'unusedVar' is defined but never used
|
|
282
|
-
|
|
283
|
-
# 修正
|
|
284
|
-
const _unused_var = 'value'; // アンダースコアプレフィックス
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
## 🎯 プロジェクト固有の設定
|
|
288
|
-
|
|
289
|
-
### Svelte固有ルール
|
|
290
|
-
|
|
291
|
-
- `$state` などのリアクティブ変数は再代入可能
|
|
292
|
-
- Propsインターフェース名は `Props` で許可
|
|
293
|
-
- DOM操作は制限あり
|
|
294
|
-
|
|
295
|
-
### ファイル除外設定
|
|
296
|
-
|
|
297
|
-
以下のファイルはESLint対象外:
|
|
298
|
-
|
|
299
|
-
- `.storybook/**`
|
|
300
|
-
- `*.config.js`
|
|
301
|
-
- `src/routes/demo/**`
|
|
302
|
-
- `src/stories/**`
|
|
303
|
-
|
|
304
|
-
### リファクタリング除外設定
|
|
305
|
-
|
|
306
|
-
ファイル先頭に `/* @refactor-ignore */` コメントが含まれるファイルは、リファクタリング提案や参考コードとして使用する際の対象から除外されます。
|
|
307
|
-
|
|
308
|
-
```typescript
|
|
309
|
-
#!/usr/bin/env node
|
|
310
|
-
/* @refactor-ignore */
|
|
311
|
-
// このファイルはリファクタリング対象外です
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
### 複雑度制限
|
|
315
|
-
|
|
316
|
-
- **関数の複雑度**: 最大5
|
|
317
|
-
- **認知的複雑度**: 最大4
|
|
318
|
-
- **ネストレベル**: 最大2
|
|
319
|
-
- **関数の行数**: 最大25行(テストファイルは35行)
|
|
320
|
-
- **ファイルの行数**: 最大300行
|
|
321
|
-
- **関数内の文の数**: 最大10
|
|
322
|
-
- **パラメータ数**: 最大4個
|
|
323
|
-
- **行数はコード行数であり物理行数ではない**: `max-lines` / `max-lines-per-function` は `skipBlankLines` と `skipComments` を有効にして動くため、空行とコメントは数えない。`wc -l` ではなく `pnpm josh lint` の報告で判断する(joshuafolkken/kit#1070)
|
|
324
|
-
|
|
325
|
-
## 🔍 デバッグ用コマンド
|
|
326
|
-
|
|
327
|
-
### 特定ファイルのLintチェック
|
|
328
|
-
|
|
329
|
-
```bash
|
|
330
|
-
pnpm exec eslint src/path/to/file.ts
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
### 自動修正可能なエラーを修正
|
|
334
|
-
|
|
335
|
-
```bash
|
|
336
|
-
pnpm exec eslint --fix src/path/to/file.ts
|
|
337
107
|
```
|
|
338
|
-
|
|
339
|
-
### 型チェックのみ
|
|
340
|
-
|
|
341
|
-
```bash
|
|
342
|
-
pnpm exec tsc --noEmit
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
## ⚠️ よくある間違いトップ5
|
|
346
|
-
|
|
347
|
-
1. **camelCase使用** → `snake_case`に変更
|
|
348
|
-
2. **型定義省略** → 明示的な型定義を追加
|
|
349
|
-
3. **any使用** → 適切な型を定義
|
|
350
|
-
4. **Lintチェック忘れ** → 必ず`pnpm run lint`実行
|
|
351
|
-
5. **既存ファイル未参照** → 類似機能のファイルを必ず確認
|
|
352
|
-
|
|
353
|
-
### その他のよくある間違い
|
|
354
|
-
|
|
355
|
-
- **過度な抽象化** → 現在の要件に必要な抽象化のみを行う
|
|
356
|
-
- **不要なコメント** → コードで表現できることはコメントにしない
|
|
357
|
-
- **未来の拡張性を考慮** → 現在必要な機能のみを実装する
|
|
358
|
-
- **意図が不明瞭な条件式** → 複雑な条件式や意図が伝わりにくい処理は関数に抽出して関数名で意図を明確にする
|
|
359
|
-
|
|
360
|
-
## 📋 チェックリスト
|
|
361
|
-
|
|
362
|
-
新規作成・リファクタリング時:
|
|
363
|
-
|
|
364
|
-
- [ ] 既存の類似ファイルを参照した
|
|
365
|
-
- [ ] 命名規則(snake_case)を守った
|
|
366
|
-
- [ ] 明示的な型定義を追加した
|
|
367
|
-
- [ ] `any`を使用していない
|
|
368
|
-
- [ ] `pnpm run lint`でエラーがない
|
|
369
|
-
- [ ] `pnpm run check`で型エラーがない
|
|
370
|
-
- [ ] 複雑度制限内に収まっている
|
|
371
|
-
- [ ] コードがシンプルで読みやすいか
|
|
372
|
-
- [ ] 現在の要件に集中しているか(未来の拡張性を考慮していないか)
|
|
373
|
-
- [ ] 過度な抽象化をしていないか
|
|
374
|
-
- [ ] 不要なコメントがないか
|
|
375
|
-
- [ ] 適切にファイル分割されているか
|
|
376
|
-
- [ ] コードの重複(クローン)がないか
|
|
377
|
-
- [ ] 条件式や意図が不明瞭な処理を関数に抽出しているか
|
|
378
|
-
- [ ] 複数の関数を公開する場合は名前空間オブジェクトにまとめてエクスポートしているか(**注意**: 関数のみに適用。定数は個別エクスポートで問題ない)
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
**重要**: このプロジェクトのESLint設定は標準と大きく異なります。必ずこのガイドを参照し、既存ファイルのパターンに従ってコーディングしてください。
|
|
@@ -1,54 +1,5 @@
|
|
|
1
1
|
## リポジトリをまたぐ EPIC
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**この規則の単一ソースは `.claude/skills/epic-commands/SKILL.md` → "Epics that span repositories" である。** 子の書き方、owner の制限、自動クローズ、公開の完了を待つ依存、配布物を持たない repo、実行のディスパッチ、`owner/repo#N` での参照はすべてそこにある。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
EPIC 本文のタスクリストに、次のどちらかの形で書く。
|
|
8
|
-
|
|
9
|
-
```md
|
|
10
|
-
## Progress
|
|
11
|
-
|
|
12
|
-
- [ ] #101
|
|
13
|
-
- [ ] joshuafolkken/app-kit#7
|
|
14
|
-
- [ ] https://github.com/joshuafolkken/game-kit/issues/12
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
**状態の読み取りにローカルチェックアウトは要らない。** そのリポジトリを指定した REST パス(`gh api repos/<owner>/<repo>/issues/<n>`)で読むため、クローンが必要になるのは実装の段になってからである。
|
|
18
|
-
|
|
19
|
-
**owner の制限は joshuafolkken/kit#869 のものをそのまま継承する。** 現在のリポジトリと owner が異なるリポジトリの子は、いかなる経路でも対象にならない。
|
|
20
|
-
|
|
21
|
-
### 自動クローズ
|
|
22
|
-
|
|
23
|
-
**他リポジトリの子の状態が全て読めた場合に限り**、EPIC は自動でクローズされる。1 件でも読めない子があれば従来どおり据え置かれる。「状態を読めないまま閉じない」という安全側の判断は変わっておらず、読む手段ができただけである。
|
|
24
|
-
|
|
25
|
-
### 別 repo への依存は「公開の完了」までを条件とする
|
|
26
|
-
|
|
27
|
-
**`blocked-by` は相手 Issue が closed になれば解決するが、repo をまたぐ依存ではそれでは早すぎる。** kit の Issue が closed になった時点では npm への公開がまだ終わっていない(マージ → auto-tag → publish が非同期)。その瞬間に app-kit の子を着手可能と判定すると、まだ公開されていないバージョンを取りに行って失敗するか、古いバージョンのまま実装して壊れる。**放置すると「たまに壊れる」という最も診断しにくい形で出る。**
|
|
28
|
-
|
|
29
|
-
- 同一 repo 内の依存 → 相手が closed で解決
|
|
30
|
-
- **別 repo の子への依存 → 相手が closed + その repo が配布するパッケージの新バージョンが npm に出現、で解決**
|
|
31
|
-
|
|
32
|
-
**評価は AND であり、順序が意味を持つ。** 相手が open のあいだは未解決と判定するだけで npm を見に行かない。EPIC 開始時から公開待ちで固まることはなく、「前の子が終わってから、公開されたら着手する」という待ち方になる。
|
|
33
|
-
|
|
34
|
-
**待つ標的は具体的な版であり、「新しいバージョン」ではない。** 消費者が数バージョン遅れている場合、「今より新しい版が出た」を条件にすると目的の機能を含まない古い公開で満たされてしまう。相手 repo の default branch の `package.json` が持つバージョンを標的にする(`gh api` でローカルチェックアウト無しに読める)。**ただし子はもうバージョンを上げない**(joshuafolkken/kit#1486)。版が動くのは `pnpm josh release` が走ったときだけなので、標的は「子がマージされた直後の版」ではなく「その子を含むリリースが打たれた後の版」である。マージ直後の default branch の版は前回リリースのものなので、それを標的にすると待ちが即座に満たされてしまう。
|
|
35
|
-
|
|
36
|
-
**ただし相手 repo が配布物を持たない場合は待たない**(joshuafolkken/kit#1129)。default branch に `package.json` が無い、あるいは `private` を宣言している repo は公開する版そのものが存在しないため、closed な blocker はそこで解決とする。待ち続けると実行上限の 8 時間まで抜けられず、しかも人が編集して解消できるものが無い。
|
|
37
|
-
|
|
38
|
-
**この判定は相手 repo の manifest から読み、レジストリからは読まない。** レジストリの 404 は「公開されたことがない」だけでなく「このトークンからは見えない」(repo 名の変更、private パッケージ、`read:packages` 権限の欠如)も意味するため、それで解決としてしまうと、blocker の版がまだ公開されていないのに消費者側の子が着手してしまう。manifest の 404 にはその曖昧さが無い — その repo の Issue は既に読めているので権限は確認済みであり、無いのはファイルのほうである。読み取り自体の失敗は HTTP ステータスで区別し、従来どおり待つ。
|
|
39
|
-
|
|
40
|
-
公開待ちの判定は `josh propagate` の実装を共有する。二重定義を作らない。
|
|
41
|
-
|
|
42
|
-
### 実行のディスパッチ
|
|
43
|
-
|
|
44
|
-
`josh epic:next` の出力は各候補の**対象リポジトリとローカルチェックアウトのパス**を含む。パスは joshuafolkken/kit#869 の地図から引く。**チェックアウトが無いリポジトリは、勝手に clone せず「ローカルチェックアウト無し」と表示する。**
|
|
45
|
-
|
|
46
|
-
### EPIC を別リポジトリから参照する
|
|
47
|
-
|
|
48
|
-
**クロス repo の EPIC は 1 つの repo にしか存在しない。** app-kit のセッションから kit の EPIC を参照するときは `owner/repo#N` の形で修飾する。
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
pnpm josh epic:next joshuafolkken/kit#858 --repo joshuafolkken/app-kit
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**裸の `#N` は自リポジトリの別 Issue に解決される** — 番号が同じだけの、まったく別の Issue である。したがってクロス repo の EPIC には必ず修飾を付ける。`backlogrun joshuafolkken/kit#858 --only` も同じ形。
|
|
5
|
+
経緯(公開待ちが要る理由、joshuafolkken/kit#1129)は [`docs/maintainers/epic-commands-rationale.md`](../../docs/maintainers/epic-commands-rationale.md) にある。
|
|
@@ -1,56 +1,5 @@
|
|
|
1
1
|
## `josh epic:audit` — 子 Issue 群を横断して矛盾を検出する
|
|
2
2
|
|
|
3
|
-
`
|
|
3
|
+
**この規則の単一ソースは `.claude/skills/epic-commands/SKILL.md` → "`josh epic:audit <E>` — contradictions across the children" である。** 検査表、警告とエラーの区別、片方が closed の組を警告に降格する規則、孤児検索の 2 つの結果、Tier A の修正、計画時の波及先の点検はすべてそこにある。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
- **順序矛盾** — #860 の受け入れ条件が #863 / #864 の成果物を要求していたが、依存グラフ上 #860 はその 2 件より先に走る
|
|
7
|
-
|
|
8
|
-
人が「バグを探して」と指示して初めて見つかる状態では、無人実行の前提が成り立たない。
|
|
9
|
-
|
|
10
|
-
### 検査項目
|
|
11
|
-
|
|
12
|
-
グラフそのものの性質(循環依存、本文の宣言と `blocked-by` の食い違い)は `josh epic:next` が着手可否の計算のために既に検出しており、**その判定を利用する。検出を作り直さない。** 本コマンドが新たに担うのは、子 Issue の**本文の中身**を横断して読む 4 つと、そのうち孤立した子の検索が何を読めなかったかを報告する 2 つである。
|
|
13
|
-
|
|
14
|
-
| 検査 | 種別 | 内容 |
|
|
15
|
-
| ------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
16
|
-
| 暗黙の依存 | 警告 | 子 A の本文が同じ epic の子 B を参照しているのに、どちら向きにも依存が宣言されていない |
|
|
17
|
-
| 順序矛盾 | エラー | 子 A の**受け入れ条件**が子 B の成果物を参照しているのに、A が B に依存していない(先に走れる)。ただし A・B がどちらも closed なら警告に降格 |
|
|
18
|
-
| 未解決の参照 | 警告 | 本文が参照する Issue が存在しない、または既にクローズ済み |
|
|
19
|
-
| 孤立した子 | 警告 | epic を親として参照しているのに epic のタスクリストに載っていない Issue |
|
|
20
|
-
| 孤児検索 | エラー | 上記を探すための open issue 一覧そのものが読めなかった(レート制限、認証切れ) |
|
|
21
|
-
| 孤児検索 | 警告 | その検索が backlog の末尾に届く前に打ち切られた(500 件のページ上限、または 50 件の一致上限) |
|
|
22
|
-
|
|
23
|
-
### 警告とエラーを区別する
|
|
24
|
-
|
|
25
|
-
**警告は exit code を左右せず、エラーだけが exit 1 になる。** 暗黙の依存の検査は「参照している」ことしか見ないため、後続の子への前方参照(「この部分は #864 が埋める」)にも当たる。これをエラーにすると正当な設計メモが書けなくなるので、**判断は読み手に委ね、機械は見落としを防ぐ側に徹する**。
|
|
26
|
-
|
|
27
|
-
一方、受け入れ条件が後から作られるものを要求している状態は誰がどう決めても満たせないため、エラーとする。
|
|
28
|
-
|
|
29
|
-
### 両端が closed の順序矛盾は警告に落とす
|
|
30
|
-
|
|
31
|
-
順序矛盾がエラーである根拠は「**先に走れてしまう**」という一点にある。子が 2 件とも closed になった時点でどちらにも実行が残っておらず、その根拠は成立しない。にもかかわらずエラーのままにすると、**過去に一度でも順序を宣言し忘れた EPIC は永久に監査を通らなくなる** — `backlogrun` は epic の最初の子より前に監査を走らせるため、その EPIC は再開のたびに一歩目で止まる。joshuafolkken/kit#908 で実際に起きており、同じ状態で `epic:next` は次の子を問題無く返していた。すなわち**エラーが止める根拠と、実際に実行を阻むかどうかが食い違っていた**(joshuafolkken/kit#1010)。
|
|
32
|
-
|
|
33
|
-
**「報告しない」ではなく「警告に降格」を採る。** 受け入れ条件は本文の一部なので、同じ組は暗黙の依存の検査にも当たっており、順序矛盾がその組を報告している間だけ重複が抑止されている。落とせばその組は 1 行下に `implicit dependency` として現れるだけで、**出力は 1 行も短くならず**、「受け入れ条件に書かれている」という唯一読む価値のある情報だけが失われる。短さという利点が実在しない以上、履歴を残す側を採る。closed かどうかは**確認できた場合にのみ**降格する — `epic_issue.normalize_state` は `CLOSED` 以外(`MERGED` を含む)をすべて `OPEN` に写すため、確認できない状態はエラーのまま残る。
|
|
34
|
-
|
|
35
|
-
### 孤児検索の 2 件は「子の矛盾」ではない
|
|
36
|
-
|
|
37
|
-
孤立した子の検査は open issue を一覧して本文をクライアント側で照合する。**一覧が読めなかった場合、以前はそれが空の結果として届いていた** — レート制限が「孤児ゼロ」という綺麗な監査結果を生み、何も読んでいないことが出力から分からなかった(joshuafolkken/kit#1033)。
|
|
38
|
-
|
|
39
|
-
- **`✖ orphan search: Could not list the open issues…`** — 検査そのものが走っていないので、`epic:audit` は exit 1 になり `backlogrun` は相 0 で止まる。**対応は監査の再実行だけ**で、直すべき矛盾も決めるべき設計判断も無い — 下記の Tier A にも `needs-decision` park にも当たらない。繰り返し失敗するなら `gh auth status` とレート制限の回復を確認する
|
|
40
|
-
- **`⚠ orphan search: The open-issue scan hit its …`** — 検索は走ったが backlog の新しい側だけを見た(500 件のページ上限、または epic に言及する本文 50 件で打ち切り)。監査自体は通るので、行を読んだうえで、より古い位置に孤児が予想される場合だけ人手で確認する
|
|
41
|
-
|
|
42
|
-
### 実行される場所(人が指示しなくても回る)
|
|
43
|
-
|
|
44
|
-
- **`backlogrun` の判断パスの前** — 一括決定の前に矛盾を洗い出す
|
|
45
|
-
- **`backlogrun` が epic 項目を始めるとき** — 矛盾を抱えたまま無人実行を始めない
|
|
46
|
-
- **子 Issue を追加した直後、依存を変更した直後**
|
|
47
|
-
|
|
48
|
-
### 検出した矛盾は Tier A(確認せず直す)
|
|
49
|
-
|
|
50
|
-
依存の付け直しも本文の記述修正も可逆であり、放置すれば必ず実装時に詰まる。**確認を挟む価値がないので、人に尋ねず修正して根拠を Issue に記録する。** 例外は「どちらの設計を採るべきかが決まらない」種類の矛盾で、これに限り該当の子に `needs-decision` を付けて park する。
|
|
51
|
-
|
|
52
|
-
### 波及先の点検(計画段階の手順)
|
|
53
|
-
|
|
54
|
-
機械的検査では捕まらない欠陥として、**新しい概念を導入したのに既存コードの参照箇所が更新されない**というものがある。#858 の監査では 3 件見つかった — `needs-decision` ラベルを導入するのに除外集合への追加担当が無かった、`epicrun` を導入するのに epic 本文が古いコマンドを案内し続ける点の担当が無かった、`in-progress` を付ける処理はあるが外す処理が無かった。
|
|
55
|
-
|
|
56
|
-
したがって計画段階で次を行う。**新しいラベル・コマンド・状態・成果物を導入する子 Issue がある場合、既存コードでその概念を参照している箇所を列挙し、更新の担当がいずれかの子 Issue に割り当てられていることを確認する。** ラベル名は `scripts/git/issue-labels.ts` に単一ソース化されているので、そこを起点に消費者を辿れる。
|
|
5
|
+
経緯(joshuafolkken/kit#858 の監査で見つかった矛盾と波及漏れ、joshuafolkken/kit#1010)は [`docs/maintainers/epic-commands-rationale.md`](../../docs/maintainers/epic-commands-rationale.md) にある。
|