@thebushidocollective/han 1.18.1 → 1.18.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/README.md CHANGED
@@ -146,3 +146,4 @@ Walk the way of Bushido. Practice with Discipline. Build with Honor.
146
146
  ## License
147
147
 
148
148
  MIT
149
+
package/dist/bundle.js CHANGED
@@ -456,7 +456,7 @@ Failed when trying to run \`${u}\` in directory: \`${I}\`
456
456
  `);for(let c of r){console.error(` ${c.plugin}:`);for(let o of c.errors)console.error(` - ${o}`)}console.log(),process.exit(1)}let u=Object.keys(a);u.length===0&&(console.log("No hooks configured in any installed plugins"),process.exit(0)),console.log(`
457
457
  Found hooks:`);for(let c of u.sort()){let o=a[c].length,h=[...new Set(a[c].map(E=>E.plugin))].join(", ");console.log(` ${c}: ${o} hook(s) from ${h}`)}console.log(),console.log("\u2705 All hooks validated successfully"),console.log(`
458
458
  Tip: Run with --execute to test hook execution
459
- `),process.exit(0)}var XB,RD,r$,BH=Ue(async()=>{"use strict";XB=mt(hH(),1);await Ec();RD=mt(Fn(),1);await gH();r$=["Notification","PostToolUse","PreCompact","PreToolUse","SessionEnd","SessionStart","Stop","SubagentStop","UserPromptSubmit"]});import{readFileSync as c$}from"node:fs";import{dirname as f$,join as d$}from"node:path";import{fileURLToPath as h$}from"node:url";var Ob=mt(Nb(),1),{program:I$,createCommand:Q$,createArgument:S$,createOption:_$,CommanderError:F$,InvalidArgumentError:b$,InvalidOptionArgumentError:x$,Command:Mb,Argument:R$,Option:w$,Help:T$}=Ob.default;var g$="1.18.1",wd=new Mb;wd.name("han").description("Utilities for The Bushido Collective's Han Code Marketplace").version(g$);var G2=wd.command("plugin").description("Manage Han plugins");G2.command("install [plugin-names...]").description("Install plugins interactively, or use --auto to auto-detect").option("--auto","Auto-detect and install recommended plugins").option("--scope <scope>",'Installation scope: "project" (.claude/settings.json) or "local" (.claude/settings.local.json)',"project").action(async(e,t)=>{try{let a=t.scope||"project";if(a!=="project"&&a!=="local"&&(console.error('Error: --scope must be either "project" or "local"'),process.exit(1)),t.auto){let{install:r}=await sB().then(()=>iB);await r(a)}else if(e.length>0){let{installPlugins:r}=await Promise.resolve().then(()=>(cO(),AO));await r(e,a)}else{let{installInteractive:r}=await sB().then(()=>iB);await r(a)}process.exit(0)}catch(a){console.error("Error during plugin installation:",a instanceof Error?a.message:a),process.exit(1)}});G2.command("uninstall <plugin-names...>").description("Uninstall one or more plugins").option("--scope <scope>",'Installation scope: "project" (.claude/settings.json) or "local" (.claude/settings.local.json)',"project").action(async(e,t)=>{try{let a=t.scope||"project";a!=="project"&&a!=="local"&&(console.error('Error: --scope must be either "project" or "local"'),process.exit(1));let{uninstallPlugins:r}=await Promise.resolve().then(()=>(hO(),dO));await r(e,a),process.exit(0)}catch(a){console.error("Error during plugin uninstallation:",a instanceof Error?a.message:a),process.exit(1)}});G2.command("search [query]").description("Search for plugins in the Han marketplace").action(async e=>{try{let{searchPlugins:t}=await Promise.resolve().then(()=>(E8(),m8));await t(e),process.exit(0)}catch(t){console.error("Error during plugin search:",t instanceof Error?t.message:t),process.exit(1)}});wd.command("uninstall").description("Remove Han marketplace and plugins").action(async()=>{let{uninstall:e}=await Promise.resolve().then(()=>(B8(),y8));e(),process.exit(0)});var vH=wd.command("hook").description("Hook utilities");vH.command("run [ignored...]").description("Run a command across directories. Requires -- before command (e.g., han hook run --dirs-with package.json -- npm test)").option("--fail-fast","Stop on first failure").option("--dirs-with <file>","Only run in directories containing the specified file").option("--test-dir <command>","Only include directories where this command exits 0 (runs silently)").option("--stdin","Read stdin and pass it to each subcommand").allowUnknownOption().action(async(e,t)=>{let a=process.argv.indexOf("--");a===-1&&(console.error(`Error: Command must be specified after -- separator
459
+ `),process.exit(0)}var XB,RD,r$,BH=Ue(async()=>{"use strict";XB=mt(hH(),1);await Ec();RD=mt(Fn(),1);await gH();r$=["Notification","PostToolUse","PreCompact","PreToolUse","SessionEnd","SessionStart","Stop","SubagentStop","UserPromptSubmit"]});import{readFileSync as c$}from"node:fs";import{dirname as f$,join as d$}from"node:path";import{fileURLToPath as h$}from"node:url";var Ob=mt(Nb(),1),{program:I$,createCommand:Q$,createArgument:S$,createOption:_$,CommanderError:F$,InvalidArgumentError:b$,InvalidOptionArgumentError:x$,Command:Mb,Argument:R$,Option:w$,Help:T$}=Ob.default;var g$="1.18.2",wd=new Mb;wd.name("han").description("Utilities for The Bushido Collective's Han Code Marketplace").version(g$);var G2=wd.command("plugin").description("Manage Han plugins");G2.command("install [plugin-names...]").description("Install plugins interactively, or use --auto to auto-detect").option("--auto","Auto-detect and install recommended plugins").option("--scope <scope>",'Installation scope: "project" (.claude/settings.json) or "local" (.claude/settings.local.json)',"project").action(async(e,t)=>{try{let a=t.scope||"project";if(a!=="project"&&a!=="local"&&(console.error('Error: --scope must be either "project" or "local"'),process.exit(1)),t.auto){let{install:r}=await sB().then(()=>iB);await r(a)}else if(e.length>0){let{installPlugins:r}=await Promise.resolve().then(()=>(cO(),AO));await r(e,a)}else{let{installInteractive:r}=await sB().then(()=>iB);await r(a)}process.exit(0)}catch(a){console.error("Error during plugin installation:",a instanceof Error?a.message:a),process.exit(1)}});G2.command("uninstall <plugin-names...>").description("Uninstall one or more plugins").option("--scope <scope>",'Installation scope: "project" (.claude/settings.json) or "local" (.claude/settings.local.json)',"project").action(async(e,t)=>{try{let a=t.scope||"project";a!=="project"&&a!=="local"&&(console.error('Error: --scope must be either "project" or "local"'),process.exit(1));let{uninstallPlugins:r}=await Promise.resolve().then(()=>(hO(),dO));await r(e,a),process.exit(0)}catch(a){console.error("Error during plugin uninstallation:",a instanceof Error?a.message:a),process.exit(1)}});G2.command("search [query]").description("Search for plugins in the Han marketplace").action(async e=>{try{let{searchPlugins:t}=await Promise.resolve().then(()=>(E8(),m8));await t(e),process.exit(0)}catch(t){console.error("Error during plugin search:",t instanceof Error?t.message:t),process.exit(1)}});wd.command("uninstall").description("Remove Han marketplace and plugins").action(async()=>{let{uninstall:e}=await Promise.resolve().then(()=>(B8(),y8));e(),process.exit(0)});var vH=wd.command("hook").description("Hook utilities");vH.command("run [ignored...]").description("Run a command across directories. Requires -- before command (e.g., han hook run --dirs-with package.json -- npm test)").option("--fail-fast","Stop on first failure").option("--dirs-with <file>","Only run in directories containing the specified file").option("--test-dir <command>","Only include directories where this command exits 0 (runs silently)").option("--stdin","Read stdin and pass it to each subcommand").allowUnknownOption().action(async(e,t)=>{let a=process.argv.indexOf("--");a===-1&&(console.error(`Error: Command must be specified after -- separator
460
460
 
461
461
  Example: han hook run --dirs-with package.json -- npm test`),process.exit(1));let r=process.argv.slice(a+1);r.length===0&&(console.error(`Error: No command specified after --
462
462
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thebushidocollective/han",
3
- "version": "1.18.1",
3
+ "version": "1.18.2",
4
4
  "description": "CLI for installing and managing curated Claude Code plugins from the Han marketplace",
5
5
  "main": "dist/lib/main.js",
6
6
  "types": "dist/lib/main.d.ts",
@@ -51,11 +51,11 @@
51
51
  "README.md"
52
52
  ],
53
53
  "optionalDependencies": {
54
- "@thebushidocollective/han-darwin-arm64": "1.18.0",
55
- "@thebushidocollective/han-darwin-x64": "1.18.0",
56
- "@thebushidocollective/han-linux-x64": "1.18.0",
57
- "@thebushidocollective/han-linux-arm64": "1.18.0",
58
- "@thebushidocollective/han-win32-x64": "1.18.0"
54
+ "@thebushidocollective/han-darwin-arm64": "1.18.2",
55
+ "@thebushidocollective/han-darwin-x64": "1.18.2",
56
+ "@thebushidocollective/han-linux-x64": "1.18.2",
57
+ "@thebushidocollective/han-linux-arm64": "1.18.2",
58
+ "@thebushidocollective/han-win32-x64": "1.18.2"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@anthropic-ai/claude-agent-sdk": "0.1.50",
@@ -1,9 +0,0 @@
1
- import type { DetectPluginsCallbacks } from "./shared.js";
2
- interface AlignProgressProps {
3
- detectPlugins: (callbacks: DetectPluginsCallbacks) => Promise<void>;
4
- onAlignComplete: (plugins: string[]) => void;
5
- onAlignError: (error: Error) => void;
6
- }
7
- export declare const AlignProgress: React.FC<AlignProgressProps>;
8
- export {};
9
- //# sourceMappingURL=align-progress.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"align-progress.d.ts","sourceRoot":"","sources":["../../lib/align-progress.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAe,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEvE,UAAU,kBAAkB;IAC3B,aAAa,EAAE,CAAC,SAAS,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7C,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA+MtD,CAAC"}
@@ -1,58 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import Spinner from "ink-spinner";
4
- import { useEffect, useState } from "react";
5
- import { MarkdownWrapper } from "./markdown-wrapper.js";
6
- export const AlignProgress = ({ detectPlugins, onAlignComplete, onAlignError, }) => {
7
- const [phase, setPhase] = useState("analyzing");
8
- const [plugins, setPlugins] = useState([]);
9
- const [fullText, setFullText] = useState("");
10
- const [currentTool, setCurrentTool] = useState(null);
11
- const [error, setError] = useState(null);
12
- const [toolsUsed, setToolsUsed] = useState(new Set());
13
- useEffect(() => {
14
- const callbacks = {
15
- onUpdate: (update) => {
16
- if (update.type === "text") {
17
- setFullText((prev) => prev + update.content);
18
- }
19
- else if (update.type === "tool" && update.toolName) {
20
- setCurrentTool(update.toolName);
21
- setToolsUsed((prev) => new Set([...prev, update.toolName]));
22
- }
23
- },
24
- onComplete: (detectedPlugins, analysisText) => {
25
- setPlugins(detectedPlugins);
26
- setFullText(analysisText);
27
- setCurrentTool(null);
28
- setPhase("analyzed");
29
- setTimeout(() => {
30
- setPhase("aligning");
31
- setTimeout(() => {
32
- setPhase("complete");
33
- onAlignComplete(detectedPlugins);
34
- }, 500);
35
- }, 1000);
36
- },
37
- onError: (err) => {
38
- setError(err.message);
39
- setPhase("error");
40
- onAlignError(err);
41
- },
42
- };
43
- detectPlugins(callbacks);
44
- }, [detectPlugins, onAlignComplete, onAlignError]);
45
- const getToolEmoji = (toolName) => {
46
- const emojiMap = {
47
- web_fetch: "🌐",
48
- read_file: "📄",
49
- glob: "🔍",
50
- grep: "🔎",
51
- };
52
- return emojiMap[toolName] || "🔧";
53
- };
54
- return (_jsxs(Box, { flexDirection: "column", paddingY: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: "cyan", children: "\uD83E\uDD16 Han Plugin Alignment" }) }), phase === "analyzing" && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: "yellow", children: [_jsx(Spinner, { type: "dots" }), " Analyzing codebase..."] }) }), currentTool && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: "blue", children: [getToolEmoji(currentTool), " ", currentTool] }) })), toolsUsed.size > 0 && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { dimColor: true, children: ["Tools used: ", Array.from(toolsUsed).join(", ")] }) })), fullText && (_jsxs(Box, { marginTop: 1, paddingX: 1, borderStyle: "round", borderColor: "gray", flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { dimColor: true, bold: true, children: [_jsx(Spinner, { type: "star" }), " Agent thinking:"] }) }), _jsx(MarkdownWrapper, { children: fullText })] }))] })), (phase === "analyzed" ||
55
- phase === "aligning" ||
56
- phase === "complete") && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "green", children: "\u2705 Analysis complete" }) }), fullText && (_jsxs(Box, { marginBottom: 1, paddingX: 1, borderStyle: "round", borderColor: "cyan", flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: "cyan", children: "\uD83D\uDCCB Agent Analysis:" }) }), _jsx(MarkdownWrapper, { children: fullText })] })), plugins.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "green", children: "\u2728 Recommended plugins:" }), plugins.sort().map((plugin) => (_jsx(Box, { marginLeft: 2, children: _jsxs(Text, { children: ["\u2022 ", plugin] }) }, plugin)))] })), phase === "aligning" && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "yellow", children: [_jsx(Spinner, { type: "dots" }), " Aligning plugins in Claude Code settings..."] }) })), phase === "complete" && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "green", children: "\u2705 Updated Claude Code settings" }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "green", bold: true, children: "\u2705 Alignment complete!" }) }), _jsx(Box, { children: _jsx(Text, { color: "blue", children: "\uD83D\uDCA1 Restart Claude Code to load plugin changes." }) })] }))] })), phase === "error" && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "red", bold: true, children: "\u274C Error" }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "red", children: error }) }), fullText && (_jsxs(Box, { marginBottom: 1, paddingX: 1, borderStyle: "round", borderColor: "red", flexDirection: "column", children: [_jsx(Text, { bold: true, color: "red", children: "Partial Analysis:" }), _jsx(Box, { children: _jsx(MarkdownWrapper, { children: fullText }) })] })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "yellow", children: "\u26A0\uFE0F Could not complete alignment, leaving plugins unchanged" }) })] }))] }));
57
- };
58
- //# sourceMappingURL=align-progress.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"align-progress.js","sourceRoot":"","sources":["../../lib/align-progress.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- export interface AlignResult {
2
- added: string[];
3
- removed: string[];
4
- unchanged: string[];
5
- }
6
- /**
7
- * SDK-based align command with Ink UI
8
- * If scope is not provided, auto-detects which scope(s) have Han installed
9
- */
10
- export declare function align(scope?: "project" | "local"): Promise<void>;
11
- //# sourceMappingURL=align.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"align.d.ts","sourceRoot":"","sources":["../../lib/align.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACpB;AAuDD;;;GAGG;AACH,wBAAsB,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtE"}
package/dist/lib/align.js DELETED
@@ -1,116 +0,0 @@
1
- import { render } from "ink";
2
- import React from "react";
3
- import { detectHanScopes, detectPluginsWithAgent, ensureClaudeDirectory, getInstalledPlugins, HAN_MARKETPLACE_REPO, readOrCreateSettings, writeSettings, } from "./shared.js";
4
- /**
5
- * Compare current plugins with recommended plugins and update settings
6
- */
7
- function alignPluginsInSettings(recommendedPlugins, scope = "project") {
8
- ensureClaudeDirectory();
9
- const settings = readOrCreateSettings(scope);
10
- const currentPlugins = getInstalledPlugins(scope);
11
- // Calculate differences
12
- const added = [];
13
- const removed = [];
14
- const unchanged = [];
15
- // Add Han marketplace if not present
16
- if (!settings?.extraKnownMarketplaces?.han) {
17
- settings.extraKnownMarketplaces = {
18
- ...settings.extraKnownMarketplaces,
19
- han: { source: { source: "github", repo: HAN_MARKETPLACE_REPO } },
20
- };
21
- }
22
- // Initialize enabledPlugins if needed
23
- if (!settings.enabledPlugins) {
24
- settings.enabledPlugins = {};
25
- }
26
- // Find plugins to add (in recommended but not in current)
27
- for (const plugin of recommendedPlugins) {
28
- if (!currentPlugins.includes(plugin)) {
29
- added.push(plugin);
30
- settings.enabledPlugins[`${plugin}@han`] = true;
31
- }
32
- else {
33
- unchanged.push(plugin);
34
- }
35
- }
36
- // Find plugins to remove (in current but not in recommended)
37
- for (const plugin of currentPlugins) {
38
- if (!recommendedPlugins.includes(plugin)) {
39
- removed.push(plugin);
40
- delete settings.enabledPlugins[`${plugin}@han`];
41
- }
42
- }
43
- writeSettings(settings, scope);
44
- return { added, removed, unchanged };
45
- }
46
- /**
47
- * SDK-based align command with Ink UI
48
- * If scope is not provided, auto-detects which scope(s) have Han installed
49
- */
50
- export async function align(scope) {
51
- // Auto-detect scopes if not explicitly provided
52
- let scopesToAlign;
53
- if (scope) {
54
- scopesToAlign = [scope];
55
- }
56
- else {
57
- scopesToAlign = detectHanScopes();
58
- // Default to project if Han not installed anywhere
59
- if (scopesToAlign.length === 0) {
60
- scopesToAlign = ["project"];
61
- }
62
- }
63
- // Align each detected scope
64
- for (const currentScope of scopesToAlign) {
65
- await alignSingleScope(currentScope);
66
- }
67
- }
68
- /**
69
- * Align plugins for a single scope
70
- */
71
- async function alignSingleScope(scope) {
72
- // Import Ink UI component dynamically
73
- const { AlignProgress } = await import("./align-progress.js");
74
- let resolveCompletion;
75
- let rejectCompletion;
76
- const completionPromise = new Promise((resolve, reject) => {
77
- resolveCompletion = resolve;
78
- rejectCompletion = reject;
79
- });
80
- const filename = scope === "local" ? "settings.local.json" : "settings.json";
81
- console.log(`Aligning plugins in ./.claude/${filename}...\n`);
82
- const { unmount } = render(React.createElement(AlignProgress, {
83
- detectPlugins: detectPluginsWithAgent,
84
- onAlignComplete: (plugins) => {
85
- const result = alignPluginsInSettings(plugins, scope);
86
- // Report changes
87
- if (result.added.length > 0) {
88
- console.log(`\n✓ Added ${result.added.length} plugin(s): ${result.added.join(", ")}`);
89
- }
90
- if (result.removed.length > 0) {
91
- console.log(`\n✓ Removed ${result.removed.length} plugin(s): ${result.removed.join(", ")}`);
92
- }
93
- if (result.added.length === 0 && result.removed.length === 0) {
94
- console.log("\n✓ No changes needed - plugins are already aligned");
95
- }
96
- else {
97
- console.log("\n⚠️ Please restart Claude Code to load the plugin changes");
98
- }
99
- if (resolveCompletion)
100
- resolveCompletion();
101
- },
102
- onAlignError: (error) => {
103
- if (rejectCompletion)
104
- rejectCompletion(error);
105
- },
106
- }));
107
- try {
108
- await completionPromise;
109
- // Wait a moment for the UI to show completion message
110
- await new Promise((resolve) => setTimeout(resolve, 1500));
111
- }
112
- finally {
113
- unmount();
114
- }
115
- }
116
- //# sourceMappingURL=align.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"align.js","sourceRoot":"","sources":["../../lib/align.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Shared agent prompt for detecting and recommending Han plugins
3
- */
4
- export declare const detectPluginsPrompt = "You are a Han plugin installer assistant. Your goal is to analyze the current codebase and recommend appropriate Claude Code plugins from the Han marketplace.\n\nThe available plugins from the marketplace are provided below. ONLY recommend plugins from this list.\n\nPlugin Categories:\n- buki-* (\u6B66\u5668 weapons): Skills for specific technologies and frameworks\n- do-* (\u9053 disciplines): Specialized agents for development practices and workflows\n- sensei-* (\u5148\u751F teachers): MCP servers for external integrations\n- bushido: Core quality principles (ALWAYS recommend this)\n\nYour Analysis Process:\n\nSTEP 1: Review pre-computed codebase statistics (if provided)\n- Check if CODEBASE STATISTICS section is provided in the prompt\n- If provided, you have:\n * File extension counts (e.g., .ts: 456, .py: 123) - interpret these as technologies\n - .ts, .tsx, .jsx = TypeScript/JavaScript\n - .py = Python\n - .rs = Rust\n - .go = Go\n - .rb = Ruby\n - .ex, .exs = Elixir\n - .vue = Vue.js\n - etc.\n * Config file names (e.g., package.json, Cargo.toml, go.mod) - these reveal frameworks and tools\n- If statistics are NOT provided, use Glob to discover file types\n * Example: glob(\"**/*.ts\") to find TypeScript files\n * Example: glob(\"**/*.py\") to find Python files\n\nSTEP 2: Examine key configuration files\n- Config files are already identified in the statistics (if provided)\n- Use Read tool to examine important config files:\n * package.json - reveals Node.js frameworks, dependencies\n * Cargo.toml - reveals Rust dependencies\n * go.mod - reveals Go dependencies\n * requirements.txt, pyproject.toml - reveals Python dependencies\n * mix.exs - reveals Elixir dependencies\n- Use Grep to search for framework-specific patterns\n * Example: grep(\"import.*react\") to confirm React usage\n * Example: grep(\"from django\") to confirm Django usage\n\nSTEP 3: Identify technologies and patterns\n- Programming languages (TypeScript, Python, Go, Rust, Ruby, etc.)\n- Frameworks and libraries (React, Vue, Django, Rails, etc.)\n- Testing frameworks (Jest, Pytest, RSpec, etc.)\n- Build tools and infrastructure (Docker, Kubernetes, etc.)\n- Development practices (API development, frontend development, mobile, etc.)\n- Content patterns (blog posts, documentation, CMS usage)\n- CI/CD configurations\n- Accessibility tooling\n\nSTEP 4: Match findings to available plugins\n- Look at the plugin descriptions and keywords below\n- Cross-reference detected technologies with available buki-* plugins\n- Cross-reference development practices with available do-* plugins\n- Cross-reference integrations with available sensei-* plugins\n- ONLY recommend plugins from the list provided\n- Aim for 3-8 total plugins that best match the codebase\n- Always include \"bushido\" as it's the core plugin\n\nReturn ONLY a JSON array of recommended plugin names from the available plugins list:\n[\"bushido\", \"buki-typescript\", \"buki-react\", \"do-frontend-development\"]\n\nCRITICAL: Only recommend plugins that appear in the AVAILABLE PLUGINS list below. Never recommend plugins not in the list.";
5
- //# sourceMappingURL=detect-plugins-prompt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect-plugins-prompt.d.ts","sourceRoot":"","sources":["../../lib/detect-plugins-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,mBAAmB,ilGA+D2F,CAAC"}
@@ -1,68 +0,0 @@
1
- /**
2
- * Shared agent prompt for detecting and recommending Han plugins
3
- */
4
- export const detectPluginsPrompt = `You are a Han plugin installer assistant. Your goal is to analyze the current codebase and recommend appropriate Claude Code plugins from the Han marketplace.
5
-
6
- The available plugins from the marketplace are provided below. ONLY recommend plugins from this list.
7
-
8
- Plugin Categories:
9
- - buki-* (武器 weapons): Skills for specific technologies and frameworks
10
- - do-* (道 disciplines): Specialized agents for development practices and workflows
11
- - sensei-* (先生 teachers): MCP servers for external integrations
12
- - bushido: Core quality principles (ALWAYS recommend this)
13
-
14
- Your Analysis Process:
15
-
16
- STEP 1: Review pre-computed codebase statistics (if provided)
17
- - Check if CODEBASE STATISTICS section is provided in the prompt
18
- - If provided, you have:
19
- * File extension counts (e.g., .ts: 456, .py: 123) - interpret these as technologies
20
- - .ts, .tsx, .jsx = TypeScript/JavaScript
21
- - .py = Python
22
- - .rs = Rust
23
- - .go = Go
24
- - .rb = Ruby
25
- - .ex, .exs = Elixir
26
- - .vue = Vue.js
27
- - etc.
28
- * Config file names (e.g., package.json, Cargo.toml, go.mod) - these reveal frameworks and tools
29
- - If statistics are NOT provided, use Glob to discover file types
30
- * Example: glob("**/*.ts") to find TypeScript files
31
- * Example: glob("**/*.py") to find Python files
32
-
33
- STEP 2: Examine key configuration files
34
- - Config files are already identified in the statistics (if provided)
35
- - Use Read tool to examine important config files:
36
- * package.json - reveals Node.js frameworks, dependencies
37
- * Cargo.toml - reveals Rust dependencies
38
- * go.mod - reveals Go dependencies
39
- * requirements.txt, pyproject.toml - reveals Python dependencies
40
- * mix.exs - reveals Elixir dependencies
41
- - Use Grep to search for framework-specific patterns
42
- * Example: grep("import.*react") to confirm React usage
43
- * Example: grep("from django") to confirm Django usage
44
-
45
- STEP 3: Identify technologies and patterns
46
- - Programming languages (TypeScript, Python, Go, Rust, Ruby, etc.)
47
- - Frameworks and libraries (React, Vue, Django, Rails, etc.)
48
- - Testing frameworks (Jest, Pytest, RSpec, etc.)
49
- - Build tools and infrastructure (Docker, Kubernetes, etc.)
50
- - Development practices (API development, frontend development, mobile, etc.)
51
- - Content patterns (blog posts, documentation, CMS usage)
52
- - CI/CD configurations
53
- - Accessibility tooling
54
-
55
- STEP 4: Match findings to available plugins
56
- - Look at the plugin descriptions and keywords below
57
- - Cross-reference detected technologies with available buki-* plugins
58
- - Cross-reference development practices with available do-* plugins
59
- - Cross-reference integrations with available sensei-* plugins
60
- - ONLY recommend plugins from the list provided
61
- - Aim for 3-8 total plugins that best match the codebase
62
- - Always include "bushido" as it's the core plugin
63
-
64
- Return ONLY a JSON array of recommended plugin names from the available plugins list:
65
- ["bushido", "buki-typescript", "buki-react", "do-frontend-development"]
66
-
67
- CRITICAL: Only recommend plugins that appear in the AVAILABLE PLUGINS list below. Never recommend plugins not in the list.`;
68
- //# sourceMappingURL=detect-plugins-prompt.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect-plugins-prompt.js","sourceRoot":"","sources":["../../lib/detect-plugins-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2HA+DwF,CAAC"}