@theihtisham/agent-shadow-brain 7.0.0 → 7.2.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/CHANGELOG.md +18 -0
- package/README.md +36 -396
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/context-assembly.d.ts +58 -0
- package/dist/brain/context-assembly.d.ts.map +1 -0
- package/dist/brain/context-assembly.js +207 -0
- package/dist/brain/context-assembly.js.map +1 -0
- package/dist/brain/feature-settings.d.ts +53 -0
- package/dist/brain/feature-settings.d.ts.map +1 -0
- package/dist/brain/feature-settings.js +232 -0
- package/dist/brain/feature-settings.js.map +1 -0
- package/dist/brain/global-brain.d.ts +1 -0
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +3 -3
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/mcp-server.d.ts +4 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +81 -5
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/subconscious.d.ts +19 -24
- package/dist/brain/subconscious.d.ts.map +1 -1
- package/dist/brain/subconscious.js +77 -218
- package/dist/brain/subconscious.js.map +1 -1
- package/dist/brain/task-workflow.d.ts +22 -0
- package/dist/brain/task-workflow.d.ts.map +1 -0
- package/dist/brain/task-workflow.js +182 -0
- package/dist/brain/task-workflow.js.map +1 -0
- package/dist/brain/workflow-skills.d.ts +86 -0
- package/dist/brain/workflow-skills.d.ts.map +1 -0
- package/dist/brain/workflow-skills.js +514 -0
- package/dist/brain/workflow-skills.js.map +1 -0
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/context-cli.d.ts +3 -0
- package/dist/context-cli.d.ts.map +1 -0
- package/dist/context-cli.js +54 -0
- package/dist/context-cli.js.map +1 -0
- package/dist/dashboard/server.d.ts +1 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +32 -4
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
- package/dist/dashboard/v6-dashboard-html.js +5 -27
- package/dist/dashboard/v6-dashboard-html.js.map +1 -1
- package/dist/dashboard/workspace-api.d.ts +10 -0
- package/dist/dashboard/workspace-api.d.ts.map +1 -0
- package/dist/dashboard/workspace-api.js +193 -0
- package/dist/dashboard/workspace-api.js.map +1 -0
- package/dist/dashboard/workspace-html.d.ts +2 -0
- package/dist/dashboard/workspace-html.d.ts.map +1 -0
- package/dist/dashboard/workspace-html.js +1555 -0
- package/dist/dashboard/workspace-html.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow-cli.d.ts +3 -0
- package/dist/workflow-cli.d.ts.map +1 -0
- package/dist/workflow-cli.js +100 -0
- package/dist/workflow-cli.js.map +1 -0
- package/docs/WORKFLOW_INTEGRATION.md +105 -0
- package/docs/WORKSPACE.md +70 -0
- package/docs/assets/context-flow-v7.2.png +0 -0
- package/docs/assets/workspace-graph-v7.2.png +0 -0
- package/docs/assets/workspace-overview-v7.2.png +0 -0
- package/docs/launch/RELEASE_NOTES_v7.1.0.md +32 -0
- package/docs/launch/RELEASE_NOTES_v7.2.0.md +24 -0
- package/package.json +111 -207
- package/skills/shadow-debug/SKILL.md +16 -0
- package/skills/shadow-implement/SKILL.md +16 -0
- package/skills/shadow-release/SKILL.md +16 -0
- package/skills/shadow-research/SKILL.md +12 -0
- package/skills/shadow-review/SKILL.md +14 -0
- package/skills/shadow-workflow/SKILL.md +31 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export declare const WORKFLOW_TARGETS: Readonly<{
|
|
2
|
+
readonly codex: Readonly<{
|
|
3
|
+
skillRoot: ".agents/skills";
|
|
4
|
+
instructionFile: "AGENTS.md";
|
|
5
|
+
}>;
|
|
6
|
+
readonly 'claude-code': Readonly<{
|
|
7
|
+
skillRoot: ".claude/skills";
|
|
8
|
+
instructionFile: "CLAUDE.md";
|
|
9
|
+
}>;
|
|
10
|
+
readonly opencode: Readonly<{
|
|
11
|
+
skillRoot: ".opencode/skills";
|
|
12
|
+
instructionFile: "AGENTS.md";
|
|
13
|
+
}>;
|
|
14
|
+
readonly 'deepseek-harness': Readonly<{
|
|
15
|
+
skillRoot: ".dsh/skills";
|
|
16
|
+
instructionFile: "AGENTS.md";
|
|
17
|
+
}>;
|
|
18
|
+
readonly portable: Readonly<{
|
|
19
|
+
skillRoot: ".agents/skills";
|
|
20
|
+
instructionFile: "AGENTS.md";
|
|
21
|
+
}>;
|
|
22
|
+
}>;
|
|
23
|
+
export type WorkflowTarget = keyof typeof WORKFLOW_TARGETS;
|
|
24
|
+
export interface BundledWorkflowSkill {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SkillInstallOptions {
|
|
29
|
+
projectDir: string;
|
|
30
|
+
targets: WorkflowTarget[];
|
|
31
|
+
skills?: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface SkillInstallFile {
|
|
34
|
+
path: string;
|
|
35
|
+
relativePath: string;
|
|
36
|
+
kind: 'skill' | 'instructions' | 'manifest';
|
|
37
|
+
action: 'create' | 'update' | 'unchanged' | 'conflict';
|
|
38
|
+
beforeSha256: string | null;
|
|
39
|
+
afterSha256: string | null;
|
|
40
|
+
content: string;
|
|
41
|
+
reason?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface SkillInstallPlan {
|
|
44
|
+
projectDir: string;
|
|
45
|
+
targets: WorkflowTarget[];
|
|
46
|
+
skills: string[];
|
|
47
|
+
files: SkillInstallFile[];
|
|
48
|
+
warnings: string[];
|
|
49
|
+
}
|
|
50
|
+
export interface SkillInstallResult {
|
|
51
|
+
projectDir: string;
|
|
52
|
+
created: string[];
|
|
53
|
+
updated: string[];
|
|
54
|
+
unchanged: string[];
|
|
55
|
+
backupDir: string | null;
|
|
56
|
+
}
|
|
57
|
+
export declare function listWorkflowTargets(): ({
|
|
58
|
+
skillRoot: ".agents/skills";
|
|
59
|
+
instructionFile: "AGENTS.md";
|
|
60
|
+
target: "claude-code" | "opencode" | "codex" | "deepseek-harness" | "portable";
|
|
61
|
+
} | {
|
|
62
|
+
skillRoot: ".claude/skills";
|
|
63
|
+
instructionFile: "CLAUDE.md";
|
|
64
|
+
target: "claude-code" | "opencode" | "codex" | "deepseek-harness" | "portable";
|
|
65
|
+
} | {
|
|
66
|
+
skillRoot: ".opencode/skills";
|
|
67
|
+
instructionFile: "AGENTS.md";
|
|
68
|
+
target: "claude-code" | "opencode" | "codex" | "deepseek-harness" | "portable";
|
|
69
|
+
} | {
|
|
70
|
+
skillRoot: ".dsh/skills";
|
|
71
|
+
instructionFile: "AGENTS.md";
|
|
72
|
+
target: "claude-code" | "opencode" | "codex" | "deepseek-harness" | "portable";
|
|
73
|
+
} | {
|
|
74
|
+
skillRoot: ".agents/skills";
|
|
75
|
+
instructionFile: "AGENTS.md";
|
|
76
|
+
target: "claude-code" | "opencode" | "codex" | "deepseek-harness" | "portable";
|
|
77
|
+
})[];
|
|
78
|
+
export declare function getBundledSkill(name: string): BundledWorkflowSkill & {
|
|
79
|
+
content: string;
|
|
80
|
+
};
|
|
81
|
+
export declare function listBundledSkills(): BundledWorkflowSkill[];
|
|
82
|
+
/** Inspect the requested project and compute a preview without making filesystem changes. */
|
|
83
|
+
export declare function planSkillInstall(options: SkillInstallOptions): SkillInstallPlan;
|
|
84
|
+
/** Apply a still-current preview. Existing edited or unowned files are preserved. */
|
|
85
|
+
export declare function applySkillInstall(plan: SkillInstallPlan): SkillInstallResult;
|
|
86
|
+
//# sourceMappingURL=workflow-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-skills.d.ts","sourceRoot":"","sources":["../../src/brain/workflow-skills.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;EAMlB,CAAC;AAEZ,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU,CAAC;IAC5C,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;IACvD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAuBD,wBAAgB,mBAAmB;;;;;;;;;;;;;;;;;;;;KAElC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAQxF;AAED,wBAAgB,iBAAiB,IAAI,oBAAoB,EAAE,CAK1D;AA6MD,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CAmE/E;AA6HD,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,CA2D5E"}
|
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
const SKILL_NAMES = [
|
|
7
|
+
'shadow-workflow', 'shadow-implement', 'shadow-debug', 'shadow-review', 'shadow-research', 'shadow-release',
|
|
8
|
+
];
|
|
9
|
+
const BUNDLE_ROOT = fileURLToPath(new URL('../../skills/', import.meta.url));
|
|
10
|
+
const MANIFEST_PATH = '.shadow-brain/workflow-skills.json';
|
|
11
|
+
const LOCK_PATH = '.shadow-brain/workflow-skills.lock';
|
|
12
|
+
const BACKUP_ROOT = '.shadow-brain/workflow-backups';
|
|
13
|
+
const MANAGED_BY = 'agent-shadow-brain';
|
|
14
|
+
const BLOCK_PREFIX = '<!-- agent-shadow-brain:workflow:';
|
|
15
|
+
const BLOCK_START = BLOCK_PREFIX + 'start -->';
|
|
16
|
+
const BLOCK_END = BLOCK_PREFIX + 'end -->';
|
|
17
|
+
export const WORKFLOW_TARGETS = Object.freeze({
|
|
18
|
+
codex: Object.freeze({ skillRoot: '.agents/skills', instructionFile: 'AGENTS.md' }),
|
|
19
|
+
'claude-code': Object.freeze({ skillRoot: '.claude/skills', instructionFile: 'CLAUDE.md' }),
|
|
20
|
+
opencode: Object.freeze({ skillRoot: '.opencode/skills', instructionFile: 'AGENTS.md' }),
|
|
21
|
+
'deepseek-harness': Object.freeze({ skillRoot: '.dsh/skills', instructionFile: 'AGENTS.md' }),
|
|
22
|
+
portable: Object.freeze({ skillRoot: '.agents/skills', instructionFile: 'AGENTS.md' }),
|
|
23
|
+
});
|
|
24
|
+
class UnsafePathError extends Error {
|
|
25
|
+
}
|
|
26
|
+
export function listWorkflowTargets() {
|
|
27
|
+
return Object.keys(WORKFLOW_TARGETS).map(target => ({ target, ...WORKFLOW_TARGETS[target] }));
|
|
28
|
+
}
|
|
29
|
+
export function getBundledSkill(name) {
|
|
30
|
+
if (!SKILL_NAMES.some(skill => skill === name))
|
|
31
|
+
throw new TypeError('Unknown bundled workflow skill.');
|
|
32
|
+
const content = fs.readFileSync(path.join(BUNDLE_ROOT, name, 'SKILL.md'), 'utf8');
|
|
33
|
+
const metadata = /^---\r?\nname:\s*([a-z0-9-]+)\r?\ndescription:[ \t]*(.+?)\r?\n---\r?\n/.exec(content);
|
|
34
|
+
if (!metadata || metadata[1] !== name || !metadata[2].trim()) {
|
|
35
|
+
throw new Error('Bundled workflow skill has invalid frontmatter: ' + name);
|
|
36
|
+
}
|
|
37
|
+
return { name, description: metadata[2].trim(), content };
|
|
38
|
+
}
|
|
39
|
+
export function listBundledSkills() {
|
|
40
|
+
return SKILL_NAMES.map(name => {
|
|
41
|
+
const { description } = getBundledSkill(name);
|
|
42
|
+
return { name, description };
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function sha256(bytes) {
|
|
46
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
47
|
+
}
|
|
48
|
+
function isInside(parent, child) {
|
|
49
|
+
const relative = path.relative(parent, child);
|
|
50
|
+
return !!relative && relative !== '..' && !relative.startsWith('..' + path.sep) && !path.isAbsolute(relative);
|
|
51
|
+
}
|
|
52
|
+
function canonicalRoot(projectDir) {
|
|
53
|
+
if (typeof projectDir !== 'string' || !projectDir.trim())
|
|
54
|
+
throw new TypeError('An existing project directory is required.');
|
|
55
|
+
const resolved = path.resolve(projectDir);
|
|
56
|
+
const root = path.parse(resolved).root;
|
|
57
|
+
const home = path.resolve(os.homedir());
|
|
58
|
+
const homeRelative = path.relative(home, resolved);
|
|
59
|
+
const firstHomeSegment = homeRelative.split(path.sep)[0].toLowerCase();
|
|
60
|
+
const globalDirs = new Set(['.agents', '.claude', '.codex', '.config', '.dsh', '.opencode', '.shadow-brain', '.ssh']);
|
|
61
|
+
if (resolved === root || !homeRelative || (isInside(home, resolved) && globalDirs.has(firstHomeSegment))) {
|
|
62
|
+
throw new UnsafePathError('Select a project directory outside global agent and home configuration roots.');
|
|
63
|
+
}
|
|
64
|
+
let current = root;
|
|
65
|
+
const segments = resolved.slice(root.length).split(path.sep);
|
|
66
|
+
for (const part of segments) {
|
|
67
|
+
current = path.join(current, part);
|
|
68
|
+
const stat = fs.lstatSync(current, { throwIfNoEntry: false });
|
|
69
|
+
if (!stat?.isDirectory() || stat.isSymbolicLink()) {
|
|
70
|
+
throw new UnsafePathError('Project directory must exist without symbolic-link ancestors.');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return fs.realpathSync.native(resolved);
|
|
74
|
+
}
|
|
75
|
+
function destination(root, relative) {
|
|
76
|
+
const absolute = path.resolve(root, relative);
|
|
77
|
+
if (!isInside(root, absolute))
|
|
78
|
+
throw new UnsafePathError('Workflow skill destination escapes the selected project.');
|
|
79
|
+
return absolute;
|
|
80
|
+
}
|
|
81
|
+
function inspectParent(root, relative, created) {
|
|
82
|
+
const directory = path.dirname(destination(root, relative));
|
|
83
|
+
let current = root;
|
|
84
|
+
const fromRoot = path.relative(root, directory);
|
|
85
|
+
if (!fromRoot)
|
|
86
|
+
return true;
|
|
87
|
+
for (const part of fromRoot.split(path.sep)) {
|
|
88
|
+
current = path.join(current, part);
|
|
89
|
+
let stat = fs.lstatSync(current, { throwIfNoEntry: false });
|
|
90
|
+
if (!stat && created) {
|
|
91
|
+
try {
|
|
92
|
+
fs.mkdirSync(current);
|
|
93
|
+
created.push(current);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
if (error.code !== 'EEXIST')
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
stat = fs.lstatSync(current, { throwIfNoEntry: false });
|
|
100
|
+
}
|
|
101
|
+
if (!stat)
|
|
102
|
+
return false;
|
|
103
|
+
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
104
|
+
throw new UnsafePathError('A destination ancestor is a symbolic link or is not a directory.');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
function readState(root, relative) {
|
|
110
|
+
if (!inspectParent(root, relative))
|
|
111
|
+
return null;
|
|
112
|
+
const filename = destination(root, relative);
|
|
113
|
+
const stat = fs.lstatSync(filename, { throwIfNoEntry: false, bigint: true });
|
|
114
|
+
if (!stat)
|
|
115
|
+
return null;
|
|
116
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1n) {
|
|
117
|
+
throw new UnsafePathError('Destination must be a regular file with one filesystem link.');
|
|
118
|
+
}
|
|
119
|
+
const fd = fs.openSync(filename, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
|
|
120
|
+
try {
|
|
121
|
+
const actual = fs.fstatSync(fd, { bigint: true });
|
|
122
|
+
if (actual.dev !== stat.dev || actual.ino !== stat.ino || actual.nlink !== 1n) {
|
|
123
|
+
throw new UnsafePathError('Destination changed while it was being inspected.');
|
|
124
|
+
}
|
|
125
|
+
const bytes = fs.readFileSync(fd);
|
|
126
|
+
return { bytes, sha256: sha256(bytes), mode: Number(actual.mode) & 0o777 };
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
fs.closeSync(fd);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function decodeUtf8(state) {
|
|
133
|
+
const bytes = state?.bytes ?? Buffer.alloc(0);
|
|
134
|
+
const text = bytes.toString('utf8');
|
|
135
|
+
if (!Buffer.from(text, 'utf8').equals(bytes))
|
|
136
|
+
throw new UnsafePathError('Existing file is not valid UTF-8.');
|
|
137
|
+
return text;
|
|
138
|
+
}
|
|
139
|
+
function readManifest(state) {
|
|
140
|
+
if (!state)
|
|
141
|
+
return { schemaVersion: 1, managedBy: MANAGED_BY, skills: {}, blocks: {} };
|
|
142
|
+
try {
|
|
143
|
+
const parsed = JSON.parse(decodeUtf8(state));
|
|
144
|
+
if (parsed.schemaVersion === 1 && parsed.managedBy === MANAGED_BY &&
|
|
145
|
+
validHashes(parsed.skills, managedSkillPaths) && validHashes(parsed.blocks, instructionPaths)) {
|
|
146
|
+
return parsed;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch { /* Treat an unreadable receipt as a conflict. */ }
|
|
150
|
+
throw new UnsafePathError('Existing workflow ownership receipt is invalid or unsupported.');
|
|
151
|
+
}
|
|
152
|
+
function validHashes(records, allowlist) {
|
|
153
|
+
return !!records && typeof records === 'object' && !Array.isArray(records) &&
|
|
154
|
+
Object.entries(records).every(([key, value]) => allowlist.has(key) && typeof value === 'string' && /^[0-9a-f]{64}$/.test(value));
|
|
155
|
+
}
|
|
156
|
+
const managedSkillPaths = new Set(Object.values(WORKFLOW_TARGETS).flatMap(({ skillRoot }) => SKILL_NAMES.map(name => skillRoot + '/' + name + '/SKILL.md')));
|
|
157
|
+
const instructionPaths = new Set(Object.values(WORKFLOW_TARGETS).map(({ instructionFile }) => instructionFile));
|
|
158
|
+
function makeFile(root, relativePath, kind, state, content, conflict) {
|
|
159
|
+
const beforeSha256 = state?.sha256 ?? null;
|
|
160
|
+
const afterSha256 = sha256(content);
|
|
161
|
+
const action = conflict ? 'conflict' : beforeSha256 === afterSha256 ? 'unchanged' : state ? 'update' : 'create';
|
|
162
|
+
return {
|
|
163
|
+
path: destination(root, relativePath), relativePath, kind, action, beforeSha256, afterSha256, content,
|
|
164
|
+
...(conflict ? { reason: conflict } : {}),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function checkedState(root, relative) {
|
|
168
|
+
try {
|
|
169
|
+
return { state: readState(root, relative) };
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (error instanceof UnsafePathError)
|
|
173
|
+
return { state: null, conflict: error.message };
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function instructionBlock(names, roots, eol) {
|
|
178
|
+
const displayed = names.map(name => '`' + name + '`').join(', ');
|
|
179
|
+
const locations = roots.map(root => '`' + root + '`').join(', ');
|
|
180
|
+
return [
|
|
181
|
+
BLOCK_START,
|
|
182
|
+
'## Agent Shadow Brain workflow',
|
|
183
|
+
'For substantive tasks, use the relevant installed skill: ' + displayed + '.',
|
|
184
|
+
'Skill bundles are in ' + locations + '.',
|
|
185
|
+
'Follow the user’s request and project rules. Handle simple tasks directly, plan when useful, carry out authorized work, and verify the requested result.',
|
|
186
|
+
BLOCK_END,
|
|
187
|
+
].join(eol);
|
|
188
|
+
}
|
|
189
|
+
function replaceInstructionBlock(original, names, roots, owned) {
|
|
190
|
+
const eol = original.match(/\r\n|\n|\r/)?.[0] ?? '\n';
|
|
191
|
+
const block = instructionBlock(names, roots, eol);
|
|
192
|
+
const start = original.indexOf(BLOCK_START);
|
|
193
|
+
const end = original.indexOf(BLOCK_END);
|
|
194
|
+
const markerCount = original.split(BLOCK_PREFIX).length - 1;
|
|
195
|
+
if (!markerCount) {
|
|
196
|
+
if (owned)
|
|
197
|
+
throw new UnsafePathError('The previously managed instruction block is missing.');
|
|
198
|
+
const gap = !original || original === '\uFEFF' ? '' : /[\r\n]$/.test(original) ? eol : eol + eol;
|
|
199
|
+
return { text: original + gap + block + eol, hash: sha256(block), managed: true };
|
|
200
|
+
}
|
|
201
|
+
const endAfter = end + BLOCK_END.length;
|
|
202
|
+
const startsLine = (index) => index === 0 ||
|
|
203
|
+
(index === 1 && original[0] === '\uFEFF') || /[\r\n]/.test(original[index - 1] ?? '');
|
|
204
|
+
const endsLine = (index) => index === original.length || /[\r\n]/.test(original[index] ?? '');
|
|
205
|
+
if (markerCount !== 2 || start < 0 || end <= start ||
|
|
206
|
+
!startsLine(start) || !endsLine(start + BLOCK_START.length) || !startsLine(end) || !endsLine(endAfter)) {
|
|
207
|
+
throw new UnsafePathError('Existing workflow instruction markers are malformed or duplicated.');
|
|
208
|
+
}
|
|
209
|
+
const existing = original.slice(start, endAfter);
|
|
210
|
+
const existingHash = sha256(existing);
|
|
211
|
+
if (owned && existingHash !== owned) {
|
|
212
|
+
throw new UnsafePathError('Previously managed workflow instructions were edited locally.');
|
|
213
|
+
}
|
|
214
|
+
if (!owned && existing !== block) {
|
|
215
|
+
throw new UnsafePathError('Existing workflow instructions are not owned by this installer.');
|
|
216
|
+
}
|
|
217
|
+
return { text: original.slice(0, start) + block + original.slice(endAfter), hash: sha256(block), managed: !!owned };
|
|
218
|
+
}
|
|
219
|
+
function selectedTargets(value) {
|
|
220
|
+
if (!Array.isArray(value) || !value.length)
|
|
221
|
+
throw new TypeError('Select at least one workflow target.');
|
|
222
|
+
for (const target of value) {
|
|
223
|
+
if (typeof target !== 'string' || !Object.prototype.hasOwnProperty.call(WORKFLOW_TARGETS, target))
|
|
224
|
+
throw new TypeError('Unknown workflow target.');
|
|
225
|
+
}
|
|
226
|
+
return listWorkflowTargets().map(({ target }) => target).filter(target => value.includes(target));
|
|
227
|
+
}
|
|
228
|
+
function selectedSkills(value) {
|
|
229
|
+
if (value === undefined)
|
|
230
|
+
return [...SKILL_NAMES];
|
|
231
|
+
if (!Array.isArray(value) || !value.length)
|
|
232
|
+
throw new TypeError('Select at least one bundled workflow skill.');
|
|
233
|
+
for (const name of value) {
|
|
234
|
+
if (!SKILL_NAMES.some(skill => skill === name))
|
|
235
|
+
throw new TypeError('Unknown bundled workflow skill.');
|
|
236
|
+
}
|
|
237
|
+
return SKILL_NAMES.filter(name => value.includes(name));
|
|
238
|
+
}
|
|
239
|
+
/** Inspect the requested project and compute a preview without making filesystem changes. */
|
|
240
|
+
export function planSkillInstall(options) {
|
|
241
|
+
const targets = selectedTargets(options.targets);
|
|
242
|
+
const skills = selectedSkills(options.skills);
|
|
243
|
+
const projectDir = canonicalRoot(options.projectDir);
|
|
244
|
+
const warnings = [];
|
|
245
|
+
if (targets.includes('deepseek-harness')) {
|
|
246
|
+
const git = fs.lstatSync(path.join(projectDir, '.git'), { throwIfNoEntry: false });
|
|
247
|
+
if (!(git?.isFile() || git?.isDirectory())) {
|
|
248
|
+
warnings.push('Select the repository root for DeepSeek Harness discovery. This directory has no .git marker.');
|
|
249
|
+
}
|
|
250
|
+
warnings.push('DeepSeek Harness needs its filesystem skill provider and skill tools enabled.');
|
|
251
|
+
}
|
|
252
|
+
const files = [];
|
|
253
|
+
const receipt = checkedState(projectDir, MANIFEST_PATH);
|
|
254
|
+
let receiptConflict = receipt.conflict;
|
|
255
|
+
let ownership = readManifest(null);
|
|
256
|
+
if (!receiptConflict) {
|
|
257
|
+
try {
|
|
258
|
+
ownership = readManifest(receipt.state);
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
if (!(error instanceof UnsafePathError))
|
|
262
|
+
throw error;
|
|
263
|
+
receiptConflict = error.message;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
const newOwnership = { ...ownership, skills: { ...ownership.skills }, blocks: { ...ownership.blocks } };
|
|
267
|
+
const bundles = skills.map(getBundledSkill);
|
|
268
|
+
const roots = new Set(targets.map(target => WORKFLOW_TARGETS[target].skillRoot));
|
|
269
|
+
for (const root of roots) {
|
|
270
|
+
for (const bundle of bundles) {
|
|
271
|
+
const relative = root + '/' + bundle.name + '/SKILL.md';
|
|
272
|
+
const existing = checkedState(projectDir, relative);
|
|
273
|
+
const unchanged = existing.state?.sha256 === sha256(bundle.content);
|
|
274
|
+
const owned = existing.state?.sha256 === ownership.skills[relative] && !!existing.state;
|
|
275
|
+
const conflict = existing.conflict ??
|
|
276
|
+
(existing.state && !unchanged && !owned ? 'Existing skill differs from the bundle or was edited locally.' : undefined);
|
|
277
|
+
const file = makeFile(projectDir, relative, 'skill', existing.state, bundle.content, conflict);
|
|
278
|
+
files.push(file);
|
|
279
|
+
if (!conflict && (!existing.state || owned))
|
|
280
|
+
newOwnership.skills[relative] = file.afterSha256;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
for (const instruction of instructionPaths) {
|
|
284
|
+
const matching = targets.filter(target => WORKFLOW_TARGETS[target].instructionFile === instruction);
|
|
285
|
+
if (!matching.length)
|
|
286
|
+
continue;
|
|
287
|
+
const installedRoots = [...new Set(matching.map(target => WORKFLOW_TARGETS[target].skillRoot))];
|
|
288
|
+
const { state, conflict } = checkedState(projectDir, instruction);
|
|
289
|
+
let file;
|
|
290
|
+
try {
|
|
291
|
+
if (conflict)
|
|
292
|
+
throw new UnsafePathError(conflict);
|
|
293
|
+
const block = replaceInstructionBlock(decodeUtf8(state), skills, installedRoots, ownership.blocks[instruction]);
|
|
294
|
+
file = makeFile(projectDir, instruction, 'instructions', state, block.text);
|
|
295
|
+
if (block.managed)
|
|
296
|
+
newOwnership.blocks[instruction] = block.hash;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
if (!(error instanceof UnsafePathError))
|
|
300
|
+
throw error;
|
|
301
|
+
file = makeFile(projectDir, instruction, 'instructions', state, '', error.message);
|
|
302
|
+
file.afterSha256 = null;
|
|
303
|
+
}
|
|
304
|
+
files.push(file);
|
|
305
|
+
}
|
|
306
|
+
const managed = Object.keys(newOwnership.skills).length || Object.keys(newOwnership.blocks).length;
|
|
307
|
+
if (receipt.state || managed || receiptConflict) {
|
|
308
|
+
const content = JSON.stringify(newOwnership, null, 2) + '\n';
|
|
309
|
+
files.push(makeFile(projectDir, MANIFEST_PATH, 'manifest', receipt.state, content, receiptConflict));
|
|
310
|
+
}
|
|
311
|
+
return { projectDir, targets, skills, files, warnings };
|
|
312
|
+
}
|
|
313
|
+
function verifyPlan(plan) {
|
|
314
|
+
if (!plan || !Array.isArray(plan.files))
|
|
315
|
+
throw new TypeError('A workflow installation preview is required.');
|
|
316
|
+
const fresh = planSkillInstall({ projectDir: plan.projectDir, targets: plan.targets, skills: plan.skills });
|
|
317
|
+
const same = plan.projectDir === fresh.projectDir &&
|
|
318
|
+
plan.files.length === fresh.files.length &&
|
|
319
|
+
plan.files.every((prior, index) => {
|
|
320
|
+
const current = fresh.files[index];
|
|
321
|
+
return prior && prior.path === current.path && prior.relativePath === current.relativePath &&
|
|
322
|
+
prior.kind === current.kind && prior.action === current.action && prior.beforeSha256 === current.beforeSha256 &&
|
|
323
|
+
prior.afterSha256 === current.afterSha256 && prior.content === current.content;
|
|
324
|
+
});
|
|
325
|
+
if (!same)
|
|
326
|
+
throw new Error('The workflow installation preview is stale or modified. Generate a new preview.');
|
|
327
|
+
const conflicts = fresh.files.filter(file => file.action === 'conflict');
|
|
328
|
+
if (conflicts.length) {
|
|
329
|
+
const details = conflicts.map(file => file.relativePath + ' (' + file.reason + ')');
|
|
330
|
+
throw new Error('Workflow installation has conflicts: ' + details.join(', '));
|
|
331
|
+
}
|
|
332
|
+
return fresh;
|
|
333
|
+
}
|
|
334
|
+
function captureBefore(root, file) {
|
|
335
|
+
const current = readState(root, file.relativePath);
|
|
336
|
+
if ((current?.sha256 ?? null) !== file.beforeSha256) {
|
|
337
|
+
throw new Error('Workflow destination changed since preview: ' + file.relativePath);
|
|
338
|
+
}
|
|
339
|
+
return current;
|
|
340
|
+
}
|
|
341
|
+
function prepareTemporary(filename, bytes, mode) {
|
|
342
|
+
const temporary = filename + '.' + randomUUID() + '.tmp';
|
|
343
|
+
const fd = fs.openSync(temporary, 'wx', mode);
|
|
344
|
+
try {
|
|
345
|
+
try {
|
|
346
|
+
fs.writeFileSync(fd, bytes);
|
|
347
|
+
}
|
|
348
|
+
finally {
|
|
349
|
+
fs.closeSync(fd);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
try {
|
|
354
|
+
fs.unlinkSync(temporary);
|
|
355
|
+
}
|
|
356
|
+
catch { /* retain the original write failure */ }
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
return temporary;
|
|
360
|
+
}
|
|
361
|
+
function removeTemporary(temporary) {
|
|
362
|
+
try {
|
|
363
|
+
fs.unlinkSync(temporary);
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
if (error.code !== 'ENOENT')
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
function openInstallLock(root, createdDirs) {
|
|
371
|
+
inspectParent(root, LOCK_PATH, createdDirs);
|
|
372
|
+
const filename = destination(root, LOCK_PATH);
|
|
373
|
+
let fd;
|
|
374
|
+
try {
|
|
375
|
+
fd = fs.openSync(filename, 'wx', 0o600);
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
if (error.code === 'EEXIST') {
|
|
379
|
+
throw new Error('Another workflow installation holds the project lock.');
|
|
380
|
+
}
|
|
381
|
+
throw error;
|
|
382
|
+
}
|
|
383
|
+
const owned = fs.fstatSync(fd, { bigint: true });
|
|
384
|
+
return () => {
|
|
385
|
+
fs.closeSync(fd);
|
|
386
|
+
const current = fs.lstatSync(filename, { bigint: true, throwIfNoEntry: false });
|
|
387
|
+
if (current?.ino === owned.ino && current.dev === owned.dev)
|
|
388
|
+
fs.unlinkSync(filename);
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
function installBackup(projectDir, files, createdDirs) {
|
|
392
|
+
if (!files.some(({ before }) => before))
|
|
393
|
+
return null;
|
|
394
|
+
const prefix = BACKUP_ROOT + '/install-';
|
|
395
|
+
inspectParent(projectDir, prefix, createdDirs);
|
|
396
|
+
const backup = fs.mkdtempSync(destination(projectDir, prefix));
|
|
397
|
+
for (const { file, before } of files) {
|
|
398
|
+
if (!before)
|
|
399
|
+
continue;
|
|
400
|
+
const copy = destination(backup, file.relativePath);
|
|
401
|
+
fs.mkdirSync(path.dirname(copy), { recursive: true });
|
|
402
|
+
fs.writeFileSync(copy, before.bytes, { flag: 'wx', mode: 0o600 });
|
|
403
|
+
}
|
|
404
|
+
return backup;
|
|
405
|
+
}
|
|
406
|
+
function rollback(root, applied) {
|
|
407
|
+
const remaining = [];
|
|
408
|
+
for (const { file, before } of [...applied].reverse()) {
|
|
409
|
+
try {
|
|
410
|
+
const current = readState(root, file.relativePath);
|
|
411
|
+
if ((current?.sha256 ?? null) !== file.afterSha256) {
|
|
412
|
+
remaining.push(file.relativePath + ' (changed after installation)');
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
if (!before) {
|
|
416
|
+
fs.unlinkSync(file.path);
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
const temporary = prepareTemporary(file.path, before.bytes, before.mode);
|
|
420
|
+
try {
|
|
421
|
+
const latest = readState(root, file.relativePath);
|
|
422
|
+
if (latest?.sha256 !== file.afterSha256) {
|
|
423
|
+
remaining.push(file.relativePath + ' (changed after installation)');
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
fs.renameSync(temporary, file.path);
|
|
427
|
+
}
|
|
428
|
+
finally {
|
|
429
|
+
removeTemporary(temporary);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
remaining.push(file.relativePath + ' (could not restore)');
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return remaining;
|
|
437
|
+
}
|
|
438
|
+
function removeEmptyDirectories(createdDirs) {
|
|
439
|
+
for (const directory of [...createdDirs].reverse()) {
|
|
440
|
+
try {
|
|
441
|
+
fs.rmdirSync(directory);
|
|
442
|
+
}
|
|
443
|
+
catch { /* only remove empty directories created by this apply */ }
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/** Apply a still-current preview. Existing edited or unowned files are preserved. */
|
|
447
|
+
export function applySkillInstall(plan) {
|
|
448
|
+
const initial = verifyPlan(plan);
|
|
449
|
+
const result = {
|
|
450
|
+
projectDir: initial.projectDir, created: [], updated: [],
|
|
451
|
+
unchanged: initial.files.filter(file => file.action === 'unchanged').map(file => file.path),
|
|
452
|
+
backupDir: null,
|
|
453
|
+
};
|
|
454
|
+
if (result.unchanged.length === initial.files.length)
|
|
455
|
+
return result;
|
|
456
|
+
const projectDir = initial.projectDir;
|
|
457
|
+
const createdDirs = [];
|
|
458
|
+
const prepared = [];
|
|
459
|
+
const applied = [];
|
|
460
|
+
let releaseLock;
|
|
461
|
+
let completed = false;
|
|
462
|
+
try {
|
|
463
|
+
releaseLock = openInstallLock(projectDir, createdDirs);
|
|
464
|
+
const fresh = verifyPlan(plan);
|
|
465
|
+
const changes = fresh.files.filter(file => file.action === 'create' || file.action === 'update');
|
|
466
|
+
const captured = changes.map(file => ({ file, before: captureBefore(projectDir, file) }));
|
|
467
|
+
for (const { file, before } of captured) {
|
|
468
|
+
inspectParent(projectDir, file.relativePath, createdDirs);
|
|
469
|
+
const temporary = prepareTemporary(file.path, file.content, before?.mode ?? 0o644);
|
|
470
|
+
prepared.push({ file, before, temporary });
|
|
471
|
+
}
|
|
472
|
+
result.backupDir = installBackup(projectDir, prepared, createdDirs);
|
|
473
|
+
for (const item of prepared) {
|
|
474
|
+
const { file, temporary } = item;
|
|
475
|
+
captureBefore(projectDir, file);
|
|
476
|
+
if (file.action === 'create') {
|
|
477
|
+
fs.linkSync(temporary, file.path);
|
|
478
|
+
applied.push(item);
|
|
479
|
+
removeTemporary(temporary);
|
|
480
|
+
result.created.push(file.path);
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
fs.renameSync(temporary, file.path);
|
|
484
|
+
applied.push(item);
|
|
485
|
+
result.updated.push(file.path);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
completed = true;
|
|
489
|
+
return result;
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
for (const item of prepared) {
|
|
493
|
+
try {
|
|
494
|
+
removeTemporary(item.temporary);
|
|
495
|
+
}
|
|
496
|
+
catch { /* keep the original failure */ }
|
|
497
|
+
}
|
|
498
|
+
const remaining = rollback(projectDir, applied);
|
|
499
|
+
const failure = error instanceof Error ? error.message : String(error);
|
|
500
|
+
const recovery = remaining.length ? ' Paths requiring review: ' + remaining.join(', ') + '.' : '';
|
|
501
|
+
const backup = result.backupDir ? ' Backups: ' + result.backupDir + '.' : '';
|
|
502
|
+
throw new Error('Workflow installation failed. ' + failure + recovery + backup, { cause: error });
|
|
503
|
+
}
|
|
504
|
+
finally {
|
|
505
|
+
try {
|
|
506
|
+
releaseLock?.();
|
|
507
|
+
}
|
|
508
|
+
finally {
|
|
509
|
+
if (!completed)
|
|
510
|
+
removeEmptyDirectories(createdDirs);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
//# sourceMappingURL=workflow-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-skills.js","sourceRoot":"","sources":["../../src/brain/workflow-skills.ts"],"names":[],"mappings":"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"}
|