@hallucination-studio/harness-engine 1.0.0-beta.15.f39cb72 → 1.0.0-beta.17.412ec6e
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/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hallucination Studio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Harness Engine
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@hallucination-studio/harness-engine)
|
|
4
|
+
[](https://www.npmjs.com/package/@hallucination-studio/harness-engine)
|
|
5
|
+
[](https://github.com/hallucination-studio/harness-engine/actions/workflows/ci.yml)
|
|
6
|
+
[](https://github.com/hallucination-studio/harness-engine/actions/workflows/publish-release.yml)
|
|
7
|
+
[](https://github.com/hallucination-studio/harness-engine/actions/workflows/publish-nightly.yml)
|
|
8
|
+
[](https://github.com/hallucination-studio/harness-engine/blob/main/LICENSE)
|
|
9
|
+
|
|
3
10
|
Harness Engine packages a Codex skill that bootstraps an agent-first repository harness.
|
|
4
11
|
It turns the repository-shaping ideas from OpenAI's
|
|
5
12
|
["Harness engineering: leveraging Codex in an agent-first world"](https://openai.com/index/harness-engineering/)
|
|
@@ -67,13 +74,13 @@ Install into a custom skills directory:
|
|
|
67
74
|
npx @hallucination-studio/harness-engine install --path /path/to/skills
|
|
68
75
|
```
|
|
69
76
|
|
|
70
|
-
Replace an existing installed
|
|
77
|
+
Replace an existing installed skill:
|
|
71
78
|
|
|
72
79
|
```bash
|
|
73
80
|
npx @hallucination-studio/harness-engine install --local --force
|
|
74
81
|
```
|
|
75
82
|
|
|
76
|
-
Show where the
|
|
83
|
+
Show where the skill would be installed:
|
|
77
84
|
|
|
78
85
|
```bash
|
|
79
86
|
npx @hallucination-studio/harness-engine where --local
|
|
@@ -97,8 +104,8 @@ prose with its concrete product style before substantial UI work.
|
|
|
97
104
|
|
|
98
105
|
## Update An Installed Skill Package
|
|
99
106
|
|
|
100
|
-
The `npx` installer installs or replaces the Codex
|
|
101
|
-
To update an already installed
|
|
107
|
+
The `npx` installer installs or replaces the `harness-engine` Codex skill.
|
|
108
|
+
To update an already installed skill, rerun `install` with `--force` in the same install location.
|
|
102
109
|
|
|
103
110
|
Replace the local skill install:
|
|
104
111
|
|
package/bin/install.js
CHANGED
|
@@ -5,8 +5,7 @@ const os = require("os");
|
|
|
5
5
|
const path = require("path");
|
|
6
6
|
|
|
7
7
|
const PACKAGE_ROOT = path.resolve(__dirname, "..");
|
|
8
|
-
const
|
|
9
|
-
const BUNDLE_ENTRIES = [".codex-plugin", "skills"];
|
|
8
|
+
const SKILL_NAME = "harness-engine";
|
|
10
9
|
|
|
11
10
|
function printHelp() {
|
|
12
11
|
console.log(`harness-engine
|
|
@@ -19,7 +18,7 @@ Options:
|
|
|
19
18
|
--local Install into <cwd>/.codex/skills
|
|
20
19
|
--global Install into \${CODEX_HOME:-~/.codex}/skills
|
|
21
20
|
--path <dir> Install into a custom skills directory
|
|
22
|
-
--force Replace an existing installed
|
|
21
|
+
--force Replace an existing installed skill
|
|
23
22
|
-h, --help Show this help text
|
|
24
23
|
`);
|
|
25
24
|
}
|
|
@@ -98,25 +97,10 @@ function copyDir(sourceDir, targetDir) {
|
|
|
98
97
|
}
|
|
99
98
|
}
|
|
100
99
|
|
|
101
|
-
function
|
|
102
|
-
const
|
|
103
|
-
if (
|
|
104
|
-
|
|
105
|
-
} else if (stat.isSymbolicLink()) {
|
|
106
|
-
fs.symlinkSync(fs.readlinkSync(sourcePath), targetPath);
|
|
107
|
-
} else {
|
|
108
|
-
fs.mkdirSync(path.dirname(targetPath), { recursive: true });
|
|
109
|
-
fs.copyFileSync(sourcePath, targetPath);
|
|
110
|
-
fs.chmodSync(targetPath, fs.statSync(sourcePath).mode);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function assertBundleSources() {
|
|
115
|
-
for (const entry of BUNDLE_ENTRIES) {
|
|
116
|
-
const sourcePath = path.join(PACKAGE_ROOT, entry);
|
|
117
|
-
if (!fs.existsSync(sourcePath)) {
|
|
118
|
-
throw new Error(`Bundled plugin entry not found: ${sourcePath}`);
|
|
119
|
-
}
|
|
100
|
+
function assertSkillSource() {
|
|
101
|
+
const sourcePath = path.join(PACKAGE_ROOT, "skills", SKILL_NAME);
|
|
102
|
+
if (!fs.existsSync(sourcePath)) {
|
|
103
|
+
throw new Error(`Bundled skill not found: ${sourcePath}`);
|
|
120
104
|
}
|
|
121
105
|
}
|
|
122
106
|
|
|
@@ -132,24 +116,13 @@ function removeIfExists(targetPath, force, label) {
|
|
|
132
116
|
fs.rmSync(targetPath, { recursive: true, force: true });
|
|
133
117
|
}
|
|
134
118
|
|
|
135
|
-
function
|
|
136
|
-
|
|
119
|
+
function installSkill(destinationDir, force) {
|
|
120
|
+
assertSkillSource();
|
|
137
121
|
fs.mkdirSync(destinationDir, { recursive: true });
|
|
138
|
-
const
|
|
139
|
-
removeIfExists(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
for (const entry of BUNDLE_ENTRIES) {
|
|
143
|
-
copyEntry(path.join(PACKAGE_ROOT, entry), path.join(bundleTargetDir, entry));
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Compatibility: older users invoke $harness-engine from a normal skills directory.
|
|
147
|
-
// Keep a top-level skill copy in place while the plugin root carries the bundle.
|
|
148
|
-
const compatTarget = path.join(destinationDir, "harness-engine");
|
|
149
|
-
removeIfExists(compatTarget, force, "Compatibility skill");
|
|
150
|
-
copyDir(path.join(PACKAGE_ROOT, "skills", "harness-engine"), compatTarget);
|
|
151
|
-
|
|
152
|
-
return bundleTargetDir;
|
|
122
|
+
const skillTarget = path.join(destinationDir, SKILL_NAME);
|
|
123
|
+
removeIfExists(skillTarget, force, "Skill");
|
|
124
|
+
copyDir(path.join(PACKAGE_ROOT, "skills", SKILL_NAME), skillTarget);
|
|
125
|
+
return skillTarget;
|
|
153
126
|
}
|
|
154
127
|
|
|
155
128
|
function main() {
|
|
@@ -170,7 +143,7 @@ function main() {
|
|
|
170
143
|
const destinationDir = resolveSkillsDir(args.mode, args.customPath);
|
|
171
144
|
|
|
172
145
|
if (args.command === "where") {
|
|
173
|
-
console.log(path.join(destinationDir,
|
|
146
|
+
console.log(path.join(destinationDir, SKILL_NAME));
|
|
174
147
|
return;
|
|
175
148
|
}
|
|
176
149
|
|
|
@@ -181,8 +154,8 @@ function main() {
|
|
|
181
154
|
}
|
|
182
155
|
|
|
183
156
|
try {
|
|
184
|
-
const installedPath =
|
|
185
|
-
console.log(`Installed ${
|
|
157
|
+
const installedPath = installSkill(destinationDir, args.force);
|
|
158
|
+
console.log(`Installed ${SKILL_NAME} skill to ${installedPath}`);
|
|
186
159
|
console.log("Invoke it in Codex with $harness-engine.");
|
|
187
160
|
} catch (error) {
|
|
188
161
|
console.error(`Install failed: ${error.message}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hallucination-studio/harness-engine",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.17.412ec6e",
|
|
4
4
|
"description": "Install the harness-engine Codex skill for initializing and reconciling advanced repository harness docs.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
},
|
|
20
20
|
"files": [
|
|
21
21
|
"bin",
|
|
22
|
-
".codex-plugin/**",
|
|
23
22
|
"skills/**/SKILL.md",
|
|
24
23
|
"skills/**/agents/**",
|
|
25
24
|
"skills/**/assets/**",
|
|
@@ -197,16 +197,15 @@ def test_pack_excludes_external_design_dependency(tmp_root):
|
|
|
197
197
|
pack_data = json.loads(result.stdout[json_start:].strip())
|
|
198
198
|
files = {item["path"] for item in pack_data[0]["files"]}
|
|
199
199
|
for required_path in [
|
|
200
|
-
".codex-plugin/plugin.json",
|
|
201
200
|
"skills/harness-engine/SKILL.md",
|
|
202
201
|
]:
|
|
203
202
|
if required_path not in files:
|
|
204
203
|
raise AssertionError(f"npm pack should include {required_path}")
|
|
205
204
|
forbidden_prefixes = [
|
|
205
|
+
".codex-plugin/",
|
|
206
206
|
"skills/google-design-style/",
|
|
207
207
|
"third_party/",
|
|
208
208
|
]
|
|
209
209
|
for file_path in files:
|
|
210
210
|
if any(file_path.startswith(prefix) for prefix in forbidden_prefixes):
|
|
211
211
|
raise AssertionError(f"npm pack should not include external design source or adapter: {file_path}")
|
|
212
|
-
|