feat(commands): refactor and add more commands

This commit is contained in:
verse91
2026-04-09 23:30:16 +07:00
parent 76458ce52e
commit f4816d2b5f
31 changed files with 546 additions and 110 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
package commands package dev
import ( import (
"github.com/versenilvis/iris/commands/core" "github.com/versenilvis/iris/commands/core"
@@ -1,4 +1,4 @@
package commands package dev
import ( import (
"github.com/versenilvis/iris/commands/core" "github.com/versenilvis/iris/commands/core"
+2 -1
View File
@@ -1,4 +1,4 @@
package commands package dev
import ( import (
"github.com/versenilvis/iris/commands/core" "github.com/versenilvis/iris/commands/core"
@@ -41,6 +41,7 @@ func init() {
{ {
Name: "add", Name: "add",
Description: "stage changes", Description: "stage changes",
Generator: core.FileGenerator(),
Options: []core.Option{ Options: []core.Option{
{Name: "-A", Description: "add all files"}, {Name: "-A", Description: "add all files"},
{Name: "-p", Description: "interactive patch"}, {Name: "-p", Description: "interactive patch"},
+194
View File
@@ -0,0 +1,194 @@
package dev
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
globalBuildOptions := []core.Option{
{Name: "-v", Description: "print package names"},
{Name: "-n", Description: "print commands but do not run"},
{Name: "-x", Description: "print commands as they run"},
{Name: "-race", Description: "enable data race detection"},
{Name: "-tags", Description: "comma-separated build tags"},
{Name: "-ldflags", Description: "arguments to pass to linker"},
{Name: "-gcflags", Description: "arguments to pass to compiler"},
{Name: "-asmflags", Description: "arguments to pass to assembler"},
{Name: "-compiler", Description: "name of compiler to use (gccgo or gc)"},
{Name: "-work", Description: "print temporary work directory"},
{Name: "-mod", Description: "module download mode (readonly, vendor, or mod)"},
{Name: "-trimpath", Description: "remove file system paths from executable"},
{Name: "-p", Description: "number of programs to run in parallel"},
{Name: "-a", Description: "force rebuilding of up-to-date packages"},
}
buildModeSubcommands := []core.Subcommand{
{Name: "archive", Description: "build non-main packages into .a files"},
{Name: "c-archive", Description: "build main package into C archive"},
{Name: "c-shared", Description: "build main package into C shared library"},
{Name: "exe", Description: "build main packages into executables"},
{Name: "pie", Description: "build position independent executables"},
{Name: "plugin", Description: "build main packages into Go plugin"},
{Name: "shared", Description: "combine packages into single shared library"},
}
core.Register(&core.Spec{
Name: "go",
Description: "tool for managing Go source code",
Subcommands: []core.Subcommand{
{
Name: "build",
Description: "compile packages and dependencies",
Generator: core.FileGenerator(".go"),
Options: append(globalBuildOptions,
core.Option{Name: ".", Description: "current package"},
core.Option{Name: "./...", Description: "all packages"},
core.Option{Name: "-o", Description: "output file or directory"},
core.Option{Name: "-i", Description: "install dependency packages"},
core.Option{Name: "-buildmode", Description: "build mode to use"},
),
Subcommands: buildModeSubcommands,
},
{
Name: "run",
Description: "compile and run Go program",
Generator: core.FileGenerator(".go"),
Options: append(globalBuildOptions,
core.Option{Name: ".", Description: "current package"},
core.Option{Name: "-exec", Description: "invoke binary using xprog"},
),
},
{
Name: "test",
Description: "test packages",
Generator: core.FileGenerator(".go"),
Options: append(globalBuildOptions,
core.Option{Name: ".", Description: "current package"},
core.Option{Name: "./...", Description: "all packages"},
core.Option{Name: "-c", Description: "compile test binary but do not run"},
core.Option{Name: "-i", Description: "install test dependencies"},
core.Option{Name: "-json", Description: "convert output to JSON"},
core.Option{Name: "-bench", Description: "run benchmarks"},
core.Option{Name: "-run", Description: "run specific test regex"},
core.Option{Name: "-cover", Description: "enable coverage report"},
),
},
{
Name: "mod",
Description: "module maintenance",
Subcommands: []core.Subcommand{
{Name: "init", Description: "initialize new module"},
{Name: "tidy", Description: "add missing and remove unused modules"},
{Name: "download", Description: "download modules to local cache"},
{Name: "vendor", Description: "make vendored copy of dependencies"},
{Name: "edit", Description: "edit go.mod from tools or scripts"},
{Name: "graph", Description: "print module requirement graph"},
{Name: "verify", Description: "verify dependencies have expected content"},
{Name: "why", Description: "explain why packages or modules are needed"},
},
},
{
Name: "get",
Description: "add dependencies to current module and install them",
Options: append(globalBuildOptions,
core.Option{Name: "-u", Description: "update to newer minor/patch releases"},
core.Option{Name: "-t", Description: "download modules needed for tests"},
core.Option{Name: "-d", Description: "only download, do not install"},
),
},
{
Name: "install",
Description: "compile and install packages and dependencies",
Options: globalBuildOptions,
},
{
Name: "list",
Description: "list packages or modules",
Options: append(globalBuildOptions,
core.Option{Name: "-m", Description: "list modules instead of packages"},
core.Option{Name: "-u", Description: "add upgrade information"},
core.Option{Name: "-json", Description: "print in JSON format"},
core.Option{Name: "-f", Description: "specify alternate format"},
),
},
{
Name: "fmt",
Description: "gofmt (reformat) package sources",
Options: []core.Option{
{Name: "-n", Description: "print commands that would be executed"},
{Name: "-x", Description: "print commands as they are executed"},
},
},
{
Name: "vet",
Description: "report likely mistakes in packages",
Options: globalBuildOptions,
},
{
Name: "env",
Description: "print Go environment information",
Options: []core.Option{
{Name: "-json", Description: "print environment in JSON format"},
{Name: "-u", Description: "unset named environment variables"},
{Name: "-w", Description: "change default settings of environment variables"},
},
},
{
Name: "version",
Description: "print Go version",
Options: []core.Option{
{Name: "-m", Description: "print embedded module version info"},
{Name: "-v", Description: "report unrecognized files"},
},
},
{
Name: "clean",
Description: "remove object files and cached files",
Options: append(globalBuildOptions,
core.Option{Name: "-i", Description: "remove installed archive or binary"},
core.Option{Name: "-cache", Description: "remove entire go build cache"},
core.Option{Name: "-modcache", Description: "remove entire module cache"},
),
},
{
Name: "tool",
Description: "run specified go tool",
Options: []core.Option{
{Name: "-n", Description: "print command but do not execute"},
},
},
{
Name: "work",
Description: "workspace maintenance",
Subcommands: []core.Subcommand{
{Name: "init", Description: "initialize workspace file"},
{Name: "edit", Description: "edit go.work from tools or scripts"},
{Name: "sync", Description: "sync workspace build list to modules"},
{Name: "use", Description: "add modules to workspace file"},
},
},
{
Name: "doc",
Description: "show documentation for package or symbol",
Options: []core.Option{
{Name: "-all", Description: "show all documentation"},
{Name: "-cmd", Description: "treat package main like regular package"},
{Name: "-src", Description: "show full source code"},
},
},
{
Name: "bug",
Description: "start a bug report",
},
{
Name: "fix",
Description: "update packages to use new APIs",
},
{
Name: "generate",
Description: "generate Go files by processing source",
Options: globalBuildOptions,
},
},
})
}
@@ -1,4 +1,4 @@
package commands package dev
import ( import (
"github.com/versenilvis/iris/commands/core" "github.com/versenilvis/iris/commands/core"
+1 -1
View File
@@ -1,4 +1,4 @@
package commands package dev
import ( import (
"github.com/versenilvis/iris/commands/core" "github.com/versenilvis/iris/commands/core"
+1 -1
View File
@@ -1,4 +1,4 @@
package commands package dev
import ( import (
"github.com/versenilvis/iris/commands/core" "github.com/versenilvis/iris/commands/core"
+13
View File
@@ -0,0 +1,13 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "cd",
Description: "change directory",
Generator: core.FileGenerator("/"), // Directory only
})
}
+16
View File
@@ -0,0 +1,16 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "chmod",
Description: "change file permissions",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-R", Description: "recursive"},
},
})
}
+16
View File
@@ -0,0 +1,16 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "chown",
Description: "change file owner",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-R", Description: "recursive"},
},
})
}
+21
View File
@@ -0,0 +1,21 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "cp",
Description: "copy files and directories",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-r", Description: "recursive"},
{Name: "-a", Description: "archive mode"},
{Name: "-v", Description: "verbose"},
{Name: "-i", Description: "interactive"},
{Name: "-u", Description: "update (copy only if newer)"},
{Name: "-p", Description: "preserve attributes"},
},
})
}
+17
View File
@@ -0,0 +1,17 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "ln",
Description: "create links",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-s", Description: "symbolic link"},
{Name: "-f", Description: "force"},
},
})
}
+20
View File
@@ -0,0 +1,20 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "ls",
Description: "list directory contents",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-a", Description: "all files"},
{Name: "-l", Description: "long format"},
{Name: "-h", Description: "human readable"},
{Name: "-R", Description: "recursive"},
{Name: "-t", Description: "sort by time"},
},
})
}
+16
View File
@@ -0,0 +1,16 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "mkdir",
Description: "make directories",
Options: []core.Option{
{Name: "-p", Description: "create parent dirs"},
{Name: "-v", Description: "verbose"},
},
})
}
+19
View File
@@ -0,0 +1,19 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "mv",
Description: "move (rename) files",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-i", Description: "interactive"},
{Name: "-f", Description: "force (overwrite)"},
{Name: "-n", Description: "no clobber (don't overwrite)"},
{Name: "-v", Description: "verbose"},
},
})
}
+20
View File
@@ -0,0 +1,20 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "rm",
Description: "remove files or directories",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-r", Description: "recursive"},
{Name: "-f", Description: "force"},
{Name: "-i", Description: "interactive"},
{Name: "-v", Description: "verbose"},
{Name: "-d", Description: "remove empty directories"},
},
})
}
+13
View File
@@ -0,0 +1,13 @@
package fs
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "touch",
Description: "create or update file timestamp",
Generator: core.FileGenerator(),
})
}
-99
View File
@@ -1,99 +0,0 @@
package commands
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "go",
Description: "go toolchain",
Subcommands: []core.Subcommand{
{
Name: "build",
Description: "compile packages",
Options: []core.Option{
{Name: "-o", Description: "output file"},
{Name: "-v", Description: "verbose"},
{Name: "-race", Description: "enable race detector"},
{Name: "-ldflags", Description: "linker flags"},
},
},
{
Name: "run",
Description: "compile and run",
Options: []core.Option{
{Name: "-race", Description: "enable race detector"},
},
},
{
Name: "test",
Description: "run tests",
Options: []core.Option{
{Name: "-v", Description: "verbose output"},
{Name: "-run", Description: "run specific test"},
{Name: "-bench", Description: "run benchmarks"},
{Name: "-cover", Description: "coverage report"},
{Name: "-count", Description: "run count times"},
{Name: "-race", Description: "enable race detector"},
},
},
{
Name: "mod",
Description: "module maintenance",
Subcommands: []core.Subcommand{
{Name: "init", Description: "initialize module"},
{Name: "tidy", Description: "clean up modules"},
{Name: "download", Description: "download modules"},
{Name: "vendor", Description: "make vendor copy"},
{Name: "edit", Description: "edit go.mod"},
{Name: "graph", Description: "print module graph"},
{Name: "verify", Description: "verify dependencies"},
},
},
{
Name: "get",
Description: "add dependency",
Options: []core.Option{
{Name: "-u", Description: "update module"},
},
},
{
Name: "fmt",
Description: "format source",
},
{
Name: "vet",
Description: "examine code",
},
{
Name: "install",
Description: "compile and install",
},
{
Name: "generate",
Description: "run go generate",
},
{
Name: "clean",
Description: "remove object files",
Options: []core.Option{
{Name: "-cache", Description: "clean build cache"},
{Name: "-testcache", Description: "clean test cache"},
},
},
{
Name: "env",
Description: "print go environment",
},
{
Name: "doc",
Description: "show documentation",
},
{
Name: "tool",
Description: "run go tool",
},
},
})
}
+18
View File
@@ -0,0 +1,18 @@
package info
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "du",
Description: "estimate file space usage",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-h", Description: "human readable"},
{Name: "-s", Description: "summarize"},
{Name: "-a", Description: "all files"},
},
})
}
+13
View File
@@ -0,0 +1,13 @@
package info
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "file",
Description: "determine file type",
Generator: core.FileGenerator(),
})
}
+13
View File
@@ -0,0 +1,13 @@
package info
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "stat",
Description: "display file status",
Generator: core.FileGenerator(),
})
}
+18
View File
@@ -0,0 +1,18 @@
package info
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "wc",
Description: "word, line, character count",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-l", Description: "count lines"},
{Name: "-w", Description: "count words"},
{Name: "-c", Description: "count bytes"},
},
})
}
@@ -1,4 +1,4 @@
package commands package runner
import ( import (
"bufio" "bufio"
@@ -13,7 +13,7 @@ func init() {
core.Register(&core.Spec{ core.Register(&core.Spec{
Name: "just", Name: "just",
Description: "command runner", Description: "command runner",
Generator: func(tokens []string, prefix string) []core.Suggestion { Generator: func(tokens []string, prefix string, partial string) []core.Suggestion {
file, err := os.Open("justfile") file, err := os.Open("justfile")
if err != nil { if err != nil {
// try uppercase // try uppercase
@@ -1,4 +1,4 @@
package commands package runner
import ( import (
"bufio" "bufio"
@@ -12,7 +12,7 @@ func init() {
core.Register(&core.Spec{ core.Register(&core.Spec{
Name: "make", Name: "make",
Description: "build automation", Description: "build automation",
Generator: func(tokens []string, prefix string) []core.Suggestion { Generator: func(tokens []string, prefix string, partial string) []core.Suggestion {
// Read the Makefile // Read the Makefile
file, err := os.Open("Makefile") file, err := os.Open("Makefile")
if err != nil { if err != nil {
+19
View File
@@ -0,0 +1,19 @@
package search
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "find",
Description: "search for files",
Generator: core.FileGenerator("/"),
Options: []core.Option{
{Name: "-name", Description: "match by name"},
{Name: "-type", Description: "match by type (f/d)"},
{Name: "-size", Description: "match by size"},
{Name: "-mtime", Description: "match by modified time"},
},
})
}
+20
View File
@@ -0,0 +1,20 @@
package search
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "grep",
Description: "search text in files",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-r", Description: "recursive"},
{Name: "-i", Description: "ignore case"},
{Name: "-n", Description: "show line numbers"},
{Name: "-v", Description: "invert match"},
{Name: "-l", Description: "show filenames only"},
},
})
}
+17
View File
@@ -0,0 +1,17 @@
package view
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "cat",
Description: "concatenate and print",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-n", Description: "number lines"},
{Name: "-b", Description: "number non-blank"},
},
})
}
+16
View File
@@ -0,0 +1,16 @@
package view
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "head",
Description: "output first lines of file",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-n", Description: "number of lines"},
},
})
}
+13
View File
@@ -0,0 +1,13 @@
package view
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "less",
Description: "view file contents (scrollable)",
Generator: core.FileGenerator(),
})
}
+17
View File
@@ -0,0 +1,17 @@
package view
import (
"github.com/versenilvis/iris/commands/core"
)
func init() {
core.Register(&core.Spec{
Name: "tail",
Description: "output last lines of file",
Generator: core.FileGenerator(),
Options: []core.Option{
{Name: "-n", Description: "number of lines"},
{Name: "-f", Description: "follow (live updates)"},
},
})
}
+6 -1
View File
@@ -14,7 +14,12 @@ import (
"github.com/creack/pty" "github.com/creack/pty"
"github.com/spf13/cobra" "github.com/spf13/cobra"
_ "github.com/versenilvis/iris/commands" _ "github.com/versenilvis/iris/commands/dev"
_ "github.com/versenilvis/iris/commands/fs"
_ "github.com/versenilvis/iris/commands/info"
_ "github.com/versenilvis/iris/commands/runner"
_ "github.com/versenilvis/iris/commands/search"
_ "github.com/versenilvis/iris/commands/view"
"github.com/versenilvis/iris/commands/core" "github.com/versenilvis/iris/commands/core"
"github.com/versenilvis/iris/integration" "github.com/versenilvis/iris/integration"
"golang.org/x/term" "golang.org/x/term"