specweave 0.6.8 → 0.7.1
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-plugin/README.md +1 -1
- package/CLAUDE.md +903 -99
- package/README.md +143 -207
- package/bin/specweave.js +67 -0
- package/dist/cli/commands/abandon.d.ts +13 -0
- package/dist/cli/commands/abandon.d.ts.map +1 -0
- package/dist/cli/commands/abandon.js +15 -0
- package/dist/cli/commands/abandon.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +94 -18
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/pause.d.ts +13 -0
- package/dist/cli/commands/pause.d.ts.map +1 -0
- package/dist/cli/commands/pause.js +15 -0
- package/dist/cli/commands/pause.js.map +1 -0
- package/dist/cli/commands/qa.d.ts +54 -0
- package/dist/cli/commands/qa.d.ts.map +1 -0
- package/dist/cli/commands/qa.js +98 -0
- package/dist/cli/commands/qa.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +12 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +14 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +23 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/ado.d.ts +57 -0
- package/dist/cli/helpers/issue-tracker/ado.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/ado.js +223 -0
- package/dist/cli/helpers/issue-tracker/ado.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/github.d.ts +65 -0
- package/dist/cli/helpers/issue-tracker/github.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/github.js +284 -0
- package/dist/cli/helpers/issue-tracker/github.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/index.d.ts +22 -0
- package/dist/cli/helpers/issue-tracker/index.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/index.js +270 -0
- package/dist/cli/helpers/issue-tracker/index.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/jira.d.ts +61 -0
- package/dist/cli/helpers/issue-tracker/jira.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/jira.js +265 -0
- package/dist/cli/helpers/issue-tracker/jira.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/types.d.ts +86 -0
- package/dist/cli/helpers/issue-tracker/types.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/types.js +16 -0
- package/dist/cli/helpers/issue-tracker/types.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/utils.d.ts +103 -0
- package/dist/cli/helpers/issue-tracker/utils.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/utils.js +240 -0
- package/dist/cli/helpers/issue-tracker/utils.js.map +1 -0
- package/dist/core/increment/limits.d.ts +68 -0
- package/dist/core/increment/limits.d.ts.map +1 -0
- package/dist/core/increment/limits.js +224 -0
- package/dist/core/increment/limits.js.map +1 -0
- package/dist/core/increment/metadata-manager.d.ts +114 -0
- package/dist/core/increment/metadata-manager.d.ts.map +1 -0
- package/dist/core/increment/metadata-manager.js +320 -0
- package/dist/core/increment/metadata-manager.js.map +1 -0
- package/dist/core/increment/status-commands.d.ts +43 -0
- package/dist/core/increment/status-commands.d.ts.map +1 -0
- package/dist/core/increment/status-commands.js +277 -0
- package/dist/core/increment/status-commands.js.map +1 -0
- package/dist/core/plugin-detector.d.ts +1 -0
- package/dist/core/plugin-detector.d.ts.map +1 -1
- package/dist/core/plugin-detector.js +25 -0
- package/dist/core/plugin-detector.js.map +1 -1
- package/dist/core/qa/qa-runner.d.ts +16 -0
- package/dist/core/qa/qa-runner.d.ts.map +1 -0
- package/dist/core/qa/qa-runner.js +404 -0
- package/dist/core/qa/qa-runner.js.map +1 -0
- package/dist/core/qa/quality-gate-decider.d.ts +53 -0
- package/dist/core/qa/quality-gate-decider.d.ts.map +1 -0
- package/dist/core/qa/quality-gate-decider.js +268 -0
- package/dist/core/qa/quality-gate-decider.js.map +1 -0
- package/dist/core/qa/risk-calculator.d.ts +126 -0
- package/dist/core/qa/risk-calculator.d.ts.map +1 -0
- package/dist/core/qa/risk-calculator.js +247 -0
- package/dist/core/qa/risk-calculator.js.map +1 -0
- package/dist/core/qa/types.d.ts +315 -0
- package/dist/core/qa/types.d.ts.map +1 -0
- package/dist/core/qa/types.js +8 -0
- package/dist/core/qa/types.js.map +1 -0
- package/dist/core/types/config.d.ts +35 -0
- package/dist/core/types/config.d.ts.map +1 -1
- package/dist/core/types/config.js +16 -0
- package/dist/core/types/config.js.map +1 -1
- package/dist/core/types/increment-metadata.d.ts +120 -0
- package/dist/core/types/increment-metadata.d.ts.map +1 -0
- package/dist/core/types/increment-metadata.js +138 -0
- package/dist/core/types/increment-metadata.js.map +1 -0
- package/dist/hooks/lib/invoke-translator-skill.d.ts +60 -0
- package/dist/hooks/lib/invoke-translator-skill.d.ts.map +1 -0
- package/dist/hooks/lib/invoke-translator-skill.js +201 -0
- package/dist/hooks/lib/invoke-translator-skill.js.map +1 -0
- package/dist/hooks/lib/translate-file.d.ts +59 -0
- package/dist/hooks/lib/translate-file.d.ts.map +1 -0
- package/dist/hooks/lib/translate-file.js +350 -0
- package/dist/hooks/lib/translate-file.js.map +1 -0
- package/dist/locales/en/cli.json +3 -1
- package/dist/metrics/calculators/change-failure-rate.d.ts +22 -0
- package/dist/metrics/calculators/change-failure-rate.d.ts.map +1 -0
- package/dist/metrics/calculators/change-failure-rate.js +70 -0
- package/dist/metrics/calculators/change-failure-rate.js.map +1 -0
- package/dist/metrics/calculators/deployment-frequency.d.ts +20 -0
- package/dist/metrics/calculators/deployment-frequency.d.ts.map +1 -0
- package/dist/metrics/calculators/deployment-frequency.js +61 -0
- package/dist/metrics/calculators/deployment-frequency.js.map +1 -0
- package/dist/metrics/calculators/lead-time.d.ts +22 -0
- package/dist/metrics/calculators/lead-time.d.ts.map +1 -0
- package/dist/metrics/calculators/lead-time.js +82 -0
- package/dist/metrics/calculators/lead-time.js.map +1 -0
- package/dist/metrics/calculators/mttr.d.ts +21 -0
- package/dist/metrics/calculators/mttr.d.ts.map +1 -0
- package/dist/metrics/calculators/mttr.js +60 -0
- package/dist/metrics/calculators/mttr.js.map +1 -0
- package/dist/metrics/dora-calculator.d.ts +24 -0
- package/dist/metrics/dora-calculator.d.ts.map +1 -0
- package/dist/metrics/dora-calculator.js +104 -0
- package/dist/metrics/dora-calculator.js.map +1 -0
- package/dist/metrics/github-client.d.ts +51 -0
- package/dist/metrics/github-client.d.ts.map +1 -0
- package/dist/metrics/github-client.js +133 -0
- package/dist/metrics/github-client.js.map +1 -0
- package/dist/metrics/types.d.ts +112 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +10 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/metrics/utils/percentile.d.ts +25 -0
- package/dist/metrics/utils/percentile.d.ts.map +1 -0
- package/dist/metrics/utils/percentile.js +46 -0
- package/dist/metrics/utils/percentile.js.map +1 -0
- package/dist/metrics/utils/tier-classifier.d.ts +61 -0
- package/dist/metrics/utils/tier-classifier.d.ts.map +1 -0
- package/dist/metrics/utils/tier-classifier.js +100 -0
- package/dist/metrics/utils/tier-classifier.js.map +1 -0
- package/dist/utils/auth-helpers.d.ts +58 -0
- package/dist/utils/auth-helpers.d.ts.map +1 -0
- package/dist/utils/auth-helpers.js +108 -0
- package/dist/utils/auth-helpers.js.map +1 -0
- package/dist/utils/env-file.d.ts +88 -0
- package/dist/utils/env-file.d.ts.map +1 -0
- package/dist/utils/env-file.js +180 -0
- package/dist/utils/env-file.js.map +1 -0
- package/dist/utils/plugin-detection.d.ts +50 -0
- package/dist/utils/plugin-detection.d.ts.map +1 -0
- package/dist/utils/plugin-detection.js +229 -0
- package/dist/utils/plugin-detection.js.map +1 -0
- package/dist/utils/secrets-loader.d.ts +88 -0
- package/dist/utils/secrets-loader.d.ts.map +1 -0
- package/dist/utils/secrets-loader.js +271 -0
- package/dist/utils/secrets-loader.js.map +1 -0
- package/dist/utils/translation.d.ts +187 -0
- package/dist/utils/translation.d.ts.map +1 -0
- package/dist/utils/translation.js +414 -0
- package/dist/utils/translation.js.map +1 -0
- package/package.json +28 -44
- package/plugins/specweave/.claude-plugin/plugin.json +3 -3
- package/plugins/specweave/agents/pm/AGENT.md +330 -54
- package/plugins/specweave/agents/test-aware-planner/AGENT.md +1035 -0
- package/plugins/specweave/agents/test-aware-planner/templates/README.md +118 -0
- package/plugins/specweave/agents/test-aware-planner/templates/task-non-testable.md.template +24 -0
- package/plugins/specweave/agents/test-aware-planner/templates/task-testable.md.template +53 -0
- package/plugins/specweave/agents/test-aware-planner/templates/tasks-frontmatter.md.template +11 -0
- package/plugins/specweave/commands/README.md +88 -163
- package/plugins/specweave/commands/specweave-abandon.md +314 -0
- package/plugins/specweave/commands/specweave-check-tests.md +546 -0
- package/plugins/specweave/commands/{do.md → specweave-do.md} +5 -7
- package/plugins/specweave/commands/{increment.md → specweave-increment.md} +231 -4
- package/plugins/specweave/commands/specweave-pause.md +189 -0
- package/plugins/specweave/commands/specweave-qa.md +245 -0
- package/plugins/specweave/commands/specweave-resume.md +216 -0
- package/plugins/specweave/commands/specweave-status.md +397 -0
- package/plugins/specweave/commands/specweave-sync-tasks.md +256 -0
- package/plugins/specweave/commands/{translate.md → specweave-translate.md} +3 -3
- package/plugins/specweave/commands/specweave-update-scope.md +351 -0
- package/plugins/specweave/commands/specweave.md +21 -21
- package/plugins/specweave/hooks/post-increment-planning.sh +335 -0
- package/plugins/specweave/hooks/post-task-completion.sh +141 -0
- package/plugins/specweave/skills/SKILLS-INDEX.md +1 -1
- package/plugins/specweave/skills/brownfield-analyzer/SKILL.md +9 -9
- package/plugins/specweave/skills/increment-planner/SKILL.md +400 -212
- package/plugins/specweave/skills/increment-quality-judge-v2/SKILL.md +499 -0
- package/plugins/specweave/skills/plugin-detector/SKILL.md +114 -1
- package/plugins/specweave/skills/project-kickstarter/SKILL.md +74 -1
- package/plugins/specweave/skills/{rfc-generator → spec-generator}/SKILL.md +22 -29
- package/plugins/specweave/skills/specweave-detector/SKILL.md +3 -3
- package/plugins/specweave/skills/specweave-framework/SKILL.md +2 -2
- package/plugins/specweave-ado/.claude-plugin/plugin.json +18 -4
- package/plugins/specweave-ado/agents/ado-manager/AGENT.md +426 -0
- package/plugins/specweave-ado/commands/close-workitem.md +52 -0
- package/plugins/specweave-ado/commands/create-workitem.md +53 -0
- package/plugins/specweave-ado/commands/status.md +53 -0
- package/plugins/specweave-ado/commands/sync.md +55 -0
- package/plugins/specweave-ado/lib/ado-client.ts +361 -0
- package/plugins/specweave-ado/reference/ado-specweave-mapping.md +552 -0
- package/plugins/specweave-ado/skills/ado-sync/SKILL.md +344 -193
- package/plugins/specweave-docs/skills/docusaurus/SKILL.md +73 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +49 -0
- package/plugins/specweave-github/commands/{github-close-issue.md → close-issue.md} +1 -1
- package/plugins/specweave-github/commands/{github-create-issue.md → create-issue.md} +1 -1
- package/plugins/specweave-github/commands/{github-status.md → status.md} +1 -1
- package/plugins/specweave-github/commands/{github-sync-tasks.md → sync-tasks.md} +1 -1
- package/plugins/specweave-github/commands/{github-sync.md → sync.md} +1 -1
- package/plugins/specweave-github/reference/github-specweave-mapping.md +377 -0
- package/plugins/specweave-github/skills/github-sync/SKILL.md +11 -3
- package/plugins/specweave-infrastructure/commands/{specweave.monitor-setup.md → monitor-setup.md} +5 -0
- package/plugins/specweave-infrastructure/commands/{specweave.slo-implement.md → slo-implement.md} +5 -0
- package/plugins/specweave-jira/agents/jira-manager/AGENT.md +380 -0
- package/plugins/specweave-jira/commands/{specweave.sync-jira.md → sync.md} +1 -1
- package/plugins/specweave-jira/reference/jira-specweave-mapping.md +508 -0
- package/plugins/specweave-ml/commands/ml-deploy.md +1 -1
- package/plugins/specweave-ml/commands/ml-evaluate.md +1 -1
- package/plugins/specweave-ml/commands/ml-explain.md +1 -1
- package/plugins/specweave-ml/commands/{specweave.ml-pipeline.md → ml-pipeline.md} +5 -0
- package/src/templates/AGENTS.md.template +331 -31
- package/src/templates/CLAUDE.md.template +36 -21
- package/src/templates/COMPLETION-REPORT.template.md +128 -0
- package/src/templates/README.md.template +17 -16
- package/src/templates/docs/README.md +11 -9
- package/src/templates/docs/spec-template.md +229 -0
- package/plugins/specweave/commands/inc.md +0 -85
- package/plugins/specweave/commands/list-increments.md +0 -180
- package/src/adapters/README.md +0 -275
- package/src/adapters/adapter-base.ts +0 -182
- package/src/adapters/adapter-interface.ts +0 -166
- package/src/adapters/adapter-loader.ts +0 -256
- package/src/adapters/agents-md-generator.ts +0 -228
- package/src/adapters/claude/README.md +0 -233
- package/src/adapters/claude/adapter.ts +0 -468
- package/src/adapters/claude-md-generator.ts +0 -377
- package/src/adapters/codex/README.md +0 -105
- package/src/adapters/codex/adapter.ts +0 -333
- package/src/adapters/cursor/.cursor/context/docs-context.md +0 -62
- package/src/adapters/cursor/.cursor/context/increments-context.md +0 -71
- package/src/adapters/cursor/.cursor/context/strategy-context.md +0 -73
- package/src/adapters/cursor/.cursor/context/tests-context.md +0 -89
- package/src/adapters/cursor/README.md +0 -283
- package/src/adapters/cursor/adapter.ts +0 -451
- package/src/adapters/doc-generator.ts +0 -331
- package/src/adapters/gemini/README.md +0 -97
- package/src/adapters/gemini/adapter.ts +0 -298
- package/src/adapters/generic/README.md +0 -277
- package/src/adapters/generic/adapter.ts +0 -378
- package/src/adapters/registry.yaml +0 -187
- /package/plugins/specweave/commands/{costs.md → specweave-costs.md} +0 -0
- /package/plugins/specweave/commands/{done.md → specweave-done.md} +0 -0
- /package/plugins/specweave/commands/{next.md → specweave-next.md} +0 -0
- /package/plugins/specweave/commands/{progress.md → specweave-progress.md} +0 -0
- /package/plugins/specweave/commands/{sync-docs.md → specweave-sync-docs.md} +0 -0
- /package/plugins/specweave/commands/{tdd-cycle.md → specweave-tdd-cycle.md} +0 -0
- /package/plugins/specweave/commands/{tdd-green.md → specweave-tdd-green.md} +0 -0
- /package/plugins/specweave/commands/{tdd-red.md → specweave-tdd-red.md} +0 -0
- /package/plugins/specweave/commands/{tdd-refactor.md → specweave-tdd-refactor.md} +0 -0
- /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"}
|