hardness 1.0.0 → 1.1.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.
Files changed (52) hide show
  1. package/AGENTS.md +11 -0
  2. package/CHANGELOG.md +36 -0
  3. package/README.md +62 -15
  4. package/node_modules/@hardness/analyzers/package.json +1 -1
  5. package/node_modules/@hardness/core/dist/common/paths.js +2 -2
  6. package/node_modules/@hardness/core/dist/common/paths.js.map +1 -1
  7. package/node_modules/@hardness/core/package.json +1 -1
  8. package/node_modules/@hardness/prompts/package.json +1 -1
  9. package/package.json +1 -1
  10. package/packages/analyzers/package.json +1 -1
  11. package/packages/cli/dist/commands/discover.js +47 -6
  12. package/packages/cli/dist/commands/discover.js.map +1 -1
  13. package/packages/cli/dist/commands/plan.js +39 -6
  14. package/packages/cli/dist/commands/plan.js.map +1 -1
  15. package/packages/cli/dist/commands/spec.js +34 -6
  16. package/packages/cli/dist/commands/spec.js.map +1 -1
  17. package/packages/cli/dist/dispatcher.d.ts +2 -0
  18. package/packages/cli/dist/dispatcher.js +63 -62
  19. package/packages/cli/dist/dispatcher.js.map +1 -1
  20. package/packages/cli/dist/generators/prd-generator.d.ts +14 -0
  21. package/packages/cli/dist/generators/prd-generator.js +164 -0
  22. package/packages/cli/dist/generators/prd-generator.js.map +1 -0
  23. package/packages/cli/dist/generators/spec-generator.d.ts +35 -0
  24. package/packages/cli/dist/generators/spec-generator.js +245 -0
  25. package/packages/cli/dist/generators/spec-generator.js.map +1 -0
  26. package/packages/cli/dist/generators/sprint-generator.d.ts +51 -0
  27. package/packages/cli/dist/generators/sprint-generator.js +162 -0
  28. package/packages/cli/dist/generators/sprint-generator.js.map +1 -0
  29. package/packages/cli/dist/index.js +1 -1
  30. package/packages/cli/dist/interview/evaluator-prompt.d.ts +9 -0
  31. package/packages/cli/dist/interview/evaluator-prompt.js +192 -0
  32. package/packages/cli/dist/interview/evaluator-prompt.js.map +1 -0
  33. package/packages/cli/dist/interview/evaluator.d.ts +46 -0
  34. package/packages/cli/dist/interview/evaluator.js +142 -0
  35. package/packages/cli/dist/interview/evaluator.js.map +1 -0
  36. package/packages/cli/dist/interview/questions.d.ts +29 -0
  37. package/packages/cli/dist/interview/questions.js +642 -0
  38. package/packages/cli/dist/interview/questions.js.map +1 -0
  39. package/packages/cli/dist/interview/runner.d.ts +14 -0
  40. package/packages/cli/dist/interview/runner.js +327 -0
  41. package/packages/cli/dist/interview/runner.js.map +1 -0
  42. package/packages/cli/dist/interview/suggestions.d.ts +6 -0
  43. package/packages/cli/dist/interview/suggestions.js +230 -0
  44. package/packages/cli/dist/interview/suggestions.js.map +1 -0
  45. package/packages/cli/dist/interview/types.d.ts +46 -0
  46. package/packages/cli/dist/interview/types.js +50 -0
  47. package/packages/cli/dist/interview/types.js.map +1 -0
  48. package/packages/cli/package.json +1 -1
  49. package/packages/core/dist/common/paths.js +2 -2
  50. package/packages/core/dist/common/paths.js.map +1 -1
  51. package/packages/core/package.json +1 -1
  52. package/packages/prompts/package.json +1 -1
