@rpamis/comet 0.3.7 → 0.3.9

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 (100) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +557 -539
  3. package/assets/manifest.json +41 -34
  4. package/assets/skills/comet/SKILL.md +282 -329
  5. package/assets/skills/comet/reference/auto-transition.md +27 -0
  6. package/assets/skills/comet/reference/comet-yaml-fields.md +68 -0
  7. package/assets/skills/comet/reference/context-recovery.md +35 -0
  8. package/assets/skills/comet/reference/debug-gate.md +17 -0
  9. package/assets/skills/comet/reference/decision-point.md +20 -0
  10. package/assets/skills/comet/reference/dirty-worktree.md +59 -59
  11. package/assets/skills/comet/reference/file-structure.md +28 -0
  12. package/assets/skills/comet/reference/subagent-dispatch.md +113 -0
  13. package/assets/skills/comet/rules/comet-phase-guard.en.md +123 -0
  14. package/assets/skills/comet/rules/comet-phase-guard.md +125 -90
  15. package/assets/skills/comet/scripts/comet-guard.sh +27 -1
  16. package/assets/skills/comet/scripts/comet-hook-guard.sh +121 -45
  17. package/assets/skills/comet/scripts/comet-state.sh +162 -7
  18. package/assets/skills/comet/scripts/comet-yaml-validate.sh +3 -1
  19. package/assets/skills/comet-archive/SKILL.md +100 -106
  20. package/assets/skills/comet-build/SKILL.md +304 -316
  21. package/assets/skills/comet-design/SKILL.md +263 -272
  22. package/assets/skills/comet-hotfix/SKILL.md +204 -211
  23. package/assets/skills/comet-open/SKILL.md +220 -186
  24. package/assets/skills/comet-tweak/SKILL.md +180 -179
  25. package/assets/skills/comet-verify/SKILL.md +234 -240
  26. package/assets/skills-zh/comet/SKILL.md +269 -332
  27. package/assets/skills-zh/comet/reference/auto-transition.md +27 -0
  28. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +71 -0
  29. package/assets/skills-zh/comet/reference/context-recovery.md +35 -0
  30. package/assets/skills-zh/comet/reference/debug-gate.md +17 -0
  31. package/assets/skills-zh/comet/reference/decision-point.md +20 -0
  32. package/assets/skills-zh/comet/reference/dirty-worktree.md +59 -59
  33. package/assets/skills-zh/comet/reference/file-structure.md +28 -0
  34. package/assets/skills-zh/comet/reference/subagent-dispatch.md +120 -0
  35. package/assets/skills-zh/comet-archive/SKILL.md +100 -106
  36. package/assets/skills-zh/comet-build/SKILL.md +317 -316
  37. package/assets/skills-zh/comet-design/SKILL.md +264 -273
  38. package/assets/skills-zh/comet-hotfix/SKILL.md +200 -207
  39. package/assets/skills-zh/comet-open/SKILL.md +220 -186
  40. package/assets/skills-zh/comet-tweak/SKILL.md +176 -175
  41. package/assets/skills-zh/comet-verify/SKILL.md +232 -238
  42. package/bin/comet.js +3 -3
  43. package/dist/cli/index.js +21 -1
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/commands/doctor.d.ts.map +1 -1
  46. package/dist/commands/doctor.js +5 -1
  47. package/dist/commands/doctor.js.map +1 -1
  48. package/dist/commands/i18n.d.ts +4 -0
  49. package/dist/commands/i18n.d.ts.map +1 -0
  50. package/dist/commands/i18n.js +154 -0
  51. package/dist/commands/i18n.js.map +1 -0
  52. package/dist/commands/init.d.ts +3 -0
  53. package/dist/commands/init.d.ts.map +1 -1
  54. package/dist/commands/init.js +127 -75
  55. package/dist/commands/init.js.map +1 -1
  56. package/dist/commands/uninstall.d.ts +9 -0
  57. package/dist/commands/uninstall.d.ts.map +1 -0
  58. package/dist/commands/uninstall.js +132 -0
  59. package/dist/commands/uninstall.js.map +1 -0
  60. package/dist/commands/update.d.ts +3 -2
  61. package/dist/commands/update.d.ts.map +1 -1
  62. package/dist/commands/update.js +105 -68
  63. package/dist/commands/update.js.map +1 -1
  64. package/dist/core/codegraph.d.ts +4 -7
  65. package/dist/core/codegraph.d.ts.map +1 -1
  66. package/dist/core/codegraph.js +63 -41
  67. package/dist/core/codegraph.js.map +1 -1
  68. package/dist/core/detect.d.ts +13 -1
  69. package/dist/core/detect.d.ts.map +1 -1
  70. package/dist/core/detect.js +68 -12
  71. package/dist/core/detect.js.map +1 -1
  72. package/dist/core/openspec.d.ts +2 -2
  73. package/dist/core/openspec.d.ts.map +1 -1
  74. package/dist/core/openspec.js +51 -22
  75. package/dist/core/openspec.js.map +1 -1
  76. package/dist/core/platforms.d.ts.map +1 -1
  77. package/dist/core/platforms.js +14 -1
  78. package/dist/core/platforms.js.map +1 -1
  79. package/dist/core/skills.d.ts +3 -1
  80. package/dist/core/skills.d.ts.map +1 -1
  81. package/dist/core/skills.js +151 -66
  82. package/dist/core/skills.js.map +1 -1
  83. package/dist/core/superpowers.d.ts +1 -1
  84. package/dist/core/superpowers.d.ts.map +1 -1
  85. package/dist/core/superpowers.js +5 -1
  86. package/dist/core/superpowers.js.map +1 -1
  87. package/dist/core/uninstall.d.ts +28 -0
  88. package/dist/core/uninstall.d.ts.map +1 -0
  89. package/dist/core/uninstall.js +421 -0
  90. package/dist/core/uninstall.js.map +1 -0
  91. package/dist/core/version.d.ts +31 -0
  92. package/dist/core/version.d.ts.map +1 -0
  93. package/dist/core/version.js +111 -0
  94. package/dist/core/version.js.map +1 -0
  95. package/dist/utils/file-system.d.ts +23 -0
  96. package/dist/utils/file-system.d.ts.map +1 -1
  97. package/dist/utils/file-system.js +100 -5
  98. package/dist/utils/file-system.js.map +1 -1
  99. package/package.json +69 -64
  100. package/scripts/postinstall.js +44 -44
