jsharness 1.0.0 → 1.0.2

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/bin/jsharness.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
 
3
3
  /**
4
4
  * jsharness CLI
package/lib/index.mjs CHANGED
@@ -611,7 +611,18 @@ export async function runInit(projectDir, options = {}) {
611
611
  // 1. 确定 Harness 源路径
612
612
  const harnessDir = findHarnessSource(projectDir);
613
613
  if (!harnessDir) {
614
- console.error('❌ 未找到 .harness/ 目录。请确保在包含 .harness/ 的项目或包中运行。');
614
+ console.error('❌ 未找到 .harness/ 目录。');
615
+ console.error('');
616
+ console.error(' 请先安装 jsharness:');
617
+ console.error(' npm i -D jsharness');
618
+ console.error('');
619
+ console.error(' 然后重新运行:');
620
+ console.error(' npx jsharness init --verbose');
621
+ console.error('');
622
+ // 输出调试信息
623
+ const nmPath = path.join(projectDir, 'node_modules', 'jsharness', '.harness');
624
+ console.error(` [DEBUG] 项目目录: ${projectDir}`);
625
+ console.error(` [DEBUG] node_modules/jsharness/.harness 存在: ${fs.existsSync(nmPath) ? '是' : '否'}`);
615
626
  process.exit(1);
616
627
  }
617
628
  if (verbose) console.log(` 📂 Harness 源: ${harnessDir}`);
@@ -769,10 +780,45 @@ function findHarnessSource(projectDir) {
769
780
  const localHarness = path.join(projectDir, '.harness');
770
781
  if (fs.existsSync(localHarness)) return localHarness;
771
782
 
772
- // 2. npm 包内的 harness(当本包被安装后)
773
- // __dirname 指向 lib/,向上两级到包根,再到 .harness/
774
- const packageHarness = path.join(__dirname, '..', '..', '.harness');
775
- if (fs.existsSync(packageHarness)) return packageHarness;
783
+ // 2. 通过 node_modules 查找(npm i -D jsharness 后)
784
+ const nmCandidates = [
785
+ path.join(projectDir, 'node_modules', 'jsharness', '.harness'),
786
+ path.join(projectDir, 'node_modules', '.pnpm', 'jsharness*', 'node_modules', 'jsharness', '.harness'),
787
+ ];
788
+ for (const c of nmCandidates) {
789
+ try {
790
+ const expanded = (c.includes('*') ? fs.readdirSync(path.dirname(c))
791
+ .filter(d => d.startsWith('jsharness')).map(d => path.join(path.dirname(c), d, 'node_modules', 'jsharness', '.harness')) : [c])
792
+ .flat();
793
+ for (const p of expanded) {
794
+ if (fs.existsSync(p)) return p;
795
+ }
796
+ } catch { /* skip */ }
797
+ }
798
+
799
+ // 3. 通过 require.resolve 定位 npm 包根
800
+ try {
801
+ const _require = createRequire(import.meta.url);
802
+ const pkgPath = _require.resolve('jsharness/package.json');
803
+ const packageHarness = path.join(path.dirname(pkgPath), '.harness');
804
+ if (fs.existsSync(packageHarness)) return packageHarness;
805
+ } catch {
806
+ // require 解析失败,继续尝试其他方式
807
+ }
808
+
809
+ // 4. __dirname 相对路径(本地开发模式)
810
+ const devHarness = path.join(__dirname, '..', '..', '.harness');
811
+ if (fs.existsSync(devHarness)) return devHarness;
812
+
813
+ // 5. 最后尝试:沿 __dirname 向上搜索 .harness
814
+ let current = __dirname;
815
+ for (let i = 0; i < 5; i++) {
816
+ const candidate = path.join(current, '.harness');
817
+ if (fs.existsSync(candidate) && current !== projectDir) return candidate;
818
+ const parent = path.dirname(current);
819
+ if (parent === current) break;
820
+ current = parent;
821
+ }
776
822
 
777
823
  return null;
778
824
  }
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"jsharness","version":"1.0.0","description":"Harness Engineering - AI 编程行为工程化管控系统。将 rules/skills/gate/agents 一键注入到 CodeBuddy、Cursor、Copilot 等 AI 工具中。","main":"lib/index.mjs","bin":{"jsharness":"./bin/jsharness.js"},"type":"module","scripts":{"jsharness":"node bin/jsharness.js","init":"node bin/jsharness.js init","list-tools":"node bin/jsharness.js list-tools","status":"node bin/jsharness.js status","test":"node bin/jsharness.js status"},"keywords":["harness","ai-coding","codebuddy","cursor","copilot","rules-engineering","ai-assistant","vue3","spring-boot"],"author":"","license":"ISC","engines":{"node":">=18.0.0"},"files":["bin/","lib/",".harness/","README.md"],"dependencies":{"commander":"^12.1.0"},"devDependencies":{"openspec":"^0.0.0","webpack":"^5.107.0","webpack-cli":"^7.0.2"},"repository":{"type":"git","url":""},"homepage":""}
1
+ {"name":"jsharness","version":"1.0.2","description":"Harness Engineering - AI 编程行为工程化管控系统。将 rules/skills/gate/agents 一键注入到 CodeBuddy、Cursor、Copilot 等 AI 工具中。","main":"lib/index.mjs","bin":{"jsharness":"./bin/jsharness.js"},"type":"module","scripts":{"jsharness":"node bin/jsharness.js","init":"node bin/jsharness.js init","list-tools":"node bin/jsharness.js list-tools","status":"node bin/jsharness.js status","test":"node bin/jsharness.js status"},"keywords":["harness","ai-coding","codebuddy","cursor","copilot","rules-engineering","ai-assistant","vue3","spring-boot"],"author":"","license":"ISC","engines":{"node":">=18.0.0"},"files":["bin/","lib/",".harness/","README.md"],"dependencies":{"commander":"^12.1.0"},"devDependencies":{"openspec":"^0.0.0","webpack":"^5.107.0","webpack-cli":"^7.0.2"},"repository":{"type":"git","url":""},"homepage":""}