@njeybe/nativ 2.4.1 → 2.5.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 (139) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +26 -0
  3. package/dist/commands/db/db-formatter.d.ts +5 -0
  4. package/dist/commands/db/db-formatter.js +116 -0
  5. package/dist/commands/db/db-introspect.d.ts +11 -0
  6. package/dist/commands/db/db-introspect.js +84 -0
  7. package/dist/commands/db.js +4 -206
  8. package/dist/commands/profile.d.ts +3 -0
  9. package/dist/commands/profile.js +39 -0
  10. package/dist/commands/task/task-add.d.ts +11 -0
  11. package/dist/commands/task/task-add.js +169 -0
  12. package/dist/commands/task/task-common.d.ts +57 -0
  13. package/dist/commands/task/task-common.js +45 -0
  14. package/dist/commands/task/task-escalate.d.ts +7 -0
  15. package/dist/commands/task/task-escalate.js +119 -0
  16. package/dist/commands/task/task-lifecycle.d.ts +5 -0
  17. package/dist/commands/task/task-lifecycle.js +252 -0
  18. package/dist/commands/task/task-query.d.ts +10 -0
  19. package/dist/commands/task/task-query.js +269 -0
  20. package/dist/commands/task.d.ts +9 -87
  21. package/dist/commands/task.js +8 -850
  22. package/dist/commands/triage/triage-store.d.ts +56 -0
  23. package/dist/commands/triage/triage-store.js +108 -0
  24. package/dist/commands/triage/triage-ui.d.ts +14 -0
  25. package/dist/commands/triage/triage-ui.js +104 -0
  26. package/dist/commands/triage.d.ts +3 -52
  27. package/dist/commands/triage.js +8 -216
  28. package/dist/core/enforcement.d.ts +1 -0
  29. package/dist/core/enforcement.js +19 -0
  30. package/dist/core/human-gate.d.ts +2 -1
  31. package/dist/core/human-gate.js +9 -2
  32. package/dist/core/profiles.d.ts +14 -0
  33. package/dist/core/profiles.js +82 -0
  34. package/dist/core/setup/config-merger.d.ts +59 -0
  35. package/dist/core/setup/config-merger.js +107 -0
  36. package/dist/core/setup/session-context.d.ts +4 -0
  37. package/dist/core/setup/session-context.js +65 -0
  38. package/dist/core/setup/setup-planner.d.ts +14 -0
  39. package/dist/core/setup/setup-planner.js +180 -0
  40. package/dist/core/setup/template-planner.d.ts +8 -0
  41. package/dist/core/setup/template-planner.js +32 -0
  42. package/dist/core/setup/types.d.ts +65 -0
  43. package/dist/core/setup/types.js +55 -0
  44. package/dist/core/setup-assets.d.ts +8 -119
  45. package/dist/core/setup-assets.js +7 -437
  46. package/dist/core/tier1-liaison.d.ts +2 -0
  47. package/dist/core/tier1-liaison.js +64 -3
  48. package/dist/core/verifier/executor.d.ts +5 -0
  49. package/dist/core/verifier/executor.js +62 -0
  50. package/dist/core/verifier/phases.d.ts +5 -0
  51. package/dist/core/verifier/phases.js +71 -0
  52. package/dist/core/verifier/task-verifier.d.ts +37 -0
  53. package/dist/core/verifier/task-verifier.js +233 -0
  54. package/dist/core/verifier/types.d.ts +51 -0
  55. package/dist/core/verifier/types.js +1 -0
  56. package/dist/core/verifier.d.ts +5 -93
  57. package/dist/core/verifier.js +5 -359
  58. package/dist/db/introspector.js +59 -59
  59. package/dist/governor/evaluator.d.ts +4 -64
  60. package/dist/governor/evaluator.js +21 -686
  61. package/dist/governor/patch-applier.d.ts +8 -0
  62. package/dist/governor/patch-applier.js +121 -0
  63. package/dist/governor/self-healing.d.ts +24 -0
  64. package/dist/governor/self-healing.js +351 -0
  65. package/dist/governor/test-integrity.d.ts +41 -0
  66. package/dist/governor/test-integrity.js +237 -0
  67. package/dist/index.js +8 -0
  68. package/dist/mcp/capture.d.ts +4 -0
  69. package/dist/mcp/capture.js +33 -0
  70. package/dist/mcp/resources.d.ts +39 -0
  71. package/dist/mcp/resources.js +44 -0
  72. package/dist/mcp/server.d.ts +11 -0
  73. package/dist/mcp/server.js +14 -89
  74. package/dist/mcp/tools.d.ts +1 -0
  75. package/dist/mcp/tools.js +1 -0
  76. package/dist/runner/agent-supervisor.d.ts +8 -302
  77. package/dist/runner/agent-supervisor.js +41 -1030
  78. package/dist/runner/cli-config.d.ts +84 -0
  79. package/dist/runner/cli-config.js +215 -0
  80. package/dist/runner/native-driver.d.ts +18 -0
  81. package/dist/runner/native-driver.js +208 -0
  82. package/dist/runner/native-engine.d.ts +27 -0
  83. package/dist/runner/native-engine.js +184 -0
  84. package/dist/runner/native-tools.d.ts +31 -0
  85. package/dist/runner/native-tools.js +241 -0
  86. package/dist/runner/process-utils.d.ts +12 -0
  87. package/dist/runner/process-utils.js +96 -0
  88. package/dist/runner/run-lifecycle.d.ts +6 -0
  89. package/dist/runner/run-lifecycle.js +42 -0
  90. package/dist/runner/types.d.ts +215 -0
  91. package/dist/runner/types.js +41 -0
  92. package/dist/scanner/detector.js +42 -663
  93. package/dist/scanner/detectors/ecosystem-detector.d.ts +16 -0
  94. package/dist/scanner/detectors/ecosystem-detector.js +354 -0
  95. package/dist/scanner/detectors/orm-detector.d.ts +5 -0
  96. package/dist/scanner/detectors/orm-detector.js +59 -0
  97. package/dist/scanner/detectors/workspace-detector.d.ts +19 -0
  98. package/dist/scanner/detectors/workspace-detector.js +266 -0
  99. package/dist/server/cli-runner.d.ts +15 -0
  100. package/dist/server/cli-runner.js +43 -0
  101. package/dist/server/event-hub.d.ts +42 -0
  102. package/dist/server/event-hub.js +169 -0
  103. package/dist/server/http-utils.d.ts +15 -0
  104. package/dist/server/http-utils.js +56 -0
  105. package/dist/server/plan-utils.d.ts +9 -0
  106. package/dist/server/plan-utils.js +31 -0
  107. package/dist/server/routes/db-routes.d.ts +57 -0
  108. package/dist/server/routes/db-routes.js +484 -0
  109. package/dist/server/routes/task-routes.d.ts +266 -0
  110. package/dist/server/routes/task-routes.js +285 -0
  111. package/dist/server/routes/telemetry-routes.d.ts +128 -0
  112. package/dist/server/routes/telemetry-routes.js +179 -0
  113. package/dist/server/routes/triage-routes.d.ts +81 -0
  114. package/dist/server/routes/triage-routes.js +244 -0
  115. package/dist/server/routes/worktree-routes.d.ts +31 -0
  116. package/dist/server/routes/worktree-routes.js +144 -0
  117. package/dist/server/studio-server.d.ts +4 -11
  118. package/dist/server/studio-server.js +34 -1578
  119. package/dist/server/studio-ui/shell/pipeline-state.js +2 -0
  120. package/dist/server/studio-ui/shell/triage.js +10 -0
  121. package/package.json +2 -2
  122. package/plugin/.claude-plugin/plugin.json +1 -1
  123. package/plugin/agents/architect.md +4 -2
  124. package/plugin/agents/verifier.md +1 -1
  125. package/plugin/agents/worker.md +7 -4
  126. package/plugin/skills/nativ/SKILL.md +1 -0
  127. package/templates/.claudeignore +62 -45
  128. package/templates/AGENTS.md +1 -0
  129. package/templates/CLAUDE.md +13 -0
  130. package/templates/claude-agents/architect.md +4 -2
  131. package/templates/claude-agents/verifier.md +1 -1
  132. package/templates/claude-agents/worker.md +7 -4
  133. package/templates/dot-ai/api_contracts.json +66 -66
  134. package/templates/dot-ai/context.md +38 -38
  135. package/templates/dot-ai/db_schema.json +39 -39
  136. package/dist/commands/session.d.ts +0 -22
  137. package/dist/commands/session.js +0 -106
  138. package/dist/core/session-memory.d.ts +0 -42
  139. package/dist/core/session-memory.js +0 -121