@@ -1,17 +1,52 @@
1
1
  import { promises as fs } from 'fs';
2
2
  import path from 'path';
3
+ /**
4
+ * Resolve symlinks in a path, handling broken symlinks by following their
5
+ * readlink target. Falls back to the original path if resolution fails.
6
+ */
7
+ async function resolveSymlinkPath(filePath) {
8
+ try {
9
+ return await fs.realpath(filePath);
10
+ }
11
+ catch {
12
+ // Path doesn't fully exist — walk up to find the deepest existing ancestor
13
+ const dir = path.dirname(filePath);
14
+ if (dir === filePath)
15
+ return filePath; // filesystem root
16
+ const resolvedDir = await resolveSymlinkPath(dir);
17
+ const base = path.basename(filePath);
18
+ // Check if this segment is a broken symlink and follow its target
19
+ try {
20
+ const stat = await fs.lstat(path.join(resolvedDir, base));
21
+ if (stat.isSymbolicLink()) {
22
+ const target = await fs.readlink(path.join(resolvedDir, base));
23
+ return path.resolve(resolvedDir, target);
24
+ }
25
+ }
26
+ catch {
27
+ // Segment doesn't exist — return as-is
28
+ }
29
+ return path.join(resolvedDir, base);
30
+ }
31
+ }
3
32
  /**
4
33
  * Ensure a directory exists, creating it recursively if needed.
34
+ * Resolves symlinks so that broken symlink targets are created correctly.
5
35
  */
