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.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.okf/contract/containment-directions.md +107 -0
  3. data/.okf/contract/exit-codes.md +42 -0
  4. data/.okf/contract/gates-only-at-the-hook-door.md +39 -0
  5. data/.okf/contract/index.md +10 -0
  6. data/.okf/contract/silent-skips.md +78 -0
  7. data/.okf/contract/telemetry-does-not-lie.md +218 -0
  8. data/.okf/contract/the-contract.md +43 -0
  9. data/.okf/design/a-comment-is-not-an-implementation.md +85 -0
  10. data/.okf/design/a-rule-you-can-walk-past.md +68 -0
  11. data/.okf/design/derivation-that-writes.md +161 -0
  12. data/.okf/design/failure-modes.md +43 -0
  13. data/.okf/design/index.md +18 -0
  14. data/.okf/design/lineage.md +95 -0
  15. data/.okf/design/structure-laws.md +46 -0
  16. data/.okf/design/the-residue.md +44 -0
  17. data/.okf/design/three-laws.md +71 -0
  18. data/.okf/design/three-pillars.md +48 -0
  19. data/.okf/index.md +31 -0
  20. data/.okf/log.md +74 -0
  21. data/.okf/scaffold/collisions-and-refusals.md +76 -0
  22. data/.okf/scaffold/index.md +8 -0
  23. data/.okf/scaffold/no-date-ships.md +41 -0
  24. data/.okf/scaffold/ownership-not-subject.md +63 -0
  25. data/.okf/scaffold/the-adopters-manual.md +114 -0
  26. data/.okf/seam/bundler-scoping.md +45 -0
  27. data/.okf/seam/identity-not-existence.md +67 -0
  28. data/.okf/seam/index.md +8 -0
  29. data/.okf/seam/the-wrapper.md +42 -0
  30. data/.okf/seam/three-fail-opens.md +44 -0
  31. data/.okf/testing/drills-over-units.md +41 -0
  32. data/.okf/testing/fixture-is-a-client.md +35 -0
  33. data/.okf/testing/index.md +4 -0
  34. data/.okf/trust/index.md +7 -0
  35. data/.okf/trust/read-owed-rule.md +45 -0
  36. data/.okf/trust/scalar-verified.md +48 -0
  37. data/CHANGELOG.md +187 -0
  38. data/LICENSE.txt +201 -0
  39. data/NOTICE +10 -0
  40. data/README.md +383 -0
  41. data/lib/okf/plugin.rb +148 -0
  42. data/lib/okf/pro/attestation.rb +62 -0
  43. data/lib/okf/pro/audit.rb +161 -0
  44. data/lib/okf/pro/board/edit.rb +201 -0
  45. data/lib/okf/pro/board.rb +291 -0
  46. data/lib/okf/pro/budget.rb +144 -0
  47. data/lib/okf/pro/bundle_root.rb +241 -0
  48. data/lib/okf/pro/cli.rb +914 -0
  49. data/lib/okf/pro/closing.rb +206 -0
  50. data/lib/okf/pro/conformance.rb +127 -0
  51. data/lib/okf/pro/conserve.rb +94 -0
  52. data/lib/okf/pro/event.rb +95 -0
  53. data/lib/okf/pro/friction.rb +262 -0
  54. data/lib/okf/pro/guards.rb +92 -0
  55. data/lib/okf/pro/log/edit.rb +68 -0
  56. data/lib/okf/pro/log.rb +162 -0
  57. data/lib/okf/pro/pairing.rb +271 -0
  58. data/lib/okf/pro/reconcile.rb +76 -0
  59. data/lib/okf/pro/records.rb +90 -0
  60. data/lib/okf/pro/scaffold.rb +258 -0
  61. data/lib/okf/pro/shell_guard.rb +164 -0
  62. data/lib/okf/pro/snapshot.rb +156 -0
  63. data/lib/okf/pro/state.rb +174 -0
  64. data/lib/okf/pro/target.rb +91 -0
  65. data/lib/okf/pro/template/gem/.claude/hooks/run +119 -0
  66. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/SKILL.md +233 -0
  67. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/attribution.md +46 -0
  68. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/board.md +55 -0
  69. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/closing.md +21 -0
  70. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/frontmatter.md +73 -0
  71. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/okf-rules.md +25 -0
  72. data/lib/okf/pro/template/gem/.githooks/pre-commit +68 -0
  73. data/lib/okf/pro/template/gem/.github/workflows/okf-pro.yml +69 -0
  74. data/lib/okf/pro/template/seed/.claude/settings.json +24 -0
  75. data/lib/okf/pro/template/seed/.okf/areas/corpus.md +73 -0
  76. data/lib/okf/pro/template/seed/.okf/areas/index.md +6 -0
  77. data/lib/okf/pro/template/seed/.okf/board.md +21 -0
  78. data/lib/okf/pro/template/seed/.okf/glossary/index.md +13 -0
  79. data/lib/okf/pro/template/seed/.okf/index.md +30 -0
  80. data/lib/okf/pro/template/seed/.okf/journal/index.md +11 -0
  81. data/lib/okf/pro/template/seed/.okf/learnings/index.md +13 -0
  82. data/lib/okf/pro/template/seed/.okf/log.md +10 -0
  83. data/lib/okf/pro/template/seed/.okf/projects/index.md +23 -0
  84. data/lib/okf/pro/template/seed/.okf/reference/index.md +16 -0
  85. data/lib/okf/pro/template/seed/.okf/roadmap.md +33 -0
  86. data/lib/okf/pro/template/seed/.tmp/.gitkeep +0 -0
  87. data/lib/okf/pro/template/seed/CLAUDE.md +61 -0
  88. data/lib/okf/pro/template/seed/README.md +488 -0
  89. data/lib/okf/pro/template/seed/gitignore +17 -0
  90. data/lib/okf/pro/version.rb +7 -0
  91. data/lib/okf/pro/writes.rb +560 -0
  92. data/lib/okf/pro.rb +198 -0
  93. 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: []