@@ -0,0 +1,50 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ export const MANIFEST_MAP = {
4
+ 'package.json': { stackProfile: 'typescript-node', label: 'Node.js / TypeScript' },
5
+ 'tsconfig.json': { stackProfile: 'typescript-node', label: 'TypeScript' },
6
+ 'go.mod': { stackProfile: 'generic', label: 'Go' },
7
+ 'Cargo.toml': { stackProfile: 'generic', label: 'Rust' },
8
+ 'pyproject.toml': { stackProfile: 'generic', label: 'Python' },
9
+ 'requirements.txt': { stackProfile: 'generic', label: 'Python' },
10
+ 'pom.xml': { stackProfile: 'generic', label: 'Java / Maven' },
11
+ 'build.gradle': { stackProfile: 'generic', label: 'Java / Gradle' },
12
+ 'build.gradle.kts': { stackProfile: 'generic', label: 'Kotlin / Gradle' },
13
+ Gemfile: { stackProfile: 'generic', label: 'Ruby' },
14
+ 'composer.json': { stackProfile: 'generic', label: 'PHP / Composer' },
15
+ 'mix.exs': { stackProfile: 'generic', label: 'Elixir' },
16
+ 'CMakeLists.txt': { stackProfile: 'generic', label: 'C / C++ (CMake)' },
17
+ Makefile: { stackProfile: 'generic', label: 'Make' },
18
+ };
19
+ export const SOURCE_EXTENSIONS = new Set([
20
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
21
+ '.py', '.go', '.rs', '.java', '.kt', '.rb', '.php',
22
+ '.cs', '.cpp', '.c', '.h', '.hpp', '.swift', '.scala',
23
+ '.vue', '.svelte', '.astro',
24
+ ]);
25
+ function listTopLevelFiles(dir) {
26
+ try {
27
+ return fs
28
+ .readdirSync(dir, { withFileTypes: true })
29
+ .filter((e) => e.isFile())
30
+ .map((e) => e.name)
31
+ .filter((n) => !n.startsWith('.'));
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ export function detectStack(root) {
38
+ const files = listTopLevelFiles(root);
39
+ for (const [manifest, info] of Object.entries(MANIFEST_MAP)) {
40
+ if (files.includes(manifest)) {
41
+ return { manifest, stackProfile: info.stackProfile, label: info.label, files };
42
+ }
43
+ }
44
+ const hasSource = files.some((f) => SOURCE_EXTENSIONS.has(path.extname(f)));
45
+ if (hasSource) {
46
+ return { manifest: null, stackProfile: 'generic', label: 'Generic (source files detected)', files };
47
+ }
48
+ return { manifest: null, stackProfile: 'generic', label: 'Empty / unknown', files };
49
+ }
50
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/interview/types.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hardness/cli",
3
- "version": "1.0.0",
3
+ "version": "1.1.2",
4
4
  "description": "Hardness CLI — Universal Agentic Development Harness",
5
5
  "author": "cmt-t",
6
6
  "license": "MIT",
@@ -33,8 +33,8 @@ export function normalizeProjectRel(filePath, customRoot) {
33
33
  if (relative.startsWith('..') || path.isAbsolute(relative)) {
34
34
  throw new Error(`Path "${filePath}" is outside the project root "${root}"`);
35
35
  }
36
- // Normalize path separators to '/'
37
- return relative.split(path.sep).join('/');
36
+ // Normalize path separators to '/' (handle both \\ and / regardless of OS)
37
+ return relative.split(path.sep).join('/').replace(/\\/g, '/');
38
38
  }
39
39
  /**
40
40
  * Returns the list of protected paths/directories that the agent cannot modify.
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/common/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,sBAA8B,EAAE,UAAmB;IACjF,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;IACtE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEnD,yEAAyE;IACzE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,6BAA6B,sBAAsB,0BAA0B,IAAI,GAAG,CAAC,CAAC;IACxG,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,UAAmB;IACvE,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;IACtE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEnD,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,kCAAkC,IAAI,GAAG,CAAC,CAAC;IAC9E,CAAC;IAED,mCAAmC;IACnC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,oBAAoB;QACpB,mBAAmB;QACnB,kBAAkB;QAClB,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,sBAA8B,EAAE,UAAmB;IACjF,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,YAAY,GAAG,mBAAmB,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sDAAsD;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IAEjD,mDAAmD;IACnD,IACE,YAAY,KAAK,WAAW;QAC5B,YAAY,KAAK,uBAAuB;QACxC,YAAY,KAAK,uBAAuB,EACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACrC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;QAC/B,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CACxC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/common/paths.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hardness/core",
3
- "version": "1.0.0",
3
+ "version": "1.1.2",
4
4
  "description": "Hardness Core — orchestrator, gates, locks, config and security",
5
5
  "author": "cmt-t",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hardness/prompts",
3
- "version": "1.0.0",
3
+ "version": "1.1.2",
4
4
  "description": "Hardness Prompts — role-based prompt templates for the agent",
5
5
  "author": "cmt-t",
6
6
  "license": "MIT",