specweave 0.6.8 → 0.7.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 (255) hide show
  1. package/.claude-plugin/README.md +1 -1
  2. package/CLAUDE.md +903 -99
  3. package/README.md +143 -207
  4. package/bin/specweave.js +67 -0
  5. package/dist/cli/commands/abandon.d.ts +13 -0
  6. package/dist/cli/commands/abandon.d.ts.map +1 -0
  7. package/dist/cli/commands/abandon.js +15 -0
  8. package/dist/cli/commands/abandon.js.map +1 -0
  9. package/dist/cli/commands/init.d.ts.map +1 -1
  10. package/dist/cli/commands/init.js +90 -18
  11. package/dist/cli/commands/init.js.map +1 -1
  12. package/dist/cli/commands/pause.d.ts +13 -0
  13. package/dist/cli/commands/pause.d.ts.map +1 -0
  14. package/dist/cli/commands/pause.js +15 -0
  15. package/dist/cli/commands/pause.js.map +1 -0
  16. package/dist/cli/commands/qa.d.ts +54 -0
  17. package/dist/cli/commands/qa.d.ts.map +1 -0
  18. package/dist/cli/commands/qa.js +98 -0
  19. package/dist/cli/commands/qa.js.map +1 -0
  20. package/dist/cli/commands/resume.d.ts +12 -0
  21. package/dist/cli/commands/resume.d.ts.map +1 -0
  22. package/dist/cli/commands/resume.js +14 -0
  23. package/dist/cli/commands/resume.js.map +1 -0
  24. package/dist/cli/commands/status.d.ts +12 -0
  25. package/dist/cli/commands/status.d.ts.map +1 -0
  26. package/dist/cli/commands/status.js +23 -0
  27. package/dist/cli/commands/status.js.map +1 -0
  28. package/dist/cli/helpers/issue-tracker/ado.d.ts +57 -0
  29. package/dist/cli/helpers/issue-tracker/ado.d.ts.map +1 -0
  30. package/dist/cli/helpers/issue-tracker/ado.js +223 -0
  31. package/dist/cli/helpers/issue-tracker/ado.js.map +1 -0
  32. package/dist/cli/helpers/issue-tracker/github.d.ts +65 -0
  33. package/dist/cli/helpers/issue-tracker/github.d.ts.map +1 -0
  34. package/dist/cli/helpers/issue-tracker/github.js +284 -0
  35. package/dist/cli/helpers/issue-tracker/github.js.map +1 -0
  36. package/dist/cli/helpers/issue-tracker/index.d.ts +22 -0
  37. package/dist/cli/helpers/issue-tracker/index.d.ts.map +1 -0
  38. package/dist/cli/helpers/issue-tracker/index.js +270 -0
  39. package/dist/cli/helpers/issue-tracker/index.js.map +1 -0
  40. package/dist/cli/helpers/issue-tracker/jira.d.ts +61 -0
  41. package/dist/cli/helpers/issue-tracker/jira.d.ts.map +1 -0
  42. package/dist/cli/helpers/issue-tracker/jira.js +265 -0
  43. package/dist/cli/helpers/issue-tracker/jira.js.map +1 -0
  44. package/dist/cli/helpers/issue-tracker/types.d.ts +86 -0
  45. package/dist/cli/helpers/issue-tracker/types.d.ts.map +1 -0
  46. package/dist/cli/helpers/issue-tracker/types.js +16 -0
  47. package/dist/cli/helpers/issue-tracker/types.js.map +1 -0
  48. package/dist/cli/helpers/issue-tracker/utils.d.ts +103 -0
  49. package/dist/cli/helpers/issue-tracker/utils.d.ts.map +1 -0
  50. package/dist/cli/helpers/issue-tracker/utils.js +240 -0
  51. package/dist/cli/helpers/issue-tracker/utils.js.map +1 -0
  52. package/dist/core/increment/limits.d.ts +68 -0
  53. package/dist/core/increment/limits.d.ts.map +1 -0
  54. package/dist/core/increment/limits.js +224 -0
  55. package/dist/core/increment/limits.js.map +1 -0
  56. package/dist/core/increment/metadata-manager.d.ts +114 -0
  57. package/dist/core/increment/metadata-manager.d.ts.map +1 -0
  58. package/dist/core/increment/metadata-manager.js +320 -0
  59. package/dist/core/increment/metadata-manager.js.map +1 -0
  60. package/dist/core/increment/status-commands.d.ts +43 -0
  61. package/dist/core/increment/status-commands.d.ts.map +1 -0
  62. package/dist/core/increment/status-commands.js +277 -0
  63. package/dist/core/increment/status-commands.js.map +1 -0
  64. package/dist/core/plugin-detector.d.ts +1 -0
  65. package/dist/core/plugin-detector.d.ts.map +1 -1
  66. package/dist/core/plugin-detector.js +25 -0
  67. package/dist/core/plugin-detector.js.map +1 -1
  68. package/dist/core/qa/qa-runner.d.ts +16 -0
  69. package/dist/core/qa/qa-runner.d.ts.map +1 -0
  70. package/dist/core/qa/qa-runner.js +404 -0
  71. package/dist/core/qa/qa-runner.js.map +1 -0
  72. package/dist/core/qa/quality-gate-decider.d.ts +53 -0
  73. package/dist/core/qa/quality-gate-decider.d.ts.map +1 -0
  74. package/dist/core/qa/quality-gate-decider.js +268 -0
  75. package/dist/core/qa/quality-gate-decider.js.map +1 -0
  76. package/dist/core/qa/risk-calculator.d.ts +126 -0
  77. package/dist/core/qa/risk-calculator.d.ts.map +1 -0
  78. package/dist/core/qa/risk-calculator.js +247 -0
  79. package/dist/core/qa/risk-calculator.js.map +1 -0
  80. package/dist/core/qa/types.d.ts +315 -0
  81. package/dist/core/qa/types.d.ts.map +1 -0
  82. package/dist/core/qa/types.js +8 -0
  83. package/dist/core/qa/types.js.map +1 -0
  84. package/dist/core/types/config.d.ts +35 -0
  85. package/dist/core/types/config.d.ts.map +1 -1
  86. package/dist/core/types/config.js +16 -0
  87. package/dist/core/types/config.js.map +1 -1
  88. package/dist/core/types/increment-metadata.d.ts +120 -0
  89. package/dist/core/types/increment-metadata.d.ts.map +1 -0
  90. package/dist/core/types/increment-metadata.js +138 -0
  91. package/dist/core/types/increment-metadata.js.map +1 -0
  92. package/dist/hooks/lib/invoke-translator-skill.d.ts +60 -0
  93. package/dist/hooks/lib/invoke-translator-skill.d.ts.map +1 -0
  94. package/dist/hooks/lib/invoke-translator-skill.js +201 -0
  95. package/dist/hooks/lib/invoke-translator-skill.js.map +1 -0
  96. package/dist/hooks/lib/translate-file.d.ts +59 -0
  97. package/dist/hooks/lib/translate-file.d.ts.map +1 -0
  98. package/dist/hooks/lib/translate-file.js +350 -0
  99. package/dist/hooks/lib/translate-file.js.map +1 -0
  100. package/dist/locales/en/cli.json +3 -1
  101. package/dist/metrics/calculators/change-failure-rate.d.ts +22 -0
  102. package/dist/metrics/calculators/change-failure-rate.d.ts.map +1 -0
  103. package/dist/metrics/calculators/change-failure-rate.js +70 -0
  104. package/dist/metrics/calculators/change-failure-rate.js.map +1 -0
  105. package/dist/metrics/calculators/deployment-frequency.d.ts +20 -0
  106. package/dist/metrics/calculators/deployment-frequency.d.ts.map +1 -0
  107. package/dist/metrics/calculators/deployment-frequency.js +61 -0
  108. package/dist/metrics/calculators/deployment-frequency.js.map +1 -0
  109. package/dist/metrics/calculators/lead-time.d.ts +22 -0
  110. package/dist/metrics/calculators/lead-time.d.ts.map +1 -0
  111. package/dist/metrics/calculators/lead-time.js +82 -0
  112. package/dist/metrics/calculators/lead-time.js.map +1 -0
  113. package/dist/metrics/calculators/mttr.d.ts +21 -0
  114. package/dist/metrics/calculators/mttr.d.ts.map +1 -0
  115. package/dist/metrics/calculators/mttr.js +60 -0
  116. package/dist/metrics/calculators/mttr.js.map +1 -0
  117. package/dist/metrics/dora-calculator.d.ts +24 -0
  118. package/dist/metrics/dora-calculator.d.ts.map +1 -0
  119. package/dist/metrics/dora-calculator.js +104 -0
  120. package/dist/metrics/dora-calculator.js.map +1 -0
  121. package/dist/metrics/github-client.d.ts +51 -0
  122. package/dist/metrics/github-client.d.ts.map +1 -0
  123. package/dist/metrics/github-client.js +133 -0
  124. package/dist/metrics/github-client.js.map +1 -0
  125. package/dist/metrics/types.d.ts +112 -0
  126. package/dist/metrics/types.d.ts.map +1 -0
  127. package/dist/metrics/types.js +10 -0
  128. package/dist/metrics/types.js.map +1 -0
  129. package/dist/metrics/utils/percentile.d.ts +25 -0
  130. package/dist/metrics/utils/percentile.d.ts.map +1 -0
  131. package/dist/metrics/utils/percentile.js +46 -0
  132. package/dist/metrics/utils/percentile.js.map +1 -0
  133. package/dist/metrics/utils/tier-classifier.d.ts +61 -0
  134. package/dist/metrics/utils/tier-classifier.d.ts.map +1 -0
  135. package/dist/metrics/utils/tier-classifier.js +100 -0
  136. package/dist/metrics/utils/tier-classifier.js.map +1 -0
  137. package/dist/utils/auth-helpers.d.ts +58 -0
  138. package/dist/utils/auth-helpers.d.ts.map +1 -0
  139. package/dist/utils/auth-helpers.js +108 -0
  140. package/dist/utils/auth-helpers.js.map +1 -0
  141. package/dist/utils/env-file.d.ts +88 -0
  142. package/dist/utils/env-file.d.ts.map +1 -0
  143. package/dist/utils/env-file.js +180 -0
  144. package/dist/utils/env-file.js.map +1 -0
  145. package/dist/utils/plugin-detection.d.ts +50 -0
  146. package/dist/utils/plugin-detection.d.ts.map +1 -0
  147. package/dist/utils/plugin-detection.js +229 -0
  148. package/dist/utils/plugin-detection.js.map +1 -0
  149. package/dist/utils/secrets-loader.d.ts +88 -0
  150. package/dist/utils/secrets-loader.d.ts.map +1 -0
  151. package/dist/utils/secrets-loader.js +271 -0
  152. package/dist/utils/secrets-loader.js.map +1 -0
  153. package/dist/utils/translation.d.ts +187 -0
  154. package/dist/utils/translation.d.ts.map +1 -0
  155. package/dist/utils/translation.js +414 -0
  156. package/dist/utils/translation.js.map +1 -0
  157. package/package.json +28 -44
  158. package/plugins/specweave/.claude-plugin/plugin.json +3 -3
  159. package/plugins/specweave/agents/pm/AGENT.md +330 -54
  160. package/plugins/specweave/agents/test-aware-planner/AGENT.md +1035 -0
  161. package/plugins/specweave/agents/test-aware-planner/templates/README.md +118 -0
  162. package/plugins/specweave/agents/test-aware-planner/templates/task-non-testable.md.template +24 -0
  163. package/plugins/specweave/agents/test-aware-planner/templates/task-testable.md.template +53 -0
  164. package/plugins/specweave/agents/test-aware-planner/templates/tasks-frontmatter.md.template +11 -0
  165. package/plugins/specweave/commands/README.md +88 -163
  166. package/plugins/specweave/commands/specweave-abandon.md +314 -0
  167. package/plugins/specweave/commands/specweave-check-tests.md +546 -0
  168. package/plugins/specweave/commands/{do.md → specweave-do.md} +5 -7
  169. package/plugins/specweave/commands/{increment.md → specweave-increment.md} +231 -4
  170. package/plugins/specweave/commands/specweave-pause.md +189 -0
  171. package/plugins/specweave/commands/specweave-qa.md +245 -0
  172. package/plugins/specweave/commands/specweave-resume.md +216 -0
  173. package/plugins/specweave/commands/specweave-status.md +397 -0
  174. package/plugins/specweave/commands/specweave-sync-tasks.md +256 -0
  175. package/plugins/specweave/commands/{translate.md → specweave-translate.md} +3 -3
  176. package/plugins/specweave/commands/specweave-update-scope.md +351 -0
  177. package/plugins/specweave/commands/specweave.md +21 -21
  178. package/plugins/specweave/hooks/post-increment-planning.sh +335 -0
  179. package/plugins/specweave/hooks/post-task-completion.sh +141 -0
  180. package/plugins/specweave/skills/SKILLS-INDEX.md +1 -1
  181. package/plugins/specweave/skills/brownfield-analyzer/SKILL.md +9 -9
  182. package/plugins/specweave/skills/increment-planner/SKILL.md +400 -212
  183. package/plugins/specweave/skills/increment-quality-judge-v2/SKILL.md +499 -0
  184. package/plugins/specweave/skills/plugin-detector/SKILL.md +114 -1
  185. package/plugins/specweave/skills/project-kickstarter/SKILL.md +74 -1
  186. package/plugins/specweave/skills/{rfc-generator → spec-generator}/SKILL.md +22 -29
  187. package/plugins/specweave/skills/specweave-detector/SKILL.md +3 -3
  188. package/plugins/specweave/skills/specweave-framework/SKILL.md +2 -2
  189. package/plugins/specweave-ado/.claude-plugin/plugin.json +18 -4
  190. package/plugins/specweave-ado/agents/ado-manager/AGENT.md +426 -0
  191. package/plugins/specweave-ado/commands/close-workitem.md +52 -0
  192. package/plugins/specweave-ado/commands/create-workitem.md +53 -0
  193. package/plugins/specweave-ado/commands/status.md +53 -0
  194. package/plugins/specweave-ado/commands/sync.md +55 -0
  195. package/plugins/specweave-ado/lib/ado-client.ts +361 -0
  196. package/plugins/specweave-ado/reference/ado-specweave-mapping.md +552 -0
  197. package/plugins/specweave-ado/skills/ado-sync/SKILL.md +344 -193
  198. package/plugins/specweave-docs/skills/docusaurus/SKILL.md +73 -0
  199. package/plugins/specweave-github/agents/github-manager/AGENT.md +49 -0
  200. package/plugins/specweave-github/commands/{github-close-issue.md → close-issue.md} +1 -1
  201. package/plugins/specweave-github/commands/{github-create-issue.md → create-issue.md} +1 -1
  202. package/plugins/specweave-github/commands/{github-status.md → status.md} +1 -1
  203. package/plugins/specweave-github/commands/{github-sync-tasks.md → sync-tasks.md} +1 -1
  204. package/plugins/specweave-github/commands/{github-sync.md → sync.md} +1 -1
  205. package/plugins/specweave-github/reference/github-specweave-mapping.md +377 -0
  206. package/plugins/specweave-github/skills/github-sync/SKILL.md +11 -3
  207. package/plugins/specweave-infrastructure/commands/{specweave.monitor-setup.md → monitor-setup.md} +5 -0
  208. package/plugins/specweave-infrastructure/commands/{specweave.slo-implement.md → slo-implement.md} +5 -0
  209. package/plugins/specweave-jira/agents/jira-manager/AGENT.md +380 -0
  210. package/plugins/specweave-jira/commands/{specweave.sync-jira.md → sync.md} +1 -1
  211. package/plugins/specweave-jira/reference/jira-specweave-mapping.md +508 -0
  212. package/plugins/specweave-ml/commands/ml-deploy.md +1 -1
  213. package/plugins/specweave-ml/commands/ml-evaluate.md +1 -1
  214. package/plugins/specweave-ml/commands/ml-explain.md +1 -1
  215. package/plugins/specweave-ml/commands/{specweave.ml-pipeline.md → ml-pipeline.md} +5 -0
  216. package/src/templates/AGENTS.md.template +331 -31
  217. package/src/templates/CLAUDE.md.template +36 -21
  218. package/src/templates/COMPLETION-REPORT.template.md +128 -0
  219. package/src/templates/README.md.template +17 -16
  220. package/src/templates/docs/README.md +11 -9
  221. package/src/templates/docs/spec-template.md +229 -0
  222. package/plugins/specweave/commands/inc.md +0 -85
  223. package/plugins/specweave/commands/list-increments.md +0 -180
  224. package/src/adapters/README.md +0 -275
  225. package/src/adapters/adapter-base.ts +0 -182
  226. package/src/adapters/adapter-interface.ts +0 -166
  227. package/src/adapters/adapter-loader.ts +0 -256
  228. package/src/adapters/agents-md-generator.ts +0 -228
  229. package/src/adapters/claude/README.md +0 -233
  230. package/src/adapters/claude/adapter.ts +0 -468
  231. package/src/adapters/claude-md-generator.ts +0 -377
  232. package/src/adapters/codex/README.md +0 -105
  233. package/src/adapters/codex/adapter.ts +0 -333
  234. package/src/adapters/cursor/.cursor/context/docs-context.md +0 -62
  235. package/src/adapters/cursor/.cursor/context/increments-context.md +0 -71
  236. package/src/adapters/cursor/.cursor/context/strategy-context.md +0 -73
  237. package/src/adapters/cursor/.cursor/context/tests-context.md +0 -89
  238. package/src/adapters/cursor/README.md +0 -283
  239. package/src/adapters/cursor/adapter.ts +0 -451
  240. package/src/adapters/doc-generator.ts +0 -331
  241. package/src/adapters/gemini/README.md +0 -97
  242. package/src/adapters/gemini/adapter.ts +0 -298
  243. package/src/adapters/generic/README.md +0 -277
  244. package/src/adapters/generic/adapter.ts +0 -378
  245. package/src/adapters/registry.yaml +0 -187
  246. /package/plugins/specweave/commands/{costs.md → specweave-costs.md} +0 -0
  247. /package/plugins/specweave/commands/{done.md → specweave-done.md} +0 -0
  248. /package/plugins/specweave/commands/{next.md → specweave-next.md} +0 -0
  249. /package/plugins/specweave/commands/{progress.md → specweave-progress.md} +0 -0
  250. /package/plugins/specweave/commands/{sync-docs.md → specweave-sync-docs.md} +0 -0
  251. /package/plugins/specweave/commands/{tdd-cycle.md → specweave-tdd-cycle.md} +0 -0
  252. /package/plugins/specweave/commands/{tdd-green.md → specweave-tdd-green.md} +0 -0
  253. /package/plugins/specweave/commands/{tdd-red.md → specweave-tdd-red.md} +0 -0
  254. /package/plugins/specweave/commands/{tdd-refactor.md → specweave-tdd-refactor.md} +0 -0
  255. /package/plugins/specweave/commands/{validate.md → specweave-validate.md} +0 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Increment Metadata Types