@@ -0,0 +1,269 @@
1
+ import pc from 'picocolors';
2
+ import path from 'node:path';
3
+ import { loadPlan, withPlanLock } from '../../core/lock-manager.js';
4
+ import { resolveSpecSlices } from '../../core/spec-slices.js';
5
+ import { resolveWorkerModel } from '../../core/model-routing.js';
6
+ import { learningsForTask } from '../../core/learnings.js';
7
+ import { taskEscalationHistory } from '../../governor/index.js';
8
+ import { getPlanPath, getRoleGuide, getRecommendedContractSlice } from './task-common.js';
9
+ export async function runTaskList(targetDirArg, options = {}) {
10
+ const { planPath } = getPlanPath(targetDirArg);
11
+ const plan = loadPlan(planPath);
12
+ if (!plan) {
13
+ process.exitCode = 1;
14
+ return;
15
+ }
16
+ const completedTaskIds = new Set();
17
+ for (const m of plan.milestones) {
18
+ for (const t of m.tasks) {
19
+ if (t.status === 'completed') {
20
+ completedTaskIds.add(t.id);
21
+ }
22
+ }
23
+ }
24
+ const results = [];
25
+ for (const m of plan.milestones) {
26
+ if (options.milestone && m.id !== options.milestone && !m.name.toLowerCase().includes(options.milestone.toLowerCase())) {
27
+ continue;
28
+ }
29
+ for (const t of m.tasks) {
30
+ const deps = t.dependencies || [];
31
+ const depsSatisfied = deps.every((d) => completedTaskIds.has(d));
32
+ const isAvailable = (t.status === 'pending' || t.status === 'in_progress') && depsSatisfied;
33
+ if (options.available && !isAvailable) {
34
+ continue;
35
+ }
36
+ if (options.status && t.status !== options.status) {
37
+ continue;
38
+ }
39
+ if (options.fastPath && t.fastPath !== true && m.fastPath !== true) {
40
+ continue;
41
+ }
42
+ results.push({
43
+ task: t,
44
+ milestoneId: m.id,
45
+ milestoneName: m.name,
46
+ isAvailable,
47
+ });
48
+ }
49
+ }
50
+ if (options.json) {
51
+ const jsonOutput = results.map(({ task, milestoneId, milestoneName, isAvailable }) => ({
52
+ ...task,
53
+ milestoneId,
54
+ milestoneName,
55
+ isAvailable,
56
+ roleGuide: getRoleGuide(task.assignedSubagent),
57
+ contractSlice: getRecommendedContractSlice(task.assignedSubagent),
58
+ }));
59
+ console.log(JSON.stringify(jsonOutput, null, 2));
60
+ return;
61
+ }
62
+ console.log(pc.bold(pc.cyan(`\n📋 nativ Tasks: ${plan.projectName}`)));
63
+ console.log(pc.dim(`Overall Status: ${plan.overallStatus.toUpperCase()} | Active Milestone: ${plan.activeMilestoneId}\n`));
64
+ if (results.length === 0) {
65
+ console.log(pc.yellow(' No tasks match the specified filters.\n'));
66
+ return;
67
+ }
68
+ const grouped = new Map();
69
+ for (const item of results) {
70
+ const key = `[${item.milestoneId}] ${item.milestoneName}`;
71
+ if (!grouped.has(key)) {
72
+ grouped.set(key, []);
73
+ }
74
+ grouped.get(key).push(item);
75
+ }
76
+ for (const [milestoneTitle, items] of grouped.entries()) {
77
+ console.log(pc.bold(`🚩 Milestone ${milestoneTitle}`));
78
+ for (const { task: t, isAvailable } of items) {
79
+ let statusBadge = pc.gray('○ pending');
80
+ if (t.status === 'completed') {
81
+ statusBadge = pc.green('✔ completed');
82
+ }
83
+ else if (t.status === 'in_progress') {
84
+ statusBadge = pc.yellow('▶ in_progress');
85
+ }
86
+ else if (t.status === 'blocked') {
87
+ statusBadge = pc.red('✖ blocked');
88
+ }
89
+ const readyBadge = isAvailable && t.status === 'pending' ? pc.bgGreen(pc.black(' READY ')) + ' ' : '';
90
+ const fastBadge = t.fastPath ? pc.magenta('[fast path] ') : '';
91
+ console.log(` ${statusBadge} ${readyBadge}${fastBadge}${pc.bold(t.id)}: ${t.title}`);
92
+ const depText = t.dependencies && t.dependencies.length > 0 ? pc.dim(`deps: ${t.dependencies.join(', ')}`) : pc.dim('no deps');
93
+ const filesText = t.targetFiles && t.targetFiles.length > 0 ? pc.cyan(t.targetFiles.join(', ')) : pc.dim('none');
94
+ console.log(pc.dim(` Agent: `) + pc.magenta(`[${t.assignedSubagent}]`) + pc.dim(` | ${depText} | Files: ${filesText}`));
95
+ if (t.notes) {
96
+ console.log(pc.dim(` Note: `) + (t.status === 'blocked' ? pc.red(t.notes) : pc.dim(t.notes)));
97
+ }
98
+ }
99
+ console.log();
100
+ }
101
+ const completedCount = results.filter((r) => r.task.status === 'completed').length;
102
+ const inProgressCount = results.filter((r) => r.task.status === 'in_progress').length;
103
+ const pendingCount = results.filter((r) => r.task.status === 'pending').length;
104
+ const blockedCount = results.filter((r) => r.task.status === 'blocked').length;
105
+ console.log(pc.dim(`Showing ${results.length} tasks: `) +
106
+ pc.green(`${completedCount} completed`) + pc.dim(', ') +
107
+ pc.yellow(`${inProgressCount} in progress`) + pc.dim(', ') +
108
+ pc.gray(`${pendingCount} pending`) + pc.dim(', ') +
109
+ pc.red(`${blockedCount} blocked`) + '\n');
110
+ }
111
+ /** What a worker needs from a lesson; status and audit fields stay in .ai/learnings.json. */
112
+ function toTaskLearning({ id, insight, details, files }) {
113
+ return { id, insight, ...(details ? { details } : {}), ...(files ? { files } : {}) };
114
+ }
115
+ export async function runTaskNext(targetDirArg, options = {}) {
116
+ const { planPath } = getPlanPath(targetDirArg);
117
+ const plan = loadPlan(planPath);
118
+ if (!plan) {
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ const completedTaskIds = new Set();
123
+ for (const m of plan.milestones) {
124
+ for (const t of m.tasks) {
125
+ if (t.status === 'completed') {
126
+ completedTaskIds.add(t.id);
127
+ }
128
+ }
129
+ }
130
+ // ── Prioritize Fast-Path tasks ─────────────────────────────────────────────
131
+ let fastPathCandidate = null;
132
+ for (const m of plan.milestones) {
133
+ for (const t of m.tasks) {
134
+ if (t.fastPath) {
135
+ if (t.status === 'in_progress') {
136
+ fastPathCandidate = { task: t, milestone: m };
137
+ break;
138
+ }
139
+ if (t.status === 'pending') {
140
+ const deps = t.dependencies || [];
141
+ if (deps.every((depId) => completedTaskIds.has(depId))) {
142
+ if (!fastPathCandidate) {
143
+ fastPathCandidate = { task: t, milestone: m };
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ if (fastPathCandidate && fastPathCandidate.task.status === 'in_progress')
150
+ break;
151
+ }
152
+ let activeMilestone;
153
+ let targetTask = null;
154
+ if (fastPathCandidate) {
155
+ activeMilestone = fastPathCandidate.milestone;
156
+ targetTask = fastPathCandidate.task;
157
+ }
158
+ else {
159
+ activeMilestone = plan.milestones.find((m) => m.id === plan.activeMilestoneId);
160
+ if (!activeMilestone || activeMilestone.status === 'completed') {
161
+ activeMilestone = plan.milestones.find((m) => m.status !== 'completed');
162
+ if (activeMilestone) {
163
+ plan.activeMilestoneId = activeMilestone.id;
164
+ await withPlanLock(planPath, (p) => {
165
+ p.activeMilestoneId = activeMilestone.id;
166
+ });
167
+ }
168
+ }
169
+ if (!activeMilestone) {
170
+ if (options.json) {
171
+ console.log(JSON.stringify({ status: 'all_milestones_completed', activeTask: null }, null, 2));
172
+ }
173
+ else {
174
+ console.log(pc.bold(pc.green('\n🎉 All milestones and tasks are completed!\n')));
175
+ console.log(pc.dim('Run `nativ status` to inspect final project statistics.\n'));
176
+ }
177
+ return;
178
+ }
179
+ // 1. Look for in_progress task first
180
+ targetTask = activeMilestone.tasks.find((t) => t.status === 'in_progress') || null;
181
+ // 2. If none in progress, find first pending task whose dependencies are satisfied
182
+ if (!targetTask) {
183
+ targetTask = activeMilestone.tasks.find((t) => {
184
+ if (t.status !== 'pending')
185
+ return false;
186
+ const deps = t.dependencies || [];
187
+ return deps.every((depId) => completedTaskIds.has(depId));
188
+ }) || null;
189
+ }
190
+ // 3. If still none found, check if milestone has blocked tasks or waiting dependencies
191
+ if (!targetTask) {
192
+ const hasBlocked = activeMilestone.tasks.some((t) => t.status === 'blocked');
193
+ if (options.json) {
194
+ console.log(JSON.stringify({
195
+ status: hasBlocked ? 'milestone_blocked' : 'waiting_dependencies',
196
+ milestoneId: activeMilestone.id,
197
+ milestoneName: activeMilestone.name,
198
+ activeTask: null,
199
+ }, null, 2));
200
+ }
201
+ else {
202
+ if (hasBlocked) {
203
+ console.log(pc.bold(pc.red(`\n✖ Milestone [${activeMilestone.id}] has blocked tasks.`)));
204
+ console.log(pc.yellow('Run `nativ status` to review blockers.\n'));
205
+ }
206
+ else {
207
+ console.log(pc.bold(pc.yellow(`\n⚠ Milestone [${activeMilestone.id}] has no immediately executable tasks due to unresolved dependencies.\n`)));
208
+ }
209
+ }
210
+ return;
211
+ }
212
+ }
213
+ const roleGuide = getRoleGuide(targetTask.assignedSubagent);
214
+ const contractSlice = getRecommendedContractSlice(targetTask.assignedSubagent);
215
+ const projectRoot = path.dirname(path.dirname(planPath));
216
+ const learnings = learningsForTask(projectRoot, targetTask);
217
+ const priorEscalations = taskEscalationHistory(projectRoot, targetTask.id);
218
+ if (options.json) {
219
+ const specResult = targetTask.specRefs?.length
220
+ ? resolveSpecSlices(projectRoot, targetTask.specRefs)
221
+ : null;
222
+ const recommendedModel = resolveWorkerModel(projectRoot, targetTask);
223
+ console.log(JSON.stringify({
224
+ status: 'ready',
225
+ milestoneId: activeMilestone.id,
226
+ milestoneName: activeMilestone.name,
227
+ task: {
228
+ ...targetTask,
229
+ roleGuide,
230
+ recommendedContractSlice: contractSlice,
231
+ ...(recommendedModel ? { recommendedModel } : {}),
232
+ ...(specResult ? { specSlices: specResult.slices, ...(specResult.warnings.length ? { specWarnings: specResult.warnings } : {}) } : {}),
233
+ ...(learnings.length ? { learnings: learnings.map(toTaskLearning) } : {}),
234
+ ...(priorEscalations.length ? { priorEscalations } : {}),
235
+ }
236
+ }, null, 2));
237
+ return;
238
+ }
239
+ const fastTag = targetTask.fastPath ? pc.cyan(' [FAST-PATH PRIORITY]') : '';
240
+ console.log(pc.bold(pc.cyan(`\n⚡ Next Executable Task in [${activeMilestone.id} - ${activeMilestone.name}]:`)) + fastTag);
241
+ console.log(pc.bold(`\n Task ID: `) + pc.yellow(targetTask.id));
242
+ console.log(pc.bold(` Title: `) + pc.white(targetTask.title));
243
+ console.log(pc.bold(` Status: `) + (targetTask.status === 'in_progress' ? pc.yellow('▶ in_progress') : pc.gray('○ pending')));
244
+ if (targetTask.fastPath) {
245
+ console.log(pc.bold(` Track: `) + pc.cyan('⚡ fast-path (prioritized execution)'));
246
+ }
247
+ console.log(pc.bold(` Assigned Role: `) + pc.magenta(`[${targetTask.assignedSubagent}]`) + pc.dim(` -> ${roleGuide}`));
248
+ console.log(pc.bold(` JIT Contract Slice:`) + pc.green(` ${contractSlice}`));
249
+ console.log(pc.bold(` Target Files: `) + (targetTask.targetFiles.length > 0 ? pc.cyan(targetTask.targetFiles.join(', ')) : pc.dim('none specified')));
250
+ console.log(pc.bold(` Verification Cmd: `) + pc.yellow(`\`${targetTask.verificationCommand || 'none'}\``));
251
+ if (targetTask.dependencies && targetTask.dependencies.length > 0) {
252
+ console.log(pc.bold(` Dependencies: `) + pc.dim(targetTask.dependencies.join(', ')));
253
+ }
254
+ if (targetTask.notes) {
255
+ console.log(pc.bold(` Notes: `) + pc.red(targetTask.notes));
256
+ }
257
+ for (const l of learnings) {
258
+ console.log(pc.bold(` Learning: `) + pc.white(`${l.id} ${l.insight}`));
259
+ }
260
+ for (const e of priorEscalations) {
261
+ const outcome = e.resolutionNotes ? ` -> ${e.resolutionNotes}` : '';
262
+ console.log(pc.bold(` Past escalation: `) + pc.white(`${e.id} ${e.status}: ${e.summary}${outcome}`));
263
+ }
264
+ console.log(pc.dim('\n─── Quick CLI Actions ──────────────────────────────────────────'));
265
+ console.log(pc.dim(' Start task: ') + pc.white(`nativ task start ${targetTask.id}`));
266
+ console.log(pc.dim(' Complete task:') + pc.white(`nativ task complete ${targetTask.id}`));
267
+ console.log(pc.dim(' Block task: ') + pc.white(`nativ task block ${targetTask.id} --reason "..."`));
268
+ console.log(pc.dim(' Escalate task:') + pc.white(`nativ task escalate ${targetTask.id} --type schema_flaw --details "..."\n`));
269
+ }
@@ -1,89 +1,11 @@
1
- import { MasterPlan, MasterPlanTask, SubagentType } from '../scanner/types.js';
2
- import { loadPlan, savePlan, withPlanLock } from '../core/lock-manager.js';
3
- export { loadPlan, savePlan, withPlanLock };
4
- export declare function getRoleGuide(assignedSubagent: SubagentType): string;
5
- export declare function getRecommendedContractSlice(assignedSubagent: SubagentType): string;
6
- export declare function runTaskList(targetDirArg?: string, options?: {
7
- available?: boolean;
8
- status?: string;
9
- milestone?: string;
10
- fastPath?: boolean;
11
- json?: boolean;
12
- }): Promise<void>;
13
- export declare function runTaskNext(targetDirArg?: string, options?: {
14
- json?: boolean;
15
- }): Promise<void>;
16
- export declare function runTaskStart(taskId: string, targetDirArg?: string): Promise<void | null>;
17
- export interface TaskUnlockOptions {
18
- /** Why scope enforcement is being lifted; kept in .nativ/unlocks.json. */
19
- reason?: string;
20
- /** Re-locks the task instead. */
21
- revoke?: boolean;
22
- }
23
1
  /**
24
- * Lifts role enforcement's target-file scope for one task (emergency escape hatch), or restores it with
25
- * --revoke. Contract and secret paths stay protected either way. Deliberately CLI-only and not an MCP
26
- * tool: an agent must not be able to remove its own guardrail.
2
+ * Barrel exports for task subcommands.
3
+ * Re-exports all public APIs to preserve backward compatibility.
27
4
  */
28
- export declare function runTaskUnlock(taskId: string, targetDirArg?: string, options?: TaskUnlockOptions): Promise<void>;
29
- export interface TaskCompleteOptions {
30
- notes?: string;
31
- skipVerify?: boolean;
32
- timeout?: number;
33
- }
34
- export declare function runTaskComplete(taskId: string, targetDirArg?: string, options?: TaskCompleteOptions): Promise<void>;
35
- export declare function runTaskBlock(taskId: string, reason: string, targetDirArg?: string): Promise<void | null>;
36
- export declare function runTaskEscalate(taskId: string, targetDirArg?: string, options?: {
37
- type?: string;
38
- details?: string;
39
- affected?: string;
40
- }): Promise<void | null>;
41
- export declare const FAST_PATH_MILESTONE_NAME = "Fast-Path Tasks";
42
- export declare function generateNextTaskId(plan: MasterPlan): string;
43
- export declare function generateNextMilestoneId(plan: MasterPlan): string;
44
- export interface TaskAddOptions {
45
- /** Milestone ID or name; defaults to the active milestone (or the fast-path milestone with fastPath). */
46
- milestone?: string;
47
- /** Assigned sub-agent (default backend). */
48
- agent?: string;
49
- /** Verification command run by the `task complete` gatekeeper. */
50
- verify?: string;
51
- /** Target files, comma-separated or as an array. */
52
- files?: string | string[];
53
- description?: string;
54
- fastPath?: boolean;
55
- /** Dependency task IDs, comma-separated or as an array. */
56
- deps?: string | string[];
57
- notes?: string;
58
- /** Spec refs, comma-separated or as an array. */
59
- specRefs?: string | string[];
60
- /** simple | standard | complex. */
61
- complexity?: string;
62
- /** "Done when" lines: an array, or one string with "|" separators. */
63
- accept?: string | string[];
64
- json?: boolean;
65
- }
66
- export interface TaskAddResult {
67
- task: MasterPlanTask;
68
- milestoneId: string;
69
- milestoneName: string;
70
- createdMilestone: boolean;
71
- reopenedMilestone: boolean;
72
- }
73
- /**
74
- * Appends a task to .ai/master_plan.json with an auto-incremented ID.
75
- * Routing: --milestone wins; otherwise fast-path tasks go to the fast-path milestone (created on
76
- * first use) and planned tasks to the active milestone. Completed milestones are reopened.
77
- */
78
- export declare function runTaskAdd(title: string, targetDirArg?: string, options?: TaskAddOptions): Promise<TaskAddResult | null>;
79
- export interface ProposePatchOptions {
80
- taskId: string;
81
- target: 'db_schema' | 'api_contracts';
82
- operation: 'ADD' | 'ALTER' | 'DROP' | 'RENAME';
83
- path: string;
84
- value?: any;
85
- reason: string;
86
- baseHash?: string;
87
- json?: boolean;
88
- }
89
- export declare function runTaskProposePatch(targetDirArg: string | undefined, options: ProposePatchOptions): Promise<import("../governor/types.js").GovernorVerdict>;
5
+ export { loadPlan, savePlan, withPlanLock } from '../core/lock-manager.js';
6
+ export { getRoleGuide, getRecommendedContractSlice, } from './task/task-common.js';
7
+ export type { TaskUnlockOptions, TaskCompleteOptions, TaskAddOptions, TaskAddResult, ProposePatchOptions, } from './task/task-common.js';
8
+ export { runTaskList, runTaskNext } from './task/task-query.js';
9
+ export { runTaskStart, runTaskComplete, runTaskBlock, runTaskUnlock, } from './task/task-lifecycle.js';
10
+ export { FAST_PATH_MILESTONE_NAME, generateNextTaskId, generateNextMilestoneId, runTaskAdd, } from './task/task-add.js';
11
+ export { runTaskEscalate, runTaskProposePatch, } from './task/task-escalate.js';