@tiic-tech/openworkflow 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.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/adapters/codex/src/doctorCodexAdapter.d.ts +6 -0
  4. package/dist/adapters/codex/src/doctorCodexAdapter.js +124 -0
  5. package/dist/adapters/codex/src/doctorCodexAdapter.js.map +1 -0
  6. package/dist/adapters/codex/src/generateAgents.d.ts +2 -0
  7. package/dist/adapters/codex/src/generateAgents.js +40 -0
  8. package/dist/adapters/codex/src/generateAgents.js.map +1 -0
  9. package/dist/adapters/codex/src/generateCodexAdapter.d.ts +9 -0
  10. package/dist/adapters/codex/src/generateCodexAdapter.js +59 -0
  11. package/dist/adapters/codex/src/generateCodexAdapter.js.map +1 -0
  12. package/dist/adapters/codex/src/generateCommands.d.ts +6 -0
  13. package/dist/adapters/codex/src/generateCommands.js +205 -0
  14. package/dist/adapters/codex/src/generateCommands.js.map +1 -0
  15. package/dist/adapters/codex/src/generateSkills.d.ts +7 -0
  16. package/dist/adapters/codex/src/generateSkills.js +60 -0
  17. package/dist/adapters/codex/src/generateSkills.js.map +1 -0
  18. package/dist/adapters/codex/src/generatedFiles.d.ts +4 -0
  19. package/dist/adapters/codex/src/generatedFiles.js +67 -0
  20. package/dist/adapters/codex/src/generatedFiles.js.map +1 -0
  21. package/dist/adapters/codex/src/manifest.d.ts +4 -0
  22. package/dist/adapters/codex/src/manifest.js +40 -0
  23. package/dist/adapters/codex/src/manifest.js.map +1 -0
  24. package/dist/adapters/codex/src/templates.d.ts +7 -0
  25. package/dist/adapters/codex/src/templates.js +6 -0
  26. package/dist/adapters/codex/src/templates.js.map +1 -0
  27. package/dist/cli/src/args.d.ts +8 -0
  28. package/dist/cli/src/args.js +34 -0
  29. package/dist/cli/src/args.js.map +1 -0
  30. package/dist/cli/src/commands/doctor.d.ts +1 -0
  31. package/dist/cli/src/commands/doctor.js +26 -0
  32. package/dist/cli/src/commands/doctor.js.map +1 -0
  33. package/dist/cli/src/commands/init.d.ts +1 -0
  34. package/dist/cli/src/commands/init.js +52 -0
  35. package/dist/cli/src/commands/init.js.map +1 -0
  36. package/dist/cli/src/commands/shared.d.ts +4 -0
  37. package/dist/cli/src/commands/shared.js +19 -0
  38. package/dist/cli/src/commands/shared.js.map +1 -0
  39. package/dist/cli/src/commands/sync.d.ts +1 -0
  40. package/dist/cli/src/commands/sync.js +27 -0
  41. package/dist/cli/src/commands/sync.js.map +1 -0
  42. package/dist/cli/src/commands/validate.d.ts +1 -0
  43. package/dist/cli/src/commands/validate.js +17 -0
  44. package/dist/cli/src/commands/validate.js.map +1 -0
  45. package/dist/cli/src/dev/validateRepositoryContractsCli.d.ts +2 -0
  46. package/dist/cli/src/dev/validateRepositoryContractsCli.js +37 -0
  47. package/dist/cli/src/dev/validateRepositoryContractsCli.js.map +1 -0
  48. package/dist/cli/src/dev/verifyRuntimeSurface.d.ts +2 -0
  49. package/dist/cli/src/dev/verifyRuntimeSurface.js +344 -0
  50. package/dist/cli/src/dev/verifyRuntimeSurface.js.map +1 -0
  51. package/dist/cli/src/dev/verifyWorkflowE2E.d.ts +2 -0
  52. package/dist/cli/src/dev/verifyWorkflowE2E.js +366 -0
  53. package/dist/cli/src/dev/verifyWorkflowE2E.js.map +1 -0
  54. package/dist/cli/src/index.d.ts +2 -0
  55. package/dist/cli/src/index.js +51 -0
  56. package/dist/cli/src/index.js.map +1 -0
  57. package/dist/core/src/artifacts/registry.d.ts +53 -0
  58. package/dist/core/src/artifacts/registry.js +483 -0
  59. package/dist/core/src/artifacts/registry.js.map +1 -0
  60. package/dist/core/src/commands/registry.d.ts +36 -0
  61. package/dist/core/src/commands/registry.js +539 -0
  62. package/dist/core/src/commands/registry.js.map +1 -0
  63. package/dist/core/src/contracts/index.d.ts +23 -0
  64. package/dist/core/src/contracts/index.js +16 -0
  65. package/dist/core/src/contracts/index.js.map +1 -0
  66. package/dist/core/src/contracts/yaml.d.ts +2 -0
  67. package/dist/core/src/contracts/yaml.js +12 -0
  68. package/dist/core/src/contracts/yaml.js.map +1 -0
  69. package/dist/core/src/contracts.d.ts +23 -0
  70. package/dist/core/src/contracts.js +15 -0
  71. package/dist/core/src/contracts.js.map +1 -0
  72. package/dist/core/src/fs/index.d.ts +4 -0
  73. package/dist/core/src/fs/index.js +28 -0
  74. package/dist/core/src/fs/index.js.map +1 -0
  75. package/dist/core/src/fs.d.ts +4 -0
  76. package/dist/core/src/fs.js +28 -0
  77. package/dist/core/src/fs.js.map +1 -0
  78. package/dist/core/src/initOpenWorkflow.d.ts +7 -0
  79. package/dist/core/src/initOpenWorkflow.js +220 -0
  80. package/dist/core/src/initOpenWorkflow.js.map +1 -0
  81. package/dist/core/src/validateOpenWorkflow.d.ts +5 -0
  82. package/dist/core/src/validateOpenWorkflow.js +145 -0
  83. package/dist/core/src/validateOpenWorkflow.js.map +1 -0
  84. package/dist/core/src/validators/validateOpenWorkflow.d.ts +5 -0
  85. package/dist/core/src/validators/validateOpenWorkflow.js +551 -0
  86. package/dist/core/src/validators/validateOpenWorkflow.js.map +1 -0
  87. package/dist/core/src/validators/validateRepositoryContracts.d.ts +2 -0
  88. package/dist/core/src/validators/validateRepositoryContracts.js +827 -0
  89. package/dist/core/src/validators/validateRepositoryContracts.js.map +1 -0
  90. package/dist/core/src/workflow/initOpenWorkflow.d.ts +7 -0
  91. package/dist/core/src/workflow/initOpenWorkflow.js +182 -0
  92. package/dist/core/src/workflow/initOpenWorkflow.js.map +1 -0
  93. package/dist/core/src/yaml.d.ts +2 -0
  94. package/dist/core/src/yaml.js +12 -0
  95. package/dist/core/src/yaml.js.map +1 -0
  96. package/package.json +55 -0
  97. package/references/artifact-authoring-templates.md +78 -0
  98. package/references/audit-first-discovery-loop.md +85 -0
  99. package/references/contract-graph.md +129 -0
  100. package/references/discovery-artifact-contracts.md +155 -0
  101. package/references/engineering-skill-reference-research.md +204 -0
  102. package/references/npm-cli-architecture.md +63 -0
  103. package/references/runtime-command-surface.md +169 -0
  104. package/schemas/artifact-contracts.schema.json +130 -0
  105. package/schemas/change.schema.json +71 -0
  106. package/schemas/contract-graph.schema.json +80 -0
  107. package/schemas/decision-record.schema.json +92 -0
  108. package/schemas/disclosure-levels.schema.json +66 -0
  109. package/schemas/openworkflow-contract.schema.json +88 -0
  110. package/schemas/product-design.schema.json +356 -0
  111. package/schemas/prototype-evidence.schema.json +325 -0
  112. package/schemas/prototype.schema.json +149 -0
  113. package/schemas/validation-target.schema.json +127 -0
  114. package/schemas/validation.schema.json +123 -0
  115. package/schemas/vision-session.schema.json +78 -0
  116. package/schemas/work-items.schema.json +87 -0
  117. package/schemas/workflow-index.schema.json +70 -0
  118. package/skills/build-prototype/SKILL.md +87 -0
  119. package/skills/build-prototype/agents/openai.yaml +4 -0
  120. package/skills/build-prototype/references/prototype-protocol.md +56 -0
  121. package/skills/build-prototype/scripts/init_prototype.py +260 -0
  122. package/skills/build-team/SKILL.md +292 -0
  123. package/skills/build-team/agents/openai.yaml +4 -0
  124. package/skills/build-team/references/runtime-schema.md +275 -0
  125. package/skills/build-team/references/team-protocol.md +244 -0
  126. package/skills/build-team/scripts/init_team_runtime.py +431 -0
  127. package/skills/build-validation/SKILL.md +81 -0
  128. package/skills/build-validation/agents/openai.yaml +4 -0
  129. package/skills/build-validation/references/validation-protocol.md +51 -0
  130. package/skills/build-validation/scripts/init_validation.py +194 -0
  131. package/skills/build-workflow/SKILL.md +65 -0
  132. package/skills/build-workflow/agents/openai.yaml +4 -0
  133. package/skills/build-workflow/references/workflow-layout.md +57 -0
  134. package/skills/build-workflow/scripts/init_workflow.py +423 -0
  135. package/skills/run-team/SKILL.md +93 -0
  136. package/skills/run-team/agents/openai.yaml +4 -0
  137. package/skills/run-team/references/delegation-and-agent-lifecycle.md +78 -0
  138. package/skills/run-team/references/run-loop.md +73 -0
  139. package/skills/run-team/references/runtime-audit.md +56 -0
  140. package/skills/run-team/references/scope-selection.md +64 -0
  141. package/skills/run-team/scripts/audit_team_runtime.py +173 -0
  142. package/skills/run-team/scripts/init_next_scope.py +304 -0
  143. package/templates/README.md +5 -0
  144. package/templates/codex/README.md +4 -0
  145. package/templates/openworkflow/README.md +4 -0