3
+ *
4
+ * Defines the schema for increment metadata tracking (status, type, timestamps).
5
+ * Part of increment 0007: Smart Status Management
6
+ */
7
+ /**
8
+ * Increment status enum
9
+ * Tracks the lifecycle state of an increment
10
+ */
11
+ export var IncrementStatus;
12
+ (function (IncrementStatus) {
13
+ /** Currently being worked on */
14
+ IncrementStatus["ACTIVE"] = "active";
15
+ /** Temporarily stopped (blocked by external dependency, deprioritized) */
16
+ IncrementStatus["PAUSED"] = "paused";
17
+ /** All tasks complete, increment finished */
18
+ IncrementStatus["COMPLETED"] = "completed";
19
+ /** Work abandoned (requirements changed, obsolete, etc.) */
20
+ IncrementStatus["ABANDONED"] = "abandoned";
21
+ })(IncrementStatus || (IncrementStatus = {}));
22
+ /**
23
+ * Increment type enum
24
+ * Determines rules and limits applied to the increment
25
+ */
26
+ export var IncrementType;
27
+ (function (IncrementType) {
28
+ /** Critical production fix (bypasses all limits) */
29
+ IncrementType["HOTFIX"] = "hotfix";
30
+ /** Standard feature development (limit: 2 active) */
31
+ IncrementType["FEATURE"] = "feature";
32
+ /** Production bug fix with SRE investigation (unlimited, urgent) */
33
+ IncrementType["BUG"] = "bug";
34
+ /** Change request from stakeholders (limit: 2 active) */
35
+ IncrementType["CHANGE_REQUEST"] = "change-request";
36
+ /** Code improvement (limit: 1 active) */
37
+ IncrementType["REFACTOR"] = "refactor";
38
+ /** POC/spike work (unlimited, auto-abandon after 14 days) */
39
+ IncrementType["EXPERIMENT"] = "experiment";
40
+ })(IncrementType || (IncrementType = {}));
41
+ /**
42
+ * Valid status transitions
43
+ * Enforces increment lifecycle rules
44
+ */
45
+ export const VALID_TRANSITIONS = {
46
+ [IncrementStatus.ACTIVE]: [
47
+ IncrementStatus.PAUSED,
48
+ IncrementStatus.COMPLETED,
49
+ IncrementStatus.ABANDONED
50
+ ],
51
+ [IncrementStatus.PAUSED]: [
52
+ IncrementStatus.ACTIVE,
53
+ IncrementStatus.ABANDONED
54
+ ],
55
+ [IncrementStatus.COMPLETED]: [
56
+ // Completed is terminal (cannot transition out)
57
+ ],
58
+ [IncrementStatus.ABANDONED]: [
59
+ IncrementStatus.ACTIVE // Can un-abandon if needed (rare)
60
+ ]
61
+ };
62
+ /**
63
+ * Type-based limits
64
+ * Maximum active increments per type
65
+ *
66
+ * null = unlimited (no limit enforcement)
67
+ * User can configure per-project in .specweave/config.json
68
+ */
69
+ export const TYPE_LIMITS = {
70
+ [IncrementType.HOTFIX]: null, // Unlimited (emergency work)
71
+ [IncrementType.FEATURE]: 2, // Max 2 active (context switching cost)
72
+ [IncrementType.BUG]: null, // Unlimited (production issues)
73
+ [IncrementType.CHANGE_REQUEST]: 2, // Max 2 active (stakeholder-driven)
74
+ [IncrementType.REFACTOR]: 1, // Max 1 active (needs focus)
75
+ [IncrementType.EXPERIMENT]: null // Unlimited (exploratory work)
76
+ };
77
+ /**
78
+ * Staleness thresholds (days)
79
+ * When to warn about stale increments
80
+ */
81
+ export const STALENESS_THRESHOLDS = {
82
+ /** Warn if paused for more than this many days */
83
+ PAUSED: 7,
84
+ /** Warn if active for more than this many days */
85
+ ACTIVE: 30,
86
+ /** Auto-abandon experiments after this many days */
87
+ EXPERIMENT: 14
88
+ };
89
+ /**
90
+ * Default metadata for new increments
91
+ */
92
+ export function createDefaultMetadata(id, type = IncrementType.FEATURE) {
93
+ const now = new Date().toISOString();
94
+ return {
95
+ id,
96
+ status: IncrementStatus.ACTIVE,
97
+ type,
98
+ created: now,
99
+ lastActivity: now
100
+ };
101
+ }
102
+ /**
103
+ * Check if status transition is valid
104
+ */
105
+ export function isValidTransition(from, to) {
106
+ const allowedTransitions = VALID_TRANSITIONS[from];
107
+ return allowedTransitions.includes(to);
108
+ }
109
+ /**
110
+ * Check if increment is stale (paused too long or active too long)
111
+ */
112
+ export function isStale(metadata) {
113
+ const now = new Date();
114
+ if (metadata.status === IncrementStatus.PAUSED && metadata.pausedAt) {
115
+ const pausedDate = new Date(metadata.pausedAt);
116
+ const daysPaused = (now.getTime() - pausedDate.getTime()) / (1000 * 60 * 60 * 24);
117
+ return daysPaused > STALENESS_THRESHOLDS.PAUSED;
118
+ }
119
+ if (metadata.status === IncrementStatus.ACTIVE) {
120
+ const createdDate = new Date(metadata.created);
121
+ const daysActive = (now.getTime() - createdDate.getTime()) / (1000 * 60 * 60 * 24);
122
+ return daysActive > STALENESS_THRESHOLDS.ACTIVE;
123
+ }
124
+ return false;
125
+ }
126
+ /**
127
+ * Check if increment should be auto-abandoned (experiments only)
128
+ */
129
+ export function shouldAutoAbandon(metadata) {
130
+ if (metadata.type !== IncrementType.EXPERIMENT) {
131
+ return false;
132
+ }
133
+ const now = new Date();
134
+ const lastActivityDate = new Date(metadata.lastActivity);
135
+ const daysSinceActivity = (now.getTime() - lastActivityDate.getTime()) / (1000 * 60 * 60 * 24);
136
+ return daysSinceActivity > STALENESS_THRESHOLDS.EXPERIMENT;
137
+ }
138
+ //# sourceMappingURL=increment-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"increment-metadata.js","sourceRoot":"","sources":["../../../src/core/types/increment-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Translator Skill Invocation Utility
3
+ *
4
+ * Provides programmatic invocation of the translator skill for automated translation.
5
+ * Used by hooks and CLI scripts to translate content without manual intervention.
6
+ *
7
+ * @see plugins/specweave/skills/translator/SKILL.md
8
+ * @see plugins/specweave/commands/translate.md
9
+ */
10
+ import { type SupportedLanguage } from '../../utils/translation.js';
11
+ /**
12
+ * Translation result
13
+ */
14
+ export interface TranslationResult {
15
+ success: boolean;
16
+ sourceLanguage: SupportedLanguage;
17
+ targetLanguage: SupportedLanguage;
18
+ originalContent: string;
19
+ translatedContent?: string;
20
+ error?: string;
21
+ }
22
+ /**
23
+ * Invokes translator skill to translate content
24
+ *
25
+ * This function integrates with the translator skill by:
26
+ * 1. Preparing translation prompt
27
+ * 2. Writing prompt to a temp file
28
+ * 3. Outputting instructions for Claude to process
29
+ * 4. Returning the translated content
30
+ *
31
+ * In an automated context (hooks), this provides clear instructions.
32
+ * In an interactive context, the translator skill can auto-activate.
33
+ *
34
+ * @param content - Content to translate
35
+ * @param sourceLang - Source language
36
+ * @param targetLang - Target language
37
+ * @returns Translation result
38
+ */
39
+ export declare function invokeTranslatorSkill(content: string, sourceLang: SupportedLanguage, targetLang?: SupportedLanguage): Promise<TranslationResult>;
40
+ /**
41
+ * Translate a file using translator skill
42
+ *
43
+ * @param filePath - Path to file to translate
44
+ * @param targetLang - Target language
45
+ * @returns Translation result
46
+ */
47
+ export declare function translateFile(filePath: string, targetLang?: SupportedLanguage): Promise<TranslationResult & {
48
+ filePath: string;
49
+ }>;
50
+ /**
51
+ * Batch translate multiple files
52
+ *
53
+ * @param filePaths - Array of file paths
54
+ * @param targetLang - Target language
55
+ * @returns Array of translation results
56
+ */
57
+ export declare function batchTranslateFiles(filePaths: string[], targetLang?: SupportedLanguage): Promise<Array<TranslationResult & {
58
+ filePath: string;
59
+ }>>;
60
+ //# sourceMappingURL=invoke-translator-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke-translator-skill.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/invoke-translator-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,iBAAiB,CAAC;IAClC,cAAc,EAAE,iBAAiB,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,iBAAiB,EAC7B,UAAU,GAAE,iBAAwB,GACnC,OAAO,CAAC,iBAAiB,CAAC,CA2B5B;AAgGD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,iBAAwB,GACnC,OAAO,CAAC,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqCnD;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,GAAE,iBAAwB,GACnC,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA4B1D"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Translator Skill Invocation Utility
3
+ *
4
+ * Provides programmatic invocation of the translator skill for automated translation.
5
+ * Used by hooks and CLI scripts to translate content without manual intervention.
6
+ *
7
+ * @see plugins/specweave/skills/translator/SKILL.md
8
+ * @see plugins/specweave/commands/translate.md
9
+ */
10
+ import fs from 'fs-extra';
11
+ import { detectLanguage, prepareTranslation, postProcessTranslation, getLanguageName, } from '../../utils/translation.js';
12
+ /**
13
+ * Invokes translator skill to translate content
14
+ *
15
+ * This function integrates with the translator skill by:
16
+ * 1. Preparing translation prompt
17
+ * 2. Writing prompt to a temp file
18
+ * 3. Outputting instructions for Claude to process
19
+ * 4. Returning the translated content
20
+ *
21
+ * In an automated context (hooks), this provides clear instructions.
22
+ * In an interactive context, the translator skill can auto-activate.
23
+ *
24
+ * @param content - Content to translate
25
+ * @param sourceLang - Source language
26
+ * @param targetLang - Target language
27
+ * @returns Translation result
28
+ */
29
+ export async function invokeTranslatorSkill(content, sourceLang, targetLang = 'en') {
30
+ try {
31
+ // Prepare translation
32
+ const prepared = prepareTranslation(content, sourceLang, targetLang);
33
+ // For now, we use a practical approach:
34
+ // Output the translation request clearly so it can be processed
35
+ const result = {
36
+ success: true,
37
+ sourceLanguage: sourceLang,
38
+ targetLanguage: targetLang,
39
+ originalContent: content,
40
+ translatedContent: await performTranslation(prepared.prompt, prepared.preserved),
41
+ };
42
+ return result;
43
+ }
44
+ catch (error) {
45
+ const errorMessage = error instanceof Error ? error.message : String(error);
46
+ return {
47
+ success: false,
48
+ sourceLanguage: sourceLang,
49
+ targetLanguage: targetLang,
50
+ originalContent: content,
51
+ error: errorMessage,
52
+ };
53
+ }
54
+ }
55
+ /**
56
+ * Performs the actual translation using Anthropic API
57
+ *
58
+ * PRODUCTION IMPLEMENTATION:
59
+ * 1. Checks for ANTHROPIC_API_KEY in environment
60
+ * 2. If available: Uses Anthropic API directly (fully automatic)
61
+ * 3. If not available: Provides clear instructions for manual translation
62
+ *
63
+ * @param prompt - Translation prompt
64
+ * @param preserved - Preserved content structure
65
+ * @returns Translated content
66
+ */
67
+ async function performTranslation(prompt, preserved) {
68
+ // Extract content for processing
69
+ const contentMatch = prompt.match(/SOURCE DOCUMENT[^\n]*:\n---\n([\s\S]*?)\n---/);
70
+ const contentToTranslate = contentMatch ? contentMatch[1] : '';
71
+ // Check if ANTHROPIC_API_KEY is available
72
+ const apiKey = process.env.ANTHROPIC_API_KEY;
73
+ if (apiKey) {
74
+ // Fully automatic translation using Anthropic API
75
+ console.log(`\n🤖 Translating via Anthropic API (Haiku model)...`);
76
+ try {
77
+ // Dynamic import of Anthropic SDK (allows graceful fallback if not installed)
78
+ const Anthropic = await import('@anthropic-ai/sdk').then(m => m.default);
79
+ const anthropic = new Anthropic({
80
+ apiKey,
81
+ });
82
+ const message = await anthropic.messages.create({
83
+ model: 'claude-3-haiku-20240307',
84
+ max_tokens: 8000,
85
+ messages: [
86
+ {
87
+ role: 'user',
88
+ content: prompt,
89
+ },
90
+ ],
91
+ });
92
+ // Extract translated content from response
93
+ const translatedContent = message.content[0].type === 'text'
94
+ ? message.content[0].text
95
+ : contentToTranslate;
96
+ console.log(`✅ Translation complete via API`);
97
+ console.log(` Input tokens: ${message.usage.input_tokens}`);
98
+ console.log(` Output tokens: ${message.usage.output_tokens}`);
99
+ console.log(` Cost: ~$${((message.usage.input_tokens * 0.25 + message.usage.output_tokens * 1.25) / 1000000).toFixed(4)}\n`);
100
+ return postProcessTranslation(translatedContent, preserved);
101
+ }
102
+ catch (error) {
103
+ console.error(`\n❌ API translation failed: ${error.message}`);
104
+ console.error(` Falling back to manual translation instructions\n`);
105
+ // Fall through to manual instructions
106
+ }
107
+ }
108
+ // Fallback: Manual translation instructions
109
+ const isInteractive = process.env.CLAUDE_CODE_SESSION === 'true';
110
+ if (isInteractive) {
111
+ // In Claude Code environment, output translation request
112
+ console.log('\n' + '='.repeat(80));
113
+ console.log('🌐 TRANSLATION REQUEST (translator skill will auto-activate)');
114
+ console.log('='.repeat(80));
115
+ console.log(prompt);
116
+ console.log('='.repeat(80));
117
+ console.log('💡 Tip: Set ANTHROPIC_API_KEY for fully automatic translation\n');
118
+ return postProcessTranslation(`<!-- ⚠️ TRANSLATION REQUESTED - Awaiting translator skill activation -->\n\n${contentToTranslate}`, preserved);
119
+ }
120
+ else {
121
+ // Non-interactive environment - provide clear instructions
122
+ console.error('\n⚠️ AUTO-TRANSLATION REQUIRES ONE OF:');
123
+ console.error(' Option A (Recommended): Set ANTHROPIC_API_KEY environment variable');
124
+ console.error(' Option B: Run /specweave:translate <file-path>');
125
+ console.error(' Option C: Manually translate the content\n');
126
+ return postProcessTranslation(`<!-- ⚠️ AUTO-TRANSLATION PENDING -->\n<!-- Set ANTHROPIC_API_KEY for automatic translation -->\n<!-- Or run: /specweave:translate to complete -->\n<!-- Original content below -->\n\n${contentToTranslate}`, preserved);
127
+ }
128
+ }
129
+ /**
130
+ * Translate a file using translator skill
131
+ *
132
+ * @param filePath - Path to file to translate
133
+ * @param targetLang - Target language
134
+ * @returns Translation result
135
+ */
136
+ export async function translateFile(filePath, targetLang = 'en') {
137
+ // Read file
138
+ if (!await fs.pathExists(filePath)) {
139
+ throw new Error(`File not found: ${filePath}`);
140
+ }
141
+ const content = await fs.readFile(filePath, 'utf-8');
142
+ // Detect source language
143
+ const detection = detectLanguage(content);
144
+ const sourceLang = detection.language;
145
+ // Check if already in target language
146
+ if (sourceLang === targetLang) {
147
+ return {
148
+ success: true,
149
+ filePath,
150
+ sourceLanguage: sourceLang,
151
+ targetLanguage: targetLang,
152
+ originalContent: content,
153
+ translatedContent: content,
154
+ };
155
+ }
156
+ // Translate
157
+ const result = await invokeTranslatorSkill(content, sourceLang, targetLang);
158
+ // Write back if successful
159
+ if (result.success && result.translatedContent) {
160
+ await fs.writeFile(filePath, result.translatedContent, 'utf-8');
161
+ console.log(`✅ Translated: ${filePath} (${getLanguageName(sourceLang)} → ${getLanguageName(targetLang)})`);
162
+ }
163
+ return {
164
+ ...result,
165
+ filePath,
166
+ };
167
+ }
168
+ /**
169
+ * Batch translate multiple files
170
+ *
171
+ * @param filePaths - Array of file paths
172
+ * @param targetLang - Target language
173
+ * @returns Array of translation results
174
+ */
175
+ export async function batchTranslateFiles(filePaths, targetLang = 'en') {
176
+ const results = [];
177
+ console.log(`\n🌐 Batch translating ${filePaths.length} file(s) to ${getLanguageName(targetLang)}...\n`);
178
+ for (const filePath of filePaths) {
179
+ try {
180
+ const result = await translateFile(filePath, targetLang);
181
+ results.push(result);
182
+ }
183
+ catch (error) {
184
+ const errorMessage = error instanceof Error ? error.message : String(error);
185
+ console.error(`❌ Failed to translate ${filePath}: ${errorMessage}`);
186
+ results.push({
187
+ success: false,
188
+ filePath,
189
+ sourceLanguage: 'unknown',
190
+ targetLanguage: targetLang,
191
+ originalContent: '',
192
+ error: errorMessage,
193
+ });
194
+ }
195
+ }
196
+ // Summary
197
+ const successful = results.filter(r => r.success).length;
198
+ console.log(`\n📊 Batch translation complete: ${successful}/${filePaths.length} files translated\n`);
199
+ return results;
200
+ }
201
+ //# sourceMappingURL=invoke-translator-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke-translator-skill.js","sourceRoot":"","sources":["../../../src/hooks/lib/invoke-translator-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * File Translation CLI Utility
3
+ *
4
+ * Translates a single file from detected source language to target language
5
+ * using the translation utilities and LLM invocation.
6
+ *
7
+ * This script is called from:
8
+ * - Post-increment-planning hook (auto-translate spec.md, plan.md, tasks.md)
9
+ * - Post-task-completion hook (auto-translate living docs)
10
+ * - Manual /specweave:translate command
11
+ *
12
+ * Usage:
13
+ * node translate-file.js <file-path> [--target-lang en] [--preview]
14
+ *
15
+ * @see src/utils/translation.ts
16
+ * @see .specweave/increments/0006-llm-native-i18n/reports/DESIGN-POST-GENERATION-TRANSLATION.md
17
+ */
18
+ import { type SupportedLanguage } from '../../utils/translation.js';
19
+ /**
20
+ * CLI options
21
+ */
22
+ interface CLIOptions {
23
+ filePath: string;
24
+ targetLang: SupportedLanguage;
25
+ preview: boolean;
26
+ verbose: boolean;
27
+ }
28
+ /**
29
+ * Translation result
30
+ */
31
+ interface FileTranslationResult {
32
+ success: boolean;
33
+ filePath: string;
34
+ sourceLanguage: SupportedLanguage;
35
+ targetLanguage: SupportedLanguage;
36
+ warnings: string[];
37
+ cost: number;
38
+ tokensUsed: number;
39
+ preview?: string;
40
+ }
41
+ /**
42
+ * Main translation function
43
+ *
44
+ * @param options - CLI options
45
+ * @returns Translation result
46
+ */
47
+ export declare function translateFile(options: CLIOptions): Promise<FileTranslationResult>;
48
+ /**
49
+ * Batch translate multiple files
50
+ *
51
+ * @param filePaths - Array of file paths to translate
52
+ * @param targetLang - Target language
53
+ * @param preview - Preview mode
54
+ * @param verbose - Verbose output
55
+ * @returns Array of translation results
56
+ */
57
+ export declare function batchTranslateFiles(filePaths: string[], targetLang?: SupportedLanguage, preview?: boolean, verbose?: boolean): Promise<FileTranslationResult[]>;
58
+ export {};
59
+ //# sourceMappingURL=translate-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate-file.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/translate-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,iBAAiB,CAAC;IAClC,cAAc,EAAE,iBAAiB,CAAC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAqHvF;AAyGD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,GAAE,iBAAwB,EACpC,OAAO,GAAE,OAAe,EACxB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA6ClC"}