feat(git-master): add git_env_prefix config to prefix all git commands
When git-master skill is loaded, all git commands are prefixed with the configured env variable (default: GIT_MASTER=1). This enables custom git hooks to detect git-master skill usage. Set to empty string to disable.
This commit is contained in:
@@ -5,6 +5,8 @@ export const GitMasterConfigSchema = z.object({
|
|||||||
commit_footer: z.union([z.boolean(), z.string()]).default(true),
|
commit_footer: z.union([z.boolean(), z.string()]).default(true),
|
||||||
/** Add "Co-authored-by: Sisyphus" trailer to commit messages (default: true) */
|
/** Add "Co-authored-by: Sisyphus" trailer to commit messages (default: true) */
|
||||||
include_co_authored_by: z.boolean().default(true),
|
include_co_authored_by: z.boolean().default(true),
|
||||||
|
/** Environment variable prefix for all git commands (default: "GIT_MASTER=1"). Set to "" to disable. Allows custom git hooks to detect git-master skill usage. */
|
||||||
|
git_env_prefix: z.string().default("GIT_MASTER=1"),
|
||||||
})
|
})
|
||||||
|
|
||||||
export type GitMasterConfig = z.infer<typeof GitMasterConfigSchema>
|
export type GitMasterConfig = z.infer<typeof GitMasterConfigSchema>
|
||||||
|
|||||||
@@ -3,12 +3,73 @@ import type { GitMasterConfig } from "../../config/schema"
|
|||||||
export function injectGitMasterConfig(template: string, config?: GitMasterConfig): string {
|
export function injectGitMasterConfig(template: string, config?: GitMasterConfig): string {
|
||||||
const commitFooter = config?.commit_footer ?? true
|
const commitFooter = config?.commit_footer ?? true
|
||||||
const includeCoAuthoredBy = config?.include_co_authored_by ?? true
|
const includeCoAuthoredBy = config?.include_co_authored_by ?? true
|
||||||
|
const gitEnvPrefix = config?.git_env_prefix ?? "GIT_MASTER=1"
|
||||||
|
|
||||||
|
let result = gitEnvPrefix ? injectGitEnvPrefix(template, gitEnvPrefix) : template
|
||||||
|
|
||||||
if (!commitFooter && !includeCoAuthoredBy) {
|
if (!commitFooter && !includeCoAuthoredBy) {
|
||||||
return template
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const injection = buildCommitFooterInjection(commitFooter, includeCoAuthoredBy, gitEnvPrefix)
|
||||||
|
|
||||||
|
const insertionPoint = result.indexOf("```\n</execution>")
|
||||||
|
if (insertionPoint !== -1) {
|
||||||
|
return (
|
||||||
|
result.slice(0, insertionPoint) +
|
||||||
|
"```\n\n" +
|
||||||
|
injection +
|
||||||
|
"\n</execution>" +
|
||||||
|
result.slice(insertionPoint + "```\n</execution>".length)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result + "\n\n" + injection
|
||||||
|
}
|
||||||
|
|
||||||
|
function injectGitEnvPrefix(template: string, prefix: string): string {
|
||||||
|
const envPrefixSection = [
|
||||||
|
"## GIT COMMAND PREFIX (MANDATORY)",
|
||||||
|
"",
|
||||||
|
`<git_env_prefix>`,
|
||||||
|
`**EVERY git command MUST be prefixed with \`${prefix}\`.**`,
|
||||||
|
"",
|
||||||
|
"This allows custom git hooks to detect when git-master skill is active.",
|
||||||
|
"",
|
||||||
|
"```bash",
|
||||||
|
`${prefix} git status`,
|
||||||
|
`${prefix} git add <files>`,
|
||||||
|
`${prefix} git commit -m "message"`,
|
||||||
|
`${prefix} git push`,
|
||||||
|
`${prefix} git rebase ...`,
|
||||||
|
`${prefix} git log ...`,
|
||||||
|
"```",
|
||||||
|
"",
|
||||||
|
"**NO EXCEPTIONS. Every `git` invocation must include this prefix.**",
|
||||||
|
`</git_env_prefix>`,
|
||||||
|
].join("\n")
|
||||||
|
|
||||||
|
const modeDetectionMarker = "## MODE DETECTION (FIRST STEP)"
|
||||||
|
const markerIndex = template.indexOf(modeDetectionMarker)
|
||||||
|
if (markerIndex !== -1) {
|
||||||
|
return (
|
||||||
|
template.slice(0, markerIndex) +
|
||||||
|
envPrefixSection +
|
||||||
|
"\n\n---\n\n" +
|
||||||
|
template.slice(markerIndex)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return envPrefixSection + "\n\n---\n\n" + template
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildCommitFooterInjection(
|
||||||
|
commitFooter: boolean | string,
|
||||||
|
includeCoAuthoredBy: boolean,
|
||||||
|
gitEnvPrefix: string,
|
||||||
|
): string {
|
||||||
const sections: string[] = []
|
const sections: string[] = []
|
||||||
|
const cmdPrefix = gitEnvPrefix ? `${gitEnvPrefix} ` : ""
|
||||||
|
|
||||||
sections.push("### 5.5 Commit Footer & Co-Author")
|
sections.push("### 5.5 Commit Footer & Co-Author")
|
||||||
sections.push("")
|
sections.push("")
|
||||||
@@ -43,7 +104,7 @@ export function injectGitMasterConfig(template: string, config?: GitMasterConfig
|
|||||||
sections.push("**Example (both enabled):**")
|
sections.push("**Example (both enabled):**")
|
||||||
sections.push("```bash")
|
sections.push("```bash")
|
||||||
sections.push(
|
sections.push(
|
||||||
`git commit -m "{Commit Message}" -m "${footerText}" -m "Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>"`
|
`${cmdPrefix}git commit -m "{Commit Message}" -m "${footerText}" -m "Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>"`
|
||||||
)
|
)
|
||||||
sections.push("```")
|
sections.push("```")
|
||||||
} else if (commitFooter) {
|
} else if (commitFooter) {
|
||||||
@@ -53,29 +114,16 @@ export function injectGitMasterConfig(template: string, config?: GitMasterConfig
|
|||||||
: "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)"
|
: "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)"
|
||||||
sections.push("**Example:**")
|
sections.push("**Example:**")
|
||||||
sections.push("```bash")
|
sections.push("```bash")
|
||||||
sections.push(`git commit -m "{Commit Message}" -m "${footerText}"`)
|
sections.push(`${cmdPrefix}git commit -m "{Commit Message}" -m "${footerText}"`)
|
||||||
sections.push("```")
|
sections.push("```")
|
||||||
} else if (includeCoAuthoredBy) {
|
} else if (includeCoAuthoredBy) {
|
||||||
sections.push("**Example:**")
|
sections.push("**Example:**")
|
||||||
sections.push("```bash")
|
sections.push("```bash")
|
||||||
sections.push(
|
sections.push(
|
||||||
"git commit -m \"{Commit Message}\" -m \"Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\""
|
`${cmdPrefix}git commit -m "{Commit Message}" -m "Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>"`
|
||||||
)
|
)
|
||||||
sections.push("```")
|
sections.push("```")
|
||||||
}
|
}
|
||||||
|
|
||||||
const injection = sections.join("\n")
|
return sections.join("\n")
|
||||||
|
|
||||||
const insertionPoint = template.indexOf("```\n</execution>")
|
|
||||||
if (insertionPoint !== -1) {
|
|
||||||
return (
|
|
||||||
template.slice(0, insertionPoint) +
|
|
||||||
"```\n\n" +
|
|
||||||
injection +
|
|
||||||
"\n</execution>" +
|
|
||||||
template.slice(insertionPoint + "```\n</execution>".length)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return template + "\n\n" + injection
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user