@ikon85/agent-workflow-kit 0.42.1 → 0.44.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.
Files changed (133) hide show
  1. package/.agents/skills/grill-me/SKILL.md +3 -1
  2. package/.agents/skills/grill-with-docs/SKILL.md +3 -1
  3. package/.agents/skills/kit-update/SKILL.md +9 -11
  4. package/.agents/skills/orchestrate-wave/SKILL.md +8 -8
  5. package/.agents/skills/setup-workflow/SKILL.md +20 -18
  6. package/.agents/skills/setup-workflow/board-sync.md +4 -1
  7. package/.agents/skills/setup-workflow/workflow-advisories.md +3 -2
  8. package/.agents/skills/setup-workflow/worktree-lifecycle.md +36 -31
  9. package/.agents/skills/to-issues/SKILL.md +43 -0
  10. package/.agents/skills/wrapup/SKILL.md +98 -54
  11. package/.claude/skills/grill-me/SKILL.md +3 -1
  12. package/.claude/skills/grill-me-codex/SKILL.md +3 -1
  13. package/.claude/skills/grill-with-docs/SKILL.md +3 -1
  14. package/.claude/skills/grill-with-docs-codex/SKILL.md +3 -1
  15. package/.claude/skills/kit-update/SKILL.md +9 -11
  16. package/.claude/skills/orchestrate-wave/SKILL.md +8 -8
  17. package/.claude/skills/setup-workflow/SKILL.md +20 -18
  18. package/.claude/skills/setup-workflow/board-sync.md +4 -1
  19. package/.claude/skills/setup-workflow/workflow-advisories.md +3 -2
  20. package/.claude/skills/setup-workflow/worktree-lifecycle.md +36 -31
  21. package/.claude/skills/to-issues/SKILL.md +43 -0
  22. package/.claude/skills/wrapup/SKILL.md +98 -54
  23. package/README.md +268 -7
  24. package/agent-workflow-kit.package.json +42 -42
  25. package/package.json +16 -2
  26. package/scripts/marker_lib.py +3 -0
  27. package/scripts/profile_globs.py +26 -45
  28. package/scripts/release-delta-guard.mjs +29 -4
  29. package/scripts/worktree-lifecycle/README.md +57 -154
  30. package/scripts/worktree-lifecycle/capabilities.json +2 -3
  31. package/scripts/worktree-lifecycle/classify.py +480 -0
  32. package/scripts/worktree-lifecycle/cleanup.py +9 -29
  33. package/scripts/worktree-lifecycle/core.py +68 -1289
  34. package/scripts/worktree-lifecycle/ignore_seed.py +1 -1
  35. package/scripts/worktree-lifecycle/profile.py +46 -29
  36. package/scripts/worktree-lifecycle/setup.py +7 -19
  37. package/scripts/wrapup-land.py +1292 -545
  38. package/src/consumer-migrations.json +1 -16
  39. package/src/lib/bundle.mjs +31 -1
  40. package/docs/adr/0001-consumer-divergence-policy.md +0 -53
  41. package/docs/adr/0002-capability-gated-orchestration.md +0 -70
  42. package/docs/adr/0003-kit-core-and-project-extension-lifecycle.md +0 -63
  43. package/docs/adr/0004-release-intent-is-a-version-tag.md +0 -64
  44. package/docs/adr/0005-to-issues-is-the-planning-facade.md +0 -42
  45. package/docs/adr/0006-routing-knowledge-access-and-policy-are-separate.md +0 -95
  46. package/docs/adr/0007-session-teardown-requires-provenance-bound-ownership.md +0 -88
  47. package/docs/adr/0008-planning-ignore-rules-are-offered-never-installed.md +0 -84
  48. package/docs/adr/0009-teardown-authority-is-stateless-repository-classification.md +0 -101
  49. package/docs/adr/0010-model-roster-replaces-the-optimization-dial.md +0 -87
  50. package/docs/agents/board-sync.md +0 -74
  51. package/docs/agents/code-review.md +0 -14
  52. package/docs/agents/domain.md +0 -7
  53. package/docs/agents/issue-tracker.md +0 -23
  54. package/docs/agents/skills/local-ci.md +0 -90
  55. package/docs/agents/skills/orchestrate-wave.md +0 -166
  56. package/docs/agents/skills/spec-self-critique.md +0 -18
  57. package/docs/agents/triage-labels.md +0 -10
  58. package/docs/agents/workflow-capabilities.json +0 -28
  59. package/docs/conventions/spec-completeness.md +0 -23
  60. package/docs/research/agent-task-taxonomy-benchmark-coverage.md +0 -451
  61. package/docs/research/benchlm-routing-source.md +0 -198
  62. package/docs/research/consumer-owned-protocol-files.md +0 -238
  63. package/docs/research/frontend-agent-benchmarks.md +0 -282
  64. package/docs/research/model-effort-routing-benchmarks.md +0 -261
  65. package/docs/research/provider-neutral-agent-routing.md +0 -207
  66. package/docs/research/wave-152-consumer-acceptance.md +0 -98
  67. package/docs/research/wave-43-script-hook-census.md +0 -128
  68. package/scripts/build-kit.mjs +0 -117
  69. package/scripts/build-kit.test.mjs +0 -204
  70. package/scripts/census/census.test.mjs +0 -252
  71. package/scripts/census/state.test.mjs +0 -15
  72. package/scripts/census/transaction.test.mjs +0 -103
  73. package/scripts/census-contract.test.mjs +0 -227
  74. package/scripts/check-kit-staleness.mjs +0 -45
  75. package/scripts/check-kit-staleness.test.mjs +0 -19
  76. package/scripts/codex-exec-scenarios/fake-codex.mjs +0 -152
  77. package/scripts/codex-exec.test.mjs +0 -871
  78. package/scripts/grill-census-wiring-guard.mjs +0 -87
  79. package/scripts/grill-census-wiring-guard.test.mjs +0 -107
  80. package/scripts/kit-release.test.mjs +0 -273
  81. package/scripts/kit-update-pr.test.mjs +0 -151
  82. package/scripts/lib/audit-refs.mjs +0 -146
  83. package/scripts/lib/scrub.mjs +0 -113
  84. package/scripts/lib/scrub.test.mjs +0 -187
  85. package/scripts/memory-lifecycle/memory-lifecycle.test.mjs +0 -170
  86. package/scripts/portability_profile_scan.py +0 -53
  87. package/scripts/release-delta-guard.test.mjs +0 -151
  88. package/scripts/release-parity.test.mjs +0 -90
  89. package/scripts/release-state.test.mjs +0 -360
  90. package/scripts/test_anchor_table.py +0 -69
  91. package/scripts/test_board_bootstrap.py +0 -348
  92. package/scripts/test_board_sync.py +0 -208
  93. package/scripts/test_board_sync_create_idempotency.py +0 -117
  94. package/scripts/test_board_sync_wave_title.py +0 -120
  95. package/scripts/test_census_backstop.py +0 -712
  96. package/scripts/test_census_forward_contract.py +0 -91
  97. package/scripts/test_census_update_contract.test.mjs +0 -454
  98. package/scripts/test_codex_adapter_sync_contract.py +0 -169
  99. package/scripts/test_dist_kit_smoke.py +0 -220
  100. package/scripts/test_drift_guard_diagnostics.py +0 -295
  101. package/scripts/test_issue_claim_contract.py +0 -169
  102. package/scripts/test_kit_docs_language_census.py +0 -178
  103. package/scripts/test_marker_lib.py +0 -162
  104. package/scripts/test_orchestrate_wave_contract.py +0 -381
  105. package/scripts/test_pr_body_check.py +0 -264
  106. package/scripts/test_profile_globs.py +0 -280
  107. package/scripts/test_program_planning_contract.py +0 -133
  108. package/scripts/test_release_authorization_contract.py +0 -101
  109. package/scripts/test_render_anchor.py +0 -267
  110. package/scripts/test_retro_wrapup_contract.py +0 -153
  111. package/scripts/test_skill_code_review_seed.py +0 -89
  112. package/scripts/test_skill_codex_exec_lifecycle.py +0 -123
  113. package/scripts/test_skill_frontmatter_lint.py +0 -234
  114. package/scripts/test_skill_gh_lint.py +0 -124
  115. package/scripts/test_skill_language_census.py +0 -254
  116. package/scripts/test_skill_optional_readiness.py +0 -171
  117. package/scripts/test_skill_portability_lint.py +0 -866
  118. package/scripts/test_skill_precommit_template.py +0 -30
  119. package/scripts/test_skill_publish_audit.py +0 -358
  120. package/scripts/test_skill_readiness_contract.py +0 -264
  121. package/scripts/test_skill_readiness_preflight.py +0 -180
  122. package/scripts/test_skill_required_readiness.py +0 -233
  123. package/scripts/test_skill_selfcontainment_lint.py +0 -255
  124. package/scripts/test_skill_setup_workflow_seeds.py +0 -691
  125. package/scripts/test_skill_stale_name_lint.py +0 -126
  126. package/scripts/test_skill_surface_refs.py +0 -300
  127. package/scripts/test_skill_trailing_artifact_lint.py +0 -71
  128. package/scripts/test_tdd_contract.py +0 -78
  129. package/scripts/test_worktree_ignore_seed.py +0 -320
  130. package/scripts/test_worktree_setup_base_guard.py +0 -140
  131. package/scripts/test_worktree_wrapup_contract.py +0 -1648
  132. package/scripts/test_wrapup_land.py +0 -428
  133. package/scripts/worktree-lifecycle/session.py +0 -1857
