initial commit
This commit is contained in:
commit
8827a5923a
15 changed files with 880 additions and 0 deletions
82
Containerfile
Normal file
82
Containerfile
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
ARG BASE_IMAGE=ubuntu:25.10
|
||||||
|
|
||||||
|
FROM $BASE_IMAGE
|
||||||
|
|
||||||
|
# Install basics omitted from the minimal Ubuntu server build.
|
||||||
|
RUN apt-get update && apt-get upgrade -y && apt-get install -y unminimize
|
||||||
|
RUN yes | unminimize
|
||||||
|
|
||||||
|
# Install frequently used software dependencies and basics like Git and Fish.
|
||||||
|
RUN apt-get install -y gpg sudo wget curl build-essential software-properties-common libssl-dev pkg-config libglew-dev git fish
|
||||||
|
|
||||||
|
# Install handy developer tools.
|
||||||
|
RUN apt-get install -y iputils-ping postgresql-client git-delta jq sqlite3 vim pipx ripgrep openssh-server
|
||||||
|
|
||||||
|
# Install mise-en-place for project (and in some cases global) tooling management.
|
||||||
|
RUN install -dm 755 /etc/apt/keyrings
|
||||||
|
RUN wget -qO - https://mise.jdx.dev/gpg-key.pub | gpg --dearmor | tee /etc/apt/keyrings/mise-archive-keyring.gpg 1> /dev/null
|
||||||
|
RUN echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.gpg arch=arm64] https://mise.jdx.dev/deb stable main" \
|
||||||
|
| tee /etc/apt/sources.list.d/mise.list
|
||||||
|
RUN apt-get update && apt-get install -y mise
|
||||||
|
|
||||||
|
ARG USERNAME=developer
|
||||||
|
|
||||||
|
RUN if [ -z $USERNAME ]; then exit 1; fi
|
||||||
|
|
||||||
|
# Initialize non-root user account, with passwordless sudo.
|
||||||
|
RUN useradd -m -g sudo -s /usr/bin/fish $USERNAME
|
||||||
|
RUN sed -i'' 's/%sudo\tALL=(ALL:ALL) ALL/%sudo ALL = (ALL) NOPASSWD: ALL/g' /etc/sudoers
|
||||||
|
WORKDIR /home/$USERNAME
|
||||||
|
USER $USERNAME
|
||||||
|
|
||||||
|
# Activate mise for non-root user's shell sessions.
|
||||||
|
RUN mkdir -p ~/.config/fish && echo 'mise activate fish | source' >> ~/.config/fish/config.fish && mkdir -p ~/.config/mise
|
||||||
|
COPY --chown=$USERNAME ./assets/mise/config.toml /home/$USERNAME/.config/mise/config.toml
|
||||||
|
|
||||||
|
# Install stable Rust toolchain globally using mise (rustup management is automated).
|
||||||
|
RUN mise install
|
||||||
|
|
||||||
|
# Install sqlx CLI for managing database migrations in sqlx projects.
|
||||||
|
RUN mise x -- cargo binstall -y cargo-nextest sqlx-cli
|
||||||
|
|
||||||
|
# Install Claude Code CLI.
|
||||||
|
RUN curl -fsSL https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/bootstrap.sh | bash
|
||||||
|
RUN fish -c 'fish_add_path /home/$USERNAME/.local/bin'
|
||||||
|
|
||||||
|
# Copy Helix configurations.
|
||||||
|
# It seems there's a bug in `apple/container`'s COPY implementation that fails
|
||||||
|
# to recursively copy directory contents from the host, so we point it to each
|
||||||
|
# file.
|
||||||
|
RUN mkdir -p ~/.config/helix/snippets && mkdir -p ~/.config/helix/themes
|
||||||
|
COPY --chown=$USERNAME ./assets/helix/*.toml /home/$USERNAME/.config/helix/
|
||||||
|
COPY --chown=$USERNAME ./assets/helix/ignore /home/$USERNAME/.config/helix/
|
||||||
|
COPY --chown=$USERNAME ./assets/helix/snippets/*.toml /home/$USERNAME/.config/helix/snippets/
|
||||||
|
COPY --chown=$USERNAME ./assets/helix/themes/*.toml /home/$USERNAME/.config/helix/themes/
|
||||||
|
|
||||||
|
ARG VCS_EMAIL
|
||||||
|
ARG VCS_NAME
|
||||||
|
|
||||||
|
# Copy Jujutsu configuration.
|
||||||
|
RUN mkdir -p ~/.config/jj
|
||||||
|
COPY --chown=$USERNAME ./assets/jj/config.toml /home/$USERNAME/.config/jj/
|
||||||
|
RUN sed -i'' "s/{{ VCS_EMAIL }}/$VCS_EMAIL/" ~/.config/jj/config.toml
|
||||||
|
RUN sed -i'' "s/{{ VCS_NAME }}/$VCS_NAME/" ~/.config/jj/config.toml
|
||||||
|
|
||||||
|
COPY --chown=$USERNAME ./assets/git/gitconfig /home/$USERNAME/.gitconfig
|
||||||
|
RUN sed -i'' "s/{{ VCS_EMAIL }}/$VCS_EMAIL/" ~/.gitconfig
|
||||||
|
RUN sed -i'' "s/{{ VCS_NAME }}/$VCS_NAME/" ~/.gitconfig
|
||||||
|
|
||||||
|
# Delete VCS config if values not provided.
|
||||||
|
RUN if [ -z "$VCS_EMAIL" ] || [ -z "$VCS_NAME" ]; then rm ~/.gitconfig ~/.config/jj/config.toml; fi
|
||||||
|
|
||||||
|
# Configure delta diff viewer.
|
||||||
|
ENV DELTA_FEATURES='side-by-side navigate'
|
||||||
|
|
||||||
|
# Configure terminal.
|
||||||
|
ENV COLORTERM=truecolor
|
||||||
|
ENV SHELL=fish
|
||||||
|
|
||||||
|
# Pop the user into the Fish shell by default.
|
||||||
|
CMD /usr/bin/fish
|
||||||
15
Makefile
Normal file
15
Makefile
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
.PHONY: check-email fish-install questing noble
|
||||||
|
|
||||||
|
questing: check-email
|
||||||
|
fish ./build-image.fish --email $(EMAIL)
|
||||||
|
|
||||||
|
noble: check-email
|
||||||
|
fish ./build-image.fish -t devbox:noble -b ubuntu:24.04 --email $(EMAIL)
|
||||||
|
|
||||||
|
fish-install:
|
||||||
|
cp ./devbox.fish ~/.config/fish/functions/devbox.fish
|
||||||
|
|
||||||
|
check-email:
|
||||||
|
ifndef EMAIL
|
||||||
|
$(error Please set the EMAIL env var)
|
||||||
|
endif
|
||||||
21
README.md
Normal file
21
README.md
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Development Environment in a Box
|
||||||
|
|
||||||
|
My dotfiles, with a devcontainer image to boot. Depends on
|
||||||
|
[fish-shell](https://fishshell.com/) and
|
||||||
|
[container](https://github.com/apple/container).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```fish
|
||||||
|
# Setup
|
||||||
|
make fish-install
|
||||||
|
EMAIL=git@example.com make questing
|
||||||
|
|
||||||
|
# Execution
|
||||||
|
cd ~/path/to/project
|
||||||
|
devbox --cpus=4 --mem=8G my-project
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
container stop my-project
|
||||||
|
container rm my-project
|
||||||
|
```
|
||||||
16
assets/git/gitconfig
Normal file
16
assets/git/gitconfig
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
[user]
|
||||||
|
email = {{ VCS_EMAIL }}
|
||||||
|
name = {{ VCS_NAME }}
|
||||||
|
|
||||||
|
[core]
|
||||||
|
pager = delta
|
||||||
|
|
||||||
|
[interactive]
|
||||||
|
diffFilter = delta --color-only
|
||||||
|
|
||||||
|
[delta]
|
||||||
|
side-by-side = true
|
||||||
|
navigate = true
|
||||||
|
|
||||||
|
[merge]
|
||||||
|
conflictStyle = zdiff3
|
||||||
48
assets/helix/config.toml
Normal file
48
assets/helix/config.toml
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
theme = "yo_dracula"
|
||||||
|
|
||||||
|
[editor]
|
||||||
|
rulers = [80, 100]
|
||||||
|
true-color = true
|
||||||
|
|
||||||
|
[editor.cursor-shape]
|
||||||
|
insert = "bar"
|
||||||
|
|
||||||
|
[editor.file-picker]
|
||||||
|
hidden = false
|
||||||
|
git-ignore = false
|
||||||
|
|
||||||
|
[editor.soft-wrap]
|
||||||
|
enable = true
|
||||||
|
|
||||||
|
[editor.statusline]
|
||||||
|
right = [
|
||||||
|
"diagnostics",
|
||||||
|
"selections",
|
||||||
|
"primary-selection-length",
|
||||||
|
"spacer",
|
||||||
|
"position",
|
||||||
|
"position-percentage",
|
||||||
|
]
|
||||||
|
|
||||||
|
[keys.normal]
|
||||||
|
"}" = "goto_next_paragraph"
|
||||||
|
"{" = "goto_prev_paragraph"
|
||||||
|
"y" = "yank_to_clipboard"
|
||||||
|
"d" = ["yank_to_clipboard", "delete_selection"]
|
||||||
|
"p" = "paste_clipboard_after"
|
||||||
|
"P" = "paste_clipboard_before"
|
||||||
|
|
||||||
|
[keys.select]
|
||||||
|
"}" = "goto_next_paragraph"
|
||||||
|
"{" = "goto_prev_paragraph"
|
||||||
|
"y" = "yank_to_clipboard"
|
||||||
|
"d" = ["yank_to_clipboard", "delete_selection"]
|
||||||
|
"p" = "paste_clipboard_after"
|
||||||
|
"P" = "paste_clipboard_before"
|
||||||
|
|
||||||
|
[keys.normal.space]
|
||||||
|
v = [":vs", "file_picker"]
|
||||||
|
s = [":sp", "file_picker"]
|
||||||
|
w = ":w"
|
||||||
|
q = ":q"
|
||||||
|
space = "rotate_view"
|
||||||
1
assets/helix/ignore
Normal file
1
assets/helix/ignore
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
node_modules
|
||||||
102
assets/helix/languages.toml
Normal file
102
assets/helix/languages.toml
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
[language-server.rust-analyzer.config]
|
||||||
|
check.command = "clippy"
|
||||||
|
|
||||||
|
[language-server.deno]
|
||||||
|
command = "deno"
|
||||||
|
args = ["lsp"]
|
||||||
|
config = { enable = true, lint = true, unstable = true }
|
||||||
|
|
||||||
|
[language-server.scls]
|
||||||
|
command = "simple-completion-language-server"
|
||||||
|
|
||||||
|
[language-server.scls.config]
|
||||||
|
max_completion_items = 100 # set max completion results len for each group: words, snippets, unicode-input
|
||||||
|
feature_words = false # enable completion by word
|
||||||
|
feature_snippets = true # enable snippets
|
||||||
|
snippets_first = true # completions will return before snippets by default
|
||||||
|
snippets_inline_by_word_tail = false # suggest snippets by WORD tail, for example text `xsq|` become `x^2|` when snippet `sq` has body `^2`
|
||||||
|
feature_unicode_input = false # enable "unicode input"
|
||||||
|
feature_paths = true # enable path completion
|
||||||
|
feature_citations = false # enable citation completion (only on `citation` feature enabled)
|
||||||
|
|
||||||
|
[language-server.ruff]
|
||||||
|
command = "ruff"
|
||||||
|
args = ["server"]
|
||||||
|
|
||||||
|
[language-server.pyright]
|
||||||
|
command = "pyright-langserver"
|
||||||
|
args = ["--stdio"]
|
||||||
|
|
||||||
|
|
||||||
|
[[language]]
|
||||||
|
name = "javascript"
|
||||||
|
scope = "source.js"
|
||||||
|
injection-regex = "^(js|javascript)$"
|
||||||
|
file-types = ["js", "jsx", "mjs"]
|
||||||
|
shebangs = ["deno", "node"]
|
||||||
|
roots = ["deno.json", "deno.jsonc", "package.json", "tsconfig.json"]
|
||||||
|
comment-token = "//"
|
||||||
|
language-servers = ["deno"]
|
||||||
|
indent = { tab-width = 2, unit = " " }
|
||||||
|
auto-format = true
|
||||||
|
|
||||||
|
[[language]]
|
||||||
|
name = "jsx"
|
||||||
|
scope = "source.jsx"
|
||||||
|
injection-regex = "jsx"
|
||||||
|
file-types = ["jsx"]
|
||||||
|
shebangs = ["deno", "node"]
|
||||||
|
roots = ["deno.json", "deno.jsonc", "package.json", "tsconfig.json"]
|
||||||
|
comment-token = "//"
|
||||||
|
language-servers = ["deno"]
|
||||||
|
indent = { tab-width = 2, unit = " " }
|
||||||
|
grammar = "javascript"
|
||||||
|
auto-format = true
|
||||||
|
|
||||||
|
[[language]]
|
||||||
|
name = "typescript"
|
||||||
|
scope = "source.ts"
|
||||||
|
injection-regex = "^(ts|typescript)$"
|
||||||
|
file-types = ["ts"]
|
||||||
|
shebangs = ["deno", "node"]
|
||||||
|
roots = ["deno.json", "deno.jsonc", "package.json", "tsconfig.json"]
|
||||||
|
language-servers = ["deno"]
|
||||||
|
indent = { tab-width = 2, unit = " " }
|
||||||
|
auto-format = true
|
||||||
|
|
||||||
|
[[language]]
|
||||||
|
name = "tsx"
|
||||||
|
scope = "source.tsx"
|
||||||
|
injection-regex = "^(tsx)$" # |typescript
|
||||||
|
file-types = ["tsx"]
|
||||||
|
shebangs = ["deno", "node"]
|
||||||
|
roots = ["deno.json", "deno.jsonc", "package.json", "tsconfig.json"]
|
||||||
|
language-servers = ["deno"]
|
||||||
|
indent = { tab-width = 2, unit = " " }
|
||||||
|
auto-format = true
|
||||||
|
|
||||||
|
[[language]]
|
||||||
|
name = "html"
|
||||||
|
file-types = ["html", "liquid"]
|
||||||
|
language-servers = ["scls"]
|
||||||
|
|
||||||
|
[[language]]
|
||||||
|
name = "rust"
|
||||||
|
language-servers = ["scls", "rust-analyzer"]
|
||||||
|
|
||||||
|
[[language]]
|
||||||
|
name = "markdown"
|
||||||
|
scope = "source.md"
|
||||||
|
injection-regex = "md|markdown"
|
||||||
|
file-types = ["md", "livemd", "markdown", "mdx", "mkd", "mkdn", "mdwn", "mdown", "markdn", "mdtxt", "mdtext", "workbook", { glob = "PULLREQ_EDITMSG" }]
|
||||||
|
roots = [".marksman.toml"]
|
||||||
|
language-servers = [ "marksman", "markdown-oxide" ]
|
||||||
|
indent = { tab-width = 2, unit = " " }
|
||||||
|
block-comment-tokens = { start = "<!--", end = "-->" }
|
||||||
|
auto-format = true
|
||||||
|
formatter = { command = "deno" , args = ["fmt", "-", "--ext", "md", "--prose-wrap=always"] }
|
||||||
|
|
||||||
|
[[language]]
|
||||||
|
name = "python"
|
||||||
|
language-servers = ["ruff", "pyright"]
|
||||||
|
auto-format = true
|
||||||
171
assets/helix/snippets/rust.toml
Normal file
171
assets/helix/snippets/rust.toml
Normal file
|
|
@ -0,0 +1,171 @@
|
||||||
|
[[snippets]]
|
||||||
|
prefix = "drv"
|
||||||
|
body = """#[derive(Clone, Debug)]
|
||||||
|
$1struct $2 {
|
||||||
|
$3
|
||||||
|
}"""
|
||||||
|
|
||||||
|
[[snippets]]
|
||||||
|
prefix = "pbc"
|
||||||
|
body = "pub(crate) "
|
||||||
|
|
||||||
|
[[snippets]]
|
||||||
|
prefix = "pbs"
|
||||||
|
body = "pub(super) "
|
||||||
|
|
||||||
|
[[snippets]]
|
||||||
|
prefix = "phono_model"
|
||||||
|
body = """
|
||||||
|
use derive_builder::Builder;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use sqlx::query_as;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
use crate::{client::AppDbClient, language::Language};
|
||||||
|
|
||||||
|
///
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
|
pub struct $1 {
|
||||||
|
/// Primary key (defaults to UUIDv7).
|
||||||
|
pub id: Uuid,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl $1 {
|
||||||
|
/// Build an insert statement to create a new object.
|
||||||
|
pub fn insert() -> InsertBuilder {
|
||||||
|
InsertBuilder::default()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Build an update statement to alter the content of an existing object.
|
||||||
|
pub fn update() -> UpdateBuilder {
|
||||||
|
UpdateBuilder::default()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Build a single-field query by ID.
|
||||||
|
pub fn with_id(id: Uuid) -> WithIdQuery {
|
||||||
|
WithIdQuery { id }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Builder, Clone, Debug)]
|
||||||
|
pub struct Insertable {
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Insertable {
|
||||||
|
pub async fn execute(self, app_db: &mut AppDbClient) -> Result<$1, sqlx::Error> {
|
||||||
|
query_as!(
|
||||||
|
$1,
|
||||||
|
r#"
|
||||||
|
insert into $2 () values ()
|
||||||
|
returning
|
||||||
|
id
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.fetch_one(app_db.get_conn())
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Builder, Clone, Debug, Default)]
|
||||||
|
pub struct Update {
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Update {
|
||||||
|
pub async fn execute(self, app_db: &mut AppDbClient) -> Result<$1, sqlx::Error> {
|
||||||
|
query_as!(
|
||||||
|
$1,
|
||||||
|
r#"
|
||||||
|
insert into $2
|
||||||
|
()
|
||||||
|
values ()
|
||||||
|
returning
|
||||||
|
id
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.fetch_one(&mut *app_db.conn)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct WithIdQuery {
|
||||||
|
id: Uuid,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WithIdQuery {
|
||||||
|
pub async fn fetch_all(
|
||||||
|
self,
|
||||||
|
app_db: &mut AppDbClient,
|
||||||
|
) -> Result<$1, sqlx::Error> {
|
||||||
|
query_as!(
|
||||||
|
FieldFormPrompt,
|
||||||
|
r#"
|
||||||
|
select
|
||||||
|
id
|
||||||
|
from $2
|
||||||
|
where id = $$1
|
||||||
|
"#,
|
||||||
|
self.id,
|
||||||
|
)
|
||||||
|
.fetch_one(app_db.get_conn())
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
[[snippets]]
|
||||||
|
prefix = "resptemp"
|
||||||
|
body = """#[derive(Template)]
|
||||||
|
#[template(path = $1)]
|
||||||
|
struct ResponseTemplate {
|
||||||
|
base_path: String,
|
||||||
|
breadcrumbs: BreadcrumbTrail,
|
||||||
|
csrf_token: String,
|
||||||
|
navbar: Navbar,
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Html(
|
||||||
|
ResponseTemplate {
|
||||||
|
breadcrumbs: BreadcrumbTrail::from_base_path(&base_path),
|
||||||
|
base_path,
|
||||||
|
csrf_token,
|
||||||
|
navbar: navbar_template.build(),
|
||||||
|
}.render()?,
|
||||||
|
).into_response())"""
|
||||||
|
|
||||||
|
[[snippets]]
|
||||||
|
prefix = "dieselmodel"
|
||||||
|
body = """
|
||||||
|
use diesel::{
|
||||||
|
dsl::{auto_type, AsSelect},
|
||||||
|
pg::Pg,
|
||||||
|
prelude::*,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::schema::$1;
|
||||||
|
|
||||||
|
pub use crate::schema::$1::{dsl, table};
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Identifiable, Queryable, Selectable)]
|
||||||
|
#[diesel(table_name = $1)]
|
||||||
|
pub struct $2 {
|
||||||
|
pub id: Uuid,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl $2 {
|
||||||
|
#[auto_type(no_type_alias)]
|
||||||
|
pub fn all() -> _ {
|
||||||
|
let select: AsSelect<Self, Pg> = Self::as_select();
|
||||||
|
table.select(select)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[auto_type(no_type_alias)]
|
||||||
|
pub fn with_id<'a>(id: &'a Uuid) -> _ {
|
||||||
|
dsl::id.eq(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
[[snippets]]
|
||||||
|
prefix = "atnta"
|
||||||
|
body = "#[auto_type(no_type_alias)]"
|
||||||
77
assets/helix/themes/dracula_16.toml
Normal file
77
assets/helix/themes/dracula_16.toml
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
# Author : Sam Sartor <me@samsartor.com>
|
||||||
|
# Modified by Brent Schroeter <contact@brentsch.com>
|
||||||
|
# A port of https://github.com/bceskavich/dracula-at-night
|
||||||
|
"comment" = { fg = "comment" }
|
||||||
|
"constant" = { fg = "purple" }
|
||||||
|
"constant.character.escape" = { fg = "pink" }
|
||||||
|
"function" = { fg = "green" }
|
||||||
|
"keyword" = { fg = "pink" }
|
||||||
|
"operator" = { fg = "pink" }
|
||||||
|
"punctuation" = { fg = "foreground" }
|
||||||
|
"string" = { fg = "yellow" }
|
||||||
|
"string.regexp" = { fg = "red" }
|
||||||
|
"tag" = { fg = "pink" }
|
||||||
|
"type" = { fg = "cyan", modifiers = ["italic"] }
|
||||||
|
"type.enum.variant" = { fg = "foreground", modifiers = ["italic"] }
|
||||||
|
"variable" = { fg = "foreground" }
|
||||||
|
"variable.builtin" = { fg = "cyan", modifiers = ["italic"] }
|
||||||
|
"variable.parameter" = { fg ="orange", modifiers = ["italic"] }
|
||||||
|
|
||||||
|
"diff.plus" = { fg = "green" }
|
||||||
|
"diff.delta" = { fg = "orange" }
|
||||||
|
"diff.minus" = { fg = "red" }
|
||||||
|
|
||||||
|
"ui.background" = { fg = "foreground", bg = "background" }
|
||||||
|
"ui.cursor" = { fg = "background", bg = "orange", modifiers = ["dim"] }
|
||||||
|
"ui.cursor.match" = { fg = "green", modifiers = ["underlined"] }
|
||||||
|
"ui.cursor.primary" = { fg = "background", bg = "purple", modifiers = ["dim"] }
|
||||||
|
"ui.help" = { fg = "foreground", bg = "background_dark" }
|
||||||
|
"ui.linenr" = { fg = "comment" }
|
||||||
|
"ui.linenr.selected" = { fg = "foreground" }
|
||||||
|
"ui.menu" = { fg = "foreground", bg = "background_dark" }
|
||||||
|
"ui.menu.selected" = { fg = "cyan", bg = "background_dark" }
|
||||||
|
"ui.popup" = { fg = "foreground", bg = "background_dark" }
|
||||||
|
"ui.selection" = { fg = "background", bg = "purple", modifiers = ["dim"] }
|
||||||
|
"ui.selection.primary" = { bg = "background_light" }
|
||||||
|
"ui.cursorline" = { bg = "background_dark" }
|
||||||
|
"ui.statusline" = { fg = "foreground", bg = "background_dark" }
|
||||||
|
"ui.statusline.inactive" = { fg = "comment", bg = "background_dark" }
|
||||||
|
"ui.statusline.normal" = { fg = "background_dark", bg = "cyan" }
|
||||||
|
"ui.statusline.insert" = { fg = "background_dark", bg = "green" }
|
||||||
|
"ui.statusline.select" = { fg = "background_dark", bg = "purple" }
|
||||||
|
"ui.text" = { fg = "foreground" }
|
||||||
|
"ui.text.focus" = { fg = "cyan" }
|
||||||
|
"ui.window" = { fg = "foreground" }
|
||||||
|
"ui.virtual.ruler" = { bg = "background_dark" }
|
||||||
|
|
||||||
|
"error" = { fg = "red" }
|
||||||
|
"warning" = { fg = "cyan" }
|
||||||
|
|
||||||
|
"markup.heading" = { fg = "purple", modifiers = ["bold"] }
|
||||||
|
"markup.list" = "cyan"
|
||||||
|
"markup.bold" = { fg = "orange", modifiers = ["bold"] }
|
||||||
|
"markup.italic" = { fg = "yellow", modifiers = ["italic"] }
|
||||||
|
"markup.strikethrough" = { modifiers = ["crossed_out"] }
|
||||||
|
"markup.link.url" = "cyan"
|
||||||
|
"markup.link.text" = "pink"
|
||||||
|
"markup.quote" = { fg = "yellow", modifiers = ["italic"] }
|
||||||
|
"markup.raw" = { fg = "foreground" }
|
||||||
|
|
||||||
|
"diagnostic.warning" = { underline = { color = "#cca700", style = "curl" } }
|
||||||
|
"diagnostic.error" = { underline = { color = "#f48771", style = "curl" } }
|
||||||
|
"diagnostic.info" = { underline = { color = "#75beff", style = "curl" } }
|
||||||
|
"diagnostic.hint" = { underline = { color = "#eeeeeb3", style = "curl" } }
|
||||||
|
|
||||||
|
[palette]
|
||||||
|
background = "#0e1419"
|
||||||
|
background_dark = "#000000"
|
||||||
|
background_light = "#403090"# "#41424c"
|
||||||
|
foreground = "#f8f8f2"
|
||||||
|
comment = "#6272a4"
|
||||||
|
red = "#ff5555"
|
||||||
|
orange = "#ffb86c"
|
||||||
|
yellow = "#f1fa8c"
|
||||||
|
green = "#50fa7b"
|
||||||
|
purple = "#bd93f9"
|
||||||
|
cyan = "#8be9fd"
|
||||||
|
pink = "#ff79c6"
|
||||||
77
assets/helix/themes/dracula_helix.toml
Normal file
77
assets/helix/themes/dracula_helix.toml
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
# Author : Sam Sartor <me@samsartor.com>
|
||||||
|
# Modified by Brent Schroeter <contact@brentsch.com>
|
||||||
|
# A port of https://github.com/bceskavich/dracula-at-night
|
||||||
|
"comment" = { fg = "comment" }
|
||||||
|
"constant" = { fg = "purple" }
|
||||||
|
"constant.character.escape" = { fg = "pink" }
|
||||||
|
"function" = { fg = "green" }
|
||||||
|
"keyword" = { fg = "pink" }
|
||||||
|
"operator" = { fg = "pink" }
|
||||||
|
"punctuation" = { fg = "foreground" }
|
||||||
|
"string" = { fg = "yellow" }
|
||||||
|
"string.regexp" = { fg = "red" }
|
||||||
|
"tag" = { fg = "pink" }
|
||||||
|
"type" = { fg = "cyan", modifiers = ["italic"] }
|
||||||
|
"type.enum.variant" = { fg = "foreground", modifiers = ["italic"] }
|
||||||
|
"variable" = { fg = "foreground" }
|
||||||
|
"variable.builtin" = { fg = "cyan", modifiers = ["italic"] }
|
||||||
|
"variable.parameter" = { fg ="orange", modifiers = ["italic"] }
|
||||||
|
|
||||||
|
"diff.plus" = { fg = "green" }
|
||||||
|
"diff.delta" = { fg = "orange" }
|
||||||
|
"diff.minus" = { fg = "red" }
|
||||||
|
|
||||||
|
"ui.background" = { fg = "foreground", bg = "background" }
|
||||||
|
"ui.cursor" = { fg = "background", bg = "orange", modifiers = ["dim"] }
|
||||||
|
"ui.cursor.match" = { fg = "green", modifiers = ["underlined"] }
|
||||||
|
"ui.cursor.primary" = { fg = "background", bg = "purple", modifiers = ["dim"] }
|
||||||
|
"ui.help" = { fg = "foreground", bg = "background_dark" }
|
||||||
|
"ui.linenr" = { fg = "comment" }
|
||||||
|
"ui.linenr.selected" = { fg = "foreground" }
|
||||||
|
"ui.menu" = { fg = "foreground", bg = "background_dark" }
|
||||||
|
"ui.menu.selected" = { fg = "cyan", bg = "background_dark" }
|
||||||
|
"ui.popup" = { fg = "foreground", bg = "background_dark" }
|
||||||
|
"ui.selection" = { fg = "background", bg = "purple", modifiers = ["dim"] }
|
||||||
|
"ui.selection.primary" = { bg = "background_light" }
|
||||||
|
"ui.cursorline" = { bg = "background_dark" }
|
||||||
|
"ui.statusline" = { fg = "foreground", bg = "background_dark" }
|
||||||
|
"ui.statusline.inactive" = { fg = "comment", bg = "background_dark" }
|
||||||
|
"ui.statusline.normal" = { fg = "background_dark", bg = "cyan" }
|
||||||
|
"ui.statusline.insert" = { fg = "background_dark", bg = "green" }
|
||||||
|
"ui.statusline.select" = { fg = "background_dark", bg = "purple" }
|
||||||
|
"ui.text" = { fg = "foreground" }
|
||||||
|
"ui.text.focus" = { fg = "cyan" }
|
||||||
|
"ui.window" = { fg = "foreground" }
|
||||||
|
"ui.virtual.ruler" = { bg = "background_dark" }
|
||||||
|
|
||||||
|
"error" = { fg = "red" }
|
||||||
|
"warning" = { fg = "cyan" }
|
||||||
|
|
||||||
|
"markup.heading" = { fg = "purple", modifiers = ["bold"] }
|
||||||
|
"markup.list" = "cyan"
|
||||||
|
"markup.bold" = { fg = "orange", modifiers = ["bold"] }
|
||||||
|
"markup.italic" = { fg = "yellow", modifiers = ["italic"] }
|
||||||
|
"markup.strikethrough" = { modifiers = ["crossed_out"] }
|
||||||
|
"markup.link.url" = "cyan"
|
||||||
|
"markup.link.text" = "pink"
|
||||||
|
"markup.quote" = { fg = "yellow", modifiers = ["italic"] }
|
||||||
|
"markup.raw" = { fg = "foreground" }
|
||||||
|
|
||||||
|
"diagnostic.warning" = { underline = { color = "#cca700", style = "curl" } }
|
||||||
|
"diagnostic.error" = { underline = { color = "#f48771", style = "curl" } }
|
||||||
|
"diagnostic.info" = { underline = { color = "#75beff", style = "curl" } }
|
||||||
|
"diagnostic.hint" = { underline = { color = "#eeeeeb3", style = "curl" } }
|
||||||
|
|
||||||
|
[palette]
|
||||||
|
background = "#0e1419"
|
||||||
|
background_dark = "#21222c"
|
||||||
|
background_light = "#403090"# "#41424c"
|
||||||
|
foreground = "#f8f8f2"
|
||||||
|
comment = "#6272a4"
|
||||||
|
red = "#ff5555"
|
||||||
|
orange = "#ffb86c"
|
||||||
|
yellow = "#f1fa8c"
|
||||||
|
green = "#50fa7b"
|
||||||
|
purple = "#bd93f9"
|
||||||
|
cyan = "#8be9fd"
|
||||||
|
pink = "#ff79c6"
|
||||||
159
assets/helix/themes/yo_dracula.toml
Normal file
159
assets/helix/themes/yo_dracula.toml
Normal file
|
|
@ -0,0 +1,159 @@
|
||||||
|
# Author : Sebastian Zivota <loewenheim@mailbox.org>
|
||||||
|
# Author : Chirikumbrah
|
||||||
|
|
||||||
|
"annotation" = { fg = "foreground" }
|
||||||
|
|
||||||
|
"attribute" = { fg = "green", modifiers = ["italic"] }
|
||||||
|
|
||||||
|
"comment" = { fg = "comment" }
|
||||||
|
"comment.block" = { fg = "comment" }
|
||||||
|
"comment.block.documentation" = { fg = "comment" }
|
||||||
|
"comment.line" = { fg = "comment" }
|
||||||
|
"comment.line.documentation" = { fg = "comment" }
|
||||||
|
|
||||||
|
"constant" = { fg = "purple" }
|
||||||
|
"constant.builtin" = { fg = "purple" }
|
||||||
|
"constant.builtin.boolean" = { fg = "purple" }
|
||||||
|
"constant.character" = { fg = "cyan" }
|
||||||
|
"constant.character.escape" = { fg = "pink" }
|
||||||
|
"constant.macro" = { fg = "purple" }
|
||||||
|
"constant.numeric" = { fg = "purple" }
|
||||||
|
"constructor" = { fg = "purple" }
|
||||||
|
|
||||||
|
"definition" = { underline = { color = "cyan" } }
|
||||||
|
|
||||||
|
"diagnostic" = { underline = { color = "orange", style = "curl" } }
|
||||||
|
"diagnostic.hint" = { underline = { color = "purple", style = "curl" } }
|
||||||
|
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
|
||||||
|
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
|
||||||
|
"diagnostic.info" = { underline = { color = "cyan", style = "curl" } }
|
||||||
|
"diagnostic.unnecessary" = { modifiers = ["dim"] }
|
||||||
|
"diagnostic.deprecated" = { modifiers = ["crossed_out"] }
|
||||||
|
|
||||||
|
"error" = { fg = "red" }
|
||||||
|
"hint" = { fg = "purple" }
|
||||||
|
"info" = { fg = "cyan" }
|
||||||
|
"warning" = { fg = "yellow" }
|
||||||
|
|
||||||
|
"diff.delta" = { fg = "orange" }
|
||||||
|
"diff.minus" = { fg = "red" }
|
||||||
|
"diff.plus" = { fg = "green" }
|
||||||
|
|
||||||
|
# d
|
||||||
|
"function" = { fg = "purple" }
|
||||||
|
"function.builtin" = { fg = "purple" }
|
||||||
|
"function.call" = { fg = "purple" }
|
||||||
|
"function.macro" = { fg = "purple" }
|
||||||
|
"function.method" = { fg = "purple" }
|
||||||
|
|
||||||
|
"keyword" = { fg = "cyan" }
|
||||||
|
#"keyword.control.conditional" = { fg = "pink" }
|
||||||
|
#"keyword.control.exception" = { fg = "purple" }
|
||||||
|
#"keyword.control.import" = { fg = "pink" }
|
||||||
|
#"keyword.control.repeat" = { fg = "pink" }
|
||||||
|
#"keyword.directive" = { fg = "green" }
|
||||||
|
#"keyword.function" = { fg = "pink" }
|
||||||
|
#"keyword.operator" = { fg = "pink" }
|
||||||
|
#"keyword.return" = { fg = "pink" }
|
||||||
|
#"keyword.storage" = { fg = "pink" }
|
||||||
|
#"keyword.storage.modifier" = { fg = "pink" }
|
||||||
|
#"keyword.storage.type" = { fg = "cyan", modifiers = ["italic"] }
|
||||||
|
|
||||||
|
"label" = { fg = "cyan" }
|
||||||
|
|
||||||
|
"markup.bold" = { fg = "orange", modifiers = ["bold"] }
|
||||||
|
"markup.heading" = { fg = "purple", modifiers = ["bold"] }
|
||||||
|
"markup.italic" = { fg = "yellow", modifiers = ["italic"] }
|
||||||
|
"markup.link.text" = { fg = "pink" }
|
||||||
|
"markup.link.url" = { fg = "cyan" }
|
||||||
|
"markup.list" = { fg = "cyan" }
|
||||||
|
"markup.quote" = { fg = "yellow", modifiers = ["italic"] }
|
||||||
|
"markup.raw" = { fg = "foreground" }
|
||||||
|
"markup.strikethrough" = { modifiers = ["crossed_out"] }
|
||||||
|
|
||||||
|
"punctuation" = { fg = "foreground" }
|
||||||
|
"punctuation.bracket" = { fg = "foreground" }
|
||||||
|
"punctuation.delimiter" = { fg = "foreground" }
|
||||||
|
"punctuation.special" = { fg = "pink" }
|
||||||
|
|
||||||
|
"special" = { fg = "pink" }
|
||||||
|
|
||||||
|
"string" = { fg = "yellow" }
|
||||||
|
"string.regexp" = { fg = "red" }
|
||||||
|
"string.special" = { fg = "orange" }
|
||||||
|
"string.symbol" = { fg = "yellow" }
|
||||||
|
|
||||||
|
"tag" = { fg = "pink" }
|
||||||
|
"tag.attribute" = { fg = "purple" }
|
||||||
|
"tag.delimiter" = { fg = "foreground" }
|
||||||
|
|
||||||
|
# "type" = { fg = "cyan", modifiers = ["italic"] }
|
||||||
|
# "type.builtin" = { fg = "cyan" }
|
||||||
|
"type.enum.variant" = { fg = "foreground", modifiers = ["italic"] }
|
||||||
|
|
||||||
|
"ui.background" = { fg = "foreground", bg = "background" }
|
||||||
|
"ui.cursor" = { fg = "background", bg = "purple", modifiers = ["dim"] }
|
||||||
|
"ui.cursor.insert" = { fg = "background", bg = "green", modifiers = ["dim"] }
|
||||||
|
"ui.cursor.match" = { fg = "foreground", bg = "grey" }
|
||||||
|
"ui.cursor.normal" = { fg = "background", bg = "purple", modifiers = ["dim"] }
|
||||||
|
"ui.cursor.primary.insert" = { fg = "background", bg = "green" }
|
||||||
|
"ui.cursor.primary.normal" = { fg = "background", bg = "purple" }
|
||||||
|
"ui.cursor.primary.select" = { fg = "background", bg = "cyan" }
|
||||||
|
"ui.cursor.select" = { fg = "background", bg = "cyan", modifiers = ["dim"] }
|
||||||
|
"ui.cursorline.primary" = { bg = "cursorline" }
|
||||||
|
"ui.debug" = { fg = "red" }
|
||||||
|
"ui.help" = { fg = "foreground", bg = "black" }
|
||||||
|
"ui.highlight.frameline" = { fg = "background", bg = "red" }
|
||||||
|
"ui.linenr" = { fg = "line_numbers" }
|
||||||
|
"ui.linenr.selected" = { fg = "foreground" }
|
||||||
|
"ui.menu" = { fg = "foreground", bg = "current_line" }
|
||||||
|
"ui.menu.scroll" = { fg = "foreground", bg = "current_line" }
|
||||||
|
"ui.menu.selected" = { fg = "current_line", bg = "purple", modifiers = ["dim"] }
|
||||||
|
"ui.popup" = { fg = "foreground", bg = "black" }
|
||||||
|
"ui.selection" = { bg = "selection" }
|
||||||
|
"ui.selection.primary" = { bg = "current_line" }
|
||||||
|
"ui.statusline" = { fg = "foreground", bg = "darker" }
|
||||||
|
"ui.statusline.inactive" = { fg = "comment", bg = "darker" }
|
||||||
|
"ui.statusline.insert" = { fg = "black", bg = "green", modifiers = ["bold"] }
|
||||||
|
"ui.statusline.normal" = { fg = "black", bg = "purple", modifiers = ["bold"] }
|
||||||
|
"ui.statusline.select" = { fg = "black", bg = "cyan", modifiers = ["bold"] }
|
||||||
|
"ui.text" = { fg = "foreground" }
|
||||||
|
"ui.text.focus" = { fg = "cyan" }
|
||||||
|
"ui.text.directory" = { fg = "cyan" }
|
||||||
|
"ui.virtual.indent-guide" = { fg = "indent" }
|
||||||
|
"ui.virtual.inlay-hint" = { fg = "cyan" }
|
||||||
|
"ui.virtual.inlay-hint.parameter" = { fg = "cyan", modifiers = ["italic", "dim"] }
|
||||||
|
"ui.virtual.inlay-hint.type" = { fg = "cyan", modifiers = ["italic", "dim"] }
|
||||||
|
"ui.virtual.jump-label" = { fg = "pink", modifiers = ["bold"] }
|
||||||
|
"ui.virtual.ruler" = { bg = "black" }
|
||||||
|
"ui.virtual.whitespace" = { fg = "whitespace" }
|
||||||
|
"ui.virtual.wrap" = { fg = "current_line" }
|
||||||
|
"ui.window" = { fg = "foreground" }
|
||||||
|
|
||||||
|
"variable" = { fg = "foreground" }
|
||||||
|
"variable.builtin" = { fg = "purple", modifiers = ["italic"] }
|
||||||
|
"variable.other" = { fg = "foreground" }
|
||||||
|
"variable.other.member" = { fg = "foreground" }
|
||||||
|
"variable.parameter" = { fg = "foreground", modifiers = ["italic"] }
|
||||||
|
|
||||||
|
|
||||||
|
[palette]
|
||||||
|
background = "#242634"
|
||||||
|
black = "#191A21"
|
||||||
|
line_numbers = "#6272A4"
|
||||||
|
comment = "#ff4477"
|
||||||
|
current_line = "#44475a"
|
||||||
|
cursorline = "#2d303e"
|
||||||
|
cyan = "#8be9fd"
|
||||||
|
darker = "#222430"
|
||||||
|
foreground = "#eeeeee"
|
||||||
|
green = "#50fa7b"
|
||||||
|
grey = "#666771"
|
||||||
|
indent = "#56596a"
|
||||||
|
orange = "#ffb86c"
|
||||||
|
pink = "#ff79c6"
|
||||||
|
purple = "#BD93F9"
|
||||||
|
red = "#ff5555"
|
||||||
|
selection = "#363848"
|
||||||
|
whitespace = "#586693"
|
||||||
|
yellow = "#f1fa8c"
|
||||||
15
assets/jj/config.toml
Normal file
15
assets/jj/config.toml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#:schema https://jj-vcs.github.io/jj/latest/config-schema.json
|
||||||
|
|
||||||
|
[user]
|
||||||
|
email = "{{ VCS_EMAIL }}"
|
||||||
|
name = "{{ VCS_NAME }}"
|
||||||
|
|
||||||
|
[ui]
|
||||||
|
editor = "hx"
|
||||||
|
default-command = "status"
|
||||||
|
|
||||||
|
[[--scope]]
|
||||||
|
--when.commands = ["diff", "show"]
|
||||||
|
[--scope.ui]
|
||||||
|
pager = "delta"
|
||||||
|
diff-formatter = ":git"
|
||||||
13
assets/mise/config.toml
Normal file
13
assets/mise/config.toml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
[tools]
|
||||||
|
helix = "latest"
|
||||||
|
jujutsu = "latest"
|
||||||
|
lazygit = "latest"
|
||||||
|
|
||||||
|
rust = { version = "stable", components = "rust-analyzer,rust-docs,rustfmt,clippy" }
|
||||||
|
"cargo:cargo-binstall" = "latest"
|
||||||
|
|
||||||
|
deno = "latest"
|
||||||
|
|
||||||
|
uv = "latest"
|
||||||
|
"pipx:pyright" = "latest"
|
||||||
|
"pipx:ruff" = "latest"
|
||||||
49
build-image.fish
Normal file
49
build-image.fish
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
# Build script for the devcontainer image.
|
||||||
|
|
||||||
|
set -f DEFAULT_TAG 'devbox:questing'
|
||||||
|
set -f DEFAULT_BASE 'ubuntu:25.10'
|
||||||
|
set -f DEFAULT_USERNAME brent
|
||||||
|
set -f DEFAULT_FULL_NAME 'Brent Schroeter'
|
||||||
|
|
||||||
|
argparse -S 'b/base=' 't/tag=' 'u/username=' 'email=' 'full-name=' no-cache -- $argv
|
||||||
|
or return 1
|
||||||
|
|
||||||
|
if not set -ql _flag_tag
|
||||||
|
set -f _flag_tag "$DEFAULT_TAG"
|
||||||
|
end
|
||||||
|
if not set -ql _flag_base
|
||||||
|
set -f _flag_base "$DEFAULT_BASE"
|
||||||
|
end
|
||||||
|
if not set -ql _flag_username
|
||||||
|
set -f _flag_username "$DEFAULT_USERNAME"
|
||||||
|
end
|
||||||
|
if not set -ql _flag_full_name
|
||||||
|
set -f _flag_full_name "$DEFAULT_FULL_NAME"
|
||||||
|
end
|
||||||
|
if not set -ql _flag_email
|
||||||
|
echo '--email is required for VCS configuration' >&2
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
|
||||||
|
echo "Build configuration:"
|
||||||
|
echo " base = $_flag_base"
|
||||||
|
echo " tag = $_flag_tag"
|
||||||
|
echo " username = $_flag_username"
|
||||||
|
echo " email = $_flag_email"
|
||||||
|
echo " full_name = $_flag_full_name"
|
||||||
|
|
||||||
|
if set -ql _flag_no_cache
|
||||||
|
container build --no-cache -t "$_flag_tag" \
|
||||||
|
--build-arg "BASE_IMAGE=$_flag_base" \
|
||||||
|
--build-arg "USERNAME=$_flag_username" \
|
||||||
|
--build-arg "VCS_EMAIL=$_flag_email" \
|
||||||
|
--build-arg "VCS_NAME=$_flag_full_name" \
|
||||||
|
.
|
||||||
|
else
|
||||||
|
container build -t "$_flag_tag" \
|
||||||
|
--build-arg "BASE_IMAGE=$_flag_base" \
|
||||||
|
--build-arg "USERNAME=$_flag_username" \
|
||||||
|
--build-arg "VCS_EMAIL=$_flag_email" \
|
||||||
|
--build-arg "VCS_NAME=$_flag_full_name" \
|
||||||
|
.
|
||||||
|
end
|
||||||
34
devbox.fish
Normal file
34
devbox.fish
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
# Fish utility for easily shelling into devcontainers on the host.
|
||||||
|
# Uses Apple's `container` CLI (`brew install container`).
|
||||||
|
|
||||||
|
function devbox --argument-names name
|
||||||
|
argparse 'c/cpus=?' 'm/mem=?' 'i/image=?' h/help -- $argv
|
||||||
|
or return 1
|
||||||
|
|
||||||
|
if set -ql _flag_h
|
||||||
|
echo "Usage: devbox [-c | --cpus=COUNT] [-m | --mem=LIMIT] [-i | --image=IMAGE] [-h | --help] NAME" >&2
|
||||||
|
echo " Starts and executes a new shell session in a devcontainer with given name." >&2
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if not set -ql _flag_cpus
|
||||||
|
set -f _flag_cpus 10
|
||||||
|
end
|
||||||
|
if not set -ql _flag_mem
|
||||||
|
set -f _flag_mem 8G
|
||||||
|
end
|
||||||
|
if not set -ql _flag_image
|
||||||
|
set -f _flag_image 'devbox:questing'
|
||||||
|
end
|
||||||
|
|
||||||
|
if [ "$(container ls -a --format=json | jq '[.[] | select(.configuration.id == "'"$name"'")] | length')" = 0 ]
|
||||||
|
container run --name "$name" -it -c "$_flag_cpus" -m "$_flag_mem" -v "$(pwd):/home/brent/project" -w /home/brent/project "$_flag_image"
|
||||||
|
else
|
||||||
|
if [ "$(container ls -a --format=json | jq -r '.[] | select(.configuration.id == "'"$name"'").status')" = stopped ]
|
||||||
|
container start "$name"
|
||||||
|
end
|
||||||
|
|
||||||
|
container ls | grep "^$name\s" # Print container info
|
||||||
|
container exec -it -w /home/brent/project $name /usr/bin/fish
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Reference in a new issue