@sudosandwich/limps 2.8.0 → 2.9.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 (113) hide show
  1. package/README.md +86 -0
  2. package/dist/agent-parser.d.ts +6 -0
  3. package/dist/agent-parser.d.ts.map +1 -1
  4. package/dist/agent-parser.js +30 -0
  5. package/dist/agent-parser.js.map +1 -1
  6. package/dist/cli/config-cmd.d.ts +12 -0
  7. package/dist/cli/config-cmd.d.ts.map +1 -1
  8. package/dist/cli/config-cmd.js +143 -1
  9. package/dist/cli/config-cmd.js.map +1 -1
  10. package/dist/cli/json-output.d.ts +3 -0
  11. package/dist/cli/json-output.d.ts.map +1 -1
  12. package/dist/cli/json-output.js +3 -0
  13. package/dist/cli/json-output.js.map +1 -1
  14. package/dist/cli/list-agents.d.ts.map +1 -1
  15. package/dist/cli/list-agents.js +10 -4
  16. package/dist/cli/list-agents.js.map +1 -1
  17. package/dist/cli/next-task.d.ts +20 -3
  18. package/dist/cli/next-task.d.ts.map +1 -1
  19. package/dist/cli/next-task.js +249 -34
  20. package/dist/cli/next-task.js.map +1 -1
  21. package/dist/cli/plan-repair.d.ts +26 -0
  22. package/dist/cli/plan-repair.d.ts.map +1 -0
  23. package/dist/cli/plan-repair.js +145 -0
  24. package/dist/cli/plan-repair.js.map +1 -0
  25. package/dist/commands/config/index.d.ts.map +1 -1
  26. package/dist/commands/config/index.js +31 -2
  27. package/dist/commands/config/index.js.map +1 -1
  28. package/dist/commands/config/list.d.ts.map +1 -1
  29. package/dist/commands/config/list.js +13 -3
  30. package/dist/commands/config/list.js.map +1 -1
  31. package/dist/commands/config/scoring.d.ts +13 -0
  32. package/dist/commands/config/scoring.d.ts.map +1 -0
  33. package/dist/commands/config/scoring.js +104 -0
  34. package/dist/commands/config/scoring.js.map +1 -0
  35. package/dist/commands/index.d.ts.map +1 -1
  36. package/dist/commands/index.js +1 -1
  37. package/dist/commands/index.js.map +1 -1
  38. package/dist/commands/list-agents.d.ts +1 -0
  39. package/dist/commands/list-agents.d.ts.map +1 -1
  40. package/dist/commands/list-agents.js +54 -15
  41. package/dist/commands/list-agents.js.map +1 -1
  42. package/dist/commands/list-plans.d.ts +1 -0
  43. package/dist/commands/list-plans.d.ts.map +1 -1
  44. package/dist/commands/list-plans.js +41 -16
  45. package/dist/commands/list-plans.js.map +1 -1
  46. package/dist/commands/next-task.d.ts +1 -0
  47. package/dist/commands/next-task.d.ts.map +1 -1
  48. package/dist/commands/next-task.js +61 -25
  49. package/dist/commands/next-task.js.map +1 -1
  50. package/dist/commands/reindex.d.ts +12 -0
  51. package/dist/commands/reindex.d.ts.map +1 -0
  52. package/dist/commands/reindex.js +64 -0
  53. package/dist/commands/reindex.js.map +1 -0
  54. package/dist/commands/repair-plans.d.ts +16 -0
  55. package/dist/commands/repair-plans.d.ts.map +1 -0
  56. package/dist/commands/repair-plans.js +141 -0
  57. package/dist/commands/repair-plans.js.map +1 -0
  58. package/dist/commands/score-all.d.ts +15 -0
  59. package/dist/commands/score-all.d.ts.map +1 -0
  60. package/dist/commands/score-all.js +96 -0
  61. package/dist/commands/score-all.js.map +1 -0
  62. package/dist/commands/score-task.d.ts +15 -0
  63. package/dist/commands/score-task.d.ts.map +1 -0
  64. package/dist/commands/score-task.js +104 -0
  65. package/dist/commands/score-task.js.map +1 -0
  66. package/dist/commands/serve.d.ts +1 -0
  67. package/dist/commands/serve.d.ts.map +1 -1
  68. package/dist/commands/serve.js +6 -3
  69. package/dist/commands/serve.js.map +1 -1
  70. package/dist/commands/status.d.ts +1 -0
  71. package/dist/commands/status.d.ts.map +1 -1
  72. package/dist/commands/status.js +68 -20
  73. package/dist/commands/status.js.map +1 -1
  74. package/dist/components/NextTask.d.ts.map +1 -1
  75. package/dist/components/NextTask.js +2 -1
  76. package/dist/components/NextTask.js.map +1 -1
  77. package/dist/config.d.ts +17 -2
  78. package/dist/config.d.ts.map +1 -1
  79. package/dist/config.js +136 -5
  80. package/dist/config.js.map +1 -1
  81. package/dist/graph/schema.d.ts +4 -0
  82. package/dist/graph/schema.d.ts.map +1 -0
  83. package/dist/graph/schema.js +77 -0
  84. package/dist/graph/schema.js.map +1 -0
  85. package/dist/graph/storage.d.ts +26 -0
  86. package/dist/graph/storage.d.ts.map +1 -0
  87. package/dist/graph/storage.js +441 -0
  88. package/dist/graph/storage.js.map +1 -0
  89. package/dist/graph/types.d.ts +32 -0
  90. package/dist/graph/types.d.ts.map +1 -0
  91. package/dist/graph/types.js +11 -0
  92. package/dist/graph/types.js.map +1 -0
  93. package/dist/indexer.d.ts +6 -0
  94. package/dist/indexer.d.ts.map +1 -1
  95. package/dist/indexer.js +11 -0
  96. package/dist/indexer.js.map +1 -1
  97. package/dist/tools/index.d.ts +3 -1
  98. package/dist/tools/index.d.ts.map +1 -1
  99. package/dist/tools/index.js +112 -22
  100. package/dist/tools/index.js.map +1 -1
  101. package/dist/tools/process-docs.d.ts.map +1 -1
  102. package/dist/tools/process-docs.js +10 -1
  103. package/dist/tools/process-docs.js.map +1 -1
  104. package/dist/tools/update-task-status.d.ts +1 -1
  105. package/dist/utils/cli-help.d.ts +32 -0
  106. package/dist/utils/cli-help.d.ts.map +1 -0
  107. package/dist/utils/cli-help.js +79 -0
  108. package/dist/utils/cli-help.js.map +1 -0
  109. package/dist/utils/config-resolver.d.ts +8 -0
  110. package/dist/utils/config-resolver.d.ts.map +1 -1
  111. package/dist/utils/config-resolver.js +14 -0
  112. package/dist/utils/config-resolver.js.map +1 -1
  113. package/package.json +1 -1
