* style(tests): normalize BDD comments from '// #given' to '// given' - Replace 4,668 Python-style BDD comments across 107 test files - Patterns changed: // #given -> // given, // #when -> // when, // #then -> // then - Also handles no-space variants: //#given -> // given * fix(rules-injector): prefer output.metadata.filePath over output.title - Extract file path resolution to dedicated output-path.ts module - Prefer metadata.filePath which contains actual file path - Fall back to output.title only when metadata unavailable - Fixes issue where rules weren't injected when tool output title was a label * feat(slashcommand): add optional user_message parameter - Add user_message optional parameter for command arguments - Model can now call: command='publish' user_message='patch' - Improves error messages with clearer format guidance - Helps LLMs understand correct parameter usage * feat(hooks): restore compaction-context-injector hook - Restore hook deleted in cbbc7bd0 for session compaction context - Injects 7 mandatory sections: User Requests, Final Goal, Work Completed, Remaining Tasks, Active Working Context, MUST NOT Do, Agent Verification State - Re-register in hooks/index.ts and main plugin entry * refactor(background-agent): split manager.ts into focused modules - Extract constants.ts for TTL values and internal types (52 lines) - Extract state.ts for TaskStateManager class (204 lines) - Extract spawner.ts for task creation logic (244 lines) - Extract result-handler.ts for completion handling (265 lines) - Reduce manager.ts from 1377 to 755 lines (45% reduction) - Maintain backward compatible exports * refactor(agents): split prometheus-prompt.ts into subdirectory - Move 1196-line prometheus-prompt.ts to prometheus/ subdirectory - Organize prompt sections into separate files for maintainability - Update agents/index.ts exports * refactor(delegate-task): split tools.ts into focused modules - Extract categories.ts for category definitions and routing - Extract executor.ts for task execution logic - Extract helpers.ts for utility functions - Extract prompt-builder.ts for prompt construction - Reduce tools.ts complexity with cleaner separation of concerns * refactor(builtin-skills): split skills.ts into individual skill files - Move each skill to dedicated file in skills/ subdirectory - Create barrel export for backward compatibility - Improve maintainability with focused skill modules * chore: update import paths and lockfile - Update prometheus import path after refactor - Update bun.lock * fix(tests): complete BDD comment normalization - Fix remaining #when/#then patterns missed by initial sed - Affected: state.test.ts, events.test.ts --------- Co-authored-by: justsisyphus <justsisyphus@users.noreply.github.com>
159 lines
5.7 KiB
TypeScript
159 lines
5.7 KiB
TypeScript
import { describe, it, expect } from "bun:test"
|
|
import { buildRgArgs, buildFindArgs, buildPowerShellCommand } from "./cli"
|
|
|
|
describe("buildRgArgs", () => {
|
|
// given default options (no hidden/follow specified)
|
|
// when building ripgrep args
|
|
// then should include --hidden and --follow by default
|
|
it("includes --hidden by default when not explicitly set", () => {
|
|
const args = buildRgArgs({ pattern: "*.ts" })
|
|
expect(args).toContain("--hidden")
|
|
})
|
|
|
|
it("includes --follow by default when not explicitly set", () => {
|
|
const args = buildRgArgs({ pattern: "*.ts" })
|
|
expect(args).toContain("--follow")
|
|
})
|
|
|
|
// given hidden=false explicitly set
|
|
// when building ripgrep args
|
|
// then should NOT include --hidden
|
|
it("excludes --hidden when explicitly set to false", () => {
|
|
const args = buildRgArgs({ pattern: "*.ts", hidden: false })
|
|
expect(args).not.toContain("--hidden")
|
|
})
|
|
|
|
// given follow=false explicitly set
|
|
// when building ripgrep args
|
|
// then should NOT include --follow
|
|
it("excludes --follow when explicitly set to false", () => {
|
|
const args = buildRgArgs({ pattern: "*.ts", follow: false })
|
|
expect(args).not.toContain("--follow")
|
|
})
|
|
|
|
// given hidden=true explicitly set
|
|
// when building ripgrep args
|
|
// then should include --hidden
|
|
it("includes --hidden when explicitly set to true", () => {
|
|
const args = buildRgArgs({ pattern: "*.ts", hidden: true })
|
|
expect(args).toContain("--hidden")
|
|
})
|
|
|
|
// given follow=true explicitly set
|
|
// when building ripgrep args
|
|
// then should include --follow
|
|
it("includes --follow when explicitly set to true", () => {
|
|
const args = buildRgArgs({ pattern: "*.ts", follow: true })
|
|
expect(args).toContain("--follow")
|
|
})
|
|
|
|
// given pattern with special characters
|
|
// when building ripgrep args
|
|
// then should include glob pattern correctly
|
|
it("includes the glob pattern", () => {
|
|
const args = buildRgArgs({ pattern: "**/*.tsx" })
|
|
expect(args).toContain("--glob=**/*.tsx")
|
|
})
|
|
})
|
|
|
|
describe("buildFindArgs", () => {
|
|
// given default options (no hidden/follow specified)
|
|
// when building find args
|
|
// then should include hidden files by default (no exclusion filter)
|
|
it("includes hidden files by default when not explicitly set", () => {
|
|
const args = buildFindArgs({ pattern: "*.ts" })
|
|
// When hidden is enabled (default), should NOT have the exclusion filter
|
|
expect(args).not.toContain("-not")
|
|
expect(args.join(" ")).not.toContain("*/.*")
|
|
})
|
|
|
|
// given default options (no follow specified)
|
|
// when building find args
|
|
// then should include -L flag for symlink following by default
|
|
it("includes -L flag for symlink following by default", () => {
|
|
const args = buildFindArgs({ pattern: "*.ts" })
|
|
expect(args).toContain("-L")
|
|
})
|
|
|
|
// given hidden=false explicitly set
|
|
// when building find args
|
|
// then should exclude hidden files
|
|
it("excludes hidden files when hidden is explicitly false", () => {
|
|
const args = buildFindArgs({ pattern: "*.ts", hidden: false })
|
|
expect(args).toContain("-not")
|
|
expect(args.join(" ")).toContain("*/.*")
|
|
})
|
|
|
|
// given follow=false explicitly set
|
|
// when building find args
|
|
// then should NOT include -L flag
|
|
it("excludes -L flag when follow is explicitly false", () => {
|
|
const args = buildFindArgs({ pattern: "*.ts", follow: false })
|
|
expect(args).not.toContain("-L")
|
|
})
|
|
|
|
// given hidden=true explicitly set
|
|
// when building find args
|
|
// then should include hidden files
|
|
it("includes hidden files when hidden is explicitly true", () => {
|
|
const args = buildFindArgs({ pattern: "*.ts", hidden: true })
|
|
expect(args).not.toContain("-not")
|
|
expect(args.join(" ")).not.toContain("*/.*")
|
|
})
|
|
|
|
// given follow=true explicitly set
|
|
// when building find args
|
|
// then should include -L flag
|
|
it("includes -L flag when follow is explicitly true", () => {
|
|
const args = buildFindArgs({ pattern: "*.ts", follow: true })
|
|
expect(args).toContain("-L")
|
|
})
|
|
})
|
|
|
|
describe("buildPowerShellCommand", () => {
|
|
// given default options (no hidden specified)
|
|
// when building PowerShell command
|
|
// then should include -Force by default
|
|
it("includes -Force by default when not explicitly set", () => {
|
|
const args = buildPowerShellCommand({ pattern: "*.ts" })
|
|
const command = args.join(" ")
|
|
expect(command).toContain("-Force")
|
|
})
|
|
|
|
// given hidden=false explicitly set
|
|
// when building PowerShell command
|
|
// then should NOT include -Force
|
|
it("excludes -Force when hidden is explicitly false", () => {
|
|
const args = buildPowerShellCommand({ pattern: "*.ts", hidden: false })
|
|
const command = args.join(" ")
|
|
expect(command).not.toContain("-Force")
|
|
})
|
|
|
|
// given hidden=true explicitly set
|
|
// when building PowerShell command
|
|
// then should include -Force
|
|
it("includes -Force when hidden is explicitly true", () => {
|
|
const args = buildPowerShellCommand({ pattern: "*.ts", hidden: true })
|
|
const command = args.join(" ")
|
|
expect(command).toContain("-Force")
|
|
})
|
|
|
|
// given default options (no follow specified)
|
|
// when building PowerShell command
|
|
// then should NOT include -FollowSymlink (unsupported in Windows PowerShell 5.1)
|
|
it("does NOT include -FollowSymlink (unsupported in Windows PowerShell 5.1)", () => {
|
|
const args = buildPowerShellCommand({ pattern: "*.ts" })
|
|
const command = args.join(" ")
|
|
expect(command).not.toContain("-FollowSymlink")
|
|
})
|
|
|
|
// given pattern with special chars
|
|
// when building PowerShell command
|
|
// then should escape single quotes properly
|
|
it("escapes single quotes in pattern", () => {
|
|
const args = buildPowerShellCommand({ pattern: "test's.ts" })
|
|
const command = args.join(" ")
|
|
expect(command).toContain("test''s.ts")
|
|
})
|
|
})
|