-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflake.nix
More file actions
138 lines (125 loc) · 4.02 KB
/
flake.nix
File metadata and controls
138 lines (125 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
{
description = "StackOne AI Python SDK development environment";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
git-hooks.url = "github:cachix/git-hooks.nix";
treefmt-nix.url = "github:numtide/treefmt-nix";
};
outputs =
inputs@{
flake-parts,
git-hooks,
treefmt-nix,
...
}:
flake-parts.lib.mkFlake { inherit inputs; } {
systems = [
"x86_64-linux"
"aarch64-linux"
"aarch64-darwin"
];
imports = [
git-hooks.flakeModule
treefmt-nix.flakeModule
];
perSystem =
{
config,
pkgs,
...
}:
{
# Treefmt configuration for formatting
treefmt = {
projectRootFile = "flake.nix";
programs = {
nixfmt.enable = true;
nixfmt.package = pkgs.nixfmt-rfc-style;
ruff-check.enable = true;
ruff-format.enable = true;
};
settings.formatter.oxfmt = {
command = "${pkgs.oxfmt}/bin/oxfmt";
includes = [
"*.md"
"*.yml"
"*.yaml"
"*.json"
"*.ts"
"*.tsx"
"*.js"
"*.jsx"
"*.html"
"*.css"
];
excludes = [
"CHANGELOG.md"
];
};
};
# Git hooks configuration
pre-commit = {
check.enable = false; # Skip check in flake (ty needs Python env)
settings.hooks = {
gitleaks = {
enable = true;
name = "gitleaks";
entry = "${pkgs.gitleaks}/bin/gitleaks protect --staged --config .gitleaks.toml";
language = "system";
pass_filenames = false;
};
treefmt = {
enable = true;
package = config.treefmt.build.wrapper;
};
ty = {
enable = true;
name = "ty";
entry = "${pkgs.ty}/bin/ty check";
files = "^stackone_ai/";
language = "system";
types = [ "python" ];
};
};
};
devShells.default = pkgs.mkShellNoCC {
buildInputs = with pkgs; [
uv
ty
just
nixfmt-rfc-style
# security
gitleaks
# Node.js for MCP mock server
bun
pnpm_10
typescript-go
];
shellHook = ''
echo "StackOne AI Python SDK development environment"
# Initialize git submodules if not already done
if [ -f .gitmodules ] && [ ! -f vendor/stackone-ai-node/package.json ]; then
echo "📦 Initializing git submodules..."
git submodule update --init --recursive
fi
# Install Python dependencies only if .venv is missing or uv.lock is newer
if [ ! -d .venv ] || [ uv.lock -nt .venv ]; then
echo "📦 Installing Python dependencies..."
uv sync --all-extras
fi
# Install Node.js dependencies for MCP mock server (used in tests)
if [ -f vendor/stackone-ai-node/package.json ]; then
if [ ! -f vendor/stackone-ai-node/node_modules/.pnpm/lock.yaml ] || \
[ vendor/stackone-ai-node/pnpm-lock.yaml -nt vendor/stackone-ai-node/node_modules/.pnpm/lock.yaml ]; then
echo "📦 Installing MCP mock server dependencies..."
(cd vendor/stackone-ai-node && pnpm install --frozen-lockfile)
fi
fi
# Install git hooks
${config.pre-commit.installationScript}
'';
};
};
};
}