@@ -0,0 +1,104 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Text } from 'ink';
3
+ import { useEffect } from 'react';
4
+ import { z } from 'zod';
5
+ import { getScoredTaskById } from '../cli/next-task.js';
6
+ import { loadConfig } from '../config.js';
7
+ import { resolveConfigPath, resolveProjectConfigPath } from '../utils/config-resolver.js';
8
+ import { buildHelpOutput, getProjectLlmHints, getProjectTipLine } from '../utils/cli-help.js';
9
+ import { isJsonMode, outputJson, wrapSuccess, wrapError } from '../cli/json-output.js';
10
+ export const description = 'Show scoring breakdown for a task';
11
+ export const args = z.tuple([z.string().describe('task id (e.g., 0004-feature#001)').optional()]);
12
+ export const options = z.object({
13
+ config: z.string().optional().describe('Path to config file'),
14
+ project: z.string().optional().describe('Registered project name'),
15
+ json: z.boolean().optional().describe('Output as JSON'),
16
+ });
17
+ export default function ScoreTaskCommand({ args, options }) {
18
+ const [taskId] = args;
19
+ const help = buildHelpOutput({
20
+ usage: 'limps score-task <task-id> [options]',
21
+ arguments: ['task-id Task ID (e.g., "0004-feature#001")'],
22
+ options: [
23
+ '--config Path to config file',
24
+ '--project Registered project name',
25
+ '--json Output as JSON',
26
+ ],
27
+ examples: [
28
+ 'limps score-task 0004-feature#001',
29
+ 'limps score-task 0004-feature#001 --project runi-planning-docs',
30
+ 'limps score-task 0004-feature#001 --json',
31
+ ],
32
+ tips: [getProjectTipLine()],
33
+ llmHints: getProjectLlmHints(),
34
+ });
35
+ const jsonMode = isJsonMode(options);
36
+ useEffect(() => {
37
+ if (!jsonMode) {
38
+ return;
39
+ }
40
+ const timer = setTimeout(() => {
41
+ try {
42
+ if (!taskId) {
43
+ outputJson(wrapError('Task ID is required', { code: 'MISSING_TASK_ID', help: help.meta }), 1);
44
+ }
45
+ const configPath = options.project
46
+ ? resolveProjectConfigPath(options.project)
47
+ : resolveConfigPath(options.config);
48
+ const config = loadConfig(configPath);
49
+ const result = getScoredTaskById(config, taskId, { suppressWarnings: true });
50
+ if ('error' in result) {
51
+ outputJson(wrapError(result.error, { code: 'SCORE_TASK_ERROR' }), 1);
52
+ }
53
+ outputJson(wrapSuccess(result));
54
+ }
55
+ catch (error) {
56
+ outputJson(wrapError(error instanceof Error ? error.message : String(error), {
57
+ code: 'SCORE_TASK_ERROR',
58
+ }), 1);
59
+ }
60
+ }, 0);
61
+ return () => clearTimeout(timer);
62
+ }, [help.meta, jsonMode, options.config, options.project, taskId]);
63
+ if (jsonMode) {
64
+ return null;
65
+ }
66
+ if (!taskId) {
67
+ return _jsx(Text, { children: help.text });
68
+ }
69
+ try {
70
+ const configPath = options.project
71
+ ? resolveProjectConfigPath(options.project)
72
+ : resolveConfigPath(options.config);
73
+ const config = loadConfig(configPath);
74
+ const result = getScoredTaskById(config, taskId);
75
+ if ('error' in result) {
76
+ return _jsx(Text, { color: "red", children: result.error });
77
+ }
78
+ const { planName, task } = result;
79
+ const lines = [];
80
+ lines.push(`Task Score (${planName}):`);
81
+ lines.push('');
82
+ lines.push(` Task ID: ${task.taskId}`);
83
+ lines.push(` Title: ${task.title}`);
84
+ lines.push('');
85
+ lines.push('Score Breakdown:');
86
+ lines.push(` Total Score: ${task.totalScore}`);
87
+ lines.push(` Dependencies: ${task.dependencyScore}`);
88
+ lines.push(` Priority: ${task.priorityScore}`);
89
+ lines.push(` Workload: ${task.workloadScore}`);
90
+ if (task.biasScore !== 0) {
91
+ lines.push(` Bias: ${task.biasScore > 0 ? '+' : ''}${task.biasScore}`);
92
+ }
93
+ lines.push('');
94
+ lines.push('Scoring Reasons:');
95
+ for (const reason of task.reasons) {
96
+ lines.push(` - ${reason}`);
97
+ }
98
+ return _jsx(Text, { children: lines.join('\n') });
99
+ }
100
+ catch (error) {
101
+ return _jsxs(Text, { color: "red", children: ["Error: ", error.message] });
102
+ }
103
+ }
104
+ //# sourceMappingURL=score-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-task.js","sourceRoot":"","sources":["../../src/commands/score-task.tsx"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  export declare const description = "Start the MCP server";
3
3
  export declare const options: z.ZodObject<{
4
4
  config: z.ZodOptional<z.ZodString>;
5
+ project: z.ZodOptional<z.ZodString>;
5
6
  }, z.core.$strip>;
