okf-pro 1.0.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.
- checksums.yaml +7 -0
- data/.okf/contract/containment-directions.md +107 -0
- data/.okf/contract/exit-codes.md +42 -0
- data/.okf/contract/gates-only-at-the-hook-door.md +39 -0
- data/.okf/contract/index.md +10 -0
- data/.okf/contract/silent-skips.md +78 -0
- data/.okf/contract/telemetry-does-not-lie.md +218 -0
- data/.okf/contract/the-contract.md +43 -0
- data/.okf/design/a-comment-is-not-an-implementation.md +85 -0
- data/.okf/design/a-rule-you-can-walk-past.md +68 -0
- data/.okf/design/derivation-that-writes.md +161 -0
- data/.okf/design/failure-modes.md +43 -0
- data/.okf/design/index.md +18 -0
- data/.okf/design/lineage.md +95 -0
- data/.okf/design/structure-laws.md +46 -0
- data/.okf/design/the-residue.md +44 -0
- data/.okf/design/three-laws.md +71 -0
- data/.okf/design/three-pillars.md +48 -0
- data/.okf/index.md +31 -0
- data/.okf/log.md +74 -0
- data/.okf/scaffold/collisions-and-refusals.md +76 -0
- data/.okf/scaffold/index.md +8 -0
- data/.okf/scaffold/no-date-ships.md +41 -0
- data/.okf/scaffold/ownership-not-subject.md +63 -0
- data/.okf/scaffold/the-adopters-manual.md +114 -0
- data/.okf/seam/bundler-scoping.md +45 -0
- data/.okf/seam/identity-not-existence.md +67 -0
- data/.okf/seam/index.md +8 -0
- data/.okf/seam/the-wrapper.md +42 -0
- data/.okf/seam/three-fail-opens.md +44 -0
- data/.okf/testing/drills-over-units.md +41 -0
- data/.okf/testing/fixture-is-a-client.md +35 -0
- data/.okf/testing/index.md +4 -0
- data/.okf/trust/index.md +7 -0
- data/.okf/trust/read-owed-rule.md +45 -0
- data/.okf/trust/scalar-verified.md +48 -0
- data/CHANGELOG.md +187 -0
- data/LICENSE.txt +201 -0
- data/NOTICE +10 -0
- data/README.md +383 -0
- data/lib/okf/plugin.rb +148 -0
- data/lib/okf/pro/attestation.rb +62 -0
- data/lib/okf/pro/audit.rb +161 -0
- data/lib/okf/pro/board/edit.rb +201 -0
- data/lib/okf/pro/board.rb +291 -0
- data/lib/okf/pro/budget.rb +144 -0
- data/lib/okf/pro/bundle_root.rb +241 -0
- data/lib/okf/pro/cli.rb +914 -0
- data/lib/okf/pro/closing.rb +206 -0
- data/lib/okf/pro/conformance.rb +127 -0
- data/lib/okf/pro/conserve.rb +94 -0
- data/lib/okf/pro/event.rb +95 -0
- data/lib/okf/pro/friction.rb +262 -0
- data/lib/okf/pro/guards.rb +92 -0
- data/lib/okf/pro/log/edit.rb +68 -0
- data/lib/okf/pro/log.rb +162 -0
- data/lib/okf/pro/pairing.rb +271 -0
- data/lib/okf/pro/reconcile.rb +76 -0
- data/lib/okf/pro/records.rb +90 -0
- data/lib/okf/pro/scaffold.rb +258 -0
- data/lib/okf/pro/shell_guard.rb +164 -0
- data/lib/okf/pro/snapshot.rb +156 -0
- data/lib/okf/pro/state.rb +174 -0
- data/lib/okf/pro/target.rb +91 -0
- data/lib/okf/pro/template/gem/.claude/hooks/run +119 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/SKILL.md +233 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/attribution.md +46 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/board.md +55 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/closing.md +21 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/frontmatter.md +73 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/okf-rules.md +25 -0
- data/lib/okf/pro/template/gem/.githooks/pre-commit +68 -0
- data/lib/okf/pro/template/gem/.github/workflows/okf-pro.yml +69 -0
- data/lib/okf/pro/template/seed/.claude/settings.json +24 -0
- data/lib/okf/pro/template/seed/.okf/areas/corpus.md +73 -0
- data/lib/okf/pro/template/seed/.okf/areas/index.md +6 -0
- data/lib/okf/pro/template/seed/.okf/board.md +21 -0
- data/lib/okf/pro/template/seed/.okf/glossary/index.md +13 -0
- data/lib/okf/pro/template/seed/.okf/index.md +30 -0
- data/lib/okf/pro/template/seed/.okf/journal/index.md +11 -0
- data/lib/okf/pro/template/seed/.okf/learnings/index.md +13 -0
- data/lib/okf/pro/template/seed/.okf/log.md +10 -0
- data/lib/okf/pro/template/seed/.okf/projects/index.md +23 -0
- data/lib/okf/pro/template/seed/.okf/reference/index.md +16 -0
- data/lib/okf/pro/template/seed/.okf/roadmap.md +33 -0
- data/lib/okf/pro/template/seed/.tmp/.gitkeep +0 -0
- data/lib/okf/pro/template/seed/CLAUDE.md +61 -0
- data/lib/okf/pro/template/seed/README.md +488 -0
- data/lib/okf/pro/template/seed/gitignore +17 -0
- data/lib/okf/pro/version.rb +7 -0
- data/lib/okf/pro/writes.rb +560 -0
- data/lib/okf/pro.rb +198 -0
- metadata +169 -0
data/lib/okf/pro.rb
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Pro — every enforcement check this bundle runs, as a library.
|
|
4
|
+
#
|
|
5
|
+
# THE CONTRACT — what survives an implementation swap:
|
|
6
|
+
# Blocking checks fail CLOSED. If enforcement is missing or cannot run, the
|
|
7
|
+
# call is refused, loudly. A gate that cannot check must not wave things
|
|
8
|
+
# through.
|
|
9
|
+
# Feedback checks fail LOUD. If enforcement is degraded, it says so in the
|
|
10
|
+
# same channel it would use to refuse.
|
|
11
|
+
# No check ever fails SILENT. A gate that is sometimes absent and does not
|
|
12
|
+
# confess converts "unchecked" into "checked and fine", which is worse than
|
|
13
|
+
# having no gate at all.
|
|
14
|
+
#
|
|
15
|
+
# Why Ruby, and not the shell version this replaces: that one parsed its event
|
|
16
|
+
# JSON with `jq`. With `jq` absent the parse yielded an empty path, every
|
|
17
|
+
# guard's `case "$path" in *.md)` fell through, and the gate exited 0 — the
|
|
18
|
+
# `verified:` write sailed past the most load-bearing gate in the repo, in
|
|
19
|
+
# silence. That is precisely the failure the contract forbids, and it was
|
|
20
|
+
# unreachable to fix in shell without reimplementing a JSON parser. Here the
|
|
21
|
+
# parser is stdlib. The only reachable runtime failure is `require "okf"`,
|
|
22
|
+
# caught below and refused loudly; a missing interpreter is caught one layer
|
|
23
|
+
# up, in .claude/hooks/run, because a script that cannot start cannot report.
|
|
24
|
+
#
|
|
25
|
+
# The entry point is `lib/okf/plugin.rb` — a Command subclass registered with
|
|
26
|
+
# OKF::CLI.register, which the kernel discovers by scanning installed gem specs.
|
|
27
|
+
# This gem ships no executable: `okf pro <cmd>` is the only door, and that is
|
|
28
|
+
# load-bearing rather than tidy. The scaffold's `.claude/hooks/run` dispatches to
|
|
29
|
+
# one absolute `okf` and refuses unless that binary identifies itself as the
|
|
30
|
+
# enforcer; a second entry point would be a second thing for the wrapper to
|
|
31
|
+
# recognise, on the one code path where being wrong means a gate waves an edit
|
|
32
|
+
# through.
|
|
33
|
+
#
|
|
34
|
+
# What that file may NOT do is hold the rescue this contract needs. See its own
|
|
35
|
+
# header: the `require "okf/pro"` it defers is itself what can fail, so the
|
|
36
|
+
# guard lives outside the require, in the Command, and not in CLI.run below.
|
|
37
|
+
#
|
|
38
|
+
# Kernel constants are fully qualified — `::OKF::Bundle`, never `OKF::Bundle`
|
|
39
|
+
# — for the reason okf-mcp records: OKF::Pro::CLI and the kernel's OKF::CLI
|
|
40
|
+
# share a name, and lexical lookup inside `module OKF` finds ours first.
|
|
41
|
+
#
|
|
42
|
+
# Files, and why each is separate:
|
|
43
|
+
# bundle_root.rb where the bundle is, given where the agent is
|
|
44
|
+
# event.rb the hook event — the only place untrusted input is parsed
|
|
45
|
+
# target.rb bundle root + edited path, or nil when a check cannot apply
|
|
46
|
+
# board.rb board.md as data: sections, the budget header, links, dates
|
|
47
|
+
# log.rb log.md as data: the snapshot line, newest day
|
|
48
|
+
# pairing.rb the board↔work invariants both directions, plus the one git shell-out
|
|
49
|
+
# guards.rb the trust rules — attestation, and the append-only record
|
|
50
|
+
# shell_guard.rb the same rules at the door a shell command comes through
|
|
51
|
+
# records.rb the append-only record, asked of git at the commit door
|
|
52
|
+
# conformance.rb okf validate + okf lint, in process
|
|
53
|
+
# reconcile.rb Rule 1
|
|
54
|
+
# budget.rb Rule 3 — the cap, and the dormancy question
|
|
55
|
+
# closing.rb Rule 2 — the stop gate, and the session banner
|
|
56
|
+
# snapshot.rb Rule 2's counters, derived — checker, never generator
|
|
57
|
+
# state.rb the readers' payload: what is on the board, in one call
|
|
58
|
+
# conserve.rb the write contract, enforced — line multisets in, refusals out
|
|
59
|
+
# board/edit.rb the board's text transforms, pure: text in, text out
|
|
60
|
+
# log/edit.rb the log's one text transform — a dated line under its day
|
|
61
|
+
# writes.rb the mechanical writers: read, transform, guard, rename
|
|
62
|
+
# friction.rb what the verbs did not cover, recorded — never enforced
|
|
63
|
+
# attestation.rb generated-without-verified listing; informs, never gates
|
|
64
|
+
# audit.rb the CI door: the same invariants minus the tool event
|
|
65
|
+
# scaffold.rb the generator: setup, upgrade, and the template beside it
|
|
66
|
+
# cli.rb dispatch, and the exit codes the hook protocol reads
|
|
67
|
+
|
|
68
|
+
# Kept deliberately conservative — nothing newer than 2.4, the floor okf takes
|
|
69
|
+
# from rack and this gem inherits. That floor matters more here than in any
|
|
70
|
+
# sibling: this code runs inside a git hook and a CI step on machines nobody
|
|
71
|
+
# chose, and a checker that cannot parse is a checker that is off.
|
|
72
|
+
#
|
|
73
|
+
# A SyntaxError exits 1, and the hook protocol reads a 1 as a non-blocking
|
|
74
|
+
# error: the edit proceeds. Syntax this file cannot parse is therefore syntax
|
|
75
|
+
# that fails OPEN, which the contract above forbids. The prototype's note that
|
|
76
|
+
# "no wrapper can catch it because nothing ran" was true of a wrapper that
|
|
77
|
+
# exec'd; the scaffold's does not, and catches it. The floor is still checked
|
|
78
|
+
# here for the case where the file parses but the interpreter is too old.
|
|
79
|
+
#
|
|
80
|
+
# Compared as versions, not strings: "10.0.0" < "2.4" is true lexicographically,
|
|
81
|
+
# so a string compare would refuse every edit on a future Ruby 10 — the gate
|
|
82
|
+
# blocking a perfectly capable interpreter, which is its own failure.
|
|
83
|
+
#
|
|
84
|
+
# The `exit 2` reaches the caller as a SystemExit through the require in
|
|
85
|
+
# OKF::CLI::Pro#call, which re-raises it rather than swallowing it: refusing
|
|
86
|
+
# is the whole point, and a rescue that turned this into a pass would be the
|
|
87
|
+
# fail-open the contract names.
|
|
88
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.4")
|
|
89
|
+
warn "ENFORCEMENT DEGRADED — ruby #{RUBY_VERSION} is below this checker's 2.4 floor; " \
|
|
90
|
+
"no check ran. Upgrade ruby, or every edit lands unchecked."
|
|
91
|
+
exit 2
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
require "json"
|
|
95
|
+
# Date is used in nearly every module (Date.today defaults, Date.parse on board
|
|
96
|
+
# lines) but until now arrived only transitively, through the okf gem's yaml
|
|
97
|
+
# load. A constant the checker depends on and never requires is a NameError
|
|
98
|
+
# waiting for the day a dependency reorders its own requires — and the crash
|
|
99
|
+
# would land in session-context and the CI verbs, which sit outside the
|
|
100
|
+
# dispatch rescue.
|
|
101
|
+
require "date"
|
|
102
|
+
|
|
103
|
+
begin
|
|
104
|
+
require "okf"
|
|
105
|
+
rescue LoadError
|
|
106
|
+
warn "ENFORCEMENT DEGRADED — the `okf` gem is not loadable; no check ran. " \
|
|
107
|
+
"Run `gem install okf`, or every edit lands unchecked."
|
|
108
|
+
exit 2
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
module OKF
|
|
112
|
+
module Pro
|
|
113
|
+
# The hook protocol's vocabulary. 0 and 2 are the only codes it reads as
|
|
114
|
+
# meaning anything; everything else is a non-blocking error, which is why
|
|
115
|
+
# FAIL is reserved for `audit`, the one entry point that is not a hook.
|
|
116
|
+
PASS = 0
|
|
117
|
+
BLOCK = 2 # PreToolUse: denies. PostToolUse: stderr returns to the agent. Stop: refuses to finish.
|
|
118
|
+
FAIL = 1 # audit only — CI's exit codes, not the hook protocol's.
|
|
119
|
+
|
|
120
|
+
# Words too common to reconcile on. A search for "the" returns the corpus.
|
|
121
|
+
STOP_WORDS = %w[the a an of and or for to in on with my is not].freeze
|
|
122
|
+
|
|
123
|
+
# Every raw read the checker makes goes through here. Read as bytes,
|
|
124
|
+
# forced to UTF-8, scrubbed — because the alternative failed open twice
|
|
125
|
+
# over: with LANG unset (common in CI and git hooks) default_external is
|
|
126
|
+
# US-ASCII and even a clean em dash raises on the first regex; and one
|
|
127
|
+
# invalid byte anywhere raised ArgumentError out of match?, exiting the
|
|
128
|
+
# checker with a code the hook protocol reads as NON-BLOCKING. A crash
|
|
129
|
+
# is a pass, from the protocol's side — so the reader must not crash,
|
|
130
|
+
# and (belt to this suspender) CLI.run refuses on anything that still
|
|
131
|
+
# does.
|
|
132
|
+
def self.read_text(path)
|
|
133
|
+
File.read(path, mode: "rb").force_encoding(Encoding::UTF_8).scrub
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# The same read, contained. Where the caller already HOLDS the bundle root,
|
|
137
|
+
# this is the one to use: `SafeRead.read!` resolves the path and refuses one
|
|
138
|
+
# whose symlinks leave the root, which is the kernel's containment primitive
|
|
139
|
+
# and not a second implementation of it. `.scrub` stays ours, for the reason
|
|
140
|
+
# above — `read!` tags the encoding without validating it.
|
|
141
|
+
#
|
|
142
|
+
# Not used where there is no root to contain against. `BundleRoot` is
|
|
143
|
+
# deciding WHERE the root is, so it has none; and there a raise would be a
|
|
144
|
+
# permanent lockout while a rescue would answer "not a root", mis-rooting
|
|
145
|
+
# the bundle and disarming the journal guard.
|
|
146
|
+
#
|
|
147
|
+
# Callers rescue `Path::Error` themselves and choose the safe answer for
|
|
148
|
+
# their own question, because "this file escapes the bundle" means something
|
|
149
|
+
# different to a closure marker than it does to a journal entry.
|
|
150
|
+
def self.read_contained(root, path)
|
|
151
|
+
::OKF::SafeRead.read!(root, path).scrub
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# A final newline, guaranteed, before any transform splices a line in.
|
|
155
|
+
# Without it an append after the file's last line concatenates onto it, and
|
|
156
|
+
# a file whose last line is a board entry is exactly where an append lands.
|
|
157
|
+
# Delta-free by construction: `Conserve` compares lines chomped, so adding
|
|
158
|
+
# the terminator changes no key it can see.
|
|
159
|
+
def self.newline_terminated(text)
|
|
160
|
+
body = text.to_s
|
|
161
|
+
return body if body.empty? || body.end_with?("\n")
|
|
162
|
+
|
|
163
|
+
"#{body}\n"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Files whose vocabulary is structural rather than conceptual. They are
|
|
167
|
+
# excluded twice over — from being reconciled, and from being reported as
|
|
168
|
+
# collisions — because they quote concepts rather than assert against them,
|
|
169
|
+
# and a gate that reports the README every time is one people scroll past.
|
|
170
|
+
NO_RECONCILE = %w[index.md log.md board.md CLAUDE.md README.md].freeze
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
require "okf/pro/version"
|
|
175
|
+
require "okf/pro/bundle_root"
|
|
176
|
+
require "okf/pro/event"
|
|
177
|
+
require "okf/pro/target"
|
|
178
|
+
require "okf/pro/board"
|
|
179
|
+
require "okf/pro/board/edit"
|
|
180
|
+
require "okf/pro/log"
|
|
181
|
+
require "okf/pro/log/edit"
|
|
182
|
+
require "okf/pro/conserve"
|
|
183
|
+
require "okf/pro/friction"
|
|
184
|
+
require "okf/pro/pairing"
|
|
185
|
+
require "okf/pro/snapshot"
|
|
186
|
+
require "okf/pro/attestation"
|
|
187
|
+
require "okf/pro/guards"
|
|
188
|
+
require "okf/pro/shell_guard"
|
|
189
|
+
require "okf/pro/records"
|
|
190
|
+
require "okf/pro/conformance"
|
|
191
|
+
require "okf/pro/reconcile"
|
|
192
|
+
require "okf/pro/budget"
|
|
193
|
+
require "okf/pro/closing"
|
|
194
|
+
require "okf/pro/audit"
|
|
195
|
+
require "okf/pro/scaffold"
|
|
196
|
+
require "okf/pro/state"
|
|
197
|
+
require "okf/pro/writes"
|
|
198
|
+
require "okf/pro/cli"
|
metadata
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: okf-pro
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Rodrigo Serradura
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: okf
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '2.0'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '3'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '2.0'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '3'
|
|
32
|
+
description: |
|
|
33
|
+
OKF Pro is a profile of OKF (Open Knowledge Format) — "pro" as in profile, the
|
|
34
|
+
term of art for a constrained application of a general format, not as in a paid
|
|
35
|
+
tier; this is Apache 2.0 like the rest of the ecosystem. It turns a bundle into
|
|
36
|
+
a working memory an agent is held to. `okf pro setup` writes the bundle and the governance around
|
|
37
|
+
it — the Claude Code hooks, the pre-commit hook, the CI workflow, the skill —
|
|
38
|
+
and `okf pro hook` runs one gate against one hook event: reconcile before you
|
|
39
|
+
add, keep the board and the work in step, attest what you did not verify, close
|
|
40
|
+
the day with a counted snapshot. The same invariants run again as `okf pro
|
|
41
|
+
audit`, the CI door. Every conformance and curation question is the okf gem's
|
|
42
|
+
to answer; what this gem owns is the policy on top and the contract underneath
|
|
43
|
+
it — blocking checks fail closed, feedback checks fail loud, and no check ever
|
|
44
|
+
fails silent.
|
|
45
|
+
email:
|
|
46
|
+
- rodrigo.serradura@gmail.com
|
|
47
|
+
executables: []
|
|
48
|
+
extensions: []
|
|
49
|
+
extra_rdoc_files: []
|
|
50
|
+
files:
|
|
51
|
+
- ".okf/contract/containment-directions.md"
|
|
52
|
+
- ".okf/contract/exit-codes.md"
|
|
53
|
+
- ".okf/contract/gates-only-at-the-hook-door.md"
|
|
54
|
+
- ".okf/contract/index.md"
|
|
55
|
+
- ".okf/contract/silent-skips.md"
|
|
56
|
+
- ".okf/contract/telemetry-does-not-lie.md"
|
|
57
|
+
- ".okf/contract/the-contract.md"
|
|
58
|
+
- ".okf/design/a-comment-is-not-an-implementation.md"
|
|
59
|
+
- ".okf/design/a-rule-you-can-walk-past.md"
|
|
60
|
+
- ".okf/design/derivation-that-writes.md"
|
|
61
|
+
- ".okf/design/failure-modes.md"
|
|
62
|
+
- ".okf/design/index.md"
|
|
63
|
+
- ".okf/design/lineage.md"
|
|
64
|
+
- ".okf/design/structure-laws.md"
|
|
65
|
+
- ".okf/design/the-residue.md"
|
|
66
|
+
- ".okf/design/three-laws.md"
|
|
67
|
+
- ".okf/design/three-pillars.md"
|
|
68
|
+
- ".okf/index.md"
|
|
69
|
+
- ".okf/log.md"
|
|
70
|
+
- ".okf/scaffold/collisions-and-refusals.md"
|
|
71
|
+
- ".okf/scaffold/index.md"
|
|
72
|
+
- ".okf/scaffold/no-date-ships.md"
|
|
73
|
+
- ".okf/scaffold/ownership-not-subject.md"
|
|
74
|
+
- ".okf/scaffold/the-adopters-manual.md"
|
|
75
|
+
- ".okf/seam/bundler-scoping.md"
|
|
76
|
+
- ".okf/seam/identity-not-existence.md"
|
|
77
|
+
- ".okf/seam/index.md"
|
|
78
|
+
- ".okf/seam/the-wrapper.md"
|
|
79
|
+
- ".okf/seam/three-fail-opens.md"
|
|
80
|
+
- ".okf/testing/drills-over-units.md"
|
|
81
|
+
- ".okf/testing/fixture-is-a-client.md"
|
|
82
|
+
- ".okf/testing/index.md"
|
|
83
|
+
- ".okf/trust/index.md"
|
|
84
|
+
- ".okf/trust/read-owed-rule.md"
|
|
85
|
+
- ".okf/trust/scalar-verified.md"
|
|
86
|
+
- CHANGELOG.md
|
|
87
|
+
- LICENSE.txt
|
|
88
|
+
- NOTICE
|
|
89
|
+
- README.md
|
|
90
|
+
- lib/okf/plugin.rb
|
|
91
|
+
- lib/okf/pro.rb
|
|
92
|
+
- lib/okf/pro/attestation.rb
|
|
93
|
+
- lib/okf/pro/audit.rb
|
|
94
|
+
- lib/okf/pro/board.rb
|
|
95
|
+
- lib/okf/pro/board/edit.rb
|
|
96
|
+
- lib/okf/pro/budget.rb
|
|
97
|
+
- lib/okf/pro/bundle_root.rb
|
|
98
|
+
- lib/okf/pro/cli.rb
|
|
99
|
+
- lib/okf/pro/closing.rb
|
|
100
|
+
- lib/okf/pro/conformance.rb
|
|
101
|
+
- lib/okf/pro/conserve.rb
|
|
102
|
+
- lib/okf/pro/event.rb
|
|
103
|
+
- lib/okf/pro/friction.rb
|
|
104
|
+
- lib/okf/pro/guards.rb
|
|
105
|
+
- lib/okf/pro/log.rb
|
|
106
|
+
- lib/okf/pro/log/edit.rb
|
|
107
|
+
- lib/okf/pro/pairing.rb
|
|
108
|
+
- lib/okf/pro/reconcile.rb
|
|
109
|
+
- lib/okf/pro/records.rb
|
|
110
|
+
- lib/okf/pro/scaffold.rb
|
|
111
|
+
- lib/okf/pro/shell_guard.rb
|
|
112
|
+
- lib/okf/pro/snapshot.rb
|
|
113
|
+
- lib/okf/pro/state.rb
|
|
114
|
+
- lib/okf/pro/target.rb
|
|
115
|
+
- lib/okf/pro/template/gem/.claude/hooks/run
|
|
116
|
+
- lib/okf/pro/template/gem/.claude/skills/okf-pro/SKILL.md
|
|
117
|
+
- lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/attribution.md
|
|
118
|
+
- lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/board.md
|
|
119
|
+
- lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/closing.md
|
|
120
|
+
- lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/frontmatter.md
|
|
121
|
+
- lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/okf-rules.md
|
|
122
|
+
- lib/okf/pro/template/gem/.githooks/pre-commit
|
|
123
|
+
- lib/okf/pro/template/gem/.github/workflows/okf-pro.yml
|
|
124
|
+
- lib/okf/pro/template/seed/.claude/settings.json
|
|
125
|
+
- lib/okf/pro/template/seed/.okf/areas/corpus.md
|
|
126
|
+
- lib/okf/pro/template/seed/.okf/areas/index.md
|
|
127
|
+
- lib/okf/pro/template/seed/.okf/board.md
|
|
128
|
+
- lib/okf/pro/template/seed/.okf/glossary/index.md
|
|
129
|
+
- lib/okf/pro/template/seed/.okf/index.md
|
|
130
|
+
- lib/okf/pro/template/seed/.okf/journal/index.md
|
|
131
|
+
- lib/okf/pro/template/seed/.okf/learnings/index.md
|
|
132
|
+
- lib/okf/pro/template/seed/.okf/log.md
|
|
133
|
+
- lib/okf/pro/template/seed/.okf/projects/index.md
|
|
134
|
+
- lib/okf/pro/template/seed/.okf/reference/index.md
|
|
135
|
+
- lib/okf/pro/template/seed/.okf/roadmap.md
|
|
136
|
+
- lib/okf/pro/template/seed/.tmp/.gitkeep
|
|
137
|
+
- lib/okf/pro/template/seed/CLAUDE.md
|
|
138
|
+
- lib/okf/pro/template/seed/README.md
|
|
139
|
+
- lib/okf/pro/template/seed/gitignore
|
|
140
|
+
- lib/okf/pro/version.rb
|
|
141
|
+
- lib/okf/pro/writes.rb
|
|
142
|
+
homepage: https://github.com/serradura/okf-gem
|
|
143
|
+
licenses:
|
|
144
|
+
- Apache-2.0
|
|
145
|
+
metadata:
|
|
146
|
+
allowed_push_host: https://rubygems.org
|
|
147
|
+
homepage_uri: https://github.com/serradura/okf-gem
|
|
148
|
+
source_code_uri: https://github.com/serradura/okf-gem
|
|
149
|
+
changelog_uri: https://github.com/serradura/okf-gem/blob/main/okf-pro/CHANGELOG.md
|
|
150
|
+
rubygems_mfa_required: 'true'
|
|
151
|
+
rdoc_options: []
|
|
152
|
+
require_paths:
|
|
153
|
+
- lib
|
|
154
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
|
+
requirements:
|
|
156
|
+
- - ">="
|
|
157
|
+
- !ruby/object:Gem::Version
|
|
158
|
+
version: 2.4.0
|
|
159
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
|
+
requirements:
|
|
161
|
+
- - ">="
|
|
162
|
+
- !ruby/object:Gem::Version
|
|
163
|
+
version: '0'
|
|
164
|
+
requirements: []
|
|
165
|
+
rubygems_version: 4.0.16
|
|
166
|
+
specification_version: 4
|
|
167
|
+
summary: 'A profile of OKF: one opinionated shape of knowledge bundle, and the gates
|
|
168
|
+
that hold it there. Structure for making things happen.'
|
|
169
|
+
test_files: []
|