Silence render-disposed spam, unbreak bundled skills, drop board wake
Three independently ugly bugs that all fed the same log flood:
* Electron's `WebFrameMain.send` writes every "Render frame was disposed"
to stderr via `console.error`. When the worker fans a second
agent-event past a reloading renderer, we produced thousands of
identical lines and stalled the main loop on stderr I/O. Added a
`mainFrame.detached` guard so the send is short-circuited before
Electron's own catch block fires, and installed a targeted filter in
`suppress-warnings.ts` (now actually imported from the entry point)
so the specific `console.error("Error sending from webFrameMain:"…)`
noise never reaches the terminal. Any other payload still surfaces.
* `dispatchAgentMessage` accepted the human-reader sentinel as a wake
target when an agent replied to `__board__` — `wakeAgentIfPossible`
then called `db.getAgent("__board__")`, threw, and the dispatcher
kept repeating on every send. Strip `HUMAN_SENDER_ID` at
`resolveMessageWakeTargets`, and keep a defense-in-depth guard in the
heartbeat so a stray caller (future automation fan-out) cannot
reintroduce the crash.
* Pi's skills loader rejects any SKILL.md whose frontmatter `name`
diverges from its parent directory. The four bundled `my-writing-style`
copies declared `name: writing-style-skill`, so every install emitted
a warning and dropped the skill. They also lived as orphan gitlinks
(mode 160000 without .gitmodules), and the global `*.md` gitignore
hid every other SKILL.md from version control. Fixed the frontmatter
to match the dir, converted the dangling submodules to plain trees,
and allowlisted `builtin-skills/**/*.md` so a fresh clone carries the
catalogue instead of silently losing it.
This commit is contained in:
1 parent
7a9a6779b0
commit
e74dafcd36
287 files changed
+59858
-10
No files matched your search
@@ -0,0 +1,141 @@
|
||||
# Terraform Infrastructure as Code
|
||||
|
||||
## AWS ECS Fargate Setup
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
aws = { source = "hashicorp/aws", version = "~> 5.0" }
|
||||
}
|
||||
backend "s3" {
|
||||
bucket = "terraform-state"
|
||||
key = "app/terraform.tfstate"
|
||||
region = "us-east-1"
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_ecs_cluster" "main" {
|
||||
name = "app-cluster"
|
||||
setting {
|
||||
name = "containerInsights"
|
||||
value = "enabled"
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_ecs_task_definition" "app" {
|
||||
family = "app"
|
||||
network_mode = "awsvpc"
|
||||
requires_compatibilities = ["FARGATE"]
|
||||
cpu = "256"
|
||||
memory = "512"
|
||||
execution_role_arn = aws_iam_role.ecs_execution.arn
|
||||
|
||||
container_definitions = jsonencode([{
|
||||
name = "app"
|
||||
image = "${var.ecr_repository}:${var.image_tag}"
|
||||
portMappings = [{ containerPort = 3000 }]
|
||||
logConfiguration = {
|
||||
logDriver = "awslogs"
|
||||
options = {
|
||||
awslogs-group = aws_cloudwatch_log_group.app.name
|
||||
awslogs-region = var.region
|
||||
awslogs-stream-prefix = "app"
|
||||
}
|
||||
}
|
||||
secrets = [
|
||||
{ name = "DATABASE_URL", valueFrom = aws_ssm_parameter.db_url.arn }
|
||||
]
|
||||
}])
|
||||
}
|
||||
|
||||
resource "aws_ecs_service" "app" {
|
||||
name = "app"
|
||||
cluster = aws_ecs_cluster.main.id
|
||||
task_definition = aws_ecs_task_definition.app.arn
|
||||
desired_count = 2
|
||||
launch_type = "FARGATE"
|
||||
|
||||
network_configuration {
|
||||
subnets = var.private_subnets
|
||||
security_groups = [aws_security_group.app.id]
|
||||
}
|
||||
|
||||
load_balancer {
|
||||
target_group_arn = aws_lb_target_group.app.arn
|
||||
container_name = "app"
|
||||
container_port = 3000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## AWS RDS PostgreSQL
|
||||
|
||||
```hcl
|
||||
resource "aws_db_instance" "postgres" {
|
||||
identifier = "app-db"
|
||||
engine = "postgres"
|
||||
engine_version = "16.1"
|
||||
instance_class = "db.t3.micro"
|
||||
allocated_storage = 20
|
||||
storage_encrypted = true
|
||||
|
||||
db_name = "app"
|
||||
username = "admin"
|
||||
password = var.db_password
|
||||
|
||||
vpc_security_group_ids = [aws_security_group.db.id]
|
||||
db_subnet_group_name = aws_db_subnet_group.main.name
|
||||
|
||||
backup_retention_period = 7
|
||||
skip_final_snapshot = false
|
||||
final_snapshot_identifier = "app-db-final"
|
||||
|
||||
tags = { Environment = var.environment }
|
||||
}
|
||||
```
|
||||
|
||||
## Variables and Outputs
|
||||
|
||||
```hcl
|
||||
# variables.tf
|
||||
variable "environment" {
|
||||
type = string
|
||||
description = "Environment name"
|
||||
}
|
||||
|
||||
variable "region" {
|
||||
type = string
|
||||
default = "us-east-1"
|
||||
}
|
||||
|
||||
# outputs.tf
|
||||
output "ecs_cluster_arn" {
|
||||
value = aws_ecs_cluster.main.arn
|
||||
}
|
||||
|
||||
output "alb_dns_name" {
|
||||
value = aws_lb.main.dns_name
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
| Practice | Implementation |
|
||||
|----------|----------------|
|
||||
| State locking | S3 backend with DynamoDB |
|
||||
| Secrets | Use AWS Secrets Manager / SSM |
|
||||
| Modules | Reusable components |
|
||||
| Workspaces | Environment separation |
|
||||
| Tagging | Consistent resource tags |
|
||||
| Validation | `terraform validate`, `tflint` |
|
||||
|
||||
## Common Commands
|
||||
|
||||
```bash
|
||||
terraform init
|
||||
terraform plan -out=tfplan
|
||||
terraform apply tfplan
|
||||
terraform destroy
|
||||
terraform state list
|
||||
terraform import aws_instance.app i-1234567890
|
||||
```
|
||||
Reference in new issue
Block a user