@planu/cli 0.27.0 → 0.28.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/dist/config/tool-groups.json +140 -0
- package/dist/engine/ai-cost-estimator/core.d.ts +1 -1
- package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
- package/dist/engine/ai-cost-estimator/core.js +55 -19
- package/dist/engine/ai-cost-estimator/core.js.map +1 -1
- package/dist/engine/focus-tracker.d.ts.map +1 -1
- package/dist/engine/focus-tracker.js +1 -0
- package/dist/engine/focus-tracker.js.map +1 -1
- package/dist/engine/planu-config-writer.d.ts +2 -2
- package/dist/engine/planu-config-writer.d.ts.map +1 -1
- package/dist/engine/planu-config-writer.js +4 -6
- package/dist/engine/planu-config-writer.js.map +1 -1
- package/dist/engine/spec-migrator.d.ts +17 -0
- package/dist/engine/spec-migrator.d.ts.map +1 -0
- package/dist/engine/spec-migrator.js +119 -0
- package/dist/engine/spec-migrator.js.map +1 -0
- package/dist/engine/tool-groups/context-analyzer.d.ts +11 -0
- package/dist/engine/tool-groups/context-analyzer.d.ts.map +1 -0
- package/dist/engine/tool-groups/context-analyzer.js +40 -0
- package/dist/engine/tool-groups/context-analyzer.js.map +1 -0
- package/dist/engine/tool-groups/group-manager.d.ts +35 -0
- package/dist/engine/tool-groups/group-manager.d.ts.map +1 -0
- package/dist/engine/tool-groups/group-manager.js +201 -0
- package/dist/engine/tool-groups/group-manager.js.map +1 -0
- package/dist/engine/web-fetcher/registry-loader.d.ts.map +1 -1
- package/dist/engine/web-fetcher/registry-loader.js +2 -0
- package/dist/engine/web-fetcher/registry-loader.js.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/data-governance/audit-handler.d.ts.map +1 -1
- package/dist/tools/data-governance/audit-handler.js +1 -0
- package/dist/tools/data-governance/audit-handler.js.map +1 -1
- package/dist/tools/design-schema.d.ts.map +1 -1
- package/dist/tools/design-schema.js +1 -0
- package/dist/tools/design-schema.js.map +1 -1
- package/dist/tools/init-project/handler.d.ts.map +1 -1
- package/dist/tools/init-project/handler.js +48 -14
- package/dist/tools/init-project/handler.js.map +1 -1
- package/dist/tools/register-ai-cost-tools.js +1 -1
- package/dist/tools/register-ai-cost-tools.js.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.js +0 -4
- package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
- package/dist/tools/register-tool-groups.d.ts +7 -0
- package/dist/tools/register-tool-groups.d.ts.map +1 -0
- package/dist/tools/register-tool-groups.js +39 -0
- package/dist/tools/register-tool-groups.js.map +1 -0
- package/dist/tools/suggest-tooling/orchestration-generator.js +1 -1
- package/dist/tools/suggest-tooling/orchestration-generator.js.map +1 -1
- package/dist/tools/tool-group-handler.d.ts +9 -0
- package/dist/tools/tool-group-handler.d.ts.map +1 -0
- package/dist/tools/tool-group-handler.js +82 -0
- package/dist/tools/tool-group-handler.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/project/inputs.d.ts +0 -1
- package/dist/types/project/inputs.d.ts.map +1 -1
- package/dist/types/spec/inputs.d.ts +8 -0
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/dist/types/tool-groups.d.ts +57 -0
- package/dist/types/tool-groups.d.ts.map +1 -0
- package/dist/types/tool-groups.js +3 -0
- package/dist/types/tool-groups.js.map +1 -0
- package/package.json +1 -1
- package/src/config/tool-groups.json +140 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"groups": [
|
|
3
|
+
{
|
|
4
|
+
"id": "core",
|
|
5
|
+
"name": "Core",
|
|
6
|
+
"description": "Essential tools always available — project setup, locale, spec listing, and group management.",
|
|
7
|
+
"tools": ["set_locale", "init_project", "init_constitution", "list_specs", "activate_group", "list_groups"],
|
|
8
|
+
"defaultEnabled": true,
|
|
9
|
+
"locked": true
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "spec-lifecycle",
|
|
13
|
+
"name": "Spec Lifecycle",
|
|
14
|
+
"description": "Create, validate, estimate, and manage specs through their full lifecycle.",
|
|
15
|
+
"tools": [
|
|
16
|
+
"create_spec",
|
|
17
|
+
"validate",
|
|
18
|
+
"estimate",
|
|
19
|
+
"challenge_spec",
|
|
20
|
+
"update_status",
|
|
21
|
+
"check_readiness",
|
|
22
|
+
"clarify_requirements",
|
|
23
|
+
"summarize_spec",
|
|
24
|
+
"reconcile_spec",
|
|
25
|
+
"list_templates",
|
|
26
|
+
"apply_template",
|
|
27
|
+
"spec_history",
|
|
28
|
+
"log_decision"
|
|
29
|
+
],
|
|
30
|
+
"defaultEnabled": true,
|
|
31
|
+
"locked": false,
|
|
32
|
+
"triggerTools": ["create_spec", "validate", "estimate"]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "analysis",
|
|
36
|
+
"name": "Analysis",
|
|
37
|
+
"description": "Audit, drift detection, contradiction checks, and deep code analysis.",
|
|
38
|
+
"tools": [
|
|
39
|
+
"audit",
|
|
40
|
+
"audit_stack",
|
|
41
|
+
"detect_drift",
|
|
42
|
+
"detect_contradictions",
|
|
43
|
+
"detect_deprecations",
|
|
44
|
+
"detect_agent",
|
|
45
|
+
"reality_check",
|
|
46
|
+
"check_spec_accuracy",
|
|
47
|
+
"paradigm_report",
|
|
48
|
+
"spec_coverage"
|
|
49
|
+
],
|
|
50
|
+
"defaultEnabled": false,
|
|
51
|
+
"locked": false,
|
|
52
|
+
"triggerTools": ["audit", "detect_drift", "reality_check"]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "generation",
|
|
56
|
+
"name": "Generation",
|
|
57
|
+
"description": "Generate docs, tests, schemas, UI contracts, skills, rules, and ADRs.",
|
|
58
|
+
"tools": [
|
|
59
|
+
"generate_docs",
|
|
60
|
+
"generate_tests",
|
|
61
|
+
"design_schema",
|
|
62
|
+
"define_ui_contract",
|
|
63
|
+
"generate_adr",
|
|
64
|
+
"generate_checklist",
|
|
65
|
+
"generate_rules",
|
|
66
|
+
"generate_skill",
|
|
67
|
+
"generate_sub_agent",
|
|
68
|
+
"consult_docs",
|
|
69
|
+
"event_contracts"
|
|
70
|
+
],
|
|
71
|
+
"defaultEnabled": false,
|
|
72
|
+
"locked": false,
|
|
73
|
+
"triggerTools": ["generate_docs", "generate_tests", "design_schema"]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "orchestration",
|
|
77
|
+
"name": "Orchestration",
|
|
78
|
+
"description": "Multi-agent orchestration, execution plans, handoff packages, and AI cost estimation.",
|
|
79
|
+
"tools": [
|
|
80
|
+
"orchestrate",
|
|
81
|
+
"orchestrate_agents",
|
|
82
|
+
"package_handoff",
|
|
83
|
+
"generate_execution_plan",
|
|
84
|
+
"generate_orchestration_script",
|
|
85
|
+
"estimate_ai_cost",
|
|
86
|
+
"integrate_pm"
|
|
87
|
+
],
|
|
88
|
+
"defaultEnabled": false,
|
|
89
|
+
"locked": false,
|
|
90
|
+
"triggerTools": ["orchestrate", "orchestrate_agents", "generate_execution_plan"]
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "devops",
|
|
94
|
+
"name": "DevOps",
|
|
95
|
+
"description": "Git management, tooling suggestions, CI generation, upgrades, and stack recommendations.",
|
|
96
|
+
"tools": [
|
|
97
|
+
"manage_git",
|
|
98
|
+
"suggest_tooling",
|
|
99
|
+
"suggest_stack",
|
|
100
|
+
"suggest_mcps",
|
|
101
|
+
"plan_upgrade",
|
|
102
|
+
"check_versions",
|
|
103
|
+
"check_config_health",
|
|
104
|
+
"generate_ci",
|
|
105
|
+
"discover_mcps",
|
|
106
|
+
"validate_workflow"
|
|
107
|
+
],
|
|
108
|
+
"defaultEnabled": false,
|
|
109
|
+
"locked": false,
|
|
110
|
+
"triggerTools": ["manage_git", "suggest_tooling", "generate_ci"]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "governance",
|
|
114
|
+
"name": "Governance",
|
|
115
|
+
"description": "Security checks, data governance, scope management, and context control.",
|
|
116
|
+
"tools": [
|
|
117
|
+
"security_check",
|
|
118
|
+
"data_governance",
|
|
119
|
+
"manage_scope",
|
|
120
|
+
"manage_context",
|
|
121
|
+
"context_budget",
|
|
122
|
+
"request_context",
|
|
123
|
+
"contribute_context",
|
|
124
|
+
"facilitate"
|
|
125
|
+
],
|
|
126
|
+
"defaultEnabled": false,
|
|
127
|
+
"locked": false,
|
|
128
|
+
"triggerTools": ["security_check", "data_governance", "manage_scope"]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "learning",
|
|
132
|
+
"name": "Learning",
|
|
133
|
+
"description": "Pattern learning, knowledge capture, reverse engineering, and migration.",
|
|
134
|
+
"tools": ["learn_pattern", "capture_learning", "reverse_engineer", "migrate_tech", "manage_hooks"],
|
|
135
|
+
"defaultEnabled": false,
|
|
136
|
+
"locked": false,
|
|
137
|
+
"triggerTools": ["learn_pattern", "capture_learning", "reverse_engineer"]
|
|
138
|
+
}
|
|
139
|
+
]
|
|
140
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AiCostEstimateResult, EstimateAiCostInput } from '../../types/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Estimates the AI cost for implementing a spec.
|
|
4
|
-
* Reads the spec from docs/sdd/specs
|
|
4
|
+
* Reads the spec from planu/specs/ (or legacy docs/sdd/specs/), loads pricing from config JSON,
|
|
5
5
|
* and returns a full AiCostEstimateResult with per-model breakdown.
|
|
6
6
|
*/
|
|
7
7
|
export declare function estimateAiCost(input: EstimateAiCostInput): Promise<AiCostEstimateResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/core.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,oBAAoB,EAEpB,mBAAmB,EAEpB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/core.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,oBAAoB,EAEpB,mBAAmB,EAEpB,MAAM,sBAAsB,CAAC;AAqS9B;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmF9F"}
|
|
@@ -37,35 +37,71 @@ function getComplexityLevel(acCount) {
|
|
|
37
37
|
* Tries to find the spec directory by matching specId prefix.
|
|
38
38
|
*/
|
|
39
39
|
async function loadSpecContent(specId) {
|
|
40
|
-
|
|
41
|
-
let
|
|
40
|
+
// Try modern location first, fallback to legacy
|
|
41
|
+
let specsRoot = 'planu/specs';
|
|
42
42
|
try {
|
|
43
|
-
const {
|
|
44
|
-
|
|
43
|
+
const { access: fsAccess } = await import('node:fs/promises');
|
|
44
|
+
await fsAccess(specsRoot);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
specsRoot = 'docs/sdd/specs';
|
|
48
|
+
}
|
|
49
|
+
const { readdir } = await import('node:fs/promises');
|
|
50
|
+
let specDir = null;
|
|
51
|
+
try {
|
|
52
|
+
const topEntries = await readdir(specsRoot);
|
|
53
|
+
// Try flat layout first: planu/specs/SPEC-069-name/ or docs/sdd/specs/SPEC-069-name/
|
|
54
|
+
const flatMatch = topEntries.find((e) => e.startsWith(specId));
|
|
55
|
+
if (flatMatch) {
|
|
56
|
+
specDir = join(specsRoot, flatMatch);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Try nested layout: planu/specs/{feature}/SPEC-069-name/
|
|
60
|
+
for (const group of topEntries) {
|
|
61
|
+
try {
|
|
62
|
+
const groupEntries = await readdir(join(specsRoot, group));
|
|
63
|
+
const nestedMatch = groupEntries.find((e) => e.startsWith(specId));
|
|
64
|
+
if (nestedMatch) {
|
|
65
|
+
specDir = join(specsRoot, group, nestedMatch);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Not a directory — skip
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
45
74
|
}
|
|
46
75
|
catch {
|
|
47
76
|
throw new Error(`Spec directory not found at "${specsRoot}". ` +
|
|
48
77
|
'Make sure you are running from the project root.');
|
|
49
78
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (!specDirName) {
|
|
53
|
-
throw new Error(`Spec "${specId}" not found in "${specsRoot}". ` +
|
|
54
|
-
`Available specs: ${entries.slice(0, 5).join(', ')}...`);
|
|
79
|
+
if (!specDir) {
|
|
80
|
+
throw new Error(`Spec "${specId}" not found in "${specsRoot}". ` + 'Check that the spec directory exists.');
|
|
55
81
|
}
|
|
56
|
-
const specDir = join(specsRoot, specDirName);
|
|
57
82
|
const parts = [];
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
83
|
+
// Try modern names first, fallback to legacy — only read one of each pair
|
|
84
|
+
for (const [modern, legacy] of [
|
|
85
|
+
['spec.md', 'HU.md'],
|
|
86
|
+
['technical.md', 'FICHA-TECNICA.md'],
|
|
87
|
+
]) {
|
|
88
|
+
let found = false;
|
|
89
|
+
for (const filename of [modern, legacy]) {
|
|
90
|
+
if (found) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const content = await readFile(join(specDir, filename), 'utf-8');
|
|
95
|
+
parts.push(content);
|
|
96
|
+
found = true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// File not present — try next
|
|
100
|
+
}
|
|
65
101
|
}
|
|
66
102
|
}
|
|
67
103
|
if (parts.length === 0) {
|
|
68
|
-
throw new Error(`Spec "${specId}" has no
|
|
104
|
+
throw new Error(`Spec "${specId}" has no spec files in "${specDir}". ` +
|
|
69
105
|
'Cannot estimate without spec content.');
|
|
70
106
|
}
|
|
71
107
|
return { content: parts.join('\n\n'), specDir };
|
|
@@ -198,7 +234,7 @@ function formatMarkdownTable(estimates, recommendedModelId, recommendationReason
|
|
|
198
234
|
// ---------------------------------------------------------------------------
|
|
199
235
|
/**
|
|
200
236
|
* Estimates the AI cost for implementing a spec.
|
|
201
|
-
* Reads the spec from docs/sdd/specs
|
|
237
|
+
* Reads the spec from planu/specs/ (or legacy docs/sdd/specs/), loads pricing from config JSON,
|
|
202
238
|
* and returns a full AiCostEstimateResult with per-model breakdown.
|
|
203
239
|
*/
|
|
204
240
|
export async function estimateAiCost(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/core.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAE/E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,sFAAsF;AACtF,SAAS,qBAAqB,CAAC,OAAe;IAC5C,IAAI,OAAO,IAAI,qBAAqB,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,IAAI,wBAAwB,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,+DAA+D;AAC/D,SAAS,kBAAkB,CAAC,OAAe;IACzC,IAAI,OAAO,IAAI,qBAAqB,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,IAAI,wBAAwB,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,MAAc;IAC3C,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-tracker.d.ts","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"focus-tracker.d.ts","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAyDhE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,UAAU,GAAG,IAAI,CA0BnB;AAWD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-tracker.js","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"focus-tracker.js","sourceRoot":"","sources":["../../src/engine/focus-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { PlanuConfig } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
|
-
* Create a new PlanuConfig with defaults.
|
|
3
|
+
* Create a new PlanuConfig with defaults. Always uses modern spec location.
|
|
4
4
|
*/
|
|
5
|
-
export declare function createPlanuConfig(
|
|
5
|
+
export declare function createPlanuConfig(): PlanuConfig;
|
|
6
6
|
/**
|
|
7
7
|
* Serialize PlanuConfig to JSON string.
|
|
8
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planu-config-writer.d.ts","sourceRoot":"","sources":["../../src/engine/planu-config-writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD;;GAEG;AACH,wBAAgB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"planu-config-writer.d.ts","sourceRoot":"","sources":["../../src/engine/planu-config-writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAU/C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAKA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE9D"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
const PLANU_CONFIG_VERSION = '1.0.0';
|
|
2
2
|
const DEFAULT_SPEC_LOCATION = 'planu/specs';
|
|
3
3
|
/**
|
|
4
|
-
* Create a new PlanuConfig with defaults.
|
|
4
|
+
* Create a new PlanuConfig with defaults. Always uses modern spec location.
|
|
5
5
|
*/
|
|
6
|
-
export function createPlanuConfig(
|
|
6
|
+
export function createPlanuConfig() {
|
|
7
7
|
const now = new Date().toISOString();
|
|
8
|
-
const location = specLocation ?? DEFAULT_SPEC_LOCATION;
|
|
9
|
-
const isLegacy = location.includes('docs/sdd/specs');
|
|
10
8
|
return {
|
|
11
9
|
version: PLANU_CONFIG_VERSION,
|
|
12
|
-
specLocation:
|
|
13
|
-
specNaming:
|
|
10
|
+
specLocation: DEFAULT_SPEC_LOCATION,
|
|
11
|
+
specNaming: 'modern',
|
|
14
12
|
createdAt: now,
|
|
15
13
|
updatedAt: now,
|
|
16
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planu-config-writer.js","sourceRoot":"","sources":["../../src/engine/planu-config-writer.ts"],"names":[],"mappings":"AAGA,MAAM,oBAAoB,GAAG,OAAO,CAAC;AACrC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,iBAAiB
|
|
1
|
+
{"version":3,"file":"planu-config-writer.js","sourceRoot":"","sources":["../../src/engine/planu-config-writer.ts"],"names":[],"mappings":"AAGA,MAAM,oBAAoB,GAAG,OAAO,CAAC;AACrC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,OAAO;QACL,OAAO,EAAE,oBAAoB;QAC7B,YAAY,EAAE,qBAAqB;QACnC,UAAU,EAAE,QAAQ;QACpB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA2B;IAK1D,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IACnF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACnD,OAAO,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Spec, SpecMigrationResult, SpecMigrationDeps } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect specs stored under a legacy location (docs/sdd/specs/).
|
|
4
|
+
* Caller provides the list of specs (from storage layer).
|
|
5
|
+
*/
|
|
6
|
+
export declare function filterLegacySpecs(specs: Spec[]): Spec[];
|
|
7
|
+
/**
|
|
8
|
+
* Migrate legacy specs to planu/specs/ with modern file naming.
|
|
9
|
+
* Moves files on disk and calls the provided updateSpec for each migrated spec.
|
|
10
|
+
* Also rewrites planu.json.
|
|
11
|
+
*/
|
|
12
|
+
export declare function migrateSpecs(projectPath: string, legacySpecs: Spec[], deps: SpecMigrationDeps): Promise<SpecMigrationResult>;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a project path has a planu.json with legacy specLocation.
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasLegacyConfig(projectPath: string): Promise<boolean>;
|
|
17
|
+
//# sourceMappingURL=spec-migrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-migrator.d.ts","sourceRoot":"","sources":["../../src/engine/spec-migrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAetF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAEvD;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,IAAI,EAAE,EACnB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAoB9B;AA8ED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS3E"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { isLegacyLocation, createPlanuConfig, serializePlanuConfig, } from './planu-config-writer.js';
|
|
2
|
+
import { mkdir, rename, readdir, rmdir, access, writeFile, readFile } from 'node:fs/promises';
|
|
3
|
+
import { join, dirname } from 'node:path';
|
|
4
|
+
const LEGACY_TO_MODERN_NAMES = {
|
|
5
|
+
'HU.md': 'spec.md',
|
|
6
|
+
'FICHA-TECNICA.md': 'technical.md',
|
|
7
|
+
'PROGRESS.md': 'progress.md',
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Detect specs stored under a legacy location (docs/sdd/specs/).
|
|
11
|
+
* Caller provides the list of specs (from storage layer).
|
|
12
|
+
*/
|
|
13
|
+
export function filterLegacySpecs(specs) {
|
|
14
|
+
return specs.filter((s) => isLegacyLocation(s.specPath) || isLegacyLocation(s.technicalPath));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Migrate legacy specs to planu/specs/ with modern file naming.
|
|
18
|
+
* Moves files on disk and calls the provided updateSpec for each migrated spec.
|
|
19
|
+
* Also rewrites planu.json.
|
|
20
|
+
*/
|
|
21
|
+
export async function migrateSpecs(projectPath, legacySpecs, deps) {
|
|
22
|
+
const errors = [];
|
|
23
|
+
let migratedCount = 0;
|
|
24
|
+
for (const spec of legacySpecs) {
|
|
25
|
+
try {
|
|
26
|
+
await migrateSingleSpec(projectPath, spec, deps);
|
|
27
|
+
migratedCount++;
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
31
|
+
errors.push(`${spec.id}: ${msg}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Rewrite planu.json with modern config
|
|
35
|
+
const planuConfigPath = join(projectPath, 'planu.json');
|
|
36
|
+
const planuConfig = createPlanuConfig();
|
|
37
|
+
await writeFile(planuConfigPath, serializePlanuConfig(planuConfig), 'utf-8');
|
|
38
|
+
return { migratedCount, errors };
|
|
39
|
+
}
|
|
40
|
+
async function migrateSingleSpec(projectPath, spec, deps) {
|
|
41
|
+
const oldSpecDir = dirname(join(projectPath, spec.specPath));
|
|
42
|
+
const newRelDir = spec.specPath
|
|
43
|
+
.replace(/docs\/sdd\/specs/, 'planu/specs')
|
|
44
|
+
.replace(/\/[^/]+$/, '');
|
|
45
|
+
const newAbsDir = join(projectPath, newRelDir);
|
|
46
|
+
// Create target directory
|
|
47
|
+
await mkdir(newAbsDir, { recursive: true });
|
|
48
|
+
// Move and rename known files
|
|
49
|
+
const dirEntries = await safeReaddir(oldSpecDir);
|
|
50
|
+
for (const entry of dirEntries) {
|
|
51
|
+
const modernName = LEGACY_TO_MODERN_NAMES[entry] ?? entry;
|
|
52
|
+
const src = join(oldSpecDir, entry);
|
|
53
|
+
const dest = join(newAbsDir, modernName);
|
|
54
|
+
await rename(src, dest);
|
|
55
|
+
}
|
|
56
|
+
// Update spec paths in storage
|
|
57
|
+
const updates = {
|
|
58
|
+
specPath: rewritePath(spec.specPath),
|
|
59
|
+
technicalPath: rewritePath(spec.technicalPath),
|
|
60
|
+
};
|
|
61
|
+
if (spec.progressPath) {
|
|
62
|
+
updates.progressPath = rewritePath(spec.progressPath);
|
|
63
|
+
}
|
|
64
|
+
if (spec.executiveReportPath) {
|
|
65
|
+
updates.executiveReportPath = rewritePath(spec.executiveReportPath);
|
|
66
|
+
}
|
|
67
|
+
if (spec.technicalReportPath) {
|
|
68
|
+
updates.technicalReportPath = rewritePath(spec.technicalReportPath);
|
|
69
|
+
}
|
|
70
|
+
if (spec.planPath) {
|
|
71
|
+
updates.planPath = rewritePath(spec.planPath);
|
|
72
|
+
}
|
|
73
|
+
await deps.updateSpec(spec.projectId, spec.id, updates);
|
|
74
|
+
// Cleanup empty legacy directories
|
|
75
|
+
await cleanupEmptyDirs(oldSpecDir);
|
|
76
|
+
}
|
|
77
|
+
function rewritePath(path) {
|
|
78
|
+
return path
|
|
79
|
+
.replace(/docs\/sdd\/specs/, 'planu/specs')
|
|
80
|
+
.replace(/\/HU\.md$/, '/spec.md')
|
|
81
|
+
.replace(/\/FICHA-TECNICA\.md$/, '/technical.md')
|
|
82
|
+
.replace(/\/PROGRESS\.md$/, '/progress.md');
|
|
83
|
+
}
|
|
84
|
+
async function safeReaddir(dir) {
|
|
85
|
+
try {
|
|
86
|
+
return await readdir(dir);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function cleanupEmptyDirs(dir) {
|
|
93
|
+
try {
|
|
94
|
+
const entries = await readdir(dir);
|
|
95
|
+
if (entries.length === 0) {
|
|
96
|
+
await rmdir(dir);
|
|
97
|
+
// Try to clean parent too (e.g., docs/sdd/specs/ itself)
|
|
98
|
+
await cleanupEmptyDirs(dirname(dir));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Directory might not exist or not be empty — safe to ignore
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a project path has a planu.json with legacy specLocation.
|
|
107
|
+
*/
|
|
108
|
+
export async function hasLegacyConfig(projectPath) {
|
|
109
|
+
try {
|
|
110
|
+
await access(join(projectPath, 'planu.json'));
|
|
111
|
+
const content = await readFile(join(projectPath, 'planu.json'), 'utf-8');
|
|
112
|
+
const config = JSON.parse(content);
|
|
113
|
+
return config.specLocation ? isLegacyLocation(config.specLocation) : false;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=spec-migrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-migrator.js","sourceRoot":"","sources":["../../src/engine/spec-migrator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,sBAAsB,GAA2B;IACrD,OAAO,EAAE,SAAS;IAClB,kBAAkB,EAAE,cAAc;IAClC,aAAa,EAAE,aAAa;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAChG,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,WAAmB,EACnB,WAAmB,EACnB,IAAuB;IAEvB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACjD,aAAa,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IACxC,MAAM,SAAS,CAAC,eAAe,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,IAAU,EACV,IAAuB;IAEvB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ;SAC5B,OAAO,CAAC,kBAAkB,EAAE,aAAa,CAAC;SAC1C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE/C,0BAA0B;IAC1B,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,8BAA8B;IAC9B,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAkB;QAC7B,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,aAAa,EAAE,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;KAC/C,CAAC;IACF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,OAAO,CAAC,mBAAmB,GAAG,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,OAAO,CAAC,mBAAmB,GAAG,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAExD,mCAAmC;IACnC,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI;SACR,OAAO,CAAC,kBAAkB,EAAE,aAAa,CAAC;SAC1C,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;SAChC,OAAO,CAAC,sBAAsB,EAAE,eAAe,CAAC;SAChD,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,yDAAyD;YACzD,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA8B,CAAC;QAChE,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ContextSuggestion } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Analyzes the last invoked tool and suggests groups that should be activated.
|
|
4
|
+
* Returns suggestions sorted by confidence (highest first).
|
|
5
|
+
*/
|
|
6
|
+
export declare function analyzeContext(lastToolUsed: string, enabledGroups: Set<string>): ContextSuggestion[];
|
|
7
|
+
/**
|
|
8
|
+
* Returns the group id that a given tool belongs to, or undefined.
|
|
9
|
+
*/
|
|
10
|
+
export declare function findGroupForTool(toolName: string): string | undefined;
|
|
11
|
+
//# sourceMappingURL=context-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/tool-groups/context-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,kBAAkB,CAAC;AAQ/E;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,iBAAiB,EAAE,CA2BrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import toolGroupsConfigJson from '../../config/tool-groups.json' with { type: 'json' };
|
|
2
|
+
const config = toolGroupsConfigJson;
|
|
3
|
+
const TRIGGER_CONFIDENCE = 0.9;
|
|
4
|
+
const MEMBER_CONFIDENCE = 0.5;
|
|
5
|
+
/**
|
|
6
|
+
* Analyzes the last invoked tool and suggests groups that should be activated.
|
|
7
|
+
* Returns suggestions sorted by confidence (highest first).
|
|
8
|
+
*/
|
|
9
|
+
export function analyzeContext(lastToolUsed, enabledGroups) {
|
|
10
|
+
const suggestions = [];
|
|
11
|
+
for (const group of config.groups) {
|
|
12
|
+
if (enabledGroups.has(group.id)) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const isTrigger = group.triggerTools?.includes(lastToolUsed) ?? false;
|
|
16
|
+
const isMember = group.tools.includes(lastToolUsed);
|
|
17
|
+
if (isTrigger) {
|
|
18
|
+
suggestions.push({
|
|
19
|
+
suggestedGroup: group.id,
|
|
20
|
+
reason: `Tool "${lastToolUsed}" is a trigger for group "${group.name}"`,
|
|
21
|
+
confidence: TRIGGER_CONFIDENCE,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
else if (isMember) {
|
|
25
|
+
suggestions.push({
|
|
26
|
+
suggestedGroup: group.id,
|
|
27
|
+
reason: `Tool "${lastToolUsed}" belongs to group "${group.name}"`,
|
|
28
|
+
confidence: MEMBER_CONFIDENCE,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return suggestions.sort((a, b) => b.confidence - a.confidence);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Returns the group id that a given tool belongs to, or undefined.
|
|
36
|
+
*/
|
|
37
|
+
export function findGroupForTool(toolName) {
|
|
38
|
+
return config.groups.find((g) => g.tools.includes(toolName))?.id;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=context-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-analyzer.js","sourceRoot":"","sources":["../../../src/engine/tool-groups/context-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,oBAAoB,MAAM,+BAA+B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEvF,MAAM,MAAM,GAAG,oBAAyD,CAAC;AAEzE,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,YAAoB,EACpB,aAA0B;IAE1B,MAAM,WAAW,GAAwB,EAAE,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;QACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEpD,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,CAAC,IAAI,CAAC;gBACf,cAAc,EAAE,KAAK,CAAC,EAAE;gBACxB,MAAM,EAAE,SAAS,YAAY,6BAA6B,KAAK,CAAC,IAAI,GAAG;gBACvE,UAAU,EAAE,kBAAkB;aAC/B,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,WAAW,CAAC,IAAI,CAAC;gBACf,cAAc,EAAE,KAAK,CAAC,EAAE;gBACxB,MAAM,EAAE,SAAS,YAAY,uBAAuB,KAAK,CAAC,IAAI,GAAG;gBACjE,UAAU,EAAE,iBAAiB;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ToolSlot, GroupStatus, GroupActivationResult } from '../../types/index.js';
|
|
2
|
+
export declare class GroupManager {
|
|
3
|
+
private readonly groups;
|
|
4
|
+
private readonly enabledState;
|
|
5
|
+
private readonly toolMap;
|
|
6
|
+
private readonly notifyChanged;
|
|
7
|
+
constructor(toolMap: Map<string, ToolSlot>, notifyChanged: () => void);
|
|
8
|
+
/** Load groups from config, restore persisted state, apply to toolMap. */
|
|
9
|
+
init(): Promise<void>;
|
|
10
|
+
/** Enable all tools in a group. */
|
|
11
|
+
enableGroup(groupId: string): GroupActivationResult;
|
|
12
|
+
/** Disable all tools in a group. */
|
|
13
|
+
disableGroup(groupId: string): GroupActivationResult;
|
|
14
|
+
/** Toggle a group based on its current state. */
|
|
15
|
+
toggleGroup(groupId: string): GroupActivationResult;
|
|
16
|
+
/** Return runtime status for all groups, including a virtual 'ungrouped' group. */
|
|
17
|
+
getGroupStatus(): GroupStatus[];
|
|
18
|
+
/** Return the group ID that contains the given tool, or undefined. */
|
|
19
|
+
getToolGroup(toolName: string): string | undefined;
|
|
20
|
+
/** Count of tools currently enabled in toolMap. */
|
|
21
|
+
getActiveToolCount(): number;
|
|
22
|
+
/** Total tools registered in toolMap. */
|
|
23
|
+
getTotalToolCount(): number;
|
|
24
|
+
/** Load persisted group states from disk. */
|
|
25
|
+
private loadPersistedState;
|
|
26
|
+
/** Write current group states to disk. */
|
|
27
|
+
private persistState;
|
|
28
|
+
/** Apply enabled/disabled state to all tools in a group via toolMap. */
|
|
29
|
+
private applyGroupState;
|
|
30
|
+
/** Build a successful GroupActivationResult for a given group and action. */
|
|
31
|
+
private buildActivationResult;
|
|
32
|
+
/** Build a failed GroupActivationResult (group not found or locked). */
|
|
33
|
+
private buildErrorResult;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=group-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-manager.d.ts","sourceRoot":"","sources":["../../../src/engine/tool-groups/group-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,QAAQ,EACR,WAAW,EACX,qBAAqB,EAGtB,MAAM,kBAAkB,CAAC;AAQ1B,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;gBAE/B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,EAAE,MAAM,IAAI;IAOrE,0EAA0E;IACpE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B,mCAAmC;IACnC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB;IAcnD,oCAAoC;IACpC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB;IAqBpD,iDAAiD;IACjD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB;IAuBnD,mFAAmF;IACnF,cAAc,IAAI,WAAW,EAAE;IAwC/B,sEAAsE;IACtE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASlD,mDAAmD;IACnD,kBAAkB,IAAI,MAAM;IAU5B,yCAAyC;IACzC,iBAAiB,IAAI,MAAM;IAI3B,6CAA6C;YAC/B,kBAAkB;IAUhC,0CAA0C;YAC5B,YAAY;IAY1B,wEAAwE;IACxE,OAAO,CAAC,eAAe;IAoBvB,6EAA6E;IAC7E,OAAO,CAAC,qBAAqB;IAgB7B,wEAAwE;IACxE,OAAO,CAAC,gBAAgB;CAezB"}
|