@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
+ [![npm version](https://img.shields.io/npm/v/%40hallucination-studio%2Fharness-engine?color=cb3837&logo=npm)](https://www.npmjs.com/package/@hallucination-studio/harness-engine)
4
+ [![npm downloads](https://img.shields.io/npm/dm/%40hallucination-studio%2Fharness-engine?logo=npm)](https://www.npmjs.com/package/@hallucination-studio/harness-engine)
5
+ [![CI](https://github.com/hallucination-studio/harness-engine/actions/workflows/ci.yml/badge.svg)](https://github.com/hallucination-studio/harness-engine/actions/workflows/ci.yml)
6
+ [![Publish Release](https://github.com/hallucination-studio/harness-engine/actions/workflows/publish-release.yml/badge.svg)](https://github.com/hallucination-studio/harness-engine/actions/workflows/publish-release.yml)
7
+ [![Publish Nightly](https://github.com/hallucination-studio/harness-engine/actions/workflows/publish-nightly.yml/badge.svg)](https://github.com/hallucination-studio/harness-engine/actions/workflows/publish-nightly.yml)
8
+ [![license](https://img.shields.io/npm/l/%40hallucination-studio%2Fharness-engine)](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 plugin bundle:
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 plugin bundle would be installed:
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 plugin bundle and compatibility skill entries.
101
- To update an already installed bundle, rerun `install` with `--force` in the same install location.
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 BUNDLE_NAME = "harness-engine-plugin";
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 bundle
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 copyEntry(sourcePath, targetPath) {
102
- const stat = fs.lstatSync(sourcePath);
103
- if (stat.isDirectory()) {
104
- copyDir(sourcePath, targetPath);
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 installBundle(destinationDir, force) {
136
- assertBundleSources();
119
+ function installSkill(destinationDir, force) {
120
+ assertSkillSource();
137
121
  fs.mkdirSync(destinationDir, { recursive: true });
138
- const bundleTargetDir = path.join(destinationDir, BUNDLE_NAME);
139
- removeIfExists(bundleTargetDir, force, "Plugin bundle");
140
-
141
- fs.mkdirSync(bundleTargetDir, { recursive: true });
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, BUNDLE_NAME));
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 = installBundle(destinationDir, args.force);
185
- console.log(`Installed ${BUNDLE_NAME} plugin bundle to ${installedPath}`);
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.15.f39cb72",
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
-
@@ -1,6 +0,0 @@
1
- {
2
- "name": "harness-engine",
3
- "version": "1.0.0",
4
- "description": "Repository harness skill for Codex with optional frontend design-doc templates.",
5
- "skills": "./skills/"
6
- }