@godv61/dsh-task-engine 0.5.2 → 0.6.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/README.md +24 -3
- package/defaults/eng.json +19 -12
- package/hooks/commit-msg +11 -11
- package/lib/client.js +521 -20
- package/lib/client.js.map +4 -4
- package/lib/controller.d.ts +79 -3
- package/lib/controller.js +178 -3
- package/lib/controller.js.map +1 -1
- package/lib/engine.d.ts +11 -0
- package/lib/engine.js +22 -0
- package/lib/engine.js.map +1 -1
- package/lib/index.js +89 -3
- package/lib/index.js.map +1 -1
- package/package.json +3 -2
- package/rules/coding-conventions.md +7 -0
- package/rules/commit-conventions.md +6 -0
- package/rules/security-redlines.md +6 -0
- package/skills/code-commit/SKILL.md +13 -0
- package/skills/code-implement/SKILL.md +16 -0
- package/skills/code-review/SKILL.md +13 -0
- package/skills/code-verify/SKILL.md +13 -0
- package/skills/requirement-analysis/SKILL.md +16 -0
- package/skills/solution-design/SKILL.md +16 -0
package/lib/controller.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Browser-addressable Remote owner for the engineering workflow config. The
|
|
3
3
|
* `task-engine` namespace lets the browser settings page read and write one
|
|
4
|
-
* workspace's `.dsh/eng.json`,
|
|
5
|
-
*
|
|
4
|
+
* workspace's `.dsh/eng.json`, list the skill/rule catalogs (bundled + project +
|
|
5
|
+
* user), and create project/user skills and rules. The host validates every
|
|
6
|
+
* config write with the same engine that gates `dev_task` — an invalid config
|
|
7
|
+
* is never persisted.
|
|
6
8
|
*
|
|
7
9
|
* @module dsh-task-engine/controller
|
|
8
10
|
*/
|
|
9
11
|
import type { Context } from '@deepseek-ai/cordis';
|
|
10
12
|
import { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
11
13
|
import { type WorkflowConfig } from './engine.ts';
|
|
12
|
-
/** Merged workflow plus its validation state, returned by both
|
|
14
|
+
/** Merged workflow plus its validation state, returned by both config methods. */
|
|
13
15
|
export interface EngConfigView {
|
|
14
16
|
/** Whether `config` passes validation; `false` means `problems` names the defects. */
|
|
15
17
|
ok: boolean;
|
|
@@ -27,6 +29,54 @@ export interface EngWriteRequest {
|
|
|
27
29
|
/** Complete workflow config to validate and save. */
|
|
28
30
|
config: WorkflowConfig;
|
|
29
31
|
}
|
|
32
|
+
/** One skill in the mountable catalog. */
|
|
33
|
+
export interface SkillCatalogEntry {
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
source: string;
|
|
37
|
+
}
|
|
38
|
+
/** One rule in the mountable catalog. */
|
|
39
|
+
export interface RuleCatalogEntry {
|
|
40
|
+
name: string;
|
|
41
|
+
source: string;
|
|
42
|
+
}
|
|
43
|
+
/** `listSkills` result: every model-invocable skill, bundled + project + user. */
|
|
44
|
+
export interface SkillCatalog {
|
|
45
|
+
skills: SkillCatalogEntry[];
|
|
46
|
+
}
|
|
47
|
+
/** `listRules` result: every rule, bundled + project + user. */
|
|
48
|
+
export interface RuleCatalog {
|
|
49
|
+
rules: RuleCatalogEntry[];
|
|
50
|
+
}
|
|
51
|
+
/** Create a project- or user-level skill. */
|
|
52
|
+
export interface WriteSkillRequest {
|
|
53
|
+
name: string;
|
|
54
|
+
description: string;
|
|
55
|
+
whenToUse?: string;
|
|
56
|
+
content: string;
|
|
57
|
+
/** `project` writes under the workspace's `.dsh/skills`; `user` under `$DSH_HOME/skills`. */
|
|
58
|
+
level: 'project' | 'user';
|
|
59
|
+
/** Absolute workspace directory (required when level is `project`). */
|
|
60
|
+
path?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Create a project- or user-level rule. */
|
|
63
|
+
export interface WriteRuleRequest {
|
|
64
|
+
name: string;
|
|
65
|
+
content: string;
|
|
66
|
+
/** `project` writes under the workspace's `.dsh/rules`; `user` under `$DSH_HOME/rules`. */
|
|
67
|
+
level: 'project' | 'user';
|
|
68
|
+
/** Absolute workspace directory (required when level is `project`). */
|
|
69
|
+
path?: string;
|
|
70
|
+
}
|
|
71
|
+
/** Result of creating one skill or rule. */
|
|
72
|
+
export interface WriteResourceResult {
|
|
73
|
+
ok: boolean;
|
|
74
|
+
name: string;
|
|
75
|
+
/** Absolute path the file was written to. */
|
|
76
|
+
path: string;
|
|
77
|
+
/** Human-readable error when `ok` is false. */
|
|
78
|
+
error?: string;
|
|
79
|
+
}
|
|
30
80
|
/**
|
|
31
81
|
* Host owner of the `task-engine` Remote namespace. Discovered by the Typert
|
|
32
82
|
* Gateway through source-mode reflection (the `typertRemote` binding on the
|
|
@@ -47,6 +97,32 @@ export default class TaskEngineController extends TypertRemoteService {
|
|
|
47
97
|
* `problems` filled when validation fails (nothing is written then).
|
|
48
98
|
*/
|
|
49
99
|
write(request: EngWriteRequest): Promise<EngConfigView>;
|
|
100
|
+
/**
|
|
101
|
+
* List every skill available for stage binding: the live registry when present
|
|
102
|
+
* (bundled + project + user), otherwise the bundled skills alone.
|
|
103
|
+
* @param path - absolute workspace directory for project/user discovery.
|
|
104
|
+
* @returns the mountable skill catalog.
|
|
105
|
+
*/
|
|
106
|
+
listSkills(path: string): Promise<SkillCatalog>;
|
|
107
|
+
/**
|
|
108
|
+
* List every rule available for stage binding: bundled, project (`.dsh/rules`),
|
|
109
|
+
* and user (`$DSH_HOME/rules`).
|
|
110
|
+
* @param path - absolute workspace directory for the project level.
|
|
111
|
+
* @returns the mountable rule catalog.
|
|
112
|
+
*/
|
|
113
|
+
listRules(path: string): Promise<RuleCatalog>;
|
|
114
|
+
/**
|
|
115
|
+
* Create a project- or user-level skill by writing its SKILL.md.
|
|
116
|
+
* @param request - name, description, whenToUse, body, and target level.
|
|
117
|
+
* @returns the written resource path, or `ok: false` with an error.
|
|
118
|
+
*/
|
|
119
|
+
writeSkill(request: WriteSkillRequest): Promise<WriteResourceResult>;
|
|
120
|
+
/**
|
|
121
|
+
* Create a project- or user-level rule by writing its markdown file.
|
|
122
|
+
* @param request - name, body, and target level.
|
|
123
|
+
* @returns the written resource path, or `ok: false` with an error.
|
|
124
|
+
*/
|
|
125
|
+
writeRule(request: WriteRuleRequest): Promise<WriteResourceResult>;
|
|
50
126
|
/** Resolve the sandboxed fs service, failing loudly when the host lacks one. */
|
|
51
127
|
private fs;
|
|
52
128
|
}
|
package/lib/controller.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Browser-addressable Remote owner for the engineering workflow config. The
|
|
3
3
|
* `task-engine` namespace lets the browser settings page read and write one
|
|
4
|
-
* workspace's `.dsh/eng.json`,
|
|
5
|
-
*
|
|
4
|
+
* workspace's `.dsh/eng.json`, list the skill/rule catalogs (bundled + project +
|
|
5
|
+
* user), and create project/user skills and rules. The host validates every
|
|
6
|
+
* config write with the same engine that gates `dev_task` — an invalid config
|
|
7
|
+
* is never persisted.
|
|
6
8
|
*
|
|
7
9
|
* @module dsh-task-engine/controller
|
|
8
10
|
*/
|
|
@@ -40,25 +42,113 @@ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn,
|
|
|
40
42
|
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
41
43
|
done = true;
|
|
42
44
|
};
|
|
43
|
-
import { readFileSync } from 'node:fs';
|
|
45
|
+
import { mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
46
|
+
import { homedir } from 'node:os';
|
|
47
|
+
import { dirname, join } from 'node:path';
|
|
44
48
|
import { fileURLToPath } from 'node:url';
|
|
45
49
|
import { Remote, RemoteError, TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
46
50
|
import { loadWorkflow, validateWorkflow } from "./engine.js";
|
|
47
51
|
/** The one file this controller reads and writes, relative to a workspace directory. */
|
|
48
52
|
const ENGFILE = '.dsh/eng.json';
|
|
49
53
|
const DEFAULTS = JSON.parse(readFileSync(fileURLToPath(new URL('../defaults/eng.json', import.meta.url)), 'utf8'));
|
|
54
|
+
/** Bundled skill directory, scanned as a fallback list when no skill registry exists. */
|
|
55
|
+
const BUNDLED_SKILLS_DIR = fileURLToPath(new URL('../skills/', import.meta.url));
|
|
56
|
+
/** Bundled rule directory. */
|
|
57
|
+
const BUNDLED_RULES_DIR = fileURLToPath(new URL('../rules/', import.meta.url));
|
|
58
|
+
/** Resolve the harness home directory. */
|
|
59
|
+
function dshHome() {
|
|
60
|
+
return process.env.DSH_HOME ?? join(homedir(), '.dsh');
|
|
61
|
+
}
|
|
62
|
+
/** Normalize a resource name into a safe kebab-case identifier. */
|
|
63
|
+
function sanitizeName(raw) {
|
|
64
|
+
const cleaned = raw.trim().toLowerCase().replace(/[^0-9a-z-]+/g, '-').replace(/^-+|-+$/g, '');
|
|
65
|
+
return cleaned;
|
|
66
|
+
}
|
|
67
|
+
/** Frontmatter-wrapped SKILL.md body. */
|
|
68
|
+
function renderSkillFile(name, description, whenToUse, content) {
|
|
69
|
+
const head = [`name: ${name}`, `description: ${description}`];
|
|
70
|
+
if (whenToUse !== undefined && whenToUse.trim() !== '')
|
|
71
|
+
head.push(`whenToUse: ${whenToUse.trim()}`);
|
|
72
|
+
return `---\n${head.join('\n')}\n---\n\n${content.trimEnd()}\n`;
|
|
73
|
+
}
|
|
74
|
+
/** Scan a markdown directory, returning `{ name }` per `.md` file. */
|
|
75
|
+
function scanRuleDir(dir, source) {
|
|
76
|
+
let entries;
|
|
77
|
+
try {
|
|
78
|
+
entries = readdirSync(dir);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
return entries
|
|
84
|
+
.filter(name => name.endsWith('.md'))
|
|
85
|
+
.map(name => ({ name: name.slice(0, -'.md'.length), source }))
|
|
86
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
87
|
+
}
|
|
88
|
+
/** Parse the `name`+`description` frontmatter of one SKILL.md without invoking the registry. */
|
|
89
|
+
function parseSkillFrontmatter(raw) {
|
|
90
|
+
const m = raw.match(/^---\n([\s\S]*?)\n---\n/);
|
|
91
|
+
if (!m)
|
|
92
|
+
return undefined;
|
|
93
|
+
const meta = {};
|
|
94
|
+
for (const line of m[1].split('\n')) {
|
|
95
|
+
const i = line.indexOf(':');
|
|
96
|
+
if (i > 0)
|
|
97
|
+
meta[line.slice(0, i).trim()] = line.slice(i + 1).trim();
|
|
98
|
+
}
|
|
99
|
+
if (!meta.name || !meta.description)
|
|
100
|
+
return undefined;
|
|
101
|
+
return { name: meta.name, description: meta.description };
|
|
102
|
+
}
|
|
103
|
+
/** List skill frontmatter from one skills directory (directory-bundle SKILL.md entries). */
|
|
104
|
+
function listSkillsFromDir(dir, source) {
|
|
105
|
+
let entries;
|
|
106
|
+
try {
|
|
107
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
const result = [];
|
|
113
|
+
for (const entry of entries) {
|
|
114
|
+
if (!entry.isDirectory())
|
|
115
|
+
continue;
|
|
116
|
+
try {
|
|
117
|
+
const raw = readFileSync(join(dir, entry.name, 'SKILL.md'), 'utf8');
|
|
118
|
+
const parsed = parseSkillFrontmatter(raw);
|
|
119
|
+
if (parsed !== undefined)
|
|
120
|
+
result.push({ name: parsed.name, description: parsed.description, source });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
/* skip unreadable entry */
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return result.sort((a, b) => a.name.localeCompare(b.name));
|
|
127
|
+
}
|
|
50
128
|
let TaskEngineController = (() => {
|
|
51
129
|
let _classSuper = TypertRemoteService;
|
|
52
130
|
let _instanceExtraInitializers = [];
|
|
53
131
|
let _read_decorators;
|
|
54
132
|
let _write_decorators;
|
|
133
|
+
let _listSkills_decorators;
|
|
134
|
+
let _listRules_decorators;
|
|
135
|
+
let _writeSkill_decorators;
|
|
136
|
+
let _writeRule_decorators;
|
|
55
137
|
return class TaskEngineController extends _classSuper {
|
|
56
138
|
static {
|
|
57
139
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
58
140
|
_read_decorators = [Remote];
|
|
59
141
|
_write_decorators = [Remote];
|
|
142
|
+
_listSkills_decorators = [Remote];
|
|
143
|
+
_listRules_decorators = [Remote];
|
|
144
|
+
_writeSkill_decorators = [Remote];
|
|
145
|
+
_writeRule_decorators = [Remote];
|
|
60
146
|
__esDecorate(this, null, _read_decorators, { kind: "method", name: "read", static: false, private: false, access: { has: obj => "read" in obj, get: obj => obj.read }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
61
147
|
__esDecorate(this, null, _write_decorators, { kind: "method", name: "write", static: false, private: false, access: { has: obj => "write" in obj, get: obj => obj.write }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
148
|
+
__esDecorate(this, null, _listSkills_decorators, { kind: "method", name: "listSkills", static: false, private: false, access: { has: obj => "listSkills" in obj, get: obj => obj.listSkills }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
149
|
+
__esDecorate(this, null, _listRules_decorators, { kind: "method", name: "listRules", static: false, private: false, access: { has: obj => "listRules" in obj, get: obj => obj.listRules }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
150
|
+
__esDecorate(this, null, _writeSkill_decorators, { kind: "method", name: "writeSkill", static: false, private: false, access: { has: obj => "writeSkill" in obj, get: obj => obj.writeSkill }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
151
|
+
__esDecorate(this, null, _writeRule_decorators, { kind: "method", name: "writeRule", static: false, private: false, access: { has: obj => "writeRule" in obj, get: obj => obj.writeRule }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
62
152
|
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
63
153
|
}
|
|
64
154
|
constructor(ctx) {
|
|
@@ -116,6 +206,80 @@ let TaskEngineController = (() => {
|
|
|
116
206
|
});
|
|
117
207
|
return { ok: true, source: 'project', config, problems: [] };
|
|
118
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* List every skill available for stage binding: the live registry when present
|
|
211
|
+
* (bundled + project + user), otherwise the bundled skills alone.
|
|
212
|
+
* @param path - absolute workspace directory for project/user discovery.
|
|
213
|
+
* @returns the mountable skill catalog.
|
|
214
|
+
*/
|
|
215
|
+
async listSkills(path) {
|
|
216
|
+
const registry = this.ctx.get('skills');
|
|
217
|
+
if (registry !== undefined) {
|
|
218
|
+
try {
|
|
219
|
+
const summaries = await registry.list(path === '' ? undefined : { cwd: path });
|
|
220
|
+
const skills = summaries
|
|
221
|
+
.filter(s => s.invocation?.modelInvocable !== false)
|
|
222
|
+
.map(s => ({ name: s.name, description: s.description, source: String(s.source) }))
|
|
223
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
224
|
+
return { skills };
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
/* fall through to the bundled-only list */
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return { skills: listSkillsFromDir(BUNDLED_SKILLS_DIR, 'bundled') };
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* List every rule available for stage binding: bundled, project (`.dsh/rules`),
|
|
234
|
+
* and user (`$DSH_HOME/rules`).
|
|
235
|
+
* @param path - absolute workspace directory for the project level.
|
|
236
|
+
* @returns the mountable rule catalog.
|
|
237
|
+
*/
|
|
238
|
+
async listRules(path) {
|
|
239
|
+
const project = path === '' ? [] : scanRuleDir(join(path, '.dsh/rules'), 'project');
|
|
240
|
+
const user = scanRuleDir(join(dshHome(), 'rules'), 'user');
|
|
241
|
+
const bundled = scanRuleDir(BUNDLED_RULES_DIR, 'bundled');
|
|
242
|
+
// Prefer the most specific source for a given name; project wins over user over bundled.
|
|
243
|
+
const merged = new Map();
|
|
244
|
+
for (const entry of [...bundled, ...user, ...project])
|
|
245
|
+
merged.set(entry.name, entry.source);
|
|
246
|
+
const rules = [...merged.entries()]
|
|
247
|
+
.map(([name, source]) => ({ name, source }))
|
|
248
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
249
|
+
return { rules };
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Create a project- or user-level skill by writing its SKILL.md.
|
|
253
|
+
* @param request - name, description, whenToUse, body, and target level.
|
|
254
|
+
* @returns the written resource path, or `ok: false` with an error.
|
|
255
|
+
*/
|
|
256
|
+
async writeSkill(request) {
|
|
257
|
+
const name = sanitizeName(request.name);
|
|
258
|
+
if (name === '' || request.description.trim() === '') {
|
|
259
|
+
return { ok: false, name, path: '', error: 'skill name and description must not be empty' };
|
|
260
|
+
}
|
|
261
|
+
const base = request.level === 'project'
|
|
262
|
+
? join(request.path ?? '', '.dsh/skills')
|
|
263
|
+
: join(dshHome(), 'skills');
|
|
264
|
+
const file = join(base, name, 'SKILL.md');
|
|
265
|
+
return writeResourceFile(file, renderSkillFile(name, request.description, request.whenToUse, request.content), name);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Create a project- or user-level rule by writing its markdown file.
|
|
269
|
+
* @param request - name, body, and target level.
|
|
270
|
+
* @returns the written resource path, or `ok: false` with an error.
|
|
271
|
+
*/
|
|
272
|
+
async writeRule(request) {
|
|
273
|
+
const name = sanitizeName(request.name);
|
|
274
|
+
if (name === '' || request.content.trim() === '') {
|
|
275
|
+
return { ok: false, name, path: '', error: 'rule name and content must not be empty' };
|
|
276
|
+
}
|
|
277
|
+
const base = request.level === 'project'
|
|
278
|
+
? join(request.path ?? '', '.dsh/rules')
|
|
279
|
+
: join(dshHome(), 'rules');
|
|
280
|
+
const file = join(base, `${name}.md`);
|
|
281
|
+
return writeResourceFile(file, request.content.trimEnd() + '\n', name);
|
|
282
|
+
}
|
|
119
283
|
/** Resolve the sandboxed fs service, failing loudly when the host lacks one. */
|
|
120
284
|
fs() {
|
|
121
285
|
const fs = this.ctx.get('fs');
|
|
@@ -132,6 +296,17 @@ let TaskEngineController = (() => {
|
|
|
132
296
|
* Cordis service), so mounting this class is the whole registration.
|
|
133
297
|
*/
|
|
134
298
|
export default TaskEngineController;
|
|
299
|
+
/** Write a resource file, creating parent directories; never throws to the wire. */
|
|
300
|
+
function writeResourceFile(file, content, name) {
|
|
301
|
+
try {
|
|
302
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
303
|
+
writeFileSync(file, content, 'utf8');
|
|
304
|
+
return { ok: true, name, path: file };
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
return { ok: false, name, path: file, error: error instanceof Error ? error.message : String(error) };
|
|
308
|
+
}
|
|
309
|
+
}
|
|
135
310
|
/** Read `.dsh/eng.json` under a workspace directory, or `undefined` when absent/unreadable. */
|
|
136
311
|
async function readEngText(fs, path) {
|
|
137
312
|
try {
|
package/lib/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
|
package/lib/engine.d.ts
CHANGED
|
@@ -41,6 +41,13 @@ export interface CommitRule {
|
|
|
41
41
|
/** When true (default), a commit may only touch files listed in the task's `files`. */
|
|
42
42
|
file_scope: boolean;
|
|
43
43
|
}
|
|
44
|
+
/** Skills and rules a stage pins for progressive disclosure when the task enters it. */
|
|
45
|
+
export interface StageBinding {
|
|
46
|
+
/** Skill names to load for this stage (resolved through the DSH skill registry). */
|
|
47
|
+
skills?: string[];
|
|
48
|
+
/** Rule names to read for this stage (resolved under the configured rule roots). */
|
|
49
|
+
rules?: string[];
|
|
50
|
+
}
|
|
44
51
|
export interface WorkflowConfig {
|
|
45
52
|
stages: string[];
|
|
46
53
|
start_stage: string;
|
|
@@ -50,6 +57,8 @@ export interface WorkflowConfig {
|
|
|
50
57
|
commit: CommitRule;
|
|
51
58
|
/** A high_risk task cannot cross an edge guarded by `verified` without passing evidence. */
|
|
52
59
|
high_risk_requires_verification: boolean;
|
|
60
|
+
/** Per-stage skill/rule bindings disclosed when the task enters the stage. */
|
|
61
|
+
stage_bindings?: Record<string, StageBinding>;
|
|
53
62
|
}
|
|
54
63
|
export interface TaskItem {
|
|
55
64
|
id: string;
|
|
@@ -102,6 +111,8 @@ export declare function validateWorkflow(config: WorkflowConfig): string[];
|
|
|
102
111
|
export declare function loadWorkflow(defaults: WorkflowConfig, override?: Partial<WorkflowConfig>): WorkflowConfig;
|
|
103
112
|
/** Artifacts a stage owns; `artifacts_present` checks these against the recorded values. */
|
|
104
113
|
export declare function artifactsForStage(stage: string, config: WorkflowConfig): ArtifactDef[];
|
|
114
|
+
/** Skills and rules a stage pins, or undefined when the stage declares none. */
|
|
115
|
+
export declare function bindingsForStage(stage: string, config: WorkflowConfig): StageBinding | undefined;
|
|
105
116
|
/** Target stages reachable from `stage` via a configured transition. */
|
|
106
117
|
export declare function legalTargets(stage: string, config: WorkflowConfig): string[];
|
|
107
118
|
/** The edge from `from` to `to`, or undefined when not configured. */
|
package/lib/engine.js
CHANGED
|
@@ -79,6 +79,22 @@ export function validateWorkflow(config) {
|
|
|
79
79
|
fieldSet.add(field);
|
|
80
80
|
}
|
|
81
81
|
});
|
|
82
|
+
const bindings = config.stage_bindings ?? {};
|
|
83
|
+
for (const [stage, binding] of Object.entries(bindings)) {
|
|
84
|
+
if (!config.stages.includes(stage)) {
|
|
85
|
+
problems.push(`stage_bindings: stage "${stage}" is not a stage`);
|
|
86
|
+
}
|
|
87
|
+
for (const skill of binding.skills ?? []) {
|
|
88
|
+
if (typeof skill !== 'string' || skill.trim() === '') {
|
|
89
|
+
problems.push(`stage_bindings "${stage}": empty skill name`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const rule of binding.rules ?? []) {
|
|
93
|
+
if (typeof rule !== 'string' || rule.trim() === '') {
|
|
94
|
+
problems.push(`stage_bindings "${stage}": empty rule name`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
82
98
|
if (!['task', 'item', 'manual'].includes(config.commit.policy)) {
|
|
83
99
|
problems.push(`commit.policy "${config.commit.policy}" is not task|item|manual`);
|
|
84
100
|
}
|
|
@@ -107,6 +123,7 @@ function requireKnownStage(stage, config) {
|
|
|
107
123
|
export function loadWorkflow(defaults, override) {
|
|
108
124
|
if (!override)
|
|
109
125
|
return defaults;
|
|
126
|
+
const stageBindings = override.stage_bindings ?? defaults.stage_bindings;
|
|
110
127
|
return {
|
|
111
128
|
stages: override.stages ?? defaults.stages,
|
|
112
129
|
start_stage: override.start_stage ?? defaults.start_stage,
|
|
@@ -114,12 +131,17 @@ export function loadWorkflow(defaults, override) {
|
|
|
114
131
|
artifacts: override.artifacts ?? defaults.artifacts,
|
|
115
132
|
commit: { ...defaults.commit, ...(override.commit ?? {}) },
|
|
116
133
|
high_risk_requires_verification: override.high_risk_requires_verification ?? defaults.high_risk_requires_verification,
|
|
134
|
+
...(stageBindings !== undefined ? { stage_bindings: stageBindings } : {}),
|
|
117
135
|
};
|
|
118
136
|
}
|
|
119
137
|
/** Artifacts a stage owns; `artifacts_present` checks these against the recorded values. */
|
|
120
138
|
export function artifactsForStage(stage, config) {
|
|
121
139
|
return config.artifacts.filter(artifact => artifact.stage === stage);
|
|
122
140
|
}
|
|
141
|
+
/** Skills and rules a stage pins, or undefined when the stage declares none. */
|
|
142
|
+
export function bindingsForStage(stage, config) {
|
|
143
|
+
return config.stage_bindings?.[stage];
|
|
144
|
+
}
|
|
123
145
|
/** Target stages reachable from `stage` via a configured transition. */
|
|
124
146
|
export function legalTargets(stage, config) {
|
|
125
147
|
return config.transitions
|
package/lib/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
* @module dsh-task-engine
|
|
6
6
|
*/
|
|
7
7
|
import { readFileSync, readdirSync } from 'node:fs';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
8
10
|
import { fileURLToPath } from 'node:url';
|
|
9
11
|
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
10
12
|
import TaskEngineController from "./controller.js";
|
|
11
|
-
import { assertAdvance, checkFileScope, commitCheckpoint, legalTargets, loadWorkflow, newTask, validateCommitMessage, validateWorkflow, } from "./engine.js";
|
|
13
|
+
import { assertAdvance, bindingsForStage, checkFileScope, commitCheckpoint, legalTargets, loadWorkflow, newTask, validateCommitMessage, validateWorkflow, } from "./engine.js";
|
|
12
14
|
export const name = 'task-engine';
|
|
13
15
|
export const inject = ['tools', 'fs'];
|
|
14
16
|
const DEFAULTS = JSON.parse(readFileSync(fileURLToPath(new URL('../defaults/eng.json', import.meta.url)), 'utf8'));
|
|
@@ -79,7 +81,79 @@ async function loadTask(fs, id) {
|
|
|
79
81
|
async function writeTask(fs, state) {
|
|
80
82
|
await writeText(fs, taskPath(state.id), JSON.stringify(state, null, 2));
|
|
81
83
|
}
|
|
82
|
-
|
|
84
|
+
function dshHome() {
|
|
85
|
+
return process.env.DSH_HOME ?? join(homedir(), '.dsh');
|
|
86
|
+
}
|
|
87
|
+
/** Read a rule file with a hard path, or undefined. */
|
|
88
|
+
function readAbsRule(file) {
|
|
89
|
+
try {
|
|
90
|
+
return readFileSync(file, 'utf8');
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolve rule contents by name, project first, then user home, then bundled.
|
|
98
|
+
* @param names - rule names from the current stage binding.
|
|
99
|
+
* @param fs - sandboxed filesystem for the project-level lookup.
|
|
100
|
+
* @returns the rules that resolved, in name order, with their bodies.
|
|
101
|
+
*/
|
|
102
|
+
async function resolveRules(names, fs) {
|
|
103
|
+
const result = [];
|
|
104
|
+
for (const rawName of names) {
|
|
105
|
+
const name = sanitize(rawName);
|
|
106
|
+
if (name === '')
|
|
107
|
+
continue;
|
|
108
|
+
const project = await readText(fs, `.dsh/rules/${name}.md`);
|
|
109
|
+
if (project !== undefined) {
|
|
110
|
+
result.push({ name: rawName, content: project });
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const user = readAbsRule(join(dshHome(), 'rules', `${name}.md`));
|
|
114
|
+
if (user !== undefined) {
|
|
115
|
+
result.push({ name: rawName, content: user });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const bundled = readAbsRule(fileURLToPath(new URL(`../rules/${name}.md`, import.meta.url)));
|
|
119
|
+
if (bundled !== undefined)
|
|
120
|
+
result.push({ name: rawName, content: bundled });
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Render a stage's progressive-disclosure payload: skill names to load via the
|
|
126
|
+
* `skill` tool, plus the resolved rule bodies to follow. Empty text means the
|
|
127
|
+
* stage declares no bindings.
|
|
128
|
+
* @param stage - current stage.
|
|
129
|
+
* @param workflow - effective workflow.
|
|
130
|
+
* @param fs - host filesystem for project-rule resolution.
|
|
131
|
+
* @returns the disclosure text, or an empty string.
|
|
132
|
+
*/
|
|
133
|
+
async function renderBindings(stage, workflow, fs) {
|
|
134
|
+
const binding = bindingsForStage(stage, workflow);
|
|
135
|
+
const skills = binding?.skills ?? [];
|
|
136
|
+
const ruleNames = binding?.rules ?? [];
|
|
137
|
+
if (binding === undefined || (skills.length === 0 && ruleNames.length === 0))
|
|
138
|
+
return '';
|
|
139
|
+
const rules = await resolveRules(ruleNames, fs);
|
|
140
|
+
const skillPart = skills.length > 0
|
|
141
|
+
? `skills to load: ${skills.join(', ')} (use the skill tool by name)`
|
|
142
|
+
: 'skills to load: none';
|
|
143
|
+
const rulePart = rules.length > 0
|
|
144
|
+
? `rules for this stage:\n${rules.map(r => `### ${r.name}\n${r.content}`).join('\n\n')}`
|
|
145
|
+
: '';
|
|
146
|
+
return [skillPart, rulePart].filter(Boolean).join('\n');
|
|
147
|
+
}
|
|
148
|
+
/** Normalize the tool's `items` argument into complete TaskItem records. */
|
|
149
|
+
function normalizeItems(items) {
|
|
150
|
+
return (items ?? []).map(item => ({
|
|
151
|
+
id: String(item.id ?? ''),
|
|
152
|
+
title: String(item.title ?? ''),
|
|
153
|
+
status: item.status ?? 'todo',
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
const OPERATIONS = ['status', 'create', 'confirm', 'record', 'items', 'scope', 'advance', 'verify', 'review', 'commit', 'config', 'install_hook'];
|
|
83
157
|
const TOOL_DESCRIPTION = 'Own the engineering delivery workflow as hard state. Read or create the task record, record a ' +
|
|
84
158
|
'confirmation or a stage artifact, advance one stage (rejected unless every configured guard already ' +
|
|
85
159
|
'holds, including the stage artifacts), record verification or review, and gate a commit on ' +
|
|
@@ -166,7 +240,7 @@ export function apply(ctx) {
|
|
|
166
240
|
work_size: a.work_size ?? 'standard',
|
|
167
241
|
risk_level: a.risk_level ?? 'standard',
|
|
168
242
|
}, workflow);
|
|
169
|
-
state.items = a.items
|
|
243
|
+
state.items = normalizeItems(a.items);
|
|
170
244
|
state.files = a.files ?? [];
|
|
171
245
|
await writeTask(ctx.fs, state);
|
|
172
246
|
return `created ${state.id} at stage ${state.stage}; legal next: ${legalTargets(state.stage, workflow).join(', ') || 'none'}`;
|
|
@@ -175,6 +249,8 @@ export function apply(ctx) {
|
|
|
175
249
|
throw new Error('task_id is required for this operation');
|
|
176
250
|
const state = await loadTask(ctx.fs, a.task_id);
|
|
177
251
|
if (a.operation === 'status') {
|
|
252
|
+
const binding = bindingsForStage(state.stage, workflow);
|
|
253
|
+
const rules = await resolveRules(binding?.rules ?? [], ctx.fs);
|
|
178
254
|
return JSON.stringify({
|
|
179
255
|
id: state.id,
|
|
180
256
|
stage: state.stage,
|
|
@@ -189,6 +265,10 @@ export function apply(ctx) {
|
|
|
189
265
|
files: state.files,
|
|
190
266
|
legal_next: legalTargets(state.stage, workflow),
|
|
191
267
|
commit: commitCheckpoint(state, workflow),
|
|
268
|
+
bindings: {
|
|
269
|
+
skills: binding?.skills ?? [],
|
|
270
|
+
rules: rules.map(r => ({ name: r.name, content: r.content })),
|
|
271
|
+
},
|
|
192
272
|
}, null, 2);
|
|
193
273
|
}
|
|
194
274
|
if (a.operation === 'commit') {
|
|
@@ -249,11 +329,17 @@ export function apply(ctx) {
|
|
|
249
329
|
state.files = a.files ?? [];
|
|
250
330
|
note = `file scope set to ${state.files.length} files${state.files.length > 0 ? ': ' + state.files.join(', ') : ' (empty — commits are blocked until files are declared)'}`;
|
|
251
331
|
break;
|
|
332
|
+
case 'items':
|
|
333
|
+
state.items = normalizeItems(a.items);
|
|
334
|
+
note = `items set: ${state.items.map(i => `${i.id}:${i.status}`).join(', ') || 'none'}`;
|
|
335
|
+
break;
|
|
252
336
|
case 'advance': {
|
|
253
337
|
const result = assertAdvance(state, a.target_stage ?? '', workflow);
|
|
254
338
|
if (!result.ok)
|
|
255
339
|
throw new Error(result.errors.join('; '));
|
|
256
340
|
state.stage = a.target_stage;
|
|
341
|
+
const disclosure = await renderBindings(state.stage, workflow, ctx.fs);
|
|
342
|
+
note = disclosure === '' ? `advanced to ${state.stage}` : `advanced to ${state.stage}\n${disclosure}`;
|
|
257
343
|
break;
|
|
258
344
|
}
|
|
259
345
|
case 'verify':
|