6
36
  export async function ensureDir(dir) {
7
- await fs.mkdir(dir, { recursive: true });
37
+ const resolved = await resolveSymlinkPath(dir);
38
+ await fs.mkdir(resolved, { recursive: true });
8
39
  }
9
40
  /**
10
41
  * Copy a file from src to dest, creating parent directories if needed.
42
+ * Resolves symlinks in the destination path so files are written to the
43
+ * actual target location when dest contains symlinks (e.g., skill dirs
44
+ * symlinked from ~/.claude/skills/ to ~/.agents/skills/).
11
45
  */
12
46
  export async function copyFile(src, dest) {
13
- await ensureDir(path.dirname(dest));
14
- await fs.copyFile(src, dest);
47
+ const resolvedDest = await resolveSymlinkPath(dest);
48
+ await ensureDir(path.dirname(resolvedDest));
49
+ await fs.copyFile(src, resolvedDest);
15
50
  }
16
51
  /**
17
52
  * Check if a file or directory exists.
@@ -34,10 +69,12 @@ export async function readJson(filePath) {
34
69
  }
35
70
  /**
36
71
  * Write content to a file, creating parent directories if needed.
72
+ * Resolves symlinks so files are written to the actual target location.
37
73
  */
38
74
  export async function writeFile(filePath, content) {
39
- await ensureDir(path.dirname(filePath));
40
- await fs.writeFile(filePath, content, 'utf-8');
75
+ const resolved = await resolveSymlinkPath(filePath);
76
+ await ensureDir(path.dirname(resolved));
77
+ await fs.writeFile(resolved, content, 'utf-8');
41
78
  }
42
79
  /**
43
80
  * List entries in a directory. Returns empty array if directory doesn't exist.
@@ -54,4 +91,62 @@ export async function readDir(dirPath) {
54
91
  throw error;
55
92
  }
56
93
  }
94
+ /**
95
+ * Returns true when an error means the path was simply not found. ENOENT is
96
+ * the only non-fatal outcome for the removal helpers below; all other errors
97
+ * (permissions, IO) are reported as failures instead of being masked as
98
+ * "already gone".
99
+ */
100
+ function isNotFoundError(error) {
101
+ return error?.code === 'ENOENT';
102
+ }
103
+ /**
104
+ * Remove a file. Returns true if the file existed and was removed.
105
+ * Operates on the path directly so a symlink entry is removed rather than its
106
+ * resolved target (avoids deleting files the symlink merely points at).
107
+ */
108
+ export async function removeFile(filePath) {
109
+ try {
110
+ await fs.unlink(filePath);
111
+ return true;
112
+ }
113
+ catch {
114
+ // Not found or failed (permissions/IO): nothing was removed.
115
+ return false;
116
+ }
117
+ }
118
+ /**
119
+ * Remove a directory recursively. Returns true if the directory existed and was removed.
120
+ * Symlinked directories are unlinked directly rather than recursed into, so the
121
+ * directory a symlink points at is never deleted.
122
+ */
123
+ export async function removeDir(dirPath) {
124
+ try {
125
+ // lstat does not follow symlinks; unlink a symlinked dir instead of rm-ing its target.
126
+ const stat = await fs.lstat(dirPath);
127
+ if (stat.isSymbolicLink()) {
128
+ await fs.unlink(dirPath);
129
+ return true;
130
+ }
131
+ await fs.rm(dirPath, { recursive: true, force: true });
132
+ return true;
133
+ }
134
+ catch (error) {
135
+ return isNotFoundError(error);
136
+ }
137
+ }
138
+ /**
139
+ * Check if a directory is empty. A missing directory is treated as empty;
140
+ * unreadable directories (permissions/IO) return false so callers never delete
141
+ * a directory they could not inspect.
142
+ */
143
+ export async function isDirEmpty(dirPath) {
144
+ try {
145
+ const entries = await fs.readdir(dirPath);
146
+ return entries.length === 0;
147
+ }
148
+ catch (error) {
149
+ return isNotFoundError(error);
150
+ }
151
+ }
57
152
  //# sourceMappingURL=file-system.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAY;IACtD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAc,QAAgB;IAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IAC/D,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,EAAE,IAAI,CAAC;QACpD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,64 +1,69 @@