@@ -0,0 +1,194 @@
1
+ #!/usr/bin/env python3
2
+ """Initialize OpenWorkflow validation-first artifacts."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ import re
9
+ from pathlib import Path
10
+
11
+
12
+ def q(value: str | None) -> str:
13
+ return "null" if value is None else json.dumps(value)
14
+
15
+
16
+ def slugify(value: str) -> str:
17
+ return re.sub(r"[^A-Za-z0-9]+", "-", value.strip().lower()).strip("-") or "validation"
18
+
19
+
20
+ def yaml_list(items: list[str], indent: int) -> str:
21
+ prefix = " " * indent
22
+ if not items:
23
+ return f"{prefix}[]\n"
24
+ return "".join(f"{prefix}- {q(item)}\n" for item in items)
25
+
26
+
27
+ def ensure_dir(path: Path, dry_run: bool) -> None:
28
+ if dry_run:
29
+ print(f"DIR {path}")
30
+ return
31
+ path.mkdir(parents=True, exist_ok=True)
32
+
33
+
34
+ def write_file(path: Path, content: str, force: bool, dry_run: bool) -> None:
35
+ if path.exists() and not force:
36
+ print(f"SKIP {path}")
37
+ return
38
+ if dry_run:
39
+ action = "OVERWRITE" if path.exists() else "WRITE"
40
+ print(f"{action} {path}")
41
+ return
42
+ path.parent.mkdir(parents=True, exist_ok=True)
43
+ path.write_text(content, encoding="utf-8")
44
+ print(f"WRITE {path}")
45
+
46
+
47
+ def touch_gitkeep(path: Path, dry_run: bool) -> None:
48
+ gitkeep = path / ".gitkeep"
49
+ if gitkeep.exists():
50
+ return
51
+ if dry_run:
52
+ print(f"WRITE {gitkeep}")
53
+ return
54
+ gitkeep.write_text("", encoding="utf-8")
55
+
56
+
57
+ def validation_yaml(args: argparse.Namespace, validation_id: str) -> str:
58
+ title = args.title
59
+ vision_ref = args.vision_ref
60
+ source_artifacts = args.source_artifact or []
61
+ return (
62
+ "schema_version: 0.1.0\n"
63
+ f"contract_id: validation:{validation_id}\n"
64
+ "contract_type: validation\n"
65
+ f"title: {q(title)}\n"
66
+ "status: active\n"
67
+ "source_artifacts:\n"
68
+ f"{yaml_list(source_artifacts, 2)}"
69
+ "depends_on:\n"
70
+ f" - {vision_ref}\n"
71
+ "produces: []\n"
72
+ f"core_question: {q(args.core_question)}\n"
73
+ "feature_classification:\n"
74
+ " existential:\n"
75
+ f"{yaml_list(args.existential, 4)}"
76
+ " supporting:\n"
77
+ f"{yaml_list(args.supporting, 4)}"
78
+ " later:\n"
79
+ f"{yaml_list(args.later, 4)}"
80
+ " out_of_scope:\n"
81
+ f"{yaml_list(args.out_of_scope, 4)}"
82
+ "critical_assumptions:\n"
83
+ f"{yaml_list(args.assumption, 2)}"
84
+ "prototype_scope:\n"
85
+ " include:\n"
86
+ f"{yaml_list(args.include, 4)}"
87
+ " exclude:\n"
88
+ f"{yaml_list(args.exclude, 4)}"
89
+ "acceptance:\n"
90
+ f"{yaml_list(args.acceptance, 2)}"
91
+ "decision_options:\n"
92
+ " - continue\n"
93
+ " - pivot\n"
94
+ " - stop\n"
95
+ " - needs_more_evidence\n"
96
+ "result_artifact: RESULT.md\n"
97
+ "prototype_brief: PROTOTYPE_BRIEF.md\n"
98
+ "updated_at: null\n"
99
+ )
100
+
101
+
102
+ def prototype_brief(args: argparse.Namespace, validation_id: str) -> str:
103
+ return f"""# Prototype Brief: {args.title}
104
+
105
+ Validation id: `validation:{validation_id}`
106
+
107
+ ## Core Question
108
+
109
+ {args.core_question}
110
+
111
+ ## Include
112
+
113
+ {bullet_list(args.include)}
114
+
115
+ ## Exclude
116
+
117
+ {bullet_list(args.exclude)}
118
+
119
+ ## Acceptance Evidence
120
+
121
+ {bullet_list(args.acceptance)}
122
+
123
+ ## Handoff
124
+
125
+ Build the smallest prototype that can answer the core question. Do not add
126
+ production features unless they directly affect the validation result.
127
+ """
128
+
129
+
130
+ def result_doc(args: argparse.Namespace, validation_id: str) -> str:
131
+ return f"""# Validation Result: {args.title}
132
+
133
+ Validation id: `validation:{validation_id}`
134
+
135
+ Status: pending
136
+
137
+ ## Evidence
138
+
139
+ - Pending prototype review.
140
+
141
+ ## Decision
142
+
143
+ Pending. Choose one: continue, pivot, stop, needs_more_evidence.
144
+ """
145
+
146
+
147
+ def bullet_list(items: list[str]) -> str:
148
+ if not items:
149
+ return "- None."
150
+ return "\n".join(f"- {item}" for item in items)
151
+
152
+
153
+ def init_validation(args: argparse.Namespace) -> None:
154
+ root = Path(args.root).expanduser().resolve()
155
+ validation_id = args.validation_id or slugify(args.title)
156
+ target = root / ".codex" / "validation" / validation_id
157
+ archive = target / "archive"
158
+ ensure_dir(target, args.dry_run)
159
+ ensure_dir(archive, args.dry_run)
160
+ touch_gitkeep(archive, args.dry_run)
161
+ write_file(target / "VALIDATION.yaml", validation_yaml(args, validation_id), args.force, args.dry_run)
162
+ write_file(target / "PROTOTYPE_BRIEF.md", prototype_brief(args, validation_id), args.force, args.dry_run)
163
+ write_file(target / "RESULT.md", result_doc(args, validation_id), args.force, args.dry_run)
164
+
165
+
166
+ def parser() -> argparse.ArgumentParser:
167
+ p = argparse.ArgumentParser(description="Initialize validation-first artifacts.")
168
+ p.add_argument("--root", default=".", help="Repository root.")
169
+ p.add_argument("--validation-id", default=None, help="Stable validation slug.")
170
+ p.add_argument("--title", required=True, help="Validation title.")
171
+ p.add_argument("--vision-ref", default="vision:default", help="Upstream vision contract id.")
172
+ p.add_argument("--source-artifact", action="append", default=[], help="Source artifact path. Repeatable.")
173
+ p.add_argument("--core-question", required=True, help="The question the prototype must answer.")
174
+ p.add_argument("--existential", action="append", default=[], help="Existential feature. Repeatable.")
175
+ p.add_argument("--supporting", action="append", default=[], help="Supporting feature. Repeatable.")
176
+ p.add_argument("--later", action="append", default=[], help="Later feature. Repeatable.")
177
+ p.add_argument("--out-of-scope", action="append", default=[], help="Out-of-scope feature. Repeatable.")
178
+ p.add_argument("--assumption", action="append", default=[], help="Critical assumption. Repeatable.")
179
+ p.add_argument("--include", action="append", default=[], help="Prototype inclusion. Repeatable.")
180
+ p.add_argument("--exclude", action="append", default=[], help="Prototype exclusion. Repeatable.")
181
+ p.add_argument("--acceptance", action="append", default=[], help="Acceptance evidence. Repeatable.")
182
+ p.add_argument("--force", action="store_true", help="Overwrite existing artifacts.")
183
+ p.add_argument("--dry-run", action="store_true", help="Print writes without changing files.")
184
+ return p
185
+
186
+
187
+ def main() -> int:
188
+ init_validation(parser().parse_args())
189
+ return 0
190
+
191
+
192
+ if __name__ == "__main__":
193
+ raise SystemExit(main())
194
+
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: build-workflow
3
+ description: Initialize or reconcile OpenWorkflow repo-local contract infrastructure. Use when the user invokes /ow:workflow CONTENT or asks Codex to set up workflow indexes, contract graph files, context, vision, decision, spec, and change folders before /ow:team execution.
4
+ ---
5
+
6
+ # Build Workflow
7
+
8
+ ## Purpose
9
+
10
+ Create the upstream OpenWorkflow contract foundation for a repository. This
11
+ skill initializes durable files that later skills can consume instead of relying
12
+ on chat history.
13
+
14
+ It owns workflow infrastructure only:
15
+
16
+ - `.codex/workflow/WORKFLOW_INDEX.yaml`
17
+ - `.codex/workflow/CONTRACT_GRAPH.yaml`
18
+ - `.codex/context/`
19
+ - `.codex/vision/`
20
+ - `.codex/decisions/`
21
+ - `.codex/spec/`
22
+ - `.codex/validation/`
23
+ - `.codex/prototypes/`
24
+ - `.codex/changes/`
25
+
26
+ It must not initialize `.codex/runtime/`; runtime remains owned by `/ow:team`.
27
+
28
+ ## Required Scan
29
+
30
+ Before writing, inspect:
31
+
32
+ ```bash
33
+ pwd
34
+ git status --short
35
+ rg --files -g '!node_modules' -g '!dist' -g '!build' -g '!coverage'
36
+ ```
37
+
38
+ Read the likely source artifacts:
39
+
40
+ - `AGENT.md`
41
+ - `README*`
42
+ - `build_system_vision.md`
43
+ - `docs/**`
44
+ - existing `.codex/workflow/**`, `.codex/context/**`, `.codex/vision/**`,
45
+ `.codex/decisions/**`, `.codex/spec/**`, and `.codex/changes/**`
46
+
47
+ ## Workflow
48
+
49
+ 1. Infer a project title from the repo or user content.
50
+ 2. Load `references/workflow-layout.md`.
51
+ 3. Run `scripts/init_workflow.py` from the repo root, or from the installed
52
+ skill path when the script is not repo-local.
53
+ 4. Preserve existing contract files unless the user explicitly asks to
54
+ regenerate them.
55
+ 5. Validate with the repository validator when available:
56
+
57
+ ```bash
58
+ npm run validate
59
+ ```
60
+
61
+ ## Handoff
62
+
63
+ After `/ow:workflow`, the next upstream skills may create context, vision,
64
+ decision, spec, change, and work item contracts. `/ow:team` should consume the
65
+ change and work item contracts when they exist.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Build Workflow"
3
+ short_description: "Initialize OpenWorkflow contract infrastructure"
4
+ default_prompt: "Use /ow:workflow to initialize workflow contracts for this repository."
@@ -0,0 +1,57 @@
1
+ # Workflow Layout Reference
2
+
3
+ Use this reference when initializing or reconciling OpenWorkflow contract
4
+ infrastructure.
5
+
6
+ ## Required Layout
7
+
8
+ ```txt
9
+ .codex/
10
+ workflow/
11
+ WORKFLOW_INDEX.yaml
12
+ CONTRACT_GRAPH.yaml
13
+ archive/
14
+ context/
15
+ CONTEXT.md
16
+ CONTEXT_MAP.yaml
17
+ GLOSSARY.yaml
18
+ archive/
19
+ vision/
20
+ VISION.md
21
+ VISION_CONTRACT.yaml
22
+ archive/
23
+ decisions/
24
+ DECISION_INDEX.yaml
25
+ archive/
26
+ spec/
27
+ SPEC_INDEX.yaml
28
+ archive/
29
+ validation/
30
+ VALIDATION_INDEX.yaml
31
+ archive/
32
+ prototypes/
33
+ PROTOTYPE_INDEX.yaml
34
+ archive/
35
+ changes/
36
+ archive/
37
+ ```
38
+
39
+ ## Ownership
40
+
41
+ - `/ow:workflow` owns the folders and indexes above.
42
+ - `/ow:context` should update `.openworkflow/context/**`.
43
+ - `/ow:vision` should update `.openworkflow/vision/**`.
44
+ - `/ow:decision` should add decision records and update
45
+ `.openworkflow/decisions/DECISION_INDEX.yaml`.
46
+ - `/ow:spec` should add specs and update `.openworkflow/specs/SPEC_INDEX.yaml`.
47
+ - `/ow:validation` should add validation-first prioritization artifacts and
48
+ update `.openworkflow/validation/VALIDATION_INDEX.yaml`.
49
+ - `/ow:prototype` should add prototype discovery artifacts and update
50
+ `.openworkflow/prototypes/PROTOTYPE_INDEX.yaml`.
51
+ - `/ow:change` should write under `.openworkflow/changes/<id>/`.
52
+ - `/ow:team` owns `.openworkflow/runtime/**`.
53
+
54
+ ## Initialization Rule
55
+
56
+ Create missing files and directories. Do not overwrite existing contract files
57
+ unless the user explicitly requests regeneration.