@@ -1,171 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Behavior contract for optional review and spike readiness layers."""
3
- from __future__ import annotations
4
-
5
- import json
6
- import subprocess
7
- import tempfile
8
- import unittest
9
- from pathlib import Path
10
-
11
- ROOT = Path(__file__).resolve().parents[1]
12
- READINESS = ROOT / "scripts/readiness.mjs"
13
- MANIFEST = ROOT / ".claude/skills/skill-manifest.json"
14
- SURFACES = (".claude/skills", ".agents/skills")
15
- SKILLS = {
16
- "spec-self-critique": {
17
- "block": "projectEnrichment",
18
- "capability": "specCritiqueLayer",
19
- "path": "docs/agents/skills/spec-self-critique.md",
20
- "core": ("## The 12-point checklist", "Self-Critique complete"),
21
- "enrichment": ("per-point enrichment", "project-specific incidents"),
22
- },
23
- "code-review": {
24
- "block": "projectEnrichment",
25
- "capability": "codeReviewLayer",
26
- "path": "docs/agents/code-review.md",
27
- "core": ("## Axis 1 — Standards", "## Axis 2 — Spec"),
28
- "enrichment": ("which sources count", "adjacent tools"),
29
- },
30
- "verify-spike": {
31
- "block": "projectPlacement",
32
- "capability": "verifySpikeLayer",
33
- "path": "docs/agents/skills/verify-spike.md",
34
- "core": ("Frame one falsifiable question", "Delete the harness"),
35
- "enrichment": ("harness-placement", "import rules"),
36
- },
37
- }
38
- PREFLIGHT_START = "<!-- readiness:optional-preflight:start -->"
39
- PREFLIGHT_END = "<!-- readiness:optional-preflight:end -->"
40
-
41
-
42
- def write(root: Path, relative: str, body: str) -> None:
43
- path = root / relative
44
- path.parent.mkdir(parents=True, exist_ok=True)
45
- path.write_text(body, encoding="utf-8")
46
-
47
-
48
- class OptionalReadinessTests(unittest.TestCase):
49
- def setUp(self) -> None:
50
- self.temp = tempfile.TemporaryDirectory()
51
- self.root = Path(self.temp.name)
52
- write(
53
- self.root,
54
- ".claude/skills/skill-manifest.json",
55
- MANIFEST.read_text(encoding="utf-8"),
56
- )
57
- self.consumer = {
58
- "kitVersion": "0.0.0-test",
59
- "readinessContractVersion": 1,
60
- "readinessDecisions": {},
61
- "installed": [],
62
- }
63
- self.write_consumer()
64
-
65
- def tearDown(self) -> None:
66
- self.temp.cleanup()
67
-
68
- def write_consumer(self) -> None:
69
- write(self.root, "agent-workflow-kit.json", json.dumps(self.consumer))
70
-
71
- def check(self, skill: str) -> dict:
72
- completed = subprocess.run(
73
- [
74
- "node",
75
- str(READINESS),
76
- "check",
77
- "--skill",
78
- skill,
79
- "--json",
80
- "--root",
81
- str(self.root),
82
- ],
83
- check=True,
84
- capture_output=True,
85
- text=True,
86
- )
87
- return json.loads(completed.stdout)
88
-
89
- def test_missing_and_pending_subtract_exactly_one_optional_block(self) -> None:
90
- for decision in (None, "pending"):
91
- for skill, contract in SKILLS.items():
92
- with self.subTest(skill=skill, decision=decision):
93
- self.consumer["readinessDecisions"] = {}
94
- if decision:
95
- self.consumer["readinessDecisions"][contract["capability"]] = decision
96
- self.write_consumer()
97
- result = self.check(skill)
98
- self.assertEqual(result["verdict"], "degraded")
99
- self.assertEqual(
100
- result["capabilities"][contract["capability"]]["state"],
101
- decision or "missing",
102
- )
103
- self.assertEqual(result["inactiveBlocks"], [contract["block"]])
104
- self.assertEqual(result["activeBlocks"], [])
105
-
106
- def test_invalid_enrichment_is_visible_and_never_an_opt_out(self) -> None:
107
- for skill, contract in SKILLS.items():
108
- with self.subTest(skill=skill):
109
- write(
110
- self.root,
111
- contract["path"],
112
- "<!-- setup-workflow: state=stub -->\npartial configuration\n",
113
- )
114
- self.consumer["readinessDecisions"][contract["capability"]] = "pending"
115
- self.write_consumer()
116
- result = self.check(skill)
117
- self.assertEqual(result["verdict"], "degraded")
118
- self.assertEqual(
119
- result["capabilities"][contract["capability"]]["state"],
120
- "invalid",
121
- )
122
- self.assertEqual(result["inactiveBlocks"], [contract["block"]])
123
-
124
- def test_ready_enrichment_activates_the_block(self) -> None:
125
- for skill, contract in SKILLS.items():
126
- with self.subTest(skill=skill):
127
- write(
128
- self.root,
129
- contract["path"],
130
- "<!-- setup-workflow: state=filled -->\nProject guidance.\n",
131
- )
132
- self.consumer["readinessDecisions"] = {}
133
- self.write_consumer()
134
- result = self.check(skill)
135
- self.assertEqual(result["verdict"], "ready")
136
- self.assertEqual(result["activeBlocks"], [contract["block"]])
137
- self.assertEqual(result["inactiveBlocks"], [])
138
-
139
- def test_preflight_and_exact_subtraction_match_across_both_surfaces(self) -> None:
140
- for skill, contract in SKILLS.items():
141
- blocks = []
142
- preflights = []
143
- for surface in SURFACES:
144
- body = (ROOT / surface / skill / "SKILL.md").read_text(encoding="utf-8")
145
- start = f"<!-- readiness:block {contract['block']} -->"
146
- self.assertEqual(body.count(start), 1)
147
- self.assertEqual(body.count("<!-- readiness:end -->"), 1)
148
- block = body.split(start, 1)[1].split("<!-- readiness:end -->", 1)[0]
149
- preflight = body.split(PREFLIGHT_START, 1)[1].split(PREFLIGHT_END, 1)[0]
150
- generic = body.replace(start + block + "<!-- readiness:end -->", "")
151
- for anchor in contract["core"]:
152
- self.assertIn(anchor, generic)
153
- for anchor in contract["enrichment"]:
154
- self.assertIn(anchor, block)
155
- self.assertLess(body.index(PREFLIGHT_START), body.index(start))
156
- self.assertIn(
157
- f"node scripts/readiness.mjs check --skill {skill} --json",
158
- preflight,
159
- )
160
- self.assertIn(f"inactive block `{contract['block']}`", preflight)
161
- self.assertIn(contract["capability"], preflight)
162
- self.assertIn("Ready is silent", preflight)
163
- self.assertIn("Invalid is always visible", preflight)
164
- blocks.append(block)
165
- preflights.append(preflight)
166
- self.assertEqual(blocks[0], blocks[1])
167
- self.assertEqual(preflights[0], preflights[1])
168
-
169
-
170
- if __name__ == "__main__":
171
- unittest.main()