1
- {
2
- "name": "@rpamis/comet",
3
- "version": "0.3.7",
4
- "description": "OpenSpec + Superpowers dual-star development workflow",
5
- "keywords": [
6
- "comet",
7
- "openspec",
8
- "superpowers",
9
- "skills",
10
- "workflow"
11
- ],
12
- "license": "MIT",
13
- "author": "benym",
14
- "type": "module",
15
- "publishConfig": {
16
- "access": "public"
17
- },
18
- "bin": {
19
- "comet": "./bin/comet.js"
20
- },
21
- "files": [
22
- "dist",
23
- "bin",
24
- "assets",
25
- "scripts/postinstall.js",
26
- "!dist/**/*.test.js",
27
- "!dist/**/__tests__"
28
- ],
29
- "scripts": {
30
- "build": "node build.js",
31
- "dev": "tsc --watch",
32
- "test": "vitest run",
33
- "test:coverage": "vitest run --coverage",
34
- "test:watch": "vitest",
35
- "lint": "eslint src/",
36
- "lint:fix": "eslint src/ --fix",
37
- "format": "prettier --write src/",
38
- "format:check": "prettier --check src/",
39
- "test:shell": "node scripts/run-bats.js test/shell/*.bats",
40
- "benchmark:context": "node scripts/context-compression-benchmark.mjs",
41
- "benchmark:execution": "node scripts/context-execution-benchmark.mjs",
42
- "prepare": "pnpm run build",
43
- "prepublishOnly": "node scripts/prepublish-check.js && pnpm run build",
44
- "postinstall": "node scripts/postinstall.js"
45
- },
46
- "packageManager": "pnpm@10.18.3",
47
- "engines": {
48
- "node": ">=20"
49
- },
50
- "devDependencies": {
51
- "@eslint/js": "^10.0.1",
52
- "@types/node": "^24.2.0",
53
- "@vitest/coverage-v8": "^4.1.6",
54
- "eslint": "^10.4.0",
55
- "prettier": "^3.8.3",
56
- "typescript": "^5.9.3",
57
- "typescript-eslint": "^8.59.3",
58
- "vitest": "^4.1.6"
59
- },
60
- "dependencies": {
61
- "@inquirer/prompts": "^8.4.3",
62
- "commander": "^14.0.0"
63
- }
64
- }
1
+ {
2
+ "name": "@rpamis/comet",
3
+ "version": "0.3.9",
4
+ "description": "Agent Skill Harness Phase-Guarded Automation From Idea To Archive",
5
+ "keywords": [
6
+ "comet",
7
+ "openspec",
8
+ "superpowers",
9
+ "skills",
10
+ "workflow"
11
+ ],
12
+ "license": "MIT",
13
+ "author": "benym",
14
+ "type": "module",
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "bin": {
19
+ "comet": "./bin/comet.js"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "bin",
24
+ "assets",
25
+ "scripts/postinstall.js",
26
+ "!dist/**/*.test.js",
27
+ "!dist/**/__tests__"
28
+ ],
29
+ "scripts": {
30
+ "build": "node build.js",
31
+ "dev": "tsc --watch",
32
+ "test": "vitest run",
33
+ "test:coverage": "vitest run --coverage",
34
+ "test:watch": "vitest",
35
+ "lint": "eslint src/",
36
+ "lint:fix": "eslint src/ --fix",
37
+ "format": "prettier --write src/",
38
+ "format:check": "prettier --check src/",
39
+ "test:shell": "node scripts/run-bats.js test/shell/*.bats",
40
+ "benchmark:context": "node scripts/context-compression-benchmark.mjs",
41
+ "benchmark:execution": "node scripts/context-execution-benchmark.mjs",
42
+ "prepare": "husky && pnpm run build",
43
+ "prepublishOnly": "node scripts/prepublish-check.js && pnpm run build",
44
+ "postinstall": "node scripts/postinstall.js"
45
+ },
46
+ "lint-staged": {
47
+ "src/**/*.{ts,tsx,js,mjs,cjs,json,md,yaml,yml}": "prettier --write"
48
+ },
49
+ "packageManager": "pnpm@10.18.3",
50
+ "engines": {
51
+ "node": ">=20"
52
+ },
53
+ "devDependencies": {
54
+ "@eslint/js": "^10.0.1",
55
+ "@types/node": "^24.2.0",
56
+ "@vitest/coverage-v8": "^4.1.6",
57
+ "eslint": "^10.4.0",
58
+ "husky": "^9.1.7",
59
+ "lint-staged": "^17.0.7",
60
+ "prettier": "^3.8.3",
61
+ "typescript": "^5.9.3",
62
+ "typescript-eslint": "^8.59.3",
63
+ "vitest": "^4.1.6"
64
+ },
65
+ "dependencies": {
66
+ "@inquirer/prompts": "^8.4.3",
67
+ "commander": "^14.0.0"
68
+ }
69
+ }
@@ -1,44 +1,44 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Postinstall script that hints about comet init.
5
- *
6
- * The tip is suppressed when:
7
- * - CI=true environment variable is set
8
- * - COMET_NO_HINTS=1 environment variable is set
9
- * - dist/ directory doesn't exist (dev setup scenario)
10
- */
11
-
12
- import { promises as fs } from 'fs';
13
- import path from 'path';
14
- import { fileURLToPath } from 'url';
15
-
16
- const __filename = fileURLToPath(import.meta.url);
17
- const __dirname = path.dirname(__filename);
18
-
19
- function shouldSkip() {
20
- if (process.env.CI === 'true' || process.env.CI === '1') return true;
21
- if (process.env.COMET_NO_HINTS === '1') return true;
22
- return false;
23
- }
24
-
25
- async function distExists() {
26
- try {
27
- const stat = await fs.stat(path.join(__dirname, '..', 'dist'));
28
- return stat.isDirectory();
29
- } catch {
30
- return false;
31
- }
32
- }
33
-
34
- async function main() {
35
- try {
36
- if (shouldSkip()) return;
37
- if (!(await distExists())) return;
38
- console.log(`\nTip: Run 'comet init' to set up Comet workflow in your project`);
39
- } catch {
40
- // Never break npm install
41
- }
42
- }
43
-
44
- main().catch(() => process.exit(0));
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Postinstall script that hints about comet init.
5
+ *
6
+ * The tip is suppressed when:
7
+ * - CI=true environment variable is set
8
+ * - COMET_NO_HINTS=1 environment variable is set
9
+ * - dist/ directory doesn't exist (dev setup scenario)
10
+ */
11
+
12
+ import { promises as fs } from 'fs';
13
+ import path from 'path';
14
+ import { fileURLToPath } from 'url';
15
+
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = path.dirname(__filename);
18
+
19
+ function shouldSkip() {
20
+ if (process.env.CI === 'true' || process.env.CI === '1') return true;
21
+ if (process.env.COMET_NO_HINTS === '1') return true;
22
+ return false;
23
+ }
24
+
25
+ async function distExists() {
26
+ try {
27
+ const stat = await fs.stat(path.join(__dirname, '..', 'dist'));
28
+ return stat.isDirectory();
29
+ } catch {
30
+ return false;
31
+ }
32
+ }
33
+
34
+ async function main() {
35
+ try {
36
+ if (shouldSkip()) return;
37
+ if (!(await distExists())) return;
38
+ console.log(`\nTip: Run 'comet init' to set up Comet workflow in your project`);
39
+ } catch {
40
+ // Never break npm install
41
+ }
42
+ }
43
+
44
+ main().catch(() => process.exit(0));