drydock-cli 3.0.116__tar.gz → 3.0.117__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {drydock_cli-3.0.116/drydock_cli.egg-info → drydock_cli-3.0.117}/PKG-INFO +1 -1
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/recipes.py +113 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117/drydock_cli.egg-info}/PKG-INFO +1 -1
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/pyproject.toml +1 -1
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/LICENSE +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/NOTICE +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/README.md +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/__init__.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/__main__.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/advisor.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/agent.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/builtin_skills/__init__.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/builtin_skills/rmf-categorize.md +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/builtin_skills/rmf-control.md +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/builtin_skills/rmf-poam.md +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/builtin_skills/rmf-review.md +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/builtin_skills/stig-assess.md +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/builtin_skills/stig-remediate.md +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/cci.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/cli.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/compaction.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/config.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/detect.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/extract.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/gittools.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/graphrag.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/guards.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/loop_detect.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/mcp.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/poam.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/providers.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/rmf.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/rmf_graph.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/skills.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/stig.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/tools/__init__.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/tui/app.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/tui/widgets.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/tuning.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock/web.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock_cli.egg-info/SOURCES.txt +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/setup.cfg +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_advisor.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_approval.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_back_command.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_background.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_binary_output.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_crossplatform.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_output_bounding.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_process_group.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_sanitize.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_shell.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_stdin.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_stop_partial.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_timeout_network.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_bash_timeout_param.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_cci.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_compact_command.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_compaction.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_config.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_config_migration.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_context_limit_config.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_detect.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_dispatch.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_e2e_connected.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_edit_replace_all.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_extract.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_failure_loop.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_gittools.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_glob_edit_edges.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_graphify_example.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_graphrag.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_graphrag_quoted_path.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_grep_and_read_robust.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_loop_detect.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_mcp.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_oneshot_unreachable.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_overthink_interrupt.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_poam.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_read_index.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_recipes.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_repetition_interrupt.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_rmf.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_rmf_graph.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_rmf_stig_graph.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_runaway_repetition.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_screenshot.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_server_probe.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_skills.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_stall_retry.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_stig.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_stop.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_subagent.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_system_prompt_help.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_todo.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_tool_arg_coercion.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_tool_arg_coercion_more.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_tool_arg_parsing.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_tui.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_tuning.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_viewimage.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_vision_input.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_web_tools.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_windows_shell.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_write_content_coerce.py +0 -0
- {drydock_cli-3.0.116 → drydock_cli-3.0.117}/tests/test_xccdf.py +0 -0
|
@@ -132,6 +132,119 @@ RECIPES: list[tuple[str, list[str], str]] = [
|
|
|
132
132
|
" log f from tangent lines at support points; sample from the hull's exp, accept/\n"
|
|
133
133
|
" reject, and ADD each rejected point to the hull so it tightens over time.\n"
|
|
134
134
|
"Seed the RNG for reproducibility and validate the sample mean/var against f."),
|
|
135
|
+
|
|
136
|
+
("Classification metrics — accuracy, precision, recall, F1, MCC, ROC/AUC, confusion matrix",
|
|
137
|
+
["metric", "metrics", "accuracy", "precision", "recall", "f1", "mcc", "roc",
|
|
138
|
+
"auc", "confusion", "tp", "fp", "fn", "tn", "classification", "eval",
|
|
139
|
+
"evaluate", "score", "true", "positive", "negative"],
|
|
140
|
+
"Given y_true and y_pred (and y_score = P(positive) for ROC):\n"
|
|
141
|
+
" from sklearn.metrics import (accuracy_score, precision_score, recall_score,\n"
|
|
142
|
+
" f1_score, matthews_corrcoef, roc_auc_score, roc_curve, confusion_matrix)\n"
|
|
143
|
+
" acc=accuracy_score(y_true,y_pred); f1=f1_score(y_true,y_pred)\n"
|
|
144
|
+
" prec=precision_score(y_true,y_pred); rec=recall_score(y_true,y_pred)\n"
|
|
145
|
+
" mcc=matthews_corrcoef(y_true,y_pred); auc=roc_auc_score(y_true,y_score)\n"
|
|
146
|
+
" tn,fp,fn,tp = confusion_matrix(y_true,y_pred).ravel() # BINARY order!\n"
|
|
147
|
+
" fpr,tpr,thr = roc_curve(y_true,y_score) # plot tpr vs fpr; AUC=area\n"
|
|
148
|
+
"Definitions: precision=TP/(TP+FP), recall=TP/(TP+FN), F1=2PR/(P+R),\n"
|
|
149
|
+
"MCC=(TP*TN-FP*FN)/sqrt((TP+FP)(TP+FN)(TN+FP)(TN+FN)). Multiclass: pass\n"
|
|
150
|
+
"average='macro'/'weighted'. Save metrics as JSON; plot ROC with matplotlib\n"
|
|
151
|
+
"(plt.plot(fpr,tpr); savefig). Watch class order and the positive label."),
|
|
152
|
+
|
|
153
|
+
("PyTorch training / eval loop (correct structure)",
|
|
154
|
+
["pytorch", "torch", "train", "training", "model", "loss", "optimizer",
|
|
155
|
+
"epoch", "cnn", "network", "nn", "fit", "gpu", "cuda", "dataloader"],
|
|
156
|
+
" import torch, torch.nn as nn\n"
|
|
157
|
+
" dev = 'cuda' if torch.cuda.is_available() else 'cpu'; model.to(dev)\n"
|
|
158
|
+
" opt = torch.optim.AdamW(model.parameters(), lr=1e-3)\n"
|
|
159
|
+
" loss_fn = nn.CrossEntropyLoss() # expects raw logits + int class targets\n"
|
|
160
|
+
" for epoch in range(E):\n"
|
|
161
|
+
" model.train()\n"
|
|
162
|
+
" for xb,yb in train_loader:\n"
|
|
163
|
+
" xb,yb = xb.to(dev), yb.to(dev)\n"
|
|
164
|
+
" opt.zero_grad(); out = model(xb); loss = loss_fn(out, yb)\n"
|
|
165
|
+
" loss.backward(); opt.step()\n"
|
|
166
|
+
" model.eval()\n"
|
|
167
|
+
" with torch.no_grad(): ... # compute val metric, no grad\n"
|
|
168
|
+
"Gotchas: zero_grad EVERY step; CrossEntropyLoss takes logits (no softmax);\n"
|
|
169
|
+
"targets are Long class indices; move BOTH model and batch to the same device;\n"
|
|
170
|
+
"set model.eval() (disables dropout/BN update) for validation. Seed torch for repro."),
|
|
171
|
+
|
|
172
|
+
("LoRA / full fine-tuning with transformers + peft",
|
|
173
|
+
["lora", "peft", "finetune", "fine-tune", "fine", "tuning", "adapter",
|
|
174
|
+
"transformers", "pretrained", "huggingface", "bert", "gpt", "vit", "freeze"],
|
|
175
|
+
"FULL fine-tune: load a pretrained model, train ALL params on your data with a\n"
|
|
176
|
+
"small LR (2e-5..5e-5), AdamW, a few epochs; save with model.save_pretrained(dir).\n"
|
|
177
|
+
"LoRA (train ~0.1% of params): \n"
|
|
178
|
+
" from peft import LoraConfig, get_peft_model, TaskType\n"
|
|
179
|
+
" cfg = LoraConfig(r=8, lora_alpha=16, lora_dropout=0.05,\n"
|
|
180
|
+
" target_modules=['q_proj','v_proj'], task_type=TaskType.SEQ_CLS)\n"
|
|
181
|
+
" model = get_peft_model(base_model, cfg)\n"
|
|
182
|
+
" model.print_trainable_parameters() # sanity: only adapters train\n"
|
|
183
|
+
" ... train ... ; model.save_pretrained('adapter')\n"
|
|
184
|
+
"Reload: PeftModel.from_pretrained(base, 'adapter'). target_modules names differ\n"
|
|
185
|
+
"per architecture — inspect model.named_modules() to find the linear layers."),
|
|
186
|
+
|
|
187
|
+
("Prepare / organize / split a dataset",
|
|
188
|
+
["data", "dataset", "prep", "prepare", "organize", "split", "train", "val",
|
|
189
|
+
"test", "normalize", "preprocess", "balance", "stratify", "label", "clean"],
|
|
190
|
+
" from sklearn.model_selection import train_test_split\n"
|
|
191
|
+
" Xtr,Xtmp,ytr,ytmp = train_test_split(X,y,test_size=0.3,stratify=y,random_state=0)\n"
|
|
192
|
+
" Xval,Xte,yval,yte = train_test_split(Xtmp,ytmp,test_size=0.5,stratify=ytmp,random_state=0)\n"
|
|
193
|
+
"Normalize features on TRAIN ONLY, then apply to val/test (no leakage):\n"
|
|
194
|
+
" from sklearn.preprocessing import StandardScaler\n"
|
|
195
|
+
" sc=StandardScaler().fit(Xtr); Xtr=sc.transform(Xtr); Xte=sc.transform(Xte)\n"
|
|
196
|
+
"Images: resize + ToTensor + Normalize(mean,std). Keep a fixed split (seed) and\n"
|
|
197
|
+
"check class balance (np.bincount(y)). Never fit scalers/encoders on test data."),
|
|
198
|
+
|
|
199
|
+
("Read/write HDF5 (.h5) and convert to/from JSON",
|
|
200
|
+
["h5", "hdf5", "h5py", "json", "convert", "dataset", "array", "save", "load",
|
|
201
|
+
"file", "format", "serialize"],
|
|
202
|
+
" import h5py, numpy as np, json\n"
|
|
203
|
+
" with h5py.File('data.h5','r') as f:\n"
|
|
204
|
+
" print(list(f.keys())); arr = f['images'][:]; labels = f['labels'][:]\n"
|
|
205
|
+
" attrs = dict(f['images'].attrs) # metadata\n"
|
|
206
|
+
" with h5py.File('out.h5','w') as f:\n"
|
|
207
|
+
" f.create_dataset('images', data=arr, compression='gzip')\n"
|
|
208
|
+
"H5<->JSON: arrays aren't JSON-native — use arr.tolist() to dump, np.array to\n"
|
|
209
|
+
"reload. json.dump({'shape':list(arr.shape),'data':arr.tolist()}, open('x.json','w')).\n"
|
|
210
|
+
"For big arrays keep them in H5 and put only metadata/paths in JSON."),
|
|
211
|
+
|
|
212
|
+
("Implement a Transformer block / ViT",
|
|
213
|
+
["transformer", "attention", "vit", "vision", "encoder", "block", "self-attention",
|
|
214
|
+
"multihead", "patch", "embedding", "positional", "layernorm"],
|
|
215
|
+
"Transformer encoder block (pre-norm):\n"
|
|
216
|
+
" attn = nn.MultiheadAttention(d, heads, batch_first=True)\n"
|
|
217
|
+
" x = x + attn(ln1(x), ln1(x), ln1(x))[0] # residual\n"
|
|
218
|
+
" x = x + mlp(ln2(x)) # mlp: Linear(d,4d)->GELU->Linear(4d,d)\n"
|
|
219
|
+
"ViT: split image into patches (Conv2d(kernel=stride=patch) -> flatten), prepend a\n"
|
|
220
|
+
"learnable [CLS] token, ADD positional embeddings, run N encoder blocks, classify\n"
|
|
221
|
+
"from the CLS token. Shapes: (B,C,H,W)->(B, num_patches+1, d). Verify a forward\n"
|
|
222
|
+
"pass runs and output is (B, num_classes); check grads flow (loss.backward())."),
|
|
223
|
+
|
|
224
|
+
("Diagnose a broken PyTorch training run",
|
|
225
|
+
["debug", "diagnose", "nan", "loss", "not", "learning", "overfit", "underfit",
|
|
226
|
+
"shape", "mismatch", "error", "troubleshoot", "fix", "exploding", "gradient"],
|
|
227
|
+
"- Loss is NaN/Inf: LR too high (lower it), log/sqrt of <=0, divide-by-zero, or\n"
|
|
228
|
+
" unnormalized inputs. Add torch.autograd.set_detect_anomaly(True); clip grads\n"
|
|
229
|
+
" (nn.utils.clip_grad_norm_); check for NaN in the data.\n"
|
|
230
|
+
"- Loss flat / not learning: forgot opt.zero_grad or opt.step; LR too low; wrong\n"
|
|
231
|
+
" loss (softmax before CrossEntropyLoss); labels/logits misaligned; model not in\n"
|
|
232
|
+
" train(); frozen params. Print loss each step + a param's grad norm.\n"
|
|
233
|
+
"- Shape mismatch: print .shape at each layer; CrossEntropyLoss wants logits\n"
|
|
234
|
+
" (N,C) + targets (N,) Long. - Train acc high, val low: overfitting -> augment/\n"
|
|
235
|
+
" regularize/early-stop. Always overfit a tiny batch first as a sanity check."),
|
|
236
|
+
|
|
237
|
+
("Generate a LaTeX report / results table",
|
|
238
|
+
["latex", "report", "table", "pdf", "document", "tex", "pdflatex", "figure",
|
|
239
|
+
"results", "write", "tabular", "booktabs"],
|
|
240
|
+
"Emit a compilable .tex, then build it:\n"
|
|
241
|
+
" \\documentclass{article}\\usepackage{booktabs,graphicx}\\begin{document}\n"
|
|
242
|
+
" \\begin{tabular}{lr}\\toprule Metric & Value\\\\\\midrule\n"
|
|
243
|
+
" Accuracy & 0.94\\\\ F1 & 0.92\\\\\\bottomrule\\end{tabular}\n"
|
|
244
|
+
" \\includegraphics[width=.6\\linewidth]{roc.png}\\end{document}\n"
|
|
245
|
+
"Build: pdflatex -interaction=nonstopmode report.tex (run twice for refs).\n"
|
|
246
|
+
"Escape %, _, &, # in text. pandas: df.to_latex('t.tex', index=False). Confirm\n"
|
|
247
|
+
"report.pdf exists and pdflatex exit code is 0."),
|
|
135
248
|
]
|
|
136
249
|
|
|
137
250
|
_WORD = re.compile(r"[a-z0-9.]+")
|
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
# PyPI distribution name is drydock-cli (the established install name, continued
|
|
8
8
|
# from the retired v2 fork); the import package + CLI command stay `drydock`.
|
|
9
9
|
name = "drydock-cli"
|
|
10
|
-
version = "3.0.
|
|
10
|
+
version = "3.0.117"
|
|
11
11
|
description = "Drydock — a local, provider-agnostic terminal coding agent for local LLMs"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.11"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|