6
7
  interface Props {
7
8
  options: z.infer<typeof options>;
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAElD,eAAO,MAAM,OAAO;;iBAElB,CAAC;AAEH,UAAU,KAAK;IACb,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,SAAS,CAaxE"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAElD,eAAO,MAAM,OAAO;;;iBAGlB,CAAC;AAEH,UAAU,KAAK;IACb,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,SAAS,CAexE"}
@@ -1,9 +1,11 @@
1
1
  import { z } from 'zod';
2
2
  import { useEffect } from 'react';
3
3
  import { startMcpServer } from '../server-main.js';
4
+ import { resolveProjectConfigPath } from '../utils/config-resolver.js';
4
5
  export const description = 'Start the MCP server';
5
6
  export const options = z.object({
6
- config: z.string().optional().describe('Path to config file'),
7
+ config: z.string().optional().describe('Path to config file or project name'),
8
+ project: z.string().optional().describe('Registered project name'),
7
9
  });
8
10
  /**
9
11
  * MCP Server command.
@@ -15,11 +17,12 @@ export default function ServeCommand({ options }) {
15
17
  useEffect(() => {
16
18
  // All output goes to stderr, not stdout
17
19
  console.error('MCP Planning Server running on stdio');
18
- startMcpServer(options.config).catch((err) => {
20
+ const configPath = options.project ? resolveProjectConfigPath(options.project) : options.config;
21
+ startMcpServer(configPath).catch((err) => {
19
22
  console.error(`Server error: ${err.message}`);
20
23
  process.exit(1);
21
24
  });
22
- }, [options.config]);
25
+ }, [options.config, options.project]);
23
26
  // Return null - no stdout output allowed for MCP servers
24
27
  return null;
25
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CAC9D,CAAC,CAAC;AAMH;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,OAAO,EAAS;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,wCAAwC;QACxC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAEtD,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YAClD,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAErB,yDAAyD;IACzD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC7E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACnE,CAAC,CAAC;AAMH;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,OAAO,EAAS;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,wCAAwC;QACxC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAEtD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAEhG,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YAC9C,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtC,yDAAyD;IACzD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -4,6 +4,7 @@ export declare const description = "Show plan or agent status";
4
4
  export declare const args: z.ZodTuple<[z.ZodOptional<z.ZodString>], null>;
5
5
  export declare const options: z.ZodObject<{
6
6
  config: z.ZodOptional<z.ZodString>;
7
+ project: z.ZodOptional<z.ZodString>;
7
8
  json: z.ZodOptional<z.ZodBoolean>;
8
9
  agent: z.ZodOptional<z.ZodString>;
9
10
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,WAAW,8BAA8B,CAAC;AAEvD,eAAO,MAAM,IAAI,gDAA+D,CAAC;AAEjF,eAAO,MAAM,OAAO;;;;iBAOlB,CAAC;AAEH,UAAU,KAAK;IACb,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CAClC;AA6CD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,SAAS,CAyE/E"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,WAAW,8BAA8B,CAAC;AAEvD,eAAO,MAAM,IAAI,gDAA+D,CAAC;AAEjF,eAAO,MAAM,OAAO;;;;;iBAQlB,CAAC;AAEH,UAAU,KAAK;IACb,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CAClC;AA6CD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,SAAS,CA+F/E"}
@@ -4,15 +4,18 @@ import { Text } from 'ink';
4
4
  import { z } from 'zod';
5
5
  import { getPlanStatusSummary, getAgentStatusSummary } from '../cli/status.js';
6
6
  import { loadConfig } from '../config.js';
7
- import { resolveConfigPath } from '../utils/config-resolver.js';
7
+ import { resolveConfigPath, resolveProjectConfigPath } from '../utils/config-resolver.js';
8
+ import { buildHelpOutput, getProjectLlmHints, getProjectTipLine } from '../utils/cli-help.js';
8
9
  import { PlanStatus } from '../components/PlanStatus.js';
9
10
  import { AgentStatus } from '../components/AgentStatus.js';
10
11
  import { handleJsonOutput, isJsonMode, outputJson, wrapError } from '../cli/json-output.js';
12
+ import { useEffect } from 'react';
11
13
  import { resolveTaskId } from '../cli/task-resolver.js';
12
14
  export const description = 'Show plan or agent status';
13
15
  export const args = z.tuple([z.string().describe('plan id or name').optional()]);
14
16
  export const options = z.object({
15
17
  config: z.string().optional().describe('Path to config file'),
18
+ project: z.string().optional().describe('Registered project name'),
16
19
  json: z.boolean().optional().describe('Output as JSON'),
17
20
  agent: z
18
21
  .string()
@@ -48,35 +51,80 @@ function AgentStatusLoader({ agentId, planContext, config, }) {
48
51
  }
49
52
  export default function StatusCommand({ args, options }) {
50
53
  const [planId] = args;
51
- const configPath = resolveConfigPath(options.config);
54
+ const configPath = options.project
55
+ ? resolveProjectConfigPath(options.project)
56
+ : resolveConfigPath(options.config);
52
57
  const config = loadConfig(configPath);
58
+ const help = buildHelpOutput({
59
+ usage: 'limps status <plan> [options]',
60
+ arguments: ['plan Plan ID or name (e.g., "4" or "0004-feature-name")'],
61
+ options: [
62
+ '--config Path to config file',
63
+ '--project Registered project name',
64
+ '--json Output as JSON',
65
+ '--agent Show detailed status for specific agent',
66
+ ],
67
+ sections: [
68
+ {
69
+ title: 'Agent Status Examples',
70
+ lines: [
71
+ 'limps status --agent 0001#002',
72
+ 'limps status 0001 --agent 002',
73
+ 'limps status --agent 0001#002 --json',
74
+ ],
75
+ },
76
+ {
77
+ title: 'Plan Status Examples',
78
+ lines: ['limps status 4', 'limps status 0004-my-feature', 'limps status 4 --json'],
79
+ },
80
+ ],
81
+ tips: [getProjectTipLine()],
82
+ llmHints: getProjectLlmHints(),
83
+ });
84
+ const jsonMode = isJsonMode(options);
85
+ useEffect(() => {
86
+ if (!jsonMode) {
87
+ return;
88
+ }
89
+ const timer = setTimeout(() => {
90
+ try {
91
+ if (!planId) {
92
+ outputJson(wrapError('Plan ID is required', { code: 'MISSING_PLAN_ID', help: help.meta }), 1);
93
+ }
94
+ if (options.agent) {
95
+ const agentId = options.agent;
96
+ return handleJsonOutput(() => {
97
+ const resolvedId = resolveTaskId(agentId, {
98
+ plansPath: config.plansPath,
99
+ planContext: planId,
100
+ });
101
+ return getAgentStatusSummary(config, resolvedId);
102
+ }, 'AGENT_STATUS_ERROR');
103
+ }
104
+ return handleJsonOutput(() => getPlanStatusSummary(config, planId), 'STATUS_ERROR');
105
+ }
106
+ catch (error) {
107
+ outputJson(wrapError(error instanceof Error ? error.message : String(error), {
108
+ code: 'STATUS_ERROR',
109
+ }), 1);
110
+ }
111
+ }, 0);
112
+ return () => clearTimeout(timer);
113
+ }, [config, help.meta, jsonMode, options.agent, planId]);
53
114
  // Handle agent-specific status
54
115
  if (options.agent) {
55
116
  const agentId = options.agent;
56
- // Handle JSON output mode for agent status
57
- if (isJsonMode(options)) {
58
- return handleJsonOutput(() => {
59
- const resolvedId = resolveTaskId(agentId, {
60
- plansPath: config.plansPath,
61
- planContext: planId,
62
- });
63
- return getAgentStatusSummary(config, resolvedId);
64
- }, 'AGENT_STATUS_ERROR');
117
+ if (jsonMode) {
118
+ return null;
65
119
  }
66
120
  // Render agent status component
67
121
  return _jsx(AgentStatusLoader, { agentId: agentId, planContext: planId, config: config });
68
122
  }
69
- // Handle JSON output mode for plan status
70
- if (isJsonMode(options)) {
71
- if (!planId) {
72
- return outputJson(wrapError('Plan ID is required', { code: 'MISSING_PLAN_ID' }), 1);
73
- }
74
- return handleJsonOutput(() => {
75
- return getPlanStatusSummary(config, planId);
76
- }, 'STATUS_ERROR');
123
+ if (jsonMode) {
124
+ return null;
77
125
  }
78
126
  if (!planId) {
79
- return (_jsxs(Text, { children: [_jsx(Text, { color: "yellow", children: "Usage:" }), " limps status ", '<plan>', " [options]", '\n\n', _jsx(Text, { color: "cyan", children: "Arguments:" }), '\n', ' ', "plan Plan ID or name (e.g., \"4\" or \"0004-feature-name\")", '\n\n', _jsx(Text, { color: "cyan", children: "Options:" }), '\n', ' ', "--config Path to config file", '\n', ' ', "--json Output as JSON", '\n', ' ', "--agent Show detailed status for specific agent", '\n\n', _jsx(Text, { color: "cyan", children: "Agent Status Examples:" }), '\n', ' ', "limps status --agent 0001#002", '\n', ' ', "limps status 0001 --agent 002", '\n', ' ', "limps status --agent 0001#002 --json", '\n\n', _jsx(Text, { color: "cyan", children: "Plan Status Examples:" }), '\n', ' ', "limps status 4", '\n', ' ', "limps status 0004-my-feature", '\n', ' ', "limps status 4 --json"] }));
127
+ return _jsx(Text, { children: help.text });
80
128
  }
81
129
  try {
82
130
  const summary = getPlanStatusSummary(config, planId);
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NextTask.d.ts","sourceRoot":"","sources":["../../src/components/NextTask.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,UAAU,aAAa;IACrB,IAAI,EAAE,kBAAkB,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,aAAa,GAAG,KAAK,CAAC,SAAS,CA4DtF"}
1
+ {"version":3,"file":"NextTask.d.ts","sourceRoot":"","sources":["../../src/components/NextTask.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,UAAU,aAAa;IACrB,IAAI,EAAE,kBAAkB,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,aAAa,GAAG,KAAK,CAAC,SAAS,CAmEtF"}
@@ -6,6 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  import { Box, Text } from 'ink';
7
7
  import { getScoreColor, textColors } from '../theme/colors.js';
8
8
  export function NextTask({ task, otherAvailableTasks }) {
9
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Next Best Task:" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Task ID: " }), _jsx(Text, { bold: true, color: textColors.primary, children: task.taskId })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Title: " }), _jsx(Text, { bold: true, color: textColors.primary, children: task.title })] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, children: "Score Breakdown:" }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Total Score: " }), _jsxs(Text, { color: getScoreColor(task.totalScore, 100), bold: true, children: [task.totalScore, "/100"] })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Dependencies: " }), _jsxs(Text, { color: getScoreColor(task.dependencyScore, 40), children: [task.dependencyScore, "/40"] })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Priority: " }), _jsxs(Text, { color: getScoreColor(task.priorityScore, 30), children: [task.priorityScore, "/30"] })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Workload: " }), _jsxs(Text, { color: getScoreColor(task.workloadScore, 30), children: [task.workloadScore, "/30"] })] })] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, children: "Scoring Reasons:" }), _jsx(Box, { marginLeft: 2, flexDirection: "column", children: task.reasons.map((reason, index) => (_jsxs(Text, { color: textColors.primary, children: ["- ", reason] }, index))) })] }), otherAvailableTasks > 0 && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["Other available tasks: ", _jsx(Text, { color: textColors.primary, children: otherAvailableTasks })] }) }))] }));
9
+ const totalMax = task.weights.dependency + task.weights.priority + task.weights.workload;
10
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Next Best Task:" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Task ID: " }), _jsx(Text, { bold: true, color: textColors.primary, children: task.taskId })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Title: " }), _jsx(Text, { bold: true, color: textColors.primary, children: task.title })] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, children: "Score Breakdown:" }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Total Score: " }), _jsxs(Text, { color: getScoreColor(task.totalScore, totalMax), bold: true, children: [task.totalScore, "/", totalMax] })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Dependencies: " }), _jsxs(Text, { color: getScoreColor(task.dependencyScore, task.weights.dependency), children: [task.dependencyScore, "/", task.weights.dependency] })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Priority: " }), _jsxs(Text, { color: getScoreColor(task.priorityScore, task.weights.priority), children: [task.priorityScore, "/", task.weights.priority] })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Workload: " }), _jsxs(Text, { color: getScoreColor(task.workloadScore, task.weights.workload), children: [task.workloadScore, "/", task.weights.workload] })] })] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, children: "Scoring Reasons:" }), _jsx(Box, { marginLeft: 2, flexDirection: "column", children: task.reasons.map((reason, index) => (_jsxs(Text, { color: textColors.primary, children: ["- ", reason] }, index))) })] }), otherAvailableTasks > 0 && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["Other available tasks: ", _jsx(Text, { color: textColors.primary, children: otherAvailableTasks })] }) }))] }));
10
11
  }
11
12
  //# sourceMappingURL=NextTask.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NextTask.js","sourceRoot":"","sources":["../../src/components/NextTask.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAO/D,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAiB;IACnE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,sCAAuB,EACjC,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,gCAAiB,EAC/B,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,UAAU,CAAC,OAAO,YACjC,IAAI,CAAC,MAAM,GACP,IACH,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,8BAAe,EAC7B,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,UAAU,CAAC,OAAO,YACjC,IAAI,CAAC,KAAK,GACN,IACH,IACF,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,IAAI,uCAAwB,EAClC,MAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACxC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,oCAAqB,EACnC,MAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,IAAI,mBACnD,IAAI,CAAC,UAAU,YACX,IACH,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,qCAAsB,EACpC,MAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,aAAG,IAAI,CAAC,eAAe,WAAW,IAClF,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,iCAAkB,EAChC,MAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,aAAG,IAAI,CAAC,aAAa,WAAW,IAC9E,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,iCAAkB,EAChC,MAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,aAAG,IAAI,CAAC,aAAa,WAAW,IAC9E,IACF,IACF,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,IAAI,uCAAwB,EAClC,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,YACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CACnC,MAAC,IAAI,IAAa,KAAK,EAAE,UAAU,CAAC,OAAO,mBACtC,MAAM,KADA,KAAK,CAET,CACR,CAAC,GACE,IACF,EACL,mBAAmB,GAAG,CAAC,IAAI,CAC1B,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,8CACW,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,OAAO,YAAG,mBAAmB,GAAQ,IAC/E,GACH,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"NextTask.js","sourceRoot":"","sources":["../../src/components/NextTask.tsx"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -24,6 +24,15 @@ export interface ScoringBiases {
24
24
  BLOCKED?: number;
25
25
  };
26
26
  }
27
+ export type ScoringPreset = 'default' | 'quick-wins' | 'dependency-chain' | 'newest-first' | 'code-then-review';
28
+ /**
29
+ * Tool filtering configuration.
30
+ * Allowlist takes precedence over denylist when both are provided.
31
+ */
32
+ export interface ToolFilteringConfig {
33
+ allowlist?: string[];
34
+ denylist?: string[];
35
+ }
27
36
  /**
28
37
  * Server configuration interface.
29
38
  */
