@mestreyoda/fabrica 0.1.0
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.
- package/ARCHITECTURE.md +87 -0
- package/LICENSE +21 -0
- package/README.md +289 -0
- package/defaults/AGENTS.md +150 -0
- package/defaults/HEARTBEAT.md +3 -0
- package/defaults/IDENTITY.md +6 -0
- package/defaults/SOUL.md +39 -0
- package/defaults/TOOLS.md +15 -0
- package/defaults/fabrica/prompts/architect.md +147 -0
- package/defaults/fabrica/prompts/developer.md +211 -0
- package/defaults/fabrica/prompts/reviewer.md +114 -0
- package/defaults/fabrica/prompts/security-checklist.md +58 -0
- package/defaults/fabrica/prompts/tester.md +150 -0
- package/defaults/fabrica/workflow.yaml +184 -0
- package/dist/index.js +143075 -0
- package/dist/index.js.map +7 -0
- package/dist/lib/worker.cjs +214 -0
- package/dist/worker.cjs +4754 -0
- package/fabrica.manifest.json +24 -0
- package/genesis/configs/classification-rules.json +32 -0
- package/genesis/configs/interview-templates.json +73 -0
- package/genesis/configs/labels.json +202 -0
- package/genesis/configs/triage-matrix.json +39 -0
- package/genesis/scripts/classify-idea.sh +161 -0
- package/genesis/scripts/conduct-interview.sh +199 -0
- package/genesis/scripts/create-task.sh +797 -0
- package/genesis/scripts/delivery-target-lib.sh +88 -0
- package/genesis/scripts/generate-qa-contract.sh +188 -0
- package/genesis/scripts/generate-spec.sh +171 -0
- package/genesis/scripts/genesis-telemetry.sh +97 -0
- package/genesis/scripts/genesis-utils.sh +617 -0
- package/genesis/scripts/impact-analysis.sh +135 -0
- package/genesis/scripts/interview.sh +98 -0
- package/genesis/scripts/map-project.sh +309 -0
- package/genesis/scripts/receive-idea.sh +69 -0
- package/genesis/scripts/register-project.sh +520 -0
- package/genesis/scripts/research-idea.sh +84 -0
- package/genesis/scripts/scaffold-project.sh +1396 -0
- package/genesis/scripts/security-review.sh +141 -0
- package/genesis/scripts/sideband-lib.sh +243 -0
- package/genesis/scripts/stack-detection-lib.sh +130 -0
- package/genesis/scripts/triage.sh +598 -0
- package/genesis/scripts/validate-step.sh +81 -0
- package/openclaw.plugin.json +45 -0
- package/package.json +60 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Step 4a: Conduct interview via LLM (or deterministic fallback)
|
|
5
|
+
# Input: stdin JSON (interview questions + classification + idea)
|
|
6
|
+
# Output: JSON with spec_data to stdout
|
|
7
|
+
# Uses: llm_task.invoke via lobster (requires CLAWD_URL) or fallback
|
|
8
|
+
|
|
9
|
+
GENESIS_LOG="${GENESIS_LOG:-$HOME/.openclaw/workspace/logs/genesis.log}"
|
|
10
|
+
mkdir -p "$(dirname "$GENESIS_LOG")"
|
|
11
|
+
exec 2> >(tee -a "$GENESIS_LOG" >&2)
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
|
|
15
|
+
if [[ -n "${1:-}" && -f "${1:-}" ]]; then
|
|
16
|
+
INPUT="$(cat "$1")"
|
|
17
|
+
else
|
|
18
|
+
INPUT="$(cat)"
|
|
19
|
+
fi
|
|
20
|
+
SESSION_ID="$(echo "$INPUT" | jq -r '.session_id')"
|
|
21
|
+
echo "=== $(date -Iseconds) | conduct-interview.sh | session=$SESSION_ID ===" >&2
|
|
22
|
+
IDEA="$(echo "$INPUT" | jq -r '.raw_idea // .idea // ""')"
|
|
23
|
+
TYPE="$(echo "$INPUT" | jq -r '.classification.type // "feature"')"
|
|
24
|
+
QUESTIONS="$(echo "$INPUT" | jq -c '.interview.questions // []')"
|
|
25
|
+
|
|
26
|
+
echo >&2 "[conduct-interview] session=$SESSION_ID type=$TYPE"
|
|
27
|
+
|
|
28
|
+
# Extract web research context (if available from research step)
|
|
29
|
+
RESEARCH="$(echo "$INPUT" | jq -c '.research // {}')"
|
|
30
|
+
RESEARCH_CONTEXT=""
|
|
31
|
+
if [[ "$(echo "$RESEARCH" | jq 'length')" -gt 0 ]]; then
|
|
32
|
+
TECH="$(echo "$RESEARCH" | jq -r '.technologies // [] | join(", ")')"
|
|
33
|
+
PRACTICES="$(echo "$RESEARCH" | jq -r '.best_practices // [] | join("; ")')"
|
|
34
|
+
PATTERNS="$(echo "$RESEARCH" | jq -r '.architecture_patterns // [] | join(", ")')"
|
|
35
|
+
if [[ -n "$TECH" || -n "$PRACTICES" || -n "$PATTERNS" ]]; then
|
|
36
|
+
RESEARCH_CONTEXT="
|
|
37
|
+
|
|
38
|
+
Web research findings:
|
|
39
|
+
- Technologies: $TECH
|
|
40
|
+
- Best practices: $PRACTICES
|
|
41
|
+
- Architecture patterns: $PATTERNS
|
|
42
|
+
|
|
43
|
+
Use these findings to inform your specification — recommend specific technologies and patterns where relevant."
|
|
44
|
+
echo >&2 "[conduct-interview] Injecting web research context into prompt"
|
|
45
|
+
fi
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
INTERVIEW_CONTEXT=""
|
|
49
|
+
QUESTION_LINES="$(echo "$QUESTIONS" | jq -r '
|
|
50
|
+
. as $items
|
|
51
|
+
| if ($items | length) == 0 then empty
|
|
52
|
+
else to_entries[]
|
|
53
|
+
| "- Q\(.key + 1): \(.value.question // "")"
|
|
54
|
+
end
|
|
55
|
+
')"
|
|
56
|
+
if [[ -n "$QUESTION_LINES" ]]; then
|
|
57
|
+
INTERVIEW_CONTEXT="
|
|
58
|
+
|
|
59
|
+
Interview questions selected for this request:
|
|
60
|
+
$QUESTION_LINES
|
|
61
|
+
|
|
62
|
+
Use them as the primary structure for the spec. Do not invent extra technical requirements unless clearly implied by the project idea."
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# Build a structured prompt for the LLM
|
|
66
|
+
PROMPT="You are generating a structured software project specification.
|
|
67
|
+
|
|
68
|
+
Project idea: $IDEA
|
|
69
|
+
Classification: $TYPE
|
|
70
|
+
${RESEARCH_CONTEXT}${INTERVIEW_CONTEXT}
|
|
71
|
+
|
|
72
|
+
Based on this idea, produce a complete spec with these fields:
|
|
73
|
+
- title: concise project title
|
|
74
|
+
- objective: 1-2 sentence objective
|
|
75
|
+
- scope_v1: array of V1 scope items
|
|
76
|
+
- out_of_scope: array of items explicitly excluded from V1
|
|
77
|
+
- acceptance_criteria: array of testable acceptance criteria.
|
|
78
|
+
IMPORTANT: Each criterion MUST be specific to the project domain and directly verifiable.
|
|
79
|
+
BAD examples (too generic): "Feature works as described", "Tests pass", "MVP is functional"
|
|
80
|
+
GOOD examples (domain-specific): "Counts words correctly including Unicode text", "Identifies the most frequent word", "Accepts both file path and stdin as input"
|
|
81
|
+
Derive each criterion from concrete behaviors described in the project idea. Each must describe a specific, observable behavior — not a generic quality gate.
|
|
82
|
+
- definition_of_done: array of DoD items
|
|
83
|
+
- constraints: string describing technical constraints
|
|
84
|
+
- risks: array of risk items
|
|
85
|
+
|
|
86
|
+
When requirements are missing, infer conservative defaults and include them as assumptions inside constraints/risks.
|
|
87
|
+
Return valid JSON only."
|
|
88
|
+
|
|
89
|
+
SCHEMA='{"type":"object","properties":{"title":{"type":"string"},"objective":{"type":"string"},"scope_v1":{"type":"array","items":{"type":"string"}},"out_of_scope":{"type":"array","items":{"type":"string"}},"acceptance_criteria":{"type":"array","items":{"type":"string"}},"definition_of_done":{"type":"array","items":{"type":"string"}},"constraints":{"type":"string"},"risks":{"type":"array","items":{"type":"string"}}},"required":["title","objective","scope_v1","acceptance_criteria","definition_of_done"]}'
|
|
90
|
+
|
|
91
|
+
# Try LLM via openclaw agent --local (workaround for broken llm_task.invoke)
|
|
92
|
+
LLM_RESULT=""
|
|
93
|
+
if command -v openclaw &>/dev/null; then
|
|
94
|
+
echo >&2 "[conduct-interview] Trying LLM via openclaw agent --local..."
|
|
95
|
+
LLM_RAW="$(timeout 120 openclaw agent --local \
|
|
96
|
+
-m "$(printf '%s\n\nIMPORTANT: Return ONLY valid JSON matching this schema, no markdown fences, no explanation:\n%s' "$PROMPT" "$SCHEMA")" \
|
|
97
|
+
--session-id "genesis-interview-${SESSION_ID}" \
|
|
98
|
+
--json 2>/dev/null || true)"
|
|
99
|
+
# Extract the text payload from openclaw agent response
|
|
100
|
+
if [[ -n "$LLM_RAW" ]]; then
|
|
101
|
+
LLM_TEXT="$(echo "$LLM_RAW" | jq -r '.payloads[0].text // empty' 2>/dev/null || true)"
|
|
102
|
+
# Strip markdown fences if present
|
|
103
|
+
LLM_TEXT="$(echo "$LLM_TEXT" | sed '/^```/d; /^json$/d')"
|
|
104
|
+
if [[ -n "$LLM_TEXT" ]]; then
|
|
105
|
+
LLM_RESULT="$LLM_TEXT"
|
|
106
|
+
fi
|
|
107
|
+
fi
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
# Check if LLM returned valid JSON with required fields
|
|
111
|
+
if echo "$LLM_RESULT" | jq -e '.title and .scope_v1 and (.acceptance_criteria | length > 0)' &>/dev/null 2>&1; then
|
|
112
|
+
SPEC_DATA="$(echo "$LLM_RESULT" | jq '.')"
|
|
113
|
+
echo >&2 "[conduct-interview] LLM spec generated successfully"
|
|
114
|
+
else
|
|
115
|
+
echo >&2 "[conduct-interview] LLM unavailable or failed, using type-aware deterministic fallback"
|
|
116
|
+
|
|
117
|
+
# Type-aware deterministic fallback
|
|
118
|
+
TITLE="$(echo "$IDEA" | cut -c1-80)"
|
|
119
|
+
|
|
120
|
+
case "$TYPE" in
|
|
121
|
+
feature)
|
|
122
|
+
SCOPE='["Implementação base da funcionalidade conforme descrito","Integração com fluxo existente do projeto","Interface/API funcional para o caso de uso principal"]'
|
|
123
|
+
OOS='["Integrações com terceiros não mencionados na ideia","Otimizações avançadas de performance","Internacionalização e suporte multi-idioma"]'
|
|
124
|
+
ACS='["Feature implementa o comportamento descrito na ideia","Funcionalidades principais são acessíveis e funcionam end-to-end","Usuário consegue atingir o objetivo descrito","Sem erros críticos — testes básicos passam"]'
|
|
125
|
+
DOD='["Código revisado e aprovado","Testes passando (unitários e integração)","Documentação mínima presente (README ou inline)","PR merged no branch principal"]'
|
|
126
|
+
CONSTRAINTS_TEXT="Tipo: feature. Classificação automática — validar escopo com stakeholder se necessário."
|
|
127
|
+
RISKS='["Escopo pode precisar refinamento após análise detalhada do código existente","Requisitos implícitos podem surgir durante implementação","Dependências externas podem afetar timeline"]'
|
|
128
|
+
;;
|
|
129
|
+
bugfix)
|
|
130
|
+
SCOPE='["Identificar a causa raiz do problema descrito","Implementar correção no componente afetado","Verificar que o comportamento esperado é restaurado"]'
|
|
131
|
+
OOS='["Refatoração de código adjacente não relacionado ao bug","Otimizações de performance além da correção","Novos testes de regressão para módulos não afetados"]'
|
|
132
|
+
ACS='["Bug não reproduz mais nos cenários descritos","Comportamento correto é restaurado conforme esperado","Testes de regressão existentes continuam passando","Sem efeitos colaterais em funcionalidades adjacentes"]'
|
|
133
|
+
DOD='["Código revisado e aprovado","Fix verificado manualmente e por testes automatizados","Teste de regressão adicionado para o cenário do bug","PR merged no branch principal"]'
|
|
134
|
+
CONSTRAINTS_TEXT="Tipo: bugfix. Priorizar correção mínima — evitar mudanças não relacionadas."
|
|
135
|
+
RISKS='["Causa raiz pode ser diferente do sintoma descrito","Correção pode revelar outros bugs latentes","Ambiente de reprodução pode diferir do ambiente reportado"]'
|
|
136
|
+
;;
|
|
137
|
+
refactor)
|
|
138
|
+
SCOPE='["Refatorar o módulo/componente especificado na ideia","Melhorar a métrica indicada (legibilidade, performance, manutenibilidade)","Manter compatibilidade com código consumidor"]'
|
|
139
|
+
OOS='["Mudança de comportamento ou API pública","Otimizações além do escopo da refatoração","Migração de dependências ou frameworks"]'
|
|
140
|
+
ACS='["Código refatorado segue padrões e convenções do projeto","Todos os testes existentes continuam passando sem alteração","Complexidade ou duplicação reduzida conforme objetivo","Sem mudança de comportamento observável"]'
|
|
141
|
+
DOD='["Código revisado e aprovado","Testes passando — nenhuma regressão","Métricas de qualidade melhoradas (se mensuráveis)","PR merged no branch principal"]'
|
|
142
|
+
CONSTRAINTS_TEXT="Tipo: refactor. Zero mudança de comportamento — só melhoria estrutural."
|
|
143
|
+
RISKS='["Refatoração pode revelar code smells mais profundos","Testes insuficientes podem mascarar regressões","Scope creep — tentação de melhorar além do necessário"]'
|
|
144
|
+
;;
|
|
145
|
+
research)
|
|
146
|
+
SCOPE='["Investigar a tecnologia ou abordagem proposta","Documentar achados, comparações e trade-offs","Apresentar recomendação clara e acionável"]'
|
|
147
|
+
OOS='["Implementação completa da solução recomendada","Testes extensivos em produção","Decisões que requerem input de stakeholders não disponíveis"]'
|
|
148
|
+
ACS='["Pesquisa possui escopo claro e delimitado","Pelo menos 3 alternativas investigadas com pros/cons","Achados documentados de forma estruturada","Recomendação final é acionável — próximos passos claros"]'
|
|
149
|
+
DOD='["Findings postados como comentário na issue","Task de implementação criada para a abordagem recomendada","Referências e fontes documentadas","Issue de pesquisa fechada"]'
|
|
150
|
+
CONSTRAINTS_TEXT="Tipo: research. Foco em análise — implementação é responsabilidade da task resultante."
|
|
151
|
+
RISKS='["Escopo de pesquisa pode expandir além do previsto","Informações podem estar desatualizadas","Recomendação pode precisar de validação com equipe"]'
|
|
152
|
+
;;
|
|
153
|
+
infra)
|
|
154
|
+
SCOPE='["Configurar/implantar a infraestrutura descrita","Validar funcionamento no ambiente alvo","Documentar procedimentos de manutenção"]'
|
|
155
|
+
OOS='["Suporte e monitoramento 24/7","Otimizações futuras de custo","Migração de dados legados"]'
|
|
156
|
+
ACS='["Ambiente está configurado e operacional conforme descrito","Serviços e ferramentas funcionam corretamente","Documentação de setup e manutenção presente","Rollback possível em caso de problemas"]'
|
|
157
|
+
DOD='["Infra provisionada e validada","Documentação de operação presente","Acesso configurado para equipe relevante","PR merged (se IaC) ou procedimento documentado"]'
|
|
158
|
+
CONSTRAINTS_TEXT="Tipo: infra. Garantir reversibilidade — sempre ter plano de rollback."
|
|
159
|
+
RISKS='["Configuração pode diferir entre ambientes (dev/staging/prod)","Credenciais e acessos podem não estar disponíveis","Custo pode ser diferente do estimado"]'
|
|
160
|
+
;;
|
|
161
|
+
*)
|
|
162
|
+
SCOPE='["Implementação conforme descrito na ideia"]'
|
|
163
|
+
OOS='["Funcionalidades e integrações não mencionadas"]'
|
|
164
|
+
ACS='["Sistema funciona conforme descrito na ideia","Testes passam"]'
|
|
165
|
+
DOD='["Código revisado e aprovado","Testes passando","PR merged"]'
|
|
166
|
+
CONSTRAINTS_TEXT="Tipo: $TYPE."
|
|
167
|
+
RISKS='["Escopo pode precisar refinamento"]'
|
|
168
|
+
;;
|
|
169
|
+
esac
|
|
170
|
+
|
|
171
|
+
SPEC_DATA="$(jq -n \
|
|
172
|
+
--arg title "$TITLE" \
|
|
173
|
+
--arg objective "$IDEA" \
|
|
174
|
+
--argjson scope "$SCOPE" \
|
|
175
|
+
--argjson oos "$OOS" \
|
|
176
|
+
--argjson acs "$ACS" \
|
|
177
|
+
--argjson dod "$DOD" \
|
|
178
|
+
--arg constraints "$CONSTRAINTS_TEXT" \
|
|
179
|
+
--argjson risks "$RISKS" \
|
|
180
|
+
'{
|
|
181
|
+
title: $title,
|
|
182
|
+
objective: $objective,
|
|
183
|
+
scope_v1: $scope,
|
|
184
|
+
out_of_scope: $oos,
|
|
185
|
+
acceptance_criteria: $acs,
|
|
186
|
+
definition_of_done: $dod,
|
|
187
|
+
constraints: $constraints,
|
|
188
|
+
risks: $risks
|
|
189
|
+
}')"
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
# Output merged session state with spec_data
|
|
193
|
+
echo "$INPUT" | jq \
|
|
194
|
+
--argjson spec_data "$SPEC_DATA" \
|
|
195
|
+
'. + {
|
|
196
|
+
step: "interview_complete",
|
|
197
|
+
spec_data: $spec_data,
|
|
198
|
+
interview: ((.interview // {}) + {spec_data: $spec_data})
|
|
199
|
+
}'
|