@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.
- package/LICENSE +21 -21
- package/README.md +557 -539
- package/assets/manifest.json +41 -34
- package/assets/skills/comet/SKILL.md +282 -329
- package/assets/skills/comet/reference/auto-transition.md +27 -0
- package/assets/skills/comet/reference/comet-yaml-fields.md +68 -0
- package/assets/skills/comet/reference/context-recovery.md +35 -0
- package/assets/skills/comet/reference/debug-gate.md +17 -0
- package/assets/skills/comet/reference/decision-point.md +20 -0
- package/assets/skills/comet/reference/dirty-worktree.md +59 -59
- package/assets/skills/comet/reference/file-structure.md +28 -0
- package/assets/skills/comet/reference/subagent-dispatch.md +113 -0
- package/assets/skills/comet/rules/comet-phase-guard.en.md +123 -0
- package/assets/skills/comet/rules/comet-phase-guard.md +125 -90
- package/assets/skills/comet/scripts/comet-guard.sh +27 -1
- package/assets/skills/comet/scripts/comet-hook-guard.sh +121 -45
- package/assets/skills/comet/scripts/comet-state.sh +162 -7
- package/assets/skills/comet/scripts/comet-yaml-validate.sh +3 -1
- package/assets/skills/comet-archive/SKILL.md +100 -106
- package/assets/skills/comet-build/SKILL.md +304 -316
- package/assets/skills/comet-design/SKILL.md +263 -272
- package/assets/skills/comet-hotfix/SKILL.md +204 -211
- package/assets/skills/comet-open/SKILL.md +220 -186
- package/assets/skills/comet-tweak/SKILL.md +180 -179
- package/assets/skills/comet-verify/SKILL.md +234 -240
- package/assets/skills-zh/comet/SKILL.md +269 -332
- package/assets/skills-zh/comet/reference/auto-transition.md +27 -0
- package/assets/skills-zh/comet/reference/comet-yaml-fields.md +71 -0
- package/assets/skills-zh/comet/reference/context-recovery.md +35 -0
- package/assets/skills-zh/comet/reference/debug-gate.md +17 -0
- package/assets/skills-zh/comet/reference/decision-point.md +20 -0
- package/assets/skills-zh/comet/reference/dirty-worktree.md +59 -59
- package/assets/skills-zh/comet/reference/file-structure.md +28 -0
- package/assets/skills-zh/comet/reference/subagent-dispatch.md +120 -0
- package/assets/skills-zh/comet-archive/SKILL.md +100 -106
- package/assets/skills-zh/comet-build/SKILL.md +317 -316
- package/assets/skills-zh/comet-design/SKILL.md +264 -273
- package/assets/skills-zh/comet-hotfix/SKILL.md +200 -207
- package/assets/skills-zh/comet-open/SKILL.md +220 -186
- package/assets/skills-zh/comet-tweak/SKILL.md +176 -175
- package/assets/skills-zh/comet-verify/SKILL.md +232 -238
- package/bin/comet.js +3 -3
- package/dist/cli/index.js +21 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/i18n.d.ts +4 -0
- package/dist/commands/i18n.d.ts.map +1 -0
- package/dist/commands/i18n.js +154 -0
- package/dist/commands/i18n.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +127 -75
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/uninstall.d.ts +9 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +132 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +3 -2
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +105 -68
- package/dist/commands/update.js.map +1 -1
- package/dist/core/codegraph.d.ts +4 -7
- package/dist/core/codegraph.d.ts.map +1 -1
- package/dist/core/codegraph.js +63 -41
- package/dist/core/codegraph.js.map +1 -1
- package/dist/core/detect.d.ts +13 -1
- package/dist/core/detect.d.ts.map +1 -1
- package/dist/core/detect.js +68 -12
- package/dist/core/detect.js.map +1 -1
- package/dist/core/openspec.d.ts +2 -2
- package/dist/core/openspec.d.ts.map +1 -1
- package/dist/core/openspec.js +51 -22
- package/dist/core/openspec.js.map +1 -1
- package/dist/core/platforms.d.ts.map +1 -1
- package/dist/core/platforms.js +14 -1
- package/dist/core/platforms.js.map +1 -1
- package/dist/core/skills.d.ts +3 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +151 -66
- package/dist/core/skills.js.map +1 -1
- package/dist/core/superpowers.d.ts +1 -1
- package/dist/core/superpowers.d.ts.map +1 -1
- package/dist/core/superpowers.js +5 -1
- package/dist/core/superpowers.js.map +1 -1
- package/dist/core/uninstall.d.ts +28 -0
- package/dist/core/uninstall.d.ts.map +1 -0
- package/dist/core/uninstall.js +421 -0
- package/dist/core/uninstall.js.map +1 -0
- package/dist/core/version.d.ts +31 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +111 -0
- package/dist/core/version.js.map +1 -0
- package/dist/utils/file-system.d.ts +23 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +100 -5
- package/dist/utils/file-system.js.map +1 -1
- package/package.json +69 -64
- 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
|
|
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
|
|
14
|
-
await
|
|
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
|
|
40
|
-
await
|
|
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
|
|
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.
|
|
4
|
-
"description": "
|
|
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
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"eslint": "^10.
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
"
|
|
62
|
-
"
|
|
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
|
+
}
|
package/scripts/postinstall.js
CHANGED
|
@@ -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));
|