@@ -34,9 +43,11 @@ export interface ServerConfig {
34
43
  fileExtensions?: string[];
35
44
  dataPath: string;
36
45
  scoring: {
37
- weights: ScoringWeights;
38
- biases: ScoringBiases;
46
+ preset?: ScoringPreset;
47
+ weights: Partial<ScoringWeights>;
48
+ biases: Partial<ScoringBiases>;
39
49
  };
50
+ tools?: ToolFilteringConfig;
40
51
  extensions?: string[];
41
52
  }
42
53
  /**
@@ -59,6 +70,10 @@ export declare function getScoringWeights(config: ServerConfig): ScoringWeights;
59
70
  * Default scoring biases (initial config values).
60
71
  */
61
72
  export declare const DEFAULT_SCORING_BIASES: ScoringBiases;
73
+ export declare const SCORING_PRESETS: Record<ScoringPreset, {
74
+ weights: ScoringWeights;
75
+ biases: ScoringBiases;
76
+ }>;
62
77
  /**
63
78
  * Get scoring biases from config.
64
79
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QACP,OAAO,EAAE,cAAc,CAAC;QACxB,MAAM,EAAE,aAAa,CAAC;KACvB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAOxC;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAIrC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAEtE;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAAkB,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAEpE;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAkB1C;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAmG3D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,CA2CtE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAS9D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAEhE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,YAAY,GACZ,kBAAkB,GAClB,cAAc,GACd,kBAAkB,CAAC;AAEvB;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,aAAa,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QACjC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;KAChC,CAAC;IACF,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAOxC;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAIrC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAQtE;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAAkB,CAAC;AAExD,eAAO,MAAM,eAAe,EAAE,MAAM,CAClC,aAAa,EACb;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAsBnD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAgCpE;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAmB1C;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAoG3D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,CAmHtE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAS9D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAEhE"}
package/dist/config.js CHANGED
@@ -25,12 +25,40 @@ export const DEFAULT_SCORING_WEIGHTS = {
25
25
  * @returns Scoring weights
26
26
  */
