oh-my-customcode 0.4.0 → 0.5.0
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/dist/cli/index.js
CHANGED
|
@@ -12314,24 +12314,6 @@ async function checkHooks(targetDir) {
|
|
|
12314
12314
|
fixable: false
|
|
12315
12315
|
};
|
|
12316
12316
|
}
|
|
12317
|
-
async function checkPipelines(targetDir) {
|
|
12318
|
-
const pipelinesDir = path.join(targetDir, "pipelines");
|
|
12319
|
-
const exists2 = await isDirectory(pipelinesDir);
|
|
12320
|
-
if (!exists2) {
|
|
12321
|
-
return {
|
|
12322
|
-
name: "Pipelines",
|
|
12323
|
-
status: "fail",
|
|
12324
|
-
message: "pipelines/ directory not found",
|
|
12325
|
-
fixable: true
|
|
12326
|
-
};
|
|
12327
|
-
}
|
|
12328
|
-
return {
|
|
12329
|
-
name: "Pipelines",
|
|
12330
|
-
status: "pass",
|
|
12331
|
-
message: "Pipelines OK",
|
|
12332
|
-
fixable: false
|
|
12333
|
-
};
|
|
12334
|
-
}
|
|
12335
12317
|
async function checkContexts(targetDir) {
|
|
12336
12318
|
const contextsDir = path.join(targetDir, ".claude", "contexts");
|
|
12337
12319
|
const exists2 = await isDirectory(contextsDir);
|
|
@@ -12384,7 +12366,6 @@ async function fixSingleIssue(check, targetDir) {
|
|
|
12384
12366
|
Skills: () => createMissingDirectory(path.join(targetDir, ".claude", "skills")),
|
|
12385
12367
|
Guides: () => createMissingDirectory(path.join(targetDir, "guides")),
|
|
12386
12368
|
Hooks: () => createMissingDirectory(path.join(targetDir, ".claude", "hooks")),
|
|
12387
|
-
Pipelines: () => createMissingDirectory(path.join(targetDir, "pipelines")),
|
|
12388
12369
|
Contexts: () => createMissingDirectory(path.join(targetDir, ".claude", "contexts")),
|
|
12389
12370
|
Symlinks: async () => {
|
|
12390
12371
|
if (!check.details || check.details.length === 0)
|
|
@@ -12441,7 +12422,6 @@ async function doctorCommand(options = {}) {
|
|
|
12441
12422
|
checkIndexFiles(targetDir),
|
|
12442
12423
|
checkGuides(targetDir),
|
|
12443
12424
|
checkHooks(targetDir),
|
|
12444
|
-
checkPipelines(targetDir),
|
|
12445
12425
|
checkContexts(targetDir)
|
|
12446
12426
|
]);
|
|
12447
12427
|
if (options.fix) {
|
|
@@ -12907,25 +12887,12 @@ function migrateConfig(config) {
|
|
|
12907
12887
|
}
|
|
12908
12888
|
|
|
12909
12889
|
// src/core/installer.ts
|
|
12910
|
-
var DIRECTORY_STRUCTURE = [
|
|
12911
|
-
".claude",
|
|
12912
|
-
".claude/rules",
|
|
12913
|
-
".claude/hooks",
|
|
12914
|
-
".claude/contexts",
|
|
12915
|
-
".claude/agents",
|
|
12916
|
-
".claude/skills",
|
|
12917
|
-
"guides",
|
|
12918
|
-
"pipelines",
|
|
12919
|
-
"pipelines/templates",
|
|
12920
|
-
"pipelines/examples"
|
|
12921
|
-
];
|
|
12922
12890
|
var COMPONENT_PATHS = {
|
|
12923
12891
|
"claude-md": "",
|
|
12924
12892
|
rules: ".claude/rules",
|
|
12925
12893
|
agents: ".claude/agents",
|
|
12926
12894
|
skills: ".claude/skills",
|
|
12927
12895
|
guides: "guides",
|
|
12928
|
-
pipelines: "pipelines",
|
|
12929
12896
|
hooks: ".claude/hooks",
|
|
12930
12897
|
contexts: ".claude/contexts"
|
|
12931
12898
|
};
|
|
@@ -13017,8 +12984,6 @@ async function install(options) {
|
|
|
13017
12984
|
await handleBackup(options.targetDir, !!options.backup, result);
|
|
13018
12985
|
await checkAndWarnExisting(options.targetDir, !!options.force, !!options.backup, result);
|
|
13019
12986
|
await verifyTemplateDirectory();
|
|
13020
|
-
await createDirectoryStructure(options.targetDir);
|
|
13021
|
-
debug("install.directories_created");
|
|
13022
12987
|
await installAllComponents(options.targetDir, options, result);
|
|
13023
12988
|
await installClaudeMdWithTracking(options.targetDir, options, result);
|
|
13024
12989
|
await updateInstallConfig(options.targetDir, options, result.installedComponents);
|
|
@@ -13031,14 +12996,8 @@ async function install(options) {
|
|
|
13031
12996
|
}
|
|
13032
12997
|
return result;
|
|
13033
12998
|
}
|
|
13034
|
-
async function createDirectoryStructure(targetDir) {
|
|
13035
|
-
for (const dir2 of DIRECTORY_STRUCTURE) {
|
|
13036
|
-
const fullPath = join3(targetDir, dir2);
|
|
13037
|
-
await ensureDirectory(fullPath);
|
|
13038
|
-
}
|
|
13039
|
-
}
|
|
13040
12999
|
function getAllComponents() {
|
|
13041
|
-
return ["rules", "agents", "skills", "guides", "
|
|
13000
|
+
return ["rules", "agents", "skills", "guides", "hooks", "contexts"];
|
|
13042
13001
|
}
|
|
13043
13002
|
async function installComponent(targetDir, component, options) {
|
|
13044
13003
|
const templatePath = COMPONENT_PATHS[component];
|
|
@@ -13088,7 +13047,7 @@ async function backupExisting(sourcePath, backupDir) {
|
|
|
13088
13047
|
return backupPath;
|
|
13089
13048
|
}
|
|
13090
13049
|
async function checkExistingPaths(targetDir) {
|
|
13091
|
-
const pathsToCheck = ["CLAUDE.md", ".claude", "guides"
|
|
13050
|
+
const pathsToCheck = ["CLAUDE.md", ".claude", "guides"];
|
|
13092
13051
|
const existingPaths = [];
|
|
13093
13052
|
for (const relativePath of pathsToCheck) {
|
|
13094
13053
|
const fullPath = join3(targetDir, relativePath);
|
|
@@ -13126,7 +13085,7 @@ async function checkExistingInstallation(targetDir) {
|
|
|
13126
13085
|
const claudeDir = join4(targetDir, ".claude");
|
|
13127
13086
|
return fileExists(claudeDir);
|
|
13128
13087
|
}
|
|
13129
|
-
var CLAUDE_SUBDIR_COMPONENTS = new Set(["rules", "hooks", "contexts"]);
|
|
13088
|
+
var CLAUDE_SUBDIR_COMPONENTS = new Set(["rules", "hooks", "contexts", "agents", "skills"]);
|
|
13130
13089
|
function componentToPath(targetDir, component) {
|
|
13131
13090
|
if (component === "claude-md") {
|
|
13132
13091
|
return join4(targetDir, "CLAUDE.md");
|
|
@@ -13541,30 +13500,13 @@ async function getContexts(targetDir) {
|
|
|
13541
13500
|
return [];
|
|
13542
13501
|
}
|
|
13543
13502
|
}
|
|
13544
|
-
async function getPipelines(targetDir) {
|
|
13545
|
-
const pipelinesDir = join5(targetDir, "pipelines");
|
|
13546
|
-
if (!await fileExists(pipelinesDir))
|
|
13547
|
-
return [];
|
|
13548
|
-
try {
|
|
13549
|
-
const pipelineFiles = await listFiles(pipelinesDir, { recursive: true, pattern: "*.yaml" });
|
|
13550
|
-
return pipelineFiles.map((pipePath) => ({
|
|
13551
|
-
name: basename2(pipePath, ".yaml"),
|
|
13552
|
-
type: "pipeline",
|
|
13553
|
-
category: relative(join5(targetDir, "pipelines"), dirname2(pipePath)) || "root",
|
|
13554
|
-
path: relative(targetDir, pipePath)
|
|
13555
|
-
})).sort((a, b) => a.name.localeCompare(b.name));
|
|
13556
|
-
} catch {
|
|
13557
|
-
return [];
|
|
13558
|
-
}
|
|
13559
|
-
}
|
|
13560
13503
|
var COMPONENT_GETTERS = {
|
|
13561
13504
|
agents: getAgents,
|
|
13562
13505
|
skills: getSkills,
|
|
13563
13506
|
guides: getGuides,
|
|
13564
13507
|
rules: getRules,
|
|
13565
13508
|
hooks: getHooks,
|
|
13566
|
-
contexts: getContexts
|
|
13567
|
-
pipelines: getPipelines
|
|
13509
|
+
contexts: getContexts
|
|
13568
13510
|
};
|
|
13569
13511
|
function displayComponents(components, type, format) {
|
|
13570
13512
|
if (format === "json") {
|
|
@@ -13576,14 +13518,13 @@ function displayComponents(components, type, format) {
|
|
|
13576
13518
|
}
|
|
13577
13519
|
}
|
|
13578
13520
|
async function handleListAll(targetDir, format) {
|
|
13579
|
-
const [agents, skills, guides, rules, hooks, contexts
|
|
13521
|
+
const [agents, skills, guides, rules, hooks, contexts] = await Promise.all([
|
|
13580
13522
|
getAgents(targetDir),
|
|
13581
13523
|
getSkills(targetDir),
|
|
13582
13524
|
getGuides(targetDir),
|
|
13583
13525
|
getRules(targetDir),
|
|
13584
13526
|
getHooks(targetDir),
|
|
13585
|
-
getContexts(targetDir)
|
|
13586
|
-
getPipelines(targetDir)
|
|
13527
|
+
getContexts(targetDir)
|
|
13587
13528
|
]);
|
|
13588
13529
|
if (format !== "json") {
|
|
13589
13530
|
displayComponents(agents, "agents", format);
|
|
@@ -13592,9 +13533,8 @@ async function handleListAll(targetDir, format) {
|
|
|
13592
13533
|
displayComponents(rules, "rules", format);
|
|
13593
13534
|
displayComponents(hooks, "hooks", format);
|
|
13594
13535
|
displayComponents(contexts, "contexts", format);
|
|
13595
|
-
displayComponents(pipelines, "pipelines", format);
|
|
13596
13536
|
}
|
|
13597
|
-
return [...agents, ...skills, ...guides, ...rules, ...hooks, ...contexts
|
|
13537
|
+
return [...agents, ...skills, ...guides, ...rules, ...hooks, ...contexts];
|
|
13598
13538
|
}
|
|
13599
13539
|
async function listCommand(type = "all", options = {}) {
|
|
13600
13540
|
const targetDir = process.cwd();
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
+
for (let key of __getOwnPropNames(mod))
|
|
11
|
+
if (!__hasOwnProp.call(to, key))
|
|
12
|
+
__defProp(to, key, {
|
|
13
|
+
get: () => mod[key],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
2
18
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
3
19
|
|
|
4
20
|
// src/core/config.ts
|
|
@@ -408,10 +424,7 @@ var DIRECTORY_STRUCTURE = [
|
|
|
408
424
|
".claude/contexts",
|
|
409
425
|
".claude/agents",
|
|
410
426
|
".claude/skills",
|
|
411
|
-
"guides"
|
|
412
|
-
"pipelines",
|
|
413
|
-
"pipelines/templates",
|
|
414
|
-
"pipelines/examples"
|
|
427
|
+
"guides"
|
|
415
428
|
];
|
|
416
429
|
var COMPONENT_PATHS = {
|
|
417
430
|
"claude-md": "",
|
|
@@ -419,7 +432,6 @@ var COMPONENT_PATHS = {
|
|
|
419
432
|
agents: ".claude/agents",
|
|
420
433
|
skills: ".claude/skills",
|
|
421
434
|
guides: "guides",
|
|
422
|
-
pipelines: "pipelines",
|
|
423
435
|
hooks: ".claude/hooks",
|
|
424
436
|
contexts: ".claude/contexts"
|
|
425
437
|
};
|
|
@@ -511,8 +523,6 @@ async function install(options) {
|
|
|
511
523
|
await handleBackup(options.targetDir, !!options.backup, result);
|
|
512
524
|
await checkAndWarnExisting(options.targetDir, !!options.force, !!options.backup, result);
|
|
513
525
|
await verifyTemplateDirectory();
|
|
514
|
-
await createDirectoryStructure(options.targetDir);
|
|
515
|
-
debug("install.directories_created");
|
|
516
526
|
await installAllComponents(options.targetDir, options, result);
|
|
517
527
|
await installClaudeMdWithTracking(options.targetDir, options, result);
|
|
518
528
|
await updateInstallConfig(options.targetDir, options, result.installedComponents);
|
|
@@ -559,7 +569,7 @@ async function getTemplateManifest() {
|
|
|
559
569
|
};
|
|
560
570
|
}
|
|
561
571
|
function getAllComponents() {
|
|
562
|
-
return ["rules", "agents", "skills", "guides", "
|
|
572
|
+
return ["rules", "agents", "skills", "guides", "hooks", "contexts"];
|
|
563
573
|
}
|
|
564
574
|
async function installComponent(targetDir, component, options) {
|
|
565
575
|
const templatePath = COMPONENT_PATHS[component];
|
|
@@ -609,7 +619,7 @@ async function backupExisting(sourcePath, backupDir) {
|
|
|
609
619
|
return backupPath;
|
|
610
620
|
}
|
|
611
621
|
async function checkExistingPaths(targetDir) {
|
|
612
|
-
const pathsToCheck = ["CLAUDE.md", ".claude", "guides"
|
|
622
|
+
const pathsToCheck = ["CLAUDE.md", ".claude", "guides"];
|
|
613
623
|
const existingPaths = [];
|
|
614
624
|
for (const relativePath of pathsToCheck) {
|
|
615
625
|
const fullPath = join3(targetDir, relativePath);
|
|
@@ -764,7 +774,7 @@ async function preserveCustomizations(targetDir, customizations) {
|
|
|
764
774
|
return preserved;
|
|
765
775
|
}
|
|
766
776
|
function getAllUpdateComponents() {
|
|
767
|
-
return ["rules", "agents", "skills", "guides", "
|
|
777
|
+
return ["rules", "agents", "skills", "guides", "hooks", "contexts"];
|
|
768
778
|
}
|
|
769
779
|
async function getLatestVersion() {
|
|
770
780
|
const manifestPath = resolveTemplatePath("manifest.json");
|
|
@@ -812,7 +822,6 @@ function getComponentPath(component) {
|
|
|
812
822
|
agents: ".claude/agents",
|
|
813
823
|
skills: ".claude/skills",
|
|
814
824
|
guides: "guides",
|
|
815
|
-
pipelines: "pipelines",
|
|
816
825
|
hooks: ".claude/hooks",
|
|
817
826
|
contexts: ".claude/contexts"
|
|
818
827
|
};
|
|
@@ -823,7 +832,7 @@ async function backupInstallation(targetDir) {
|
|
|
823
832
|
const backupDir = join4(targetDir, `.omcustom-backup-${timestamp}`);
|
|
824
833
|
const fs = await import("node:fs/promises");
|
|
825
834
|
await ensureDirectory(backupDir);
|
|
826
|
-
const dirsToBackup = [".claude", "guides"
|
|
835
|
+
const dirsToBackup = [".claude", "guides"];
|
|
827
836
|
for (const dir of dirsToBackup) {
|
|
828
837
|
const srcPath = join4(targetDir, dir);
|
|
829
838
|
if (await fileExists(srcPath)) {
|
package/package.json
CHANGED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Code Review Pipeline
|
|
2
|
-
# Full code review workflow with language detection
|
|
3
|
-
|
|
4
|
-
name: code-review
|
|
5
|
-
description: Full code review workflow with automatic language detection
|
|
6
|
-
|
|
7
|
-
inputs:
|
|
8
|
-
- name: file_path
|
|
9
|
-
required: true
|
|
10
|
-
description: Path to the file to review
|
|
11
|
-
|
|
12
|
-
- name: focus
|
|
13
|
-
required: false
|
|
14
|
-
description: Focus area (style, security, performance, all)
|
|
15
|
-
default: all
|
|
16
|
-
|
|
17
|
-
steps:
|
|
18
|
-
# Step 1: Detect programming language
|
|
19
|
-
- id: detect_language
|
|
20
|
-
agent: secretary
|
|
21
|
-
action: detect_language
|
|
22
|
-
input:
|
|
23
|
-
file: "${file_path}"
|
|
24
|
-
output: language
|
|
25
|
-
description: Detect the programming language of the file
|
|
26
|
-
|
|
27
|
-
# Step 2: Code analysis by language expert
|
|
28
|
-
- id: analyze
|
|
29
|
-
agent: "${language}-expert"
|
|
30
|
-
action: analyze_code
|
|
31
|
-
input:
|
|
32
|
-
file: "${file_path}"
|
|
33
|
-
focus: "${focus}"
|
|
34
|
-
output: analysis
|
|
35
|
-
description: Analyze code using language-specific best practices
|
|
36
|
-
|
|
37
|
-
# Step 3: Security review
|
|
38
|
-
- id: security_check
|
|
39
|
-
agent: qa-lead
|
|
40
|
-
action: security_review
|
|
41
|
-
input:
|
|
42
|
-
file: "${file_path}"
|
|
43
|
-
findings: "${analysis}"
|
|
44
|
-
output: security
|
|
45
|
-
description: Check for security vulnerabilities
|
|
46
|
-
on_error: continue
|
|
47
|
-
|
|
48
|
-
# Step 4: Generate final report
|
|
49
|
-
- id: report
|
|
50
|
-
agent: documenter
|
|
51
|
-
action: generate_report
|
|
52
|
-
input:
|
|
53
|
-
file: "${file_path}"
|
|
54
|
-
language: "${language}"
|
|
55
|
-
analysis: "${analysis}"
|
|
56
|
-
security: "${security}"
|
|
57
|
-
output: report
|
|
58
|
-
description: Generate comprehensive review report
|
|
59
|
-
|
|
60
|
-
error_handling:
|
|
61
|
-
default: stop
|
|
62
|
-
|
|
63
|
-
metadata:
|
|
64
|
-
author: oh-my-customcode
|
|
65
|
-
version: 1.0.0
|
|
66
|
-
tags: [code-review, quality, security]
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Code Review Pipeline
|
|
2
|
-
# Full code review workflow with language detection
|
|
3
|
-
|
|
4
|
-
name: code-review
|
|
5
|
-
description: Full code review workflow with automatic language detection
|
|
6
|
-
|
|
7
|
-
inputs:
|
|
8
|
-
- name: file_path
|
|
9
|
-
required: true
|
|
10
|
-
description: Path to the file to review
|
|
11
|
-
|
|
12
|
-
- name: focus
|
|
13
|
-
required: false
|
|
14
|
-
description: Focus area (style, security, performance, all)
|
|
15
|
-
default: all
|
|
16
|
-
|
|
17
|
-
steps:
|
|
18
|
-
# Step 1: Detect programming language
|
|
19
|
-
- id: detect_language
|
|
20
|
-
agent: secretary
|
|
21
|
-
action: detect_language
|
|
22
|
-
input:
|
|
23
|
-
file: "${file_path}"
|
|
24
|
-
output: language
|
|
25
|
-
description: Detect the programming language of the file
|
|
26
|
-
|
|
27
|
-
# Step 2: Code analysis by language expert
|
|
28
|
-
- id: analyze
|
|
29
|
-
agent: "${language}-expert"
|
|
30
|
-
action: analyze_code
|
|
31
|
-
input:
|
|
32
|
-
file: "${file_path}"
|
|
33
|
-
focus: "${focus}"
|
|
34
|
-
output: analysis
|
|
35
|
-
description: Analyze code using language-specific best practices
|
|
36
|
-
|
|
37
|
-
# Step 3: Security review
|
|
38
|
-
- id: security_check
|
|
39
|
-
agent: qa-lead
|
|
40
|
-
action: security_review
|
|
41
|
-
input:
|
|
42
|
-
file: "${file_path}"
|
|
43
|
-
findings: "${analysis}"
|
|
44
|
-
output: security
|
|
45
|
-
description: Check for security vulnerabilities
|
|
46
|
-
on_error: continue
|
|
47
|
-
|
|
48
|
-
# Step 4: Generate final report
|
|
49
|
-
- id: report
|
|
50
|
-
agent: arch-documenter
|
|
51
|
-
action: generate_report
|
|
52
|
-
input:
|
|
53
|
-
file: "${file_path}"
|
|
54
|
-
language: "${language}"
|
|
55
|
-
analysis: "${analysis}"
|
|
56
|
-
security: "${security}"
|
|
57
|
-
output: report
|
|
58
|
-
description: Generate comprehensive review report
|
|
59
|
-
|
|
60
|
-
error_handling:
|
|
61
|
-
default: stop
|
|
62
|
-
|
|
63
|
-
metadata:
|
|
64
|
-
author: oh-my-customcode
|
|
65
|
-
version: 1.0.0
|
|
66
|
-
tags: [code-review, quality, security]
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# Pipeline Registry
|
|
2
|
-
|
|
3
|
-
description: Registry of available pipelines for sequential workflows
|
|
4
|
-
|
|
5
|
-
pipelines:
|
|
6
|
-
- name: code-review
|
|
7
|
-
path: ./examples/code-review.yaml
|
|
8
|
-
description: Full code review workflow with language detection
|
|
9
|
-
|
|
10
|
-
templates:
|
|
11
|
-
- name: pipeline-template
|
|
12
|
-
path: ./templates/pipeline-template.yaml
|
|
13
|
-
description: Base template for creating new pipelines
|
|
14
|
-
|
|
15
|
-
usage:
|
|
16
|
-
run: "pipeline:run <name> --input key=value"
|
|
17
|
-
list: "pipeline:list"
|
|
18
|
-
create: "Use templates/pipeline-template.yaml as base"
|