27
27
  export function getScoringWeights(config) {
28
- return config.scoring.weights;
28
+ const presetKey = config.scoring.preset ?? 'default';
29
+ const preset = SCORING_PRESETS[presetKey] ?? SCORING_PRESETS.default;
30
+ return {
31
+ ...DEFAULT_SCORING_WEIGHTS,
32
+ ...preset.weights,
33
+ ...(config.scoring.weights ?? {}),
34
+ };
29
35
  }
30
36
  /**
31
37
  * Default scoring biases (initial config values).
32
38
  */
33
39
  export const DEFAULT_SCORING_BIASES = {};
40
+ export const SCORING_PRESETS = {
41
+ default: {
42
+ weights: DEFAULT_SCORING_WEIGHTS,
43
+ biases: {},
44
+ },
45
+ 'quick-wins': {
46
+ weights: { dependency: 20, priority: 20, workload: 60 },
47
+ biases: {},
48
+ },
49
+ 'dependency-chain': {
50
+ weights: { dependency: 60, priority: 20, workload: 20 },
51
+ biases: { statuses: { BLOCKED: 20 } },
52
+ },
53
+ 'newest-first': {
54
+ weights: { dependency: 30, priority: 40, workload: 30 },
55
+ biases: {},
56
+ },
57
+ 'code-then-review': {
58
+ weights: DEFAULT_SCORING_WEIGHTS,
59
+ biases: { personas: { coder: 10, reviewer: -10 } },
60
+ },
61
+ };
34
62
  /**
35
63
  * Get scoring biases from config.
36
64
  *
@@ -38,7 +66,35 @@ export const DEFAULT_SCORING_BIASES = {};
38
66
  * @returns Scoring biases
39
67
  */
40
68
  export function getScoringBiases(config) {
41
- return config.scoring.biases;
69
+ const biases = config.scoring.biases;
70
+ const presetKey = config.scoring.preset ?? 'default';
71
+ const preset = SCORING_PRESETS[presetKey] ?? SCORING_PRESETS.default;
72
+ const mergedPlans = {
73
+ ...(DEFAULT_SCORING_BIASES.plans ?? {}),
74
+ ...(preset.biases.plans ?? {}),
75
+ ...(biases.plans ?? {}),
76
+ };
77
+ const mergedPersonas = {
78
+ ...(DEFAULT_SCORING_BIASES.personas ?? {}),
79
+ ...(preset.biases.personas ?? {}),
80
+ ...(biases.personas ?? {}),
81
+ };
82
+ const mergedStatuses = {
83
+ ...(DEFAULT_SCORING_BIASES.statuses ?? {}),
84
+ ...(preset.biases.statuses ?? {}),
85
+ ...(biases.statuses ?? {}),
86
+ };
87
+ const merged = {};
88
+ if (Object.keys(mergedPlans).length > 0) {
89
+ merged.plans = mergedPlans;
90
+ }
91
+ if (Object.keys(mergedPersonas).length > 0) {
92
+ merged.personas = mergedPersonas;
93
+ }
94
+ if (Object.keys(mergedStatuses).length > 0) {
95
+ merged.statuses = mergedStatuses;
96
+ }
97
+ return merged;
42
98
  }
43
99
  /**
44
100
  * Default debounce delay for file watching (ms).
@@ -58,6 +114,7 @@ const DEFAULT_CONFIG = {
58
114
  weights: DEFAULT_SCORING_WEIGHTS,
59
115
  biases: DEFAULT_SCORING_BIASES,
60
116
  },
117
+ tools: undefined,
61
118
  extensions: undefined,
62
119
  };
63
120
  /**
@@ -170,6 +227,7 @@ export function loadConfig(configPath) {
170
227
  fileExtensions: typedConfig.fileExtensions,
171
228
  dataPath: resolvePath(typedConfig.dataPath || DEFAULT_CONFIG.dataPath),
172
229
  scoring,
230
+ tools: typedConfig.tools,
173
231
  extensions: typedConfig.extensions,
174
232
  };
175
233
  // Preserve extension-specific config keys at top level.
@@ -210,6 +268,22 @@ export function validateConfig(config) {
210
268
  return false;
211
269
  }
212
270
  }
271
+ if (c.tools !== undefined) {
272
+ if (typeof c.tools !== 'object' || c.tools === null) {
273
+ return false;
274
+ }
275
+ const tools = c.tools;
276
+ if (tools.allowlist !== undefined) {
277
+ if (!Array.isArray(tools.allowlist) || !tools.allowlist.every((t) => typeof t === 'string')) {
278
+ return false;
279
+ }
280
+ }
281
+ if (tools.denylist !== undefined) {
282
+ if (!Array.isArray(tools.denylist) || !tools.denylist.every((t) => typeof t === 'string')) {
283
+ return false;
284
+ }
285
+ }
286
+ }
213
287
  if (!c.scoring || typeof c.scoring !== 'object') {
214
288
  return false;
215
289
  }
@@ -217,11 +291,68 @@ export function validateConfig(config) {
217
291
  if (!scoring.weights || !scoring.biases) {
218
292
  return false;
219
293
  }
220
- if (typeof scoring.weights.dependency !== 'number' ||
221
- typeof scoring.weights.priority !== 'number' ||
222
- typeof scoring.weights.workload !== 'number') {
294
+ if (scoring.preset !== undefined) {
295
+ const presets = new Set([
296
+ 'default',
297
+ 'quick-wins',
298
+ 'dependency-chain',
299
+ 'newest-first',
300
+ 'code-then-review',
301
+ ]);
302
+ if (!presets.has(scoring.preset)) {
303
+ return false;
304
+ }
305
+ }
306
+ if (scoring.weights.dependency !== undefined && typeof scoring.weights.dependency !== 'number') {
307
+ return false;
308
+ }
309
+ if (scoring.weights.priority !== undefined && typeof scoring.weights.priority !== 'number') {
310
+ return false;
311
+ }
312
+ if (scoring.weights.workload !== undefined && typeof scoring.weights.workload !== 'number') {
223
313
  return false;
224
314
  }
315
+ if (scoring.biases.plans !== undefined) {
316
+ if (typeof scoring.biases.plans !== 'object' || scoring.biases.plans === null) {
317
+ return false;
318
+ }
319
+ if (!Object.values(scoring.biases.plans).every((value) => typeof value === 'number')) {
320
+ return false;
321
+ }
322
+ }
323
+ if (scoring.biases.personas !== undefined) {
324
+ if (typeof scoring.biases.personas !== 'object' || scoring.biases.personas === null) {
325
+ return false;
326
+ }
327
+ const personas = scoring.biases.personas;
328
+ if (personas.coder !== undefined && typeof personas.coder !== 'number') {
329
+ return false;
330
+ }
331
+ if (personas.reviewer !== undefined && typeof personas.reviewer !== 'number') {
332
+ return false;
333
+ }
334
+ if (personas.pm !== undefined && typeof personas.pm !== 'number') {
335
+ return false;
336
+ }
337
+ if (personas.customer !== undefined && typeof personas.customer !== 'number') {
338
+ return false;
339
+ }
340
+ }
341
+ if (scoring.biases.statuses !== undefined) {
342
+ if (typeof scoring.biases.statuses !== 'object' || scoring.biases.statuses === null) {
343
+ return false;
344
+ }
345
+ const statuses = scoring.biases.statuses;
346
+ if (statuses.GAP !== undefined && typeof statuses.GAP !== 'number') {
347
+ return false;
348
+ }
349
+ if (statuses.WIP !== undefined && typeof statuses.WIP !== 'number') {
350
+ return false;
351
+ }
352
+ if (statuses.BLOCKED !== undefined && typeof statuses.BLOCKED !== 'number') {
353
+ return false;
354
+ }
355
+ }
225
356
  return true;
226
357
  }
227
358
  /**